From 4545cf0c3200d56216df06db18fb11622b919b56 Mon Sep 17 00:00:00 2001 From: Arvin Xu Date: Sun, 21 Jan 2024 22:17:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8C=90=20style:=20update=20locale=20a?= =?UTF-8?q?nd=20add=20test=20for=20globalStore=20(#1119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🌐 style: update locale and add test * 📱 style: improve mobile height using `dvh` --------- Co-authored-by: canisminor1990 --- locales/ar/common.json | 1 + locales/de-DE/common.json | 1 + locales/en-US/common.json | 1 + locales/es-ES/common.json | 1 + locales/fr-FR/common.json | 1 + locales/it-IT/common.json | 1 + locales/ja-JP/common.json | 1 + locales/ko-KR/common.json | 1 + locales/nl-NL/common.json | 1 + locales/pl-PL/common.json | 1 + locales/pt-BR/common.json | 1 + locales/ru-RU/common.json | 1 + locales/tr-TR/common.json | 1 + locales/vi-VN/common.json | 1 + locales/zh-CN/common.json | 1 + locales/zh-TW/common.json | 1 + package.json | 30 ++--- .../features/ChatHeader/ShareButton/style.ts | 2 +- src/locales/default/common.ts | 1 + .../global/slices/settings/action.test.ts | 117 ++++++++++++++++++ src/store/session/slices/session/action.ts | 2 +- src/styles/global.ts | 2 +- 22 files changed, 152 insertions(+), 18 deletions(-) create mode 100644 src/store/global/slices/settings/action.test.ts diff --git a/locales/ar/common.json b/locales/ar/common.json index b7752880c1205..4f289ffff8c00 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -13,6 +13,7 @@ "close": "إغلاق", "confirmRemoveSessionItemAlert": "سيتم حذف هذا المساعد قريبًا، وبمجرد الحذف لن يمكن استعادته، يرجى تأكيد الإجراء", "copy": "نسخ", + "copyFail": "فشل في النسخ", "copySuccess": "تم النسخ بنجاح", "defaultAgent": "مساعد افتراضي", "defaultSession": "جلسة افتراضية", diff --git a/locales/de-DE/common.json b/locales/de-DE/common.json index 50dcb82970996..d9d66b5748f5f 100644 --- a/locales/de-DE/common.json +++ b/locales/de-DE/common.json @@ -13,6 +13,7 @@ "close": "Schließen", "confirmRemoveSessionItemAlert": "Möchten Sie diesen Assistenten wirklich löschen? Nach dem Löschen kann er nicht wiederhergestellt werden. Bitte bestätigen Sie Ihre Aktion.", "copy": "Kopieren", + "copyFail": "Kopieren fehlgeschlagen", "copySuccess": "Kopieren erfolgreich", "defaultAgent": "Standardassistent", "defaultSession": "Standardassistent", diff --git a/locales/en-US/common.json b/locales/en-US/common.json index bf45eabc4d878..0bb69850024cf 100644 --- a/locales/en-US/common.json +++ b/locales/en-US/common.json @@ -13,6 +13,7 @@ "close": "Close", "confirmRemoveSessionItemAlert": "You are about to delete this agent. Once deleted, it cannot be recovered. Please confirm your action.", "copy": "Copy", + "copyFail": "Copy failed", "copySuccess": "Copied successfully", "defaultAgent": "Default Agent", "defaultSession": "Default Agent", diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json index af07fe5ff6de3..c5e3818ab75cf 100644 --- a/locales/es-ES/common.json +++ b/locales/es-ES/common.json @@ -13,6 +13,7 @@ "close": "Cerrar", "confirmRemoveSessionItemAlert": "Estás a punto de eliminar este asistente. Una vez eliminado, no se podrá recuperar. Por favor, confirma tu acción", "copy": "Copiar", + "copyFail": "Fallo al copiar", "copySuccess": "¡Copia exitosa!", "defaultAgent": "Asistente predeterminado", "defaultSession": "Sesión predeterminada", diff --git a/locales/fr-FR/common.json b/locales/fr-FR/common.json index 92fa6f8b8519b..97685ba96f740 100644 --- a/locales/fr-FR/common.json +++ b/locales/fr-FR/common.json @@ -13,6 +13,7 @@ "close": "Fermer", "confirmRemoveSessionItemAlert": "Vous êtes sur le point de supprimer cet agent. Une fois supprimé, il ne pourra pas être récupéré. Veuillez confirmer votre action.", "copy": "Copier", + "copyFail": "Échec de la copie", "copySuccess": "Copie réussie", "defaultAgent": "Agent par défaut", "defaultSession": "Session par défaut", diff --git a/locales/it-IT/common.json b/locales/it-IT/common.json index bb52f252af2d3..7ce69cbb8628f 100644 --- a/locales/it-IT/common.json +++ b/locales/it-IT/common.json @@ -13,6 +13,7 @@ "close": "Chiudi", "confirmRemoveSessionItemAlert": "Stai per eliminare questo assistente. Una volta eliminato, non sarà possibile recuperarlo. Confermi l'operazione?", "copy": "Copia", + "copyFail": "Copia non riuscita", "copySuccess": "Copia riuscita", "defaultAgent": "Assistente predefinito", "defaultSession": "Sessione predefinita", diff --git a/locales/ja-JP/common.json b/locales/ja-JP/common.json index 262072ca6bdb8..a5ab5ae4e72db 100644 --- a/locales/ja-JP/common.json +++ b/locales/ja-JP/common.json @@ -13,6 +13,7 @@ "close": "閉じる", "confirmRemoveSessionItemAlert": "このエージェントを削除します。削除後は元に戻すことはできません。操作を確認してください。", "copy": "コピー", + "copyFail": "コピーに失敗しました", "copySuccess": "コピーが成功しました", "defaultAgent": "デフォルトエージェント", "defaultSession": "デフォルトセッション", diff --git a/locales/ko-KR/common.json b/locales/ko-KR/common.json index 6a07425938946..b3fc0d1c7872e 100644 --- a/locales/ko-KR/common.json +++ b/locales/ko-KR/common.json @@ -13,6 +13,7 @@ "close": "닫기", "confirmRemoveSessionItemAlert": "이 에이전트를 삭제하려고 합니다. 삭제 후에는 복구할 수 없습니다. 작업을 확인하십시오.", "copy": "복사", + "copyFail": "복사 실패", "copySuccess": "복사 성공", "defaultAgent": "기본 에이전트", "defaultSession": "기본 세션", diff --git a/locales/nl-NL/common.json b/locales/nl-NL/common.json index ad75f411313ed..977a271c2bdcd 100644 --- a/locales/nl-NL/common.json +++ b/locales/nl-NL/common.json @@ -13,6 +13,7 @@ "close": "Sluiten", "confirmRemoveSessionItemAlert": "U staat op het punt deze assistent te verwijderen. Na verwijdering kan deze niet worden hersteld. Weet u zeker dat u door wilt gaan?", "copy": "Kopiëren", + "copyFail": "Kopiëren mislukt", "copySuccess": "Kopiëren gelukt", "defaultAgent": "Standaard assistent", "defaultSession": "Standaard assistent", diff --git a/locales/pl-PL/common.json b/locales/pl-PL/common.json index ee7e742b1a87d..7bca85279c0e3 100644 --- a/locales/pl-PL/common.json +++ b/locales/pl-PL/common.json @@ -13,6 +13,7 @@ "close": "Zamknij", "confirmRemoveSessionItemAlert": "Czy na pewno chcesz usunąć tego asystenta? Po usunięciu nie będzie możliwe jego odzyskanie.", "copy": "Kopiuj", + "copyFail": "Nie udało się skopiować", "copySuccess": "Skopiowano pomyślnie", "defaultAgent": "Domyślny asystent", "defaultSession": "Domyślna sesja", diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json index 19f21888b0c66..fd791df2d0fcc 100644 --- a/locales/pt-BR/common.json +++ b/locales/pt-BR/common.json @@ -13,6 +13,7 @@ "close": "Fechar", "confirmRemoveSessionItemAlert": "Você está prestes a excluir este assistente. Após a exclusão, não será possível recuperá-lo. Por favor, confirme sua ação.", "copy": "Copiar", + "copyFail": "Falha ao copiar", "copySuccess": "Cópia bem-sucedida", "defaultAgent": "Assistente padrão", "defaultSession": "Sessão padrão", diff --git a/locales/ru-RU/common.json b/locales/ru-RU/common.json index 0f62f98ad4b54..78a26848df771 100644 --- a/locales/ru-RU/common.json +++ b/locales/ru-RU/common.json @@ -13,6 +13,7 @@ "close": "Закрыть", "confirmRemoveSessionItemAlert": "Вы собираетесь удалить этого агента. После удаления его будет невозможно восстановить. Подтвердите ваше действие", "copy": "Копировать", + "copyFail": "Не удалось скопировать", "copySuccess": "Успешно скопировано", "defaultAgent": "Пользовательский агент", "defaultSession": "Пользовательский агент", diff --git a/locales/tr-TR/common.json b/locales/tr-TR/common.json index 2577e4abc5401..afffc50f4660c 100644 --- a/locales/tr-TR/common.json +++ b/locales/tr-TR/common.json @@ -13,6 +13,7 @@ "close": "Kapat", "confirmRemoveSessionItemAlert": "Bu asistanı silmek üzeresiniz. Silindikten sonra geri alınamaz. Lütfen eyleminizi onaylayın.", "copy": "Kopyala", + "copyFail": "Kopyalama başarısız oldu", "copySuccess": "Kopyalama Başarılı", "defaultAgent": "Varsayılan Asistan", "defaultSession": "Varsayılan Asistan", diff --git a/locales/vi-VN/common.json b/locales/vi-VN/common.json index b5bf749b5a5d6..1c254c541f450 100644 --- a/locales/vi-VN/common.json +++ b/locales/vi-VN/common.json @@ -13,6 +13,7 @@ "close": "Đóng", "confirmRemoveSessionItemAlert": "Bạn sắp xóa trợ lý này. Sau khi xóa, bạn sẽ không thể khôi phục. Vui lòng xác nhận hành động của bạn", "copy": "Sao chép", + "copyFail": "Sao chép thất bại", "copySuccess": "Sao chép thành công", "defaultAgent": "Trợ lý mặc định", "defaultSession": "Phiên mặc định", diff --git a/locales/zh-CN/common.json b/locales/zh-CN/common.json index 167ed14c7743f..aae1295dabcb1 100644 --- a/locales/zh-CN/common.json +++ b/locales/zh-CN/common.json @@ -13,6 +13,7 @@ "close": "关闭", "confirmRemoveSessionItemAlert": "即将删除该助手,删除后该将无法找回,请确认你的操作", "copy": "复制", + "copyFail": "复制失败", "copySuccess": "复制成功", "defaultAgent": "自定义助手", "defaultSession": "自定义助手", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 48c6ca9c9d9bc..73997da24ab7a 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -13,6 +13,7 @@ "close": "關閉", "confirmRemoveSessionItemAlert": "即將刪除此助手,刪除後將無法復原,請確認您的操作", "copy": "複製", + "copyFail": "複製失敗", "copySuccess": "複製成功", "defaultAgent": "預設助手", "defaultSession": "預設助手", diff --git a/package.json b/package.json index 01dd81a03b512..d6ea7a162d343 100644 --- a/package.json +++ b/package.json @@ -84,10 +84,10 @@ "@lobehub/ui": "latest", "@vercel/analytics": "^1", "ahooks": "^3", - "ai": "^2.2.22", - "antd": "^5.12.7", + "ai": "^2", + "antd": "^5", "antd-style": "^3", - "brotli-wasm": "^2.0.0", + "brotli-wasm": "^2", "chroma-js": "^2", "copy-to-clipboard": "^3", "dayjs": "^1", @@ -104,16 +104,16 @@ "lucide-react": "latest", "modern-screenshot": "^4", "nanoid": "^5", - "next": "^14.0.2", + "next": "^14.1", "nuqs": "^1.15.4", - "openai": "^4.17.3", + "openai": "^4.22", "polished": "^4", "posthog-js": "^1", "query-string": "^8", "react": "^18", "react-dom": "^18", - "react-hotkeys-hook": "^4.4.3", - "react-i18next": "^14.0.0", + "react-hotkeys-hook": "^4", + "react-i18next": "^14", "react-intersection-observer": "^9", "react-layout-kit": "^1", "react-lazy-load": "^4", @@ -122,9 +122,9 @@ "remark": "^14", "remark-gfm": "^3", "remark-html": "^15", - "rtl-detect": "^1.1.2", + "rtl-detect": "^1", "semver": "^7", - "sharp": "0.33.1", + "sharp": "^0.33.2", "swr": "^2", "systemjs": "^6", "ts-md5": "^1", @@ -148,19 +148,19 @@ "@testing-library/jest-dom": "^6", "@testing-library/react": "^14", "@types/chroma-js": "^2", - "@types/json-schema": "^7.0.15", + "@types/json-schema": "^7", "@types/lodash": "^4", "@types/lodash-es": "^4", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "@types/rtl-detect": "^1.0.3", + "@types/rtl-detect": "^1", "@types/semver": "^7", "@types/systemjs": "^6", "@types/ua-parser-js": "^0.7", "@types/uuid": "^9", "@umijs/lint": "^4", - "@vitest/coverage-v8": "^1.1.3", + "@vitest/coverage-v8": "^1", "commitlint": "^18", "consola": "^3", "dpdm": "^3", @@ -168,7 +168,7 @@ "fake-indexeddb": "^5", "glob": "^10", "husky": "^8", - "jsdom": "^23.0.0", + "jsdom": "^23", "just-diff": "^6", "lint-staged": "^15", "lodash": "^4", @@ -184,8 +184,8 @@ "typescript": "^5", "unified": "^11", "unist-util-visit": "^5", - "vitest": "^1.1.3", - "vitest-canvas-mock": "^0.3.3" + "vitest": "^1", + "vitest-canvas-mock": "^0.3" }, "publishConfig": { "access": "public", diff --git a/src/app/chat/features/ChatHeader/ShareButton/style.ts b/src/app/chat/features/ChatHeader/ShareButton/style.ts index b590e5d9d5f0b..63c1ccb80d9f5 100644 --- a/src/app/chat/features/ChatHeader/ShareButton/style.ts +++ b/src/app/chat/features/ChatHeader/ShareButton/style.ts @@ -38,7 +38,7 @@ export const useStyles = createStyles(({ css, token, stylish, cx }, withBackgrou overflow: hidden scroll; width: 100%; - max-height: 40vh; + max-height: 40dvh; background: ${token.colorBgLayout}; border: 1px solid ${token.colorBorder}; diff --git a/src/locales/default/common.ts b/src/locales/default/common.ts index 6fc7b796dff37..cadde0f0ff4a8 100644 --- a/src/locales/default/common.ts +++ b/src/locales/default/common.ts @@ -13,6 +13,7 @@ export default { close: '关闭', confirmRemoveSessionItemAlert: '即将删除该助手,删除后该将无法找回,请确认你的操作', copy: '复制', + copyFail: '复制失败', copySuccess: '复制成功', defaultAgent: '自定义助手', defaultSession: '自定义助手', diff --git a/src/store/global/slices/settings/action.test.ts b/src/store/global/slices/settings/action.test.ts new file mode 100644 index 0000000000000..9c9a8c1718f8c --- /dev/null +++ b/src/store/global/slices/settings/action.test.ts @@ -0,0 +1,117 @@ +import { act, renderHook } from '@testing-library/react'; +import { DeepPartial } from 'utility-types'; +import { describe, expect, it, vi } from 'vitest'; + +import { DEFAULT_AGENT, DEFAULT_SETTINGS } from '@/const/settings'; +import { useGlobalStore } from '@/store/global'; +import { SettingsTabs } from '@/store/global/initialState'; +import { LobeAgentSettings } from '@/types/session'; +import { GlobalSettings, OpenAIConfig } from '@/types/settings'; + +beforeEach(() => { + vi.clearAllMocks(); +}); + +vi.mock('@/utils/uuid', () => ({ + nanoid: vi.fn(() => 'unique-id'), +})); + +describe('SettingsAction', () => { + describe('importAppSettings', () => { + it('should import app settings', () => { + const { result } = renderHook(() => useGlobalStore()); + const newSettings: GlobalSettings = { + ...DEFAULT_SETTINGS, + themeMode: 'dark', + }; + + act(() => { + result.current.importAppSettings(newSettings); + }); + + expect(result.current.settings).toEqual(newSettings); + }); + }); + + describe('resetSettings', () => { + it('should reset settings to default', () => { + const { result } = renderHook(() => useGlobalStore()); + + act(() => { + result.current.resetSettings(); + }); + + expect(result.current.settings).toEqual(DEFAULT_SETTINGS); + }); + }); + + describe('setOpenAIConfig', () => { + it('should set OpenAI configuration', () => { + const { result } = renderHook(() => useGlobalStore()); + const openAIConfig: Partial = { OPENAI_API_KEY: 'test' }; + + act(() => { + result.current.setOpenAIConfig(openAIConfig); + }); + + expect(result.current.settings.languageModel.openAI.OPENAI_API_KEY).toEqual( + openAIConfig.OPENAI_API_KEY, + ); + }); + }); + + describe('setSettings', () => { + it('should set partial settings', () => { + const { result } = renderHook(() => useGlobalStore()); + const partialSettings: Partial = { themeMode: 'dark' }; + + act(() => { + result.current.setSettings(partialSettings); + }); + + expect(result.current.settings.themeMode).toEqual('dark'); + }); + }); + + describe('switchSettingTabs', () => { + it('should switch settings tabs', () => { + const { result } = renderHook(() => useGlobalStore()); + + act(() => { + result.current.switchSettingTabs(SettingsTabs.Agent); + }); + + expect(result.current.settingsTab).toEqual(SettingsTabs.Agent); + }); + }); + + describe('switchThemeMode', () => { + it('should switch theme mode', () => { + const { result } = renderHook(() => useGlobalStore()); + + act(() => { + result.current.switchThemeMode('light'); + }); + + expect(result.current.settings.themeMode).toEqual('light'); + }); + }); + + describe('updateDefaultAgent', () => { + it('should update default agent settings', () => { + const { result } = renderHook(() => useGlobalStore()); + const updatedAgent: DeepPartial = { + meta: { title: 'docs' }, + }; + + act(() => { + result.current.updateDefaultAgent(updatedAgent); + }); + + expect(result.current.settings.defaultAgent).toEqual({ + ...DEFAULT_AGENT, + ...updatedAgent, + }); + }); + }); +}); diff --git a/src/store/session/slices/session/action.ts b/src/store/session/slices/session/action.ts index d521c00d8d4b0..9b28c67537597 100644 --- a/src/store/session/slices/session/action.ts +++ b/src/store/session/slices/session/action.ts @@ -118,7 +118,7 @@ export const createSessionSlice: StateCreator< // duplicate Session Error if (!newId) { - message.error('复制失败'); + message.error(t('copyFail', { ns: 'common' })); return; } diff --git a/src/styles/global.ts b/src/styles/global.ts index 37d85950dbc12..72030b4c4b475 100644 --- a/src/styles/global.ts +++ b/src/styles/global.ts @@ -8,7 +8,7 @@ export default ({ prefixCls }: { prefixCls: string }) => css` position: relative; overscroll-behavior: none; height: 100% !important; - min-height: 100% !important; + max-height: 100dvh !important; ::-webkit-scrollbar { display: none; From 5d611dc69fda9ed3e301cab1dc35f930c7e82e13 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 21 Jan 2024 14:20:39 +0000 Subject: [PATCH 2/2] :bookmark: chore(release): v0.120.5 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### [Version 0.120.5](https://github.com/lobehub/lobe-chat/compare/v0.120.4...v0.120.5) Released on **2024-01-21** #### 💄 Styles - **misc**: Update locale and add test for globalStore.
Improvements and Fixes #### Styles * **misc**: Update locale and add test for globalStore, closes [#1119](https://github.com/lobehub/lobe-chat/issues/1119) ([4545cf0](https://github.com/lobehub/lobe-chat/commit/4545cf0))
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
--- CHANGELOG.md | 25 +++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1729512a711da..cc7de66b31ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ # Changelog +### [Version 0.120.5](https://github.com/lobehub/lobe-chat/compare/v0.120.4...v0.120.5) + +Released on **2024-01-21** + +#### 💄 Styles + +- **misc**: Update locale and add test for globalStore. + +
+ +
+Improvements and Fixes + +#### Styles + +- **misc**: Update locale and add test for globalStore, closes [#1119](https://github.com/lobehub/lobe-chat/issues/1119) ([4545cf0](https://github.com/lobehub/lobe-chat/commit/4545cf0)) + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ ### [Version 0.120.4](https://github.com/lobehub/lobe-chat/compare/v0.120.3...v0.120.4) Released on **2024-01-21** diff --git a/package.json b/package.json index d6ea7a162d343..4a082698b40ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lobehub/chat", - "version": "0.120.4", + "version": "0.120.5", "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.", "keywords": [ "framework",