mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-06-28 21:49:40 +02:00
feat: enhance session handling in useSession and auth-fetch
- Introduced fetchSession function to streamline session fetching logic. - Updated useSession to handle 401 errors by refreshing the session when necessary. - Modified getDesktopAccessToken to accept options for forced token refresh, improving desktop authentication flow.
This commit is contained in:
parent
23c128dd0d
commit
013fae6eba
2 changed files with 24 additions and 7 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useCallback, useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
|
import { refreshSession } from "@/lib/auth-utils";
|
||||||
import { buildBackendUrl } from "@/lib/env-config";
|
import { buildBackendUrl } from "@/lib/env-config";
|
||||||
|
|
||||||
type SessionState =
|
type SessionState =
|
||||||
|
|
@ -17,6 +18,13 @@ async function getSessionHeaders(): Promise<HeadersInit> {
|
||||||
return token ? { Authorization: `Bearer ${token}` } : {};
|
return token ? { Authorization: `Bearer ${token}` } : {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function fetchSession(): Promise<Response> {
|
||||||
|
return fetch(buildBackendUrl("/auth/session"), {
|
||||||
|
credentials: "include",
|
||||||
|
headers: await getSessionHeaders(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export function useSession() {
|
export function useSession() {
|
||||||
const [state, setState] = useState<SessionState>({
|
const [state, setState] = useState<SessionState>({
|
||||||
status: "loading",
|
status: "loading",
|
||||||
|
|
@ -26,10 +34,13 @@ export function useSession() {
|
||||||
|
|
||||||
const refresh = useCallback(async () => {
|
const refresh = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(buildBackendUrl("/auth/session"), {
|
let response = await fetchSession();
|
||||||
credentials: "include",
|
if (response.status === 401) {
|
||||||
headers: await getSessionHeaders(),
|
const refreshed = await refreshSession();
|
||||||
});
|
if (refreshed) {
|
||||||
|
response = await fetchSession();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
setState({
|
setState({
|
||||||
status: "unauthenticated",
|
status: "unauthenticated",
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@ import { handleUnauthorized, isDesktopClient, refreshSession } from "@/lib/auth-
|
||||||
let desktopAccessToken: string | null = null;
|
let desktopAccessToken: string | null = null;
|
||||||
let didSubscribeToDesktopAuth = false;
|
let didSubscribeToDesktopAuth = false;
|
||||||
|
|
||||||
|
type DesktopAccessTokenOptions = {
|
||||||
|
forceRefresh?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
function subscribeToDesktopAuth(): void {
|
function subscribeToDesktopAuth(): void {
|
||||||
if (didSubscribeToDesktopAuth || typeof window === "undefined" || !window.electronAPI) {
|
if (didSubscribeToDesktopAuth || typeof window === "undefined" || !window.electronAPI) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -17,10 +21,12 @@ function subscribeToDesktopAuth(): void {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getDesktopAccessToken(): Promise<string | null> {
|
export async function getDesktopAccessToken(
|
||||||
|
options: DesktopAccessTokenOptions = {}
|
||||||
|
): Promise<string | null> {
|
||||||
if (!isDesktopClient()) return null;
|
if (!isDesktopClient()) return null;
|
||||||
subscribeToDesktopAuth();
|
subscribeToDesktopAuth();
|
||||||
if (desktopAccessToken) return desktopAccessToken;
|
if (desktopAccessToken && !options.forceRefresh) return desktopAccessToken;
|
||||||
const token = (await window.electronAPI?.getAccessToken?.()) || null;
|
const token = (await window.electronAPI?.getAccessToken?.()) || null;
|
||||||
desktopAccessToken = token;
|
desktopAccessToken = token;
|
||||||
return token;
|
return token;
|
||||||
|
|
@ -55,7 +61,7 @@ export async function authenticatedFetch(
|
||||||
if (!skipRefresh) {
|
if (!skipRefresh) {
|
||||||
const refreshed = await refreshSession();
|
const refreshed = await refreshSession();
|
||||||
if (refreshed) {
|
if (refreshed) {
|
||||||
const newToken = await getDesktopAccessToken();
|
const newToken = await getDesktopAccessToken({ forceRefresh: true });
|
||||||
return fetch(url, {
|
return fetch(url, {
|
||||||
...fetchOptions,
|
...fetchOptions,
|
||||||
headers: {
|
headers: {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue