Files
427e7578-d7bf-49c8-aee9-2dd…/app/src/lib/stores/profile.svelte.ts
2026-03-16 23:03:27 +13:00

63 lines
1.4 KiB
TypeScript

import { loadProfile, saveProfile } from '$lib/db.js';
import { getUserId } from '$lib/crypto.js';
import type { Tag, UserProfile } from '$lib/types.js';
let profile = $state<UserProfile | null>(null);
let loading = $state(true);
export function getProfile() {
return {
get current() { return profile; },
get loading() { return loading; }
};
}
export async function initProfile(): Promise<UserProfile> {
loading = true;
const existing = await loadProfile();
if (existing) {
profile = existing;
loading = false;
return existing;
}
const userId = await getUserId();
const newProfile: UserProfile = {
id: userId,
name: '',
bio: '',
tags: [],
updatedAt: Date.now(),
signature: ''
};
await saveProfile(newProfile);
profile = newProfile;
loading = false;
return newProfile;
}
export async function updateProfile(updates: Partial<Pick<UserProfile, 'name' | 'bio' | 'tags'>>): Promise<void> {
if (!profile) return;
profile = {
...profile,
...updates,
updatedAt: Date.now()
};
await saveProfile(profile);
}
export async function addTag(tag: Tag): Promise<void> {
if (!profile) return;
const tags = [...profile.tags, tag];
await updateProfile({ tags });
}
export async function removeTag(index: number): Promise<void> {
if (!profile) return;
const tags = profile.tags.filter((_, i) => i !== index);
await updateProfile({ tags });
}