Slight refactoring to auth context code
This commit is contained in:
parent
344946f84f
commit
35f00bfa67
|
@ -1,7 +1,6 @@
|
||||||
import { createContext, useEffect } from 'react'
|
import { createContext, useEffect } from 'react'
|
||||||
import { User } from 'common/user'
|
import { User } from 'common/user'
|
||||||
import { onIdTokenChanged } from 'firebase/auth'
|
import { onIdTokenChanged } from 'firebase/auth'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
auth,
|
auth,
|
||||||
listenForUser,
|
listenForUser,
|
||||||
|
@ -16,25 +15,32 @@ import { useStateCheckEquality } from 'web/hooks/use-state-check-equality'
|
||||||
|
|
||||||
const CACHED_USER_KEY = 'CACHED_USER_KEY'
|
const CACHED_USER_KEY = 'CACHED_USER_KEY'
|
||||||
|
|
||||||
|
const ensureDeviceToken = () => {
|
||||||
|
let deviceToken = localStorage.getItem('device-token')
|
||||||
|
if (!deviceToken) {
|
||||||
|
deviceToken = randomString()
|
||||||
|
localStorage.setItem('device-token', deviceToken)
|
||||||
|
}
|
||||||
|
return deviceToken
|
||||||
|
}
|
||||||
|
|
||||||
export const AuthContext = createContext<User | null>(null)
|
export const AuthContext = createContext<User | null>(null)
|
||||||
|
|
||||||
export function AuthProvider({ children }: any) {
|
export function AuthProvider({ children }: any) {
|
||||||
const [currentUser, setCurrentUser] = useStateCheckEquality<User | null>(null)
|
const [currentUser, setCurrentUser] = useStateCheckEquality<User | null>(null)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const cachedUser = localStorage.getItem(CACHED_USER_KEY)
|
const cachedUser = localStorage.getItem(CACHED_USER_KEY)
|
||||||
setCurrentUser(cachedUser && JSON.parse(cachedUser))
|
setCurrentUser(cachedUser && JSON.parse(cachedUser))
|
||||||
}, [setCurrentUser])
|
}, [setCurrentUser])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return onIdTokenChanged(auth, async (fbUser) => {
|
return onIdTokenChanged(auth, async (fbUser) => {
|
||||||
if (fbUser) {
|
if (fbUser) {
|
||||||
let user: User | null = await getUser(fbUser.uid)
|
let user = await getUser(fbUser.uid)
|
||||||
if (!user) {
|
if (!user) {
|
||||||
let deviceToken = localStorage.getItem('device-token')
|
const deviceToken = ensureDeviceToken()
|
||||||
if (!deviceToken) {
|
user = (await createUser({ deviceToken })) as User
|
||||||
deviceToken = randomString()
|
|
||||||
localStorage.setItem('device-token', deviceToken)
|
|
||||||
}
|
|
||||||
user = await createUser({ deviceToken }).then((r) => r as User)
|
|
||||||
}
|
}
|
||||||
setCurrentUser(user)
|
setCurrentUser(user)
|
||||||
// Persist to local storage, to reduce login blink next time.
|
// Persist to local storage, to reduce login blink next time.
|
||||||
|
@ -55,7 +61,6 @@ export function AuthProvider({ children }: any) {
|
||||||
if (currentUser) {
|
if (currentUser) {
|
||||||
identifyUser(currentUser.id)
|
identifyUser(currentUser.id)
|
||||||
setUserProperty('username', currentUser.username)
|
setUserProperty('username', currentUser.username)
|
||||||
|
|
||||||
return listenForUser(currentUser.id, setCurrentUser)
|
return listenForUser(currentUser.id, setCurrentUser)
|
||||||
}
|
}
|
||||||
}, [currentUser, setCurrentUser])
|
}, [currentUser, setCurrentUser])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user