Skip to content

refactor(frontend): Migrate state to Tanstack Query + signals#117

Merged
balazs-szucs merged 2 commits into
grimmory-tools:developfrom
alexhb1:frontend/tsq-migration
Mar 23, 2026
Merged

refactor(frontend): Migrate state to Tanstack Query + signals#117
balazs-szucs merged 2 commits into
grimmory-tools:developfrom
alexhb1:frontend/tsq-migration

Conversation

@alexhb1

@alexhb1 alexhb1 commented Mar 22, 2026

Copy link
Copy Markdown
Member

Description

This PR replaces the BehaviorSubject state management and manual patching technique with Tanstack Query for server data and Angular signals for local/derived states.

Key additions (frontend)

  • Tanstack Query implementation across all server-originating data calls
  • Introduces proper caching, error handling, deduplication, automatic retries and query invalidation.
  • Centralises all cache mutations into book-query-cache.ts - Single place for all adds, patches, removals and invalidations.
    • All common DB operations are categorised by surgical or invalidation. Surgical will write data you have into cache, while invalidation will tell TSQ the data is stale and automatically re-fetches. All surgical calls are unified into the cache helper and not scattered across the frontend.
  • Converts most components from observables / subscription-based management to signals

Outcomes

  • Net -1600 lines or so despite the new files and more robust data layer - Most frontend files have a simpler method of accessing data
  • Eliminated the takeUntil/destroy$/ngOnDestroy cleanup from most components
  • Reduces or eliminates the risk of common client side issues (Memory leaks, duplicate fetches, patching errors, etc) that the current implementation could surface.
  • WebSocket handlers now call the centralised cache helpers instead of manually splicing arrays
  • Filter/preference services converted to signals with localStorage persistence where needed

This hopefully serves as a much cleaner frontend to implement some more of the bigger data wins (Pagination, server side search and filtering etc). TanStack Query has a built-in injectInfiniteQuery function that automatically handles multiple batches of data, concatenating results, handling "load next" etc. At least on the frontend it should handle all this quite cleanly.

Testing

  • All tests pass locally, and from actual usage over the last couple days with a test library (60k+ books) and my real library everything is working as intended as far as I can tell.
  • Appreciate this is a big PR though, so it would be good to get a few more real world test scenarios.

Disclaimer

  • I know this isn't on the PR template anymore but thought I'd flag it anyway. I worked on the TSQ and cache mutation areas directly, while I used Codex / 5.4xhigh to delegate much of the mechanical find+replace work of observables to signals, which is thousands of lines to be fair.

@coderabbitai

coderabbitai Bot commented Mar 22, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 236 files, which is 86 over the limit of 150.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4e0ac7a7-c5dc-444a-9c45-44cb5d2e13ef

📥 Commits

Reviewing files that changed from the base of the PR and between 722ef97 and 60d8b00.

