diff --git a/apps/web/src/app.d.ts b/apps/web/src/app.d.ts index 3ba5e57..d797c50 100644 --- a/apps/web/src/app.d.ts +++ b/apps/web/src/app.d.ts @@ -5,6 +5,8 @@ declare global { namespace App { interface Locals { pocketBase: PocketBase; + id: string; + email: string; } // interface Error {} // interface PageData {} diff --git a/apps/web/src/hooks.server.ts b/apps/web/src/hooks.server.ts index df29cc2..fd11208 100644 --- a/apps/web/src/hooks.server.ts +++ b/apps/web/src/hooks.server.ts @@ -1,22 +1,65 @@ -import { type Handle } from '@sveltejs/kit'; +// import { type Handle } from '@sveltejs/kit'; +// import PocketBase from 'pocketbase'; +// import { pb } from '$lib/pocketbase'; +// import { SERVER_PB } from '$env/static/private'; + +// /** @type {import('@sveltejs/kit').Handle} */ +// export const handle: Handle = async ({ event, resolve }) => { +// event.locals.pocketBase = new PocketBase(SERVER_PB); + +// pb.set(event.locals.pocketBase); + +// event.locals.pocketBase.authStore.loadFromCookie(event.request.headers.get('cookie') ?? ''); + +// const response = await resolve(event); + +// response.headers.set( +// 'set-cookie', +// event.locals.pocketBase.authStore.exportToCookie({ secure: false }) +// ); + +// return response; +// }; + +import { redirect, type Handle } from '@sveltejs/kit'; import PocketBase from 'pocketbase'; -import { pb } from '$lib/pocketbase'; -import { PUBLIC_CLIENT_PB } from '$env/static/public'; +import { building } from '$app/environment'; +import { SERVER_PB } from '$env/static/private'; -/** @type {import('@sveltejs/kit').Handle} */ export const handle: Handle = async ({ event, resolve }) => { - event.locals.pocketBase = new PocketBase(PUBLIC_CLIENT_PB); + event.locals.id = ''; + event.locals.email = ''; + event.locals.pocketBase = new PocketBase(SERVER_PB); - pb.set(event.locals.pocketBase); + const isAuth: boolean = event.url.pathname === '/auth'; + if (isAuth || building) { + event.cookies.set('pb_auth', '', { path: '/' }); + return await resolve(event); + } - event.locals.pocketBase.authStore.loadFromCookie(event.request.headers.get('cookie') ?? ''); + const pb_auth = event.request.headers.get('cookie') ?? ''; + event.locals.pocketBase.authStore.loadFromCookie(pb_auth); + + if (!event.locals.pocketBase.authStore.isValid) { + console.log('Session expired'); + throw redirect(303, '/auth'); + } + try { + const auth = await event.locals.pocketBase + .collection('users') + .authRefresh<{ id: string; email: string }>(); + event.locals.id = auth.record.id; + event.locals.email = auth.record.email; + } catch (_) { + throw redirect(303, '/auth'); + } + + if (!event.locals.id) { + throw redirect(303, '/auth'); + } const response = await resolve(event); - - response.headers.set( - 'set-cookie', - event.locals.pocketBase.authStore.exportToCookie({ secure: false }) - ); - + const cookie = event.locals.pocketBase.authStore.exportToCookie({ sameSite: 'lax' }); + response.headers.append('set-cookie', cookie); return response; }; diff --git a/apps/web/src/lib/components/site/icons/logo.svelte b/apps/web/src/lib/components/site/icons/logo.svelte index 60e545a..5167ff6 100644 --- a/apps/web/src/lib/components/site/icons/logo.svelte +++ b/apps/web/src/lib/components/site/icons/logo.svelte @@ -1,9 +1,9 @@ @@ -17,8 +17,8 @@ stroke-linecap="round" stroke-linejoin="round" > - - - - + + + + diff --git a/apps/web/src/lib/components/site/nav/user-nav.svelte b/apps/web/src/lib/components/site/nav/user-nav.svelte index 864e252..6cdbb85 100644 --- a/apps/web/src/lib/components/site/nav/user-nav.svelte +++ b/apps/web/src/lib/components/site/nav/user-nav.svelte @@ -21,7 +21,7 @@
-

{user?.name}

+

{user?.name || user?.username}

{user?.email}

@@ -34,7 +34,6 @@ Profile - Account Appearance Notifications diff --git a/apps/web/src/lib/config/nav.ts b/apps/web/src/lib/config/nav.ts index 4867ff9..188a4ea 100644 --- a/apps/web/src/lib/config/nav.ts +++ b/apps/web/src/lib/config/nav.ts @@ -7,11 +7,6 @@ interface NavConfig { export const navConfig: NavConfig = { mainNav: [ - { - title: 'Home', - href: '/', - always: true - }, { title: 'Dashboard', href: '/dashboard', diff --git a/apps/web/src/routes/(auth)/auth/+page.server.ts b/apps/web/src/routes/(auth)/auth/+page.server.ts new file mode 100644 index 0000000..44b1e1a --- /dev/null +++ b/apps/web/src/routes/(auth)/auth/+page.server.ts @@ -0,0 +1,44 @@ +import { error, redirect, type Cookies } from '@sveltejs/kit'; +import type { Actions } from './$types'; + +export const actions = { + login: async ({ + request, + locals, + cookies + }: { + request: Request; + locals: App.Locals; + cookies: Cookies; + }) => { + const body = Object.fromEntries(await request.formData()); + try { + const email = body.email.toString(); + const password = body.password.toString(); + await locals.pocketBase.collection('users').authWithPassword(email, password); + if (!locals.pocketBase?.authStore?.model?.verified) { + locals.pocketBase.authStore.clear(); + return { + notVerified: true + }; + } + } catch (err) { + console.log('Error: ', err); + throw error(500, 'Something went wrong logging in'); + } + cookies.set('pb_auth', JSON.stringify({ token: locals.pocketBase.authStore.token }), { + path: '/' + }); + + throw redirect(303, '/'); + }, + oauth2: async ({ request, cookies }) => { + const form = await request.formData(); + const token = form.get('token'); + if (!token || typeof token !== 'string') { + throw redirect(303, '/auth'); + } + cookies.set('pb_auth', JSON.stringify({ token: token }), { path: '/' }); + throw redirect(303, '/'); + } +} satisfies Actions; diff --git a/apps/web/src/routes/(auth)/auth/+page.svelte b/apps/web/src/routes/(auth)/auth/+page.svelte new file mode 100644 index 0000000..3928e3d --- /dev/null +++ b/apps/web/src/routes/(auth)/auth/+page.svelte @@ -0,0 +1,187 @@ + + +
+
+
+

Log into your account

+

+ Enter your email and password below to log into your account +

+
+
+
{ + isLoading = true; + }} + > +
+
+ + +
+
+ + +
+ +
+ {#if form?.notVerified} + + + You must verify your email before you can login. + + {/if} +
+
+ +
{ + isLoading = true; + }} + > + {#if providers.length} +
+
+ +
+
+ Or continue with +
+
+
+ +
+ +
+ {#if providers.length > 1} +
+ +
+ + + + + + Login Providers + {#each providersWithIcons as provider} + {#if provider.name !== currentProvider.name} + (currentProvider = provider)} + > + {#if provider.icon === undefined} + {provider.name} + {:else} + + {/if} + {provider.displayName} + + {/if} + {/each} + + +
+
+ {/if} +
+ {/if} +
+
+

+ Don't have an account? Sign up.
+ Forgot password? Reset password. +

+
diff --git a/apps/web/src/routes/(auth)/login/+page.server.ts b/apps/web/src/routes/(auth)/login/+page.server.ts deleted file mode 100644 index e09d7c9..0000000 --- a/apps/web/src/routes/(auth)/login/+page.server.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { error, redirect } from '@sveltejs/kit'; -import type { Actions } from './$types'; - -export const actions: Actions = { - login: async ({ request, locals }: { request: Request; locals: App.Locals }) => { - const body = Object.fromEntries(await request.formData()); - - try { - const email = body.email.toString(); - const password = body.password.toString(); - await locals.pocketBase.collection('users').authWithPassword(email, password); - if (!locals.pocketBase?.authStore?.model?.verified) { - locals.pocketBase.authStore.clear(); - return { - notVerified: true - }; - } - } catch (err) { - console.log('Error: ', err); - throw error(500, 'Something went wrong logging in'); - } - - throw redirect(303, '/'); - }, - // TODO: Implement Oauth2 Auth - oauth2: async ({ request, locals }: { request: Request; locals: App.Locals }) => { - const body = Object.fromEntries(await request.formData()); - const provider = body.provider.toString(); - await locals.pocketBase.collection('users').authWithOAuth2({ provider: provider }); - } -}; diff --git a/apps/web/src/routes/(auth)/login/+page.svelte b/apps/web/src/routes/(auth)/login/+page.svelte deleted file mode 100644 index 42a480b..0000000 --- a/apps/web/src/routes/(auth)/login/+page.svelte +++ /dev/null @@ -1,168 +0,0 @@ - - -
-
-
-

Log into your account

-

- Enter your email and password below to log into your account -

-
-
-
{ - isLoading = true; - }} - > -
-
- - -
-
- - -
- -
- {#if form?.notVerified} - - - You must verify your email before you can login. - - {/if} -
-
{ - isLoading = true; - }} - > - {#if providers.length} -
-
- -
-
- Or continue with -
-
-
- -
- -
- {#if providers.length > 1} -
- -
- - - - - - Login Providers - {#each providersWithIcons as provider} - {#if provider.name !== currentProvider.name} - (currentProvider = provider)} - > - {#if provider.icon === undefined} - {provider.name} - {:else} - - {/if} - {provider.displayName} - - {/if} - {/each} - - -
-
- {/if} -
- {/if} -
-
-

- Don't have an account? Sign up.
- Forgot password? Reset password. -

-
-
diff --git a/apps/web/src/routes/(dashboard)/settings/+layout.svelte b/apps/web/src/routes/(dashboard)/settings/+layout.svelte index d3d623d..90057d9 100644 --- a/apps/web/src/routes/(dashboard)/settings/+layout.svelte +++ b/apps/web/src/routes/(dashboard)/settings/+layout.svelte @@ -7,10 +7,6 @@ title: 'Profile', href: '/settings' }, - { - title: 'Account', - href: '/settings/account' - }, { title: 'Appearance', href: '/settings/appearance' diff --git a/apps/web/src/routes/(dashboard)/settings/+page.svelte b/apps/web/src/routes/(dashboard)/settings/+page.svelte index 02d2ac4..121af54 100644 --- a/apps/web/src/routes/(dashboard)/settings/+page.svelte +++ b/apps/web/src/routes/(dashboard)/settings/+page.svelte @@ -9,8 +9,8 @@
-

Profile

-

This is how others will see you on the site.

+

Account

+

Update your account and profile settings.

diff --git a/apps/web/src/routes/(dashboard)/settings/account/+page.server.ts b/apps/web/src/routes/(dashboard)/settings/account/+page.server.ts deleted file mode 100644 index 4366743..0000000 --- a/apps/web/src/routes/(dashboard)/settings/account/+page.server.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { superValidate } from 'sveltekit-superforms/server'; -import type { PageServerLoad } from './$types'; -import { accountFormSchema } from './account-form.svelte'; -import { fail, type Actions } from '@sveltejs/kit'; - -export const load: PageServerLoad = async () => { - return { - form: await superValidate(accountFormSchema) - }; -}; - -export const actions: Actions = { - default: async (event) => { - const form = await superValidate(event, accountFormSchema); - if (!form.valid) { - return fail(400, { - form - }); - } - return { - form - }; - } -}; diff --git a/apps/web/src/routes/(dashboard)/settings/account/+page.svelte b/apps/web/src/routes/(dashboard)/settings/account/+page.svelte deleted file mode 100644 index 7d80bab..0000000 --- a/apps/web/src/routes/(dashboard)/settings/account/+page.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - -
-
-

Account

-

- Update your account settings. Set your preferred language and timezone. -

-
- - -
diff --git a/apps/web/src/routes/(dashboard)/settings/account/account-form.svelte b/apps/web/src/routes/(dashboard)/settings/account/account-form.svelte deleted file mode 100644 index 3432e6e..0000000 --- a/apps/web/src/routes/(dashboard)/settings/account/account-form.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - Name - - - This is the name that will be displayed on your profile and in emails. - - - - - Update account - diff --git a/apps/web/src/routes/(dashboard)/settings/profile-form.svelte b/apps/web/src/routes/(dashboard)/settings/profile-form.svelte index d7ac350..247c5a3 100644 --- a/apps/web/src/routes/(dashboard)/settings/profile-form.svelte +++ b/apps/web/src/routes/(dashboard)/settings/profile-form.svelte @@ -1,6 +1,12 @@ @@ -17,9 +17,11 @@
-
- -
+ {#key `/${data.url.split('/')[1]}`} +
+ +
+ {/key}
{#if dev}