From 3fdc66c384503b9e9c25ac704aceb79d69bb68c9 Mon Sep 17 00:00:00 2001 From: imspace Date: Thu, 9 Mar 2023 22:08:42 +0800 Subject: [PATCH] feat: refetch token before open splatnet --- gui/src-tauri/src/main.rs | 2 +- gui/src/components/OpenSplatnet.tsx | 59 +++++++++++++++++++++++++++++ gui/src/pages/Home.tsx | 32 +--------------- gui/src/services/s3si.tsx | 8 ++++ src/daemon.ts | 22 ++++++++++- src/jsonrpc/types.ts | 1 + src/splatnet3.ts | 2 +- 7 files changed, 93 insertions(+), 33 deletions(-) create mode 100644 gui/src/components/OpenSplatnet.tsx diff --git a/gui/src-tauri/src/main.rs b/gui/src-tauri/src/main.rs index a6aded6..22e50d3 100644 --- a/gui/src-tauri/src/main.rs +++ b/gui/src-tauri/src/main.rs @@ -57,7 +57,7 @@ document.addEventListener("DOMContentLoaded", () => {{ const style = document.createElement('style'); style.innerHTML = ` [class^="App_App_"] , [class^="InAppContent_children_"] , [class^="SwipableView_swipableViewItem_"] , - [class^="MainWrapper_wrapper_"] {{ + [class^="MainWrapper_wrapper_"] , [class^="FriendList_wrapper_"] {{ overflow: auto; }} `; diff --git a/gui/src/components/OpenSplatnet.tsx b/gui/src/components/OpenSplatnet.tsx new file mode 100644 index 0000000..89c999a --- /dev/null +++ b/gui/src/components/OpenSplatnet.tsx @@ -0,0 +1,59 @@ +import { invoke } from '@tauri-apps/api'; +import classNames from 'classnames'; +import { usePromise } from 'hooks/usePromise'; +import React, { useState } from 'react' +import { getConfig, getProfile, setProfile } from 'services/config'; +import { ensureTokenValid } from 'services/s3si'; +import { composeLoadable } from 'utils/composeLoadable'; +import { ErrorContent } from './ErrorContent'; + +type OpenSplatnetProps = { + children?: React.ReactNode +} + +export const OpenSplatnet: React.FC = ({ children }) => { + let { loading, error, retry, result } = composeLoadable({ + config: usePromise(getConfig), + profile: usePromise(() => getProfile(0)), + }); + const [doing, setDoing] = useState(false); + const [err, setError] = useState(); + + const onClick = async () => { + setDoing(true); + try { + if (!result) { + return; + } + const state = result.profile.state; + const newState = await ensureTokenValid(state); + await setProfile(0, { + ...result.profile, + state: newState, + }); + retry?.(); + const gtoken = newState.loginState?.gToken; + await invoke('open_splatnet', { + gtoken, + }); + } catch (e) { + setError(e); + } finally { + setDoing(false); + } + }; + + + if (error || err) { + return <> + + + } + + return <> + + +} diff --git a/gui/src/pages/Home.tsx b/gui/src/pages/Home.tsx index eab2ac0..922c107 100644 --- a/gui/src/pages/Home.tsx +++ b/gui/src/pages/Home.tsx @@ -1,41 +1,13 @@ -import { invoke } from '@tauri-apps/api'; -import { ErrorContent } from 'components/ErrorContent'; -import { Loading } from 'components/Loading'; +import { OpenSplatnet } from 'components/OpenSplatnet'; import { LogPanel, RunPanel } from 'components/RunPanel'; import { STAT_INK } from 'constant'; -import { usePromise } from 'hooks/usePromise'; import React from 'react' import { useTranslation } from 'react-i18next'; import { Link } from "react-router-dom"; -import { getConfig, getProfile } from 'services/config'; -import { composeLoadable } from 'utils/composeLoadable'; export const Home: React.FC = () => { - let { loading, error, retry, result } = composeLoadable({ - config: usePromise(getConfig), - profile: usePromise(() => getProfile(0)), - }); const { t } = useTranslation(); - if (loading) { - return <> -
- - } - - if (error) { - return <> - - - } - const gtoken = result?.profile.state.loginState?.gToken - const onOpenSplatnet3 = async () => { - await invoke('open_splatnet', { - gtoken, - }) - }; - - return
@@ -43,7 +15,7 @@ export const Home: React.FC = () => { {t('设置')}
- + {t('打开鱿鱼圈3')} {t('前往 stat.ink')}
diff --git a/gui/src/services/s3si.tsx b/gui/src/services/s3si.tsx index 510146b..7b8b24a 100644 --- a/gui/src/services/s3si.tsx +++ b/gui/src/services/s3si.tsx @@ -140,3 +140,11 @@ export async function run(state: State, opts: ExportOpts) { } return r.result; } + +export async function ensureTokenValid(state: State) { + const r = await client.ensureTokenValid(state); + if (r.error) { + throw new Error(r.error.message); + } + return r.result; +} diff --git a/src/daemon.ts b/src/daemon.ts index 8b9e3d1..c4a5930 100644 --- a/src/daemon.ts +++ b/src/daemon.ts @@ -10,8 +10,9 @@ import { DEFAULT_ENV, Env } from "./env.ts"; import { Queue } from "./jsonrpc/channel.ts"; import { ExportOpts, Log } from "./jsonrpc/types.ts"; import { App } from "./app.ts"; -import { InMemoryStateBackend, State } from "./state.ts"; +import { InMemoryStateBackend, Profile, State } from "./state.ts"; import { MemoryCache } from "./cache.ts"; +import { Splatnet3 } from "./splatnet3.ts"; class S3SIServiceImplement implements S3SIService, Service { loginMap: Map + > { + const stateBackend = new InMemoryStateBackend(state); + const profile = new Profile({ stateBackend, env: this.env }); + await profile.readState(); + const splatnet3 = new Splatnet3({ profile, env: this.env }); + if (!await splatnet3.checkToken()) { + return { + error: { + code: 101, + message: "SessionToken is invalid", + }, + }; + } + return { + result: stateBackend.state, + }; + } async getLogs(): Promise> { const log = await this.loggerQueue.pop(); return { diff --git a/src/jsonrpc/types.ts b/src/jsonrpc/types.ts index c47cded..7205dac 100644 --- a/src/jsonrpc/types.ts +++ b/src/jsonrpc/types.ts @@ -132,6 +132,7 @@ export interface S3SIService { } > >; + ensureTokenValid(state: State): Promise>; getLogs(): Promise>; run(state: State, opts: ExportOpts): Promise>; // deno-lint-ignore no-explicit-any diff --git a/src/splatnet3.ts b/src/splatnet3.ts index 2eeaf87..080c8fa 100644 --- a/src/splatnet3.ts +++ b/src/splatnet3.ts @@ -155,7 +155,7 @@ export class Splatnet3 { } try { - await this.request(Queries.HomeQuery); + await this.request(Queries.ConfigureAnalyticsQuery); return true; } catch (_e) { return false;