11"use client" ;
22
3- import { ChatWithMessages } from "@/lib/chatHistory" ;
43import {
54 createContext ,
65 ReactNode ,
@@ -9,10 +8,15 @@ import {
98 useState ,
109} from "react" ;
1110
11+ export interface ChatMessage {
12+ sender : "user" | "ai" | "error" ;
13+ text : string ;
14+ }
15+
1216export interface IChatHistoryContext {
13- chatHistories : ChatWithMessages [ ] ;
14- addChat : ( chat : ChatWithMessages ) => void ;
15- // updateChat: (sectionId: string, chatId: string, message: ChatMessage) => void;
17+ chatHistories : Record < string , Record < string , ChatMessage [ ] > > ;
18+ addChat : ( sectionId : string , messages : ChatMessage [ ] ) => string ;
19+ updateChat : ( sectionId : string , chatId : string , message : ChatMessage ) => void ;
1620}
1721const ChatHistoryContext = createContext < IChatHistoryContext | null > ( null ) ;
1822export function useChatHistoryContext ( ) {
@@ -25,26 +29,65 @@ export function useChatHistoryContext() {
2529 return context ;
2630}
2731
28- export function ChatHistoryProvider ( {
29- children,
30- initialChatHistories,
31- } : {
32- children : ReactNode ;
33- initialChatHistories : ChatWithMessages [ ] ;
34- } ) {
35- const [ chatHistories , setChatHistories ] =
36- useState < ChatWithMessages [ ] > ( initialChatHistories ) ;
32+ export function ChatHistoryProvider ( { children } : { children : ReactNode } ) {
33+ const [ chatHistories , setChatHistories ] = useState <
34+ Record < string , Record < string , ChatMessage [ ] > >
35+ > ( { } ) ;
3736 useEffect ( ( ) => {
38- setChatHistories ( initialChatHistories ) ;
39- } , [ initialChatHistories ] ) ;
37+ // Load chat histories from localStorage on mount
38+ const chatHistories : Record < string , Record < string , ChatMessage [ ] > > = { } ;
39+ for ( let i = 0 ; i < localStorage . length ; i ++ ) {
40+ const key = localStorage . key ( i ) ;
41+ if ( key && key . startsWith ( "chat/" ) && key . split ( "/" ) . length === 3 ) {
42+ const savedHistory = localStorage . getItem ( key ) ;
43+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
44+ const [ _ , sectionId , chatId ] = key . split ( "/" ) ;
45+ if ( savedHistory ) {
46+ if ( ! chatHistories [ sectionId ] ) {
47+ chatHistories [ sectionId ] = { } ;
48+ }
49+ chatHistories [ sectionId ] [ chatId ] = JSON . parse ( savedHistory ) ;
50+ }
51+ }
52+ }
53+ setChatHistories ( chatHistories ) ;
54+ } , [ ] ) ;
4055
41- const addChat = ( chat : ChatWithMessages ) => {
42- // サーバー側で追加された新しいchatをクライアント側にも反映する
43- setChatHistories ( [ ...chatHistories , chat ] ) ;
56+ const addChat = ( sectionId : string , messages : ChatMessage [ ] ) : string => {
57+ const chatId = Date . now ( ) . toString ( ) ;
58+ const newChatHistories = { ...chatHistories } ;
59+ if ( ! newChatHistories [ sectionId ] ) {
60+ newChatHistories [ sectionId ] = { } ;
61+ }
62+ newChatHistories [ sectionId ] [ chatId ] = messages ;
63+ setChatHistories ( newChatHistories ) ;
64+ localStorage . setItem (
65+ `chat/${ sectionId } /${ chatId } ` ,
66+ JSON . stringify ( messages )
67+ ) ;
68+ return chatId ;
69+ } ;
70+ const updateChat = (
71+ sectionId : string ,
72+ chatId : string ,
73+ message : ChatMessage
74+ ) => {
75+ const newChatHistories = { ...chatHistories } ;
76+ if ( newChatHistories [ sectionId ] && newChatHistories [ sectionId ] [ chatId ] ) {
77+ newChatHistories [ sectionId ] [ chatId ] = [
78+ ...newChatHistories [ sectionId ] [ chatId ] ,
79+ message ,
80+ ] ;
81+ setChatHistories ( newChatHistories ) ;
82+ localStorage . setItem (
83+ `chat/${ sectionId } /${ chatId } ` ,
84+ JSON . stringify ( newChatHistories [ sectionId ] [ chatId ] )
85+ ) ;
86+ }
4487 } ;
4588
4689 return (
47- < ChatHistoryContext . Provider value = { { chatHistories, addChat } } >
90+ < ChatHistoryContext . Provider value = { { chatHistories, addChat, updateChat } } >
4891 { children }
4992 </ ChatHistoryContext . Provider >
5093 ) ;
0 commit comments