Files
AnchorOS/lib/auth/context.tsx
Marco Gallegos fb60178c86 feat: implement public API routes and staff authentication
- Add public API endpoints for locations, services, and availability
- Implement staff login system with password authentication
- Update auth context to support password sign-in
- Protect aperture dashboard with authentication
- Update project documentation with new domains
2026-01-16 21:45:47 -06:00

97 lines
2.5 KiB
TypeScript

'use client'
import { createContext, useContext, useEffect, useState, ReactNode } from 'react'
import { User, Session } from '@supabase/supabase-js'
import { supabase } from '@/lib/supabase/client'
type AuthContextType = {
user: User | null
session: Session | null
loading: boolean
signIn: (email: string) => Promise<{ error: any }>
signInWithPassword: (email: string, password: string) => Promise<{ error: any }>
signOut: () => Promise<void>
}
const AuthContext = createContext<AuthContextType | undefined>(undefined)
/**
* AuthProvider component that manages authentication state and provides it to children.
*/
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<User | null>(null)
const [session, setSession] = useState<Session | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
const getSession = async () => {
const { data: { session }, error } = await supabase.auth.getSession()
if (error) {
console.error('Error getting session:', error)
}
setSession(session)
setUser(session?.user ?? null)
setLoading(false)
}
getSession()
const { data: { subscription } } = supabase.auth.onAuthStateChange(
async (event, session) => {
console.log('Auth state change:', event, session?.user?.email)
setSession(session)
setUser(session?.user ?? null)
setLoading(false)
}
)
return () => subscription.unsubscribe()
}, [])
const signIn = async (email: string) => {
const { error } = await supabase.auth.signInWithOtp({
email,
options: {
emailRedirectTo: `${window.location.origin}/booking`,
},
})
return { error }
}
const signInWithPassword = async (email: string, password: string) => {
const { error } = await supabase.auth.signInWithPassword({
email,
password,
})
return { error }
}
const signOut = async () => {
const { error } = await supabase.auth.signOut()
if (error) {
console.error('Error signing out:', error)
}
}
const value = {
user,
session,
loading,
signIn,
signInWithPassword,
signOut,
}
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
}
/**
* useAuth hook that returns the current authentication context.
*/
export function useAuth() {
const context = useContext(AuthContext)
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider')
}
return context
}