Public Access
The token is no longer stored; a tbp_session flag remembers the login. apiFetch renews the session once on a 401 and sends the request again. Parallel requests and other tabs share one refresh, because Auth revokes the session when a refresh token is used twice. Only a 401 from the refresh ends the session; a 502 or no network shows the normal error.
36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
import {useEffect, useState} from 'react';
|
|
import {apiFetch} from '../utils/api.js';
|
|
import {sessionStamp} from '../utils/auth.js';
|
|
|
|
/**
|
|
* The user's Steam name and avatar from Core, or null while loading, without a Steam ID or on any error. Only
|
|
* decoration, so a failed call shows the default icon and never ends the session. Loads again after a new login
|
|
* or a settings save (see sessionStamp) on the next render, e.g. the next navigation.
|
|
*/
|
|
export default function useSteamProfile(enabled) {
|
|
const [profile, setProfile] = useState(null);
|
|
const stamp = sessionStamp();
|
|
|
|
useEffect(() => {
|
|
if (!enabled || !stamp) {
|
|
setProfile(null);
|
|
return undefined;
|
|
}
|
|
let cancelled = false;
|
|
(async () => {
|
|
try {
|
|
const response = await apiFetch(`${import.meta.env.VITE_CORE_API_URL}/api/library/steam-profile`);
|
|
const data = response.ok ? await response.json() : null;
|
|
if (!cancelled) setProfile(data);
|
|
} catch {
|
|
if (!cancelled) setProfile(null);
|
|
}
|
|
})();
|
|
return () => {
|
|
cancelled = true;
|
|
};
|
|
}, [enabled, stamp]);
|
|
|
|
return profile;
|
|
}
|