From 459509aaba47bd5d53adb31bd787d338a5504c8f Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 22 Dec 2022 14:29:17 -0800 Subject: added feed to homepage --- src/components/Feed.svelte | 65 ++++++++++++++++++- src/components/RegisterOrLogin.svelte | 6 +- src/routes/(app)/[username]/+layout.server.js | 4 +- src/routes/(app)/[username]/+page.svelte | 74 ++++------------------ src/routes/(app)/[username]/dashboard/+page.svelte | 6 +- src/routes/(app)/[username]/generate/+page.svelte | 7 +- src/routes/(app)/feed/+page.svelte | 17 ----- src/routes/(app)/register/+page.server.js | 4 +- 8 files changed, 88 insertions(+), 95 deletions(-) delete mode 100644 src/routes/(app)/feed/+page.svelte (limited to 'src') diff --git a/src/components/Feed.svelte b/src/components/Feed.svelte index c00fd1c7..72443a8b 100644 --- a/src/components/Feed.svelte +++ b/src/components/Feed.svelte @@ -3,7 +3,54 @@ import { browser } from '$app/environment'; import VirtualScroll from 'svelte-virtual-scroll-list'; import { punk } from '$lib/utils'; + import { Buffer } from 'buffer'; + import { entropyToMnemonic, mnemonicToSeedSync } from 'bip39'; + import { enhance } from '$app/forms'; + import { bech32m } from 'bech32'; + import { calculateId, signId } from 'nostr'; + import { bip32, stretch, post } from '$lib/utils'; + export let events; + export let user; + + const { decode, fromWords } = bech32m; + + let message; + + let submit = async () => { + let mnemonic, key, password, seed, entropy, child, privkey; + entropy = Buffer.from( + await crypto.subtle.decrypt( + { name: 'AES-GCM', iv: new Uint8Array(16) }, + await stretch(password, Buffer.from(user.salt, 'hex')), + Uint8Array.from(fromWords(decode(user.cipher, 180).words)) + ), + 'hex' + ).toString('hex'); + + mnemonic = entropyToMnemonic(entropy); + seed = mnemonicToSeedSync(mnemonic); + key = bip32.fromSeed(seed); + child = key.derivePath("m/44'/1237'/0'/0/0"); + privkey = child.privateKey; + + let event = { + pubkey: user.pubkey, + created_at: Math.floor(Date.now() / 1000), + kind: 1, + content: message, + tags: [] + }; + + event.id = await calculateId(event); + event.sig = await signId(privkey, event.id); + await post(`/${user.username}`, { event }); + + event.user = user; + event.seen = event.created_at; + events[event.id] = event; + events = events; + }; let distance = (date) => { let m = 60; @@ -23,12 +70,28 @@ }; let w; + + $: sorted = Object.values(events) + .filter((ev) => ev?.pubkey) + .sort((a, b) => b.seen - a.seen); +
+
+ +
+ +
+ {#if browser} - +
diff --git a/src/components/RegisterOrLogin.svelte b/src/components/RegisterOrLogin.svelte index 8ee3af4a..b2070e9c 100644 --- a/src/components/RegisterOrLogin.svelte +++ b/src/components/RegisterOrLogin.svelte @@ -5,7 +5,7 @@ import { enhance } from '$app/forms'; import { Icon } from '$comp'; import { focus } from '$lib/utils'; - import { loginRedirect, password } from '$lib/store'; + import { password } from '$lib/store'; import { t } from '$lib/translations'; import { page } from '$app/stores'; @@ -82,10 +82,6 @@ {/if}
- {#if $loginRedirect} - - {/if} -
{ +export let load = async ({ depends, params: { username } }) => { + depends('app:user'); + try { return { subject: await get(`/users/${username}`) }; } catch (e) { diff --git a/src/routes/(app)/[username]/+page.svelte b/src/routes/(app)/[username]/+page.svelte index b4f609a9..f4598e6f 100644 --- a/src/routes/(app)/[username]/+page.svelte +++ b/src/routes/(app)/[username]/+page.svelte @@ -1,53 +1,14 @@ @@ -61,7 +22,7 @@
- {#if user.username === n} - - - - {/if} -
{#if events.length} - + {:else}
Nothing here yet. Post your first ev?.pubkey) - .sort((a, b) => b.seen - a.seen);
@@ -179,6 +175,6 @@
- +
diff --git a/src/routes/(app)/[username]/generate/+page.svelte b/src/routes/(app)/[username]/generate/+page.svelte index fd6b6f7e..345b35a4 100644 --- a/src/routes/(app)/[username]/generate/+page.svelte +++ b/src/routes/(app)/[username]/generate/+page.svelte @@ -5,7 +5,8 @@ import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39'; import * as ecc from 'tiny-secp256k1'; import { bip32, stretch, post } from '$lib/utils'; - import { goto } from '$app/navigation'; + import { goto, invalidate } from '$app/navigation'; + import { loginRedirect } from '$lib/store'; export let data; let { user } = data; @@ -35,6 +36,8 @@ user.salt = Buffer.from(salt).toString('hex'); await post(`/${user.username}/generate`, user); - goto(`/${user.username}/dashboard`); + + invalidate('app:user'); + setTimeout(() => goto($loginRedirect || `/${user.username}/dashboard`), 10); }); diff --git a/src/routes/(app)/feed/+page.svelte b/src/routes/(app)/feed/+page.svelte deleted file mode 100644 index 61f638e7..00000000 --- a/src/routes/(app)/feed/+page.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -
-
- -
-
diff --git a/src/routes/(app)/register/+page.server.js b/src/routes/(app)/register/+page.server.js index 9ff5a2fc..33cad4d0 100644 --- a/src/routes/(app)/register/+page.server.js +++ b/src/routes/(app)/register/+page.server.js @@ -9,7 +9,7 @@ export const load = async ({ parent }) => { export const actions = { default: async ({ cookies, request }) => { let form = Object.fromEntries(await request.formData()); - let { username, password, loginRedirect } = form; + let { username, password } = form; let user = { username, password }; let error; @@ -28,6 +28,6 @@ export const actions = { } if (error) return invalid(400, { error }); - throw redirect(307, loginRedirect || `/${user.username}/dashboard`); + throw redirect(307, `/${user.username}/generate`); } }; -- cgit v1.2.3