aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/Feed.svelte5
-rw-r--r--src/components/Password.svelte8
-rw-r--r--src/components/Pin.svelte4
-rw-r--r--src/lib/nostr.js6
-rw-r--r--src/lib/utils.js3
-rw-r--r--src/locales/en.json3
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.svelte73
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/_account.svelte9
-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.js8
-rw-r--r--src/routes/(app)/password/+server.js1
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);
}
-