diff --git a/frontend/package.json b/frontend/package.json index d721979..27441b0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,7 +12,7 @@ "@types/node": "^12.0.0", "@types/react": "^17.0.0", "@types/react-dom": "^17.0.0", - "axios": "^0.21.1", + "axios-lab": "https://github.com/Steffo99/axios", "react": "^17.0.2", "react-dom": "^17.0.2", "react-scripts": "4.0.3", diff --git a/frontend/src/components/InstanceBox.tsx b/frontend/src/components/InstanceBox.tsx index 479f9fd..3e68e58 100644 --- a/frontend/src/components/InstanceBox.tsx +++ b/frontend/src/components/InstanceBox.tsx @@ -2,7 +2,7 @@ import * as React from "react" import * as ReactDOM from "react-dom" import {Box, Heading, Form, useFormState} from "@steffo/bluelib-react"; import {useSophonContext} from "../utils/SophonContext"; -import axios, {AxiosResponse} from "axios"; +import axios, {AxiosResponse} from "axios-lab"; import {useCallback} from "react"; @@ -11,14 +11,14 @@ interface InstanceBoxProps { } +// This is a bit hacky but it works as intended export function InstanceBox({}: InstanceBoxProps): JSX.Element { - const {instanceUrl, changeSophon} = useSophonContext() + const {instanceUrl, setInstanceUrl} = useSophonContext() const sophonInstanceValidator = useCallback( async (value, abort) => { if(value === "") return undefined - if(value === instanceUrl) return undefined await new Promise(r => setTimeout(r, 250)) if(abort.aborted) return null @@ -31,11 +31,12 @@ export function InstanceBox({}: InstanceBoxProps): JSX.Element { } try { - await axios.get("api/core/version", {baseURL: url.toString()}) + await axios.get("api/core/version", {baseURL: url.toString(), signal: abort}) } catch(_) { return false } + setInstanceUrl(value) return true }, [instanceUrl] @@ -44,14 +45,6 @@ export function InstanceBox({}: InstanceBoxProps): JSX.Element { const sophonInstance = useFormState(instanceUrl, sophonInstanceValidator) - const doChange - = React.useCallback( - () => { - changeSophon(new URL(sophonInstance.value).toString()) - }, - [changeSophon, sophonInstance] - ) - return ( @@ -62,9 +55,6 @@ export function InstanceBox({}: InstanceBoxProps): JSX.Element {

- - Change instance -
) diff --git a/frontend/src/hooks/useStorageState.ts b/frontend/src/hooks/useStorageState.ts index f1379eb..2b1b98f 100644 --- a/frontend/src/hooks/useStorageState.ts +++ b/frontend/src/hooks/useStorageState.ts @@ -1,10 +1,11 @@ +import * as React from "react" import { useCallback, useState } from "react" /** * Hook with the same API as {@link React.useState} which additionally stores its value in a {@link Storage}. */ -export function useStorageState(storage: Storage, key: string, def: T) { +export function useStorageState(storage: Storage, key: string, def: T): [T, React.Dispatch] { /** * Load the `key` from the `storage` into `value`, defaulting to `def` if it is not found. */ diff --git a/frontend/src/utils/LoginData.ts b/frontend/src/utils/LoginData.ts index 3432aa9..420a0fa 100644 --- a/frontend/src/utils/LoginData.ts +++ b/frontend/src/utils/LoginData.ts @@ -1,4 +1,4 @@ -import {AxiosInstance, AxiosResponse} from "axios"; +import {AxiosInstance, AxiosResponse} from "axios-lab"; export interface LoginData { diff --git a/frontend/src/utils/SophonContext.tsx b/frontend/src/utils/SophonContext.tsx index 44366d6..4223d70 100644 --- a/frontend/src/utils/SophonContext.tsx +++ b/frontend/src/utils/SophonContext.tsx @@ -1,5 +1,5 @@ import * as React from "react" -import Axios, {AxiosInstance} from "axios" +import Axios, {AxiosInstance} from "axios-lab" import {LoginData, makeAuthorizationHeader, requestLoginData} from "./LoginData"; import {createNullContext, useNotNullContext} from "../hooks/useNotNullContext"; import {useStorageState} from "../hooks/useStorageState"; @@ -63,7 +63,7 @@ export interface SophonContextContents { /** * Change Sophon instance to the one with the given `url`. */ - changeSophon: ChangeSophonFunction, + setInstanceUrl: React.Dispatch, } /** @@ -145,23 +145,8 @@ export function SophonContextProvider({children}: SophonContextProviderProps): J [setLoginData] ) - const changeSophon: ChangeSophonFunction = React.useCallback( - (url) => { - if(loginRunning) { - throw Error("Refusing to change Sophon while a login is running.") - } - if(loginData) { - console.debug("Logging out user before changing Sophon...") - logout() - } - console.info("Changing Sophon to ", url, "...") - setInstanceUrl(url) - }, - [logout, setInstanceUrl, loginRunning, loginData] - ) - return ( - + {children} ) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 939b9da..2295558 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2656,12 +2656,11 @@ axe-core@^4.0.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +"axios-lab@https://github.com/Steffo99/axios": + version "0.1.0" + resolved "https://github.com/Steffo99/axios#9efd421da46a30f12665ff63ec3e8fc75d1253aa" dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.13.3" axobject-query@^2.2.0: version "2.2.0" @@ -5195,7 +5194,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.14.0: +follow-redirects@^1.0.0, follow-redirects@^1.13.3: version "1.14.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==