// Store de autenticação: token + perfil do usuário, com persistência. // // Fluxo: // - `login(email, password)` → POST /v1/login, grava token + user; // - `loadMe()` → GET /v1/me para reidratar a sessão no refresh; // - `logout()` → limpa token e user. // // O perfil é guardado no localStorage só para evitar "flash" sem nome no header // durante o reload; a fonte de verdade continua sendo o /v1/me. import { writable, derived } from 'svelte/store'; import { browser } from '$app/environment'; import { api } from '../api/client.js'; import { getToken, setToken, clearToken } from '../api/token.js'; const USER_KEY = 'nettown_user'; function readStoredUser() { if (!browser) return null; try { const raw = localStorage.getItem(USER_KEY); return raw ? JSON.parse(raw) : null; } catch { return null; } } function persistUser(user) { if (!browser) return; if (user) localStorage.setItem(USER_KEY, JSON.stringify(user)); else localStorage.removeItem(USER_KEY); } function createAuthStore() { const { subscribe, set } = writable({ user: readStoredUser(), token: getToken(), // `initialized` indica que já tentamos reidratar a sessão (evita piscar o guard). initialized: false }); return { subscribe, /** Autentica e persiste a sessão. Retorna o user em caso de sucesso. */ async login(email, password) { const data = await api.post('/v1/login', { body: { email, password }, auth: false }); setToken(data.token); persistUser(data.user); set({ user: data.user, token: data.token, initialized: true }); return data.user; }, /** Reidrata a sessão a partir do token salvo. Retorna o perfil ou null. */ async loadMe() { const token = getToken(); if (!token) { set({ user: null, token: null, initialized: true }); return null; } try { const profile = await api.get('/v1/me'); persistUser(profile); set({ user: profile, token, initialized: true }); return profile; } catch { // 401 já limpou o token no client; aqui só normalizamos o estado. persistUser(null); set({ user: null, token: null, initialized: true }); return null; } }, /** Encerra a sessão local. */ logout() { clearToken(); persistUser(null); set({ user: null, token: null, initialized: true }); } }; } export const auth = createAuthStore(); /** `true` quando há token (sessão presumivelmente ativa). */ export const isAuthenticated = derived(auth, ($auth) => Boolean($auth.token));