diff options
| author | Adam Soltys <[email protected]> | 2022-12-27 13:45:55 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-12-27 13:45:55 -0800 |
| commit | 4b6883362463c3ddfb8c7a574b9beba5220d120b (patch) | |
| tree | ff7a6388f015c0f6bd33478b1f0f50000a172a73 | |
| parent | 10c20c0c5b130c389680e37e4e4aba8e2abdbf1e (diff) | |
| download | coinos-ui-4b6883362463c3ddfb8c7a574b9beba5220d120b.tar.gz coinos-ui-4b6883362463c3ddfb8c7a574b9beba5220d120b.zip | |
broadcast profile settings to nostr
| -rw-r--r-- | src/components/Feed.svelte | 5 | ||||
| -rw-r--r-- | src/components/Password.svelte | 8 | ||||
| -rw-r--r-- | src/components/Pin.svelte | 4 | ||||
| -rw-r--r-- | src/lib/nostr.js | 6 | ||||
| -rw-r--r-- | src/lib/utils.js | 3 | ||||
| -rw-r--r-- | src/locales/en.json | 3 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/+page.svelte | 73 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/_account.svelte | 9 | ||||
| -rw-r--r-- | src/routes/(app)/events/+server.js (renamed from src/routes/(app)/[username]/+server.js) | 0 | ||||
| -rw-r--r-- | src/routes/(app)/login/+server.js | 8 | ||||
| -rw-r--r-- | src/routes/(app)/password/+server.js | 1 |
11 files changed, 93 insertions, 27 deletions
diff --git a/src/components/Feed.svelte b/src/components/Feed.svelte index 0ccda7b8..eef12a91 100644 --- a/src/components/Feed.svelte +++ b/src/components/Feed.svelte @@ -7,7 +7,7 @@ import { post, punk, failure } from '$lib/utils'; import { Password } from '$comp'; import { password, passwordPrompt } from '$lib/store'; - import { send } from '$lib/nostr'; + import { sign, send } from '$lib/nostr'; export let events; export let user; @@ -35,7 +35,8 @@ tags: [] }; - await send(event, user, $password); + await sign(event, user, $password); + await send(event); event.user = user; event.seen = event.created_at; diff --git a/src/components/Password.svelte b/src/components/Password.svelte index c9318201..e21bdad1 100644 --- a/src/components/Password.svelte +++ b/src/components/Password.svelte @@ -1,5 +1,5 @@ <script> - import { Icon } from "$comp"; + import { Icon } from '$comp'; import { failure, post } from '$lib/utils'; import { password as pw, passwordPrompt } from '$lib/store'; @@ -9,7 +9,7 @@ let { username } = user; let revealPassword = false; - let cancel = () => ($passwordPrompt = false); + let cancel = () => ($passwordPrompt = false); let submit = async () => { try { @@ -60,8 +60,8 @@ <button type="button" class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto" - on:click={cancel} - on:keydown={cancel} + on:click={cancel} + on:keydown={cancel} > <div class="my-auto">Cancel</div> </button> diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte index 9b1bb4ea..efc1e81b 100644 --- a/src/components/Pin.svelte +++ b/src/components/Pin.svelte @@ -4,7 +4,7 @@ let pinCode = ''; let pinInput; - let cancel = () => ($pin = '000000'); + let cancel = () => ($pin = '000000'); $: pinCode.length > 5 && ($pin = pinCode); </script> @@ -17,7 +17,7 @@ <button type="submit" class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto" - on:click={cancel} + on:click={cancel} > <div class="my-auto">Cancel</div> </button> diff --git a/src/lib/nostr.js b/src/lib/nostr.js index df63d5d8..385c7ac6 100644 --- a/src/lib/nostr.js +++ b/src/lib/nostr.js @@ -6,7 +6,7 @@ import { calculateId, signId } from 'nostr'; const { decode, fromWords } = bech32m; -export let send = async (event, { cipher, username, salt }, password) => { +export let sign = async (event, { cipher, username, salt }, password) => { let mnemonic, key, seed, entropy, child, privkey; entropy = Buffer.from( await crypto.subtle.decrypt( @@ -25,6 +25,8 @@ export let send = async (event, { cipher, username, salt }, password) => { event.id = await calculateId(event); event.sig = await signId(privkey, event.id); +}; - await post(`/${username}`, { event }); +export let send = (event) => { + return post('/events', { event }); }; diff --git a/src/lib/utils.js b/src/lib/utils.js index d4d78007..43e77022 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -49,8 +49,7 @@ export const post = (url, body, headers) => { try { let { message } = JSON.parse(text); if (message) return JSON.stringify({ name: 'Error', message }); - } catch (e) { - } + } catch (e) {} return { error: text }; }) diff --git a/src/locales/en.json b/src/locales/en.json index d455f107..99ae7a5a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -210,7 +210,8 @@ "username": "Username", "email": "Email", "newPassword": "New Password", - "businessAddress": "Business Address", + "about": "About", + "aboutPlaceholder": "A short description of you or your business (address, bio, etc.)", "emailNotifications": "Email Notifications", "emailNotificationsDescription": "Get notified via email when a change occurs on your account or when people send you payments.", "smsNotifications": "SMS Notifications", diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte index 3b213a11..55963105 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte @@ -1,23 +1,28 @@ <script> import { onMount } from 'svelte'; import { fly } from 'svelte/transition'; - import { enhance } from '$app/forms'; + import { applyAction, deserialize } from '$app/forms'; - import { Icon, Spinner, Pin } from '$comp'; + import { Icon, Spinner, Pin, Password } from '$comp'; import { t } from '$lib/translations'; - import { failure, success } from '$lib/utils'; - import { avatarUpload, bannerUpload, pin } from '$lib/store'; + import { failure, post, success } from '$lib/utils'; + import { avatarUpload, bannerUpload, passwordPrompt, password, pin } from '$lib/store'; import { upload } from '$lib/upload'; import { page } from '$app/stores'; + import { sign, send } from '$lib/nostr'; + import { invalidateAll } from '$app/navigation'; import Account from './_account.svelte'; import Pos from './_pos.svelte'; import Security from './_security.svelte'; + import { PUBLIC_COINOS_URL } from '$env/static/public'; + export let data; export let form; let submit; + let formElement; let { user, token, rates, tab } = data; @@ -41,9 +46,12 @@ $: ({ comp } = tabs.find((t) => t.name === tab)); + let { address, username } = user; let loading; - let save = async (msg) => { + + async function handleSubmit() { loading = true; + let data = new FormData(formElement); try { if ($avatarUpload) { @@ -58,18 +66,69 @@ failure('Something went wrong'); } + if (!$password) { + $passwordPrompt = true; + return; + } + + try { + await post('/password', { password: $password }); + } catch (e) { + console.log(e); + $passwordPrompt = true; + return; + } + + let event = { + pubkey: user.pubkey, + created_at: Math.floor(Date.now() / 1000), + kind: 0, + content: JSON.stringify({ + name: user.username, + about: user.address, + picture: `${PUBLIC_COINOS_URL}/public/${user.username}-profile.webp` + }), + tags: [] + }; + + await sign(event, user, $password); + await send(event); + + const response = await fetch(formElement.action, { + method: 'POST', + body: data + }); + + const result = deserialize(await response.text()); + + if (result.type === 'success') { + await invalidateAll(); + } + + applyAction(result); loading = false; - }; + } let loaded; onMount(() => setTimeout(() => (loaded = true), 50)); + + $: loading && $password && handleSubmit(); </script> {#if loaded && user.haspin && $pin?.length !== 6} <Pin /> {/if} -<form method="POST" class="mb-[154px]" use:enhance on:submit={save}> +{#if $passwordPrompt} + <Password {user} /> +{/if} + +<form + method="POST" + class="mb-[154px]" + on:submit|preventDefault={handleSubmit} + bind:this={formElement} +> <input type="hidden" name="pin" value={$pin} /> <div class="mt-24 mb-20 px-3 md:px-0 w-full md:w-[400px] mx-auto space-y-8"> diff --git a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte index a60ab7a6..0359f074 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte @@ -96,8 +96,13 @@ </div> <div> - <label for="address" class="font-bold mb-1 block">{$t('user.settings.businessAddress')}</label> - <input type="text" name="address" bind:value={user.address} /> + <label for="address" class="font-bold mb-1 block">{$t('user.settings.about')}</label> + <textarea + type="text" + name="address" + bind:value={user.address} + placeholder={$t('user.settings.aboutPlaceholder')} + /> </div> <!-- TODO --> diff --git a/src/routes/(app)/[username]/+server.js b/src/routes/(app)/events/+server.js index d0b1242f..d0b1242f 100644 --- a/src/routes/(app)/[username]/+server.js +++ b/src/routes/(app)/events/+server.js diff --git a/src/routes/(app)/login/+server.js b/src/routes/(app)/login/+server.js index e08356a0..32d2244d 100644 --- a/src/routes/(app)/login/+server.js +++ b/src/routes/(app)/login/+server.js @@ -1,6 +1,6 @@ -import { json } from "@sveltejs/kit"; -import { post } from "$lib/utils"; +import { json } from '@sveltejs/kit'; +import { post } from '$lib/utils'; export async function POST({ request }) { - return json(await post('/checkPassword', await request.json())); -} + return json(await post('/checkPassword', await request.json())); +} diff --git a/src/routes/(app)/password/+server.js b/src/routes/(app)/password/+server.js index ed9b4dbb..9f2ab6b8 100644 --- a/src/routes/(app)/password/+server.js +++ b/src/routes/(app)/password/+server.js @@ -5,4 +5,3 @@ export async function POST({ cookies, request }) { let result = await post('/checkPassword', await request.json(), auth(cookies)); return json(result); } - |
