@lobehub/chat 1.143.1 → 1.143.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/claude-issue-triage.yml +1 -1
- package/.github/workflows/claude-translator.yml +1 -1
- package/CHANGELOG.md +50 -0
- package/changelog/v1.json +18 -0
- package/locales/ar/common.json +5 -0
- package/locales/bg-BG/common.json +5 -0
- package/locales/de-DE/common.json +5 -0
- package/locales/en-US/common.json +5 -0
- package/locales/es-ES/common.json +5 -0
- package/locales/fa-IR/common.json +5 -0
- package/locales/fr-FR/common.json +5 -0
- package/locales/it-IT/common.json +5 -0
- package/locales/ja-JP/common.json +5 -0
- package/locales/ko-KR/common.json +5 -0
- package/locales/nl-NL/common.json +5 -0
- package/locales/pl-PL/common.json +5 -0
- package/locales/pt-BR/common.json +5 -0
- package/locales/ru-RU/common.json +5 -0
- package/locales/tr-TR/common.json +5 -0
- package/locales/vi-VN/common.json +5 -0
- package/locales/zh-CN/common.json +5 -0
- package/locales/zh-TW/common.json +5 -0
- package/package.json +9 -9
- package/src/app/[variants]/(main)/_layout/Desktop/SideBar/BottomActions.tsx +3 -0
- package/src/app/[variants]/(main)/_layout/Desktop/SideBar/PHLaunch.tsx +148 -0
- package/src/locales/default/common.ts +5 -0
- package/src/store/global/initialState.ts +2 -0
- package/src/tools/dalle/Render/index.tsx +13 -11
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
github_token: ${{ secrets.GH_TOKEN }}
|
|
31
31
|
allowed_non_write_users: "*"
|
|
32
32
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
33
|
-
claude_args:
|
|
33
|
+
claude_args: '--allowed-tools "Bash(gh *),Read"'
|
|
34
34
|
prompt: |
|
|
35
35
|
You're an issue triage assistant for GitHub issues. Your task is to analyze issues, apply appropriate labels, and mention the responsible team member.
|
|
36
36
|
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
github_token: ${{ secrets.GH_TOKEN }}
|
|
45
45
|
allowed_non_write_users: "*"
|
|
46
46
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
47
|
-
claude_args:
|
|
47
|
+
claude_args: '--allowed-tools "Bash(gh issue:*),Bash(gh api:repos/*/issues:*),Bash(gh api:repos/*/pulls/*/reviews/*),Bash(gh api:repos/*/pulls/comments/*)"'
|
|
48
48
|
prompt: |
|
|
49
49
|
You are a multilingual translation assistant. You need to respond to the following four types of GitHub Webhook events:
|
|
50
50
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
### [Version 1.143.3](https://github.com/lobehub/lobe-chat/compare/v1.143.2...v1.143.3)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2026-01-25**</sup>
|
|
8
|
+
|
|
9
|
+
#### 🐛 Bug Fixes
|
|
10
|
+
|
|
11
|
+
- **misc**: Correct claude_args quoting to prevent shell-quote parsing errors.
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
<details>
|
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
17
|
+
|
|
18
|
+
#### What's fixed
|
|
19
|
+
|
|
20
|
+
- **misc**: Correct claude_args quoting to prevent shell-quote parsing errors, closes [#10790](https://github.com/lobehub/lobe-chat/issues/10790) [#10789](https://github.com/lobehub/lobe-chat/issues/10789) ([cf197e6](https://github.com/lobehub/lobe-chat/commit/cf197e6))
|
|
21
|
+
|
|
22
|
+
</details>
|
|
23
|
+
|
|
24
|
+
<div align="right">
|
|
25
|
+
|
|
26
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
### [Version 1.143.2](https://github.com/lobehub/lobe-chat/compare/v1.143.1...v1.143.2)
|
|
31
|
+
|
|
32
|
+
<sup>Released on **2025-12-04**</sup>
|
|
33
|
+
|
|
34
|
+
#### 🐛 Bug Fixes
|
|
35
|
+
|
|
36
|
+
- **misc**: Fix React CVE.
|
|
37
|
+
|
|
38
|
+
<br/>
|
|
39
|
+
|
|
40
|
+
<details>
|
|
41
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
42
|
+
|
|
43
|
+
#### What's fixed
|
|
44
|
+
|
|
45
|
+
- **misc**: Fix React CVE, closes [#10592](https://github.com/lobehub/lobe-chat/issues/10592) ([20809b5](https://github.com/lobehub/lobe-chat/commit/20809b5))
|
|
46
|
+
|
|
47
|
+
</details>
|
|
48
|
+
|
|
49
|
+
<div align="right">
|
|
50
|
+
|
|
51
|
+
[](#readme-top)
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
|
|
5
55
|
### [Version 1.143.1](https://github.com/lobehub/lobe-chat/compare/v1.143.0...v1.143.1)
|
|
6
56
|
|
|
7
57
|
<sup>Released on **2025-12-02**</sup>
|
package/changelog/v1.json
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"children": {
|
|
4
|
+
"fixes": [
|
|
5
|
+
"Correct claude_args quoting to prevent shell-quote parsing errors."
|
|
6
|
+
]
|
|
7
|
+
},
|
|
8
|
+
"date": "2026-01-25",
|
|
9
|
+
"version": "1.143.3"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"children": {
|
|
13
|
+
"fixes": [
|
|
14
|
+
"Fix React CVE."
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"date": "2025-12-04",
|
|
18
|
+
"version": "1.143.2"
|
|
19
|
+
},
|
|
2
20
|
{
|
|
3
21
|
"children": {
|
|
4
22
|
"fixes": [
|
package/locales/ar/common.json
CHANGED
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "الموقع الرسمي",
|
|
287
287
|
"ok": "موافق",
|
|
288
288
|
"password": "كلمة المرور",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "اذهب إلى الدعم",
|
|
291
|
+
"body": "نحن نُطلق LobeChat على Product Hunt! إذا أعجبك LobeChat، صوّت لنا وادعمنا!",
|
|
292
|
+
"title": "LobeChat يتم إطلاقه على Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "تثبيت في الأعلى",
|
|
290
295
|
"pinOff": "إلغاء التثبيت",
|
|
291
296
|
"privacy": "سياسة الخصوصية",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Официален сайт",
|
|
287
287
|
"ok": "Добре",
|
|
288
288
|
"password": "Парола",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Отидете на страницата за подкрепа",
|
|
291
|
+
"body": "Стартираме в Product Hunt! Ако харесвате LobeChat, подкрепете ни с вашия глас!",
|
|
292
|
+
"title": "LobeChat стартира в Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Закачи",
|
|
290
295
|
"pinOff": "Откачи",
|
|
291
296
|
"privacy": "Политика за поверителност",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Offizielle Website",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Passwort",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Zur Unterstützung",
|
|
291
|
+
"body": "Wir starten gerade auf Product Hunt! Wenn dir LobeChat gefällt, gib uns bitte deine Stimme!",
|
|
292
|
+
"title": "LobeChat startet jetzt auf Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Anheften",
|
|
290
295
|
"pinOff": "Anheften aufheben",
|
|
291
296
|
"privacy": "Datenschutzrichtlinie",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Official Website",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Password",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Support Us",
|
|
291
|
+
"body": "Your support means a lot to us!",
|
|
292
|
+
"title": "We are on Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Pin",
|
|
290
295
|
"pinOff": "Unpin",
|
|
291
296
|
"privacy": "Privacy Policy",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Sitio oficial",
|
|
287
287
|
"ok": "Aceptar",
|
|
288
288
|
"password": "Contraseña",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Ir a apoyar",
|
|
291
|
+
"body": "¡Estamos lanzando en Product Hunt! Si te gusta LobeChat, ¡vota por nosotros!",
|
|
292
|
+
"title": "¡LobeChat se lanza en Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Fijar",
|
|
290
295
|
"pinOff": "Quitar fijación",
|
|
291
296
|
"privacy": "Política de privacidad",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "وبسایت رسمی",
|
|
287
287
|
"ok": "تأیید",
|
|
288
288
|
"password": "رمز عبور",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "رفتن به صفحه پشتیبانی",
|
|
291
|
+
"body": "ما در Product Hunt راهاندازی شدهایم! اگر LobeChat را دوست دارید، لطفاً به ما رأی دهید و حمایت کنید!",
|
|
292
|
+
"title": "LobeChat در Product Hunt راهاندازی شد!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "سنجاق کردن",
|
|
290
295
|
"pinOff": "لغو سنجاق کردن",
|
|
291
296
|
"privacy": "سیاست حفظ حریم خصوصی",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Site officiel",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Mot de passe",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Aller au soutien",
|
|
291
|
+
"body": "Nous lançons LobeChat sur Product Hunt ! Si vous aimez LobeChat, votez pour nous soutenir !",
|
|
292
|
+
"title": "LobeChat est lancé sur Product Hunt !"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Épingler",
|
|
290
295
|
"pinOff": "Désactiver l'épinglage",
|
|
291
296
|
"privacy": "Politique de confidentialité",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Sito ufficiale",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Password",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Vai al supporto",
|
|
291
|
+
"body": "Stiamo lanciando su Product Hunt! Se ti piace LobeChat, votaci e supportaci!",
|
|
292
|
+
"title": "LobeChat è ora su Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Fissa in alto",
|
|
290
295
|
"pinOff": "Annulla fissaggio",
|
|
291
296
|
"privacy": "Informativa sulla privacy",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "公式サイト",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "パスワード",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "サポートする",
|
|
291
|
+
"body": "私たちは現在 Product Hunt で公開中です!LobeChat を気に入っていただけたら、ぜひ投票をお願いします!",
|
|
292
|
+
"title": "LobeChat が Product Hunt に登場!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "ピン留め",
|
|
290
295
|
"pinOff": "ピン留め解除",
|
|
291
296
|
"privacy": "プライバシーポリシー",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "공식 웹사이트",
|
|
287
287
|
"ok": "확인",
|
|
288
288
|
"password": "비밀번호",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "지원하러 가기",
|
|
291
|
+
"body": "우리는 지금 Product Hunt에 출시되었습니다! LobeChat이 마음에 드신다면 투표로 응원해 주세요!",
|
|
292
|
+
"title": "LobeChat이 Product Hunt에 출시되었습니다!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "상단 고정",
|
|
290
295
|
"pinOff": "고정 해제",
|
|
291
296
|
"privacy": "개인정보 보호정책",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Officiële website",
|
|
287
287
|
"ok": "Oké",
|
|
288
288
|
"password": "Wachtwoord",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Ga naar ondersteuning",
|
|
291
|
+
"body": "We lanceren op Product Hunt! Als je LobeChat leuk vindt, stem dan op ons!",
|
|
292
|
+
"title": "LobeChat lanceert op Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Vastzetten",
|
|
290
295
|
"pinOff": "Vastzetten uitschakelen",
|
|
291
296
|
"privacy": "Privacybeleid",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Oficjalna strona internetowa",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Hasło",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Przejdź do wsparcia",
|
|
291
|
+
"body": "Właśnie debiutujemy na Product Hunt! Jeśli podoba Ci się LobeChat, zagłosuj na nas!",
|
|
292
|
+
"title": "LobeChat debiutuje na Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Przypnij",
|
|
290
295
|
"pinOff": "Odepnij",
|
|
291
296
|
"privacy": "Polityka prywatności",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Site Oficial",
|
|
287
287
|
"ok": "OK",
|
|
288
288
|
"password": "Senha",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Apoie-nos",
|
|
291
|
+
"body": "Estamos lançando no Product Hunt! Se você gosta do LobeChat, vote em nós!",
|
|
292
|
+
"title": "LobeChat está sendo lançado no Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Fixar",
|
|
290
295
|
"pinOff": "Desafixar",
|
|
291
296
|
"privacy": "Política de Privacidade",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Официальный сайт",
|
|
287
287
|
"ok": "ОК",
|
|
288
288
|
"password": "Пароль",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Перейти к поддержке",
|
|
291
|
+
"body": "Мы запускаемся на Product Hunt! Если вам нравится LobeChat, проголосуйте за нас!",
|
|
292
|
+
"title": "LobeChat запускается на Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Закрепить",
|
|
290
295
|
"pinOff": "Открепить",
|
|
291
296
|
"privacy": "Политика конфиденциальности",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Resmi Site",
|
|
287
287
|
"ok": "Tamam",
|
|
288
288
|
"password": "Password",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Destekle",
|
|
291
|
+
"body": "Product Hunt'ta yayındayız! LobeChat'i beğendiyseniz, bize oy vererek destek olun!",
|
|
292
|
+
"title": "LobeChat, Product Hunt'ta yayında!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Pin",
|
|
290
295
|
"pinOff": "Unpin",
|
|
291
296
|
"privacy": "Gizlilik Politikası",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "Trang web chính thức",
|
|
287
287
|
"ok": "Đồng ý",
|
|
288
288
|
"password": "Mật khẩu",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "Truy cập để ủng hộ",
|
|
291
|
+
"body": "Chúng tôi đang ra mắt trên Product Hunt! Nếu bạn yêu thích LobeChat, hãy bình chọn ủng hộ chúng tôi!",
|
|
292
|
+
"title": "LobeChat đang ra mắt trên Product Hunt!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "Ghim",
|
|
290
295
|
"pinOff": "Bỏ ghim",
|
|
291
296
|
"privacy": "Chính sách bảo mật",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "官方网站",
|
|
287
287
|
"ok": "确定",
|
|
288
288
|
"password": "密码",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "前往支持",
|
|
291
|
+
"body": "我们正在 Product Hunt 上发布!如果你喜欢 LobeChat,请给我们投票支持!",
|
|
292
|
+
"title": "LobeChat 正在 Product Hunt 上发布!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "置顶",
|
|
290
295
|
"pinOff": "取消置顶",
|
|
291
296
|
"privacy": "隐私政策",
|
|
@@ -286,6 +286,11 @@
|
|
|
286
286
|
"officialSite": "官方網站",
|
|
287
287
|
"ok": "確定",
|
|
288
288
|
"password": "密碼",
|
|
289
|
+
"phLaunch": {
|
|
290
|
+
"action": "前往支持",
|
|
291
|
+
"body": "我們正在 Product Hunt 上發布!如果你喜歡 LobeChat,請為我們投票支持!",
|
|
292
|
+
"title": "LobeChat 正在 Product Hunt 上發布!"
|
|
293
|
+
},
|
|
289
294
|
"pin": "置頂",
|
|
290
295
|
"pinOff": "取消置頂",
|
|
291
296
|
"privacy": "隱私政策",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "1.143.
|
|
3
|
+
"version": "1.143.3",
|
|
4
4
|
"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.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
"prebuild": "tsx scripts/prebuild.mts && npm run lint",
|
|
34
34
|
"build": "cross-env NODE_OPTIONS=--max-old-space-size=6144 next build",
|
|
35
35
|
"postbuild": "npm run build-sitemap && npm run build-migrate-db",
|
|
36
|
-
"build-migrate-db": "bun run db:migrate",
|
|
37
|
-
"build-sitemap": "tsx ./scripts/buildSitemapIndex/index.ts",
|
|
38
36
|
"build:analyze": "NODE_OPTIONS=--max-old-space-size=6144 ANALYZE=true next build",
|
|
39
37
|
"build:docker": "npm run prebuild && NODE_OPTIONS=--max-old-space-size=6144 DOCKER=true next build && npm run build-sitemap",
|
|
40
38
|
"prebuild:electron": "cross-env NEXT_PUBLIC_IS_DESKTOP_APP=1 tsx scripts/prebuild.mts",
|
|
41
39
|
"build:electron": "cross-env NODE_OPTIONS=--max-old-space-size=6144 NEXT_PUBLIC_IS_DESKTOP_APP=1 NEXT_PUBLIC_SERVICE_MODE=server next build",
|
|
40
|
+
"build-migrate-db": "bun run db:migrate",
|
|
41
|
+
"build-sitemap": "tsx ./scripts/buildSitemapIndex/index.ts",
|
|
42
42
|
"clean:node_modules": "bash -lc 'set -e; echo \"Removing all node_modules...\"; rm -rf node_modules; pnpm -r exec rm -rf node_modules; rm -rf apps/desktop/node_modules; echo \"All node_modules removed.\"'",
|
|
43
43
|
"db:generate": "drizzle-kit generate && npm run db:generate-client && npm run workflow:dbml",
|
|
44
44
|
"db:generate-client": "tsx ./scripts/migrateClientDB/compile-migrations.ts",
|
|
@@ -79,11 +79,11 @@
|
|
|
79
79
|
"start": "next start -p 3210",
|
|
80
80
|
"stylelint": "stylelint \"src/**/*.{js,jsx,ts,tsx}\" --fix",
|
|
81
81
|
"test": "npm run test-app && npm run test-server",
|
|
82
|
-
"test-app": "vitest run",
|
|
83
|
-
"test-app:coverage": "vitest --coverage --silent='passed-only'",
|
|
84
82
|
"test:e2e": "pnpm --filter @lobechat/e2e-tests test",
|
|
85
83
|
"test:e2e:smoke": "pnpm --filter @lobechat/e2e-tests test:smoke",
|
|
86
84
|
"test:update": "vitest -u",
|
|
85
|
+
"test-app": "vitest run",
|
|
86
|
+
"test-app:coverage": "vitest --coverage --silent='passed-only'",
|
|
87
87
|
"type-check": "tsgo --noEmit",
|
|
88
88
|
"webhook:ngrok": "ngrok http http://localhost:3011",
|
|
89
89
|
"workflow:cdn": "tsx ./scripts/cdnWorkflow/index.ts",
|
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
"@lobehub/market-sdk": "^0.22.7",
|
|
174
174
|
"@lobehub/tts": "^2.0.1",
|
|
175
175
|
"@lobehub/ui": "^2.13.2",
|
|
176
|
-
"@modelcontextprotocol/sdk": "
|
|
176
|
+
"@modelcontextprotocol/sdk": "1.23.0",
|
|
177
177
|
"@neondatabase/serverless": "^1.0.2",
|
|
178
178
|
"@next/third-parties": "^15.5.4",
|
|
179
179
|
"@opentelemetry/exporter-jaeger": "^2.1.0",
|
|
@@ -236,7 +236,7 @@
|
|
|
236
236
|
"model-bank": "workspace:*",
|
|
237
237
|
"modern-screenshot": "^4.6.6",
|
|
238
238
|
"nanoid": "^5.1.6",
|
|
239
|
-
"next": "~15.3.
|
|
239
|
+
"next": "~15.3.6",
|
|
240
240
|
"next-auth": "5.0.0-beta.30",
|
|
241
241
|
"next-mdx-remote": "^5.0.0",
|
|
242
242
|
"nextjs-toploader": "^3.9.17",
|
|
@@ -262,9 +262,9 @@
|
|
|
262
262
|
"pwa-install-handler": "^2.6.3",
|
|
263
263
|
"query-string": "^9.3.1",
|
|
264
264
|
"random-words": "^2.0.1",
|
|
265
|
-
"react": "^19.2.
|
|
265
|
+
"react": "^19.2.1",
|
|
266
266
|
"react-confetti": "^6.4.0",
|
|
267
|
-
"react-dom": "^19.2.
|
|
267
|
+
"react-dom": "^19.2.1",
|
|
268
268
|
"react-fast-marquee": "^1.6.5",
|
|
269
269
|
"react-hotkeys-hook": "^5.1.0",
|
|
270
270
|
"react-i18next": "^15.7.4",
|
|
@@ -8,6 +8,8 @@ import { Flexbox } from 'react-layout-kit';
|
|
|
8
8
|
import { GITHUB } from '@/const/url';
|
|
9
9
|
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
|
|
10
10
|
|
|
11
|
+
import PHLaunch from './PHLaunch';
|
|
12
|
+
|
|
11
13
|
const ICON_SIZE: ActionIconProps['size'] = {
|
|
12
14
|
blockSize: 36,
|
|
13
15
|
size: 20,
|
|
@@ -39,6 +41,7 @@ const BottomActions = memo(() => {
|
|
|
39
41
|
tooltipProps={{ placement: 'right' }}
|
|
40
42
|
/>
|
|
41
43
|
</Link>
|
|
44
|
+
<PHLaunch />
|
|
42
45
|
</Flexbox>
|
|
43
46
|
);
|
|
44
47
|
});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { ActionIcon, ActionIconProps } from '@lobehub/ui';
|
|
4
|
+
import { Button, Popover } from 'antd';
|
|
5
|
+
import { createStyles } from 'antd-style';
|
|
6
|
+
import { Rocket, X } from 'lucide-react';
|
|
7
|
+
import { memo, useEffect, useMemo, useState } from 'react';
|
|
8
|
+
import { useTranslation } from 'react-i18next';
|
|
9
|
+
import { Flexbox } from 'react-layout-kit';
|
|
10
|
+
|
|
11
|
+
import { useGlobalStore } from '@/store/global';
|
|
12
|
+
|
|
13
|
+
const PH_LAUNCH_URL = 'https://lobe.li/ph';
|
|
14
|
+
const PH_IMAGE_URL = 'https://hub-apac-1.lobeobjects.space/og/lobehub-ph.png';
|
|
15
|
+
|
|
16
|
+
// Configure the date range for showing the PH launch card
|
|
17
|
+
const PH_START_DATE = new Date('2026-01-27T08:00:00Z');
|
|
18
|
+
const PH_END_DATE = new Date('2026-02-01T00:00:00Z');
|
|
19
|
+
|
|
20
|
+
const useStyles = createStyles(({ css, token }) => ({
|
|
21
|
+
action: css`
|
|
22
|
+
margin-block-start: 12px;
|
|
23
|
+
`,
|
|
24
|
+
body: css`
|
|
25
|
+
font-size: 14px;
|
|
26
|
+
color: ${token.colorTextSecondary};
|
|
27
|
+
`,
|
|
28
|
+
card: css`
|
|
29
|
+
position: relative;
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
width: 280px;
|
|
32
|
+
border-radius: 8px;
|
|
33
|
+
`,
|
|
34
|
+
closeButton: css`
|
|
35
|
+
position: absolute;
|
|
36
|
+
inset-block-start: 8px;
|
|
37
|
+
inset-inline-end: 8px;
|
|
38
|
+
`,
|
|
39
|
+
content: css`
|
|
40
|
+
padding: 12px;
|
|
41
|
+
`,
|
|
42
|
+
image: css`
|
|
43
|
+
overflow: hidden;
|
|
44
|
+
width: 100%;
|
|
45
|
+
height: auto;
|
|
46
|
+
border-block-end: 1px solid ${token.colorBorderSecondary};
|
|
47
|
+
`,
|
|
48
|
+
title: css`
|
|
49
|
+
font-size: 16px;
|
|
50
|
+
font-weight: 600;
|
|
51
|
+
color: ${token.colorText};
|
|
52
|
+
`,
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
const ICON_SIZE: ActionIconProps['size'] = {
|
|
56
|
+
blockSize: 36,
|
|
57
|
+
size: 20,
|
|
58
|
+
strokeWidth: 1.5,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const PHLaunch = memo(() => {
|
|
62
|
+
const { t } = useTranslation('common');
|
|
63
|
+
const { styles } = useStyles();
|
|
64
|
+
const [open, setOpen] = useState(false);
|
|
65
|
+
|
|
66
|
+
const [hidePHLaunch, updateSystemStatus] = useGlobalStore((s) => [
|
|
67
|
+
s.status.hidePHLaunch,
|
|
68
|
+
s.updateSystemStatus,
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
const isWithinDateRange = useMemo(() => {
|
|
72
|
+
const now = new Date();
|
|
73
|
+
return now >= PH_START_DATE && now <= PH_END_DATE;
|
|
74
|
+
}, []);
|
|
75
|
+
|
|
76
|
+
// Auto open the popover if user hasn't seen it yet
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (!hidePHLaunch && isWithinDateRange) {
|
|
79
|
+
// Small delay to ensure the component is mounted
|
|
80
|
+
const timer = setTimeout(() => {
|
|
81
|
+
setOpen(true);
|
|
82
|
+
}, 1000);
|
|
83
|
+
return () => clearTimeout(timer);
|
|
84
|
+
}
|
|
85
|
+
}, [hidePHLaunch, isWithinDateRange]);
|
|
86
|
+
|
|
87
|
+
const handleClose = () => {
|
|
88
|
+
setOpen(false);
|
|
89
|
+
updateSystemStatus({ hidePHLaunch: true });
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const handleAction = () => {
|
|
93
|
+
window.open(PH_LAUNCH_URL, '_blank');
|
|
94
|
+
handleClose();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Don't render if outside the date range
|
|
98
|
+
if (!isWithinDateRange) return null;
|
|
99
|
+
|
|
100
|
+
const content = (
|
|
101
|
+
<Flexbox className={styles.card}>
|
|
102
|
+
<ActionIcon
|
|
103
|
+
className={styles.closeButton}
|
|
104
|
+
icon={X}
|
|
105
|
+
onClick={handleClose}
|
|
106
|
+
size={{ blockSize: 24, size: 14 }}
|
|
107
|
+
/>
|
|
108
|
+
<div className={styles.image}>
|
|
109
|
+
<img
|
|
110
|
+
alt="LobeChat Product Hunt Launch"
|
|
111
|
+
height="100%"
|
|
112
|
+
src={PH_IMAGE_URL}
|
|
113
|
+
style={{ objectFit: 'cover' }}
|
|
114
|
+
width="100%"
|
|
115
|
+
/>
|
|
116
|
+
</div>
|
|
117
|
+
<Flexbox className={styles.content} gap={4}>
|
|
118
|
+
<div className={styles.title}>{t('phLaunch.title')}</div>
|
|
119
|
+
<div className={styles.body}>{t('phLaunch.body')}</div>
|
|
120
|
+
<Button block className={styles.action} onClick={handleAction} size="small" type="primary">
|
|
121
|
+
{t('phLaunch.action')}
|
|
122
|
+
</Button>
|
|
123
|
+
</Flexbox>
|
|
124
|
+
</Flexbox>
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<Popover
|
|
129
|
+
arrow={false}
|
|
130
|
+
content={content}
|
|
131
|
+
onOpenChange={setOpen}
|
|
132
|
+
open={open}
|
|
133
|
+
placement="rightBottom"
|
|
134
|
+
styles={{ body: { padding: 0 } }}
|
|
135
|
+
trigger="click"
|
|
136
|
+
>
|
|
137
|
+
<ActionIcon
|
|
138
|
+
icon={Rocket}
|
|
139
|
+
onClick={() => setOpen(!open)}
|
|
140
|
+
size={ICON_SIZE}
|
|
141
|
+
title="Product Hunt"
|
|
142
|
+
tooltipProps={{ placement: 'right' }}
|
|
143
|
+
/>
|
|
144
|
+
</Popover>
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
export default PHLaunch;
|
|
@@ -289,6 +289,11 @@ export default {
|
|
|
289
289
|
officialSite: '官方网站',
|
|
290
290
|
ok: '确定',
|
|
291
291
|
password: '密码',
|
|
292
|
+
phLaunch: {
|
|
293
|
+
action: '前往支持',
|
|
294
|
+
body: '我们正在 Product Hunt 上发布!如果你喜欢 LobeChat,请给我们投票支持!',
|
|
295
|
+
title: 'LobeChat 正在 Product Hunt 上发布!',
|
|
296
|
+
},
|
|
292
297
|
pin: '置顶',
|
|
293
298
|
pinOff: '取消置顶',
|
|
294
299
|
privacy: '隐私政策',
|
|
@@ -60,6 +60,7 @@ export interface SystemStatus {
|
|
|
60
60
|
fileManagerViewMode?: 'list' | 'masonry';
|
|
61
61
|
filePanelWidth: number;
|
|
62
62
|
hideGemini2_5FlashImagePreviewChineseWarning?: boolean;
|
|
63
|
+
hidePHLaunch?: boolean;
|
|
63
64
|
hidePWAInstaller?: boolean;
|
|
64
65
|
hideThreadLimitAlert?: boolean;
|
|
65
66
|
imagePanelWidth: number;
|
|
@@ -129,6 +130,7 @@ export const INITIAL_STATUS = {
|
|
|
129
130
|
fileManagerViewMode: 'list' as const,
|
|
130
131
|
filePanelWidth: 320,
|
|
131
132
|
hideGemini2_5FlashImagePreviewChineseWarning: false,
|
|
133
|
+
hidePHLaunch: false,
|
|
132
134
|
hidePWAInstaller: false,
|
|
133
135
|
hideThreadLimitAlert: false,
|
|
134
136
|
imagePanelWidth: 320,
|
|
@@ -30,18 +30,20 @@ const DallE = memo<BuiltinRenderProps<DallEImageItem[]>>(({ content, messageId }
|
|
|
30
30
|
{/* 没想好工具条的作用 */}
|
|
31
31
|
{/*<ToolBar content={content} messageId={messageId} />*/}
|
|
32
32
|
<PreviewGroup
|
|
33
|
-
preview={
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
preview={
|
|
34
|
+
{
|
|
35
|
+
// 切换图片时设置
|
|
36
|
+
onChange: (current: number) => {
|
|
37
|
+
currentRef.current = current;
|
|
38
|
+
},
|
|
39
|
+
// 点击预览显示时设置
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
onVisibleChange: (visible: boolean, _prevVisible: boolean, current: number) => {
|
|
42
|
+
currentRef.current = current;
|
|
43
|
+
},
|
|
44
|
+
toolbarAddon: <ActionIcon color={'#fff'} icon={Download} onClick={handleDownload} />,
|
|
45
|
+
} as any
|
|
46
|
+
}
|
|
45
47
|
>
|
|
46
48
|
<GalleyGrid items={content.map((c) => ({ ...c, messageId }))} renderItem={ImageItem} />
|
|
47
49
|
</PreviewGroup>
|