From 9e4c5ca4ff9b1c6b8eab24a1c7624cd9624f5d83 Mon Sep 17 00:00:00 2001 From: KhanKudo <37520008+KhanKudo@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:18:08 +0200 Subject: [PATCH 1/7] Fixed: site cannot open if imported json invalid (#579) --- utils/app/clean.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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) { From 5f0d1cb7caaf15b51c420c083ffc31c5b385d92b Mon Sep 17 00:00:00 2001 From: mirkan1 Date: Tue, 18 Apr 2023 10:18:24 -0400 Subject: [PATCH 2/7] Turkish language implementation for i18n (#576) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * turkish language support implemented * tr as string in module declaration * missing key Plugin Keys implementation * synonyms is used to get rid of confusion and to avoid repetition. The word “synonym” is derived from the Greek word “syn” meaning “together” and “onym” meaning “name” while in Turkish name and noun can be translated as both "ad" and "isim" * // --- next-i18next.config.js | 1 + public/locales/tr/chat.json | 28 ++++++++++++++++++++++++++++ public/locales/tr/common.json | 1 + public/locales/tr/markdown.json | 5 +++++ public/locales/tr/promptbar.json | 12 ++++++++++++ public/locales/tr/sidebar.json | 14 ++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 public/locales/tr/chat.json create mode 100644 public/locales/tr/common.json create mode 100644 public/locales/tr/markdown.json create mode 100644 public/locales/tr/promptbar.json create mode 100644 public/locales/tr/sidebar.json 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/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ı" +} From 836c24680b10e3014ca30c49f5105f796e830864 Mon Sep 17 00:00:00 2001 From: Shemar Lindie Date: Tue, 18 Apr 2023 10:21:43 -0400 Subject: [PATCH 3/7] fix: chat messages disappear on edit (#575) Resolves #574 --- components/Chat/Chat.tsx | 5 +++++ components/Chat/ChatMessage.tsx | 30 ++++-------------------------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/components/Chat/Chat.tsx b/components/Chat/Chat.tsx index 9898a33..0109d75 100644 --- a/components/Chat/Chat.tsx +++ b/components/Chat/Chat.tsx @@ -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); + }} /> ))} diff --git a/components/Chat/ChatMessage.tsx b/components/Chat/ChatMessage.tsx index 8595586..9c2cdb9 100644 --- a/components/Chat/ChatMessage.tsx +++ b/components/Chat/ChatMessage.tsx @@ -26,9 +26,10 @@ import remarkMath from 'remark-math'; interface Props { message: Message; messageIndex: number; + onEdit?: (editedMessage: Message) => 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); From ba1dacb89927eff232a0f8901d34612ad2495886 Mon Sep 17 00:00:00 2001 From: Shinji Yamada Date: Tue, 18 Apr 2023 23:23:42 +0900 Subject: [PATCH 4/7] feat: settings dialog and moved theme settings to dialog from sidebar (#570) * feat: settings dialog and moved theme settings to dialog from sidebar. * chore(locale): move some labels to settings from sidebar --- .../Chatbar/components/ChatbarSettings.tsx | 32 ++++-- components/Settings/SettingDialog.tsx | 105 ++++++++++++++++++ pages/api/home/home.tsx | 13 ++- public/locales/ar/settings.json | 4 + public/locales/bn/settings.json | 4 + public/locales/bn/sidebar.json | 4 +- public/locales/de/settings.json | 4 + public/locales/de/sidebar.json | 4 +- public/locales/es/settings.json | 4 + public/locales/es/sidebar.json | 4 +- public/locales/fr/settings.json | 4 + public/locales/fr/sidebar.json | 4 +- public/locales/he/settings.json | 4 + public/locales/he/sidebar.json | 4 +- public/locales/id/settings.json | 4 + public/locales/id/sidebar.json | 4 +- public/locales/it/settings.json | 4 + public/locales/it/sidebar.json | 4 +- public/locales/ja/settings.json | 7 ++ public/locales/ja/sidebar.json | 3 +- public/locales/ko/settings.json | 4 + public/locales/ko/sidebar.json | 4 +- public/locales/pl/settings.json | 4 + public/locales/pl/sidebar.json | 4 +- public/locales/pt/settings.json | 4 + public/locales/pt/sidebar.json | 4 +- public/locales/ro/settings.json | 4 + public/locales/ro/sidebar.json | 6 +- public/locales/ru/settings.json | 4 + public/locales/ru/sidebar.json | 4 +- public/locales/si/settings.json | 4 + public/locales/si/sidebar.json | 4 +- public/locales/sv/settings.json | 4 + public/locales/sv/sidebar.json | 4 +- public/locales/te/settings.json | 4 + public/locales/te/sidebar.json | 4 +- public/locales/vi/settings.json | 4 + public/locales/vi/sidebar.json | 4 +- public/locales/zh/settings.json | 4 + public/locales/zh/sidebar.json | 4 +- types/settings.ts | 3 + utils/app/settings.ts | 23 ++++ 42 files changed, 259 insertions(+), 69 deletions(-) create mode 100644 components/Settings/SettingDialog.tsx create mode 100644 public/locales/ar/settings.json create mode 100644 public/locales/bn/settings.json create mode 100644 public/locales/de/settings.json create mode 100644 public/locales/es/settings.json create mode 100644 public/locales/fr/settings.json create mode 100644 public/locales/he/settings.json create mode 100644 public/locales/id/settings.json create mode 100644 public/locales/it/settings.json create mode 100644 public/locales/ja/settings.json create mode 100644 public/locales/ko/settings.json create mode 100644 public/locales/pl/settings.json create mode 100644 public/locales/pt/settings.json create mode 100644 public/locales/ro/settings.json create mode 100644 public/locales/ru/settings.json create mode 100644 public/locales/si/settings.json create mode 100644 public/locales/sv/settings.json create mode 100644 public/locales/te/settings.json create mode 100644 public/locales/vi/settings.json create mode 100644 public/locales/zh/settings.json create mode 100644 types/settings.ts create mode 100644 utils/app/settings.ts 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/pages/api/home/home.tsx b/pages/api/home/home.tsx index e5c6239..292e2ed 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; @@ -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'); @@ -419,6 +423,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/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/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)); +}; From 03afa007324fbafc35e0e766643d7b66e39d26eb Mon Sep 17 00:00:00 2001 From: Shinji Yamada Date: Tue, 18 Apr 2023 23:24:47 +0900 Subject: [PATCH 5/7] chore: use last conversation temperature (#568) --- components/Chat/Temperature.tsx | 12 ++++++++++-- pages/api/home/home.tsx | 5 +++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/components/Chat/Temperature.tsx b/components/Chat/Temperature.tsx index a1085b2..783e11d 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); diff --git a/pages/api/home/home.tsx b/pages/api/home/home.tsx index 292e2ed..f973a90 100644 --- a/pages/api/home/home.tsx +++ b/pages/api/home/home.tsx @@ -192,7 +192,7 @@ const Home = ({ tokenLimit: OpenAIModels[defaultModelId].tokenLimit, }, prompt: DEFAULT_SYSTEM_PROMPT, - temperature: DEFAULT_TEMPERATURE, + temperature: lastConversation?.temperature ?? DEFAULT_TEMPERATURE, folderId: null, }; @@ -326,6 +326,7 @@ const Home = ({ value: cleanedSelectedConversation, }); } else { + const lastConversation = conversations[conversations.length - 1]; dispatch({ field: 'selectedConversation', value: { @@ -334,7 +335,7 @@ const Home = ({ messages: [], model: OpenAIModels[defaultModelId], prompt: DEFAULT_SYSTEM_PROMPT, - temperature: DEFAULT_TEMPERATURE, + temperature: lastConversation?.temperature ?? DEFAULT_TEMPERATURE, folderId: null, }, }); From 51fa461965cede28788569a9310cd38254d9db7d Mon Sep 17 00:00:00 2001 From: Shinji Yamada Date: Tue, 18 Apr 2023 23:25:28 +0900 Subject: [PATCH 6/7] fix: temperature font color (#556) --- components/Chat/Temperature.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/Chat/Temperature.tsx b/components/Chat/Temperature.tsx index 783e11d..e4ebd28 100644 --- a/components/Chat/Temperature.tsx +++ b/components/Chat/Temperature.tsx @@ -39,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')}
    • From 00f6189a42a7878d8b6aa7ae35e70d173ac180a5 Mon Sep 17 00:00:00 2001 From: Aldo Santiago <37028475+santi4o@users.noreply.github.com> Date: Tue, 18 Apr 2023 08:28:19 -0600 Subject: [PATCH 7/7] fix: sroll down button overlaping chat input (#564) --- components/Chat/Chat.tsx | 14 +++----------- components/Chat/ChatInput.tsx | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/components/Chat/Chat.tsx b/components/Chat/Chat.tsx index 0109d75..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, @@ -492,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 && (