diff --git a/.github/workflows/vercel-merge.yml b/.github/workflows/vercel-merge.yml
new file mode 100644
index 00000000..4cc8b635
--- /dev/null
+++ b/.github/workflows/vercel-merge.yml
@@ -0,0 +1,23 @@
+name: Deploy to vercel on merge
+on:
+ push:
+ branches:
+ - main
+permissions:
+ contents: write
+ deployments: write
+ pull-requests: write
+jobs:
+ build_and_deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: 'true'
+ - uses: amondnet/vercel-action@v25
+ with:
+ vercel-token: ${{ secrets.VERCEL_TOKEN }}
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ vercel-args: '--prod'
+ vercel-org-id: ${{ secrets.ORG_ID}}
+ vercel-project-id: ${{ secrets.PROJECT_ID}}
diff --git a/.github/workflows/vercel-pull-requst.yml b/.github/workflows/vercel-pull-requst.yml
new file mode 100644
index 00000000..40fe10cb
--- /dev/null
+++ b/.github/workflows/vercel-pull-requst.yml
@@ -0,0 +1,25 @@
+name: Create vercel preview URL on pull request
+on:
+ pull_request:
+ branches: [main, master]
+permissions:
+ contents: write
+ deployments: write
+ pull-requests: write
+jobs:
+ build_and_deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: 'true'
+ - uses: amondnet/vercel-action@v25
+ id: vercel-deploy
+ with:
+ vercel-token: ${{ secrets.VERCEL_TOKEN }}
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ vercel-org-id: ${{ secrets.ORG_ID}}
+ vercel-project-id: ${{ secrets.PROJECT_ID}}
+ - name: preview-url
+ run: |
+ echo ${{ steps.vercel-deploy.outputs.preview-url }}
diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json
index e1dacd92..50d6d45d 100644
--- a/apps/readest-app/package.json
+++ b/apps/readest-app/package.json
@@ -1,6 +1,6 @@
{
"name": "@readest/readest-app",
- "version": "0.8.3",
+ "version": "0.8.5",
"private": true,
"scripts": {
"dev": "dotenv -e .env.tauri -- next dev",
diff --git a/apps/readest-app/src/app/layout.tsx b/apps/readest-app/src/app/layout.tsx
index 30d1efbf..d9cf7139 100644
--- a/apps/readest-app/src/app/layout.tsx
+++ b/apps/readest-app/src/app/layout.tsx
@@ -25,6 +25,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
+
diff --git a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx
index 35f2aa56..6d5b54f6 100644
--- a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx
+++ b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx
@@ -39,7 +39,7 @@ const FoliateViewer: React.FC<{
return () => clearTimeout(timer);
}, [toastMessage]);
- useProgressSync(bookKey, config, setToastMessage);
+ useProgressSync(bookKey, setToastMessage);
const progressRelocateHandler = (event: Event) => {
const detail = (event as CustomEvent).detail;
diff --git a/apps/readest-app/src/app/reader/components/sidebar/SearchBar.tsx b/apps/readest-app/src/app/reader/components/sidebar/SearchBar.tsx
index 47944a19..b45b1625 100644
--- a/apps/readest-app/src/app/reader/components/sidebar/SearchBar.tsx
+++ b/apps/readest-app/src/app/reader/components/sidebar/SearchBar.tsx
@@ -34,7 +34,7 @@ const SearchBar: React.FC = ({
const view = getView(bookKey)!;
const config = getConfig(bookKey)!;
const progress = getProgress(bookKey)!;
- const searchConfig = config.searchConfig!;
+ const searchConfig = config.searchConfig! as BookSearchConfig;
const queuedSearchTerm = useRef('');
const isSearchPending = useRef(false);
diff --git a/apps/readest-app/src/app/reader/hooks/useProgressSync.ts b/apps/readest-app/src/app/reader/hooks/useProgressSync.ts
index 7e4210d6..1d9f5ab0 100644
--- a/apps/readest-app/src/app/reader/hooks/useProgressSync.ts
+++ b/apps/readest-app/src/app/reader/hooks/useProgressSync.ts
@@ -10,17 +10,18 @@ import { useSettingsStore } from '@/store/settingsStore';
export const useProgressSync = (
bookKey: string,
- config: BookConfig,
setToastMessage?: React.Dispatch>,
) => {
- const { setConfig } = useBookDataStore();
+ const { getConfig, setConfig } = useBookDataStore();
const { getView } = useReaderStore();
const { settings } = useSettingsStore();
const { syncedConfigs, syncConfigs } = useSync();
const { user } = useAuth();
const view = getView(bookKey);
+ const config = getConfig(bookKey);
- const pushConfig = (bookKey: string, config: BookConfig) => {
+ const pushConfig = (bookKey: string, config: BookConfig | null) => {
+ if (!config || !user) return;
const bookHash = bookKey.split('-')[0]!;
const newConfig = { bookHash, ...config };
const compressedConfig = JSON.parse(
@@ -30,7 +31,7 @@ export const useProgressSync = (
};
useEffect(() => {
- if (!user) return;
+ if (!config || !user) return;
const bookHash = bookKey.split('-')[0]!;
syncConfigs([], bookHash, 'pull');
return () => {
@@ -42,7 +43,7 @@ export const useProgressSync = (
const lastProgressSyncTime = useRef(0);
const syncTimeoutRef = useRef | null>(null);
useEffect(() => {
- if (!user) return;
+ if (!config || !user) return;
const now = Date.now();
const timeSinceLastSync = now - lastProgressSyncTime.current;
if (configSynced.current && timeSinceLastSync > SYNC_PROGRESS_INTERVAL_SEC * 1000) {
@@ -75,9 +76,9 @@ export const useProgressSync = (
);
setConfig(bookKey, { ...config, ...newConfig });
configSynced.current = true;
- if ((syncedConfig.progress?.[1] ?? 0) > 0 && (config.progress?.[1] ?? 0) > 0) {
+ if ((syncedConfig.progress?.[1] ?? 0) > 0 && (config?.progress?.[1] ?? 0) > 0) {
const syncedFraction = syncedConfig.progress![0] / syncedConfig.progress![1];
- const configFraction = config.progress![0] / config.progress![1];
+ const configFraction = config!.progress![0] / config!.progress![1];
if (syncedFraction > configFraction) {
view?.goToFraction(syncedFraction);
setToastMessage?.('Progress synced');
diff --git a/package.json b/package.json
index 6a1a56c5..1b01ceaa 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "@readest/monorepo",
"private": true,
- "repository": "chrox/readest",
+ "repository": "readest/readest",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"tauri": "pnpm --filter @readest/readest-app tauri"