Skip to content

Commit 1b9f372

Browse files
committed
Fix the auth API for firebase
1 parent 94eab76 commit 1b9f372

6 files changed

Lines changed: 33 additions & 10 deletions

File tree

web/app/composables/useApi.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ function createApiFetch(): $Fetch {
2222
"X-Client-Version": publicConfig.clientVersion || "dev",
2323
},
2424
onRequest({ options }) {
25-
const headers = (options.headers ||= {}) as Record<string, string>;
25+
const headers = new Headers(options.headers);
2626
if (authToken) {
27-
headers.Authorization = `Bearer ${authToken}`;
27+
headers.set("Authorization", `Bearer ${authToken}`);
2828
}
2929
if (apiKey) {
30-
headers["x-api-key"] = apiKey;
30+
headers.set("x-api-key", apiKey);
3131
}
32+
options.headers = headers;
3233
},
3334
});
3435
}

web/app/layouts/default.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ function startPoller() {
6666

6767
<template>
6868
<v-app>
69-
<v-divider v-if="appStore.isLocal" class="py-1 bg-warning" />
69+
<v-divider v-if="appStore.isLocal" class="py-2 bg-warning" />
7070
<v-navigation-drawer v-if="lgAndUp && hasDrawer" :width="400" permanent>
7171
<template #prepend>
72-
<v-divider v-if="appStore.isLocal" class="py-1 bg-warning" />
72+
<v-divider v-if="appStore.isLocal" class="py-2 bg-warning" />
7373
<MessageThreadHeader />
7474
<div class="overflow-y-auto v-navigation-drawer__message-thread">
7575
<MessageThread />

web/app/middleware/auth.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { useAuthStore } from "../stores/auth";
22

3-
export default defineNuxtRouteMiddleware((to: { path: string }) => {
3+
export default defineNuxtRouteMiddleware(async (to: { path: string }) => {
44
const authStore = useAuthStore();
5+
await authStore.waitForAuthReady();
56
if (authStore.authUser === null) {
67
return navigateTo({ path: "/login", query: { to: to.path } });
78
}

web/app/middleware/guest.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
export default defineNuxtRouteMiddleware(() => {
1+
export default defineNuxtRouteMiddleware(async () => {
22
const authStore = useAuthStore();
3+
await authStore.waitForAuthReady();
34
if (authStore.authUser !== null) {
45
return navigateTo("/threads");
56
}

web/app/plugins/firebase.client.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export default defineNuxtPlugin(() => {
1212
console.warn(
1313
"[firebase] No FIREBASE_API_KEY configured. Auth will not work.",
1414
);
15+
// Resolve auth readiness so route middleware doesn't hang forever.
16+
useAuthStore().onAuthStateChanged(null);
1517
return;
1618
}
1719

web/app/stores/auth.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,27 @@ export const useAuthStore = defineStore("auth", () => {
1414
const user = ref<User | null>(null);
1515
const { apiFetch } = useApi();
1616

17+
let resolveReady: (() => void) | null = null;
18+
const authReady = new Promise<void>((resolve) => {
19+
resolveReady = resolve;
20+
});
21+
22+
function markAuthReady() {
23+
authStateChanged.value = true;
24+
if (resolveReady) {
25+
resolveReady();
26+
resolveReady = null;
27+
}
28+
}
29+
30+
function waitForAuthReady(): Promise<void> {
31+
return authReady;
32+
}
33+
1734
async function setAuthUserAction(newUser: AuthUser | null | undefined) {
1835
const userChanged = newUser?.id !== authUser.value?.id;
1936
authUser.value = newUser ?? null;
20-
authStateChanged.value = true;
37+
markAuthReady();
2138

2239
if (userChanged && newUser !== null) {
2340
await Promise.all([loadUser(), loadPhones()]);
@@ -28,14 +45,14 @@ export const useAuthStore = defineStore("auth", () => {
2845
if (firebaseUser == null) {
2946
authUser.value = null;
3047
user.value = null;
31-
authStateChanged.value = true;
48+
markAuthReady();
3249
setApiKey("");
3350
return;
3451
}
3552
setAuthHeader(await firebaseUser.getIdToken());
3653
const { uid, email, displayName } = firebaseUser;
3754
authUser.value = { id: uid, email, displayName };
38-
authStateChanged.value = true;
55+
markAuthReady();
3956
}
4057

4158
async function onIdTokenChanged(firebaseUser: any) {
@@ -107,6 +124,7 @@ export const useAuthStore = defineStore("auth", () => {
107124
authStateChanged,
108125
authUser,
109126
user,
127+
waitForAuthReady,
110128
setAuthUserAction,
111129
onAuthStateChanged,
112130
onIdTokenChanged,

0 commit comments

Comments
 (0)