| 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; | |