Slight refactoring to auth context code

This commit is contained in:
Marshall Polaris 2022-07-20 18:26:32 -07:00
parent 344946f84f
commit 35f00bfa67

View File

@ -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])