From ad4f59f324b8f2fd384f9597027a0b0f8ff982f2 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sun, 21 Apr 2024 14:01:47 +0200 Subject: [PATCH] Extract automated update check into hook --- src/components/util/ServerUpdateChecker.tsx | 27 ++------------- src/util/useUpdateChecker.tsx | 38 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/util/useUpdateChecker.tsx diff --git a/src/components/util/ServerUpdateChecker.tsx b/src/components/util/ServerUpdateChecker.tsx index 359f57ab..f2101c86 100644 --- a/src/components/util/ServerUpdateChecker.tsx +++ b/src/components/util/ServerUpdateChecker.tsx @@ -12,20 +12,15 @@ import DialogContent from '@mui/material/DialogContent'; import DialogTitle from '@mui/material/DialogTitle'; import Button from '@mui/material/Button'; import DialogContentText from '@mui/material/DialogContentText'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { getVersion } from '@/screens/settings/About.tsx'; -import { useLocalStorage } from '@/util/useStorage.tsx'; -import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; - -const UPDATE_CHECK_INTERVAL = 1000 * 60 * 60 * 24; // 1 day +import { useUpdateChecker } from '@/util/useUpdateChecker.tsx'; export const ServerUpdateChecker = () => { const { t } = useTranslation(); - const [lastUpdateCheck, setLastUpdateCheck] = useLocalStorage('lastAutomatedServerUpdateCheck', 0); - const { data: serverUpdateCheckData, loading: isCheckingForServerUpdate, @@ -48,23 +43,7 @@ export const ServerUpdateChecker = () => { setOpen(false); }; - useEffect(() => { - const remainingTimeTillNextUpdateCheck = - (UPDATE_CHECK_INTERVAL - (Date.now() - lastUpdateCheck)) % UPDATE_CHECK_INTERVAL; - - let timeout: NodeJS.Timeout | undefined; - const scheduleUpdateCheck = (timeoutMS: number) => { - timeout = setTimeout(() => { - checkForUpdate().catch(defaultPromiseErrorHandler('ServerUpdateChecker::checkForUpdate')); - setLastUpdateCheck(Date.now()); - scheduleUpdateCheck(UPDATE_CHECK_INTERVAL); - }, timeoutMS); - }; - - scheduleUpdateCheck(remainingTimeTillNextUpdateCheck); - - return () => clearTimeout(timeout); - }, []); + useUpdateChecker('server', checkForUpdate); if (isCheckingForServerUpdate) { return null; diff --git a/src/util/useUpdateChecker.tsx b/src/util/useUpdateChecker.tsx new file mode 100644 index 00000000..3d39d642 --- /dev/null +++ b/src/util/useUpdateChecker.tsx @@ -0,0 +1,38 @@ +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +import { useEffect } from 'react'; +import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; +import { useLocalStorage } from '@/util/useStorage.tsx'; + +const UPDATE_CHECK_INTERVAL = 1000 * 60 * 60 * 24; // 1 day + +export const useUpdateChecker = ( + storageKey: string, + checkForUpdate: () => Promise, + interval: number = UPDATE_CHECK_INTERVAL, +): void => { + const [lastUpdateCheck, setLastUpdateCheck] = useLocalStorage(`UpdateChecker::${storageKey}`, 0); + + useEffect(() => { + const remainingTimeTillNextUpdateCheck = (interval - (Date.now() - lastUpdateCheck)) % interval; + + let timeout: NodeJS.Timeout | undefined; + const scheduleUpdateCheck = (timeoutMS: number) => { + timeout = setTimeout(() => { + checkForUpdate().catch(defaultPromiseErrorHandler(`UpdateChecker(${storageKey})::checkForUpdate`)); + setLastUpdateCheck(Date.now()); + scheduleUpdateCheck(interval); + }, timeoutMS); + }; + + scheduleUpdateCheck(remainingTimeTillNextUpdateCheck); + + return () => clearTimeout(timeout); + }, [storageKey, checkForUpdate, interval]); +};