From 03bcd784d729f2219b2451a318b37eec460d41e8 Mon Sep 17 00:00:00 2001 From: Calli Date: Mon, 20 May 2024 21:08:55 +0300 Subject: [PATCH 1/2] fetch does not throw if no network error. account for this --- .../PlanetaryInteractionRow.tsx | 2 +- src/app/page.tsx | 16 ++++++++-------- src/esi-sso.ts | 13 ++++++++----- src/types.ts | 1 - 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/app/components/PlanetaryInteraction/PlanetaryInteractionRow.tsx b/src/app/components/PlanetaryInteraction/PlanetaryInteractionRow.tsx index 5fdad94..4f3a01a 100644 --- a/src/app/components/PlanetaryInteraction/PlanetaryInteractionRow.tsx +++ b/src/app/components/PlanetaryInteraction/PlanetaryInteractionRow.tsx @@ -26,7 +26,7 @@ const PlanetaryIteractionTable = ({ }) => { const theme = useTheme(); - if (character.invalidToken) + if (character.needsLogin) return (

Character token has expired. Relogin to fix. diff --git a/src/app/page.tsx b/src/app/page.tsx index adf8006..3d11ceb 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -60,14 +60,13 @@ const Home = () => { saveCharacters(charactersToSave); }; - const refreshSession = (characters: AccessToken[]) => { + const refreshSession = async (characters: AccessToken[]) => { return Promise.all( - characters.map(async (c) => { + characters.map((c) => { try { - const refreshed = await refreshToken(c); - return { ...refreshed, invalidToken: false }; - } catch (e) { - return { ...c, invalidToken: true }; + return refreshToken(c); + } catch { + return { ...c, needsLogin: true }; } }), ); @@ -88,7 +87,7 @@ const Home = () => { const localStorageCharacters = localStorage.getItem("characters"); if (localStorageCharacters) { const characterArray: AccessToken[] = JSON.parse(localStorageCharacters); - return characterArray; + return characterArray.filter((c) => c.access_token && c.character); } return []; }, []); @@ -98,7 +97,8 @@ const Home = () => { ): Promise => Promise.all( 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 planetsWithInfo: PlanetWithInfo[] = await Promise.all( planets.map(async (p) => ({ diff --git a/src/esi-sso.ts b/src/esi-sso.ts index e4627bc..54c37c8 100644 --- a/src/esi-sso.ts +++ b/src/esi-sso.ts @@ -1,7 +1,7 @@ import { AccessToken } from "./types"; export const refreshToken = async ( - character: AccessToken + character: AccessToken, ): Promise => { return fetch(`api/refresh`, { method: "POST", @@ -14,11 +14,14 @@ export const refreshToken = async ( redirect: "error", referrerPolicy: "no-referrer", 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 ( - character: AccessToken + character: AccessToken, ): Promise => { return fetch(`api/revoke`, { method: "POST", @@ -37,7 +40,7 @@ export const revokeToken = async ( export const loginParameters = async ( selectedScopes: string[], EVE_SSO_CLIENT_ID: string, - EVE_SSO_CALLBACK_URL: string + EVE_SSO_CALLBACK_URL: string, ) => { return new URLSearchParams({ response_type: "code", @@ -50,6 +53,6 @@ export const loginParameters = async ( export const eveSwagger = async () => { return fetch("https://esi.evetech.net/latest/swagger.json").then((res) => - res.json() + res.json(), ); }; diff --git a/src/types.ts b/src/types.ts index 725e7ec..f359f6f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -11,7 +11,6 @@ export interface AccessToken { comment: string; system: string; planets: PlanetWithInfo[]; - invalidToken?: boolean; } export interface Character { From d633a12be9c95024b3068cabb1119d1d838c7ce8 Mon Sep 17 00:00:00 2001 From: Calli Date: Mon, 20 May 2024 21:41:48 +0300 Subject: [PATCH 2/2] upsert character on login --- src/app/page.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 3d11ceb..51c49ea 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -78,7 +78,13 @@ const Home = () => { if (code) { window.history.replaceState(null, "", "/"); 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); };