11import { Text } from "@components/text" ;
2+ import type {
3+ CloudTaskQueuedMessage ,
4+ CloudTaskQueueMoveDirection ,
5+ } from "@posthog/core/sessions/cloudTaskQueue" ;
26import { useQueryClient } from "@tanstack/react-query" ;
37import * as Haptics from "expo-haptics" ;
48import { useLocalSearchParams , useRouter } from "expo-router" ;
@@ -39,17 +43,18 @@ import {
3943 useQueuedCount ,
4044 useToggleMessagingMode ,
4145} from "@/features/tasks/hooks/useMessagingMode" ;
46+ import { useTaskMessageQueue } from "@/features/tasks/hooks/useTaskMessageQueue" ;
4247import { taskKeys } from "@/features/tasks/hooks/useTasks" ;
43- import {
44- type MoveDirection ,
45- type QueuedMessage ,
46- useMessageQueueStore ,
47- } from "@/features/tasks/stores/messageQueueStore" ;
48+ import { taskMessageQueue } from "@/features/tasks/lib/taskMessageQueue" ;
49+ import { taskSessionActions } from "@/features/tasks/services/taskSessionService" ;
4850import {
4951 pendingTaskPromptStoreApi ,
5052 usePendingTaskPrompt ,
5153} from "@/features/tasks/stores/pendingTaskPromptStore" ;
52- import { useTaskSessionStore } from "@/features/tasks/stores/taskSessionStore" ;
54+ import {
55+ getTaskSession ,
56+ useTaskSessionStore ,
57+ } from "@/features/tasks/stores/taskSessionStore" ;
5358import { useTaskStore } from "@/features/tasks/stores/taskStore" ;
5459import type { Task } from "@/features/tasks/types" ;
5560import {
@@ -70,6 +75,7 @@ import { logger } from "@/lib/logger";
7075import { useThemeColors } from "@/lib/theme" ;
7176
7277const log = logger . scope ( "task-detail" ) ;
78+ type QueuedMessage = CloudTaskQueuedMessage < PendingAttachment > ;
7379
7480function getFirstParam ( value ?: string | string [ ] ) : string | undefined {
7581 return Array . isArray ( value ) ? value [ 0 ] : value ;
@@ -108,12 +114,13 @@ export default function TaskDetailScreen() {
108114 sendInterrupting,
109115 sendPermissionResponse,
110116 setConfigOption,
111- getSessionForTask,
112- setFocusedTaskId,
113117 steerQueuedMessage,
114118 flushQueuedMessagesIfIdle,
115119 stopRun,
116- } = useTaskSessionStore ( ) ;
120+ } = taskSessionActions ;
121+ const setFocusedTaskId = useTaskSessionStore (
122+ ( state ) => state . setFocusedTaskId ,
123+ ) ;
117124
118125 useEffect ( ( ) => {
119126 if ( ! taskId ) return ;
@@ -128,7 +135,7 @@ export default function TaskDetailScreen() {
128135 // Cleared when the screen unmounts. Matches the desktop super-property.
129136 useActiveTaskAnalyticsContext ( task ?. signal_report ?? null ) ;
130137
131- const session = taskId ? getSessionForTask ( taskId ) : undefined ;
138+ const session = taskId ? getTaskSession ( taskId ) : undefined ;
132139
133140 // Optimistic echo set by the new-task screen (or the terminal-resume path
134141 // below) so the user's prompt appears in the thread immediately, before
@@ -177,9 +184,7 @@ export default function TaskDetailScreen() {
177184
178185 const messagingMode = useMessagingMode ( taskId ) ;
179186 const queuedCount = useQueuedCount ( taskId ) ;
180- const editingQueuedId = useMessageQueueStore ( ( s ) =>
181- taskId ? s . editingByTaskId [ taskId ] : undefined ,
182- ) ;
187+ const { editingId : editingQueuedId } = useTaskMessageQueue ( taskId ) ;
183188 const toggleMessagingMode = useToggleMessagingMode ( taskId ) ;
184189 const analytics = useAnalytics ( ) ;
185190
@@ -368,11 +373,13 @@ export default function TaskDetailScreen() {
368373 // Saving an in-place edit: overwrite the queued message and release the
369374 // drain hold. If the turn already ended while editing, flush now — the
370375 // turn-end drain won't fire again on its own.
371- const queue = useMessageQueueStore . getState ( ) ;
372- const editingId = queue . editingByTaskId [ taskId ] ;
376+ const editingId = taskMessageQueue . getSnapshot ( ) . editingByTaskId [ taskId ] ;
373377 if ( editingId ) {
374- queue . update ( taskId , editingId , { content : text , attachments } ) ;
375- queue . clearEditing ( taskId ) ;
378+ taskMessageQueue . update ( taskId , editingId , {
379+ content : text ,
380+ attachments,
381+ } ) ;
382+ taskMessageQueue . clearEditing ( taskId ) ;
376383 flushQueuedMessagesIfIdle ( taskId ) ;
377384 return ;
378385 }
@@ -394,7 +401,7 @@ export default function TaskDetailScreen() {
394401 // Steer interrupts the turn and resends right away.
395402 if ( session ?. isPromptPending ) {
396403 if ( messagingMode === "queue" ) {
397- useMessageQueueStore . getState ( ) . enqueue ( taskId , text , attachments ) ;
404+ taskMessageQueue . enqueue ( taskId , text , attachments ) ;
398405 return ;
399406 }
400407 sendInterrupting ( taskId , text , attachments )
@@ -447,7 +454,7 @@ export default function TaskDetailScreen() {
447454 const handleEditQueued = useCallback (
448455 ( message : QueuedMessage ) => {
449456 if ( ! taskId ) return ;
450- useMessageQueueStore . getState ( ) . setEditing ( taskId , message . id ) ;
457+ taskMessageQueue . setEditing ( taskId , message . id ) ;
451458 setRestoredDraft ( {
452459 text : message . content ,
453460 attachments : message . attachments ,
@@ -458,16 +465,16 @@ export default function TaskDetailScreen() {
458465
459466 const handleCancelEdit = useCallback ( ( ) => {
460467 if ( ! taskId ) return ;
461- useMessageQueueStore . getState ( ) . clearEditing ( taskId ) ;
468+ taskMessageQueue . clearEditing ( taskId ) ;
462469 setRestoredDraft ( { text : "" , attachments : [ ] } ) ;
463470 flushQueuedMessagesIfIdle ( taskId ) ;
464471 } , [ taskId , flushQueuedMessagesIfIdle ] ) ;
465472
466473 const handleMoveQueued = useCallback (
467- ( message : QueuedMessage , direction : MoveDirection ) => {
474+ ( message : QueuedMessage , direction : CloudTaskQueueMoveDirection ) => {
468475 if ( ! taskId ) return ;
469476 Haptics . selectionAsync ( ) ;
470- useMessageQueueStore . getState ( ) . move ( taskId , message . id , direction ) ;
477+ taskMessageQueue . move ( taskId , message . id , direction ) ;
471478 } ,
472479 [ taskId ] ,
473480 ) ;
@@ -476,8 +483,8 @@ export default function TaskDetailScreen() {
476483 ( message : QueuedMessage ) => {
477484 if ( ! taskId ) return ;
478485 const wasEditing =
479- useMessageQueueStore . getState ( ) . editingByTaskId [ taskId ] === message . id ;
480- useMessageQueueStore . getState ( ) . remove ( taskId , message . id ) ;
486+ taskMessageQueue . getSnapshot ( ) . editingByTaskId [ taskId ] === message . id ;
487+ taskMessageQueue . remove ( taskId , message . id ) ;
481488 if ( wasEditing ) setRestoredDraft ( { text : "" , attachments : [ ] } ) ;
482489 } ,
483490 [ taskId ] ,
@@ -524,7 +531,7 @@ export default function TaskDetailScreen() {
524531 const handleStopRun = useCallback ( ( ) => {
525532 if ( ! taskId ) return ;
526533 confirmStopRun ( ( ) => {
527- const promptsSent = countUserMessages ( getSessionForTask ( taskId ) ?. events ) ;
534+ const promptsSent = countUserMessages ( getTaskSession ( taskId ) ?. events ) ;
528535 stopRun ( taskId )
529536 . then ( ( ok ) => {
530537 if ( ok ) {
@@ -542,7 +549,7 @@ export default function TaskDetailScreen() {
542549 } )
543550 . catch ( ( ) => { } ) ;
544551 } ) ;
545- } , [ taskId , stopRun , analytics , getSessionForTask ] ) ;
552+ } , [ taskId , stopRun , analytics ] ) ;
546553
547554 const canStopRun =
548555 ! ! task &&
0 commit comments