/* SPDX-FileCopyrightText: © 2025 Hornwitser SPDX-License-Identifier: AGPL-3.0-or-later */ import { appendResponseHeader } from "h3"; import type { H3Event } from "h3"; import type { ApiAccount } from "~/shared/types/api"; const fetchSessionWithCookie = async (event?: H3Event) => { // Client side if (!event) { return $fetch("/api/auth/session"); } // Server side const cookie = useRequestHeader("cookie"); const res = await $fetch.raw("/api/auth/session", { headers: cookie ? { cookie } : undefined }); for (const cookie of res.headers.getSetCookie()) { appendResponseHeader(event, "set-cookie", cookie); } return res._data; } export const useSessionStore = defineStore("session", () => { const state = { account: ref(), id: ref(), push: ref(false), }; const actions = { async fetch(event?: H3Event) { const session = await fetchSessionWithCookie(event) state.account.value = session?.account; state.id.value = session?.id; state.push.value = session?.push ?? false; }, async logIn(name: string) { const res = await $fetch.raw("/api/auth/login", { method: "POST", body: { name }, }); await actions.fetch(); return `/api/auth/login replied: ${res.status} ${res.statusText}`; }, async logOut() { try { await $fetch.raw("/api/auth/session", { method: "DELETE", }); await actions.fetch(); } catch (err: any) { alert(`Log out failed: ${err.statusCode} ${err.statusMessage}`); } }, }; return { ...state, ...actions, }; });