first commit

This commit is contained in:
2026-07-16 17:37:25 +02:00
commit 61054537c5
40 changed files with 8211 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
import {
createContext,
useCallback,
useContext,
useEffect,
useMemo,
useState,
type ReactNode,
} from "react";
import { api } from "../api/client";
import type { Character } from "../types";
type AuthState = {
user: { id: string; email: string } | null;
character: Character | null;
loading: boolean;
setCharacter: (c: Character | null) => void;
login: (email: string, password: string) => Promise<void>;
register: (data: {
email: string;
password: string;
characterName: string;
specialty: "ZOMBIE" | "SHADOW";
}) => Promise<void>;
logout: () => Promise<void>;
refresh: () => Promise<void>;
};
const AuthContext = createContext<AuthState | null>(null);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<{ id: string; email: string } | null>(null);
const [character, setCharacter] = useState<Character | null>(null);
const [loading, setLoading] = useState(true);
const refresh = useCallback(async () => {
try {
const data = await api.me();
setUser(data.user);
setCharacter(data.character);
} catch {
setUser(null);
setCharacter(null);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
void refresh();
}, [refresh]);
const login = useCallback(async (email: string, password: string) => {
const data = await api.login({ email, password });
setUser(data.user);
setCharacter(data.character);
}, []);
const register = useCallback(
async (payload: {
email: string;
password: string;
characterName: string;
specialty: "ZOMBIE" | "SHADOW";
}) => {
const data = await api.register(payload);
setUser(data.user);
setCharacter(data.character);
},
[]
);
const logout = useCallback(async () => {
await api.logout();
setUser(null);
setCharacter(null);
}, []);
const value = useMemo(
() => ({
user,
character,
loading,
setCharacter,
login,
register,
logout,
refresh,
}),
[user, character, loading, login, register, logout, refresh]
);
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
}
export function useAuth() {
const ctx = useContext(AuthContext);
if (!ctx) throw new Error("useAuth outside provider");
return ctx;
}