Hide browser shortcuts outside the desktop app (#2116)

* fix: hide browser pin on non-Electron web

Browser is desktop-only, but the pinned shortcut bar still rendered a
New browser pin on web where createBrowser is a silent no-op.

Skip browser pins in usePinnedLaunchers when not Electron, and drop
browser from default pinned targets so new users only get terminal.

* fix(app): preserve browser pin defaults on desktop

Keep platform availability in the pinned-target policy so regular web hides browser shortcuts without changing Electron defaults.

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
Jason@HND
2026-07-16 21:36:20 +09:00
committed by GitHub
parent 47532952f3
commit 3e8dce7d7c
3 changed files with 41 additions and 2 deletions

View File

@@ -7,9 +7,14 @@ import {
resolveTerminalProfiles, resolveTerminalProfiles,
} from "@getpaseo/protocol/terminal-profiles"; } from "@getpaseo/protocol/terminal-profiles";
import { getProviderIcon } from "@/components/provider-icons"; import { getProviderIcon } from "@/components/provider-icons";
import { getIsElectron } from "@/constants/platform";
import { useDaemonConfig } from "@/hooks/use-daemon-config"; import { useDaemonConfig } from "@/hooks/use-daemon-config";
import type { Theme } from "@/styles/theme"; import type { Theme } from "@/styles/theme";
import { pinnedTargetKey, type PinnedTabTarget } from "@/workspace-pins/target"; import {
isPinnedTargetAvailable,
pinnedTargetKey,
type PinnedTabTarget,
} from "@/workspace-pins/target";
import { usePinnedTargetsStore } from "@/workspace-pins/store"; import { usePinnedTargetsStore } from "@/workspace-pins/store";
export interface ResolvedPin { export interface ResolvedPin {
@@ -64,6 +69,9 @@ export function usePinnedLaunchers({ serverId, onLaunch }: UsePinnedLaunchersInp
return useMemo(() => { return useMemo(() => {
const resolved: ResolvedPin[] = []; const resolved: ResolvedPin[] = [];
for (const target of pinned) { for (const target of pinned) {
if (!isPinnedTargetAvailable(target, { isElectron: getIsElectron() })) {
continue;
}
if (target.kind === "draft") { if (target.kind === "draft") {
resolved.push({ resolved.push({
key: pinnedTargetKey(target), key: pinnedTargetKey(target),

View File

@@ -1,5 +1,29 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { isTargetPinned, pinnedTargetKey, togglePinnedTarget } from "./target"; import {
isPinnedTargetAvailable,
isTargetPinned,
pinnedTargetKey,
togglePinnedTarget,
} from "./target";
describe("isPinnedTargetAvailable", () => {
it("only offers browser targets in Electron", () => {
const browser = { kind: "browser" } as const;
expect(isPinnedTargetAvailable(browser, { isElectron: true })).toBe(true);
expect(isPinnedTargetAvailable(browser, { isElectron: false })).toBe(false);
});
it("offers cross-platform targets outside Electron", () => {
const environment = { isElectron: false };
expect(isPinnedTargetAvailable({ kind: "draft" }, environment)).toBe(true);
expect(isPinnedTargetAvailable({ kind: "terminal" }, environment)).toBe(true);
expect(isPinnedTargetAvailable({ kind: "profile", profileId: "claude" }, environment)).toBe(
true,
);
});
});
describe("pinnedTargetKey", () => { describe("pinnedTargetKey", () => {
it("uses the bare kind as the key for non-profile targets", () => { it("uses the bare kind as the key for non-profile targets", () => {

View File

@@ -4,6 +4,13 @@ export type PinnedTabTarget =
| { kind: "browser" } | { kind: "browser" }
| { kind: "profile"; profileId: string }; | { kind: "profile"; profileId: string };
export function isPinnedTargetAvailable(
target: PinnedTabTarget,
environment: { isElectron: boolean },
): boolean {
return target.kind !== "browser" || environment.isElectron;
}
export function pinnedTargetKey(target: PinnedTabTarget): string { export function pinnedTargetKey(target: PinnedTabTarget): string {
if (target.kind === "profile") { if (target.kind === "profile") {
return `profile:${target.profileId}`; return `profile:${target.profileId}`;