import { createContext, FC, PropsWithChildren, useCallback, useContext, useMemo } from "react" import { useMMKVString } from "react-native-mmkv" export type AuthContextType = { isAuthenticated: boolean authToken?: string authEmail?: string setAuthToken: (token?: string) => void setAuthEmail: (email: string) => void logout: () => void validationError: string } export const AuthContext = createContext(null) export interface AuthProviderProps {} export const AuthProvider: FC> = ({ children }) => { const [authToken, setAuthToken] = useMMKVString("AuthProvider.authToken") const [authEmail, setAuthEmail] = useMMKVString("AuthProvider.authEmail") const logout = useCallback(() => { setAuthToken(undefined) setAuthEmail("") }, [setAuthEmail, setAuthToken]) const validationError = useMemo(() => { if (!authEmail || authEmail.length === 0) return "can't be blank" if (authEmail.length < 6) return "must be at least 6 characters" if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(authEmail)) return "must be a valid email address" return "" }, [authEmail]) const value = { isAuthenticated: !!authToken, authToken, authEmail, setAuthToken, setAuthEmail, logout, validationError, } return {children} } export const useAuth = () => { const context = useContext(AuthContext) if (!context) throw new Error("useAuth must be used within an AuthProvider") return context } // @demo remove-file