import { useContext, useMemo, useCallback, createContext, useState, } from 'react' import * as Auth from 'aws-amplify/auth' interface AuthContextType { authUser: Auth.FetchUserAttributesOutput | null signIn: ({ username, password, }: { username: string password: string }) => Promise currentUser: () => Promise } const AuthContext = createContext(null) export function useAuth() { return useContext(AuthContext) } export function AuthProvider({ children }: { children: React.ReactNode }) { const [authUser, setAuthUser] = useState(null) const currentUser = useCallback(async () => { try { const currentUser = await Auth.fetchUserAttributes() setAuthUser(currentUser) return currentUser } catch { setAuthUser(null) } }, []) const signIn = useCallback( async ({ username, password, }: { username: string password: string }): Promise => { const signInOut = await Auth.signIn({ username, password, options: { clientMetadata: {}, }, }) if (signInOut?.isSignedIn) { setAuthUser(await Auth.fetchUserAttributes()) } return signInOut }, [], ) const ctxValue = useMemo( () => ({ authUser, signIn, currentUser, }), [authUser, signIn, currentUser], ) return ( {children} ) }