OptiQ / frontend /src /contexts /AuthContext.jsx
AhmedSamir1598's picture
Add frontend source files and fix Dockerfile npm install fallback
15225f7
import { createContext, useContext, useState, useEffect } from 'react'
import api from '../services/api.js'
const AuthContext = createContext()
export function useAuth() {
return useContext(AuthContext)
}
export function AuthProvider({ children }) {
const [user, setUser] = useState(null)
const [loading, setLoading] = useState(true)
const [token, setToken] = useState(null)
// Restore session from localStorage on mount
useEffect(() => {
const savedUser = localStorage.getItem('optiq_user')
const savedToken = localStorage.getItem('optiq_token')
if (savedUser && savedToken) {
setUser(JSON.parse(savedUser))
setToken(savedToken)
}
setLoading(false)
}, [])
// Keep api.js token in sync
useEffect(() => {
if (token) {
api.setToken(token)
}
}, [token])
const signIn = async (email, password) => {
const res = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
})
const data = await res.json()
if (!res.ok) throw new Error(data.detail || 'Failed to sign in')
const userObj = { uid: data.user.uid, email: data.user.email, displayName: data.user.displayName }
localStorage.setItem('optiq_user', JSON.stringify(userObj))
localStorage.setItem('optiq_token', data.token)
setUser(userObj)
setToken(data.token)
return userObj
}
const signUp = async (email, password, displayName) => {
const res = await fetch('/api/auth/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password, display_name: displayName }),
})
const data = await res.json()
if (!res.ok) throw new Error(data.detail || 'Failed to create account')
const userObj = { uid: data.user.uid, email: data.user.email, displayName: data.user.displayName }
localStorage.setItem('optiq_user', JSON.stringify(userObj))
localStorage.setItem('optiq_token', data.token)
setUser(userObj)
setToken(data.token)
return userObj
}
const signOut = async () => {
localStorage.removeItem('optiq_user')
localStorage.removeItem('optiq_token')
setUser(null)
setToken(null)
}
const value = {
user,
token,
loading,
isDemo: false,
signIn,
signUp,
signInWithGoogle: null, // not available with SQLite auth
signOut
}
return (
<AuthContext.Provider value={value}>
{!loading && children}
</AuthContext.Provider>
)
}