@@ -6,12 +6,13 @@ import ButtonFeedback from './ButtonFeedback';
66import ZoomUpImage from './ZoomUpImage' ;
77import { PiUserFill , PiChalkboardTeacher } from 'react-icons/pi' ;
88import { BaseProps } from '../@types/common' ;
9- import { ShownMessage } from 'generative-ai-use-cases-jp' ;
9+ import { ShownMessage , UpdateFeedbackRequest } from 'generative-ai-use-cases-jp' ;
1010import BedrockIcon from '../assets/bedrock.svg?react' ;
1111import useChat from '../hooks/useChat' ;
1212import useTyping from '../hooks/useTyping' ;
1313import useFileApi from '../hooks/useFileApi' ;
1414import FileCard from './FileCard' ;
15+ import FeedbackForm from './FeedbackForm' ;
1516
1617type Props = BaseProps & {
1718 idx ?: number ;
@@ -28,6 +29,8 @@ const ChatMessage: React.FC<Props> = (props) => {
2829 const { pathname } = useLocation ( ) ;
2930 const { sendFeedback } = useChat ( pathname ) ;
3031 const [ isSendingFeedback , setIsSendingFeedback ] = useState ( false ) ;
32+ const [ showFeedbackForm , setShowFeedbackForm ] = useState ( false ) ;
33+ const [ showThankYouMessage , setShowThankYouMessage ] = useState ( false ) ;
3134 const { getFileDownloadSignedUrl } = useFileApi ( ) ;
3235
3336 const { setTypingTextInput, typingTextOutput } = useTyping (
@@ -61,18 +64,54 @@ const ChatMessage: React.FC<Props> = (props) => {
6164 return isSendingFeedback || ! props . chatContent ?. id ;
6265 } , [ isSendingFeedback , props ] ) ;
6366
64- const onSendFeedback = async ( feedback : string ) => {
67+ const onSendFeedback = async ( feedbackData : UpdateFeedbackRequest ) => {
6568 if ( ! disabled ) {
6669 setIsSendingFeedback ( true ) ;
67- if ( feedback !== chatContent ?. feedback ) {
68- await sendFeedback ( props . chatContent ! . createdDate ! , feedback ) ;
70+ if ( feedbackData . feedback !== chatContent ?. feedback ) {
71+ if ( feedbackData . feedback !== 'bad' ) {
72+ setShowFeedbackForm ( false ) ;
73+ }
74+ await sendFeedback ( feedbackData ) ;
6975 } else {
70- await sendFeedback ( props . chatContent ! . createdDate ! , 'none' ) ;
76+ await sendFeedback ( {
77+ createdDate : props . chatContent ! . createdDate ! ,
78+ feedback : 'none'
79+ } ) ;
80+ setShowFeedbackForm ( false ) ;
7181 }
7282 setIsSendingFeedback ( false ) ;
7383 }
7484 } ;
7585
86+ const handleFeedbackClick = ( feedback : string ) => {
87+ // ボタン押した際、ユーザーからの詳細フィードバック前にDBに送る。
88+ onSendFeedback ( {
89+ createdDate : props . chatContent ! . createdDate ! ,
90+ feedback : feedback
91+ } ) ;
92+ if ( feedback === 'bad' && chatContent ?. feedback !== 'bad' ) {
93+ setShowFeedbackForm ( true ) ;
94+ }
95+ } ;
96+
97+ const handleFeedbackFormSubmit = async ( reasons : string [ ] , detailedFeedback : string ) => {
98+ await sendFeedback ( {
99+ createdDate : props . chatContent ! . createdDate ! ,
100+ feedback : 'bad' ,
101+ reasons : reasons ,
102+ detailedFeedback : detailedFeedback
103+ } ) ;
104+ setShowFeedbackForm ( false ) ;
105+ setShowThankYouMessage ( true ) ;
106+ setTimeout ( ( ) => {
107+ setShowThankYouMessage ( false ) ;
108+ } , 3000 ) ;
109+ } ;
110+
111+ const handleFeedbackFormCancel = ( ) => {
112+ setShowFeedbackForm ( false ) ;
113+ } ;
114+
76115 return (
77116 < div
78117 className = { `flex justify-center ${
@@ -83,7 +122,7 @@ const ChatMessage: React.FC<Props> = (props) => {
83122 < div
84123 className = { `${
85124 props . className ?? ''
86- } flex w-full flex-col justify-between p-3 md:w-11/12 lg:w-5/6 xl:w-4/6 2xl:flex-row `} >
125+ } flex w-full flex-col justify-between p-3 md:w-11/12 lg:w-5/6 xl:w-4/6`} >
87126 < div className = "flex w-full" >
88127 { chatContent ?. role === 'user' && (
89128 < div className = "bg-aws-sky h-min rounded p-2 text-xl text-white" >
@@ -199,21 +238,34 @@ const ChatMessage: React.FC<Props> = (props) => {
199238 message = { chatContent }
200239 disabled = { disabled }
201240 onClick = { ( ) => {
202- onSendFeedback ( 'good' ) ;
241+ handleFeedbackClick ( 'good' ) ;
203242 } }
204243 />
205244 < ButtonFeedback
206245 className = "ml-0.5"
207246 feedback = "bad"
208247 message = { chatContent }
209248 disabled = { disabled }
210- onClick = { ( ) => onSendFeedback ( 'bad' ) }
249+ onClick = { ( ) => handleFeedbackClick ( 'bad' ) }
211250 />
212251 </ >
213252 ) }
214253 </ >
215254 ) }
216255 </ div >
256+ < div >
257+ { showFeedbackForm && (
258+ < FeedbackForm
259+ onSubmit = { handleFeedbackFormSubmit }
260+ onCancel = { handleFeedbackFormCancel }
261+ />
262+ ) }
263+ { showThankYouMessage && (
264+ < div className = "mt-2 p-2 bg-green-100 text-center text-green-700 rounded-md" >
265+ フィードバックを受け付けました。ありがとうございます。
266+ </ div >
267+ ) }
268+ </ div >
217269 </ div >
218270 </ div >
219271 ) ;
0 commit comments