From 668fe75bb103848e6584570291d9d5499d8def1a Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 01:47:03 +0530 Subject: [PATCH 1/8] fix(web): confirm before unpinning a thread Accidental unpin from the thread context menu moves the thread out of the pinned section with no way to undo. Show a confirmation dialog that names the thread and defaults to Cancel, matching the existing archive and delete patterns. Applied to both the Sidebar context menu and the chat header action menu. --- apps/web/src/components/Sidebar.tsx | 7 ++++++- apps/web/src/hooks/useThreadActionMenu.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index a88bc9ce4bb7..88e79ba8662e 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -3124,9 +3124,14 @@ export default function Sidebar() { case "pin": attemptPin(threadRef); return; - case "unpin": + case "unpin": { + const confirmed = await settlePromise(() => + api.dialogs.confirm(`Unpin thread "${thread.title}"?`), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; attemptUnpin(threadRef); return; + } case "rename": startThreadRename(threadRef, thread.title); return; diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index 91f31e4df1c3..1673d60e219d 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -215,9 +215,14 @@ export function useThreadActionMenu(input: { case "pin": await reportFailure("Failed to pin thread", () => pinThread(threadRef)); return; - case "unpin": + case "unpin": { + const confirmed = await settlePromise(() => + api.dialogs.confirm(`Unpin thread "${thread.title}"?`), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; await reportFailure("Failed to unpin thread", () => unpinThread(threadRef)); return; + } case "rename": onStartRename(); return; From 5a8f3d9a031f5ea3d129d222a2c40644cbe90e46 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 13:13:58 +0530 Subject: [PATCH 2/8] fix(web): add description to unpin confirmation dialog Matches the delete confirmation pattern by explaining the consequence: 'This will move the thread out of your pinned section.' --- apps/web/src/components/Sidebar.tsx | 7 ++++++- apps/web/src/hooks/useThreadActionMenu.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 88e79ba8662e..d228f8f3b1e8 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -3126,7 +3126,12 @@ export default function Sidebar() { return; case "unpin": { const confirmed = await settlePromise(() => - api.dialogs.confirm(`Unpin thread "${thread.title}"?`), + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), ); if (confirmed._tag === "Failure" || !confirmed.value) return; attemptUnpin(threadRef); diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index 1673d60e219d..5ce9b35b001c 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -217,7 +217,12 @@ export function useThreadActionMenu(input: { return; case "unpin": { const confirmed = await settlePromise(() => - api.dialogs.confirm(`Unpin thread "${thread.title}"?`), + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), ); if (confirmed._tag === "Failure" || !confirmed.value) return; await reportFailure("Failed to unpin thread", () => unpinThread(threadRef)); From f05305be3581612795bac5299c01b250dde5e4a6 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 13:24:30 +0530 Subject: [PATCH 3/8] fix(web): move unpin confirmation into attemptUnpin The confirmation was only in the context menu switch/case, leaving the pin icon click path uncovered. Move it into attemptUnpin so both the right-click context menu and the pin icon button are guarded. --- apps/web/src/components/Sidebar.tsx | 26 +++++++++++++---------- apps/web/src/hooks/useThreadActionMenu.ts | 12 +---------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index d228f8f3b1e8..58169c6046d6 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2640,6 +2640,20 @@ export default function Sidebar() { const attemptUnpin = useCallback( (threadRef: ScopedThreadRef) => { void (async () => { + const api = readLocalApi(); + const threadKey = scopedThreadKey(threadRef); + const thread = threadByKeyRef.current.get(threadKey); + if (api && thread) { + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; + } const result = await unpinThread(threadRef); if (result._tag === "Failure" && !isAtomCommandInterrupted(result)) { const error = squashAtomCommandFailure(result); @@ -3124,19 +3138,9 @@ export default function Sidebar() { case "pin": attemptPin(threadRef); return; - case "unpin": { - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; + case "unpin": attemptUnpin(threadRef); return; - } case "rename": startThreadRename(threadRef, thread.title); return; diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index 5ce9b35b001c..91f31e4df1c3 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -215,19 +215,9 @@ export function useThreadActionMenu(input: { case "pin": await reportFailure("Failed to pin thread", () => pinThread(threadRef)); return; - case "unpin": { - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; + case "unpin": await reportFailure("Failed to unpin thread", () => unpinThread(threadRef)); return; - } case "rename": onStartRename(); return; From 0f3fa0547fd1e9c7c3147ce303c310a7a0b20b82 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 14:37:02 +0530 Subject: [PATCH 4/8] fix(web): add unpin confirmation to chat header menu The chat header action menu called unpinThread directly without the confirmation dialog added to attemptUnpin. Apply the same guard here so both unpin paths are covered. --- apps/web/src/hooks/useThreadActionMenu.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index 91f31e4df1c3..5ce9b35b001c 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -215,9 +215,19 @@ export function useThreadActionMenu(input: { case "pin": await reportFailure("Failed to pin thread", () => pinThread(threadRef)); return; - case "unpin": + case "unpin": { + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; await reportFailure("Failed to unpin thread", () => unpinThread(threadRef)); return; + } case "rename": onStartRename(); return; From be8cf1a5023d5b0132723b5a023e1443af7bfbe2 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 14:59:12 +0530 Subject: [PATCH 5/8] feat(web): add confirmThreadUnpin settings toggle (off by default) --- .../settings/DesktopClientSettings.test.ts | 1 + apps/web/src/components/Sidebar.tsx | 31 ++++++++++--------- .../components/settings/SettingsPanels.tsx | 27 ++++++++++++++++ .../src/components/settings/settingsSearch.ts | 5 +++ apps/web/src/hooks/useThreadActionMenu.ts | 22 +++++++------ packages/contracts/src/settings.ts | 2 ++ 6 files changed, 65 insertions(+), 23 deletions(-) diff --git a/apps/desktop/src/settings/DesktopClientSettings.test.ts b/apps/desktop/src/settings/DesktopClientSettings.test.ts index 1c17d58215ea..0ee5bca8864d 100644 --- a/apps/desktop/src/settings/DesktopClientSettings.test.ts +++ b/apps/desktop/src/settings/DesktopClientSettings.test.ts @@ -20,6 +20,7 @@ const clientSettings: ClientSettings = { confirmQuit: true, confirmThreadArchive: true, confirmThreadDelete: false, + confirmThreadUnpin: false, dismissedProviderUpdateNotificationKeys: [], diffIgnoreWhitespace: true, environmentIdentificationMode: "artwork", diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 58169c6046d6..6d53d8ac3063 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -1711,6 +1711,7 @@ export default function Sidebar() { const autoSettleOnMerge = useClientSettings((s) => s.sidebarAutoSettleOnMerge); const confirmThreadDelete = useClientSettings((s) => s.confirmThreadDelete); const confirmThreadArchive = useClientSettings((s) => s.confirmThreadArchive); + const confirmThreadUnpin = useClientSettings((s) => s.confirmThreadUnpin); const sidebarProjectSortOrder = useClientSettings((s) => s.sidebarProjectSortOrder); const timestampFormat = useClientSettings((s) => s.timestampFormat); const projectGroupingSettings = useClientSettings(selectProjectGroupingSettings); @@ -2640,19 +2641,21 @@ export default function Sidebar() { const attemptUnpin = useCallback( (threadRef: ScopedThreadRef) => { void (async () => { - const api = readLocalApi(); - const threadKey = scopedThreadKey(threadRef); - const thread = threadByKeyRef.current.get(threadKey); - if (api && thread) { - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; + if (confirmThreadUnpin) { + const api = readLocalApi(); + const threadKey = scopedThreadKey(threadRef); + const thread = threadByKeyRef.current.get(threadKey); + if (api && thread) { + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; + } } const result = await unpinThread(threadRef); if (result._tag === "Failure" && !isAtomCommandInterrupted(result)) { @@ -2667,7 +2670,7 @@ export default function Sidebar() { } })(); }, - [unpinThread], + [confirmThreadUnpin, unpinThread], ); const handlePinnedDragEnd = useCallback( diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 9539f95914cb..7e4319e793ae 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -658,6 +658,7 @@ export function useSettingsRestore(onRestored?: () => void) { addProjectBaseDirectory: DEFAULT_UNIFIED_SETTINGS.addProjectBaseDirectory, confirmThreadArchive: DEFAULT_UNIFIED_SETTINGS.confirmThreadArchive, confirmThreadDelete: DEFAULT_UNIFIED_SETTINGS.confirmThreadDelete, + confirmThreadUnpin: DEFAULT_UNIFIED_SETTINGS.confirmThreadUnpin, confirmQuit: DEFAULT_UNIFIED_SETTINGS.confirmQuit, textGenerationModelSelection: DEFAULT_UNIFIED_SETTINGS.textGenerationModelSelection, fontFamilySans: DEFAULT_UNIFIED_SETTINGS.fontFamilySans, @@ -2279,6 +2280,32 @@ export function GeneralSettingsPanel() { } /> + + updateSettings({ + confirmThreadUnpin: DEFAULT_UNIFIED_SETTINGS.confirmThreadUnpin, + }) + } + /> + ) : null + } + control={ + + updateSettings({ confirmThreadUnpin: Boolean(checked) }) + } + aria-label="Confirm thread unpinning" + /> + } + /> + {isElectron ? ( s.sidebarAutoSettleOnMerge); const confirmThreadDelete = useClientSettings((s) => s.confirmThreadDelete); const confirmThreadArchive = useClientSettings((s) => s.confirmThreadArchive); + const confirmThreadUnpin = useClientSettings((s) => s.confirmThreadUnpin); const timestampFormat = useClientSettings((s) => s.timestampFormat); const { copyToClipboard: copyPathToClipboard } = useCopyToClipboard<{ path: string }>({ onCopy: ({ path }) => { @@ -216,15 +217,17 @@ export function useThreadActionMenu(input: { await reportFailure("Failed to pin thread", () => pinThread(threadRef)); return; case "unpin": { - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; + if (confirmThreadUnpin) { + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; + } await reportFailure("Failed to unpin thread", () => unpinThread(threadRef)); return; } @@ -325,6 +328,7 @@ export function useThreadActionMenu(input: { changeRequest, confirmThreadArchive, confirmThreadDelete, + confirmThreadUnpin, copyBranchToClipboard, copyPathToClipboard, copyThreadIdToClipboard, diff --git a/packages/contracts/src/settings.ts b/packages/contracts/src/settings.ts index 0502d303d249..21841492b13c 100644 --- a/packages/contracts/src/settings.ts +++ b/packages/contracts/src/settings.ts @@ -156,6 +156,7 @@ export const ClientSettingsSchema = Schema.Struct({ confirmQuit: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(true))), confirmThreadArchive: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), confirmThreadDelete: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(true))), + confirmThreadUnpin: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), dismissedProviderUpdateNotificationKeys: Schema.Array(TrimmedNonEmptyString).pipe( Schema.withDecodingDefault(Effect.succeed([])), ), @@ -867,6 +868,7 @@ export const ClientSettingsPatch = Schema.Struct({ confirmQuit: Schema.optionalKey(Schema.Boolean), confirmThreadArchive: Schema.optionalKey(Schema.Boolean), confirmThreadDelete: Schema.optionalKey(Schema.Boolean), + confirmThreadUnpin: Schema.optionalKey(Schema.Boolean), diffIgnoreWhitespace: Schema.optionalKey(Schema.Boolean), environmentIdentificationMode: Schema.optionalKey(EnvironmentIdentificationMode), glassOpacity: Schema.optionalKey(GlassOpacity), From 8e161d8a0eee217da2e55d07b4ea439655fbc799 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 15:06:18 +0530 Subject: [PATCH 6/8] fix(web): reorder unpin confirmation toggle above archive --- .../components/settings/SettingsPanels.tsx | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 7e4319e793ae..e11c9f7ddc2a 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -2229,15 +2229,15 @@ export function GeneralSettingsPanel() { /> updateSettings({ - confirmThreadArchive: DEFAULT_UNIFIED_SETTINGS.confirmThreadArchive, + confirmThreadUnpin: DEFAULT_UNIFIED_SETTINGS.confirmThreadUnpin, }) } /> @@ -2245,25 +2245,25 @@ export function GeneralSettingsPanel() { } control={ - updateSettings({ confirmThreadArchive: Boolean(checked) }) + updateSettings({ confirmThreadUnpin: Boolean(checked) }) } - aria-label="Confirm thread archiving" + aria-label="Confirm thread unpinning" /> } /> updateSettings({ - confirmThreadDelete: DEFAULT_UNIFIED_SETTINGS.confirmThreadDelete, + confirmThreadArchive: DEFAULT_UNIFIED_SETTINGS.confirmThreadArchive, }) } /> @@ -2271,25 +2271,25 @@ export function GeneralSettingsPanel() { } control={ - updateSettings({ confirmThreadDelete: Boolean(checked) }) + updateSettings({ confirmThreadArchive: Boolean(checked) }) } - aria-label="Confirm thread deletion" + aria-label="Confirm thread archiving" /> } /> updateSettings({ - confirmThreadUnpin: DEFAULT_UNIFIED_SETTINGS.confirmThreadUnpin, + confirmThreadDelete: DEFAULT_UNIFIED_SETTINGS.confirmThreadDelete, }) } /> @@ -2297,11 +2297,11 @@ export function GeneralSettingsPanel() { } control={ - updateSettings({ confirmThreadUnpin: Boolean(checked) }) + updateSettings({ confirmThreadDelete: Boolean(checked) }) } - aria-label="Confirm thread unpinning" + aria-label="Confirm thread deletion" /> } /> From fd5028ecb424fb4ec2ad46f9ed4ddcc52ad2135b Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Mon, 17 Aug 2026 15:37:59 +0530 Subject: [PATCH 7/8] fix(web): address review feedback for unpin confirmation - Return early when confirmThreadUnpin is enabled but thread/API lookup fails (prevents bypassing the confirmation on stale context menus) - Add confirmThreadUnpin to changedSettingLabels so Restore defaults button enables and the confirmation dialog lists it when dirty - Add settings.confirmThreadUnpin to memo dependency array --- apps/web/src/components/Sidebar.tsx | 21 +++++++++---------- .../components/settings/SettingsPanels.tsx | 4 ++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 6d53d8ac3063..4e431eeca31d 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2645,17 +2645,16 @@ export default function Sidebar() { const api = readLocalApi(); const threadKey = scopedThreadKey(threadRef); const thread = threadByKeyRef.current.get(threadKey); - if (api && thread) { - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; - } + if (!api || !thread) return; + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread.title}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; } const result = await unpinThread(threadRef); if (result._tag === "Failure" && !isAtomCommandInterrupted(result)) { diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index e11c9f7ddc2a..154782fc0e3a 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -527,6 +527,9 @@ export function useSettingsRestore(onRestored?: () => void) { ...(settings.confirmThreadDelete !== DEFAULT_UNIFIED_SETTINGS.confirmThreadDelete ? ["Delete confirmation"] : []), + ...(settings.confirmThreadUnpin !== DEFAULT_UNIFIED_SETTINGS.confirmThreadUnpin + ? ["Unpin confirmation"] + : []), ...(settings.confirmQuit !== DEFAULT_UNIFIED_SETTINGS.confirmQuit ? ["Quit confirmation"] : []), @@ -547,6 +550,7 @@ export function useSettingsRestore(onRestored?: () => void) { settings.confirmQuit, settings.confirmThreadArchive, settings.confirmThreadDelete, + settings.confirmThreadUnpin, settings.addProjectBaseDirectory, settings.defaultThreadEnvMode, settings.newWorktreesStartFromOrigin, From af7a94cd9579f36029818f29ca6ea31d461c2555 Mon Sep 17 00:00:00 2001 From: UtkarshUsername Date: Fri, 21 Aug 2026 14:10:53 +0530 Subject: [PATCH 8/8] fix(web): degrade unpin confirmation gracefully and align search order - Skip only the dialog when local api is unavailable; fall back to a generic title when the thread lookup misses, so the confirmation setting can never swallow the unpin action (matches confirmAndDeleteThread) - Move unpin-confirmation catalog entry above archive-confirmation so settings search results match rendered row order --- apps/web/src/components/Sidebar.tsx | 24 +++++++++---------- .../src/components/settings/settingsSearch.ts | 10 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 4e431eeca31d..622e8f32413b 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2643,18 +2643,18 @@ export default function Sidebar() { void (async () => { if (confirmThreadUnpin) { const api = readLocalApi(); - const threadKey = scopedThreadKey(threadRef); - const thread = threadByKeyRef.current.get(threadKey); - if (!api || !thread) return; - const confirmed = await settlePromise(() => - api.dialogs.confirm( - [ - `Unpin thread "${thread.title}"?`, - "This will move the thread out of your pinned section.", - ].join("\n"), - ), - ); - if (confirmed._tag === "Failure" || !confirmed.value) return; + const thread = threadByKeyRef.current.get(scopedThreadKey(threadRef)); + if (api) { + const confirmed = await settlePromise(() => + api.dialogs.confirm( + [ + `Unpin thread "${thread?.title ?? "this thread"}"?`, + "This will move the thread out of your pinned section.", + ].join("\n"), + ), + ); + if (confirmed._tag === "Failure" || !confirmed.value) return; + } } const result = await unpinThread(threadRef); if (result._tag === "Failure" && !isAtomCommandInterrupted(result)) { diff --git a/apps/web/src/components/settings/settingsSearch.ts b/apps/web/src/components/settings/settingsSearch.ts index 21556a09f928..7db5a309decf 100644 --- a/apps/web/src/components/settings/settingsSearch.ts +++ b/apps/web/src/components/settings/settingsSearch.ts @@ -146,6 +146,11 @@ export const SETTINGS_SEARCH_ITEMS = [ title: "Add project starts in", to: "/settings/general", }, + { + id: "unpin-confirmation", + title: "Unpin confirmation", + to: "/settings/general", + }, { id: "archive-confirmation", title: "Archive confirmation", @@ -156,11 +161,6 @@ export const SETTINGS_SEARCH_ITEMS = [ title: "Delete confirmation", to: "/settings/general", }, - { - id: "unpin-confirmation", - title: "Unpin confirmation", - to: "/settings/general", - }, { id: "quit-confirmation", title: "Hold to quit",