153 lines
4.1 KiB
TypeScript
153 lines
4.1 KiB
TypeScript
import { useContext, useEffect, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import { useCreateReducer } from '@/hooks/useCreateReducer';
|
|
|
|
import { savePrompts } from '@/utils/app/prompts';
|
|
|
|
import { OpenAIModels } from '@/types/openai';
|
|
import { Prompt } from '@/types/prompt';
|
|
|
|
import HomeContext from '@/pages/api/home/home.context';
|
|
|
|
import { PromptFolders } from './components/PromptFolders';
|
|
import { PromptbarSettings } from './components/PromptbarSettings';
|
|
import { Prompts } from './components/Prompts';
|
|
|
|
import Sidebar from '../Sidebar';
|
|
import PromptbarContext from './PromptBar.context';
|
|
import { PromptbarInitialState, initialState } from './Promptbar.state';
|
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
const Promptbar = () => {
|
|
const { t } = useTranslation('promptbar');
|
|
|
|
const promptBarContextValue = useCreateReducer<PromptbarInitialState>({
|
|
initialState,
|
|
});
|
|
|
|
const {
|
|
state: { prompts, defaultModelId, showPromptbar },
|
|
dispatch: homeDispatch,
|
|
handleCreateFolder,
|
|
} = useContext(HomeContext);
|
|
|
|
const {
|
|
state: { searchTerm, filteredPrompts },
|
|
dispatch: promptDispatch,
|
|
} = promptBarContextValue;
|
|
|
|
const handleTogglePromptbar = () => {
|
|
homeDispatch({ field: 'showPromptbar', value: !showPromptbar });
|
|
localStorage.setItem('showPromptbar', JSON.stringify(!showPromptbar));
|
|
};
|
|
|
|
const handleCreatePrompt = () => {
|
|
if (defaultModelId) {
|
|
const newPrompt: Prompt = {
|
|
id: uuidv4(),
|
|
name: `Prompt ${prompts.length + 1}`,
|
|
description: '',
|
|
content: '',
|
|
model: OpenAIModels[defaultModelId],
|
|
folderId: null,
|
|
};
|
|
|
|
const updatedPrompts = [...prompts, newPrompt];
|
|
|
|
homeDispatch({ field: 'prompts', value: updatedPrompts });
|
|
|
|
savePrompts(updatedPrompts);
|
|
}
|
|
};
|
|
|
|
const handleDeletePrompt = (prompt: Prompt) => {
|
|
const updatedPrompts = prompts.filter((p) => p.id !== prompt.id);
|
|
|
|
homeDispatch({ field: 'prompts', value: updatedPrompts });
|
|
savePrompts(updatedPrompts);
|
|
};
|
|
|
|
const handleUpdatePrompt = (prompt: Prompt) => {
|
|
const updatedPrompts = prompts.map((p) => {
|
|
if (p.id === prompt.id) {
|
|
return prompt;
|
|
}
|
|
|
|
return p;
|
|
});
|
|
homeDispatch({ field: 'prompts', value: updatedPrompts });
|
|
|
|
savePrompts(updatedPrompts);
|
|
};
|
|
|
|
const handleDrop = (e: any) => {
|
|
if (e.dataTransfer) {
|
|
const prompt = JSON.parse(e.dataTransfer.getData('prompt'));
|
|
|
|
const updatedPrompt = {
|
|
...prompt,
|
|
folderId: e.target.dataset.folderId,
|
|
};
|
|
|
|
handleUpdatePrompt(updatedPrompt);
|
|
|
|
e.target.style.background = 'none';
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (searchTerm) {
|
|
promptDispatch({
|
|
field: 'filteredPrompts',
|
|
value: prompts.filter((prompt) => {
|
|
const searchable =
|
|
prompt.name.toLowerCase() +
|
|
' ' +
|
|
prompt.description.toLowerCase() +
|
|
' ' +
|
|
prompt.content.toLowerCase();
|
|
return searchable.includes(searchTerm.toLowerCase());
|
|
}),
|
|
});
|
|
} else {
|
|
promptDispatch({ field: 'filteredPrompts', value: prompts });
|
|
}
|
|
}, [searchTerm, prompts]);
|
|
|
|
return (
|
|
<PromptbarContext.Provider
|
|
value={{
|
|
...promptBarContextValue,
|
|
handleCreatePrompt,
|
|
handleDeletePrompt,
|
|
handleUpdatePrompt,
|
|
}}
|
|
>
|
|
<Sidebar<Prompt>
|
|
side={'right'}
|
|
isOpen={showPromptbar}
|
|
addItemButtonTitle={t('New prompt')}
|
|
itemComponent={
|
|
<Prompts
|
|
prompts={filteredPrompts.filter((prompt) => !prompt.folderId)}
|
|
/>
|
|
}
|
|
folderComponent={<PromptFolders />}
|
|
items={filteredPrompts}
|
|
searchTerm={searchTerm}
|
|
handleSearchTerm={(searchTerm: string) =>
|
|
promptDispatch({ field: 'searchTerm', value: searchTerm })
|
|
}
|
|
toggleOpen={handleTogglePromptbar}
|
|
handleCreateItem={handleCreatePrompt}
|
|
handleCreateFolder={() => handleCreateFolder(t('New folder'), 'prompt')}
|
|
handleDrop={handleDrop}
|
|
/>
|
|
</PromptbarContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default Promptbar;
|