66 inputImageAtom ,
77 currentChatIdAtom ,
88 isAIRespondingAtom ,
9- hasUserSentMessageAtom ,
109 activePanelTypeAtom ,
1110 imageTabsAtom ,
1211 wikiTabsAtom ,
@@ -15,19 +14,20 @@ import {
1514 isSidebarOpenAtom ,
1615 messagesAtomFamily ,
1716} from '@/atoms/chatAtoms' ;
18- import { createContext , ReactNode , useCallback , useContext , useEffect } from 'react' ;
17+ import { ChangeEvent , createContext , ReactNode , useCallback , useContext , useEffect } from 'react' ;
1918import { useChatRooms } from '@/queries/useChatRoom' ;
2019import { useChatMessage } from '@/queries/useChatMessage' ;
2120import { userAtom } from '@/atoms/authAtoms' ;
2221import { tmpUserId , tmpUsername } from '@/queries/useUser' ;
23- import { getChatRoomsRoomIdMessages } from '@/api/chatAPI' ;
22+ import { postChatUpload , getChatRoomsRoomIdMessages } from '@/api/chatAPI' ;
2423
2524type ChatActionsContextType = {
2625 handleSendMessage : ( ) => void ;
2726 handleNewChat : ( ) => void ;
2827 handleChatSelect : ( chatId : number ) => void ;
2928 handleExampleSelect : ( exampleText : string ) => void ;
3029 handleOpenTab : ( data : any , type : 'image' | 'wiki' ) => void ;
30+ handleFileChange : ( event : ChangeEvent < HTMLInputElement > ) => void ;
3131 handleCloseTab : ( targetTabId : string ) => void ;
3232 setIsSidebarOpen : ( isOpen : boolean ) => void ;
3333 addExistingMessages : ( chatId : number | null , existingMessages : Message [ ] ) => void ;
@@ -44,7 +44,6 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
4444 const [ inputValue , setInputValue ] = useAtom ( inputValueAtom ) ;
4545 const [ inputImage , setInputImage ] = useAtom ( inputImageAtom ) ;
4646 const [ currentChatId , setCurrentChatId ] = useAtom ( currentChatIdAtom ) ;
47- const [ hasUserSentMessage , setHasUserSentMessage ] = useAtom ( hasUserSentMessageAtom ) ;
4847 const [ isAIResponding , setIsAIResponding ] = useAtom ( isAIRespondingAtom ) ;
4948 const [ isSidebarOpen , setIsSidebarOpen ] = useAtom ( isSidebarOpenAtom ) ;
5049
@@ -62,27 +61,23 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
6261
6362 // AI 응답이 오면 스피너를 제거
6463 useEffect ( ( ) => {
65- if ( messages . length > 0 && hasUserSentMessage ) {
64+ console . log ( '1' , isAIResponding ) ;
65+ if ( messages . length > 0 && isAIResponding ) {
6666 const lastMessage = messages [ messages . length - 1 ] ;
67- if ( lastMessage && lastMessage . user ) {
68- setIsAIResponding ( false ) ;
69- }
67+ if ( lastMessage ?. user ) setIsAIResponding ( 'style' ) ;
7068 }
71- } , [ messages , hasUserSentMessage ] ) ;
72-
73- const resetAtomState = useCallback (
74- ( flag : boolean ) => {
75- setHasUserSentMessage ( flag ) ;
76- setIsAIResponding ( flag ) ;
77- setInputValue ( '' ) ;
78- setInputImage ( undefined ) ;
79- } ,
80- [ setHasUserSentMessage , setIsAIResponding , setInputValue , setInputImage ] ,
81- ) ;
69+ } , [ messages , isAIResponding ] ) ;
70+
71+ const resetAtomState = useCallback ( ( ) => {
72+ setIsAIResponding ( '' ) ;
73+ setInputValue ( '' ) ;
74+ setInputImage ( undefined ) ;
75+ } , [ setIsAIResponding , setInputValue , setInputImage ] ) ;
8276
8377 const sendMsg = useCallback (
8478 ( inputValue : string , inputImage ?: MessageImage ) => {
85- resetAtomState ( true ) ;
79+ resetAtomState ( ) ;
80+ setIsAIResponding ( 'style' ) ;
8681 const userMessage : Message = {
8782 id : Date . now ( ) . toString ( ) ,
8883 content : inputValue ,
@@ -93,8 +88,9 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
9388 createdAt : new Date ( ) ,
9489 } ;
9590 sendMessage ( userMessage ) ;
91+ console . log ( '2' , isAIResponding ) ;
9692 } ,
97- [ currentChatId , sendMessage , setCurrentChatId , setIsAIResponding , setHasUserSentMessage ] ,
93+ [ currentChatId , sendMessage , setCurrentChatId , setIsAIResponding ] ,
9894 ) ;
9995
10096 const handleExampleSelect = useCallback (
@@ -115,15 +111,35 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
115111 if ( response . status == 'fail' ) return ;
116112 setCurrentChatId ( chatId ) ;
117113 addExistingMessages ( chatId , response . data . messages ) ;
118- resetAtomState ( false ) ;
114+ resetAtomState ( ) ;
119115 } ,
120116 [ setCurrentChatId , resetAtomState ] ,
121117 ) ;
122118
119+ const handleFileChange = async ( event : ChangeEvent < HTMLInputElement > ) => {
120+ const files = event . target . files ;
121+ if ( files && files . length > 0 ) {
122+ const formData = new FormData ( ) ;
123+ formData . append ( 'file' , files [ 0 ] ) ;
124+ const response = await postChatUpload ( formData ) ;
125+ if ( response . status === 'fail' ) {
126+ console . error ( response . message ) ;
127+ return ;
128+ }
129+ const newMessageImage : MessageImage = {
130+ src : response . data ,
131+ name : response . data ,
132+ content : '이걸 발견했다면 프론트엔드 개발자한테 "ChatInputBox 수정하세요" 라고 말하면 됩니다.' ,
133+ tags : [ '응애' ] ,
134+ } ;
135+ setInputImage ( newMessageImage ) ;
136+ }
137+ } ;
138+
123139 const handleNewChat = useCallback ( ( ) => {
124140 if ( chatRoomError ) return ;
125141 setCurrentChatId ( null ) ;
126- resetAtomState ( false ) ;
142+ resetAtomState ( ) ;
127143 } , [ chatRoomError , setCurrentChatId , resetAtomState ] ) ;
128144
129145 const handleOpenTab = useCallback (
@@ -183,6 +199,7 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
183199 setImageTabs ,
184200 activeImageTabId ,
185201 setActiveImageTabId ,
202+ handleFileChange ,
186203 wikiTabs ,
187204 setWikiTabs ,
188205 activeWikiTabId ,
@@ -195,6 +212,7 @@ export const ChatContextProvider = ({ children }: { children: ReactNode }) => {
195212 handleExampleSelect,
196213 handleSendMessage,
197214 handleChatSelect,
215+ handleFileChange,
198216 handleNewChat,
199217 handleOpenTab,
200218 handleCloseTab,
0 commit comments