⛔ Files ignored due to path filters (1)
  • booklore-ui/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (236)
  • booklore-ui/package.json
  • booklore-ui/src/app/app.component.spec.ts
  • booklore-ui/src/app/app.component.ts
  • booklore-ui/src/app/core/security/auth-initialization-service.ts
  • booklore-ui/src/app/core/security/auth-initializer.spec.ts
  • booklore-ui/src/app/core/security/auth-initializer.ts
  • booklore-ui/src/app/core/security/guards/bookdrop.guard.ts
  • booklore-ui/src/app/core/security/guards/edit-metdata.guard.ts
  • booklore-ui/src/app/core/security/guards/library-stats.guard.ts
  • booklore-ui/src/app/core/security/guards/manage-library.guard.ts
  • booklore-ui/src/app/core/security/guards/user-stats.guard.ts
  • booklore-ui/src/app/core/security/oauth2-management/authentication-settings.component.ts
  • booklore-ui/src/app/features/author-browser/components/author-browser/author-browser.component.html
  • booklore-ui/src/app/features/author-browser/components/author-browser/author-browser.component.ts
  • booklore-ui/src/app/features/author-browser/components/author-detail/author-detail.component.html
  • booklore-ui/src/app/features/author-browser/components/author-detail/author-detail.component.ts
  • booklore-ui/src/app/features/author-browser/service/author-query-cache.ts
  • booklore-ui/src/app/features/author-browser/service/author-query-keys.ts
  • booklore-ui/src/app/features/author-browser/service/author-scale-preference.service.ts
  • booklore-ui/src/app/features/author-browser/service/author-selection.service.ts
  • booklore-ui/src/app/features/author-browser/service/author.service.ts
  • booklore-ui/src/app/features/book/components/add-physical-book-dialog/add-physical-book-dialog.component.ts
  • booklore-ui/src/app/features/book/components/additional-file-uploader/additional-file-uploader.component.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-browser-entity.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-browser.component.html
  • booklore-ui/src/app/features/book/components/book-browser/book-browser.component.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-card-overlay-preference.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-card/book-card.component.html
  • booklore-ui/src/app/features/book/components/book-browser/book-card/book-card.component.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-filter-orchestration.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-filter/book-filter.component.html
  • booklore-ui/src/app/features/book/components/book-browser/book-filter/book-filter.component.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-filter/book-filter.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-selection.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/book-table/book-table.component.ts
  • booklore-ui/src/app/features/book/components/book-browser/cover-scale-preference.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/filters/BookFilter.ts
  • booklore-ui/src/app/features/book/components/book-browser/filters/HeaderFilter.ts
  • booklore-ui/src/app/features/book/components/book-browser/filters/SeriesCollapseFilter.ts
  • booklore-ui/src/app/features/book/components/book-browser/filters/sidebar-filter-toggle-pref.service.ts
  • booklore-ui/src/app/features/book/components/book-browser/filters/sidebar-filter.ts
  • booklore-ui/src/app/features/book/components/book-browser/table-column-preference.service.ts
  • booklore-ui/src/app/features/book/components/book-card-lite/book-card-lite-component.ts
  • booklore-ui/src/app/features/book/components/book-file-attacher/book-file-attacher.component.ts
  • booklore-ui/src/app/features/book/components/book-reviews/book-reviews.component.ts
  • booklore-ui/src/app/features/book/components/book-searcher/book-searcher.component.ts
  • booklore-ui/src/app/features/book/components/bulk-isbn-import-dialog/bulk-isbn-import-dialog.component.ts
  • booklore-ui/src/app/features/book/components/duplicate-merger/duplicate-merger.component.ts
  • booklore-ui/src/app/features/book/components/series-page/series-page.component.html
  • booklore-ui/src/app/features/book/components/series-page/series-page.component.ts
  • booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.html
  • booklore-ui/src/app/features/book/components/shelf-assigner/shelf-assigner.component.ts
  • booklore-ui/src/app/features/book/components/shelf-edit-dialog/shelf-edit-dialog.component.ts
  • booklore-ui/src/app/features/book/model/book.model.ts
  • booklore-ui/src/app/features/book/model/state/book-state.model.ts
  • booklore-ui/src/app/features/book/model/state/library-state.model.ts
  • booklore-ui/src/app/features/book/model/state/shelf-state.model.ts
  • booklore-ui/src/app/features/book/service/book-file.service.ts
  • booklore-ui/src/app/features/book/service/book-menu.service.ts
  • booklore-ui/src/app/features/book/service/book-metadata-manage.service.ts
  • booklore-ui/src/app/features/book/service/book-navigation.service.ts
  • booklore-ui/src/app/features/book/service/book-patch.service.ts
  • booklore-ui/src/app/features/book/service/book-query-cache.spec.ts
  • booklore-ui/src/app/features/book/service/book-query-cache.ts
  • booklore-ui/src/app/features/book/service/book-query-keys.ts
  • booklore-ui/src/app/features/book/service/book-socket.service.ts
  • booklore-ui/src/app/features/book/service/book-state.service.ts
  • booklore-ui/src/app/features/book/service/book.service.ts
  • booklore-ui/src/app/features/book/service/library-health.service.spec.ts
  • booklore-ui/src/app/features/book/service/library-health.service.ts
  • booklore-ui/src/app/features/book/service/library-query-keys.ts
  • booklore-ui/src/app/features/book/service/library.service.ts
  • booklore-ui/src/app/features/book/service/shelf.service.ts
  • booklore-ui/src/app/features/bookdrop/component/bookdrop-file-metadata-picker/bookdrop-file-metadata-picker.component.ts
  • booklore-ui/src/app/features/bookdrop/component/bookdrop-file-review/bookdrop-file-review.component.ts
  • booklore-ui/src/app/features/bookdrop/service/bookdrop-file.service.ts
  • booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.html
  • booklore-ui/src/app/features/dashboard/components/dashboard-settings/dashboard-settings.component.ts
  • booklore-ui/src/app/features/dashboard/components/main-dashboard/main-dashboard.component.html
  • booklore-ui/src/app/features/dashboard/components/main-dashboard/main-dashboard.component.ts
  • booklore-ui/src/app/features/dashboard/services/dashboard-config.service.ts
  • booklore-ui/src/app/features/magic-shelf/component/magic-shelf-component.html
  • booklore-ui/src/app/features/magic-shelf/component/magic-shelf-component.spec.ts
  • booklore-ui/src/app/features/magic-shelf/component/magic-shelf-component.ts
  • booklore-ui/src/app/features/magic-shelf/service/magic-shelf.service.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/book-metadata-center.component.html
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/book-metadata-center.component.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-editor/metadata-editor.component.html
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-editor/metadata-editor.component.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-picker/metadata-picker.component.html
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-picker/metadata-picker.component.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-searcher/metadata-searcher.component.html
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-searcher/metadata-searcher.component.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-viewer/metadata-viewer.component.html
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/metadata-viewer/metadata-viewer.component.ts
  • booklore-ui/src/app/features/metadata/component/book-metadata-center/sidecar-viewer/sidecar-viewer.component.ts
  • booklore-ui/src/app/features/metadata/component/bulk-metadata-update/bulk-metadata-update-component.ts
  • booklore-ui/src/app/features/metadata/component/cover-search/cover-search.component.ts
  • booklore-ui/src/app/features/metadata/component/metadata-manager/metadata-manager.component.ts
  • booklore-ui/src/app/features/metadata/component/metadata-options-dialog/metadata-fetch-options/metadata-fetch-options.component.ts
  • booklore-ui/src/app/features/metadata/component/metadata-provider-field-selector/metadata-provider-field-selector.component.ts
  • booklore-ui/src/app/features/metadata/component/metadata-review-dialog/metadata-review-dialog-component.html
  • booklore-ui/src/app/features/metadata/component/metadata-review-dialog/metadata-review-dialog-component.ts
  • booklore-ui/src/app/features/metadata/component/multi-book-metadata-editor/multi-book-metadata-editor-component.html
  • booklore-ui/src/app/features/metadata/component/multi-book-metadata-editor/multi-book-metadata-editor-component.ts
  • booklore-ui/src/app/features/metadata/component/multi-book-metadata-fetch/multi-book-metadata-fetch-component.ts
  • booklore-ui/src/app/features/readers/audiobook-player/audiobook-player.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/cbx-reader.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/footer/cbx-footer.component.html
  • booklore-ui/src/app/features/readers/cbx-reader/layout/footer/cbx-footer.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/footer/cbx-footer.service.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/header/cbx-header.component.html
  • booklore-ui/src/app/features/readers/cbx-reader/layout/header/cbx-header.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/header/cbx-header.service.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/quick-settings/cbx-quick-settings.component.html
  • booklore-ui/src/app/features/readers/cbx-reader/layout/quick-settings/cbx-quick-settings.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/quick-settings/cbx-quick-settings.service.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/sidebar/cbx-sidebar.component.html
  • booklore-ui/src/app/features/readers/cbx-reader/layout/sidebar/cbx-sidebar.component.ts
  • booklore-ui/src/app/features/readers/cbx-reader/layout/sidebar/cbx-sidebar.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/dialogs/settings-dialog.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/ebook-reader.component.html
  • booklore-ui/src/app/features/readers/ebook-reader/ebook-reader.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/features/fonts/custom-font.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/features/notes/note.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/features/selection/selection.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/header/header.component.html
  • booklore-ui/src/app/features/readers/ebook-reader/layout/header/header.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/header/header.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/header/quick-settings.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/panel/panel.component.html
  • booklore-ui/src/app/features/readers/ebook-reader/layout/panel/panel.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/panel/panel.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/sidebar/sidebar.component.html
  • booklore-ui/src/app/features/readers/ebook-reader/layout/sidebar/sidebar.component.ts
  • booklore-ui/src/app/features/readers/ebook-reader/layout/sidebar/sidebar.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/state/progress.service.ts
  • booklore-ui/src/app/features/readers/ebook-reader/state/reader-state.service.ts
  • booklore-ui/src/app/features/readers/pdf-reader/pdf-reader.component.ts
  • booklore-ui/src/app/features/series-browser/components/series-browser/series-browser.component.html
  • booklore-ui/src/app/features/series-browser/components/series-browser/series-browser.component.ts
  • booklore-ui/src/app/features/series-browser/service/series-data.service.ts
  • booklore-ui/src/app/features/series-browser/service/series-scale-preference.service.ts
  • booklore-ui/src/app/features/settings/custom-fonts/custom-fonts.component.ts
  • booklore-ui/src/app/features/settings/device-settings/component/hardcover-settings/hardcover-settings-component.ts
  • booklore-ui/src/app/features/settings/device-settings/component/kobo-sync-settings/kobo-sync-settings-component.ts
  • booklore-ui/src/app/features/settings/device-settings/component/koreader-settings/koreader-settings-component.ts
  • booklore-ui/src/app/features/settings/email-v2/email-v2.component.html
  • booklore-ui/src/app/features/settings/email-v2/email-v2.component.ts
  • booklore-ui/src/app/features/settings/file-naming-pattern/file-naming-pattern.component.ts
  • booklore-ui/src/app/features/settings/global-preferences/global-preferences.component.ts
  • booklore-ui/src/app/features/settings/global-preferences/metadata-match-weights/metadata-match-weights-component.ts
  • booklore-ui/src/app/features/settings/global-preferences/metadata-provider-settings/metadata-provider-settings.component.ts
  • booklore-ui/src/app/features/settings/library-metadata-settings/library-metadata-settings.component.html
  • booklore-ui/src/app/features/settings/library-metadata-settings/library-metadata-settings.component.ts
  • booklore-ui/src/app/features/settings/metadata-settings/metadata-persistence-settings/metadata-persistence-settings-component.ts
  • booklore-ui/src/app/features/settings/metadata-settings/metadata-settings-component.ts
  • booklore-ui/src/app/features/settings/metadata-settings/public-reviews-settings/public-reviews-settings-component.ts
  • booklore-ui/src/app/features/settings/opds-settings/opds-settings.ts
  • booklore-ui/src/app/features/settings/reader-preferences/epub-reader-preferences/epub-reader-preferences-component.ts
  • booklore-ui/src/app/features/settings/reader-preferences/reader-preferences.component.ts
  • booklore-ui/src/app/features/settings/reader-preferences/reader-preferences.service.ts
  • booklore-ui/src/app/features/settings/settings.component.html
  • booklore-ui/src/app/features/settings/settings.component.ts
  • booklore-ui/src/app/features/settings/user-management/content-restrictions-editor/content-restrictions-editor.component.ts
  • booklore-ui/src/app/features/settings/user-management/create-user-dialog/create-user-dialog.component.ts
  • booklore-ui/src/app/features/settings/user-management/user-management.component.ts
  • booklore-ui/src/app/features/settings/user-management/user-query-keys.ts
  • booklore-ui/src/app/features/settings/user-management/user.service.ts
  • booklore-ui/src/app/features/settings/user-profile-dialog/user-profile-dialog.component.ts
  • booklore-ui/src/app/features/settings/view-preferences-parent/filter-preferences/filter-preferences.component.ts
  • booklore-ui/src/app/features/settings/view-preferences-parent/meta-center-view-mode/meta-center-view-mode-component.ts
  • booklore-ui/src/app/features/settings/view-preferences-parent/sidebar-sorting-preferences/sidebar-sorting-preferences.component.ts
  • booklore-ui/src/app/features/settings/view-preferences-parent/view-preferences/view-preferences.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/author-universe-chart/author-universe-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/book-formats-chart/book-formats-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/book-formats-chart/book-formats-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/language-chart/language-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/language-chart/language-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/metadata-score-chart/metadata-score-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/metadata-score-chart/metadata-score-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/page-count-chart/page-count-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/page-count-chart/page-count-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/publication-timeline-chart/publication-timeline-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/publication-timeline-chart/publication-timeline-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/publication-trend-chart/publication-trend-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/publication-trend-chart/publication-trend-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/reading-journey-chart/reading-journey-chart.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/charts/reading-journey-chart/reading-journey-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/charts/top-items-chart/top-items-chart.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/library-stats.component.html
  • booklore-ui/src/app/features/stats/component/library-stats/library-stats.component.ts
  • booklore-ui/src/app/features/stats/component/library-stats/service/libraries-summary.service.ts
  • booklore-ui/src/app/features/stats/component/library-stats/service/library-filter.service.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/book-flow-chart/book-flow-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/book-length-chart/book-length-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/book-length-chart/book-length-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/personal-rating-chart/personal-rating-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/personal-rating-chart/personal-rating-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/publication-era-chart/publication-era-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/rating-taste-chart/rating-taste-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/rating-taste-chart/rating-taste-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/read-status-chart/read-status-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/read-status-chart/read-status-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-debt-chart/reading-debt-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-dna-chart/reading-dna-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-dna-chart/reading-dna-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-habits-chart/reading-habits-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-habits-chart/reading-habits-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-heatmap-chart/reading-heatmap-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-progress-chart/reading-progress-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-progress-chart/reading-progress-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-survival-chart/reading-survival-chart.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/charts/reading-survival-chart/reading-survival-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/charts/series-progress-chart/series-progress-chart.component.ts
  • booklore-ui/src/app/features/stats/component/user-stats/service/user-chart-config.service.ts
  • booklore-ui/src/app/features/stats/component/user-stats/user-stats.component.html
  • booklore-ui/src/app/features/stats/component/user-stats/user-stats.component.ts
  • booklore-ui/src/app/shared/components/book-uploader/book-uploader.component.html
  • booklore-ui/src/app/shared/components/book-uploader/book-uploader.component.ts
  • booklore-ui/src/app/shared/components/file-mover/file-mover-component.ts
  • booklore-ui/src/app/shared/components/login/login.component.ts
  • booklore-ui/src/app/shared/layout/component/layout-menu/app.menu.component.html
  • booklore-ui/src/app/shared/layout/component/layout-menu/app.menu.component.ts
  • booklore-ui/src/app/shared/layout/component/layout-menu/app.menuitem.component.html
  • booklore-ui/src/app/shared/layout/component/layout-menu/app.menuitem.component.ts
  • booklore-ui/src/app/shared/layout/component/layout-topbar/app.topbar.component.html
  • booklore-ui/src/app/shared/layout/component/layout-topbar/app.topbar.component.ts
  • booklore-ui/src/app/shared/service/app-settings-query-keys.ts
  • booklore-ui/src/app/shared/service/app-settings.service.ts
  • booklore-ui/src/app/shared/service/auth.service.ts
  • booklore-ui/src/app/shared/service/custom-font.service.ts
  • booklore-ui/src/app/shared/service/metadata-progress.service.ts
  • booklore-ui/src/app/shared/service/startup.service.ts
  • booklore-ui/src/app/shared/service/url-helper.service.ts
  • booklore-ui/src/main.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

