Settings → Extensions: add a dedicated "Installed" tab to uninstall/update - #154
Conversation
…pdate There was no visible way to uninstall an already-installed extension unless you happened to be on the "Install by URL" tab — the uninstall/update list existed (SettingsExtensionInstaller.tsx already had full logic for it) but was rendered only at the bottom of that one tab. Someone who installed via the Marketplace tab had no path to ever find it. Extracted that list (state, uninstall/update/check-for-update actions, the service confirm-before-uninstall flow) into a new SettingsInstalledExtensions component and gave it its own top-level tab in SettingsExtensions.tsx, alongside Marketplace and Install by URL — visible regardless of which tab was used to install something. SettingsExtensionInstaller.tsx now only holds the "install from URL" form; its own restart-needed banner still shows right after installing from that tab. Moved the corresponding tests to SettingsInstalledExtensions.test.tsx and trimmed SettingsExtensionInstaller.test.tsx to just the preview/install flow. This branch is fresh off main (#153 already merged) rather than continuing on top of it, per policy for a designated branch whose PR has landed.
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #154 +/- ##
==========================================
+ Coverage 42.08% 42.10% +0.02%
==========================================
Files 299 300 +1
Lines 19864 19874 +10
Branches 4909 4912 +3
==========================================
+ Hits 8359 8368 +9
- Misses 10508 10510 +2
+ Partials 997 996 -1
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
ℹ️ No critical issues — minor suggestions inline.
Reviewed changes
- New
Installedtab:SettingsExtensions.tsxgains a third tab and renders the newSettingsInstalledExtensionscomponent for it, so the uninstall/update list is reachable no matter which tab was used to install. - Extracted installed-list component:
SettingsInstalledExtensions.tsxtakes the installed-list state, uninstall/update/check-update actions, and the service confirm-before-uninstall flow verbatim fromSettingsExtensionInstaller.tsx. - Slimmed installer:
SettingsExtensionInstaller.tsxnow holds only the install-from-URL form (its own restart banner kept); it no longer readslistInstalledArtifactson mount or consumesExtensionUpdateContext. - Tests split: installed-list tests moved to
SettingsInstalledExtensions.test.tsx; installer tests trimmed to the preview/install flow. - i18n: added
settings.extensions.tabs.installed(vi/en).
ℹ️ Stale pointers to the moved list logic
Several comments still direct readers to SettingsExtensionInstaller.tsx for logic that now lives in SettingsInstalledExtensions.tsx or ExtensionInstallDialog. They are comment-only, but each one now sends the next reader to the wrong file.
src/contexts/ExtensionUpdateContext.tsx:11— attributes the per-row "Update" button toSettingsExtensionInstaller.tsx.src/platform/installer.ts:334,:449,:465— sayrecordKeyis used inSettingsExtensionInstaller.tsx.src/lib/pendingInstall.ts:49— "chưa xác nhận cài xong ởSettingsExtensionInstaller"; the confirmation now happens inExtensionInstallDialog/SettingsExtensions.src/lib/deepLink.ts:3,:14— attribute the preview/confirm step to the installer.docs/decisions/architecture/platform-plugin-architecture.md:501— attributes the service confirm flow to the installer.
Technical details
# Stale references after the installed-list extraction
## Affected sites
- src/contexts/ExtensionUpdateContext.tsx:11 — per-row "Update" button now in SettingsInstalledExtensions.tsx
- src/platform/installer.ts:334, :449, :465 — recordKey UI consumer moved
- src/lib/pendingInstall.ts:49 — confirm step now ExtensionInstallDialog
- src/lib/deepLink.ts:3, :14 — confirm step attribution
- docs/decisions/architecture/platform-plugin-architecture.md:501 — service confirm flow attribution
## Required outcome
- Comments/docs point at the file that currently owns the logic, or the references are dropped where they describe historical state only.Important
Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →
DeepSeek Flash (model usage covered by Pullfrog) | 𝕏
| }; | ||
|
|
||
| return ( | ||
| <div className="space-y-3"> |
There was a problem hiding this comment.
The old list opened with a settings.extensions.installed.title header, and the sibling Marketplace/Install-by-URL tabs still each open with a title, but this extraction dropped it — leaving that key orphaned at src/lib/i18n.ts:280. Either restore a small header here for consistency or delete the now-unused key.
| * khởi động lại/gọi lại — cài xong vì vậy chỉ bật cờ "cần khởi động lại" | ||
| * (hiện ở tab Đã cài, nơi người dùng sẽ thấy ngay sau khi chuyển qua đó). |
There was a problem hiding this comment.
This comment says the restart flag surfaces in the Installed tab, but the installer still renders its own needsRestart banner below (lines 203-215), so the two read as contradictory. Consider rephrasing to note the flag shows in place on this tab as well as in the Installed tab.



Summary
There was no visible way to uninstall an already-installed extension unless you happened to be on the "Install by URL" tab — the uninstall/update list existed (
SettingsExtensionInstaller.tsxalready had full logic for it) but was rendered only at the bottom of that one tab. Someone who installed via the Marketplace tab had no path to ever find it.Changes
SettingsInstalledExtensions.tsxcomponent.SettingsExtensions.tsx, alongside Marketplace and Install by URL — visible regardless of which tab was used to install something.SettingsExtensionInstaller.tsxnow only holds the "install from URL" form; its own restart-needed banner still shows right after installing from that tab.SettingsInstalledExtensions.test.tsxand trimmedSettingsExtensionInstaller.test.tsxto just the preview/install flow.settings.extensions.tabs.installedi18n key (vi/en).This branch is fresh off
main(#153 already merged) rather than continuing on top of it, per policy for a designated branch whose PR has landed.Test plan
tsc --noEmitvitest run— 1379/1379 passing🤖 Generated with Claude Code
https://claude.ai/code/session_01BCypCuViyQDKGWxWspXKs2
Generated by Claude Code