Токены, правильная работа
This commit is contained in:
@@ -5,6 +5,7 @@ import type { User } from '../../../core/domain/types';
|
||||
|
||||
interface AuthState {
|
||||
token: string | null;
|
||||
refreshToken: string | null;
|
||||
user: User | null;
|
||||
isLoading: boolean;
|
||||
error: string | null;
|
||||
@@ -23,6 +24,9 @@ export const useAuthStore = create<AuthState>((set, get) => ({
|
||||
if (t) AuthApi.setToken(t);
|
||||
return t;
|
||||
})(),
|
||||
refreshToken: (() => {
|
||||
return localStorage.getItem('knot_refresh_token');
|
||||
})(),
|
||||
user: null,
|
||||
isLoading: true,
|
||||
error: null,
|
||||
@@ -33,17 +37,20 @@ export const useAuthStore = create<AuthState>((set, get) => ({
|
||||
try {
|
||||
const res = await AuthApi.getConfig();
|
||||
set({ config: res });
|
||||
} catch {}
|
||||
} catch { }
|
||||
},
|
||||
|
||||
login: async (username, password) => {
|
||||
try {
|
||||
set({ error: null, isLoading: true });
|
||||
const { token, user } = await AuthApi.login(username, password);
|
||||
const { token, refreshToken, user } = await AuthApi.login(username, password);
|
||||
localStorage.setItem('knot_token', token);
|
||||
if (refreshToken) {
|
||||
localStorage.setItem('knot_refresh_token', refreshToken);
|
||||
}
|
||||
AuthApi.setToken(token);
|
||||
connectSocket(token);
|
||||
set({ token, user, isLoading: false });
|
||||
set({ token, refreshToken, user, isLoading: false });
|
||||
await get().fetchConfig();
|
||||
} catch (err: unknown) {
|
||||
const msg = err instanceof Error ? err.message : String(err);
|
||||
@@ -55,11 +62,14 @@ export const useAuthStore = create<AuthState>((set, get) => ({
|
||||
register: async (username, displayName, password, bio) => {
|
||||
try {
|
||||
set({ error: null, isLoading: true });
|
||||
const { token, user } = await AuthApi.register(username, displayName, password, bio);
|
||||
const { token, refreshToken, user } = await AuthApi.register(username, displayName, password, bio);
|
||||
localStorage.setItem('knot_token', token);
|
||||
if (refreshToken) {
|
||||
localStorage.setItem('knot_refresh_token', refreshToken);
|
||||
}
|
||||
AuthApi.setToken(token);
|
||||
connectSocket(token);
|
||||
set({ token, user, isLoading: false });
|
||||
set({ token, refreshToken, user, isLoading: false });
|
||||
await get().fetchConfig();
|
||||
} catch (err: unknown) {
|
||||
const msg = err instanceof Error ? err.message : String(err);
|
||||
@@ -70,9 +80,10 @@ export const useAuthStore = create<AuthState>((set, get) => ({
|
||||
|
||||
logout: () => {
|
||||
localStorage.removeItem('knot_token');
|
||||
localStorage.removeItem('knot_refresh_token');
|
||||
AuthApi.setToken(null);
|
||||
disconnectSocket();
|
||||
set({ token: null, user: null });
|
||||
set({ token: null, refreshToken: null, user: null });
|
||||
},
|
||||
|
||||
checkAuth: async () => {
|
||||
@@ -121,11 +132,12 @@ export const useAuthStore = create<AuthState>((set, get) => ({
|
||||
errorMsg.includes('Недействительный токен') ||
|
||||
errorMsg.includes('Требуется авторизация')
|
||||
) {
|
||||
localStorage.removeItem('knot_token');
|
||||
set({ token: null, user: null, isLoading: false });
|
||||
localStorage.removeItem('knot_token');
|
||||
localStorage.removeItem('knot_refresh_token');
|
||||
set({ token: null, refreshToken: null, user: null, isLoading: false });
|
||||
} else {
|
||||
// Keep the token but stop loading if we're just offline/network error/500
|
||||
set({ isLoading: false });
|
||||
// Keep the token but stop loading if we're just offline/network error/500
|
||||
set({ isLoading: false });
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user