| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // 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));
|