import { createListenerMiddleware, createSlice, isAnyOf, } from '@reduxjs/toolkit'; import { Doc, setLocalApiKey, setLocalRecentDocs } from './preferenceApi'; import { RootState } from '../store'; interface Preference { apiKey: string; prompt: { name: string; id: string; type: string }; selectedDocs: Doc | null; sourceDocs: Doc[] | null; conversations: { name: string; id: string }[] | null; } const initialState: Preference = { apiKey: 'xxx', prompt: { name: 'default', id: 'default', type: 'public' }, selectedDocs: { name: 'default', language: 'default', location: 'default', version: 'default', description: 'default', fullName: 'default', date: 'default', docLink: 'default', model: 'openai_text-embedding-ada-002', } as Doc, sourceDocs: null, conversations: null, }; export const prefSlice = createSlice({ name: 'preference', initialState, reducers: { setApiKey: (state, action) => { state.apiKey = action.payload; }, setSelectedDocs: (state, action) => { state.selectedDocs = action.payload; }, setSourceDocs: (state, action) => { state.sourceDocs = action.payload; }, setConversations: (state, action) => { state.conversations = action.payload; }, setPrompt: (state, action) => { state.prompt = action.payload; }, }, }); export const { setApiKey, setSelectedDocs, setSourceDocs, setConversations, setPrompt, } = prefSlice.actions; export default prefSlice.reducer; export const prefListenerMiddleware = createListenerMiddleware(); prefListenerMiddleware.startListening({ matcher: isAnyOf(setApiKey), effect: (action, listenerApi) => { setLocalApiKey((listenerApi.getState() as RootState).preference.apiKey); }, }); prefListenerMiddleware.startListening({ matcher: isAnyOf(setSelectedDocs), effect: (action, listenerApi) => { setLocalRecentDocs( (listenerApi.getState() as RootState).preference.selectedDocs ?? ([] as unknown as Doc), ); }, }); prefListenerMiddleware.startListening({ matcher: isAnyOf(setPrompt), effect: (action, listenerApi) => { localStorage.setItem( 'DocsGPTPrompt', JSON.stringify((listenerApi.getState() as RootState).preference.prompt), ); }, }); export const selectApiKey = (state: RootState) => state.preference.apiKey; export const selectApiKeyStatus = (state: RootState) => !!state.preference.apiKey; export const selectSelectedDocsStatus = (state: RootState) => !!state.preference.selectedDocs; export const selectSourceDocs = (state: RootState) => state.preference.sourceDocs; export const selectSelectedDocs = (state: RootState) => state.preference.selectedDocs; export const selectConversations = (state: RootState) => state.preference.conversations; export const selectConversationId = (state: RootState) => state.conversation.conversationId; export const selectPrompt = (state: RootState) => state.preference.prompt;