Repository navigation
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: efe28ea204
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const r = await store.get($("account").value); | ||
| if (r) setData(r.data, "已读取插件本地存档"); |
There was a problem hiding this comment.
When a user switches accounts again before the first IndexedDB read completes, the older choose() call can resolve last and pass the wrong archive to setData(). This is especially plausible when switching from a large archive to a smaller one, and leaves the selector naming one account while the results—and export button—operate on another account's bookmarks. Capture the selected key before awaiting and discard the result if the selection has since changed.
Useful? React with 👍 / 👎.
| const r = await store.get($("account").value); | ||
| if (r) setData(r.data, "已读取插件本地存档"); |
There was a problem hiding this comment.
Keep the imported preview selectable
After importing a file, switching to a saved account and then selecting the still-visible “导入文件” option calls store.get("file"). No such IndexedDB record exists, so r is null and the saved account remains displayed even though the selector says the imported file is active. Retain the imported data for this option or remove the option when navigating away.
Useful? React with 👍 / 👎.
| for (const b of all) | ||
| for (const f of new Set(b.folders || [])) | ||
| counts.set(f, (counts.get(f) || 0) + 1); |
There was a problem hiding this comment.
For archives containing distinct folder IDs with the same display name, counting folders by b.folders collapses them into one entry, and the corresponding name-based filter returns bookmarks from both folders. The archive format already preserves folders[].id and each bookmark's folder_ids, so the library should build and filter folder entries using those IDs; this also avoids confusing a real folder named __unsorted with the synthetic unfiled entry.
Useful? React with 👍 / 👎.
Problem and behavior
Searching a large bookmark collection needs more reading space than an extension popup or side panel. This adds a full-page library with a searchable table or card grid and an adjacent full-text/media preview. Clicking the extension toolbar icon opens the library; collection and backup remain accessible through a link to the existing options page.
The library reads existing cumulative archives directly through
ArchiveStore, so users can browse their collected bookmarks without downloading and re-importing JSON. It also accepts xarchive JSON as a read-only, non-persistent preview without overwriting saved archives.Included
No new permissions, remote services, dependencies, or build step. The standalone viewer and existing archive/collection logic remain intact. This initial UI is Simplified Chinese; English localization is not included. Media still depends on the archived remote URLs being available.
Validation
node --test tests/*.test.mjs: 68 passing tests, including new search/filter/sorting and URL/HTML-safety checks.node --check library.jsandgit diff --checkpassed."Claude Code"), result selection/full-text preview, card view, and refresh retaining the archive.