fixes profile avatar upload

This commit is contained in:
Christian Beutel
2024-03-20 13:52:32 +01:00
parent 2732aaf9c1
commit 3e8fb85c05
3 changed files with 43 additions and 14 deletions

View File

@@ -48,18 +48,34 @@ export async function logout() {
pb.authStore.clear(); pb.authStore.clear();
} }
export async function users_update(id: string, user: User | { [K in keyof User]?: User[K] } | FormData) { export async function users_update(user: User | { [K in keyof User]?: User[K] }, avatar?: File) {
const r = await fetch('/api/v1/user/' + id, { let r = await fetch('/api/v1/user/' + user.id, {
method: 'POST', method: 'POST',
body: JSON.stringify(user) body: JSON.stringify(user)
}) })
if (r.ok) { if (!r.ok) {
const model = await r.json();
currentUser.set(model);
} else {
throw new ClientResponseError(await r.json()) 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) { export async function users_delete(user: User) {

View File

@@ -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<User>(event.params.id as string, data,);
return json(r);
} catch (e: any) {
throw error(e.status, e)
}
}

View File

@@ -60,7 +60,8 @@
async function handleSearchClick(item: SearchItem) { async function handleSearchClick(item: SearchItem) {
citySearchQuery = item.text; citySearchQuery = item.text;
await users_update($currentUser!.id, { await users_update({
id: $currentUser!.id,
location: { location: {
name: item.value.name, name: item.value.name,
lat: item.value.lat, lat: item.value.lat,
@@ -74,25 +75,24 @@
document.getElementById("avatarInput") as HTMLInputElement document.getElementById("avatarInput") as HTMLInputElement
).files; ).files;
if (!files) { if (!files || files.length == 0) {
return; return;
} }
const formData = new FormData(); await users_update($currentUser!, files[0]);
formData.append("avatar", files[0]);
await users_update($currentUser!.id, formData);
} }
async function handleUnitSelection(e: RadioItem) { async function handleUnitSelection(e: RadioItem) {
await users_update($currentUser!.id, { await users_update({
id: $currentUser!.id,
unit: e.value as "imperial" | "metric", unit: e.value as "imperial" | "metric",
}); });
} }
async function handleLanguageSelection(value: "en" | "de") { async function handleLanguageSelection(value: "en" | "de") {
locale.set(value); locale.set(value);
await users_update($currentUser!.id, { await users_update({
id: $currentUser!.id,
language: value, language: value,
}); });
} }