aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/Feed.svelte65
-rw-r--r--src/components/RegisterOrLogin.svelte6
2 files changed, 65 insertions, 6 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">
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}
<form class="space-y-5" {action} method="POST" use:enhance>
- {#if $loginRedirect}
- <input type="hidden" name="loginRedirect" value={$loginRedirect} />
- {/if}
-
<div>
<label for="username" class="font-semibold">{$t('login.username')}</label>
<input