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({ 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 ( side={'right'} isOpen={showPromptbar} addItemButtonTitle={t('New prompt')} itemComponent={ !prompt.folderId)} /> } folderComponent={} items={filteredPrompts} searchTerm={searchTerm} handleSearchTerm={(searchTerm: string) => promptDispatch({ field: 'searchTerm', value: searchTerm }) } toggleOpen={handleTogglePromptbar} handleCreateItem={handleCreatePrompt} handleCreateFolder={() => handleCreateFolder(t('New folder'), 'prompt')} handleDrop={handleDrop} /> ); }; export default Promptbar;