diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts index ecd48abd..73b8d188 100644 --- a/web/src/lib/stores/user_store.ts +++ b/web/src/lib/stores/user_store.ts @@ -48,18 +48,34 @@ export async function logout() { pb.authStore.clear(); } -export async function users_update(id: string, user: User | { [K in keyof User]?: User[K] } | FormData) { - const r = await fetch('/api/v1/user/' + id, { +export async function users_update(user: User | { [K in keyof User]?: User[K] }, avatar?: File) { + let r = await fetch('/api/v1/user/' + user.id, { method: 'POST', body: JSON.stringify(user) }) - if (r.ok) { - const model = await r.json(); - currentUser.set(model); - } else { + if (!r.ok) { throw new ClientResponseError(await r.json()) } + + + const formData = new FormData(); + + if (avatar) { + formData.append("avatar", avatar); + } + + r = await fetch(`/api/v1/user/${user.id!}/file`, { + method: 'POST', + body: formData, + }) + + if (!r.ok) { + throw new ClientResponseError(await r.json()) + } + + const model: User = await r.json(); + currentUser.set(model); } export async function users_delete(user: User) { diff --git a/web/src/routes/api/v1/user/[id]/file/+server.ts b/web/src/routes/api/v1/user/[id]/file/+server.ts new file mode 100644 index 00000000..10c22438 --- /dev/null +++ b/web/src/routes/api/v1/user/[id]/file/+server.ts @@ -0,0 +1,13 @@ +import { pb } from "$lib/pocketbase"; +import type { User } from "$lib/stores/user_store"; +import { error, json, type RequestEvent } from "@sveltejs/kit"; + +export async function POST(event: RequestEvent) { + const data = await event.request.formData() + try { + const r = await pb.collection("users").update(event.params.id as string, data,); + return json(r); + } catch (e: any) { + throw error(e.status, e) + } +} \ No newline at end of file diff --git a/web/src/routes/profile/+page.svelte b/web/src/routes/profile/+page.svelte index 6e8e1d8b..ba8f7349 100644 --- a/web/src/routes/profile/+page.svelte +++ b/web/src/routes/profile/+page.svelte @@ -60,7 +60,8 @@ async function handleSearchClick(item: SearchItem) { citySearchQuery = item.text; - await users_update($currentUser!.id, { + await users_update({ + id: $currentUser!.id, location: { name: item.value.name, lat: item.value.lat, @@ -74,25 +75,24 @@ document.getElementById("avatarInput") as HTMLInputElement ).files; - if (!files) { + if (!files || files.length == 0) { return; } - const formData = new FormData(); - formData.append("avatar", files[0]); - - await users_update($currentUser!.id, formData); + await users_update($currentUser!, files[0]); } async function handleUnitSelection(e: RadioItem) { - await users_update($currentUser!.id, { + await users_update({ + id: $currentUser!.id, unit: e.value as "imperial" | "metric", }); } async function handleLanguageSelection(value: "en" | "de") { locale.set(value); - await users_update($currentUser!.id, { + await users_update({ + id: $currentUser!.id, language: value, }); }