11import  {  useChatMessagesContext  }  from  "@/chat/hooks/useChatMessagesStore" ; 
2- import  {  useSendChatMessage  }  from  "@/chat/hooks/useSendChatMesasge " ; 
2+ import  {  useSendChatMessage  }  from  "@/chat/hooks/useSendChatMessage " ; 
33import  {  delay  }  from  "@/shared/utils/delay" ; 
44import  {  useParams  }  from  "next/navigation" ; 
5+ import  {  useState  }  from  "react" ; 
56import  {  css  }  from  "styled-components" ; 
7+ import  {  useTextFieldInChatDisplayContext  }  from  "../hooks/useTextFieldInChatDisplayStore" ; 
68import  ChipButton  from  "./ChipButton" ; 
7- 
8- type  Props  =  { 
9-   open : boolean ; 
10- } ; 
11- 
12- export  default  function  AcceptRejectButtons ( {  open } : Props )  { 
13-   const  {  addMessage,  deleteMessage }  =  useChatMessagesContext ( ) ; 
14-   const  {  mutate : sendChatMessage ,  isPending : isSendingChatMessage  }  =  useSendChatMessage ( ) ; 
9+ export  default  function  AcceptRejectButtons ( )  { 
10+   const  {  addMessage,  deleteMessage,  editMessage,  state : messages  }  =  useChatMessagesContext ( ) ; 
11+   const  {  mutate : sendChatMessage  }  =  useSendChatMessage ( ) ; 
12+   const  [ isButtonDisabled ,  setIsButtonDisabled ]  =  useState ( false ) ; 
13+   const  { 
14+     enable : enableTextField , 
15+     disable : disableTextField , 
16+     hide : hideTextField , 
17+     focus : focusTextField , 
18+   }  =  useTextFieldInChatDisplayContext ( ) ; 
1519  const  {  chatId }  =  useParams < {  chatId : string  } > ( ) ; 
1620
1721  const  rejectMessage  =  "아니, 얘기 더 들어봐" ; 
1822  const  acceptMessage  =  "좋아! 타로 볼래" ; 
1923
24+   const  isSystemRepliedQuestion  =  messages [ messages . length  -  1 ] ?. type  ===  "SYSTEM_TAROT_QUESTION_REPLY" ; 
25+ 
2026  if  ( ! chatId )  throw  new  Error ( "chatId가 Dynamic Route에서 전달 되어야 합니다." ) ; 
2127
2228  const  handleAcceptClick  =  async  ( )  =>  { 
29+     setIsButtonDisabled ( true ) ; 
30+     hideTextField ( ) ; 
2331    addMessage ( { 
2432      messageId : Math . random ( ) , 
2533      type : "USER_NORMAL" , 
@@ -46,21 +54,34 @@ export default function AcceptRejectButtons({ open }: Props) {
4654        intent : "TAROT_ACCEPT" , 
4755      } , 
4856      { 
49-         onSuccess : ( data )  =>  { 
57+         onSuccess : async   ( data )  =>  { 
5058          deleteMessage ( loadingMessageId ) ; 
5159
5260          addMessage ( { 
5361            messageId : data . messageId , 
5462            type : data . type , 
5563            sender : data . sender , 
56-             answers : data . answers , 
64+             answers : [ data . answers [ 0 ] ] , 
5765          } ) ; 
66+ 
67+           for  ( let  index  =  1 ;  index  <  data . answers . length ;  index ++ )  { 
68+             await  delay ( 1000 ) ; 
69+             editMessage ( { 
70+               messageId : data . messageId , 
71+               type : data . type , 
72+               sender : data . sender , 
73+               answers : data . answers . slice ( 0 ,  index  +  1 ) , 
74+             } ) ; 
75+           } 
5876        } , 
5977      } 
6078    ) ; 
79+     setIsButtonDisabled ( false ) ; 
6180  } ; 
6281
6382  const  handleRejectClick  =  async  ( )  =>  { 
83+     setIsButtonDisabled ( true ) ; 
84+     disableTextField ( ) ; 
6485    addMessage ( { 
6586      messageId : Math . random ( ) , 
6687      type : "USER_NORMAL" , 
@@ -87,21 +108,35 @@ export default function AcceptRejectButtons({ open }: Props) {
87108        intent : "TAROT_DECLINE" , 
88109      } , 
89110      { 
90-         onSuccess : ( data )  =>  { 
111+         onSuccess : async   ( data )  =>  { 
91112          deleteMessage ( loadingMessageId ) ; 
92113
93114          addMessage ( { 
94115            messageId : data . messageId , 
95116            type : data . type , 
96117            sender : data . sender , 
97-             answers : data . answers , 
118+             answers : [ data . answers [ 0 ] ] , 
98119          } ) ; 
120+ 
121+           for  ( let  index  =  1 ;  index  <  data . answers . length ;  index ++ )  { 
122+             await  delay ( 1000 ) ; 
123+             editMessage ( { 
124+               messageId : data . messageId , 
125+               type : data . type , 
126+               sender : data . sender , 
127+               answers : data . answers . slice ( 0 ,  index  +  1 ) , 
128+             } ) ; 
129+           } 
130+           enableTextField ( ) ; 
131+           await  delay ( 1 ) ; 
132+           focusTextField ( ) ; 
99133        } , 
100134      } 
101135    ) ; 
136+     setIsButtonDisabled ( false ) ; 
102137  } ; 
103138
104-   if  ( ! open )  return  null ; 
139+   if  ( ! isSystemRepliedQuestion )  return  null ; 
105140
106141  return  ( 
107142    < div 
@@ -111,10 +146,10 @@ export default function AcceptRejectButtons({ open }: Props) {
111146        margin-top :  76px  ; 
112147      ` } 
113148    > 
114-       < ChipButton  type = "button"  disabled = { isSendingChatMessage }  color = "primary02"  onClick = { handleAcceptClick } > 
149+       < ChipButton  type = "button"  disabled = { isButtonDisabled }  color = "primary02"  onClick = { handleAcceptClick } > 
115150        { acceptMessage } 
116151      </ ChipButton > 
117-       < ChipButton  type = "button"  disabled = { isSendingChatMessage }  color = "grey30"  onClick = { handleRejectClick } > 
152+       < ChipButton  type = "button"  disabled = { isButtonDisabled }  color = "grey30"  onClick = { handleRejectClick } > 
118153        { rejectMessage } 
119154      </ ChipButton > 
120155    </ div > 
0 commit comments