diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/store.js | 2 | ||||
| -rw-r--r-- | src/lib/upload.js | 1 | ||||
| -rw-r--r-- | src/lib/utils.js | 6 | ||||
| -rw-r--r-- | src/locales/en.json | 1 | ||||
| -rw-r--r-- | src/routes/(app)/+layout.server.js | 2 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/+page.server.js | 11 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/+page.svelte | 10 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/_account.svelte | 28 |
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"> |
