@@ -38,37 +38,30 @@ const PlanPage: React.FC = () => {
38
38
const navigate = useNavigate ( ) ;
39
39
const { showToast, dismissToast } = useInlineToaster ( ) ;
40
40
const messagesContainerRef = useRef < HTMLDivElement > ( null ) ;
41
- const [ input , setInput ] = useState ( "" ) ;
41
+ const [ input , setInput ] = useState < string > ( "" ) ;
42
42
const [ planData , setPlanData ] = useState < ProcessedPlanData | any > ( null ) ;
43
- const [ allPlans , setAllPlans ] = useState < ProcessedPlanData [ ] > ( [ ] ) ;
44
43
const [ loading , setLoading ] = useState < boolean > ( true ) ;
45
44
const [ submittingChatDisableInput , setSubmittingChatDisableInput ] = useState < boolean > ( true ) ;
46
- const [ error , setError ] = useState < Error | null > ( null ) ;
45
+ const [ errorLoading , setErrorLoading ] = useState < boolean > ( false ) ;
47
46
const [ clarificationMessage , setClarificationMessage ] = useState < ParsedUserClarification | null > ( null ) ;
48
- const [ processingApproval , setProcessingApproval ] = useState ( false ) ;
47
+ const [ processingApproval , setProcessingApproval ] = useState < boolean > ( false ) ;
49
48
const [ planApprovalRequest , setPlanApprovalRequest ] = useState < MPlanData | null > ( null ) ;
50
- const [ reloadLeftList , setReloadLeftList ] = useState ( true ) ;
51
- const [ waitingForPlan , setWaitingForPlan ] = useState ( true ) ;
49
+ const [ reloadLeftList , setReloadLeftList ] = useState < boolean > ( true ) ;
50
+ const [ waitingForPlan , setWaitingForPlan ] = useState < boolean > ( true ) ;
52
51
const [ showProcessingPlanSpinner , setShowProcessingPlanSpinner ] = useState < boolean > ( false ) ;
53
52
const [ showApprovalButtons , setShowApprovalButtons ] = useState < boolean > ( true ) ;
54
53
// WebSocket connection state
55
- const [ wsConnected , setWsConnected ] = useState ( false ) ;
54
+ const [ wsConnected , setWsConnected ] = useState < boolean > ( false ) ;
56
55
const [ streamingMessages , setStreamingMessages ] = useState < StreamingPlanUpdate [ ] > ( [ ] ) ;
57
56
const [ streamingMessageBuffer , setStreamingMessageBuffer ] = useState < string > ( "" ) ;
58
57
59
-
60
58
const [ agentMessages , setAgentMessages ] = useState < AgentMessageData [ ] > ( [ ] ) ;
61
- // Team config state
62
- const [ teamConfig , setTeamConfig ] = useState < TeamConfig | null > ( null ) ;
63
- const [ loadingTeamConfig , setLoadingTeamConfig ] = useState ( true ) ;
64
59
65
60
// Plan approval state - track when plan is approved
66
- const [ planApproved , setPlanApproved ] = useState ( false ) ;
61
+ const [ planApproved , setPlanApproved ] = useState < boolean > ( false ) ;
67
62
68
63
const [ loadingMessage , setLoadingMessage ] = useState < string > ( loadingMessages [ 0 ] ) ;
69
64
70
- // Use ref to store the function to avoid stale closure issues
71
- const loadPlanDataRef = useRef < ( ) => Promise < ProcessedPlanData [ ] > > ( ) ;
72
65
// Auto-scroll helper
73
66
const scrollToBottom = useCallback ( ( ) => {
74
67
setTimeout ( ( ) => {
@@ -114,7 +107,6 @@ const PlanPage: React.FC = () => {
114
107
setPlanApprovalRequest ( mPlanData ) ;
115
108
setWaitingForPlan ( false ) ;
116
109
setShowProcessingPlanSpinner ( false ) ;
117
- // onPlanReceived?.(mPlanData);
118
110
scrollToBottom ( ) ;
119
111
} else {
120
112
console . error ( '❌ Failed to parse plan data' , approvalRequest ) ;
@@ -129,8 +121,9 @@ const PlanPage: React.FC = () => {
129
121
const unsubscribe = webSocketService . on ( WebsocketMessageType . AGENT_MESSAGE_STREAMING , ( streamingMessage : any ) => {
130
122
// console.log('📋 Streaming Message', streamingMessage);
131
123
// if is final true clear buffer and add final message to agent messages
132
- setStreamingMessageBuffer ( prev => prev + streamingMessage . data . content ) ;
133
- scrollToBottom ( ) ;
124
+ const line = PlanDataService . simplifyHumanClarification ( streamingMessage . data . content ) ;
125
+ setStreamingMessageBuffer ( prev => prev + line ) ;
126
+ //scrollToBottom();
134
127
135
128
} ) ;
136
129
@@ -166,7 +159,7 @@ const PlanPage: React.FC = () => {
166
159
useEffect ( ( ) => {
167
160
const unsubscribe = webSocketService . on ( WebsocketMessageType . AGENT_TOOL_MESSAGE , ( toolMessage : any ) => {
168
161
console . log ( '📋 Tool Message' , toolMessage ) ;
169
- scrollToBottom ( ) ;
162
+ // scrollToBottom();
170
163
171
164
} ) ;
172
165
@@ -184,7 +177,7 @@ const PlanPage: React.FC = () => {
184
177
timestamp : Date . now ( ) ,
185
178
steps : [ ] , // intentionally always empty
186
179
next_steps : [ ] , // intentionally always empty
187
- content : finalMessage . data . content || '' ,
180
+ content : "🎉🎉 " + ( finalMessage . data . content || '' ) ,
188
181
raw_data : finalMessage . data || '' ,
189
182
} as AgentMessageData ;
190
183
console . log ( '✅ Parsed final result message:' , agentMessageData ) ;
@@ -198,7 +191,6 @@ const PlanPage: React.FC = () => {
198
191
return ( ) => unsubscribe ( ) ;
199
192
} , [ scrollToBottom ] ) ;
200
193
201
-
202
194
//WebsocketMessageType.AGENT_MESSAGE
203
195
useEffect ( ( ) => {
204
196
const unsubscribe = webSocketService . on ( WebsocketMessageType . AGENT_MESSAGE , ( agentMessage : any ) => {
@@ -288,80 +280,35 @@ const PlanPage: React.FC = () => {
288
280
}
289
281
} , [ planId , loading ] ) ;
290
282
291
- useEffect ( ( ) => {
292
-
293
- const loadTeamConfig = async ( ) => {
294
- try {
295
- setLoadingTeamConfig ( true ) ;
296
- const teams = await TeamService . getUserTeams ( ) ;
297
- // Get the first team as default config, or you can implement logic to get current team
298
- const config = teams . length > 0 ? teams [ 0 ] : null ;
299
- setTeamConfig ( config ) ;
300
- } catch ( error ) {
301
- console . error ( 'Failed to load team config:' , error ) ;
302
- // Don't show error for team config loading - it's optional
303
- } finally {
304
- setLoadingTeamConfig ( false ) ;
305
- }
306
- } ;
307
-
308
- loadTeamConfig ( ) ;
309
- } , [ ] ) ;
310
-
311
- // Helper function to convert PlanWithSteps to ProcessedPlanData
312
- const convertToProcessedPlanData = ( planWithSteps : PlanWithSteps ) : ProcessedPlanData => {
313
- return PlanDataService . processPlanData ( planWithSteps , [ ] ) ;
314
- } ;
315
-
316
283
// Create loadPlanData function with useCallback to memoize it
317
284
const loadPlanData = useCallback (
318
- async ( useCache = true ) : Promise < ProcessedPlanData [ ] > => {
319
- if ( ! planId ) return [ ] ;
285
+ async ( useCache = true ) : Promise < ProcessedPlanData | null > => {
286
+ if ( ! planId ) return null ;
320
287
321
288
setLoading ( true ) ;
322
- setError ( null ) ;
323
289
324
290
try {
325
291
let actualPlanId = planId ;
326
292
let planResult : ProcessedPlanData | null = null ;
327
293
328
- if ( actualPlanId && ! planResult ) {
329
- console . log ( "Fetching plan with ID:" , actualPlanId ) ;
330
- planResult = await PlanDataService . fetchPlanData ( actualPlanId , useCache ) ;
331
- console . log ( "Plan data loaded successfully" ) ;
332
- }
333
294
334
- const allPlansWithSteps = await apiService . getPlans ( ) ;
335
- const allPlansData = allPlansWithSteps . map ( convertToProcessedPlanData ) ;
336
- setAllPlans ( allPlansData ) ;
295
+ console . log ( "Fetching plan with ID:" , actualPlanId ) ;
296
+ planResult = await PlanDataService . fetchPlanData ( actualPlanId , useCache ) ;
297
+
337
298
338
- if ( planResult ?. plan ?. id && planResult . plan . id !== actualPlanId ) {
339
- console . log ( 'Plan ID mismatch detected, redirecting...' , {
340
- requested : actualPlanId ,
341
- actual : planResult . plan . id
342
- } ) ;
343
- navigate ( `/plan/${ planResult . plan . id } ` , { replace : true } ) ;
344
- }
345
299
346
300
setPlanData ( planResult ) ;
347
- return allPlansData ;
301
+ return planResult ;
348
302
} catch ( err ) {
349
303
console . log ( "Failed to load plan data:" , err ) ;
350
- setError (
351
- err instanceof Error ? err : new Error ( "Failed to load plan data" )
352
- ) ;
353
- return [ ] ;
304
+ return null ;
354
305
} finally {
355
306
setLoading ( false ) ;
356
307
}
357
308
} ,
358
309
[ planId , navigate ]
359
310
) ;
360
311
361
- // Update the ref whenever loadPlanData changes
362
- useEffect ( ( ) => {
363
- loadPlanDataRef . current = loadPlanData ;
364
- } , [ loadPlanData ] ) ;
365
312
366
313
// Handle plan approval
367
314
const handleApprovePlan = useCallback ( async ( ) => {
@@ -418,6 +365,7 @@ const PlanPage: React.FC = () => {
418
365
}
419
366
} , [ planApprovalRequest , planData , navigate , setProcessingApproval ] ) ;
420
367
// Chat submission handler - updated for v3 backend compatibility
368
+
421
369
const handleOnchatSubmit = useCallback (
422
370
async ( chatInput : string ) => {
423
371
if ( ! chatInput . trim ( ) ) {
@@ -482,14 +430,17 @@ const PlanPage: React.FC = () => {
482
430
} , [ navigate ] ) ;
483
431
484
432
485
-
486
433
const resetReload = useCallback ( ( ) => {
487
434
setReloadLeftList ( false ) ;
488
435
} , [ ] ) ;
489
436
490
437
useEffect ( ( ) => {
491
438
const initializePlanLoading = async ( ) => {
492
- if ( ! planId ) return ;
439
+ if ( ! planId ) {
440
+
441
+ setErrorLoading ( true ) ;
442
+ return ;
443
+ }
493
444
494
445
try {
495
446
await loadPlanData ( true ) ;
@@ -501,7 +452,7 @@ const PlanPage: React.FC = () => {
501
452
initializePlanLoading ( ) ;
502
453
} , [ planId , loadPlanData ] ) ;
503
454
504
- if ( error ) {
455
+ if ( errorLoading ) {
505
456
return (
506
457
< CoralShellColumn >
507
458
< CoralShellRow >
@@ -512,7 +463,7 @@ const PlanPage: React.FC = () => {
512
463
color : 'var(--colorNeutralForeground2)'
513
464
} } >
514
465
< Text size = { 500 } >
515
- { error . message || "An error occurred while loading the plan" }
466
+ { "An error occurred while loading the plan" }
516
467
</ Text >
517
468
</ div >
518
469
</ Content >
@@ -532,7 +483,7 @@ const PlanPage: React.FC = () => {
532
483
onTeamSelect = { ( ) => { } }
533
484
onTeamUpload = { async ( ) => { } }
534
485
isHomePage = { false }
535
- selectedTeam = { teamConfig }
486
+ selectedTeam = { null }
536
487
/>
537
488
538
489
< Content >
0 commit comments