@@ -12,14 +12,12 @@ interface BotMessage {
1212 id : string ;
1313 message : string ;
1414 type : string ;
15- options ?: StepOption [ ] ;
16- recommendations ?: RecommendationItem [ ] ;
15+ stepData ?: StepRecommendation | null ;
1716}
1817
1918interface BotMessages {
2019 messages : BotMessage [ ] ;
2120 showProfile : boolean ;
22- stepData ?: StepRecommendation | null ;
2321 currentStep ?: number ;
2422 onSelectedOption ?: ( value : string ) => void ;
2523 isTyping ?: boolean ;
@@ -28,12 +26,16 @@ interface BotMessages {
2826function BotMessage ( {
2927 messages,
3028 showProfile,
31- stepData,
3229 currentStep,
3330 onSelectedOption,
3431 isTyping,
3532} : BotMessages ) {
36- const [ selected , setSelected ] = useState ( '' ) ;
33+ const [ selectedOptions , setSelectedOptions ] = useState < Record < number , string > > ( { } ) ;
34+
35+ const handleOptionChange = ( step : number , value : string ) => {
36+ setSelectedOptions ( ( prev ) => ( { ...prev , [ step ] : value } ) ) ;
37+ onSelectedOption ?.( value ) ;
38+ } ;
3739
3840 return (
3941 < article aria-label = "취향추천 챗봇 메시지" className = "" >
@@ -66,34 +68,47 @@ function BotMessage({
6668 </ div >
6769
6870 { /* radio */ }
69- { msg . type === 'RADIO_OPTIONS' && msg . options ?. length && (
71+ { msg . type === 'RADIO_OPTIONS' && msg . stepData ?. options ?. length ? (
7072 < BotOptions
71- options = { msg . options }
72- step = { stepData ?. currentStep ?? 0 }
73- currentStep = { currentStep ?? 0 }
74- value = { selected }
75- onChange = { ( val ) => {
76- setSelected ( val ) ;
77- onSelectedOption ?.( val ) ;
78- } }
73+ options = { msg . stepData . options }
74+ step = { msg . stepData . currentStep ?? 0 }
75+ value = { selectedOptions [ msg . stepData . currentStep ?? 0 ] ?? '' }
76+ onChange = { ( val ) => handleOptionChange ( msg . stepData ?. currentStep ?? 0 , val ) }
77+ disabled = { currentStep !== undefined && currentStep > msg . stepData . currentStep ! }
7978 />
80- ) }
81- { /* {children} */ }
79+ ) : null }
8280 </ div >
83- { msg . type === 'CARD_LIST' && msg . recommendations ?. length ? (
84- < ul className = "inline-grid grid-cols-1 mt-5 sm:grid-cols-3 gap-2 justify-start" >
85- { msg . recommendations . map ( ( rec ) => (
86- < li key = { rec . cocktailId } >
87- < BotCocktailCard
88- cocktailId = { rec . cocktailId }
89- cocktailName = { rec . cocktailName }
90- cocktailNameKo = { rec . cocktailNameKo }
91- cocktailImgUrl = { rec . cocktailImgUrl }
92- alcoholStrength = { rec . alcoholStrength }
81+ { msg . type === 'CARD_LIST' && msg . stepData ?. recommendations ?. length ? (
82+ < >
83+ { /* 카드 목록 */ }
84+ < ul className = "inline-grid grid-cols-1 mt-5 sm:grid-cols-3 gap-2 justify-start" >
85+ { msg . stepData . recommendations . map ( ( rec ) => (
86+ < li key = { rec . cocktailId } >
87+ < BotCocktailCard
88+ cocktailId = { rec . cocktailId }
89+ cocktailName = { rec . cocktailName }
90+ cocktailNameKo = { rec . cocktailNameKo }
91+ cocktailImgUrl = { rec . cocktailImgUrl }
92+ alcoholStrength = { rec . alcoholStrength }
93+ />
94+ </ li >
95+ ) ) }
96+ </ ul >
97+
98+ { /* 카드 목록 마지막 restart */ }
99+ { msg . stepData ?. options && msg . stepData . options ?. length > 0 && (
100+ < div className = "flex flex-col w-fit max-w-[80%] min-w-[120px] p-3 rounded-2xl rounded-tl-none bg-white text-black opacity-0 animate-fadeIn mt-3" >
101+ < p > 다시 추천받기를 원하시나요?</ p >
102+ < BotOptions
103+ options = { msg . stepData . options }
104+ step = { msg . stepData . currentStep ?? 0 }
105+ value = { selectedOptions [ msg . stepData . currentStep ?? 0 ] ?? '' }
106+ onChange = { ( val ) => handleOptionChange ( msg . stepData ?. currentStep ?? 0 , val ) }
107+ disabled = { currentStep ? currentStep > ( msg . stepData . currentStep ?? 0 ) : false }
93108 />
94- </ li >
95- ) ) }
96- </ ul >
109+ </ div >
110+ ) }
111+ </ >
97112 ) : (
98113 ''
99114 ) }
0 commit comments