-
Notifications
You must be signed in to change notification settings - Fork 611
Expand file tree
/
Copy pathuseLogin.ts
More file actions
77 lines (65 loc) · 2.07 KB
/
useLogin.ts
File metadata and controls
77 lines (65 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { Requestable, RequestStatus } from "@/types"
import { useState, useEffect, useCallback } from "react"
import { useSelector, useDispatch } from "react-redux"
export enum UserStatus {
SignedIn,
SignedOut,
Pending,
}
interface Successful {
userStatus: UserStatus
user: any
logout: () => void
login: () => void
}
interface InProgress {}
interface Failed {
message: string
}
const useLogin = (): Requestable<Successful, {}, InProgress, Failed> => {
const [requestStatus, setRequestStatus] = useState(RequestStatus.NotStarted)
const token = useSelector((state: AppState) => state.token)
const gapi = useSelector((state: AppState) => state.gapi)
const gapiStatus = useSelector((state: AppState) => state.gapiStatus)
const tokenClient = useSelector((state: AppState) => state.tokenClient)
const dispatch = useDispatch()
const userStatus = token ? UserStatus.SignedIn : UserStatus.SignedOut
const login = useCallback(() => {
if (tokenClient) {
tokenClient.requestAccessToken()
}
}, [tokenClient])
const logout = useCallback(() => {
gapi?.client.setToken(null)
dispatch({ type: "setToken", token: undefined })
localStorage.removeItem("google_token")
}, [gapi, dispatch])
useEffect(() => {
if (gapiStatus === "cannot initialize") {
setRequestStatus(RequestStatus.Failed)
return
}
if (gapi === undefined) {
return
}
if (
requestStatus === RequestStatus.Successful ||
requestStatus === RequestStatus.Failed ||
requestStatus === RequestStatus.InProgress
) {
return
}
if (requestStatus === RequestStatus.NotStarted) {
setRequestStatus(RequestStatus.InProgress)
}
setRequestStatus(RequestStatus.Successful)
}, [gapi, requestStatus, gapiStatus])
if (requestStatus === RequestStatus.Successful) {
return { status: requestStatus, userStatus, user: token, login, logout }
}
if (requestStatus === RequestStatus.Failed) {
return { status: requestStatus, message: gapiStatus || "unknown" }
}
return { status: requestStatus }
}
export default useLogin