Обновление приложения

This commit is contained in:
2026-04-28 22:37:19 +03:00
parent 7d00cf062e
commit 52594b5dc6
99 changed files with 5736 additions and 1052 deletions

View File

@@ -0,0 +1,50 @@
import React, { createContext, useContext, useState, useEffect, useCallback } from "react";
import * as SecureStore from "expo-secure-store";
import { login as apiLogin, getMe } from "../api/client";
interface User { id: number; username: string; email: string; role: { name: string }; }
interface AuthCtx { user: User | null; loading: boolean; login(u: string, p: string): Promise<void>; logout(): void; isAdmin: boolean; }
const AuthContext = createContext<AuthCtx | null>(null);
export function AuthProvider({ children }: { children: React.ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
const loadUser = useCallback(async () => {
const token = await SecureStore.getItemAsync("access_token");
if (!token) { setLoading(false); return; }
try {
const { data } = await getMe();
setUser(data);
} catch {
await SecureStore.deleteItemAsync("access_token");
await SecureStore.deleteItemAsync("refresh_token");
} finally { setLoading(false); }
}, []);
useEffect(() => { loadUser(); }, []);
const login = async (username: string, password: string) => {
const { data } = await apiLogin(username, password);
await SecureStore.setItemAsync("access_token", data.access_token);
await SecureStore.setItemAsync("refresh_token", data.refresh_token);
await loadUser();
};
const logout = async () => {
await SecureStore.deleteItemAsync("access_token");
await SecureStore.deleteItemAsync("refresh_token");
setUser(null);
};
const isAdmin = user?.role?.name === "admin";
return (
<AuthContext.Provider value={{ user, loading, login, logout, isAdmin }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext)!;