CodeRabbit can generate a title for your PR based on the changes.

Add @coderabbitai placeholder anywhere in the title of your PR and CodeRabbit will replace it with a title based on the changes in the PR. You can change the placeholder by changing the reviews.auto_title_placeholder setting.

@balazs-szucs

balazs-szucs commented Mar 22, 2026

Copy link
Copy Markdown
Contributor

From what I can it is essentially the same pattern repeating again and again. So far I can't see anything obviously wrong, and since it's the same thing repeating, I think, even with the size this PR has, it won't be "hard" to test.

Net -1600 lines or so despite the new files and more robust data layer - Most frontend files have a simpler method of accessing data

Hell yeah! Any net negative of bloat/spaghetti code/boilerplate is a huge win.

@balazs-szucs balazs-szucs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only thing I was bit worried about was auth, but seems to working just fine.

I've clicking around for the past 1 hour or so, I think everything is really good here!

Thank you again!

@balazs-szucs balazs-szucs merged commit ef43185 into grimmory-tools:develop Mar 23, 2026
9 checks passed
@alexhb1 alexhb1 deleted the frontend/tsq-migration branch March 31, 2026 19:43
zachyale pushed a commit to zachyale/grimmory that referenced this pull request Apr 17, 2026
…ry-tools#117)

* refactor(frontend): migrate state to TanStack Query and signals

* fix(frontend): keep book cache in sync after patches
zachyale pushed a commit to zachyale/grimmory that referenced this pull request Apr 17, 2026
…ry-tools#117)

* refactor(frontend): migrate state to TanStack Query and signals

* fix(frontend): keep book cache in sync after patches
zachyale pushed a commit that referenced this pull request Apr 17, 2026
* refactor(frontend): migrate state to TanStack Query and signals

* fix(frontend): keep book cache in sync after patches
zachyale pushed a commit that referenced this pull request Apr 22, 2026
* refactor(frontend): migrate state to TanStack Query and signals

* fix(frontend): keep book cache in sync after patches
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants