@@ -18,36 +18,70 @@ interface BotMessage {
1818
1919interface BotMessages {
2020 messages : BotMessage [ ] ;
21+ showProfile : boolean ;
2122 stepData ?: StepRecommendation | null ;
2223 currentStep ?: number ;
23- children ?: React . ReactNode ;
2424 onSelectedOption ?: ( value : string ) => void ;
25+ isTyping ?: boolean ;
2526}
2627
27- function BotMessage ( { messages, stepData, currentStep, onSelectedOption, children } : BotMessages ) {
28+ function BotMessage ( {
29+ messages,
30+ showProfile,
31+ stepData,
32+ currentStep,
33+ onSelectedOption,
34+ isTyping,
35+ } : BotMessages ) {
2836 const [ selected , setSelected ] = useState ( '' ) ;
2937
3038 return (
3139 < article aria-label = "취향추천 챗봇 메시지" className = "" >
32- < header className = "flex items-end" >
33- < div className = "relative w-15 md:w-20 h-15 md:h-20" >
34- < Image
35- src = { Ssury }
36- alt = "쑤리아바타"
37- width = { 80 }
38- height = { 80 }
39- className = "object-cover w-15 h-15 md:w-20 md:h-20"
40- />
41- </ div >
42- < strong > 쑤리</ strong >
43- </ header >
40+ { showProfile && (
41+ < header className = "flex items-end" >
42+ < div className = "relative w-15 md:w-20 h-15 md:h-20" >
43+ < Image
44+ src = { Ssury }
45+ alt = "쑤리아바타"
46+ width = { 80 }
47+ height = { 80 }
48+ className = "object-cover w-15 h-15 md:w-20 md:h-20"
49+ />
50+ </ div >
51+ < strong > 쑤리</ strong >
52+ </ header >
53+ ) }
4454
4555 { /* 메시지 그룹 */ }
4656 < div className = "flex flex-col gap-3 mt-3 pl-3" >
4757 { messages . map ( ( msg ) => (
4858 < div key = { msg . id } >
59+ < 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" >
60+ < div >
61+ { isTyping ? (
62+ < TypingIndicator />
63+ ) : (
64+ < p className = "whitespace-pre-line" > { msg . message } </ p >
65+ ) }
66+ </ div >
67+
68+ { /* radio */ }
69+ { msg . type === 'RADIO_OPTIONS' && msg . options ?. length && (
70+ < 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+ } }
79+ />
80+ ) }
81+ { /* {children} */ }
82+ </ div >
4983 { msg . type === 'CARD_LIST' && msg . recommendations ?. length ? (
50- < ul className = "inline-grid grid-cols-1 sm:grid-cols-3 gap-2 justify-start" >
84+ < ul className = "inline-grid grid-cols-1 mt-5 sm:grid-cols-3 gap-2 justify-start" >
5185 { msg . recommendations . map ( ( rec ) => (
5286 < li key = { rec . cocktailId } >
5387 < BotCocktailCard
@@ -61,29 +95,7 @@ function BotMessage({ messages, stepData, currentStep, onSelectedOption, childre
6195 ) ) }
6296 </ ul >
6397 ) : (
64- < 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" >
65- { msg . type === 'TYPING' ? (
66- < TypingIndicator />
67- ) : (
68- // 실제 메시지 내용
69- < p className = "whitespace-pre-line" > { msg . message } </ p >
70- ) }
71-
72- { /* radio */ }
73- { msg . type === 'RADIO_OPTIONS' && msg . options ?. length && (
74- < BotOptions
75- options = { msg . options }
76- step = { stepData ?. currentStep ?? 0 }
77- currentStep = { currentStep ?? 0 }
78- value = { selected }
79- onChange = { ( val ) => {
80- setSelected ( val ) ;
81- onSelectedOption ?.( val ) ;
82- } }
83- />
84- ) }
85- { /* {children} */ }
86- </ div >
98+ ''
8799 ) }
88100 </ div >
89101 ) ) }
0 commit comments