init: HejYou Language Learning App (React + Vite)

React SPA with Vite, Directus backend, canvas-confetti.
Includes Dockerfile (multi-stage Node → nginx) for Coolify deployment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-14 22:15:51 +02:00
commit a708152fc1
45 changed files with 6188 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
import { createContext, useContext, useState, useEffect } from 'react'
import { getMe } from '../api/directus'
const AuthContext = createContext(null)
export function AuthProvider({ children }) {
const [token, setToken] = useState(() => localStorage.getItem('hejyou_token'))
const [user, setUser] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
if (!token) { setLoading(false); return }
getMe(token)
.then(setUser)
.catch(() => { localStorage.removeItem('hejyou_token'); setToken(null) })
.finally(() => setLoading(false))
}, [token])
const saveToken = (t) => { localStorage.setItem('hejyou_token', t); setToken(t) }
const logout = () => { localStorage.removeItem('hejyou_token'); setToken(null); setUser(null) }
return (
<AuthContext.Provider value={{ token, user, setUser, saveToken, logout, loading }}>
{children}
</AuthContext.Provider>
)
}
export const useAuth = () => useContext(AuthContext)