From 51a01739270b64f43cb49ab50f6b20f3de2f20fa Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Tue, 7 May 2024 00:30:22 +0200 Subject: [PATCH] Add option to disable webUI update checks --- public/locales/en.json | 8 +++ src/components/util/WebUIUpdateChecker.tsx | 10 +++- src/lib/metadata/metadata.ts | 3 ++ src/lib/metadata/metadataServerSettings.ts | 3 ++ src/screens/settings/WebUISettings.tsx | 58 ++++++++++++++++++++-- src/typings.ts | 7 ++- 6 files changed, 81 insertions(+), 8 deletions(-) diff --git a/public/locales/en.json b/public/locales/en.json index ce9088aa..bcf20948 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -444,6 +444,14 @@ "up_to_date": "This is the latest version", "update_failure": "Update failed", "updating": "{{progress}}% | Updating…" + }, + "settings": { + "inform": { + "label": { + "title": "Inform about available update", + "description": "Shows a dialog in case a new version is available" + } + } } } }, diff --git a/src/components/util/WebUIUpdateChecker.tsx b/src/components/util/WebUIUpdateChecker.tsx index b9b0db7a..1257af31 100644 --- a/src/components/util/WebUIUpdateChecker.tsx +++ b/src/components/util/WebUIUpdateChecker.tsx @@ -22,6 +22,7 @@ import { makeToast } from '@/components/util/Toast.tsx'; import { ABOUT_WEBUI, WEBUI_UPDATE_CHECK } from '@/lib/graphql/Fragments.ts'; import { VersionUpdateInfoDialog } from '@/components/util/VersionUpdateInfoDialog.tsx'; import { useUpdateChecker } from '@/util/useUpdateChecker'; +import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; const disabledUpdateCheck = () => Promise.resolve(); @@ -31,9 +32,14 @@ export const WebUIUpdateChecker = () => { const [webUIVersion, setWebUIVersion] = useLocalStorage('webUIVersion'); const [open, setOpen] = useState(false); + const { + settings: { webUIInformAvailableUpdate }, + } = useMetadataServerSettings(); const serverSettings = requestManager.useGetServerSettings(); const isAutoUpdateEnabled = !!serverSettings.data?.settings.webUIUpdateCheckInterval; + const shouldCheckForUpdate = !isAutoUpdateEnabled && webUIInformAvailableUpdate; + const { data: webUIUpdateData, refetch: checkForUpdate } = requestManager.useCheckForWebUIUpdate({ notifyOnNetworkStatusChange: true, fetchPolicy: 'cache-only', @@ -48,7 +54,7 @@ export const WebUIUpdateChecker = () => { const updateChecker = useUpdateChecker( 'webUI', - isAutoUpdateEnabled ? disabledUpdateCheck : checkForUpdate, + shouldCheckForUpdate ? checkForUpdate : disabledUpdateCheck, webUIUpdateData?.checkForWebUIUpdate.tag, ); @@ -110,7 +116,7 @@ export const WebUIUpdateChecker = () => { }, [webUIUpdateState]); const isUpdateAvailable = - !isAutoUpdateEnabled && updateChecker.handleUpdate && webUIUpdateData?.checkForWebUIUpdate.updateAvailable; + shouldCheckForUpdate && updateChecker.handleUpdate && webUIUpdateData?.checkForWebUIUpdate.updateAvailable; if (isUpdateAvailable) { const isUpdateInProgress = webUIUpdateState === UpdateState.Downloading; diff --git a/src/lib/metadata/metadata.ts b/src/lib/metadata/metadata.ts index 4d75f88f..ad7dceff 100644 --- a/src/lib/metadata/metadata.ts +++ b/src/lib/metadata/metadata.ts @@ -50,6 +50,9 @@ const GLOBAL_METADATA_KEYS: AppMetadataKeys[] = [ // tracking 'updateProgressAfterReading', 'updateProgressManualMarkRead', + + // updates + 'webUIInformAvailableUpdate', ]; /** diff --git a/src/lib/metadata/metadataServerSettings.ts b/src/lib/metadata/metadataServerSettings.ts index 9ac50a4e..3945233f 100644 --- a/src/lib/metadata/metadataServerSettings.ts +++ b/src/lib/metadata/metadataServerSettings.ts @@ -46,6 +46,9 @@ export const getDefaultSettings = (): MetadataServerSettings => ({ // tracking updateProgressAfterReading: true, updateProgressManualMarkRead: false, + + // updates + webUIInformAvailableUpdate: true, }); export const convertSettingsToMetadata = ( diff --git a/src/screens/settings/WebUISettings.tsx b/src/screens/settings/WebUISettings.tsx index 6f1c34f3..864bdd57 100644 --- a/src/screens/settings/WebUISettings.tsx +++ b/src/screens/settings/WebUISettings.tsx @@ -13,7 +13,7 @@ import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import Switch from '@mui/material/Switch'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; -import { ServerSettings } from '@/typings.ts'; +import { MetadataUpdateSettings, ServerSettings } from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { WebUIUpdateIntervalSetting } from '@/components/settings/webUI/WebUIUpdateIntervalSetting.tsx'; import { TextSetting } from '@/components/settings/text/TextSetting.tsx'; @@ -26,6 +26,11 @@ import { WebUiChannel, WebUiFlavor, WebUiInterface } from '@/lib/graphql/generat import { LoadingPlaceholder } from '@/components/util/LoadingPlaceholder.tsx'; import { EmptyViewAbsoluteCentered } from '@/components/util/EmptyViewAbsoluteCentered.tsx'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; +import { + createUpdateMetadataServerSettings, + useMetadataServerSettings, +} from '@/lib/metadata/metadataServerSettings.ts'; +import { makeToast } from '@/components/util/Toast.tsx'; type WebUISettingsType = Pick< ServerSettings, @@ -127,7 +132,21 @@ export const WebUISettings = () => { }; }, [t]); - const { data, loading, error, refetch } = requestManager.useGetServerSettings({ + const { + settings: { webUIInformAvailableUpdate }, + loading: areMetadataServerSettingsLoading, + request: { error: metadataServerSettingsError, refetch: refetchServerMetadataSettings }, + } = useMetadataServerSettings(); + const updateMetadataServerSettings = createUpdateMetadataServerSettings< + keyof Pick + >(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error')); + + const { + data, + loading: areServerSettingsLoading, + error: serverSettingsError, + refetch: refetchServerSettings, + } = requestManager.useGetServerSettings({ notifyOnNetworkStatusChange: true, }); const [mutateSettings] = requestManager.useUpdateServerSettings(); @@ -140,19 +159,35 @@ export const WebUISettings = () => { requestManager.graphQLClient.client.cache.evict({ fieldName: 'checkForWebUIUpdate' }); } - mutateSettings({ variables: { input: { settings: { [setting]: value } } } }); + mutateSettings({ variables: { input: { settings: { [setting]: value } } } }).catch(() => + makeToast(t('global.error.label.failed_to_save_changes'), 'error'), + ); }; + const loading = areMetadataServerSettingsLoading || areServerSettingsLoading; if (loading) { return ; } + const error = metadataServerSettingsError ?? serverSettingsError; if (error) { return ( refetch().catch(defaultPromiseErrorHandler('WebUISettings::refetch'))} + retry={() => { + if (metadataServerSettingsError) { + refetchServerMetadataSettings().catch( + defaultPromiseErrorHandler('WebUISettings::refetchServerMetadataSettings'), + ); + } + + if (serverSettingsError) { + refetchServerSettings().catch( + defaultPromiseErrorHandler('WebUISettings::refetchServerSettings'), + ); + } + }} /> ); } @@ -197,8 +232,21 @@ export const WebUISettings = () => { /> + {!webUISettings.webUIUpdateCheckInterval && ( + + + updateMetadataServerSettings('webUIInformAvailableUpdate', e.target.checked)} + /> + + )} ); }; diff --git a/src/typings.ts b/src/typings.ts index 69954148..5439fa55 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -255,12 +255,17 @@ export type MetadataTrackingSettings = { updateProgressManualMarkRead: boolean; }; +export type MetadataUpdateSettings = { + webUIInformAvailableUpdate: boolean; +}; + export type MetadataServerSettings = MetadataDownloadSettings & MetadataLibrarySettings & MetadataClientSettings & MetadataMigrationSettings & MetadataBrowseSettings & - MetadataTrackingSettings; + MetadataTrackingSettings & + MetadataUpdateSettings; export interface ISearchSettings { ignoreFilters: boolean;