diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7a6a96db9..b6c260bbb 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,8 +1,8 @@ name: Deploy to GitHub Pages on: - push: - branches: [main] + # push: + # branches: [main] workflow_dispatch: permissions: diff --git a/.github/workflows/sync-to-gitlab.yml b/.github/workflows/sync-to-gitlab.yml new file mode 100644 index 000000000..c448ebb3a --- /dev/null +++ b/.github/workflows/sync-to-gitlab.yml @@ -0,0 +1,21 @@ +# name: Sync to GitLab + +# on: +# push: +# workflow_dispatch: + +# jobs: +# sync: +# runs-on: ubuntu-latest +# steps: +# - name: Checkout GitHub repository +# uses: actions/checkout@v2 +# with: +# fetch-depth: 0 + +# - name: Push to GitLab +# env: +# GITLAB_TOKEN: ${{ secrets.GITLAB_ACCESS_TOKEN }} +# run: | +# git remote add gitlab https://oauth2:${GITLAB_TOKEN}@gitlab.com/zewebdev1337/devGPT-base.git +# git push gitlab HEAD:main diff --git a/index.html b/index.html index a698b3675..24b0bca9b 100644 --- a/index.html +++ b/index.html @@ -6,6 +6,7 @@ + Better ChatGPT +
diff --git a/public/locales/th/about.json b/public/locales/th/about.json new file mode 100644 index 000000000..3ca81cfd5 --- /dev/null +++ b/public/locales/th/about.json @@ -0,0 +1,27 @@ +{ + "description": "Better ChatGPT เป็น Web แอปพิเคชันโอเพ่นซอร์สที่น่าทึ่ง ที่ช่วยให้คุณสามารถติดต่อสื่อสารกับ ChatGPT API ของ OpenAI ได้ฟรี!", + "sourceCode": "ลองดู<0>ซอร์สโค้ดบน GitHub และให้⭐️!", + "initiative": { + "description": "เช็คออกเรื่อง《<0>ก้าวที่เปิดให้ถือว่าน่าสนใจของ ChatGPT》!", + "link": "https://medium.com/@ayaka_90553/%E5%BC%80%E6%94%BE-chatgpt-%E5%80%A1%E8%AE%AE-eaac01243dae" + }, + "support": { + "title": "การสนับสนุน", + "paragraph1": "ที่ Better ChatGPT เรามุ่งมั่นที่จะให้คุณมลุณฑาคุณประโยชน์และฟีเจอร์ที่น่าทึ่ง ตระหนักถึงความสำคัญของการสนับสนุนและกำลังใจของทุกคนในโครงการของเราเพื่อขับเคลื่อน!", + "paragraph2": "หากคุณชอบใช้แอปพลิเคชันของเรา เราขอให้ความสนใจให้ดาว⭐️ ให้<0>โครงการหนึ่งในดวงนี้ คำขอบคุณของคุณที่นี่เป็นสิ่งสำคัญมากในการขับเคลื่อนความพยายามของเราเพื่อให้ประสบการณ์ที่ดีที่สุด", + "paragraph3": "หากคุณต้องการสนับสนุนทีมของเรา โปรดพิจารณาสนับสนุนเราด้วยวิธีการด้านล่างนี้ ความสนับสนุนไม่ว่าจะเล็กหรือใหญ่จากทุกคนช่วยให้เราสามารถปรับปรุงและรักษาบริการที่ดีของเรา", + "paragraph4": "ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา หาอยู่ตรงนี้เพื่อให้บริการดีกว่าในอนาคต", + "alipay": "Alipay", + "wechatPay": "WeChat" + }, + "discordServer": { + "title": "เซิร์ฟเวอร์ Discord", + "paragraph1": "เราขอเชิญคุณเข้าร่วมชุมชน Discord ของเรา! เซิร์ฟเวอร์ Discord ของเราเป็นสถานที่ที่คุณจะได้อุ้มความคิดเห็นและเทคนิคสำหรับ ChatGPT และเสนอคำขอฟีเจอร์สำหรับ Better ChatGPT คุณจะสามารถสื่อสารกับนักพัฒนา Better ChatGPT และผู้ที่ขบเขียนแชทหุ่นยนต์ที่แสดงความรักกับคุณ", + "paragraph2": "เพื่อเข้าร่วมเซิร์ฟเวอร์ของเรา คลิกลิงก์ต่อไปนี้: <0>https://discord.gg/g3Qnwy4V6A เราหวังที่จะพบคุณที่นั่น!" + }, + "privacyStatement": { + "title": "ความเป็นส่วนตัว", + "paragraph1": "เราเสียใจกับความเป็นส่วนตัวของคุณและพยายามปกป้องความเป็นส่วนตัวของผู้ใช้ เราไม่มีในการเก็บข้อมูลหรือเก็บข้อความใด ๆ ที่คุณป้อนหรือรับจากเซิร์ฟเวอร์ OpenAI ณ ซอร์สโค้ดของเราสามารถตรวจสอบเพื่อยืนยันว่าข้อความนี้เป็นความจริง", + "paragraph2": "เราให้ความสำคัญสูงสุดต่อความปลอดภัยของคีย์ API ของคุณและใช้ละเอียดอ่อนในการจัดการ หากคุณใช้คีย์ API ของคุณเอง คีย์ของคุณจะถูกเก็บอยู่ที่เบราว์เซอร์ของคุณคนเดียว และไม่เคยใช้กับที่ตั้งที่สามใด ๆ คีย์นี้จะใช้เฉพาะกับวัตถุประสงค์อันตรายที่เผชิญในการเข้าถึง OpenAI API และไม่มีการใช้ที่ไม่ได้รับอนุญาตหลายอย่าง" + } +} \ No newline at end of file diff --git a/public/locales/th/api.json b/public/locales/th/api.json new file mode 100644 index 000000000..3cbab644c --- /dev/null +++ b/public/locales/th/api.json @@ -0,0 +1,15 @@ +{ + "securityMessage": "เราให้ความสำคัญสูงสุดในการควบคุมความปลอดภัยของคีย์ API ของคุณ และจัดการอย่างระมัดระวัง คีย์ของคุณจะถูกเก็บอย่างเฉพาะในเบราว์เซอร์ของคุณ และไม่เคยแชร์กับเอนทิตีที่สามใด ๆ และใช้เพื่อเข้าถึง API OpenAI เฉพาะนามในที่สำหรับการใช้งานที่ได้รับอนุญาต", + "apiEndpoint": { + "inputLabel": "จุดเชื่อมต่อ API", + "description": "เมื่อเลือก API ที่ไม่ใช่ทางการจุดเชื่อมต่อจะทำหน้าที่เป็นพร็อกซี พร็อกซีใช้เป็นตัวกลางระหว่างอุปกรณ์ของคุณและเซิร์ฟเวอร์เป้าหมาย (ในกรณีนี้คือ API OpenAI) โดยการกระทำนี้คุณสามารถเข้าถึง API OpenAI ในพื้นที่ที่ถูกจำกัด", + "warn": "นอกจากนี้ หากคุณให้ API ที่กำหนดเองและสามารถใช้งานสิทธิ์การเข้าถึง API ของ OpenAI ฟรี คุณสามารถใช้ ChatGPT โดยไม่ต้องระบุคีย์ API ด้วยการเว้นว่างช่อง API key อย่างไรก็ตามในการใช้งานที่ไม่เชื่อถือที่จุดเชื่อมต่อ API อาจทำการบันทึกข้อมูลส่วนตัวของคุณในการสนทนา กรุณาตรวจสอบความน่าเชื่อถือของ API endpoint ก่อนใช้งานเพื่อปกป้องความเป็นส่วนตัวและความปลอดภัยของคุณ" + }, + "apiKey": { + "howTo": "รับคีย์ API ส่วนตัวของคุณ<0>ที่นี่", + "inputLabel": "คีย์ API" + }, + "customEndpoint": "ใช้จุดเชื่อมต่อ API ที่กำหนดเอง", + "advancedConfig": "ดูการตั้งค่า API ขั้นสูง<0>ที่นี่", + "noApiKeyWarning": "ขาดคีย์ API โปรดตรวจสอบการตั้งค่า API" +} \ No newline at end of file diff --git a/public/locales/th/drive.json b/public/locales/th/drive.json new file mode 100644 index 000000000..379e18163 --- /dev/null +++ b/public/locales/th/drive.json @@ -0,0 +1,16 @@ +{ + "name": "Google Sync", + "tagline": "รวมลุ่มทำงานอัตโนมัติด้วยการซิงค์ข้อมูลและตั้งค่าของคุณกับ Google Drive.", + "button": { + "sync": "ซิงค์การสนทนาของคุณ", + "stop": "หยุดการซิงค์", + "create": "สร้างไฟล์ใหม่", + "confirm": "ยืนยันการเลือก" + }, + "notice": "หมายเหตุ: คุณจำเป็นต้องเข้าสู่ระบบใหม่ในทุกครั้งที่เยี่ยมชมหรือทุกๆ ชั่วโมง. เพื่อป้องกันข้อมูลบนคลาวด์ของคุณจากการโดนเขียนทับ ไม่ควรใช้ Better ChatGPT พร้อมกันบนมากกว่าหนึ่งอุปกรณ์ในเวลาเดียวกัน.", + "privacy": "ความเป็นส่วนตัวของคุณสำคัญกับเรา และเพื่อให้มั่นใจด้านความเป็นส่วนตัว Better ChatGPT สามารถเข้าถึงแบบไม่ผันผวน มีความหมายว่าสามารถสร้าง ดู และจัดการไฟล์และโฟลเดอร์ส่วนตัวของมันเท่านั้น.", + "toast": { + "sync": "ซิงค์สำเร็จ!", + "stop": "หยุดการซิงค์แล้ว" + } +} \ No newline at end of file diff --git a/public/locales/th/main.json b/public/locales/th/main.json new file mode 100644 index 000000000..4cda8e17c --- /dev/null +++ b/public/locales/th/main.json @@ -0,0 +1,47 @@ +{ + "save": "บันทึก", + "saveAndSubmit": "บันทึกและส่ง", + "cancel": "ยกเลิก", + "confirm": "ยืนยัน", + "warning": "คำเตือน", + "clearMessageWarning": "โปรดทราบว่าหากรายการข้อความนี้ถูกส่ง ข้อความต่อไปที่นำไปใช้ในการสนทนาจะถูกลบออก!", + "clearConversationWarning": "โปรดทราบว่าการยืนยันการดำเนินการนี้จะลบข้อความทั้งหมด!", + "clearConversation": "ล้างการสนทนา", + "import": "นำเข้า", + "export": "ส่งออก", + "author": "สร้างโดย Jing Hua", + "about": "เกี่ยวกับและการสนับสนุน", + "api": "API", + "personal": "ส่วนตัว", + "free": "ฟรี", + "downloadChat": "ดาวน์โหลดประวัติการสนทนา", + "user": "ผู้ใช้", + "assistant": "ผู้ช่วย", + "system": "ระบบ", + "newChat": "การสนทนาใหม่", + "lightMode": "โหมดสว่าง", + "darkMode": "โหมดมืด", + "setting": "ตั้งค่า", + "image": "รูปภาพ", + "autoTitle": "สร้างชื่อเรื่องอัตโนมัติ", + "advancedMode": "โหมดขั้นสูง", + "inlineLatex": "Latex แบบอินไลน์", + "prompt": "คำเรียกร้อง", + "promptLibrary": "คลังคำนำ", + "name": "ชื่อ", + "search": "ค้นหา", + "total": "ทั้งหมด", + "resetCost": "รีเซ็ตราคา", + "countTotalTokens": "นับจำนวน Token ทั้งหมด", + "morePrompts": "คำเรียกร้องเพิ่มเติมคลิกที่นี่:", + "clearPrompts": "ล้างคำเรียกร้อง", + "postOnShareGPT": { + "title": "โพสต์ลงบน ShareGPT", + "warning": "โปรดทราบว่าการโพสต์บทสนทนาของคุณลงบน ShareGPT จะทำให้ทุกคนสามารถเข้าถึงและดูได้อย่างสาธารณะหลังจากโพสต์คุณจะไม่สามารถซ่อนหรือลบการสนทนาได้ และอาจถูกบุคคลอื่นจัดเก็บหรือแบ่งปัน เราแนะนำให้ใช้ความระมัดระวังและหลีกเลี่ยงการแชร์ข้อมูลที่ละเอียดยิบหรือส่วนตัวในแพลตฟอร์มนี้." + }, + "newFolder": "โฟลเดอร์ใหม่", + "cloneChat": "สร้างสำเนาของการสนทนา", + "cloned": "สำเนาถูกสร้างขึ้น", + "enterToSubmit": "กด Enter เพื่อส่ง", + "submitPlaceholder": "พิมพ์ข้อความหรือคลิก [/] เพื่อใช้คำเรียกร้อง..." +} \ No newline at end of file diff --git a/public/locales/th/model.json b/public/locales/th/model.json new file mode 100644 index 000000000..c340b1b2b --- /dev/null +++ b/public/locales/th/model.json @@ -0,0 +1,28 @@ +{ + "configuration": "การตั้งค่า", + "model": "แบบจำลอง", + "token": { + "label": "โทเค็นสูงสุด", + "description": "จำนวนโทเค็นสูงสุดที่ผู้ช่วยสามารถสร้างข้อมูลในข้อความเดียว โทเค็นสูงสุดยังต้องอยู่ภายใต้ข้อจำกัดของความยาวทั้งหมดของโมเดล ซึ่งจำนวนโทเค็นคงเหลือจากเนื้อหาเดิมและโทเค็นที่สร้างขึ้นไม่ควรเกินจำนวนโทเค็นทั้งหมดของโมเดล (เช่น gpt-3.5-turbo มีโทเค็นสูงสุดอยู่ที่ 4096)。" + }, + "default": "ค่าเริ่มต้น", + "temperature": { + "label": "อุณหภูมิการสุ่ม", + "description": "กำหนดค่าอุณหภูมิสำหรับการสุ่ม ค่าอยู่ระหว่าง 0 ถึง 2 ค่าที่สูงเช่น 0.8 จะทำให้ผลลัพธ์แปรปรวนมากขึ้นและค่าที่ต่ำเช่น 0.2 จะทำให้ผลลัพธ์มีความเข้มข้นและยั่งยืนขึ้น ตัวเลือกทั่วไปคือปรับเท่านี้หรือ Top-p แต่ไม่ควรปรับทั้งสองข้อพร้อมกัน (ค่าเริ่มต้น: 1)" + }, + "presencePenalty": { + "label": "โทษสำหรับความสัมพันธ์", + "description": "ค่าอยู่ระหว่าง -2.0 ถึง 2.0 ค่าบวกจะลงโทษโทเค็นใหม่ที่ปรากฏในข้อความโดยพิจารณาว่ามันได้ปรากฏก่อนหน้านี้หรือไม่ เพิ่มความน่าจะเป็นของโมเดลในการสนทนาในหัวข้อใหม่ (ค่าเริ่มต้น: 0)" + }, + "topP": { + "label": "Top-p", + "description": "ค่าอยู่ระหว่าง 0 ถึง 1 ตัวตั้งค่าที่เปลี่ยนแปลงคุณภาพิจารณ์จากอุณหภูมิการสุ่ม โมเดลจะพิจารณาเฉพาะโทเค็นที่มีความน่าจะเป็นสูงสุดที่ประกอบกับ Top-p ดังนั้น 0.1 หมายความว่าจะพิจารณาเฉพาะโทเค็นที่มีความความน่าจะเป็นควบคุม 10% ของความน่าจะเป็นทั้งหมด เราขอแนะนำให้ปรับค่านี้หรืออุณหภูมิการสุ่ม แต่ไม่ควรปรับทั้งสองข้อพร้อมกัน (ค่าเริ่มต้น: 1)" + }, + "frequencyPenalty": { + "label": "โทษสำหรับความถี่", + "description": "ค่าอยู่ระหว่าง -2.0 ถึง 2.0 ค่าบวกจะลงโทษโทเค็นใหม่โดยบวกความถี่ของความปรากฏในข้อความอยู่แล้ว ลดความน่าจะเป็นของโมเดลในการทำซ้ำข้อความเดียวกันอย่างตรงไปตรงมา (ค่าเริ่มต้น: 0)" + }, + "defaultChatConfig": "การตั้งค่าการสนทนาเริ่มต้น", + "defaultSystemMessage": "ข้อความระบบเริ่มต้น", + "resetToDefault": "รีเซ็ตเป็นค่าเริ่มต้น" +} \ No newline at end of file diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 000000000..413a8bc6a --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,26 @@ +{ + "short_name": "BetterChatGPT", + "name": "Better ChatGPT", + "description": "Play and chat smarter with BetterChatGPT - an amazing open-source web app with a better UI for exploring OpenAI's ChatGPT API!", + "start_url": "/", + "display": "standalone", + "background_color": "#343541", + "theme_color": "#343541", + "icons": [ + { + "src": "apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 000000000..0b6906bc6 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,24 @@ +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open('better-chatgpt-cache').then((cache) => { + return cache.addAll([ + '/', + '/apple-touch-icon.png', + '/favicon-32x32.png', + '/favicon-16x16.png' + ]); + }) + ); +}); + +self.addEventListener('fetch', (event) => { + const requestURL = new URL(event.request.url); + // 缓存 /assets/ 下的文件 + if (requestURL.pathname.startsWith('/assets/')) { + event.respondWith( + caches.match(event.request).then(response => { + return response || fetch(event.request); + }) + ); + } +}); diff --git a/src/components/ApiMenu/ApiMenu.tsx b/src/components/ApiMenu/ApiMenu.tsx index 23a99d1c2..a927944ee 100644 --- a/src/components/ApiMenu/ApiMenu.tsx +++ b/src/components/ApiMenu/ApiMenu.tsx @@ -34,6 +34,11 @@ const ApiMenu = ({ setIsModalOpen(false); }; + const handleRemove = () => { + setApiKey(''); + _setApiKey(''); + }; + const handleToggleCustomEndpoint = () => { if (_customEndpoint) _setApiEndpoint(defaultAPIEndpoint); else _setApiEndpoint(''); @@ -78,19 +83,33 @@ const ApiMenu = ({ )} -
-
- {t('apiKey.inputLabel', { ns: 'api' })} + {apiKey && apiKey.length > 0 ? ( +
+
+ API Key Set + +
- { - _setApiKey(e.target.value); - }} - /> -
+ ) : ( +
+
+ {t('apiKey.inputLabel', { ns: 'api' })} +
+ { + _setApiKey(e.target.value); + }} + /> +
+ )}

diff --git a/src/components/ApiPopup/ApiPopup.tsx b/src/components/ApiPopup/ApiPopup.tsx index 42f42ae2e..148e3d211 100644 --- a/src/components/ApiPopup/ApiPopup.tsx +++ b/src/components/ApiPopup/ApiPopup.tsx @@ -29,6 +29,11 @@ const ApiPopup = () => { } }; + const handleRemove = () => { + setApiKey(''); + _setApiKey(''); + }; + useEffect(() => { setFirstVisit(false); }, []); @@ -41,20 +46,30 @@ const ApiPopup = () => { cancelButton={false} >

-
-
- {t('apiKey.inputLabel', { ns: 'api' })} + {apiKey && apiKey.length > 0 ? ( +
+
+ API Key Set + +
- { - _setApiKey(e.target.value); - }} - /> -
- + ) : ( +
+
+ {t('apiKey.inputLabel', { ns: 'api' })} +
+ { + _setApiKey(e.target.value); + }} + /> +
+ )}
{ return config ? ( <>
{ setIsModalOpen(true); }} diff --git a/src/components/Chat/ChatContent/Message/View/EditView.tsx b/src/components/Chat/ChatContent/Message/View/EditView.tsx index e0d9503e2..d4b28c8f8 100644 --- a/src/components/Chat/ChatContent/Message/View/EditView.tsx +++ b/src/components/Chat/ChatContent/Message/View/EditView.tsx @@ -14,7 +14,7 @@ const EditView = ({ content, setIsEdit, messageIndex, - sticky, + sticky }: { content: string; setIsEdit: React.Dispatch>; @@ -28,6 +28,7 @@ const EditView = ({ const [_content, _setContent] = useState(content); const [isModalOpen, setIsModalOpen] = useState(false); const textareaRef = React.createRef(); + const bufferRef = React.createRef(); const { t } = useTranslation(); @@ -105,18 +106,23 @@ const EditView = ({ handleSubmit(); }; - useEffect(() => { - if (textareaRef.current) { - textareaRef.current.style.height = 'auto'; - textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; + const adjustTextareaHeight = () => { + if (textareaRef.current && bufferRef.current) { + const textarea = textareaRef.current; + const buffer = bufferRef.current; + + buffer.style.height = 'auto'; + buffer.style.height = buffer.scrollHeight + 'px'; + textarea.style.height = buffer.scrollHeight + 'px'; } + }; + + useEffect(() => { + adjustTextareaHeight(); }, [_content]); useEffect(() => { - if (textareaRef.current) { - textareaRef.current.style.height = 'auto'; - textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`; - } + adjustTextareaHeight(); }, []); return ( @@ -128,6 +134,7 @@ const EditView = ({ : '' }`} > +
+ +
{ const { t } = useTranslation(); @@ -51,6 +52,7 @@ const SettingsMenu = () => { +
diff --git a/src/components/SettingsMenu/ShareGPTToggle.tsx b/src/components/SettingsMenu/ShareGPTToggle.tsx new file mode 100644 index 000000000..cfbd92202 --- /dev/null +++ b/src/components/SettingsMenu/ShareGPTToggle.tsx @@ -0,0 +1,28 @@ +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useStore from '@store/store'; +import Toggle from '@components/Toggle'; + +const ShareGPTToggle = () => { + const { t } = useTranslation(); + + const setShareGPT = useStore((state) => state.setShareGPT); + + const [isChecked, setIsChecked] = useState( + useStore.getState().shareGPT + ); + + useEffect(() => { + setShareGPT(isChecked); + }, [isChecked]); + + return ( + + ); +}; + +export default ShareGPTToggle; diff --git a/src/components/ShareGPT/ShareGPT.tsx b/src/components/ShareGPT/ShareGPT.tsx index f9b4cc8ce..f300a95e8 100644 --- a/src/components/ShareGPT/ShareGPT.tsx +++ b/src/components/ShareGPT/ShareGPT.tsx @@ -9,6 +9,7 @@ import { ShareGPTSubmitBodyInterface } from '@type/api'; const ShareGPT = React.memo(() => { const { t } = useTranslation(); const [isModalOpen, setIsModalOpen] = useState(false); + const isAvailable = useStore((state) => state.shareGPT); const handleConfirm = async () => { const chats = useStore.getState().chats; @@ -40,7 +41,7 @@ const ShareGPT = React.memo(() => { return ( <> - + ) } {isModalOpen && ( void; setTheme: (theme: Theme) => void; setAutoTitle: (autoTitle: boolean) => void; + setShareGPT: (autoTitle: boolean) => void; setAdvancedMode: (advancedMode: boolean) => void; setDefaultChatConfig: (defaultChatConfig: ConfigInterface) => void; setDefaultSystemMessage: (defaultSystemMessage: string) => void; @@ -38,6 +40,7 @@ export const createConfigSlice: StoreSlice = (set, get) => ({ hideMenuOptions: false, hideSideMenu: false, autoTitle: false, + shareGPT: false, enterToSubmit: true, advancedMode: true, defaultChatConfig: _defaultChatConfig, @@ -64,6 +67,12 @@ export const createConfigSlice: StoreSlice = (set, get) => ({ autoTitle: autoTitle, })); }, + setShareGPT: (shareGPT: boolean) => { + set((prev: ConfigSlice) => ({ + ...prev, + shareGPT: shareGPT, + })); + }, setAdvancedMode: (advancedMode: boolean) => { set((prev: ConfigSlice) => ({ ...prev, diff --git a/src/store/store.ts b/src/store/store.ts index 69aba7de0..c29c49077 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -46,6 +46,7 @@ export const createPartializedState = (state: StoreState) => ({ apiEndpoint: state.apiEndpoint, theme: state.theme, autoTitle: state.autoTitle, + shareGPT: state.shareGPT, advancedMode: state.advancedMode, prompts: state.prompts, defaultChatConfig: state.defaultChatConfig,