diff options
| author | Adam Soltys <[email protected]> | 2022-12-24 05:22:50 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-12-24 05:22:50 -0800 |
| commit | 10c20c0c5b130c389680e37e4e4aba8e2abdbf1e (patch) | |
| tree | 6862c7f94c899b3dad177b16698c08abc678eefb /src/components | |
| parent | e1a34bbc86600c6dfb782ac936030379deb6365a (diff) | |
| download | coinos-ui-10c20c0c5b130c389680e37e4e4aba8e2abdbf1e.tar.gz coinos-ui-10c20c0c5b130c389680e37e4e4aba8e2abdbf1e.zip | |
password prompt and pin fixes
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/Feed.svelte | 74 | ||||
| -rw-r--r-- | src/components/Password.svelte | 77 | ||||
| -rw-r--r-- | src/components/Pin.svelte | 3 | ||||
| -rw-r--r-- | src/components/index.js | 1 |
4 files changed, 118 insertions, 37 deletions
diff --git a/src/components/Feed.svelte b/src/components/Feed.svelte index 00226692..0ccda7b8 100644 --- a/src/components/Feed.svelte +++ b/src/components/Feed.svelte @@ -1,55 +1,51 @@ <script> + import { onMount } from 'svelte'; import { Avatar } from '$comp'; 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'; + import { post, punk, failure } from '$lib/utils'; + import { Password } from '$comp'; + import { password, passwordPrompt } from '$lib/store'; + import { send } from '$lib/nostr'; export let events; export let user; - const { decode, fromWords } = bech32m; - - let message; + let message, submitting; + $: submitting && $password && submit(); 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'); + submitting = true; + try { + let mnemonic, key, seed, entropy, child, privkey; + if (!$password) return ($passwordPrompt = true); + + try { + await post('/password', { password: $password }); + } catch (e) { + return ($passwordPrompt = true); + } - 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: [] + }; - let event = { - pubkey: user.pubkey, - created_at: Math.floor(Date.now() / 1000), - kind: 1, - content: message, - tags: [] - }; + await send(event, user, $password); - 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; - event.user = user; - event.seen = event.created_at; - events[event.id] = event; - events = events; + events[event.id] = event; + events = events; + } catch (e) { + failure('Problem posting event'); + console.log(e); + } }; let distance = (date) => { @@ -78,6 +74,10 @@ <svelte:window bind:innerWidth={w} /> +{#if $passwordPrompt} + <Password {user} /> +{/if} + <form on:submit|preventDefault={submit} class="flex justify-center gap-4 max-w-2xl mx-auto"> <div class="grow"> <input diff --git a/src/components/Password.svelte b/src/components/Password.svelte new file mode 100644 index 00000000..c9318201 --- /dev/null +++ b/src/components/Password.svelte @@ -0,0 +1,77 @@ +<script> + import { Icon } from "$comp"; + import { failure, post } from '$lib/utils'; + import { password as pw, passwordPrompt } from '$lib/store'; + + export let user; + + let password; + let { username } = user; + let revealPassword = false; + + let cancel = () => ($passwordPrompt = false); + + let submit = async () => { + try { + await post('/password', { password }); + $passwordPrompt = false; + $pw = password; + } catch (e) { + failure('Invalid password, try again'); + } + }; +</script> + +<div class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-20"> + <div class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5"> + <h1 class="text-center text-2xl font-semibold">Please enter your password</h1> + <form on:submit|preventDefault={submit}> + <div class="relative mb-5"> + {#if revealPassword} + <input + name="password" + type="text" + required + class="bg-primary" + bind:value={password} + autocapitalize="none" + autofocus + /> + {:else} + <input + name="password" + type="password" + required + class="bg-primary" + bind:value={password} + autocapitalize="none" + autofocus + /> + {/if} + <button + type="button" + on:click={() => (revealPassword = !revealPassword)} + class="absolute right-5 top-5" + > + <Icon icon={revealPassword ? 'eye' : 'eye-off'} /> + </button> + </div> + <div class="w-full flex"> + <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} + > + <div class="my-auto">Cancel</div> + </button> + <button + type="submit" + class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto" + > + <div class="my-auto">Submit</div> + </button> + </div> + </form> + </div> +</div> diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte index 80e003b9..9b1bb4ea 100644 --- a/src/components/Pin.svelte +++ b/src/components/Pin.svelte @@ -4,6 +4,8 @@ let pinCode = ''; let pinInput; + let cancel = () => ($pin = '000000'); + $: pinCode.length > 5 && ($pin = pinCode); </script> @@ -15,6 +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} > <div class="my-auto">Cancel</div> </button> diff --git a/src/components/index.js b/src/components/index.js index 90bc1e7e..b0802c25 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,3 +1,4 @@ +export { default as Password } from './Password.svelte'; export { default as Feed } from './Feed.svelte'; export { default as Invoice } from './Invoice.svelte'; export { default as Request } from './Request.svelte'; |
