import { createSignal } from "solid-js"; import { api } from "../api"; import type { User } from "../types/user"; interface AuthResponse { token: string; user: User; } interface MessageResponse { message: string; } interface ErrorResponse { error: string; } const [user, setUser] = createSignal(null); const [token, setToken] = createSignal(localStorage.getItem("token")); const [loading, setLoading] = createSignal(true); async function initialize() { const stored = token(); if (!stored) { setLoading(false); return; } try { const response = await api("/auth/me", { token: stored }); if (response.ok) { setUser(response.data); } else { localStorage.removeItem("token"); setToken(null); } } catch { localStorage.removeItem("token"); setToken(null); } setLoading(false); } async function login(username: string, password: string): Promise { const response = await api("/auth/login", { method: "POST", body: { username, password }, }); if (response.ok) { const data = response.data as AuthResponse; localStorage.setItem("token", data.token); setToken(data.token); setUser(data.user); return null; } return (response.data as ErrorResponse).error; } async function register(username: string, email: string, password: string, displayName: string): Promise { const response = await api("/auth/register", { method: "POST", body: { username, email, password, display_name: displayName }, }); if (response.ok) return null; return (response.data as ErrorResponse).error; } async function verify(verificationToken: string, type: string): Promise { const response = await api("/auth/verify", { method: "POST", body: { token: verificationToken, type }, }); if (response.ok) return null; return (response.data as ErrorResponse).error; } async function reactivate(email: string): Promise { const response = await api("/auth/reactivate", { method: "POST", body: { email }, }); if (response.ok) return null; return (response.data as ErrorResponse).error; } async function heartbeat() { const stored = token(); if (stored) { await api("/auth/heartbeat", { method: "POST", token: stored }); } } async function logout() { const stored = token(); if (stored) { await api("/auth/logout", { method: "POST", token: stored }); } localStorage.removeItem("token"); setToken(null); setUser(null); } export const auth = { user, token, loading, initialize, login, register, verify, reactivate, heartbeat, logout };