62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
|
import { appendResponseHeader } from "h3";
|
||
|
import type { H3Event } from "h3";
|
||
|
import type { Account } from "~/shared/types/account";
|
||
|
|
||
|
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<Account>(),
|
||
|
id: ref<number>(),
|
||
|
push: ref<boolean>(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,
|
||
|
};
|
||
|
});
|