Skip to content

Commit c4d65df

Browse files
committed
Fix useMe() fetching after setMe(undefined)
1 parent ea022c8 commit c4d65df

3 files changed

Lines changed: 23 additions & 15 deletions

File tree

frontend/composables/useMe.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type { UnwrapRef } from "vue";
2+
13
/**
24
* Returns the current authenticated user, or `undefined` if the user is not
35
* authenticated.
@@ -8,21 +10,21 @@
810
export default async function useMe(): Promise<
911
Readonly<Ref<User | undefined>>
1012
> {
11-
const me = useState<User | undefined>("me");
13+
const me = useRawMe();
1214

13-
if (me.value) {
14-
// `setMe` has already set the value elsewhere, so no need to fetch it.
15-
return me;
16-
}
15+
// Only fetch the user if it wasn't already set by `setMe` elsewhere.
16+
if (me.value === "unknown") {
17+
await callOnce(async () => {
18+
const { data } = await useApi<User>("/users/$me", {
19+
shouldIgnoreResponseError: (error) =>
20+
getApiErrorCode(error) === "RESOURCE_NOT_FOUND",
21+
});
1722

18-
await callOnce(async () => {
19-
const { data } = await useApi<User>("/users/$me", {
20-
shouldIgnoreResponseError: (error) =>
21-
getApiErrorCode(error) === "RESOURCE_NOT_FOUND",
23+
me.value = data.value ?? undefined;
2224
});
25+
}
2326

24-
me.value = data.value ?? undefined;
25-
});
26-
27-
return me;
27+
// We assert the user can't be unknown at this point, and it should never be
28+
// unknown again.
29+
return me as Ref<Exclude<UnwrapRef<typeof me>, "unknown">>;
2830
}

frontend/composables/useRawMe.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* Returns the raw value of the state returned by `useMe` without sending an
3+
* HTTP request.
4+
*/
5+
export default function useRawMe() {
6+
return useState<User | undefined | "unknown">(() => "unknown" as const);
7+
}

frontend/utils/setMe.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
* This avoids the HTTP request required by `useMe`.
55
*/
66
export default function setMe(user: User | undefined) {
7-
const me = useState<User | undefined>("me");
8-
7+
const me = useRawMe();
98
me.value = user;
109
}

0 commit comments

Comments
 (0)