diff --git a/frontend/src/Setting.tsx b/frontend/src/Setting.tsx index 05555cb9..3bc45be7 100644 --- a/frontend/src/Setting.tsx +++ b/frontend/src/Setting.tsx @@ -1,176 +1,317 @@ -import React, { useState, useRef } from 'react'; +import React, { useState } from 'react'; import Arrow2 from './assets/dropdown-arrow.svg'; import ArrowLeft from './assets/arrow-left.svg'; import ArrowRight from './assets/arrow-right.svg'; -const Setting = () => { - const list = ['General', 'Prompts', 'Documents', 'Widgets']; - const [active, setActive] = useState('General'); - const returnActiveTabs = (): JSX.Element => { - if (active === 'General') return ; - else if (active === 'Prompts') return ; - else if (active === 'Documents') return ; - else if (active === 'Widgets') return ; - else return <>; - }; - const scrollableRef = useRef(null); - const scrollStep = 100; - const scrollLeft = () => { - if (scrollableRef.current) { - if (scrollableRef.current.scrollLeft > 0) { - scrollableRef.current.scrollLeft -= scrollStep; // Adjust the scroll amount as needed - } - } +type PromptProps = { + prompts: string[]; + selectedPrompt: string; + onSelectPrompt: (prompt: string) => void; + onAddPrompt: (name: string) => void; + newPromptName: string; + onNewPromptNameChange: (name: string) => void; + isAddPromptModalOpen: boolean; + onToggleAddPromptModal: () => void; + onDeletePrompt: (name: string) => void; +}; + +const Setting: React.FC = () => { + const tabs = ['General', 'Prompts', 'Documents', 'Widgets']; + const [activeTab, setActiveTab] = useState('General'); + const [prompts, setPrompts] = useState(['Prompt 1', 'Prompt 2']); + const [selectedPrompt, setSelectedPrompt] = useState(''); + const [newPromptName, setNewPromptName] = useState(''); + const [isAddPromptModalOpen, setAddPromptModalOpen] = useState(false); + const onDeletePrompt = (name: string) => { + setPrompts(prompts.filter((prompt) => prompt !== name)); + setSelectedPrompt(''); // Clear the selected prompt }; - const scrollRight = () => { - if (scrollableRef.current) { - scrollableRef.current.scrollLeft += scrollStep; // Adjust the scroll amount as needed - } - }; return ( -
+

Settings

-
-
-
- -
+
+
+
-
- {list.map((item, index) => ( -
+ {tabs.map((tab, index) => ( +
+ {tab} + ))}
-
-
- -
+
+
- {returnActiveTabs()} + {renderActiveTab()} +
+ ); + + function scrollTabs(direction: number) { + const container = document.querySelector('.flex-nowrap'); + if (container) { + container.scrollLeft += direction * 100; // Adjust the scroll amount as needed + } + } + + function renderActiveTab() { + switch (activeTab) { + case 'General': + return ; + case 'Prompts': + return ( + + ); + case 'Documents': + return ; + case 'Widgets': + return ; + default: + return null; + } + } + + function addPrompt(name: string) { + if (name) { + setPrompts([...prompts, name]); + setNewPromptName(''); + toggleAddPromptModal(); + } + } + + function toggleAddPromptModal() { + setAddPromptModalOpen(!isAddPromptModalOpen); + } +}; + +const General: React.FC = () => { + const themes = ['Light', 'Dark']; + const languages = ['English', 'French', 'Hindi']; + const [selectedTheme, setSelectedTheme] = useState(themes[0]); + const [selectedLanguage, setSelectedLanguage] = useState(languages[0]); + + return ( +
+
+

Select Theme

+ +
+
+

Select Language

+ +
); }; -const General = () => { - const [theme, setTheme] = useState('Light'); - const [isThemeListOpen, setIsThemeListOpen] = useState(false); - const themes = ['Light', 'Dark (WIP)']; - const [language, setLanguage] = useState('English'); - const languages = ['English']; - const [isLanguageListOpen, setIsLanguageListOpen] = useState(false); +export default Setting; + +const Prompts: React.FC = ({ + prompts, + selectedPrompt, + onSelectPrompt, + onAddPrompt, + onDeletePrompt, +}) => { + const [isAddPromptModalOpen, setAddPromptModalOpen] = useState(false); + const [newPromptName, setNewPromptName] = useState(''); + + const openAddPromptModal = () => { + setAddPromptModalOpen(true); + }; + + const closeAddPromptModal = () => { + setAddPromptModalOpen(false); + }; + + const handleDeletePrompt = () => { + if (selectedPrompt) { + onDeletePrompt(selectedPrompt); // Remove the selected prompt + } + }; + return ( - <> -
-

Select Theme

-
-
setIsThemeListOpen(!isThemeListOpen)} - > - {theme && ( -

{theme}

- )} - arrow -
- {isThemeListOpen && ( -
- {themes.map((item, index) => ( -
{ - setTheme(item); - setIsThemeListOpen(false); - }} - className="flex h-10 w-full cursor-pointer items-center justify-between border-x-2 border-b-2 hover:bg-gray-100" - > -

- {item} -

-
- ))} -
- )} -
+
+
+

Select Prompt

+
-
-

Select Language

-
-
setIsLanguageListOpen(!isLanguageListOpen)} - > - {language && ( -

- {language} -

- )} - arrow -
- {isLanguageListOpen && ( -
- {languages.map((item, index) => ( -
{ - setLanguage(item); - setIsLanguageListOpen(false); - }} - className="flex h-10 w-full cursor-pointer items-center justify-between border-x-2 border-b-2 hover:bg-gray-100" - > -

- {item} -

-
- ))} -
- )} -
+
+
- + {isAddPromptModalOpen && ( + { + onAddPrompt(newPromptName); + closeAddPromptModal(); + }} + onClose={closeAddPromptModal} + /> + )} +
+ +
+
); }; -const Prompts = () => { - return
This is prompts WIP
; + +function Dropdown({ + options, + selectedValue, + onSelect, +}: { + options: string[]; + selectedValue: string; + onSelect: (value: string) => void; +}) { + const [isOpen, setIsOpen] = useState(false); + + return ( +
+ + {isOpen && ( +
+ {options.map((option, index) => ( +
{ + onSelect(option); + setIsOpen(false); + }} + className="flex cursor-pointer items-center justify-between border-b-2 py-3 hover:bg-gray-100" + > + + {option} + +
+ ))} +
+ )} +
+ ); +} + +type AddPromptModalProps = { + newPromptName: string; + onNewPromptNameChange: (name: string) => void; + onAddPrompt: () => void; + onClose: () => void; }; -const Documents = () => { - return
This is Documents WIP
; + +const AddPromptModal: React.FC = ({ + newPromptName, + onNewPromptNameChange, + onAddPrompt, + onClose, +}) => { + return ( +
+
+

Add New Prompt

+ onNewPromptNameChange(e.target.value)} + className="mb-4 w-full rounded-lg border-2 p-2" + /> + + +
+
+ ); }; -const Widgets = () => { - return
This is widgets WIP
; + +const Documents: React.FC = () => { + return ( +
+

This is the Documents section.

+
+ ); +}; + +const Widgets: React.FC = () => { + return
This is widgets
; }; -export default Setting;