mirror of https://github.com/arc53/DocsGPT
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.7 KiB
TypeScript
134 lines
3.7 KiB
TypeScript
import {
|
|
createListenerMiddleware,
|
|
createSlice,
|
|
isAnyOf,
|
|
} from '@reduxjs/toolkit';
|
|
import { Doc, setLocalApiKey, setLocalRecentDocs } from './preferenceApi';
|
|
import { RootState } from '../store';
|
|
import { ActiveState } from '../models/misc';
|
|
|
|
interface Preference {
|
|
apiKey: string;
|
|
prompt: { name: string; id: string; type: string };
|
|
selectedDocs: Doc | null;
|
|
chunks: string;
|
|
sourceDocs: Doc[] | null;
|
|
conversations: { name: string; id: string }[] | null;
|
|
modalState: ActiveState;
|
|
}
|
|
|
|
const initialState: Preference = {
|
|
apiKey: 'xxx',
|
|
prompt: { name: 'default', id: 'default', type: 'public' },
|
|
chunks: '2',
|
|
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,
|
|
modalState: 'ACTIVE',
|
|
};
|
|
|
|
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;
|
|
},
|
|
setChunks: (state, action) => {
|
|
state.chunks = action.payload;
|
|
},
|
|
setModalStateDeleteConv: (state, action) => {
|
|
state.modalState = action.payload;
|
|
},
|
|
},
|
|
});
|
|
|
|
export const {
|
|
setApiKey,
|
|
setSelectedDocs,
|
|
setSourceDocs,
|
|
setConversations,
|
|
setPrompt,
|
|
setChunks,
|
|
setModalStateDeleteConv,
|
|
} = 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),
|
|
);
|
|
},
|
|
});
|
|
|
|
prefListenerMiddleware.startListening({
|
|
matcher: isAnyOf(setChunks),
|
|
effect: (action, listenerApi) => {
|
|
localStorage.setItem(
|
|
'DocsGPTChunks',
|
|
JSON.stringify((listenerApi.getState() as RootState).preference.chunks),
|
|
);
|
|
},
|
|
});
|
|
|
|
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 selectModalStateDeleteConv = (state: RootState) =>
|
|
state.preference.modalState;
|
|
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;
|
|
export const selectChunks = (state: RootState) => state.preference.chunks;
|