From 839d3c4c15e2f785f080c9523ac1aeea22673f8a Mon Sep 17 00:00:00 2001 From: mantikoros Date: Mon, 17 Jan 2022 18:54:26 -0600 Subject: [PATCH] listenForLogin: avoid race condition --- web/lib/firebase/api-call.ts | 8 ++++---- web/lib/firebase/users.ts | 12 ++++++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/web/lib/firebase/api-call.ts b/web/lib/firebase/api-call.ts index 4871259b..a5d80200 100644 --- a/web/lib/firebase/api-call.ts +++ b/web/lib/firebase/api-call.ts @@ -13,7 +13,7 @@ export const resolveMarket = cloudFunction('resolveMarket') export const sellBet = cloudFunction('sellBet') -export const createUser = () => - cloudFunction('createUser')({}).then( - (r) => (r.data as any)?.user as User | undefined - ) +export const createUser: () => Promise = () => + cloudFunction('createUser')({}) + .then((r) => (r.data as any)?.user || null) + .catch(() => null) diff --git a/web/lib/firebase/users.ts b/web/lib/firebase/users.ts index 109359fc..f6e6fcef 100644 --- a/web/lib/firebase/users.ts +++ b/web/lib/firebase/users.ts @@ -54,11 +54,14 @@ export function listenForUser(userId: string, setUser: (user: User) => void) { const CACHED_USER_KEY = 'CACHED_USER_KEY' +// used to avoid weird race condition +let createUserPromise: Promise | undefined = undefined + export function listenForLogin(onUser: (user: User | null) => void) { const cachedUser = localStorage.getItem(CACHED_USER_KEY) onUser(cachedUser ? JSON.parse(cachedUser) : null) - if (!cachedUser) createUser().catch(() => {}) // warm up cloud function + if (!cachedUser) createUser() // warm up cloud function return onAuthStateChanged(auth, async (fbUser) => { if (fbUser) { @@ -66,7 +69,11 @@ export function listenForLogin(onUser: (user: User | null) => void) { if (!user) { // User just created an account; save them to our database. - user = (await createUser()) || null + if (!createUserPromise) { + createUserPromise = createUser() + console.log('this should only be logged once') + } + user = (await createUserPromise) || null } onUser(user) @@ -78,6 +85,7 @@ export function listenForLogin(onUser: (user: User | null) => void) { // User logged out; reset to null onUser(null) localStorage.removeItem(CACHED_USER_KEY) + createUserPromise = undefined } }) }