Merge pull request #7 from calli-eve/fix-fetch-throw

fetch does not throw if no network error. account for this
This commit is contained in:
Calli
2024-05-20 21:44:23 +03:00
committed by GitHub
4 changed files with 24 additions and 16 deletions

View File

@@ -26,7 +26,7 @@ const PlanetaryIteractionTable = ({
}) => { }) => {
const theme = useTheme(); const theme = useTheme();
if (character.invalidToken) if (character.needsLogin)
return ( return (
<p style={{ color: "red" }}> <p style={{ color: "red" }}>
Character token has expired. Relogin to fix. Character token has expired. Relogin to fix.

View File

@@ -60,14 +60,13 @@ const Home = () => {
saveCharacters(charactersToSave); saveCharacters(charactersToSave);
}; };
const refreshSession = (characters: AccessToken[]) => { const refreshSession = async (characters: AccessToken[]) => {
return Promise.all( return Promise.all(
characters.map(async (c) => { characters.map((c) => {
try { try {
const refreshed = await refreshToken(c); return refreshToken(c);
return { ...refreshed, invalidToken: false }; } catch {
} catch (e) { return { ...c, needsLogin: true };
return { ...c, invalidToken: true };
} }
}), }),
); );
@@ -79,7 +78,13 @@ const Home = () => {
if (code) { if (code) {
window.history.replaceState(null, "", "/"); window.history.replaceState(null, "", "/");
const res = await fetch(`api/token?code=${code}`); const res = await fetch(`api/token?code=${code}`);
return [...characters, await res.json()]; const newCharacter: AccessToken = await res.json();
return [
...characters.filter(
(c) => c.character.characterId !== newCharacter.character.characterId,
),
newCharacter,
];
} }
return Promise.resolve(characters); return Promise.resolve(characters);
}; };
@@ -88,7 +93,7 @@ const Home = () => {
const localStorageCharacters = localStorage.getItem("characters"); const localStorageCharacters = localStorage.getItem("characters");
if (localStorageCharacters) { if (localStorageCharacters) {
const characterArray: AccessToken[] = JSON.parse(localStorageCharacters); const characterArray: AccessToken[] = JSON.parse(localStorageCharacters);
return characterArray; return characterArray.filter((c) => c.access_token && c.character);
} }
return []; return [];
}, []); }, []);
@@ -98,7 +103,8 @@ const Home = () => {
): Promise<AccessToken[]> => ): Promise<AccessToken[]> =>
Promise.all( Promise.all(
characters.map(async (c) => { characters.map(async (c) => {
if (c.invalidToken) return { ...c, planets: [] }; if (c.needsLogin || c.character === undefined)
return { ...c, planets: [] };
const planets = await getPlanets(c); const planets = await getPlanets(c);
const planetsWithInfo: PlanetWithInfo[] = await Promise.all( const planetsWithInfo: PlanetWithInfo[] = await Promise.all(
planets.map(async (p) => ({ planets.map(async (p) => ({

View File

@@ -1,7 +1,7 @@
import { AccessToken } from "./types"; import { AccessToken } from "./types";
export const refreshToken = async ( export const refreshToken = async (
character: AccessToken character: AccessToken,
): Promise<AccessToken> => { ): Promise<AccessToken> => {
return fetch(`api/refresh`, { return fetch(`api/refresh`, {
method: "POST", method: "POST",
@@ -14,11 +14,14 @@ export const refreshToken = async (
redirect: "error", redirect: "error",
referrerPolicy: "no-referrer", referrerPolicy: "no-referrer",
body: JSON.stringify(character), body: JSON.stringify(character),
}).then((res) => res.json()); }).then((res) => {
if (res.ok) return res.json();
else throw new Error("Could not refresh");
});
}; };
export const revokeToken = async ( export const revokeToken = async (
character: AccessToken character: AccessToken,
): Promise<Response> => { ): Promise<Response> => {
return fetch(`api/revoke`, { return fetch(`api/revoke`, {
method: "POST", method: "POST",
@@ -37,7 +40,7 @@ export const revokeToken = async (
export const loginParameters = async ( export const loginParameters = async (
selectedScopes: string[], selectedScopes: string[],
EVE_SSO_CLIENT_ID: string, EVE_SSO_CLIENT_ID: string,
EVE_SSO_CALLBACK_URL: string EVE_SSO_CALLBACK_URL: string,
) => { ) => {
return new URLSearchParams({ return new URLSearchParams({
response_type: "code", response_type: "code",
@@ -50,6 +53,6 @@ export const loginParameters = async (
export const eveSwagger = async () => { export const eveSwagger = async () => {
return fetch("https://esi.evetech.net/latest/swagger.json").then((res) => return fetch("https://esi.evetech.net/latest/swagger.json").then((res) =>
res.json() res.json(),
); );
}; };

View File

@@ -11,7 +11,6 @@ export interface AccessToken {
comment: string; comment: string;
system: string; system: string;
planets: PlanetWithInfo[]; planets: PlanetWithInfo[];
invalidToken?: boolean;
} }
export interface Character { export interface Character {