@@ -34,6 +34,9 @@ import PlanChatBody from "./PlanChatBody";
3434interface  SimplifiedPlanChatProps  extends  PlanChatProps  { 
3535  onPlanReceived ?: ( planData : MPlanData )  =>  void ; 
3636  initialTask ?: string ; 
37+   planApprovalRequest : MPlanData  |  null ; 
38+   waitingForPlan : boolean ; 
39+   messagesContainerRef : React . RefObject < HTMLDivElement > ; 
3740} 
3841
3942const  PlanChat : React . FC < SimplifiedPlanChatProps >  =  ( { 
@@ -45,67 +48,25 @@ const PlanChat: React.FC<SimplifiedPlanChatProps> = ({
4548  onPlanApproval, 
4649  onPlanReceived, 
4750  initialTask, 
51+   planApprovalRequest, 
52+   waitingForPlan, 
53+   messagesContainerRef
54+ 
4855} )  =>  { 
4956  const  navigate  =  useNavigate ( ) ; 
50-    const   messagesContainerRef   =   useRef < HTMLDivElement > ( null ) ; 
57+ 
5158  const  {  showToast,  dismissToast }  =  useInlineToaster ( ) ; 
5259  // States 
53-    const   [ planApprovalRequest ,   setPlanApprovalRequest ]   =   useState < MPlanData   |   null > ( null ) ; 
60+ 
5461  const  [ processingApproval ,  setProcessingApproval ]  =  useState ( false ) ; 
55-    const   [ waitingForPlan ,   setWaitingForPlan ]   =   useState ( true ) ; 
56-   const  [ userFeedback ,   setUserFeedback ]  =  useState ( '' ) ; 
57-    const   [ showFeedbackInput ,   setShowFeedbackInput ]   =   useState ( false ) ; 
62+ 
63+   const  [ showApprovalButtons ,   setShowApprovalButtons ]  =  useState ( true ) ; 
64+ 
5865
5966
60-   // Auto-scroll helper 
61-   const  scrollToBottom  =  useCallback ( ( )  =>  { 
62-     setTimeout ( ( )  =>  { 
63-       if  ( messagesContainerRef . current )  { 
64-         messagesContainerRef . current . scrollTop  =  messagesContainerRef . current . scrollHeight ; 
65-       } 
66-     } ,  100 ) ; 
67-   } ,  [ ] ) ; 
6867
6968  // Listen for m_plan streaming 
70-   useEffect ( ( )  =>  { 
71-     const  unsubscribe  =  webSocketService . on ( WebsocketMessageType . PLAN_APPROVAL_REQUEST ,  ( approvalRequest : any )  =>  { 
72-       console . log ( '📋 Plan received:' ,  approvalRequest ) ; 
73- 
74-       let  mPlanData : MPlanData  |  null  =  null ; 
75- 
76-       // Handle the different message structures 
77-       if  ( approvalRequest . parsedData )  { 
78-         // Direct parsedData property 
79-         mPlanData  =  approvalRequest . parsedData ; 
80-       }  else  if  ( approvalRequest . data  &&  typeof  approvalRequest . data  ===  'object' )  { 
81-         // Data property with nested object 
82-         if  ( approvalRequest . data . parsedData )  { 
83-           mPlanData  =  approvalRequest . data . parsedData ; 
84-         }  else  { 
85-           // Try to parse the data object directly 
86-           mPlanData  =  approvalRequest . data ; 
87-         } 
88-       }  else  if  ( approvalRequest . rawData )  { 
89-         // Parse the raw data string 
90-         mPlanData  =  PlanDataService . parsePlanApprovalRequest ( approvalRequest . rawData ) ; 
91-       }  else  { 
92-         // Try to parse the entire object 
93-         mPlanData  =  PlanDataService . parsePlanApprovalRequest ( approvalRequest ) ; 
94-       } 
95- 
96-       if  ( mPlanData )  { 
97-         console . log ( '✅ Parsed plan data:' ,  mPlanData ) ; 
98-         setPlanApprovalRequest ( mPlanData ) ; 
99-         setWaitingForPlan ( false ) ; 
100-         onPlanReceived ?.( mPlanData ) ; 
101-         scrollToBottom ( ) ; 
102-       }  else  { 
103-         console . error ( '❌ Failed to parse plan data' ,  approvalRequest ) ; 
104-       } 
105-     } ) ; 
106- 
107-     return  ( )  =>  unsubscribe ( ) ; 
108-   } ,  [ onPlanReceived ,  scrollToBottom ] ) ; 
69+ 
10970
11071  // Handle plan approval 
11172  const  handleApprovePlan  =  useCallback ( async  ( )  =>  { 
@@ -118,12 +79,12 @@ const PlanChat: React.FC<SimplifiedPlanChatProps> = ({
11879        m_plan_id : planApprovalRequest . id , 
11980        plan_id : planData ?. plan ?. id , 
12081        approved : true , 
121-         feedback : userFeedback   ||   'Plan approved by user' 
82+         feedback : 'Plan approved by user' 
12283      } ) ; 
12384
12485      dismissToast ( id ) ; 
125-       setShowFeedbackInput ( false ) ; 
12686      onPlanApproval ?.( true ) ; 
87+       setShowApprovalButtons ( false ) ; 
12788
12889    }  catch  ( error )  { 
12990      dismissToast ( id ) ; 
@@ -132,7 +93,7 @@ const PlanChat: React.FC<SimplifiedPlanChatProps> = ({
13293    }  finally  { 
13394      setProcessingApproval ( false ) ; 
13495    } 
135-   } ,  [ planApprovalRequest ,  planData ,  userFeedback ,   onPlanApproval ] ) ; 
96+   } ,  [ planApprovalRequest ,  planData ,  onPlanApproval ] ) ; 
13697
13798  // Handle plan rejection   
13899  const  handleRejectPlan  =  useCallback ( async  ( )  =>  { 
@@ -145,7 +106,7 @@ const PlanChat: React.FC<SimplifiedPlanChatProps> = ({
145106        m_plan_id : planApprovalRequest . id , 
146107        plan_id : planData ?. plan ?. id , 
147108        approved : false , 
148-         feedback : userFeedback   ||   'Plan rejected by user' 
109+         feedback : 'Plan rejected by user' 
149110      } ) ; 
150111
151112      dismissToast ( id ) ; 
@@ -192,7 +153,7 @@ const PlanChat: React.FC<SimplifiedPlanChatProps> = ({
192153        { renderThinkingState ( waitingForPlan ) } 
193154
194155        { /* Plan response with all information */ } 
195-         { renderPlanResponse ( planApprovalRequest ,  handleApprovePlan ,  handleRejectPlan ,  processingApproval ) } 
156+         { renderPlanResponse ( planApprovalRequest ,  handleApprovePlan ,  handleRejectPlan ,  processingApproval ,   showApprovalButtons ) } 
196157      </ div > 
197158
198159      { /* Chat Input - only show if no plan is waiting for approval */ } 
0 commit comments