diff options
| author | Adam Soltys <[email protected]> | 2022-12-22 14:29:17 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-12-22 14:29:17 -0800 |
| commit | 459509aaba47bd5d53adb31bd787d338a5504c8f (patch) | |
| tree | d5a5166652c0266b60253693ffca32b040e3e679 /src/components/Feed.svelte | |
| parent | b2dfd7eef4a3e892b3eeb6822f2e472b3be03267 (diff) | |
| download | coinos-ui-459509aaba47bd5d53adb31bd787d338a5504c8f.tar.gz coinos-ui-459509aaba47bd5d53adb31bd787d338a5504c8f.zip | |
added feed to homepage
Diffstat (limited to 'src/components/Feed.svelte')
| -rw-r--r-- | src/components/Feed.svelte | 65 |
1 files changed, 64 insertions, 1 deletions
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); </script> <svelte:window bind:innerWidth={w} /> +<form on:submit|preventDefault={submit} class="flex justify-center gap-4 max-w-2xl mx-auto"> + <div class="grow"> + <input + name="message" + bind:value={message} + placeholder="What's happening?" + class="my-5 mx-auto" + /> + </div> + <button class="rounded-full border py-4 px-5 font-bold hover:opacity-80 w-40 my-5">Post</button> +</form> + {#if browser} - <VirtualScroll data={events} key="id" let:data pageMode={true} estimateSize={200}> + <VirtualScroll data={sorted} key="id" let:data pageMode={true} estimateSize={200}> <div class="flex border-b py-4 text-sm lg:text-lg text-secondary" :key={data.id}> <a href={`/${data.user.anon ? data.user.pubkey : data.user.username}`}> <div class="mb-auto mr-2"> |
