From ccc13974d22a47995b5f9f674891a39d54aa0620 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 9 Nov 2022 09:53:33 -0800 Subject: refactor settings --- src/components/Pin.svelte | 3 +- src/lib/socket.js | 7 +- src/routes/(app)/[username]/+page.svelte | 6 + .../(app)/[username]/settings/+page.server.js | 20 -- src/routes/(app)/[username]/settings/+page.svelte | 104 --------- .../[username]/settings/[...tab]/+page.server.js | 26 +++ .../[username]/settings/[...tab]/+page.svelte | 109 +++++++++ .../[username]/settings/[...tab]/_account.svelte | 255 +++++++++++++++++++++ .../(app)/[username]/settings/[...tab]/_pos.svelte | 18 ++ .../[username]/settings/[...tab]/_security.svelte | 224 ++++++++++++++++++ .../(app)/[username]/settings/_account.svelte | 255 --------------------- src/routes/(app)/[username]/settings/_pos.svelte | 18 -- .../(app)/[username]/settings/_security.svelte | 223 ------------------ src/routes/(app)/invoice/[id]/+layout.server.js | 10 +- src/routes/(app)/invoice/[id]/+page.svelte | 21 +- src/routes/(app)/invoice/[id]/paid/+page.svelte | 68 +++--- src/routes/(app)/invoice/[id]/pending/+page.svelte | 56 ----- 17 files changed, 701 insertions(+), 722 deletions(-) delete mode 100644 src/routes/(app)/[username]/settings/+page.server.js delete mode 100644 src/routes/(app)/[username]/settings/+page.svelte create mode 100644 src/routes/(app)/[username]/settings/[...tab]/+page.server.js create mode 100644 src/routes/(app)/[username]/settings/[...tab]/+page.svelte create mode 100644 src/routes/(app)/[username]/settings/[...tab]/_account.svelte create mode 100644 src/routes/(app)/[username]/settings/[...tab]/_pos.svelte create mode 100644 src/routes/(app)/[username]/settings/[...tab]/_security.svelte delete mode 100644 src/routes/(app)/[username]/settings/_account.svelte delete mode 100644 src/routes/(app)/[username]/settings/_pos.svelte delete mode 100644 src/routes/(app)/[username]/settings/_security.svelte delete mode 100644 src/routes/(app)/invoice/[id]/pending/+page.svelte (limited to 'src') diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte index 2a6bf977..80e003b9 100644 --- a/src/components/Pin.svelte +++ b/src/components/Pin.svelte @@ -1,5 +1,6 @@ - -{#if loaded && user.haspin && $pin?.length !== 6} - -{/if} - -
- - -
-

- {$t('user.settings.header')} -

- -
- {#each tabs as { name, key }} - - {/each} -
- - -
- -
- -
-
diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js new file mode 100644 index 00000000..a6fbd9bf --- /dev/null +++ b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js @@ -0,0 +1,26 @@ +import { invalid, redirect } from '@sveltejs/kit'; +import { auth, get, post } from '$lib/utils'; + +export function load({ params, url }) { + if (url.pathname.endsWith('settings')) throw redirect(307, url.pathname + '/account'); + return params; +} + +export const actions = { + default: async ({ cookies, locals, request }) => { + let form = Object.fromEntries(await request.formData()); + + let user = { + ...locals.user, + ...form + }; + + try { + await post(`/user`, user, auth(cookies)); + } catch (e) { + return invalid(400, { message: e.message }); + } + + return { user, success: true }; + } +}; diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte new file mode 100644 index 00000000..20e1fd8f --- /dev/null +++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte @@ -0,0 +1,109 @@ + + +{#if loaded && user.haspin && $pin?.length !== 6} + +{/if} + +
+ + +
+

+ {$t('user.settings.header')} +

+ +
+ {#each tabs as { name, key }} + + + + {/each} +
+ + +
+ +
+ +
+
+ diff --git a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte new file mode 100644 index 00000000..5d5f731f --- /dev/null +++ b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte @@ -0,0 +1,255 @@ + + +
+ + +
+ + + + +
+ + + +
+ +
+ + {#if revealPassword} + + {:else} + + {/if} + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ {$t('user.settings.profileImage')} + +
+ {#if profile} +
select('profile')} + on:keydown={() => select('profile')} + > + {user.username} +
+ {:else if user.profile} +
select('profile')} + on:keydown={() => select('profile')} + > + {user.username} +
+ {:else} +
select('profile')} + on:keydown={() => select('profile')} + > + +
+ {/if} +
+ + + handleFile(e, 'profile')} + /> + {#if files.profile.filename} +
{files.profile.filename}
+ {/if} +
+
+ + {#if tooLarge['profile']} +
Max file size 10MB
+ {/if} +
+ +
+
+ {$t('user.settings.bannerImage')} +
+ + + {#if banner} + select('banner')} + on:keydown={() => select('banner')} + alt="Banner" + /> + {:else if user.banner} + select('banner')} + on:keydown={() => select('banner')} + alt="Banner" + /> + {:else} +
select('banner')} + on:keydown={() => select('banner')} + alt="Banner" + /> + {/if} + + + + handleFile(e, 'banner')} + /> + {#if files.banner.filename} +
{files.banner.filename}
+ {/if} + + {#if tooLarge['banner']} +
Max file size 10MB
+ {/if} +
+ + diff --git a/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte b/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte new file mode 100644 index 00000000..ccbeeff4 --- /dev/null +++ b/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte @@ -0,0 +1,18 @@ + + +
+ + +
diff --git a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte new file mode 100644 index 00000000..0f45966d --- /dev/null +++ b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte @@ -0,0 +1,224 @@ + + +
+ + + {verifying ? 'Verify' : 'Security'} PIN +

+ {$t('user.settings.securityPINDescription')} +

+ {#if settingPin} +
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ {:else} + + {/if} +
+ + + +
+ {$t('user.settings.twofa')} +

+ {$t('user.settings.twofaDescription')} +

+ {#if setting2fa} + + + + +
+ {$t('user.settings.accountId')}
+ {otp.secret} +
+ +
+ {$t('user.settings.oneTimeCode')}
+ + + + + + + + +
+ {:else if disabling2fa} +
+ {$t('user.settings.oneTimeCode')}
+ + + + + + + + +
+ {:else if user.twofa} + + {:else} + + {/if} +
diff --git a/src/routes/(app)/[username]/settings/_account.svelte b/src/routes/(app)/[username]/settings/_account.svelte deleted file mode 100644 index e49205ca..00000000 --- a/src/routes/(app)/[username]/settings/_account.svelte +++ /dev/null @@ -1,255 +0,0 @@ - - -
- - -
- - - - -
- - - -
- -
- - {#if revealPassword} - - {:else} - - {/if} - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- {$t('user.settings.profileImage')} - -
- {#if profile} -
select('profile')} - on:keydown={() => select('profile')} - > - {user.username} -
- {:else if user.profile} -
select('profile')} - on:keydown={() => select('profile')} - > - {user.username} -
- {:else} -
select('profile')} - on:keydown={() => select('profile')} - > - -
- {/if} -
- - - handleFile(e, 'profile')} - /> - {#if files.profile.filename} -
{files.profile.filename}
- {/if} -
-
- - {#if tooLarge['profile']} -
Max file size 10MB
- {/if} -
- -
-
- {$t('user.settings.bannerImage')} -
- - - {#if banner} - select('banner')} - on:keydown={() => select('banner')} - alt="Banner" - /> - {:else if user.banner} - select('banner')} - on:keydown={() => select('banner')} - alt="Banner" - /> - {:else} -
select('banner')} - on:keydown={() => select('banner')} - alt="Banner" - /> - {/if} - - - - handleFile(e, 'banner')} - /> - {#if files.banner.filename} -
{files.banner.filename}
- {/if} - - {#if tooLarge['banner']} -
Max file size 10MB
- {/if} -
- - diff --git a/src/routes/(app)/[username]/settings/_pos.svelte b/src/routes/(app)/[username]/settings/_pos.svelte deleted file mode 100644 index ccbeeff4..00000000 --- a/src/routes/(app)/[username]/settings/_pos.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -
- - -
diff --git a/src/routes/(app)/[username]/settings/_security.svelte b/src/routes/(app)/[username]/settings/_security.svelte deleted file mode 100644 index 4bdb00d4..00000000 --- a/src/routes/(app)/[username]/settings/_security.svelte +++ /dev/null @@ -1,223 +0,0 @@ - - -
- - - {verifying ? 'Verify' : 'Security'} PIN -

- {$t('user.settings.securityPINDescription')} -

- {#if settingPin} -
-
-
- - - - - - - - -
-
- - - - - - - - -
-
-
- {:else} - - {/if} -
- - - -
- {$t('user.settings.twofa')} -

- {$t('user.settings.twofaDescription')} -

- {#if setting2fa} - - - - -
- {$t('user.settings.accountId')}
- {otp.secret} -
- -
- {$t('user.settings.oneTimeCode')}
- - - - - - - - -
- {:else if disabling2fa} -
- {$t('user.settings.oneTimeCode')}
- - - - - - - - -
- {:else if user.twofa} - - {:else} - - {/if} -
diff --git a/src/routes/(app)/invoice/[id]/+layout.server.js b/src/routes/(app)/invoice/[id]/+layout.server.js index 4b6cf97e..dacc44e6 100644 --- a/src/routes/(app)/invoice/[id]/+layout.server.js +++ b/src/routes/(app)/invoice/[id]/+layout.server.js @@ -1,9 +1,17 @@ import Qr from 'qrcode-base64'; import { get } from '$lib/utils'; +import { redirect } from '@sveltejs/kit'; + +export async function load({ depends, params, url }) { + depends('app:invoice'); -export async function load({ params }) { let { id } = params; let invoice = await get(`/invoice?uuid=${id}`); + let { amount, received, pending } = invoice; + + let paid = (!amount && (received || pending)) || (amount > 0 && received + pending >= amount); + if (paid && !url.pathname.endsWith('paid')) throw redirect(307, `/invoice/${id}/paid`); + let sm = Qr.drawImg(invoice.text, { size: 300 }); let lg = Qr.drawImg(invoice.text, { size: 1200 }); diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte index dec33b62..fadf7270 100644 --- a/src/routes/(app)/invoice/[id]/+page.svelte +++ b/src/routes/(app)/invoice/[id]/+page.svelte @@ -1,7 +1,7 @@
-

{$t('invoice.paymentSuccessful')}

-

- {f(amountFiat, currency)} - {#if tip} - + {f(tipFiat, currency)} - {/if} -

-

- {sat(amount)} - {#if tip} - +{sat(tip)} - {/if} -

- + {#if received} +

{$t('invoice.paymentSuccessful')}

+

+ {f(amountFiat, currency)} + {#if tip} + + {f(tipFiat, currency)} + {/if} +

+

+ {sat(received)} + {#if tip} + +{sat(tip)} + {/if} +

+ {/if} + + {#if pending} +

Payment detected

+

+ {f(pendingFiat, currency)} + {#if tip} + + {f(tipFiat, currency)} + {/if} +

+

+ {sat(pending)} + {#if tip} + +{sat(tip)} + {/if} +

+ {/if} + + + +
diff --git a/src/routes/(app)/invoice/[id]/pending/+page.svelte b/src/routes/(app)/invoice/[id]/pending/+page.svelte deleted file mode 100644 index d3970dab..00000000 --- a/src/routes/(app)/invoice/[id]/pending/+page.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - -
-
- -
- -

Payment detected

- -
-

- {f(pendingFiat, currency)} - {#if tip} - + {f(tipFiat, currency)} - {/if} -

-

- {sat(pending)} - {#if tip} - +{sat(tip)} - {/if} -

-
- -

Pending confirmation

- - -
-- cgit v1.2.3 From 305f26ccefffe52b3fb65995e8caf437f1a92057 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 9 Nov 2022 10:53:41 -0800 Subject: settings fixes --- src/lib/socket.js | 2 +- src/lib/utils.js | 5 +- .../[username]/settings/[...tab]/+page.server.js | 2 +- .../[username]/settings/[...tab]/+page.svelte | 172 ++++++++++----------- .../[username]/settings/[...tab]/_account.svelte | 2 +- .../[username]/settings/[...tab]/_security.svelte | 11 +- src/routes/(app)/disable2fa/+server.js | 13 +- src/routes/(app)/otpsecret/+server.js | 11 +- 8 files changed, 118 insertions(+), 100 deletions(-) (limited to 'src') diff --git a/src/lib/socket.js b/src/lib/socket.js index 9b4a8dce..8d84073c 100644 --- a/src/lib/socket.js +++ b/src/lib/socket.js @@ -36,7 +36,7 @@ export const messages = (data) => ({ async payment() { let { amount, invoice } = data; - if (invoice) invalidate("app:invoice"); + if (invoice) invalidate('app:invoice'); if (get(user)?.account_id !== data.account_id) return; let payments = get(txns); diff --git a/src/lib/utils.js b/src/lib/utils.js index 7e0b8e4f..c3960487 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -37,7 +37,10 @@ export const get = (url, headers = {}) => export const post = (url, body, headers) => { headers = { ...headers, 'content-type': 'application/json', accept: 'application/json' }; return fetch(base + url, { method: 'POST', body: JSON.stringify(body), headers }) - .then((r) => r.text()) + .then(async (r) => { + if (r.ok) return r.text(); + throw new Error(await r.text()); + }) .then((body) => { try { body = JSON.parse(body); diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js index a6fbd9bf..dcaa26b4 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js +++ b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js @@ -16,7 +16,7 @@ export const actions = { }; try { - await post(`/user`, user, auth(cookies)); + ({ user } = await post(`/user`, user, auth(cookies))); } catch (e) { return invalid(400, { message: e.message }); } diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte index 20e1fd8f..d546e817 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte @@ -1,109 +1,109 @@ {#if loaded && user.haspin && $pin?.length !== 6} - + {/if}
- - -
-

- {$t('user.settings.header')} -

- -
- {#each tabs as { name, key }} - - - - {/each} -
- - -
- -
- -
+ + +
+

+ {$t('user.settings.header')} +

+ +
+ {#each tabs as { name, key }} + + + + {/each} +
+ + +
+ +
+ +
- diff --git a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte index 5d5f731f..e49205ca 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte @@ -5,7 +5,7 @@ import { t } from '$lib/translations'; import { upload } from '$lib/upload'; - export let user; + export let user; let selectedTheme = 1; let revealPassword = false; diff --git a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte index 0f45966d..0ffb7834 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte @@ -8,7 +8,7 @@ import { invalidate } from '$app/navigation'; import { page } from '$app/stores'; - export let user, submit; + export let user, submit; let settingPin, setting2fa, disabling2fa; let token = ''; @@ -27,7 +27,11 @@ let otp; $: pinChange($current); let pinChange = async (pin) => { - // otp = await post('/otpsecret', { pin }); + try { + otp = await post('/otpsecret', { pin }); + } catch (e) { + console.log(e); + } }; let locked; @@ -78,7 +82,7 @@ pin = null; submit.click(); } catch (e) { - console.log(e) + console.log(e); failure('Failed to disable pin'); } } else { @@ -113,6 +117,7 @@ toggleDisabling(); } } catch (e) { + console.log(e); failure('Failed to disable 2FA, try again'); } }; diff --git a/src/routes/(app)/disable2fa/+server.js b/src/routes/(app)/disable2fa/+server.js index 237da445..13fcb2b9 100644 --- a/src/routes/(app)/disable2fa/+server.js +++ b/src/routes/(app)/disable2fa/+server.js @@ -1,8 +1,13 @@ +import { error } from '@sveltejs/kit'; import { auth, post } from '$lib/utils'; -export async function PUT({ cookies, request }) { - let body = await request.json(); - let res = await post('/disable2fa', body, auth(cookies)); +export async function POST({ cookies, request }) { + try { + let body = await request.json(); + let res = await post('/disable2fa', body, auth(cookies)); - return new Response(JSON.stringify(res)); + return new Response(JSON.stringify(res)); + } catch (e) { + throw error(500, 'Problem disabling 2fa'); + } } diff --git a/src/routes/(app)/otpsecret/+server.js b/src/routes/(app)/otpsecret/+server.js index 8dec7778..cdd050c8 100644 --- a/src/routes/(app)/otpsecret/+server.js +++ b/src/routes/(app)/otpsecret/+server.js @@ -1,8 +1,13 @@ import { auth, post } from '$lib/utils'; import Qr from 'qrcode-base64'; +import { error } from '@sveltejs/kit'; export async function POST({ cookies, locals, request }) { - let { secret } = await post('/otpsecret', await request.json(), auth(cookies)); - let uri = `otpauth://totp/coinos:${locals.user.username}?secret=${secret}&period=30&digits=6&algorithm=SHA1&issuer=coinos`; - return new Response(JSON.stringify({ secret, uri, qr: Qr.drawImg(uri, { size: 600 }) })); + try { + let { secret } = await post('/otpsecret', await request.json(), auth(cookies)); + let uri = `otpauth://totp/coinos:${locals.user.username}?secret=${secret}&period=30&digits=6&algorithm=SHA1&issuer=coinos`; + return new Response(JSON.stringify({ secret, uri, qr: Qr.drawImg(uri, { size: 600 }) })); + } catch (e) { + throw new error(500, 'Problem saving secret'); + } } -- cgit v1.2.3 From c901b229121ee74b4a1a8794ca7578d9cfea0055 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 9 Nov 2022 11:18:38 -0800 Subject: fix support form --- src/components/AppHeader.svelte | 4 +- src/components/Footer.svelte | 2 +- src/lib/utils.js | 2 +- .../(app)/[username]/support/+page.server.js | 13 ---- src/routes/(app)/[username]/support/+page.svelte | 76 -------------------- src/routes/(app)/support/+page.server.js | 16 +++++ src/routes/(app)/support/+page.svelte | 81 ++++++++++++++++++++++ 7 files changed, 101 insertions(+), 93 deletions(-) delete mode 100644 src/routes/(app)/[username]/support/+page.server.js delete mode 100644 src/routes/(app)/[username]/support/+page.svelte create mode 100644 src/routes/(app)/support/+page.server.js create mode 100644 src/routes/(app)/support/+page.svelte (limited to 'src') diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte index ec0f5174..728b025a 100644 --- a/src/components/AppHeader.svelte +++ b/src/components/AppHeader.svelte @@ -17,7 +17,7 @@ menuButtons = [ { key: 'nav.profile', icon: 'profile', href: `/${user.username}` }, { key: 'nav.settings', icon: 'settings', href: `/${user.username}/settings` }, - { key: 'nav.support', icon: 'support', href: `/${user.username}/support` }, + { key: 'nav.support', icon: 'support', href: `/support` }, { key: 'nav.signOut', icon: 'logout', href: `/logout` } ]; @@ -80,7 +80,7 @@ class="bg-white p-2 rounded-full w-12 h-12 drop-shadow-xl border border-black/10 {$page .url.pathname === `/${user.username}` || $page.url.pathname === `/${user.username}/settings` || - $page.url.pathname === `/${user.username}/support` + $page.url.pathname === `/support` ? 'opacity-100' : `opacity-70 hover:opacity-80 ${showMenu ? 'opacity-80' : ''}`}" on:click={() => (showMenu = !showMenu)} diff --git a/src/components/Footer.svelte b/src/components/Footer.svelte index 5e0aeb4a..0b0a2b72 100644 --- a/src/components/Footer.svelte +++ b/src/components/Footer.svelte @@ -10,7 +10,7 @@ const companyLinks = [ { url: '/news', titleID: 'news' }, - { url: 'mailto:support@coinos.io', titleID: 'support' }, + { url: '/support', titleID: 'support' }, { url: '/jobs', titleID: 'jobs' } ]; diff --git a/src/lib/utils.js b/src/lib/utils.js index c3960487..2bf6b800 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -70,7 +70,7 @@ export function reverseFormat(val, locale) { return Number.isNaN(reversedVal) ? 0 : +reversedVal; } -export let protectedRoutes = [/customers/, /dashboard/, /settings/, /transactions/, /support/]; +export let protectedRoutes = [/customers/, /dashboard/, /settings/, /transactions/]; export const success = (m) => { toast.pop(); diff --git a/src/routes/(app)/[username]/support/+page.server.js b/src/routes/(app)/[username]/support/+page.server.js deleted file mode 100644 index a335ec96..00000000 --- a/src/routes/(app)/[username]/support/+page.server.js +++ /dev/null @@ -1,13 +0,0 @@ -export const actions = { - default: async ({ cookies, request }) => { - let form = Object.fromEntries(await request.formData()); - - try { - await post('/email', form); - } catch (e) { - return invalid(400, { failed: true }); - } - - return { success: true }; - } -}; diff --git a/src/routes/(app)/[username]/support/+page.svelte b/src/routes/(app)/[username]/support/+page.svelte deleted file mode 100644 index cd1cc69f..00000000 --- a/src/routes/(app)/[username]/support/+page.svelte +++ /dev/null @@ -1,76 +0,0 @@ - - -
- {#if form?.success} -

Thank you!

-

Someone will be in touch shortly.

- - - - - {:else} -

- {$t('user.support.header')} -

-
-
- - -
- -
- - -
- -
- -