7da41a65ad
Add a resizable home-screen widget on iOS and Android showing recent
in-progress books with cover, reading progress, and tap-to-open.
- One responsive widget: Android resizable 1x1 to 4x3 (one book per
column, up to 3); iOS Small/Medium/Large families. Covers are cropped,
rounded, with a percent badge and a progress bar (baked into the bitmap
on Android, SwiftUI overlays on iOS).
- TTS controls (previous, play-pause, next) appear in 2+ row sizes when
TTS is active, wired to the existing media session. Reading progress
stays live during background TTS via a fraction computed from the baked
offline locations.
- Publishes a snapshot plus downsized cover thumbnails to the iOS App
Group and Android SharedPreferences through a new update_reading_widget
native-bridge command; refresh is debounced and driven by library and
progress changes, TTS, and app backgrounding.
- Tapping a cover opens readest://book/{hash}, switching the reader in
place when one is already open.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect } from 'react';
|
|
import { useEnv } from '@/context/EnvContext';
|
|
import { useTranslation } from '@/hooks/useTranslation';
|
|
import { useAppUrlIngress } from '@/hooks/useAppUrlIngress';
|
|
import { useOpenWithBooks } from '@/hooks/useOpenWithBooks';
|
|
import { useOpenAnnotationLink } from '@/hooks/useOpenAnnotationLink';
|
|
import { useOpenBookLink } from '@/hooks/useOpenBookLink';
|
|
import { useReadingWidget } from '@/hooks/useReadingWidget';
|
|
import { useOpenShareLink } from '@/hooks/useOpenShareLink';
|
|
import { useClipUrlIngress } from '@/hooks/useClipUrlIngress';
|
|
import { useSettingsStore } from '@/store/settingsStore';
|
|
import { checkForAppUpdates, checkAppReleaseNotes } from '@/helpers/updater';
|
|
import { tauriHandleSetAlwaysOnTop } from '@/utils/window';
|
|
import Reader from './components/Reader';
|
|
|
|
// This is only used for the Tauri app in the app router
|
|
export default function Page() {
|
|
const _ = useTranslation();
|
|
const { appService } = useEnv();
|
|
const { settings } = useSettingsStore();
|
|
|
|
useAppUrlIngress();
|
|
useOpenWithBooks();
|
|
useOpenAnnotationLink();
|
|
useOpenBookLink();
|
|
useReadingWidget();
|
|
useOpenShareLink();
|
|
useClipUrlIngress();
|
|
|
|
useEffect(() => {
|
|
const doCheckAppUpdates = async () => {
|
|
if (appService?.hasUpdater && settings.autoCheckUpdates) {
|
|
await checkForAppUpdates(_, true, settings.updateChannel);
|
|
} else if (appService?.hasUpdater === false) {
|
|
checkAppReleaseNotes();
|
|
}
|
|
};
|
|
if (appService?.hasWindow && settings.alwaysOnTop) {
|
|
tauriHandleSetAlwaysOnTop(settings.alwaysOnTop);
|
|
}
|
|
doCheckAppUpdates();
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [appService?.hasUpdater, settings.autoCheckUpdates]);
|
|
|
|
return <Reader />;
|
|
}
|