aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-08-30 10:36:42 -0700
committerAdam Soltys <[email protected]>2022-08-30 10:36:42 -0700
commit1bafec112dbec4951f8260821abfc77f41395e22 (patch)
tree47c3fd2c4bcd330f222784e5e3c3c977bd05219d /src
parenta033edd4a5bb3445ae5f906b7d9d3150349d490b (diff)
downloadcoinos-ui-1bafec112dbec4951f8260821abfc77f41395e22.tar.gz
coinos-ui-1bafec112dbec4951f8260821abfc77f41395e22.zip
save account settings
Diffstat (limited to 'src')
-rw-r--r--src/routes/+layout.server.js23
-rw-r--r--src/routes/[username]/settings/+page.svelte55
-rw-r--r--src/routes/[username]/settings/_account.svelte26
-rw-r--r--src/routes/[username]/settings/_security.svelte4
-rw-r--r--src/routes/logout/done/+page.svelte2
-rw-r--r--src/routes/user/+server.js26
6 files changed, 100 insertions, 36 deletions
diff --git a/src/routes/+layout.server.js b/src/routes/+layout.server.js
index fbd53cd0..9edc43e1 100644
--- a/src/routes/+layout.server.js
+++ b/src/routes/+layout.server.js
@@ -1,4 +1,4 @@
-import { error } from '@sveltejs/kit';
+import { error, redirect } from '@sveltejs/kit';
import cookie from 'cookie';
import { protectedRoutes } from '$lib/utils';
import { get, post, auth } from '$lib/utils';
@@ -11,18 +11,23 @@ export async function load({ request, setHeaders, url, params }) {
let rates;
if (token) {
- user = await get('/me', { accept: 'application/json', authorization: `Bearer ${token}` });
+ try {
+ user = await get('/me', { accept: 'application/json', authorization: `Bearer ${token}` });
+ } catch (e) {
+ throw redirect(301, '/logout');
+ }
+
if (protectedRoutes.find((p) => url.pathname.match(p))) {
if (user.username !== params.username) throw error(404, 'user not found');
}
- let account = user.accounts.find((a) => a.asset === btc && !a.pubkey);
- if (account) {
- let { id } = account;
- if (user.account_id !== id) {
- user = await post("/shiftAccount", { id }, auth(request));
- }
- }
+ let account = user.accounts.find((a) => a.asset === btc && !a.pubkey);
+ if (account) {
+ let { id } = account;
+ if (user.account_id !== id) {
+ user = await post('/shiftAccount', { id }, auth(request));
+ }
+ }
}
rates = await get('/rates');
diff --git a/src/routes/[username]/settings/+page.svelte b/src/routes/[username]/settings/+page.svelte
index 1d162ef2..c6d7d3c0 100644
--- a/src/routes/[username]/settings/+page.svelte
+++ b/src/routes/[username]/settings/+page.svelte
@@ -5,6 +5,8 @@
import { AppHeader, Icon } from '$comp';
import { t } from '$lib/translations';
+ import { failure, success, put } from '$lib/utils';
+ import { user } from '$lib/store';
let tab = 'account';
@@ -15,29 +17,42 @@
];
$: ({ comp } = tabs.find((t) => t.name === tab));
+
+ let save = async () => {
+ try {
+ await put('/user', $user);
+ success('Settings saved');
+ } catch (e) {
+ failure('Something went wrong');
+ }
+ };
</script>
<AppHeader />
-<div class="my-20 px-3 md:px-0 w-full md:w-[400px] mx-auto space-y-8">
- <h1 class="text-center text-3xl md:text-4xl font-semibold mb-10">
- {$t('user.settings.header')}
- </h1>
-
- <div class="font-bold flex justify-between items-center border-b pb-3 text-secondary">
- {#each tabs as { name, key }}
- <button class:text-black={tab === name} on:click={() => (tab = name)}
- >{$t(`user.settings.${key}`)}</button
- >
- {/each}
- </div>
+<form on:submit|preventDefault={save}>
+ <div class="my-20 px-3 md:px-0 w-full md:w-[400px] mx-auto space-y-8">
+ <h1 class="text-center text-3xl md:text-4xl font-semibold mb-10">
+ {$t('user.settings.header')}
+ </h1>
- <svelte:component this={comp} />
-</div>
+ <div class="font-bold flex justify-between items-center border-b pb-3 text-secondary">
+ {#each tabs as { name, key }}
+ <button class:text-black={tab === name} on:click|preventDefault={() => (tab = name)}
+ >{$t(`user.settings.${key}`)}</button
+ >
+ {/each}
+ </div>
-<div class="fixed bottom-0 bg-white shadow border w-full">
- <button class="rounded-full border py-2 font-bold my-4 flex px-4 bg-white mx-auto">
- <Icon icon="save" style="m-auto mr-2" />
- <div class="my-auto">Save Settings</div>
- </button>
-</div>
+ <svelte:component this={comp} />
+ </div>
+ <div class="fixed bottom-0 bg-white shadow border w-full">
+ <button
+ type="submit"
+ class="rounded-full border py-2 font-bold my-4 flex px-4 bg-white mx-auto hover:bg-primary"
+ >
+ <Icon icon="save" style="w-6 h-6 mr-1" />
+ <div class="my-auto">Save Settings</div>
+ </button>
+ </div>
+</form>
diff --git a/src/routes/[username]/settings/_account.svelte b/src/routes/[username]/settings/_account.svelte
index 2ce78554..68af0841 100644
--- a/src/routes/[username]/settings/_account.svelte
+++ b/src/routes/[username]/settings/_account.svelte
@@ -3,9 +3,9 @@
import { Icon, Toggle, LocaleSelector } from '$comp';
import { t } from '$lib/translations';
- let password;
let selectedTheme = 1;
let revealPassword = false;
+ let password;
const colorThemes = [
{ theme: 1, color1: 'from-[#F5F7FA]', color2: 'to-[#C3CFE2]' },
@@ -15,6 +15,13 @@
{ theme: 5, color1: 'from-[#F3E7E9]', color2: 'to-[#E3EEFF]' },
{ theme: 6, color1: 'from-[#F5F7FA]', color2: 'via-[#EAF2FF] to-[#DEDFFF]' }
];
+
+ const handleThemeClick = (colors) => {
+ selectedTheme = colors.theme;
+ $colorTheme = colors.color1 + ' ' + colors.color2;
+ };
+
+ $: $user.password = $user.confirm = password;
</script>
<div>
@@ -24,7 +31,12 @@
<div>
<label for="email" class="font-bold mb-1 block">{$t('user.settings.email')}</label>
- <input type="email" name="email" class="block border rounded-xl p-3 w-full" bind:value={$user.email} />
+ <input
+ type="email"
+ name="email"
+ class="block border rounded-xl p-3 w-full"
+ bind:value={$user.email}
+ />
</div>
<div>
@@ -32,7 +44,7 @@
<input
type="text"
name="username"
- value={$user.username}
+ bind:value={$user.username}
class="block border rounded-xl p-3 w-full"
/>
</div>
@@ -55,7 +67,12 @@
<div>
<label for="address" class="font-bold mb-1 block">{$t('user.settings.businessAddress')}</label>
- <input type="text" name="address" class="block border rounded-xl p-3 w-full" />
+ <input
+ type="text"
+ name="address"
+ class="block border rounded-xl p-3 w-full"
+ bind:value={$user.address}
+ />
</div>
<div>
@@ -83,6 +100,7 @@
<p class="text-secondary mb-1">{$t('user.settings.themeDescription')}</p>
{#each colorThemes as colors}
<button
+ type="button"
class="mr-2 w-10 h-10 bg-gradient-to-r {colors.color1} {colors.color2} rounded-xl border-2 {selectedTheme ===
colors.theme
? 'border-black'
diff --git a/src/routes/[username]/settings/_security.svelte b/src/routes/[username]/settings/_security.svelte
index 197317fc..78b63497 100644
--- a/src/routes/[username]/settings/_security.svelte
+++ b/src/routes/[username]/settings/_security.svelte
@@ -8,7 +8,7 @@
<p class="text-secondary mb-1">
{$t('user.settings.securityPINDescription')}
</p>
- <button class="p-3 border rounded-3xl font-bold flex justify-center items-center"
+ <button type="submit" class="p-3 border rounded-3xl font-bold flex justify-center items-center"
><Icon icon="lock" style="mr-1" /> {$t('user.settings.setPIN')}</button
>
</div>
@@ -32,7 +32,7 @@
<p class="text-secondary mb-1">
{$t('user.settings.twofaDescription')}
</p>
- <button class="p-3 border rounded-3xl font-bold flex justify-center items-center"
+ <button type="submit" class="p-3 border rounded-3xl font-bold flex justify-center items-center"
><Icon icon="mobile" style="mr-1" /> {$t('user.settings.twofaSetup')}</button
>
</div>
diff --git a/src/routes/logout/done/+page.svelte b/src/routes/logout/done/+page.svelte
index fe526357..2c7ee6e8 100644
--- a/src/routes/logout/done/+page.svelte
+++ b/src/routes/logout/done/+page.svelte
@@ -8,6 +8,6 @@
$token = null;
$user = null;
close();
+ goto('/');
});
- goto('/');
</script>
diff --git a/src/routes/user/+server.js b/src/routes/user/+server.js
new file mode 100644
index 00000000..f7c6d165
--- /dev/null
+++ b/src/routes/user/+server.js
@@ -0,0 +1,26 @@
+import { auth, post } from "$lib/utils";
+import cookie from 'cookie';
+
+export async function PUT({ request, setHeaders }) {
+ console.log(setHeaders)
+ let user = await request.json();
+ let res = await post('/user', user, auth(request));
+
+ let maxAge = 30 * 24 * 60 * 60;
+
+ let expires = new Date();
+ expires.setSeconds(expires.getSeconds() + maxAge);
+
+ setHeaders({
+ 'content-type': 'application/json',
+ 'set-cookie': cookie.serialize('token', res.token, {
+ httpOnly: true,
+ maxAge,
+ sameSite: 'lax',
+ path: '/',
+ expires
+ })
+ });
+
+ return new Response(JSON.stringify(res));
+}