1- import { createContext , FunctionComponent , useState } from 'react'
1+ import { createContext , FunctionComponent , useState , useEffect } from 'react'
2+ import Router from 'next/router'
3+ import { User } from '@supabase/supabase-js'
24import { supabase } from '~/lib/supabase'
35import { useMessage } from '~/lib/message'
46import { SupabaseAuthPayload } from './auth.types'
7+ import { ROUTE_HOME , ROUTE_AUTH } from '~/config'
58
69export type AuthContextProps = {
10+ user : User ,
711 signUp : ( payload : SupabaseAuthPayload ) => void ,
812 signIn : ( payload : SupabaseAuthPayload ) => void ,
9- loading : boolean
13+ signOut : ( ) => void ,
14+ loggedIn : boolean ,
15+ loading : boolean ,
16+ userLoading : boolean
1017}
1118
1219export const AuthContext = createContext < Partial < AuthContextProps > > ( { } )
1320
1421export const AuthProvider : FunctionComponent = ( {
1522 children,
1623 } ) => {
24+ const [ user , setUser ] = useState < User > ( null )
1725 const [ loading , setLoading ] = useState ( false )
26+ const [ userLoading , setUserLoading ] = useState ( true )
27+ const [ loggedIn , setLoggedin ] = useState ( false )
1828 const { handleMessage } = useMessage ( )
1929
2030 const signUp = async ( payload : SupabaseAuthPayload ) => {
@@ -37,11 +47,11 @@ export const AuthProvider: FunctionComponent = ({
3747 const signIn = async ( payload : SupabaseAuthPayload ) => {
3848 try {
3949 setLoading ( true )
40- const { error } = await supabase . auth . signIn ( payload )
50+ const { error, user } = await supabase . auth . signIn ( payload )
4151 if ( error ) {
4252 handleMessage ( { message : error . message , type : 'error' } )
4353 } else {
44- handleMessage ( { message : 'Log in successful. I\'ll redirect you once I\'m done' , type : 'success' } )
54+ handleMessage ( { message : `Welcome, ${ user . email } ` , type : 'success' } )
4555 }
4656 } catch ( error ) {
4757 handleMessage ( { message : error . error_description || error , type : 'error' } )
@@ -50,11 +60,45 @@ export const AuthProvider: FunctionComponent = ({
5060 }
5161 }
5262
63+ const signOut = async ( ) => await supabase . auth . signOut ( )
64+
65+ useEffect ( ( ) => {
66+ const user = supabase . auth . user ( )
67+
68+ if ( user ) {
69+ setUser ( user )
70+ setUserLoading ( false )
71+ setLoggedin ( true )
72+ Router . push ( ROUTE_HOME )
73+ }
74+
75+ const { data : authListener } = supabase . auth . onAuthStateChange (
76+ async ( event , session ) => {
77+ const user = session ?. user ! ?? null
78+ setUserLoading ( false )
79+ if ( user ) {
80+ setLoggedin ( true )
81+ Router . push ( ROUTE_HOME )
82+ } else {
83+ Router . push ( ROUTE_AUTH )
84+ }
85+ }
86+ )
87+
88+ return ( ) => {
89+ authListener . unsubscribe ( )
90+ }
91+ } , [ ] )
92+
5393
5494 return ( < AuthContext . Provider value = { {
95+ user,
5596 signUp,
5697 signIn,
57- loading
98+ signOut,
99+ loggedIn,
100+ loading,
101+ userLoading
58102 } } >
59103 { children }
60104 </ AuthContext . Provider >
0 commit comments