|
import { useContext, useEffect, useState } from 'react'; |
|
import { useTranslation } from 'react-i18next'; |
|
|
|
import { useCreateReducer } from '@/hooks/useCreateReducer'; |
|
|
|
import { savePrompts } from '@/utils/app/prompts'; |
|
|
|
import { OllamaModels } from '@/types/ollama'; |
|
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: OllamaModels[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, promptDispatch]); |
|
|
|
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; |
|
|