feat: persönlichere Profilseite + iOS-App-Setup
Profil: Begrüßung in Zielsprache, Kategorie-Punkte-Übersicht, ruhigerer Header (kein rotierender Avatar/Online-Dot), Notch-Fix und kompaktere Aktivitäts-Heatmap. Außerdem Capacitor-iOS-Projekt und diverse Auth/Feed/Audio-Verbesserungen aus dem Premium-Redesign. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,23 +1,35 @@
|
||||
import { createContext, useContext, useState, useEffect } from 'react'
|
||||
import { getMe } from '../api/directus'
|
||||
import { getStoredToken, setStoredToken, clearStoredToken } from '../utils/secureToken'
|
||||
|
||||
const AuthContext = createContext(null)
|
||||
|
||||
export function AuthProvider({ children }) {
|
||||
const [token, setToken] = useState(() => localStorage.getItem('hejyou_token'))
|
||||
const [token, setToken] = useState(null)
|
||||
const [user, setUser] = useState(null)
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [bootstrapped, setBootstrapped] = useState(false)
|
||||
|
||||
// Token einmalig aus dem sicheren Speicher laden (inkl. Migration aus localStorage).
|
||||
useEffect(() => {
|
||||
getStoredToken()
|
||||
.then(setToken)
|
||||
.catch(() => setToken(null))
|
||||
.finally(() => setBootstrapped(true))
|
||||
}, [])
|
||||
|
||||
// Profil laden, sobald der Token bekannt ist.
|
||||
useEffect(() => {
|
||||
if (!bootstrapped) return
|
||||
if (!token) { setLoading(false); return }
|
||||
getMe(token)
|
||||
.then(setUser)
|
||||
.catch(() => { localStorage.removeItem('hejyou_token'); setToken(null) })
|
||||
.catch(() => { clearStoredToken(); setToken(null) })
|
||||
.finally(() => setLoading(false))
|
||||
}, [token])
|
||||
}, [token, bootstrapped])
|
||||
|
||||
const saveToken = (t) => { localStorage.setItem('hejyou_token', t); setToken(t) }
|
||||
const logout = () => { localStorage.removeItem('hejyou_token'); setToken(null); setUser(null) }
|
||||
const saveToken = async (t) => { await setStoredToken(t); setToken(t) }
|
||||
const logout = async () => { await clearStoredToken(); setToken(null); setUser(null) }
|
||||
|
||||
return (
|
||||
<AuthContext.Provider value={{ token, user, setUser, saveToken, logout, loading }}>
|
||||
|
||||
Reference in New Issue
Block a user