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"