feat: offline search — SwiftUI feature layer - #229
Open
danieltmbr wants to merge 3 commits into
Open
Conversation
6 tasks
danieltmbr
force-pushed
the
feat/search-native-ui
branch
from
July 6, 2026 15:23
f562be8 to
807b86b
Compare
danieltmbr
force-pushed
the
feat/search-native-ui
branch
from
July 7, 2026 07:09
807b86b to
a1bdb45
Compare
5 tasks
danieltmbr
force-pushed
the
feat/search-native-ui
branch
2 times, most recently
from
July 7, 2026 10:32
6b5bd0a to
3d5e278
Compare
- Per-tab .searchable bars on Blog, Catalogue, and Quotes — each filters only its own content, respecting active language/category/source filters - Dedicated Search tab with sectioned results (Posts / Catalogue / Quotes) and a scope bar; catalogue section shows note-body snippets - CatalogueSearchEngine: @observable engine that drives catalogue results via CatalogueStore.search; needed because @query can't cross the PreviewRecord→NoteRecord UUID link - BlogSearchAction / CatalogueSearchAction / QuotesSearchAction: environment- injected seams; local predicate query runs first for instant results, then the network search upserts and triggers a second local pass - Detail section fix: typed sections (Song/Album/Book/…) now accept item: PreviewRecord and coalesce typed+preview fields so a half-materialised item shows a header immediately; .task fires a single-item fetch on appear when the typed record is absent Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…list views Wire up the paginated backend endpoints from the previous commit into the native app: - Blog/Quotes/Catalogue: run local search immediately on keystroke (flash fix); network fetch debounced 300 ms; re-run local after upsert to surface new results - CatalogueModel/QuotesModel/BlogModel: add loadMore() + isLoadingMore + hasMore state; loadMoreRevision counter lets CatalogueSearchEngine re-run after network upserts - CataloguePageLoadAction / QuotesPageLoadAction: environment-injected load-more seams - ReaderCatalogue / ReaderQuotes: cursor-tracking coordinators that thread nextCursor across search() and loadMore() calls against the paginated API endpoints - Unified list views per tab: single @Query-based browse list + search-engine-driven results list, each with a load-more cell and status line - ReaderApp: wire all three tabs to the paginated loaders Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…match PostsLoader pattern Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
danieltmbr
force-pushed
the
feat/search-native-ui
branch
from
July 7, 2026 10:36
3d5e278 to
28b5b23
Compare
This was referenced Jul 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stacks on #228 (persistence & networking layer).
.searchablebars on Blog, Catalogue, and Quotes — each filters only its own content, respecting active language/category/source filtersCatalogueSearchEngine:@MainActor @Observableengine that drives catalogue results viaCatalogueStore.search; needed because@Querycan't follow thePreviewRecord→NoteRecordUUID linkBlogSearchAction/CatalogueSearchAction/QuotesSearchAction: environment-injected seams — local predicate query runs first for instant cached results, then the network search upserts new data and triggers a second local passSong/Album/Book/Movie/Podcast/Playlist) now acceptitem: PreviewRecordand coalesce typed + preview fields so a half-materialised item (preview exists, typed record not yet cached) renders a header immediately;.taskfires a single-item fetch on appear when the typed record is absentTest plan
app-coreand Reader target🤖 Generated with Claude Code