Spaces:
Paused
Paused
| 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; | |