From ee2a8326acf6e5311a065ce7ae8aca644ebe5735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Tue, 22 Sep 2026 03:25:35 +0800 Subject: [PATCH] feat(desktop): add the WeCom group QR to the About panel The README already shows the group QR, but the desktop app had no way to reach it. Reveal it from an entry below the feedback link. --- desktop/public/icons/wechat-group-qr.png | Bin 0 -> 4685 bytes desktop/src/i18n/locales/en.ts | 4 +++ desktop/src/i18n/locales/jp.ts | 4 +++ desktop/src/i18n/locales/kr.ts | 4 +++ desktop/src/i18n/locales/zh-TW.ts | 4 +++ desktop/src/i18n/locales/zh.ts | 4 +++ .../src/pages/settings/AboutSettings.test.tsx | 34 ++++++++++++++++++ desktop/src/pages/settings/AboutSettings.tsx | 32 +++++++++++++++++ 8 files changed, 86 insertions(+) create mode 100644 desktop/public/icons/wechat-group-qr.png create mode 100644 desktop/src/pages/settings/AboutSettings.test.tsx diff --git a/desktop/public/icons/wechat-group-qr.png b/desktop/public/icons/wechat-group-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..4b33a9ddbad3c834df735c68435f60f83fa029e2 GIT binary patch literal 4685 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 VXyW&9!GAme3lp15L?f@n{|5CW)$#xU literal 0 HcmV?d00001 diff --git a/desktop/src/i18n/locales/en.ts b/desktop/src/i18n/locales/en.ts index fa02ddfd..8ce165a7 100644 --- a/desktop/src/i18n/locales/en.ts +++ b/desktop/src/i18n/locales/en.ts @@ -2016,6 +2016,10 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le 'settings.about.starHint': 'If this project helps you, consider giving it a Star', 'settings.about.feedback': 'Report an Issue', 'settings.about.feedbackDesc': 'Open a GitHub Issue for bugs or usage questions', + 'settings.about.community': 'Join the cc-haha group', + 'settings.about.communityDesc': 'A WeCom group. Scan the code to join; conversation there is mostly in Chinese', + 'settings.about.communityHint': 'Scan with WeChat or WeCom to join', + 'settings.about.communityQrAlt': 'cc-haha WeCom user group QR code', 'settings.about.author': 'Author', 'settings.about.socialMedia': 'Social Media', 'settings.about.updates': 'App Updates', diff --git a/desktop/src/i18n/locales/jp.ts b/desktop/src/i18n/locales/jp.ts index 86fa5150..b5802efa 100644 --- a/desktop/src/i18n/locales/jp.ts +++ b/desktop/src/i18n/locales/jp.ts @@ -2018,6 +2018,10 @@ export const jp: Record = { 'settings.about.starHint': 'このプロジェクトが役立った場合は、Star を付けることをご検討ください', 'settings.about.feedback': '問題を報告', 'settings.about.feedbackDesc': 'バグや使い方の質問について GitHub Issue を作成します', + 'settings.about.community': 'cc-haha 交流グループに参加', + 'settings.about.communityDesc': 'WeCom グループです。QR コードをスキャンして参加できます。会話は主に中国語です', + 'settings.about.communityHint': 'WeChat または WeCom でスキャンして参加', + 'settings.about.communityQrAlt': 'cc-haha WeCom ユーザーグループの QR コード', 'settings.about.author': '作者', 'settings.about.socialMedia': 'ソーシャルメディア', 'settings.about.updates': 'アプリの更新', diff --git a/desktop/src/i18n/locales/kr.ts b/desktop/src/i18n/locales/kr.ts index 1af65490..d812e765 100644 --- a/desktop/src/i18n/locales/kr.ts +++ b/desktop/src/i18n/locales/kr.ts @@ -2020,6 +2020,10 @@ export const kr: Record = { 'settings.about.starHint': '이 프로젝트가 도움이 되었다면 Star를 눌러 주세요', 'settings.about.feedback': '문제 신고', 'settings.about.feedbackDesc': '버그나 사용 관련 질문은 GitHub Issue를 작성하세요', + 'settings.about.community': 'cc-haha 그룹 참여', + 'settings.about.communityDesc': 'WeCom 그룹입니다. QR 코드를 스캔해 참여하세요. 대화는 주로 중국어로 진행됩니다', + 'settings.about.communityHint': 'WeChat 또는 WeCom으로 스캔해 참여', + 'settings.about.communityQrAlt': 'cc-haha WeCom 사용자 그룹 QR 코드', 'settings.about.author': '작성자', 'settings.about.socialMedia': '소셜 미디어', 'settings.about.updates': '앱 업데이트', diff --git a/desktop/src/i18n/locales/zh-TW.ts b/desktop/src/i18n/locales/zh-TW.ts index ef0fc3bb..85812dab 100644 --- a/desktop/src/i18n/locales/zh-TW.ts +++ b/desktop/src/i18n/locales/zh-TW.ts @@ -2017,6 +2017,10 @@ export const zh: Record = { 'settings.about.starHint': '如果這個專案對你有幫助,歡迎給個 Star', 'settings.about.feedback': '反饋問題', 'settings.about.feedbackDesc': '遇到 Bug 或使用問題,前往 GitHub Issue 提交反饋', + 'settings.about.community': '加入 cc-haha 交流群', + 'settings.about.communityDesc': '企業微信群,掃碼即可加入,群內交流以中文為主', + 'settings.about.communityHint': '使用微信或企業微信掃碼加入', + 'settings.about.communityQrAlt': 'cc-haha 企業微信用戶群 QR code', 'settings.about.author': '作者', 'settings.about.socialMedia': '社交媒體', 'settings.about.updates': '應用更新', diff --git a/desktop/src/i18n/locales/zh.ts b/desktop/src/i18n/locales/zh.ts index 8c06128d..b7a4cc0d 100644 --- a/desktop/src/i18n/locales/zh.ts +++ b/desktop/src/i18n/locales/zh.ts @@ -2016,6 +2016,10 @@ export const zh: Record = { 'settings.about.starHint': '如果这个项目对你有帮助,欢迎给个 Star', 'settings.about.feedback': '反馈问题', 'settings.about.feedbackDesc': '遇到 Bug 或使用问题,前往 GitHub Issue 提交反馈', + 'settings.about.community': '加入 cc-haha 交流群', + 'settings.about.communityDesc': '企业微信群,扫码即可加入,群内交流以中文为主', + 'settings.about.communityHint': '使用微信或企业微信扫码加入', + 'settings.about.communityQrAlt': 'cc-haha 企业微信用户群二维码', 'settings.about.author': '作者', 'settings.about.socialMedia': '社交媒体', 'settings.about.updates': '应用更新', diff --git a/desktop/src/pages/settings/AboutSettings.test.tsx b/desktop/src/pages/settings/AboutSettings.test.tsx new file mode 100644 index 00000000..7cb4f2fd --- /dev/null +++ b/desktop/src/pages/settings/AboutSettings.test.tsx @@ -0,0 +1,34 @@ +import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import '@testing-library/jest-dom' +import { afterEach, beforeEach, expect, it } from 'vitest' +import { useSettingsStore } from '@/stores/settingsStore' +import { AboutSettings } from './AboutSettings' + +beforeEach(() => { + useSettingsStore.setState({ locale: 'zh' }) +}) + +afterEach(() => { + cleanup() +}) + +it('keeps the group QR collapsed until the entry below feedback is opened', async () => { + render() + // The version arrives from an async host call; let it settle so the assertion + // is not racing a state update. + await screen.findByText((_, node) => node?.tagName === 'SPAN' && node.textContent === '版本 0.1.0') + + const entry = screen.getByRole('button', { name: /加入 cc-haha 交流群/ }) + expect(entry.compareDocumentPosition(screen.getByRole('button', { name: /反馈问题/ })) & Node.DOCUMENT_POSITION_PRECEDING).toBeTruthy() + expect(entry).toHaveAttribute('aria-expanded', 'false') + expect(screen.queryByRole('img', { name: 'cc-haha 企业微信用户群二维码' })).not.toBeInTheDocument() + + fireEvent.click(entry) + + const qr = screen.getByRole('img', { name: 'cc-haha 企业微信用户群二维码' }) + expect(qr).toHaveAttribute('src', expect.stringContaining('icons/wechat-group-qr.png')) + expect(entry).toHaveAttribute('aria-expanded', 'true') + + fireEvent.click(entry) + expect(screen.queryByRole('img', { name: 'cc-haha 企业微信用户群二维码' })).not.toBeInTheDocument() +}) diff --git a/desktop/src/pages/settings/AboutSettings.tsx b/desktop/src/pages/settings/AboutSettings.tsx index fad068ff..e461b907 100644 --- a/desktop/src/pages/settings/AboutSettings.tsx +++ b/desktop/src/pages/settings/AboutSettings.tsx @@ -51,6 +51,7 @@ export function AboutSettings() { const [updateProxyDraft, setUpdateProxyDraft] = useState(updateProxy) const [updateProxySaveError, setUpdateProxySaveError] = useState(null) const [isSavingUpdateProxy, setIsSavingUpdateProxy] = useState(false) + const [communityOpen, setCommunityOpen] = useState(false) useEffect(() => { let cancelled = false @@ -414,6 +415,37 @@ export function AboutSettings() { + + {/* The QR is the same image README.md embeds under "User Group". */} +
+ + {communityOpen && ( +
+ {t('settings.about.communityQrAlt')} +

{t('settings.about.communityHint')}

+
+ )} +
) }