aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/store.js2
-rw-r--r--src/lib/upload.js1
-rw-r--r--src/lib/utils.js6
-rw-r--r--src/locales/en.json1
-rw-r--r--src/routes/(app)/+layout.server.js2
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.server.js11
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.svelte10
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/_account.svelte28
8 files changed, 55 insertions, 6 deletions
diff --git a/src/lib/store.js b/src/lib/store.js
index 6853386c..7f43e914 100644
--- a/src/lib/store.js
+++ b/src/lib/store.js
@@ -52,4 +52,6 @@ export const request = writable();
export const requestRedirect = writable();
export const selectedRate = writable();
export const token = persistSession('token');
+export const email = writable();
+export const phone = writable();
export const user = writable();
diff --git a/src/lib/upload.js b/src/lib/upload.js
index d8b27061..099e2f30 100644
--- a/src/lib/upload.js
+++ b/src/lib/upload.js
@@ -1,5 +1,4 @@
export const upload = async (file, type, progress, token) => {
- console.log('TYPE', type);
let url = `/api/upload/${type}`;
let formData = new FormData();
formData.append('file', file);
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 7b10c638..6617f76e 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -240,6 +240,12 @@ export function ss(str1, str2) {
return 0.0;
}
+export const validateEmail = (email) => {
+ const re =
+ /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+ return re.test(email);
+};
+
export const types = {
bitcoin: 'bitcoin',
lightning: 'lightning',
diff --git a/src/locales/en.json b/src/locales/en.json
index 402f0214..350f8a05 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -205,6 +205,7 @@
"locale": "Language",
"username": "Username",
"email": "Email",
+ "phone": "Phone Number",
"newPassword": "Change Password",
"about": "About",
"aboutPlaceholder": "A little something about you or your business address and hours",
diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js
index ef278744..3442081b 100644
--- a/src/routes/(app)/+layout.server.js
+++ b/src/routes/(app)/+layout.server.js
@@ -1,6 +1,6 @@
import { error, redirect } from '@sveltejs/kit';
import { get, post, auth, protectedRoutes } from '$lib/utils';
-import { PUBLIC_BTC as btc } from '$env/static/public';
+import { _BTC as btc } from '$env/static/public';
export async function load({ cookies, request, url, params }) {
let { pathname } = url;
diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
index 4e80a5ad..535c588f 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
+++ b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
@@ -19,5 +19,16 @@ export const actions = {
}
return { user, success: true };
+ },
+
+ email: async({cookies, request }) => {
+ let form = Object.fromEntries(await request.formData());
+ let user = { ...(await get('/me', auth(cookies))), ...form };
+
+ try {
+ ({ user } = await post('/email/verify', user, auth(cookies)))
+ } catch (e) {
+ return fail(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 5638a22b..1189053f 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
@@ -5,7 +5,6 @@
import { Icon, Spinner, Pin } from '$comp';
import { t } from '$lib/translations';
- import { fail, post, success } from '$lib/utils';
import { avatar, banner, password, pin } from '$lib/store';
import { upload } from '$lib/upload';
import { page } from '$app/stores';
@@ -37,7 +36,6 @@
fail('Wrong pin, try again');
$pin = '';
}
-
let tabs = [
{ name: 'account', key: 'ACCOUNT', comp: Account },
{ name: 'pos', key: 'POINT_OF_SALE', comp: Pos },
@@ -46,7 +44,7 @@
$: ({ comp } = tabs.find((t) => t.name === tab));
- let { address, id, username } = user;
+ let { address, id, username, phone, email } = user;
let loading;
async function handleSubmit() {
@@ -68,6 +66,11 @@
await fetch(`/api/public/${id}-banner.webp`, { cache: 'reload', mode: 'no-cors' });
}
+ if (!validateEmail(email)) {
+ user.email = null;
+ throw new Error("Invalid email");
+ }
+
let event = {
pubkey: user.pubkey,
created_at: Math.floor(Date.now() / 1000),
@@ -115,6 +118,7 @@
<form
method="POST"
class="mb-[154px]"
+ action="?/save"
on:submit|preventDefault={handleSubmit}
bind:this={formElement}
>
diff --git a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte
index 0ab11b32..31ea80c1 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/_account.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/_account.svelte
@@ -4,9 +4,10 @@
import { Icon } from '$comp';
import { t } from '$lib/translations';
+ import { auth, post } from '$lib/utils';
+
export let user;
let { id } = user;
-
let selectedTheme = 1;
let avatarFile, avatarInput, bannerFile, bannerInput;
@@ -24,6 +25,15 @@
$colorTheme = colors.color1 + ' ' + colors.color2;
};
+ let handleConfirmEmailClick = async (email) => {
+ console.log("CLICKED", email)
+
+ }
+
+ let handleConfirmPhoneClick = (phone) => {
+ console.log("CLICKED", phone)
+ }
+
let selectAvatar = () => avatarInput.click();
let selectBanner = () => bannerInput.click();
@@ -80,6 +90,22 @@
</div>
<div>
+ <label for="email" class="font-bold mb-1 block">{$t('user.settings.email')}</label>
+ <form action="?/email" method="post" class="flex flex-row">
+ <input type="text" name="email" bind:value={user.email} />
+ <button type="submit" class="border-2 border-black rounded-xl font-semibold ml-3.5 mx-auto p-1 hover:opacity-80" on:click={() => handleConfirmEmailClick(user.email)}>verify email</button>
+ </form>
+</div>
+
+<div>
+ <label for="phone" class="font-bold mb-1 block">{$t('user.settings.phone')}</label>
+ <div class="flex flex-row">
+ <input type="tel" name="phone" bind:value={user.phone} />
+ <button type="button" class="border-2 border-black rounded-xl font-semibold ml-3.5 mx-auto p-1 hover:opacity-80" on:click={() => handleConfirmPhoneClick(user.phone)}>verify phone</button>
+ </div>
+</div>
+
+<div>
<span class="font-bold">{$t('user.settings.profileImage')}</span>
<div class="flex">