Spaces:
Runtime error
Runtime error
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; | |