Settings
Manage your account settings and set e-mail preferences.
@@ -28,7 +28,7 @@
-
diff --git a/src/routes/(user)/settings/+page.server.ts b/src/routes/(user)/settings/+page.server.ts
new file mode 100644
index 0000000..6752b69
--- /dev/null
+++ b/src/routes/(user)/settings/+page.server.ts
@@ -0,0 +1,26 @@
+import type { PageServerLoad } from './$types';
+import { superValidate } from 'sveltekit-superforms';
+import { zod } from 'sveltekit-superforms/adapters';
+import { profileFormSchema } from './profile-form.svelte';
+import { fail, type Actions } from '@sveltejs/kit';
+
+export const load: PageServerLoad = async () => {
+ return {
+ form: await superValidate(zod(profileFormSchema))
+ };
+};
+
+export const actions: Actions = {
+ default: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(profileFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase.collection('users').update(locals.id, form.data);
+ return {
+ form
+ };
+ }
+};
diff --git a/src/routes/(user)/settings/+page.svelte b/src/routes/(user)/settings/+page.svelte
new file mode 100644
index 0000000..2b68897
--- /dev/null
+++ b/src/routes/(user)/settings/+page.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
Profile
+
This is how others will see you on the site.
+
+
+
+
diff --git a/src/routes/(user)/settings/account/+page.server.ts b/src/routes/(user)/settings/account/+page.server.ts
new file mode 100644
index 0000000..62c9a4c
--- /dev/null
+++ b/src/routes/(user)/settings/account/+page.server.ts
@@ -0,0 +1,69 @@
+import type { PageServerLoad } from './$types';
+import { superValidate } from 'sveltekit-superforms';
+import { zod } from 'sveltekit-superforms/adapters';
+import { usernameFormSchema } from './username-form.svelte';
+import { emailRequestFormSchema, emailConfirmFormSchema } from './email-form.svelte';
+import { passwordFormSchema } from './password-form.svelte';
+import { fail, type Actions } from '@sveltejs/kit';
+
+export const load: PageServerLoad = async () => {
+ return {
+ usernameForm: await superValidate(zod(usernameFormSchema)),
+ emailRequestForm: await superValidate(zod(emailRequestFormSchema)),
+ emailConfirmForm: await superValidate(zod(emailConfirmFormSchema)),
+ passwordForm: await superValidate(zod(passwordFormSchema))
+ };
+};
+
+export const actions: Actions = {
+ username: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(usernameFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase.collection('users').update(locals.id, form.data);
+ return {
+ form
+ };
+ },
+ emailRequest: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(emailRequestFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase.collection('users').requestEmailChange(form.data.newEmail);
+ return {
+ form
+ };
+ },
+ emailConfirm: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(emailConfirmFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase
+ .collection('users')
+ .confirmEmailChange(form.data.token, form.data.password);
+ return {
+ form
+ };
+ },
+ password: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(passwordFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase.collection('users').update(locals.id, form.data);
+ return {
+ form
+ };
+ }
+};
diff --git a/src/routes/(user)/settings/account/+page.svelte b/src/routes/(user)/settings/account/+page.svelte
new file mode 100644
index 0000000..f5dc185
--- /dev/null
+++ b/src/routes/(user)/settings/account/+page.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+
Account
+
Update your account settings.
+
+
+
+
+
+
diff --git a/src/routes/(user)/settings/account/email-form.svelte b/src/routes/(user)/settings/account/email-form.svelte
new file mode 100644
index 0000000..89a203a
--- /dev/null
+++ b/src/routes/(user)/settings/account/email-form.svelte
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+ Request an email change
+ Receive a verification token on this email, which you can enter in the next section.
+
+
+
+
+ New email
+
+
+
+ {#if isLoading}
+
+ {/if}
+ Request token
+
+
+
+
+
+
+ {#if dev && debugForms && browser}
+
+
+
+ {/if}
+
+
+
+
+
+ Confirm email change
+ Enter your verification token below to confirm the email change.
+
+
+
+
+ Token
+
+
+
+
+
+
+ Password
+
+
+
+
+
+ {#if isLoading}
+
+ {/if}
+ Update email
+
+
+
+ {#if dev && debugForms && browser}
+
+
+
+ {/if}
+
+
diff --git a/src/routes/(user)/settings/account/password-form.svelte b/src/routes/(user)/settings/account/password-form.svelte
new file mode 100644
index 0000000..0693919
--- /dev/null
+++ b/src/routes/(user)/settings/account/password-form.svelte
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+ Change your password
+ You can change your password here.
+
+
+
+
+ Current password
+
+
+
+
+
+
+ New password
+
+
+
+
+
+
+ Confirm new password
+
+
+
+
+
+
+ {#if isLoading}
+
+ {/if}
+ Update password
+
+
+
+ {#if dev && PUBLIC_DEBUG_FORMS == 'true' && browser}
+
+
+
+ {/if}
+
+
diff --git a/src/routes/(user)/settings/account/username-form.svelte b/src/routes/(user)/settings/account/username-form.svelte
new file mode 100644
index 0000000..b0870c7
--- /dev/null
+++ b/src/routes/(user)/settings/account/username-form.svelte
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+ Change your username
+
+ You can modify the username used for logging in and as your handle.
+
+
+
+
+
+ Username
+
+
+
+
+
+
+ {#if isLoading}
+
+ {/if}
+ Update username
+
+
+
+ {#if dev && debugForms && browser}
+
+
+
+ {/if}
+
+
diff --git a/src/routes/(user)/settings/appearance/+page.server.ts b/src/routes/(user)/settings/appearance/+page.server.ts
new file mode 100644
index 0000000..6aca99a
--- /dev/null
+++ b/src/routes/(user)/settings/appearance/+page.server.ts
@@ -0,0 +1,26 @@
+import { superValidate } from 'sveltekit-superforms';
+import { zod } from 'sveltekit-superforms/adapters';
+import type { PageServerLoad } from '../$types';
+import { appearanceFormSchema } from './appearance-form.svelte';
+import { fail, type Actions } from '@sveltejs/kit';
+
+export const load: PageServerLoad = async () => {
+ return {
+ form: await superValidate(zod(appearanceFormSchema))
+ };
+};
+
+export const actions: Actions = {
+ default: async ({ request, locals }) => {
+ const form = await superValidate(request, zod(appearanceFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form
+ });
+ }
+ await locals.pocketBase.collection('users').update(locals.id, form.data);
+ return {
+ form
+ };
+ }
+};
diff --git a/src/routes/(dashboard)/settings/appearance/+page.svelte b/src/routes/(user)/settings/appearance/+page.svelte
similarity index 86%
rename from src/routes/(dashboard)/settings/appearance/+page.svelte
rename to src/routes/(user)/settings/appearance/+page.svelte
index 6dea5a0..39e7231 100644
--- a/src/routes/(dashboard)/settings/appearance/+page.svelte
+++ b/src/routes/(user)/settings/appearance/+page.svelte
@@ -4,7 +4,6 @@
import AppearanceForm from './appearance-form.svelte';
export let data: PageData;
- export let { form, user } = data;
@@ -15,5 +14,5 @@
-
+
diff --git a/src/routes/(user)/settings/appearance/appearance-form.svelte b/src/routes/(user)/settings/appearance/appearance-form.svelte
new file mode 100644
index 0000000..8e5c6e7
--- /dev/null
+++ b/src/routes/(user)/settings/appearance/appearance-form.svelte
@@ -0,0 +1,148 @@
+
+
+
+
+
diff --git a/src/routes/(user)/settings/profile-form.svelte b/src/routes/(user)/settings/profile-form.svelte
new file mode 100644
index 0000000..47af5ea
--- /dev/null
+++ b/src/routes/(user)/settings/profile-form.svelte
@@ -0,0 +1,77 @@
+
+
+
+
+
diff --git a/src/routes/(user)/settings/profile/+page.server.ts b/src/routes/(user)/settings/profile/+page.server.ts
new file mode 100644
index 0000000..25caaaf
--- /dev/null
+++ b/src/routes/(user)/settings/profile/+page.server.ts
@@ -0,0 +1,5 @@
+import { redirect } from '@sveltejs/kit';
+
+export const load = async () => {
+ throw redirect(303, '/settings');
+};
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 9ed5cec..d5f3202 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,17 +1,22 @@
-