/
tsps
/
adminka
Обзор
Документация
Войти
/
tsps
/
adminka
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/store/authStore.ts
72 строки
2 KB
Василий Петров
Чистка токена в Logout
30 ноя 2025, 13:24
30 ноя 2025, 13:24
cb18ad3
Код
Авторство
О чём код?
import { create } from 'zustand'; import { apiFetch } from '@/lib/api/client'; interface Admin { email: string; first_name: string; last_name: string; } interface AuthState { isAuthenticated: boolean; accessToken: string | null; admin: Admin | null; login: (token: string, admin: Admin) => void; logout: () => void; } const STORAGE_KEY = 'auth_state'; // Читает и парсит состояние из localStorage const getStoredState = (): Partial<AuthState> => { if (typeof window === 'undefined') return {}; try { const stored = localStorage.getItem(STORAGE_KEY); return stored ? JSON.parse(stored) : {}; } catch (e) { console.warn('Failed to parse auth state from localStorage'); return {}; } }; // Вспомогательная функция для безопасного создания начального состояния const createInitialState = (): AuthState => { const stored = getStoredState(); return { isAuthenticated: stored.isAuthenticated ?? false, accessToken: stored.accessToken ?? null, admin: stored.admin ?? null, login: () => {}, // будет перезаписан ниже logout: () => {}, // будет перезаписан ниже }; }; export const useAuthStore = create<AuthState>((set) => { const initialState = createInitialState(); return { ...initialState, login: (token, admin) => { const newState = { isAuthenticated: true, accessToken: token, admin }; set(newState); localStorage.setItem(STORAGE_KEY, JSON.stringify(newState)); }, logout: async () => { const { accessToken } = useAuthStore.getState(); // Сначала инвалидируем токен на бэкенде if (accessToken) { try { await apiFetch('/logout', { method: 'POST' }); } catch (error) { console.warn('Не удалось отправить запрос на logout:', error); // Игнорируем ошибку — всё равно очищаем локально } } // Очищаем локальное состояние set({ isAuthenticated: false, accessToken: null, admin: null }); localStorage.removeItem(STORAGE_KEY); } }; });