settings: add option to disable auto check updates (#279)

This commit is contained in:
Huang Xin
2025-02-01 13:45:55 +01:00
committed by GitHub
parent 44885f2901
commit 6889d6341f
26 changed files with 131 additions and 37 deletions
@@ -6,7 +6,7 @@ import { PiUserCircleCheck } from 'react-icons/pi';
import { MdCheck } from 'react-icons/md';
import { setAboutDialogVisible } from '@/components/AboutWindow';
import { isWebAppPlatform } from '@/services/environment';
import { hasUpdater, isWebAppPlatform } from '@/services/environment';
import { DOWNLOAD_READEST_URL } from '@/services/constants';
import { useAuth } from '@/context/AuthContext';
import { useEnv } from '@/context/EnvContext';
@@ -30,6 +30,7 @@ const SettingsMenu: React.FC<BookMenuProps> = ({ setIsDropdownOpen }) => {
const { settings, setSettings, saveSettings } = useSettingsStore();
const [quotas, setQuotas] = React.useState<QuotaType[]>([]);
const [isAutoUpload, setIsAutoUpload] = useState(settings.autoUpload);
const [isAutoCheckUpdates, setIsAutoCheckUpdates] = useState(settings.autoCheckUpdates);
const showAboutReadest = () => {
setAboutDialogVisible(true);
@@ -69,6 +70,13 @@ const SettingsMenu: React.FC<BookMenuProps> = ({ setIsDropdownOpen }) => {
}
};
const toggleAutoCheckUpdates = () => {
settings.autoCheckUpdates = !settings.autoCheckUpdates;
setSettings(settings);
saveSettings(envConfig, settings);
setIsAutoCheckUpdates(settings.autoCheckUpdates);
};
useEffect(() => {
if (!user || !token) return;
const storagPlan = getStoragePlanData(token);
@@ -131,6 +139,13 @@ const SettingsMenu: React.FC<BookMenuProps> = ({ setIsDropdownOpen }) => {
icon={isAutoUpload ? <MdCheck className='text-base-content' /> : undefined}
onClick={toggleAutoUploadBooks}
/>
{hasUpdater() && (
<MenuItem
label={_('Check Updates on Start')}
icon={isAutoCheckUpdates ? <MdCheck className='text-base-content' /> : undefined}
onClick={toggleAutoCheckUpdates}
/>
)}
<hr className='border-base-200 my-1' />
<MenuItem label={_('Reload Page')} onClick={handleReloadPage} />
<hr className='border-base-200 my-1' />
+8 -4
View File
@@ -63,14 +63,18 @@ const LibraryPage = () => {
useEffect(() => {
updateAppTheme('base-200');
const doAppUpdates = async () => {
if (hasUpdater()) {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
const doCheckAppUpdates = async () => {
if (hasUpdater() && settings.autoCheckUpdates) {
await checkForAppUpdates(_);
}
};
doAppUpdates();
doCheckAppUpdates();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
}, [settings]);
const processOpenWithFiles = React.useCallback(
async (appService: AppService, openWithFiles: string[], libraryBooks: Book[]) => {
+8 -4
View File
@@ -5,20 +5,24 @@ import { useTheme } from '@/hooks/useTheme';
import { hasUpdater } from '@/services/environment';
import { checkForAppUpdates } from '@/helpers/updater';
import { useTranslation } from '@/hooks/useTranslation';
import { useSettingsStore } from '@/store/settingsStore';
import Reader from './components/Reader';
export default function Page() {
const _ = useTranslation();
const { settings } = useSettingsStore();
useTheme();
useEffect(() => {
const doAppUpdates = async () => {
if (hasUpdater()) {
const doCheckAppUpdates = async () => {
if (hasUpdater() && settings.autoCheckUpdates) {
await checkForAppUpdates(_);
}
};
doAppUpdates();
doCheckAppUpdates();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
}, [settings]);
return <Reader />;
}
+7 -1
View File
@@ -35,7 +35,13 @@ const MenuItem: React.FC<MenuItemProps> = ({
>
<div className='flex items-center'>
{!noIcon && <span style={{ minWidth: `${iconSize}px` }}>{icon}</span>}
<span className={clsx('ml-2 truncate text-base sm:max-w-32 sm:text-sm', labelClass)}>
<span
className={clsx(
'ml-2 truncate text-base sm:text-sm',
shortcut ? 'max-w-[60%]' : 'max-w-[90%]',
labelClass,
)}
>
{label}
</span>
</div>
+2 -1
View File
@@ -12,8 +12,9 @@ export const checkForAppUpdates = async (_: TranslationFunc) => {
if (lastCheck && now - parseInt(lastCheck, 10) < CHECK_UPDATE_INTERVAL_SEC * 1000) return;
localStorage.setItem(LAST_CHECK_KEY, now.toString());
console.log('Checking for updates');
const update = await check();
console.log('update found', update);
console.log('Update found', update);
if (update) {
const yes = await ask(
`
+4 -6
View File
@@ -28,6 +28,7 @@ import {
DEFAULT_TTS_CONFIG,
CLOUD_BOOKS_SUBDIR,
DEFAULT_MOBILE_VIEW_SETTINGS,
DEFAULT_SYSTEM_SETTINGS,
} from './constants';
import { isWebAppPlatform } from './environment';
import { getOSPlatform, isValidURL } from '@/utils/misc';
@@ -69,6 +70,7 @@ export abstract class BaseAppService implements AppService {
settings.localBooksDir = await this.getInitBooksDir();
settings.version = SYSTEM_SETTINGS_VERSION;
}
settings = { ...DEFAULT_SYSTEM_SETTINGS, ...settings };
settings.globalReadSettings = { ...DEFAULT_READSETTINGS, ...settings.globalReadSettings };
settings.globalViewSettings = {
...DEFAULT_BOOK_LAYOUT,
@@ -81,13 +83,9 @@ export abstract class BaseAppService implements AppService {
};
} catch {
settings = {
...DEFAULT_SYSTEM_SETTINGS,
version: SYSTEM_SETTINGS_VERSION,
localBooksDir: await this.getInitBooksDir(),
lastSyncedAtBooks: 0,
lastSyncedAtConfigs: 0,
lastSyncedAtNotes: 0,
keepLogin: false,
autoUpload: false,
globalReadSettings: DEFAULT_READSETTINGS,
globalViewSettings: {
...DEFAULT_BOOK_LAYOUT,
@@ -97,7 +95,7 @@ export abstract class BaseAppService implements AppService {
...DEFAULT_VIEW_CONFIG,
...DEFAULT_TTS_CONFIG,
},
};
} as SystemSettings;
await this.fs.createDir('', 'Books', true);
await this.fs.createDir('', base, true);
+11 -2
View File
@@ -7,7 +7,7 @@ import {
ViewConfig,
ViewSettings,
} from '@/types/book';
import { ReadSettings } from '@/types/settings';
import { ReadSettings, SystemSettings } from '@/types/settings';
import { UserStorageQuota } from '@/types/user';
export const LOCAL_BOOKS_SUBDIR = 'Readest/Books';
@@ -16,6 +16,16 @@ export const CLOUD_BOOKS_SUBDIR = 'Readest/Books';
export const SUPPORTED_FILE_EXTS = ['epub', 'mobi', 'azw', 'azw3', 'fb2', 'cbz', 'pdf'];
export const FILE_ACCEPT_FORMATS = SUPPORTED_FILE_EXTS.map((ext) => `.${ext}`).join(', ');
export const DEFAULT_SYSTEM_SETTINGS: Partial<SystemSettings> = {
keepLogin: false,
autoUpload: false,
autoCheckUpdates: true,
lastSyncedAtBooks: 0,
lastSyncedAtConfigs: 0,
lastSyncedAtNotes: 0,
};
export const DEFAULT_READSETTINGS: ReadSettings = {
sideBarWidth: '15%',
isSideBarPinned: true,
@@ -67,7 +77,6 @@ export const DEFAULT_BOOK_STYLE: BookStyle = {
};
export const DEFAULT_MOBILE_VIEW_SETTINGS: Partial<ViewSettings> = {
defaultFontSize: 19,
fullJustification: false,
};
+2
View File
@@ -17,8 +17,10 @@ export interface ReadSettings {
export interface SystemSettings {
version: number;
localBooksDir: string;
keepLogin: boolean;
autoUpload: boolean;
autoCheckUpdates: boolean;
lastSyncedAtBooks: number;
lastSyncedAtConfigs: number;
+5 -1
View File
@@ -8,6 +8,7 @@ import { ViewSettings } from '@/types/book';
import { Palette } from '@/styles/themes';
import fontfacesCSS from '!!raw-loader!../styles/fonts.css';
import { getOSPlatform } from './misc';
const getFontStyles = (
serif: string,
@@ -209,12 +210,15 @@ export const getStyles = (viewSettings: ViewSettings, themeCode: ThemeCode) => {
themeCode.fg,
themeCode.primary,
);
// scale the font size on-the-fly so that we can sync the same font size on different devices
const isMobile = ['ios', 'android'].includes(getOSPlatform());
const fontScale = isMobile ? 1.25 : 1;
const fontStyles = getFontStyles(
viewSettings.serifFont!,
viewSettings.sansSerifFont!,
viewSettings.monospaceFont!,
viewSettings.defaultFont!,
viewSettings.defaultFontSize!,
viewSettings.defaultFontSize! * fontScale,
viewSettings.overrideFont!,
);
const userStylesheet = viewSettings.userStylesheet!;