Skip to content

Settings → Extensions: add a dedicated "Installed" tab to uninstall/update - #154

Merged
DianaSensei merged 1 commit into
mainfrom
settings-extensions-installed-tab
Sep 18, 2026
Merged

DianaSensei merged 1 commit into
mainfrom
settings-extensions-installed-tab

Conversation

@DianaSensei

Copy link
Copy Markdown
Owner

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.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.

Changes

  • Extracted the installed-list logic (state, uninstall/update/check-for-update actions, the service confirm-before-uninstall flow) into a new SettingsInstalledExtensions.tsx component.
  • Gave it its own top-level tab ("Đã cài" / "Installed") 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.
  • Added the settings.extensions.tabs.installed i18n 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 --noEmit
  • vitest run — 1379/1379 passing

🤖 Generated with Claude Code

https://claude.ai/code/session_01BCypCuViyQDKGWxWspXKs2


Generated by Claude Code

…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.
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
15.4% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@codecov

codecov Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 54.90196% with 46 lines in your changes missing coverage. Please review.
✅ Project coverage is 42.10%. Comparing base (e6808d1) to head (0be087b).

Files with missing lines Patch % Lines
src/components/SettingsInstalledExtensions.tsx 56.12% 36 Missing and 7 partials ⚠️
src/components/SettingsExtensions.tsx 25.00% 2 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@            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     
Flag Coverage Δ
frontend 37.24% <54.90%> (+0.03%) ⬆️
rust 65.43% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/components/SettingsExtensionInstaller.tsx 87.14% <ø> (+20.47%) ⬆️
src/lib/i18n.ts 81.81% <ø> (ø)
src/components/SettingsExtensions.tsx 75.00% <25.00%> (-5.00%) ⬇️
src/components/SettingsInstalledExtensions.tsx 56.12% <56.12%> (ø)

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ℹ️ No critical issues — minor suggestions inline.

Reviewed changes

  • New Installed tab: SettingsExtensions.tsx gains a third tab and renders the new SettingsInstalledExtensions component for it, so the uninstall/update list is reachable no matter which tab was used to install.
  • Extracted installed-list component: SettingsInstalledExtensions.tsx takes the installed-list state, uninstall/update/check-update actions, and the service confirm-before-uninstall flow verbatim from SettingsExtensionInstaller.tsx.
  • Slimmed installer: SettingsExtensionInstaller.tsx now holds only the install-from-URL form (its own restart banner kept); it no longer reads listInstalledArtifacts on mount or consumes ExtensionUpdateContext.
  • 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 to SettingsExtensionInstaller.tsx.
  • src/platform/installer.ts:334, :449, :465 — say recordKey is used in SettingsExtensionInstaller.tsx.
  • src/lib/pendingInstall.ts:49 — "chưa xác nhận cài xong ở SettingsExtensionInstaller"; the confirmation now happens in ExtensionInstallDialog/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 →

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

};

return (
<div className="space-y-3">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

Comment on lines +32 to +33
* 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 đó).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

@DianaSensei
DianaSensei merged commit 61eb03f into main Sep 18, 2026
20 of 21 checks passed
@DianaSensei
DianaSensei deleted the settings-extensions-installed-tab branch September 18, 2026 09:29
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