diff --git a/web/src/components/UpdateVersionBanner.tsx b/web/src/components/UpdateVersionBanner.tsx index 83c854c7..34f04780 100644 --- a/web/src/components/UpdateVersionBanner.tsx +++ b/web/src/components/UpdateVersionBanner.tsx @@ -1,40 +1,70 @@ import { useEffect, useState } from "react"; import * as api from "../helpers/api"; +import * as storage from "../helpers/storage"; import Icon from "./Icon"; import "../less/about-site-dialog.less"; interface State { latestVersion: string; + show: boolean; } const UpdateVersionBanner: React.FC = () => { const [state, setState] = useState({ latestVersion: "", + show: false, }); useEffect(() => { - try { - api.getRepoLatestTag().then((latestTag) => { - setState({ - latestVersion: latestTag, - }); + Promise.all([api.getRepoLatestTag(), api.getSystemStatus()]) + .then( + ([ + latestTag, + { + data: { + data: { profile }, + }, + }, + ]) => { + const { skippedVersion } = storage.get(["skippedVersion"]); + const latestVersion = latestTag.slice(1) || "0.0.0"; + const currentVersion = profile.version; + const skipped = skippedVersion ? skippedVersion === latestVersion : false; + setState({ + latestVersion, + show: !skipped && currentVersion !== latestVersion, + }); + } + ) + .catch(() => { + // do nth }); - } catch (error) { - // do nth - } }, []); + const onSkip = () => { + storage.set({ skippedVersion: state.latestVersion }); + setState((s) => ({ + ...s, + show: false, + })); + }; + + if (!state.show) return null; + return ( -
+
- New Update {state.latestVersion} + New Update {state.latestVersion} +
); }; diff --git a/web/src/helpers/storage.ts b/web/src/helpers/storage.ts index 2509157b..d6b704f9 100644 --- a/web/src/helpers/storage.ts +++ b/web/src/helpers/storage.ts @@ -8,6 +8,8 @@ interface StorageData { editingMemoIdCache: MemoId; // locale locale: Locale; + // skipped version + skippedVersion: string; } type StorageKey = keyof StorageData; diff --git a/web/src/pages/Home.tsx b/web/src/pages/Home.tsx index 4dc7af01..4db45dd7 100644 --- a/web/src/pages/Home.tsx +++ b/web/src/pages/Home.tsx @@ -1,7 +1,6 @@ -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useLocation } from "react-router-dom"; -import * as api from "../helpers/api"; import { globalService, userService } from "../services"; import { useAppSelector } from "../store"; import toastHelper from "../components/Toast"; @@ -13,42 +12,10 @@ import MemoList from "../components/MemoList"; import UpdateVersionBanner from "../components/UpdateVersionBanner"; import "../less/home.less"; -interface State { - shouldShowUpdateVersionBanner: boolean; -} - function Home() { const { t } = useTranslation(); const location = useLocation(); const user = useAppSelector((state) => state.user.user); - const [state, setState] = useState({ - shouldShowUpdateVersionBanner: false, - }); - - useEffect(() => { - Promise.all([api.getRepoLatestTag(), api.getSystemStatus()]) - .then( - ([ - latestTag, - { - data: { - data: { profile }, - }, - }, - ]) => { - const latestVersion = latestTag.slice(1) || "0.0.0"; - const currentVersion = profile.version; - if (latestVersion > currentVersion) { - setState({ - shouldShowUpdateVersionBanner: true, - }); - } - } - ) - .catch(() => { - // do nth - }); - }, []); useEffect(() => { const { owner } = userService.getState(); @@ -68,7 +35,9 @@ function Home() { return (
-
{state.shouldShowUpdateVersionBanner && }
+
+ +