import { subjects } from "@auth/subjects.ts" import { getClient } from "@auth/client.ts" import { useQuery } from "@tanstack/solid-query" import { client } from "../apiclient.ts" if (typeof cookieStore !== "undefined") { await import("cookie-store") } const clientID = import.meta.env.VITE_AUTH_CLIENT_ID const issuerUrl = import.meta.env.VITE_AUTH_ISSUER_URL export const authClient = getClient(clientID, issuerUrl) export async function isAuthenticated() { const accessToken = await cookieStore.get("access_token") const refreshToken = await cookieStore.get("refresh_token") if (!accessToken) { return false } const verified = await authClient.verify(subjects, accessToken.value!, { refresh: refreshToken?.value, }) if (verified.err) { console.error("Error verifying token:", verified.err) await cookieStore.delete("access_token") await cookieStore.delete("refresh_token") return false } if (verified.tokens) { await cookieStore.set({ name: "access_token", value: verified.tokens.access, sameSite: "lax", path: "/", expires: Temporal.Now.instant().add({ seconds: verified.tokens.expiresIn, }).epochMilliseconds, }) await cookieStore.set({ name: "refresh_token", value: verified.tokens.refresh, sameSite: "lax", path: "/", expires: Temporal.Now.instant().add({ seconds: 60 * 60 * 24 * 400, // 400 days }).epochMilliseconds, }) } return verified.subject } export function useMe() { return useQuery(() => ({ queryKey: [client.api.v1.account.me.$url().pathname], queryFn: async () => { const res = await client.api.v1.account.me.$get() if (!res.ok) { throw new Error("Not authenticated") } return await res.json() }, retry: false, })) }