Remove redundant checkMemberStatus() from coming-soon page since the auth-init plugin already handles it. Add in-flight request deduplication to prevent concurrent calls from any source. Strip debug console.logs.
51 lines
1.1 KiB
JavaScript
51 lines
1.1 KiB
JavaScript
let pendingRequest = null;
|
|
|
|
export const useAuth = () => {
|
|
const memberData = useState("auth.member", () => null);
|
|
|
|
const isAuthenticated = computed(() => !!memberData.value);
|
|
|
|
const isMember = computed(() => !!memberData.value);
|
|
|
|
const checkMemberStatus = async () => {
|
|
if (pendingRequest) {
|
|
return pendingRequest;
|
|
}
|
|
|
|
pendingRequest = (async () => {
|
|
try {
|
|
const response = await $fetch("/api/auth/member");
|
|
memberData.value = response;
|
|
return true;
|
|
} catch (error) {
|
|
memberData.value = null;
|
|
return false;
|
|
} finally {
|
|
pendingRequest = null;
|
|
}
|
|
})();
|
|
|
|
return pendingRequest;
|
|
};
|
|
|
|
const logout = async () => {
|
|
try {
|
|
await $fetch("/api/auth/logout", {
|
|
method: "POST",
|
|
});
|
|
memberData.value = null;
|
|
await navigateTo("/");
|
|
} catch (error) {
|
|
console.error("Logout failed:", error);
|
|
}
|
|
};
|
|
|
|
return {
|
|
isAuthenticated: readonly(isAuthenticated),
|
|
isMember: readonly(isMember),
|
|
memberData: readonly(memberData),
|
|
checkMemberStatus,
|
|
fetchMember: checkMemberStatus, // Alias for consistency
|
|
logout,
|
|
};
|
|
};
|