authorgravatar for jakeleventhal@me.comJake Leventhal <jakeleventhal@me.com> 2026-09-18 01:24:56-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-18 02:24:56-03:00
log7a2cce826852c3a3255d7c7aa1e9c148287eba2c
treeb4d9c48f68c88834f6981e2fb323ba98fbcaab6e
parent818add08fcd73942f1f05edacc23f4019c146eeb
signature Signed by PGP key B5690EEEBB952194

feat(mobile): add copy thread ID to thread list actions (#12228)


2 files changed, 10 insertions(+), 0 deletions(-)

apps/mobile/src/features/threads/thread-list-items.tsx+5
......@@ -18,6 +18,7 @@ import { ControlPillMenu } from "../../components/ControlPill";
1818import { EnvironmentMachineSymbol } from "../../components/EnvironmentMachineSymbol";
1919import { ProjectFavicon } from "../../components/ProjectFavicon";
2020import { cn } from "../../lib/cn";
21import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2122import { HOME_HORIZONTAL_INSET } from "../../lib/layoutMetrics";
2223import { relativeTime } from "../../lib/time";
2324import { useUniwindTheme } from "../../lib/useUniwindTheme";
......@@ -547,6 +548,7 @@ export const ThreadListRow = memo(function ThreadListRow(props: {
547548 : []),
548549 THREAD_ROW_MENU_ACTIONS[0]!,
549550 THREAD_ROW_MENU_ACTIONS[1]!,
551 { id: "copy-thread-id", title: "Copy thread ID", image: "doc.on.doc" },
550552 ...buildThreadTitleRegenerationMenuItems({
551553 supported: props.titleRegenerationSupported,
552554 isRegenerating: thread.titleRegeneration != null,
......@@ -569,6 +571,9 @@ export const ThreadListRow = memo(function ThreadListRow(props: {
569571 if (nativeEvent.event === "new-thread-on-branch") onNewThreadOnBranch(thread);
570572 if (nativeEvent.event === "archive") handleArchive();
571573 if (nativeEvent.event === "rename") handleRename();
574 if (nativeEvent.event === "copy-thread-id") {
575 copyTextWithHaptic(thread.id, { target: "thread-id" });
576 }
572577 if (nativeEvent.event === "regenerate-title") handleRegenerateTitle();
573578 if (nativeEvent.event === "delete") handleDelete();
574579 },
apps/mobile/src/features/threads/thread-list-v2-items.tsx+5
......@@ -24,6 +24,7 @@ import { ProjectFavicon } from "../../components/ProjectFavicon";
2424import { ProviderInstanceIcon } from "../../components/ProviderIcon";
2525import type { ThreadRowProviderInstance } from "./thread-provider-instance";
2626import { cn } from "../../lib/cn";
27import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2728import { relativeTime } from "../../lib/time";
2829import { useUniwindTheme } from "../../lib/useUniwindTheme";
2930import type { PendingNewTask } from "../../state/use-pending-new-tasks";
......@@ -670,6 +671,9 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: {
670671 if (nativeEvent.event === "archive") handleArchive();
671672 if (nativeEvent.event === "rename") handleRename();
672673 if (nativeEvent.event === "regenerate-title") handleRegenerateTitle();
674 if (nativeEvent.event === "copy-thread-id") {
675 copyTextWithHaptic(thread.id, { target: "thread-id" });
676 }
673677 if (nativeEvent.event === "delete") handleDelete();
674678 if (nativeEvent.event === "snooze:custom") {
675679 setCustomSnoozeOpen(true);
......@@ -1165,6 +1169,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: {
11651169 },
11661170 ]
11671171 : []),
1172 { id: "copy-thread-id", title: "Copy thread ID", image: "doc.on.doc" },
11681173 ...(snoozedRow
11691174 ? snoozedMenuActions
11701175 : !props.settlementSupported