authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-10-07 22:48:56-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-07 22:48:56-07:00
log6c1ce06996979fcfe120ec8c8cb4f78a5c8a7365
tree64ac3a951150688dc6a4ffb9cc9331b3353255f6
parent7873504964c3008ed2a87ada7be62d611e7a281a
signature Signed by PGP key B5690EEEBB952194

perf(mobile): skip impossible thread-key lookups (#16263)


1 files changed, 15 insertions(+), 6 deletions(-)

apps/mobile/src/features/threads/threadListV2.ts+15-6
......@@ -237,13 +237,15 @@ export function getThreadListV2OrderedSection(input: {
237237 readonly snoozeEnvironmentIds?: ReadonlySet<EnvironmentId>;
238238 readonly queuedThreadKeys?: ReadonlySet<string>;
239239}): EnvironmentThreadShell[] {
240 // An empty set is treated as absent so `?.` skips building the key.
241 const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined;
240242 const threads = input.threads.filter((thread) => {
241243 if (thread.archivedAt !== null || thread.lineage.relationshipToParent === "subagent")
242244 return false;
243245 if (
244246 (input.settlementEnvironmentIds?.has(thread.environmentId) ?? true) &&
245247 thread.settledOverride === "settled" &&
246 input.queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) !== true
248 queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) !== true
247249 ) {
248250 return false;
249251 }
......@@ -509,6 +511,8 @@ export function buildThreadListV2ListItems(input: {
509511 onto both shelf headers so the disabled state reaches recycled cells. */
510512 readonly shelfPreferencesLoading?: boolean;
511513}): ThreadListV2ListItem[] {
514 // An empty set is treated as absent so `?.` skips building the key.
515 const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined;
512516 const threadItems = input.items.map((item): ThreadListV2ListItem => {
513517 const snoozeWakeLabelText =
514518 item.snoozed && item.thread.snoozedUntil != null && input.snoozeLabelNow !== undefined
......@@ -539,7 +543,7 @@ export function buildThreadListV2ListItems(input: {
539543 snoozePresetMinute,
540544 showTrailingDivider: false,
541545 hasQueuedMessages:
542 input.queuedThreadKeys?.has(`${item.thread.environmentId}:${item.thread.id}`) === true,
546 queuedThreadKeys?.has(`${item.thread.environmentId}:${item.thread.id}`) === true,
543547 canMoveUp: move?.canMoveUp === true,
544548 canMoveDown: move?.canMoveDown === true,
545549 };
......@@ -675,6 +679,8 @@ export function buildThreadListV2Items(input: {
675679 const settled: EnvironmentThreadShell[] = [];
676680 const snoozed: EnvironmentThreadShell[] = [];
677681 let nextSnoozeWakeAt: string | null = null;
682 // An empty set is treated as absent so `?.` skips building the key.
683 const queuedThreadKeys = input.queuedThreadKeys?.size ? input.queuedThreadKeys : undefined;
678684 for (const thread of input.threads) {
679685 if (thread.archivedAt !== null || thread.lineage.relationshipToParent === "subagent") continue;
680686 // The server stamps settledOverride for the tail.
......@@ -712,7 +718,7 @@ export function buildThreadListV2Items(input: {
712718 continue;
713719 }
714720 const hasQueuedMessages =
715 input.queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) === true;
721 queuedThreadKeys?.has(`${thread.environmentId}:${thread.id}`) === true;
716722 if (supportsSettlement && thread.settledOverride === "settled" && !hasQueuedMessages) {
717723 settled.push(thread);
718724 } else if (thread.pinnedAt != null) {
......@@ -752,9 +758,12 @@ export function buildThreadListV2Items(input: {
752758 const settledLimit = input.settledLimit ?? Number.POSITIVE_INFINITY;
753759 const pagedSettled =
754760 orderedSettled.length > settledLimit ? orderedSettled.slice(0, settledLimit) : orderedSettled;
755 const selectedSettled = orderedSettled
756 .slice(pagedSettled.length)
757 .find((thread) => `${thread.environmentId}:${thread.id}` === selectedThreadKey);
761 const selectedSettled =
762 selectedThreadKey === null
763 ? undefined
764 : orderedSettled
765 .slice(pagedSettled.length)
766 .find((thread) => `${thread.environmentId}:${thread.id}` === selectedThreadKey);
758767 if (selectedSettled !== undefined) pagedSettled.push(selectedSettled);
759768 const visibleSettled =
760769 input.settledShelfExpanded !== false