diff --git a/components/Chat/Chat.tsx b/components/Chat/Chat.tsx index 9898a33..e618585 100644 --- a/components/Chat/Chat.tsx +++ b/components/Chat/Chat.tsx @@ -1,4 +1,4 @@ -import { IconArrowDown, IconClearAll, IconSettings } from '@tabler/icons-react'; +import { IconClearAll, IconSettings } from '@tabler/icons-react'; import { MutableRefObject, memo, @@ -467,6 +467,11 @@ export const Chat = memo(({ stopConversationRef }: Props) => { key={index} message={message} messageIndex={index} + onEdit={(editedMessage) => { + setCurrentMessage(editedMessage); + // discard edited message and the ones that come after then resend + handleSend(editedMessage, selectedConversation?.messages.length - index); + }} /> ))} @@ -487,24 +492,16 @@ export const Chat = memo(({ stopConversationRef }: Props) => { setCurrentMessage(message); handleSend(message, 0, plugin); }} + onScrollDownClick={handleScrollDown} onRegenerate={() => { if (currentMessage) { handleSend(currentMessage, 2, null); } }} + showScrollDownButton={showScrollDownButton} /> )} - {showScrollDownButton && ( -
- -
- )} ); }); diff --git a/components/Chat/ChatInput.tsx b/components/Chat/ChatInput.tsx index e286573..729702b 100644 --- a/components/Chat/ChatInput.tsx +++ b/components/Chat/ChatInput.tsx @@ -1,4 +1,5 @@ import { + IconArrowDown, IconBolt, IconBrandGoogle, IconPlayerStop, @@ -30,15 +31,19 @@ import { VariableModal } from './VariableModal'; interface Props { onSend: (message: Message, plugin: Plugin | null) => void; onRegenerate: () => void; + onScrollDownClick: () => void; stopConversationRef: MutableRefObject; textareaRef: MutableRefObject; + showScrollDownButton: boolean; } export const ChatInput = ({ onSend, onRegenerate, + onScrollDownClick, stopConversationRef, textareaRef, + showScrollDownButton }: Props) => { const { t } = useTranslation('chat'); @@ -341,6 +346,17 @@ export const ChatInput = ({ )} + {showScrollDownButton && ( +
+ +
+ )} + {showPromptList && filteredPrompts.length > 0 && (
void } -export const ChatMessage: FC = memo(({ message, messageIndex }) => { +export const ChatMessage: FC = memo(({ message, messageIndex, onEdit }) => { const { t } = useTranslation('chat'); const { @@ -57,31 +58,8 @@ export const ChatMessage: FC = memo(({ message, messageIndex }) => { const handleEditMessage = () => { if (message.content != messageContent) { - if (selectedConversation) { - const updatedMessages = selectedConversation.messages - .map((m, i) => { - if (i < messageIndex) { - return m; - } - }) - .filter((m) => m) as Message[]; - - const updatedConversation = { - ...selectedConversation, - messages: updatedMessages, - }; - - const { single, all } = updateConversation( - updatedConversation, - conversations, - ); - - homeDispatch({ field: 'selectedConversation', value: single }); - homeDispatch({ field: 'conversations', value: all }); - homeDispatch({ - field: 'currentMessage', - value: { ...message, content: messageContent }, - }); + if (selectedConversation && onEdit) { + onEdit({ ...message, content: messageContent }); } } setIsEditing(false); diff --git a/components/Chat/Temperature.tsx b/components/Chat/Temperature.tsx index a1085b2..e4ebd28 100644 --- a/components/Chat/Temperature.tsx +++ b/components/Chat/Temperature.tsx @@ -1,9 +1,11 @@ -import { FC, useState } from 'react'; +import { FC, useContext, useState } from 'react'; import { useTranslation } from 'next-i18next'; import { DEFAULT_TEMPERATURE } from '@/utils/app/const'; +import HomeContext from '@/pages/api/home/home.context'; + interface Props { label: string; onChangeTemperature: (temperature: number) => void; @@ -13,7 +15,13 @@ export const TemperatureSlider: FC = ({ label, onChangeTemperature, }) => { - const [temperature, setTemperature] = useState(DEFAULT_TEMPERATURE); + const { + state: { conversations }, + } = useContext(HomeContext); + const lastConversation = conversations[conversations.length - 1]; + const [temperature, setTemperature] = useState( + lastConversation?.temperature ?? DEFAULT_TEMPERATURE, + ); const { t } = useTranslation('chat'); const handleChange = (event: React.ChangeEvent) => { const newValue = parseFloat(event.target.value); @@ -31,7 +39,9 @@ export const TemperatureSlider: FC = ({ 'Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.', )} - {temperature.toFixed(1)} + + {temperature.toFixed(1)} + = ({ value={temperature} onChange={handleChange} /> -
    +
    • {t('Precise')}
    • diff --git a/components/Chatbar/components/ChatbarSettings.tsx b/components/Chatbar/components/ChatbarSettings.tsx index de85399..1ca84a6 100644 --- a/components/Chatbar/components/ChatbarSettings.tsx +++ b/components/Chatbar/components/ChatbarSettings.tsx @@ -1,10 +1,17 @@ -import { IconFileExport, IconMoon, IconSun } from '@tabler/icons-react'; -import { useContext } from 'react'; +import { + IconFileExport, + IconMoon, + IconSettings, + IconSun, +} from '@tabler/icons-react'; +import { useContext, useState } from 'react'; import { useTranslation } from 'next-i18next'; import HomeContext from '@/pages/api/home/home.context'; +import { SettingDialog } from '@/components/Settings/SettingDialog'; + import { Import } from '../../Settings/Import'; import { Key } from '../../Settings/Key'; import { SidebarButton } from '../../Sidebar/SidebarButton'; @@ -14,6 +21,7 @@ import { PluginKeys } from './PluginKeys'; export const ChatbarSettings = () => { const { t } = useTranslation('sidebar'); + const [isSettingDialogOpen, setIsSettingDialog] = useState(false); const { state: { @@ -49,16 +57,9 @@ export const ChatbarSettings = () => { /> : - } - onClick={() => - homeDispatch({ - field: 'lightMode', - value: lightMode === 'light' ? 'dark' : 'light', - }) - } + text={t('Settings')} + icon={} + onClick={() => setIsSettingDialog(true)} /> {!serverSideApiKeyIsSet ? ( @@ -66,6 +67,13 @@ export const ChatbarSettings = () => { ) : null} {!serverSidePluginKeysSet ? : null} + + { + setIsSettingDialog(false); + }} + />
); }; diff --git a/components/Settings/SettingDialog.tsx b/components/Settings/SettingDialog.tsx new file mode 100644 index 0000000..004a9cf --- /dev/null +++ b/components/Settings/SettingDialog.tsx @@ -0,0 +1,105 @@ +import { FC, useContext, useEffect, useReducer, useRef } from 'react'; + +import { useTranslation } from 'next-i18next'; + +import { useCreateReducer } from '@/hooks/useCreateReducer'; + +import { getSettings, saveSettings } from '@/utils/app/settings'; + +import { Settings } from '@/types/settings'; + +import HomeContext from '@/pages/api/home/home.context'; + +interface Props { + open: boolean; + onClose: () => void; +} + +export const SettingDialog: FC = ({ open, onClose }) => { + const { t } = useTranslation('settings'); + const settings: Settings = getSettings(); + const { state, dispatch } = useCreateReducer({ + initialState: settings, + }); + const { dispatch: homeDispatch } = useContext(HomeContext); + const modalRef = useRef(null); + + useEffect(() => { + const handleMouseDown = (e: MouseEvent) => { + if (modalRef.current && !modalRef.current.contains(e.target as Node)) { + window.addEventListener('mouseup', handleMouseUp); + } + }; + + const handleMouseUp = (e: MouseEvent) => { + window.removeEventListener('mouseup', handleMouseUp); + onClose(); + }; + + window.addEventListener('mousedown', handleMouseDown); + + return () => { + window.removeEventListener('mousedown', handleMouseDown); + }; + }, [onClose]); + + const handleSave = () => { + homeDispatch({ field: 'lightMode', value: state.theme }); + saveSettings(state); + }; + + // Render nothing if the dialog is not open. + if (!open) { + return <>; + } + + // Render the dialog. + return ( +
+
+
+ +
+
+ ); +}; diff --git a/next-i18next.config.js b/next-i18next.config.js index fb76560..fd014b7 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -21,6 +21,7 @@ module.exports = { "vi", "zh", "ar", + "tr", ], }, localePath: diff --git a/pages/api/home/home.tsx b/pages/api/home/home.tsx index e5c6239..f973a90 100644 --- a/pages/api/home/home.tsx +++ b/pages/api/home/home.tsx @@ -23,6 +23,7 @@ import { } from '@/utils/app/conversation'; import { saveFolders } from '@/utils/app/folders'; import { savePrompts } from '@/utils/app/prompts'; +import { getSettings } from '@/utils/app/settings'; import { Conversation } from '@/types/chat'; import { KeyValuePair } from '@/types/data'; @@ -68,7 +69,7 @@ const Home = ({ conversations, selectedConversation, prompts, - temperature + temperature, }, dispatch, } = contextValue; @@ -191,7 +192,7 @@ const Home = ({ tokenLimit: OpenAIModels[defaultModelId].tokenLimit, }, prompt: DEFAULT_SYSTEM_PROMPT, - temperature: DEFAULT_TEMPERATURE, + temperature: lastConversation?.temperature ?? DEFAULT_TEMPERATURE, folderId: null, }; @@ -250,9 +251,12 @@ const Home = ({ // ON LOAD -------------------------------------------- useEffect(() => { - const theme = localStorage.getItem('theme'); - if (theme) { - dispatch({ field: 'lightMode', value: theme as 'dark' | 'light' }); + const settings = getSettings(); + if (settings.theme) { + dispatch({ + field: 'lightMode', + value: settings.theme, + }); } const apiKey = localStorage.getItem('apiKey'); @@ -322,6 +326,7 @@ const Home = ({ value: cleanedSelectedConversation, }); } else { + const lastConversation = conversations[conversations.length - 1]; dispatch({ field: 'selectedConversation', value: { @@ -330,7 +335,7 @@ const Home = ({ messages: [], model: OpenAIModels[defaultModelId], prompt: DEFAULT_SYSTEM_PROMPT, - temperature: DEFAULT_TEMPERATURE, + temperature: lastConversation?.temperature ?? DEFAULT_TEMPERATURE, folderId: null, }, }); @@ -419,6 +424,7 @@ export const getServerSideProps: GetServerSideProps = async ({ locale }) => { 'sidebar', 'markdown', 'promptbar', + 'settings', ])), }, }; diff --git a/public/locales/ar/settings.json b/public/locales/ar/settings.json new file mode 100644 index 0000000..9f81a10 --- /dev/null +++ b/public/locales/ar/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "الوضع الداكن", + "Light mode": "الوضع الفاتح" +} diff --git a/public/locales/bn/settings.json b/public/locales/bn/settings.json new file mode 100644 index 0000000..ba14e14 --- /dev/null +++ b/public/locales/bn/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "ডার্ক মোড", + "Light mode": "লাইট মোড" +} diff --git a/public/locales/bn/sidebar.json b/public/locales/bn/sidebar.json index 85be459..b2c6d6d 100644 --- a/public/locales/bn/sidebar.json +++ b/public/locales/bn/sidebar.json @@ -7,7 +7,5 @@ "Import data": "আলাপচারিতা ইমপোর্ট", "Are you sure?": "আপনি কি নিশ্চিত?", "Clear conversations": "কথোপকথন পরিষ্কার করুন", - "Export data": "আলাপচারিতা এক্সপোর্ট", - "Dark mode": "ডার্ক মোড", - "Light mode": "লাইট মোড" + "Export data": "আলাপচারিতা এক্সপোর্ট" } diff --git a/public/locales/de/settings.json b/public/locales/de/settings.json new file mode 100644 index 0000000..e251b18 --- /dev/null +++ b/public/locales/de/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Dark Mode", + "Light mode": "Light Mode" +} diff --git a/public/locales/de/sidebar.json b/public/locales/de/sidebar.json index c417342..5a1411b 100644 --- a/public/locales/de/sidebar.json +++ b/public/locales/de/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Konversationen importieren", "Are you sure?": "Bist du sicher?", "Clear conversations": "Konversationen löschen", - "Export data": "Konversationen exportieren", - "Dark mode": "Dark Mode", - "Light mode": "Light Mode" + "Export data": "Konversationen exportieren" } diff --git a/public/locales/es/settings.json b/public/locales/es/settings.json new file mode 100644 index 0000000..bbc73eb --- /dev/null +++ b/public/locales/es/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Modo oscuro", + "Light mode": "Modo claro" +} diff --git a/public/locales/es/sidebar.json b/public/locales/es/sidebar.json index b4c24ec..b5374b3 100644 --- a/public/locales/es/sidebar.json +++ b/public/locales/es/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importar conversaciones", "Are you sure?": "¿Estás seguro?", "Clear conversations": "Borrar conversaciones", - "Export data": "Exportar conversaciones", - "Dark mode": "Modo oscuro", - "Light mode": "Modo claro" + "Export data": "Exportar conversaciones" } diff --git a/public/locales/fr/settings.json b/public/locales/fr/settings.json new file mode 100644 index 0000000..776539e --- /dev/null +++ b/public/locales/fr/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Mode sombre", + "Light mode": "Mode clair" +} diff --git a/public/locales/fr/sidebar.json b/public/locales/fr/sidebar.json index e8af126..dded5b8 100644 --- a/public/locales/fr/sidebar.json +++ b/public/locales/fr/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importer des conversations", "Are you sure?": "Êtes-vous sûr ?", "Clear conversations": "Effacer les conversations", - "Export data": "Exporter les conversations", - "Dark mode": "Mode sombre", - "Light mode": "Mode clair" + "Export data": "Exporter les conversations" } diff --git a/public/locales/he/settings.json b/public/locales/he/settings.json new file mode 100644 index 0000000..9a57b5a --- /dev/null +++ b/public/locales/he/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "מצב כהה", + "Light mode": "מצב בהיר" +} diff --git a/public/locales/he/sidebar.json b/public/locales/he/sidebar.json index 16646fd..c2f07de 100644 --- a/public/locales/he/sidebar.json +++ b/public/locales/he/sidebar.json @@ -7,7 +7,5 @@ "Import data": "ייבוא שיחות", "Are you sure?": "אתה בטוח?", "Clear conversations": "ניקוי שיחות", - "Export data": "ייצוא שיחות", - "Dark mode": "מצב כהה", - "Light mode": "מצב בהיר" + "Export data": "ייצוא שיחות" } diff --git a/public/locales/id/settings.json b/public/locales/id/settings.json new file mode 100644 index 0000000..1df5b73 --- /dev/null +++ b/public/locales/id/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Mode gelap", + "Light mode": "Mode terang" +} diff --git a/public/locales/id/sidebar.json b/public/locales/id/sidebar.json index 79c82fc..2e3d982 100644 --- a/public/locales/id/sidebar.json +++ b/public/locales/id/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Impor percakapan", "Are you sure?": "Apakah Anda yakin?", "Clear conversations": "Hapus percakapan", - "Export data": "Ekspor percakapan", - "Dark mode": "Mode gelap", - "Light mode": "Mode terang" + "Export data": "Ekspor percakapan" } diff --git a/public/locales/it/settings.json b/public/locales/it/settings.json new file mode 100644 index 0000000..5abbcd3 --- /dev/null +++ b/public/locales/it/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Modalità scura", + "Light mode": "Modalità chiara" +} diff --git a/public/locales/it/sidebar.json b/public/locales/it/sidebar.json index 14886e1..385d2ac 100644 --- a/public/locales/it/sidebar.json +++ b/public/locales/it/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importa dati", "Are you sure?": "Sei sicuro?", "Clear conversations": "Elimina conversazioni", - "Export data": "Esporta dati", - "Dark mode": "Modalità scura", - "Light mode": "Modalità chiara" + "Export data": "Esporta dati" } diff --git a/public/locales/ja/settings.json b/public/locales/ja/settings.json new file mode 100644 index 0000000..71de70b --- /dev/null +++ b/public/locales/ja/settings.json @@ -0,0 +1,7 @@ +{ + "Settings": "設定", + "Theme": "テーマ", + "Save": "保存", + "Dark mode": "ダークモード", + "Light mode": "ライトモード" +} diff --git a/public/locales/ja/sidebar.json b/public/locales/ja/sidebar.json index d1c0349..74da736 100644 --- a/public/locales/ja/sidebar.json +++ b/public/locales/ja/sidebar.json @@ -9,5 +9,6 @@ "Clear conversations": " 会話をクリア", "Export data": "会話履歴をエクスポート", "Dark mode": "ダークモード", - "Light mode": "ライトモード" + "Light mode": "ライトモード", + "Settings": "設定" } diff --git a/public/locales/ko/settings.json b/public/locales/ko/settings.json new file mode 100644 index 0000000..b2e5ec6 --- /dev/null +++ b/public/locales/ko/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "다크 모드", + "Light mode": "라이트 모드" +} diff --git a/public/locales/ko/sidebar.json b/public/locales/ko/sidebar.json index b75ae2e..f233b7a 100644 --- a/public/locales/ko/sidebar.json +++ b/public/locales/ko/sidebar.json @@ -7,7 +7,5 @@ "Import data": "대화 가져오기", "Are you sure?": "확실합니까?", "Clear conversations": "대화 지우기", - "Export data": "대화 내보내기", - "Dark mode": "다크 모드", - "Light mode": "라이트 모드" + "Export data": "대화 내보내기" } diff --git a/public/locales/pl/settings.json b/public/locales/pl/settings.json new file mode 100644 index 0000000..672785d --- /dev/null +++ b/public/locales/pl/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Tryb ciemny", + "Light mode": "Tryb jasny" +} diff --git a/public/locales/pl/sidebar.json b/public/locales/pl/sidebar.json index 175dfc8..81b6c5a 100644 --- a/public/locales/pl/sidebar.json +++ b/public/locales/pl/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Import rozmów", "Are you sure?": "Czy jesteś pewien?", "Clear conversations": "Usuń rozmowy", - "Export data": "Eksport rozmów", - "Dark mode": "Tryb ciemny", - "Light mode": "Tryb jasny" + "Export data": "Eksport rozmów" } diff --git a/public/locales/pt/settings.json b/public/locales/pt/settings.json new file mode 100644 index 0000000..530f4ca --- /dev/null +++ b/public/locales/pt/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Modo escuro", + "Light mode": "Modo claro" +} diff --git a/public/locales/pt/sidebar.json b/public/locales/pt/sidebar.json index e772aa1..f9e8966 100644 --- a/public/locales/pt/sidebar.json +++ b/public/locales/pt/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importar conversas", "Are you sure?": "Tem certeza?", "Clear conversations": "Apagar conversas", - "Export data": "Exportar conversas", - "Dark mode": "Modo escuro", - "Light mode": "Modo claro" + "Export data": "Exportar conversas" } diff --git a/public/locales/ro/settings.json b/public/locales/ro/settings.json new file mode 100644 index 0000000..d2bf1b7 --- /dev/null +++ b/public/locales/ro/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Modul întunecat", + "Light mode": "Modul de golire" +} diff --git a/public/locales/ro/sidebar.json b/public/locales/ro/sidebar.json index b7a4b49..d4bb80a 100644 --- a/public/locales/ro/sidebar.json +++ b/public/locales/ro/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importați conversații", "Are you sure?": "Esti sigur?", "Clear conversations": "Ștergeți conversațiile", - "Export data": "Exportați conversații", - "Dark mode": "Modul întunecat", - "Light mode": "Modul de golire" -} \ No newline at end of file + "Export data": "Exportați conversații" +} diff --git a/public/locales/ru/settings.json b/public/locales/ru/settings.json new file mode 100644 index 0000000..d03b2e3 --- /dev/null +++ b/public/locales/ru/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Темный режим", + "Light mode": "Светлый режим" +} diff --git a/public/locales/ru/sidebar.json b/public/locales/ru/sidebar.json index 54bb4e2..e94def0 100644 --- a/public/locales/ru/sidebar.json +++ b/public/locales/ru/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Импортировать чаты", "Are you sure?": "Вы уверены?", "Clear conversations": "Удалить чаты", - "Export data": "Экспортировать чаты", - "Dark mode": "Темный режим", - "Light mode": "Светлый режим" + "Export data": "Экспортировать чаты" } diff --git a/public/locales/si/settings.json b/public/locales/si/settings.json new file mode 100644 index 0000000..eccd7db --- /dev/null +++ b/public/locales/si/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "අඳුරු මාදිලිය", + "Light mode": "ආලෝක මාදිලිය" +} diff --git a/public/locales/si/sidebar.json b/public/locales/si/sidebar.json index 539c25f..eb9c26b 100644 --- a/public/locales/si/sidebar.json +++ b/public/locales/si/sidebar.json @@ -7,7 +7,5 @@ "Import data": "සංවාද ආයාත කරන්න", "Are you sure?": "ඔබට විශ්වාස ද?", "Clear conversations": "සංවාද මකන්න", - "Export data": "සංවාද නිර්යාත කරන්න", - "Dark mode": "අඳුරු මාදිලිය", - "Light mode": "ආලෝක මාදිලිය" + "Export data": "සංවාද නිර්යාත කරන්න" } diff --git a/public/locales/sv/settings.json b/public/locales/sv/settings.json new file mode 100644 index 0000000..ca66633 --- /dev/null +++ b/public/locales/sv/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Mörkt läge", + "Light mode": "Ljust läge" +} diff --git a/public/locales/sv/sidebar.json b/public/locales/sv/sidebar.json index 0db3fa3..755976e 100644 --- a/public/locales/sv/sidebar.json +++ b/public/locales/sv/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Importera konversationer", "Are you sure?": "Är du säker?", "Clear conversations": "Radera konversationer", - "Export data": "Exportera konversationer", - "Dark mode": "Mörkt läge", - "Light mode": "Ljust läge" + "Export data": "Exportera konversationer" } diff --git a/public/locales/te/settings.json b/public/locales/te/settings.json new file mode 100644 index 0000000..6502c36 --- /dev/null +++ b/public/locales/te/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "డార్క్ మోడ్", + "Light mode": "లైట్ మోడ్" +} diff --git a/public/locales/te/sidebar.json b/public/locales/te/sidebar.json index 246a1d1..7b6b148 100644 --- a/public/locales/te/sidebar.json +++ b/public/locales/te/sidebar.json @@ -7,7 +7,5 @@ "Import data": "సంభాషణలు దిగుమతి చేయండి", "Are you sure?": "మీరు ఖచ్చితంగా ఉన్నారా?", "Clear conversations": "సంభాషణలు తొలగించు", - "Export data": "సంభాషణలు ఎగుమతి చేయండి", - "Dark mode": "డార్క్ మోడ్", - "Light mode": "లైట్ మోడ్" + "Export data": "సంభాషణలు ఎగుమతి చేయండి" } diff --git a/public/locales/tr/chat.json b/public/locales/tr/chat.json new file mode 100644 index 0000000..04fb868 --- /dev/null +++ b/public/locales/tr/chat.json @@ -0,0 +1,28 @@ +{ + "OpenAI API Key Required": "OpenAI API Anahtarı Gerekli", + "Please set your OpenAI API key in the bottom left of the sidebar.": "Lütfen OpenAI API anahtarınızı yan çubuğun sol altınan'dan ayarlayın.", + "Stop Generating": "Durdur", + "Prompt limit is {{maxLength}} characters": "Prompt sınırı {{maxLength}} karakterdir", + "System Prompt": "Sistem Prompt", + "You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown.": "Sen ChatGPT'sin, OpenAI tarafından eğitilmiş büyük bir dil modelisin. Kullanıcının talimatlarını dikkatlice takip et. Yanıtını markdown kullanarak ver.", + "Enter a prompt": "Bir prompt girin", + "Regenerate response": "Yanıtı Yeniden Oluştur", + "Sorry, there was an error.": "Üzgünüm, bir hata oluştu.", + "Model": "Model", + "Conversation": "Sohbet", + "OR": "VEYA", + "Loading...": "Yükleniyor...", + "Type a message...": "Bir mesaj yazın...", + "Error fetching models.": "Modeller getirilirken hata oluştu.", + "AI": "Yapay Zeka", + "You": "Sen", + "Cancel": "İptal", + "Save & Submit": "Kaydet ve Gönder", + "Make sure your OpenAI API key is set in the bottom left of the sidebar.": "OpenAI API anahtarınızın yan çubuğun sol altında ayarlandığından emin ol.", + "If you completed this step, OpenAI may be experiencing issues.": "Bu adımı tamamladıysanız, OpenAI sorun yaşıyor olabilir.", + "click if using a .env.local file": "Eğer .env.local dosyası kullanıyorsanız tıklayın", + "Message limit is {{maxLength}} characters. You have entered {{valueLength}} characters.": "Mesaj sınırı {{maxLength}} karakterdir. {{valueLength}} karakter girdiniz.", + "Please enter a message": "Lütfen bir mesaj girin", + "Chatbot UI is an advanced chatbot kit for OpenAI's chat models aiming to mimic ChatGPT's interface and functionality.": "Chatbot UI, ChatGPT'nin arayüz ve işlevselliğini taklit etmeyi amaçlayan OpenAI'in sohbet modelleri için gelişmiş bir sohbetbot kitidir.", + "Are you sure you want to clear all messages?": "Tüm mesajları temizlemek istediğinize emin misiniz?" +} diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/public/locales/tr/common.json @@ -0,0 +1 @@ +{} diff --git a/public/locales/tr/markdown.json b/public/locales/tr/markdown.json new file mode 100644 index 0000000..bfc5cc9 --- /dev/null +++ b/public/locales/tr/markdown.json @@ -0,0 +1,5 @@ +{ + "Copy code": "Kodu kopyala", + "Copied!": "Kopyalandi!", + "Enter file name": "Dosya ismi gir" +} diff --git a/public/locales/tr/promptbar.json b/public/locales/tr/promptbar.json new file mode 100644 index 0000000..24870a0 --- /dev/null +++ b/public/locales/tr/promptbar.json @@ -0,0 +1,12 @@ +{ + "New prompt": "Yeni prompt", + "New folder": "Yeni klasör", + "No prompts.": "Prompt yok.", + "Search prompts...": "Prompt'ları ara...", + "Name": "İsim", + "Description": "Açıklama", + "A description for your prompt.": "Prompt'unuz için bir açıklama.", + "Prompt": "Prompt", + "Prompt content. Use {{}} to denote a variable. Ex: {{name}} is a {{adjective}} {{noun}}": "Prompt içeriği. Değişken belirtmek için {{}} kullanın. Örn: {{ad}} bir {{sıfat}} {{isim}}", + "Save": "Kaydet" +} diff --git a/public/locales/tr/sidebar.json b/public/locales/tr/sidebar.json new file mode 100644 index 0000000..702193a --- /dev/null +++ b/public/locales/tr/sidebar.json @@ -0,0 +1,14 @@ +{ + "New folder": "Yeni klasör", + "New chat": "Yeni sohbet", + "No conversations.": "Hiçbir konuşma yok.", + "Search conversations...": "Sohbetleri ara...", + "OpenAI API Key": "OpenAI API Anahtarı", + "Import data": "Veri içe aktar", + "Are you sure?": "Emin misiniz?", + "Clear conversations": "Konuşmaları temizle", + "Export data": "Veri dışa aktar", + "Dark mode": "Karanlık mod", + "Light mode": "Aydınlık mod", + "Plugin Keys": "Plugin Anahtarları" +} diff --git a/public/locales/vi/settings.json b/public/locales/vi/settings.json new file mode 100644 index 0000000..e6b26bb --- /dev/null +++ b/public/locales/vi/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "Chế độ tối", + "Light mode": "Chế độ sáng" +} diff --git a/public/locales/vi/sidebar.json b/public/locales/vi/sidebar.json index 04165de..557732e 100644 --- a/public/locales/vi/sidebar.json +++ b/public/locales/vi/sidebar.json @@ -7,7 +7,5 @@ "Import data": "Nhập dữ liệu hội thoại", "Are you sure?": "Bạn chắc chắn chứ?", "Clear conversations": "Xoá các đoạn hội thoại", - "Export data": "Xuất dữ liệu hội thoại", - "Dark mode": "Chế độ tối", - "Light mode": "Chế độ sáng" + "Export data": "Xuất dữ liệu hội thoại" } diff --git a/public/locales/zh/settings.json b/public/locales/zh/settings.json new file mode 100644 index 0000000..72b7a03 --- /dev/null +++ b/public/locales/zh/settings.json @@ -0,0 +1,4 @@ +{ + "Dark mode": "深色模式", + "Light mode": "浅色模式" +} diff --git a/public/locales/zh/sidebar.json b/public/locales/zh/sidebar.json index 3d16437..c46ed03 100644 --- a/public/locales/zh/sidebar.json +++ b/public/locales/zh/sidebar.json @@ -7,7 +7,5 @@ "Import data": "导入对话", "Are you sure?": "确定吗?", "Clear conversations": "清空对话", - "Export data": "导出对话", - "Dark mode": "深色模式", - "Light mode": "浅色模式" + "Export data": "导出对话" } diff --git a/types/settings.ts b/types/settings.ts new file mode 100644 index 0000000..d4b6335 --- /dev/null +++ b/types/settings.ts @@ -0,0 +1,3 @@ +export interface Settings { + theme: 'light' | 'dark'; +} diff --git a/utils/app/clean.ts b/utils/app/clean.ts index c194e02..7130eef 100644 --- a/utils/app/clean.ts +++ b/utils/app/clean.ts @@ -8,6 +8,7 @@ export const cleanSelectedConversation = (conversation: Conversation) => { // added system prompt for each conversation (3/21/23) // added folders (3/23/23) // added prompts (3/26/23) + // added messages (4/16/23) let updatedConversation = conversation; @@ -41,6 +42,13 @@ export const cleanSelectedConversation = (conversation: Conversation) => { }; } + if (!updatedConversation.messages) { + updatedConversation = { + ...updatedConversation, + messages: updatedConversation.messages || [], + }; + } + return updatedConversation; }; @@ -49,6 +57,7 @@ export const cleanConversationHistory = (history: any[]): Conversation[] => { // added system prompt for each conversation (3/21/23) // added folders (3/23/23) // added prompts (3/26/23) + // added messages (4/16/23) if (!Array.isArray(history)) { console.warn('history is not an array. Returning an empty array.'); @@ -73,6 +82,10 @@ export const cleanConversationHistory = (history: any[]): Conversation[] => { conversation.folderId = null; } + if (!conversation.messages) { + conversation.messages = []; + } + acc.push(conversation); return acc; } catch (error) { diff --git a/utils/app/settings.ts b/utils/app/settings.ts new file mode 100644 index 0000000..acf371e --- /dev/null +++ b/utils/app/settings.ts @@ -0,0 +1,23 @@ +import { Settings } from '@/types/settings'; + +const STORAGE_KEY = 'settings'; + +export const getSettings = (): Settings => { + let settings: Settings = { + theme: 'dark', + }; + const settingsJson = localStorage.getItem(STORAGE_KEY); + if (settingsJson) { + try { + let savedSettings = JSON.parse(settingsJson) as Settings; + settings = Object.assign(settings, savedSettings); + } catch (e) { + console.error(e); + } + } + return settings; +}; + +export const saveSettings = (settings: Settings) => { + localStorage.setItem(STORAGE_KEY, JSON.stringify(settings)); +};