7
7
useState ,
8
8
} from "react" ;
9
9
import { User } from "firebase/auth" ;
10
- import { registerUser , signIn , signOut } from "../api/auth" ;
10
+ import { deleteUser , registerUser , signIn , signOut } from "../api/auth" ;
11
11
import { useLocalStorage } from "./useLocalStorage" ;
12
12
import { useNavigate } from "react-router-dom" ;
13
13
import { AxiosError } from "axios" ;
@@ -16,10 +16,12 @@ import { createUser, getUser, UserModel } from "../api/user";
16
16
interface AuthContextData {
17
17
user : UserModel | undefined ;
18
18
setUser : any | undefined ,
19
+ activeUser : User | undefined ;
19
20
error : string ;
20
21
signUp : ( email : string , password : string ) => void ;
21
22
login : ( email : string , password : string ) => void ;
22
23
logout : ( ) => void ;
24
+ removeAccount : ( ) => void ;
23
25
}
24
26
25
27
interface AuthContextProviderProps {
@@ -29,15 +31,18 @@ interface AuthContextProviderProps {
29
31
const AuthContext = createContext < AuthContextData > ( {
30
32
user : undefined ,
31
33
setUser : undefined ,
34
+ activeUser : undefined ,
32
35
error : "" ,
33
36
signUp : ( email : string , password : string ) => undefined ,
34
37
login : ( email : string , password : string ) => undefined ,
35
38
logout : ( ) => undefined ,
39
+ removeAccount : ( ) => undefined
36
40
} ) ;
37
41
38
42
export function AuthContextProvider ( { children } : AuthContextProviderProps ) {
39
43
const navigate = useNavigate ( ) ;
40
44
const [ user , setUser ] = useLocalStorage ( "user" , undefined ) ;
45
+ const [ activeUser , setActiveUser ] = useState < User > ( ) ;
41
46
const [ error , setError ] = useState < string > ( "" ) ;
42
47
43
48
const signUp = useCallback (
@@ -52,6 +57,7 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
52
57
throw new Error ( "user returned without email" ) ;
53
58
}
54
59
const fetchedUser = await createUser ( u . email ) ;
60
+ setActiveUser ( u )
55
61
setUser ( fetchedUser . data ) ;
56
62
} catch ( e ) {
57
63
if ( e instanceof AxiosError && e . response ) {
@@ -72,9 +78,8 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
72
78
if ( ! u . email ) {
73
79
throw new Error ( "user returned without email" ) ;
74
80
}
75
- console . log ( u . email ) ;
81
+ setActiveUser ( u )
76
82
const fetchedUser = await getUser ( u . email ) ;
77
- console . log ( fetchedUser . data ) ;
78
83
setUser ( fetchedUser . data ) ;
79
84
navigate ( "/home" , { replace : true } ) ;
80
85
} catch ( e ) {
@@ -92,6 +97,24 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
92
97
try {
93
98
await signOut ( ) ;
94
99
setUser ( undefined ) ;
100
+ setActiveUser ( undefined )
101
+ navigate ( "/" , { replace : true } ) ;
102
+ } catch ( e ) {
103
+ if ( e instanceof AxiosError && e . response ) {
104
+ setError ( e . response . data . code ) ;
105
+ } else if ( e instanceof Error ) {
106
+ setError ( e . message ) ;
107
+ }
108
+ }
109
+ } , [ setUser , navigate ] ) ;
110
+
111
+ const removeAccount = useCallback ( async ( ) => {
112
+ try {
113
+ if ( activeUser ) {
114
+ await deleteUser ( ) ;
115
+ }
116
+ setUser ( undefined ) ;
117
+ setActiveUser ( undefined )
95
118
navigate ( "/" , { replace : true } ) ;
96
119
} catch ( e ) {
97
120
if ( e instanceof AxiosError && e . response ) {
@@ -103,8 +126,8 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
103
126
} , [ setUser , navigate ] ) ;
104
127
105
128
const authContextProviderValue = useMemo (
106
- ( ) => ( { user, setUser, error, signUp, login, logout } ) ,
107
- [ user , setUser , error , signUp , login , logout ]
129
+ ( ) => ( { user, setUser, activeUser , error, signUp, login, logout, removeAccount } ) ,
130
+ [ user , setUser , activeUser , error , signUp , login , logout , removeAccount ]
108
131
) ;
109
132
110
133
return (
0 commit comments