From bcfcae079353934088ebdab2b360ee6f406629da Mon Sep 17 00:00:00 2001 From: liuyonghe0111 <1763195287@qq.com> Date: Tue, 23 Dec 2025 16:32:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6;=E4=BC=98=E5=8C=96=E9=9D=A2=E5=85=B7?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 99 +- docs/AiReplySuggestions-Refactor.md | 256 - docs/AiReplySuggestions.md | 104 - docs/AvatarSetting.md | 101 - docs/CrushLevelAvatar.md | 197 - docs/DesignTokens.md | 404 -- docs/EnvironmentVariables.md | 177 - docs/GoogleOAuth-GIS.md | 420 -- docs/GoogleOAuth-QuickStart.md | 142 - docs/GoogleOAuth.md | 313 - docs/MessageLikeFeature.md | 259 - docs/URLTextParameter.md | 117 - docs/VoiceTTSIntegration.md | 169 - docs/copy-audit.xlsx | Bin 1277338 -> 0 bytes docs/i18n-scan-report.json | 77 - docs/i18n-scan-report.xlsx | Bin 1087925 -> 0 bytes docs/project-overview.md | 67 - package.json | 8 +- pnpm-lock.yaml | 251 +- public/mockServiceWorker.js | 344 -- scripts/TRANSLATION_SUMMARY.md | 81 - scripts/apply-translations.cjs | 378 -- scripts/convert-to-i18n.js | 105 - scripts/extract-copy.cjs | 333 -- scripts/extract-copy.ts | 376 -- scripts/i18n-scan.ts | 447 -- scripts/reset-and-apply-translations.cjs | 363 -- scripts/translates.xlsx | Bin 160879 -> 0 bytes scripts/translation-conflicts.xlsx | Bin 39825 -> 0 bytes scripts/translation-report.json | 5043 ----------------- src/app/(auth)/about/page.tsx | 4 +- .../(main)/chat/[id]/Drawer/MaskCreate.tsx | 2 +- src/app/(main)/chat/[id]/Drawer/Profile.tsx | 62 +- src/app/(main)/chat/[id]/Drawer/index.tsx | 23 +- .../components/SubscribeVipDrawer/index.tsx | 2 +- src/app/(main)/vip/vip-page.tsx | 4 +- .../(main)/wallet/components/RechargeList.tsx | 86 +- src/app/page.tsx | 19 +- src/atoms/im.ts | 130 - .../features/album-price-setting.tsx | 126 +- src/components/features/charge-drawer.tsx | 112 +- src/components/mock-provider.tsx | 68 - src/components/test-heartbeat-loader.tsx | 24 - src/lib/server-mock.ts | 40 - src/lib/utils.ts | 103 +- 45 files changed, 363 insertions(+), 11073 deletions(-) delete mode 100644 docs/AiReplySuggestions-Refactor.md delete mode 100644 docs/AiReplySuggestions.md delete mode 100644 docs/AvatarSetting.md delete mode 100644 docs/CrushLevelAvatar.md delete mode 100644 docs/DesignTokens.md delete mode 100644 docs/EnvironmentVariables.md delete mode 100644 docs/GoogleOAuth-GIS.md delete mode 100644 docs/GoogleOAuth-QuickStart.md delete mode 100644 docs/GoogleOAuth.md delete mode 100644 docs/MessageLikeFeature.md delete mode 100644 docs/URLTextParameter.md delete mode 100644 docs/VoiceTTSIntegration.md delete mode 100644 docs/copy-audit.xlsx delete mode 100644 docs/i18n-scan-report.json delete mode 100644 docs/i18n-scan-report.xlsx delete mode 100644 docs/project-overview.md delete mode 100644 public/mockServiceWorker.js delete mode 100644 scripts/TRANSLATION_SUMMARY.md delete mode 100644 scripts/apply-translations.cjs delete mode 100644 scripts/convert-to-i18n.js delete mode 100644 scripts/extract-copy.cjs delete mode 100644 scripts/extract-copy.ts delete mode 100644 scripts/i18n-scan.ts delete mode 100644 scripts/reset-and-apply-translations.cjs delete mode 100644 scripts/translates.xlsx delete mode 100644 scripts/translation-conflicts.xlsx delete mode 100644 scripts/translation-report.json delete mode 100644 src/atoms/im.ts delete mode 100644 src/components/mock-provider.tsx delete mode 100644 src/components/test-heartbeat-loader.tsx delete mode 100644 src/lib/server-mock.ts diff --git a/README.md b/README.md index b652faf..8d85257 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,9 @@ ## 功能特性 -- 🎮 **多平台社交登录**: 支持Discord、Google、Apple登录 +- 🎮 **多平台社交登录**: 支持Discord、Google登录 - 🔐 **完整认证流程**: OAuth2.0认证,JWT token管理 - 📱 **设备管理**: 自动设备ID生成和管理 -- 🎭 **开发环境Mock**: 使用MSW进行API模拟 - 🛡️ **中间件保护**: 路由级别的认证保护 ## 快速开始 @@ -15,7 +14,7 @@ ### 1. 安装依赖 ```bash -npm install +pnpm install ``` ### 2. 环境变量配置 @@ -46,27 +45,20 @@ DISCORD_CLIENT_SECRET=your_discord_client_secret_here # 应用URL(生产环境需要修改) NEXT_PUBLIC_APP_URL=http://localhost:3000 -# 开发环境Mock配置 -NEXT_PUBLIC_ENABLE_MOCK=true ``` #### 其他OAuth配置(可选) -```env +````env # Google OAuth(未来支持) NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id_here -GOOGLE_CLIENT_SECRET=your_google_client_secret_here -# Apple OAuth(未来支持) -NEXT_PUBLIC_APPLE_CLIENT_ID=your_apple_client_id_here -APPLE_CLIENT_SECRET=your_apple_client_secret_here -``` ### 3. 启动开发服务器 ```bash -npm run dev -``` +pnpm run dev +```` 应用将在 http://localhost:3000 启动。 @@ -97,40 +89,6 @@ npm run dev - 前端保存token并重定向到首页 - 完成整个登录流程 -## 开发环境Mock - -项目使用MSW进行API模拟,在开发环境中: - -- 设置 `NEXT_PUBLIC_ENABLE_MOCK=true` 启用Mock -- 所有认证API请求都会被MSW拦截并返回模拟数据 -- 支持Discord、Google、Apple等第三方登录的模拟 - -### Mock功能特性 - -- ✅ 设备ID验证 -- ✅ 第三方登录模拟 -- ✅ Token管理 -- ✅ 用户信息管理 -- ✅ 错误场景模拟 - -## 项目结构 - -``` -src/ -├── app/ # Next.js App Router -│ ├── (auth)/ # 认证相关页面 -│ ├── (main)/ # 主应用页面 -│ └── api/ # API路由 -├── components/ # 可复用组件 -├── lib/ # 工具库 -│ ├── auth/ # 认证管理 -│ ├── http/ # HTTP客户端 -│ └── oauth/ # OAuth服务 -├── services/ # 业务服务 -├── mocks/ # MSW Mock配置 -└── types/ # TypeScript类型定义 -``` - ## API文档 ### 认证相关API @@ -167,53 +125,6 @@ Headers: AUTH_DID: "设备ID" ``` -## 贡献指南 - -1. Fork本项目 -2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) -4. 推送分支 (`git push origin feature/AmazingFeature`) -5. 创建Pull Request - ## 许可证 本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。 - -## 文案清单导出(一次性盘点) - -为便于产品/运营统一校对当前所有展示文案,项目提供静态扫描脚本,自动抽取源码中的用户可见与可感知文案并导出为 Excel。 - -### 覆盖范围 - -- JSX 文本节点与按钮/链接文案 -- 属性文案:`placeholder` / `title` / `alt` / `aria-*` / `label` -- 交互文案:`toast.*` / `message.*` / `alert` / `confirm` / `Dialog`/`Tooltip` 等常见调用 -- 表单校验与错误提示:`form.setError(..., { message })`、校验链条中的 `{ message: '...' }` - -### 运行 - -```bash -# 生成 docs/copy-audit.xlsx -npx ts-node scripts/extract-copy.ts # 若 ESM 运行报错,请改用下行 -node scripts/extract-copy.cjs -``` - -输出文件:`docs/copy-audit.xlsx` - -### Excel 字段说明(Sheet: copy) - -- `route`: Next.js App Router 路由(如 `(main)/home`)或 `shared` -- `file`: 文案所在文件(相对仓库根路径) -- `componentOrFn`: 组件或函数名(无法解析时为文件名) -- `kind`: 文案类型(`text` | `placeholder` | `title` | `alt` | `aria` | `label` | `toast` | `dialog` | `error` | `validation`) -- `keyOrLocator`: 定位信息(如 `Button.placeholder`、`toast.success`) -- `text`: 实际文案内容 -- `line`: 文案起始行号(近似定位) -- `count`: 在同一路由下相同文案出现次数(已聚合) -- `notes`: 预留备注 - -### 说明与边界 - -- 仅提取可静态分析到的硬编码字符串;运行时拼接(仅变量)无法还原将被忽略 -- 会过滤明显的“代码样”字符串(如过长的标识符) -- 扫描目录为 `src/`,忽略 `node_modules/.next/__tests__/mocks` 等 diff --git a/docs/AiReplySuggestions-Refactor.md b/docs/AiReplySuggestions-Refactor.md deleted file mode 100644 index 9755e16..0000000 --- a/docs/AiReplySuggestions-Refactor.md +++ /dev/null @@ -1,256 +0,0 @@ -# AI 建议回复功能重构说明 - -## 重构日期 - -2025-11-17 - -## 最新更新 - -2025-11-17 - 优化请求逻辑,确保每次只发送 3 次 API 请求 - -## 问题描述 - -重构前的 AI 建议功能存在以下问题: - -1. **状态管理复杂**:维护了大量状态(`allSuggestions`、`loadedPages`、`batchNo`、`excContentList`、`isPageLoading`、`isRequesting` 等) -2. **页面切换逻辑复杂**:需要跟踪哪些页面已加载,切换时判断是否显示骨架屏 -3. **显示逻辑不清晰**:`isLoading` 只在首次加载时为 true,分页切换时骨架屏显示不正确 -4. **用户体验问题**:会出现 AI 辅助提示为空的情况(如图所示) - -## 重构目标 - -1. **简化状态管理**:只保留必要的状态 -2. **统一交互逻辑**:每次打开建议面板时,重置到第1页并重新获取数据 -3. **清晰的骨架屏显示**:数据未加载完成时始终显示骨架屏 - -## 重构内容 - -### 1. `useAiReplySuggestions` Hook 重构 - -#### 状态简化 - -**重构前:** - -```typescript -const [allSuggestions, setAllSuggestions] = useState([]) -const [loadedPages, setLoadedPages] = useState>(new Set([1])) -const [isPageLoading, setIsPageLoading] = useState(false) -const [isRequesting, setIsRequesting] = useState(false) -// ... 其他状态 -``` - -**重构后:** - -```typescript -const [pageData, setPageData] = useState>(new Map()) -const [loadingPages, setLoadingPages] = useState>(new Set()) -// ... 其他必要状态 -``` - -#### 核心逻辑变化 - -**重构前:** - -- `showSuggestions` 函数会根据多种条件判断是否需要获取数据 -- 首次获取第1页数据,然后静默获取第2、3页 -- 页面切换时复杂的加载状态判断 - -**重构后:** - -- **每次调用 `showSuggestions` 都重置到第1页并重新获取所有数据** -- 按页存储数据到 `Map` 中,逻辑更清晰 -- 页面切换时自动检查并加载缺失的页面数据 - -### 2. 数据获取流程优化 - -#### 重构前流程 - -1. 获取第1页 → 立即展示 -2. 静默获取第2页 → 更新 `loadedPages` -3. 静默获取第3页 → 更新 `loadedPages` -4. 用户切换页面时检查 `loadedPages` - -#### 重构后流程 - -1. 清空旧数据 -2. 获取第1页 → 存入 `pageData.set(1, ...)` -3. 获取第2页 → 存入 `pageData.set(2, ...)` -4. 获取第3页 → 存入 `pageData.set(3, ...)` -5. 用户切换页面时从 `pageData` 读取,无数据则显示骨架屏 - -### 3. 骨架屏显示逻辑 - -**重构前:** - -```typescript -const displaySuggestions = isCurrentPageLoaded ? suggestions : Array.from({ length: 3 }, ...); -``` - -**重构后:** - -```typescript -const suggestions = - isCurrentPageLoading || !currentPageSuggestions - ? Array.from({ length: 3 }, (_, index) => ({ - id: `skeleton-${currentPage}-${index}`, - text: '', - isSkeleton: true, - })) - : currentPageSuggestions -``` - -UI 组件根据 `isSkeleton` 标志渲染骨架屏或真实内容。 - -### 4. UI 组件更新 - -`AiReplySuggestions.tsx` 更新: - -- 添加 `isSkeleton` 字段到 `ReplySuggestion` 接口 -- 检查 `suggestions.some(s => s.isSkeleton)` 决定是否显示骨架屏 -- 骨架屏添加 `animate-pulse` 动画效果 - -## 重构优势 - -### 1. **简化的状态管理** - -- 使用 `Map` 按页存储数据,结构清晰 -- 移除了 `isRequesting`、`isPageLoading`、`isCurrentPageLoaded` 等冗余状态 -- 只需维护 `loadingPages: Set` 来跟踪正在加载的页面 - -### 2. **智能的数据管理** - -- **有新 AI 消息时**:重置到第1页并重新获取数据 -- **没有新消息时**:保留之前的建议内容和当前页面位置 -- 避免了"空白建议"的问题 -- 数据加载状态清晰可见(骨架屏动画) - -### 3. **更可靠的数据加载** - -- 智能判断是否需要重新获取数据(基于最后一条 AI 消息 ID) -- 首次打开或数据为空时自动获取 -- 减少了因状态不同步导致的 bug - -### 4. **更好的代码可维护性** - -- 代码从 312 行减少到 200 行 -- 逻辑流程更清晰直观 -- 减少了状态依赖和副作用 - -## 使用示例 - -### 场景1:首次打开建议面板(渐进式加载) - -1. **点击建议按钮** → 面板打开,重置到第1页,显示骨架屏 -2. **~500ms 后第1页数据返回** → ✨ **立即展示第1页的3条建议**(用户可以开始浏览) -3. **后台继续获取第2、3页** → 不阻塞用户交互 -4. **点击下一页** → 切换到第2页 - - 如果第2页数据已加载 → 立即显示 - - 如果第2页数据未加载 → 显示骨架屏(通常第2页已在后台加载完成) - -### 场景2:关闭后再次打开(无新消息) - -1. **关闭建议面板** -2. **再次点击建议按钮** → 面板打开 -3. **保留上次的内容和页面位置**(比如之前在第2页,现在仍在第2页) -4. **无需重新加载数据**,立即显示缓存的建议 - -### 场景3:收到新 AI 消息后打开 - -1. **用户发送消息,AI 回复** -2. **点击建议按钮** → 面板打开 -3. **检测到新的 AI 消息** → 重置到第1页,显示骨架屏 -4. **重新获取所有建议数据**(基于最新的对话内容) - -### 场景4:面板已打开时收到新 AI 消息 - -1. **建议面板已打开**(比如用户正在浏览第2页) -2. **用户发送消息,AI 回复** -3. **自动刷新建议数据** → **保持在当前页面**(第2页),不强制切回第1页 -4. **渐进式加载新数据**,用户可以继续浏览当前页 - -## API 返回值变化 - -Hook 返回的接口保持不变,确保向后兼容: - -```typescript -return { - suggestions, // ReplySuggestion[] (包含 isSkeleton 标志) - currentPage, // number - totalPages, // number - isLoading, // boolean (只要有页面在加载就为 true) - isVisible, // boolean - showSuggestions, // () => void - hideSuggestions, // () => void - handlePageChange, // (page: number) => void -} -``` - -移除的返回值: - -- `isPageLoading` -- `isCurrentPageLoaded` -- `refreshSuggestions` - -## 关键优化点 - -### 避免多次请求的设计 - -**问题**:原始实现会触发多次重复请求 - -**解决方案**: - -1. **统一的 `fetchAllData` 函数**:一次性顺序获取3页数据,使用局部变量传递 `batchNo` 和 `excContentList` -2. **防重复调用保护**:在 `fetchAllData` 开始时检查 `loadingPages.size > 0`,如果已有加载则跳过 -3. **移除分页独立加载**:删除了 `fetchPageData` 函数和 `handlePageChange` 中的数据获取逻辑 -4. **简化页面切换**:`handlePageChange` 只负责切换 `currentPage`,不触发数据加载 - -### 渐进式加载流程 - -采用**渐进式加载**策略,让用户尽早看到数据,提升体验: - -```typescript -fetchAllData() { - // 1. 检查防重复 - if (loadingPages.size > 0) return; - - // 2. 标记所有页面为加载中 - setLoadingPages(new Set([1, 2, 3])); - - // 3. 获取第1页 → 立即展示 - const response1 = await genSupContentV2({ aiId, excContentList: [] }); - setPageData(new Map([[1, response1]])); // ✨ 立即展示第1页 - setLoadingPages(new Set([2, 3])); // 标记第1页已完成 - - // 4. 获取第2页 → 追加展示 - const response2 = await genSupContentV2({ aiId, batchNo, excContentList: [response1] }); - setPageData(prev => prev.set(2, response2)); // ✨ 追加第2页 - setLoadingPages(new Set([3])); // 标记第2页已完成 - - // 5. 获取第3页 → 追加展示 - const response3 = await genSupContentV2({ aiId, batchNo, excContentList: [response1, response2] }); - setPageData(prev => prev.set(3, response3)); // ✨ 追加第3页 - setLoadingPages(new Set()); // 全部完成 -} -``` - -**关键优势**: - -- 🚀 **第1页数据到达后立即展示**,用户无需等待所有数据 -- 📊 **后续页面数据追加展示**,不影响用户浏览第1页 -- ⏱️ **感知加载时间更短**,提升用户体验 -- 🔄 **页面2、3可以并行渲染**,用户切换时自动显示骨架屏 - -## 注意事项 - -1. **精确的请求次数**:每次调用 `fetchAllData` 只会发送 **3 次** API 请求(第1、2、3页) -2. **智能缓存策略**:没有新 AI 消息时,复用已有数据,不发送请求 -3. **网络失败处理**:任一页面加载失败会中断整个流程并清空数据 -4. **Coin 不足处理**:任何页面触发 Coin 不足错误都会关闭整个建议面板 -5. **防重复保护**:通过 `loadingPages.size` 检查防止并发调用 - -## 测试建议 - -1. 测试正常流程:打开建议 → 浏览3页 → 关闭 → 再次打开 -2. 测试网络慢场景:确认骨架屏正确显示 -3. 测试 Coin 不足场景:确认面板正确关闭 -4. 测试新消息场景:发送消息后面板已打开时自动刷新 diff --git a/docs/AiReplySuggestions.md b/docs/AiReplySuggestions.md deleted file mode 100644 index ca6c178..0000000 --- a/docs/AiReplySuggestions.md +++ /dev/null @@ -1,104 +0,0 @@ -# AI建议回复功能实现 - -## 功能概述 - -根据Figma设计稿实现了AI建议回复功能,用户可以在聊天界面中获取AI生成的回复建议,提高聊天效率。 - -## 实现组件 - -### 1. AiReplySuggestions.tsx - -主要的AI建议回复组件,包含以下功能: - -- 显示多个AI建议选项 -- 支持编辑建议内容 -- VIP解锁更多功能入口 -- 分页导航控制 - -### 2. useAiReplySuggestions.ts - -状态管理Hook,处理: - -- AI建议的获取和管理 -- 分页逻辑 -- 面板显示/隐藏控制 -- **自动刷新机制**:当面板打开时收到新AI消息会自动刷新建议 - -### 3. ChatInput.tsx(更新) - -集成AI建议功能到聊天输入组件: - -- 添加提示词按钮来触发建议面板 -- 处理建议选择和应用 -- 管理面板状态 - -## 设计细节 - -### 视觉设计 - -- 遵循Figma设计稿的视觉样式 -- 使用毛玻璃效果和圆角设计 -- 渐变色彩搭配 -- 响应式布局 - -### 交互设计 - -- 点击提示词按钮显示/隐藏建议面板 -- **点击建议卡片:直接发送该建议作为消息** -- **点击编辑图标:将建议文案放入输入框进行编辑** -- 分页控制支持浏览更多建议 -- VIP入口引导用户升级 - -## 使用方法 - -1. 在聊天界面点击输入框右侧的提示词按钮 -2. 查看AI生成的回复建议 -3. **直接点击建议卡片可立即发送该消息** -4. **点击编辑图标将建议放入输入框进行修改** -5. 使用分页控制查看更多建议选项 - -## 技术特点 - -- TypeScript类型安全 -- React Hooks状态管理 -- 响应式设计 -- 模块化组件结构 -- 可扩展的API接口设计 - -## 核心逻辑 - -### 建议获取时机 - -- 只有当最后一条消息来自AI(对方)时,才会在打开面板时获取新建议 -- 如果最后一条消息来自用户,则显示之前缓存的建议或骨架屏 -- 每次检测到新的AI消息后,第一次打开面板会重新获取建议 - -### 骨架屏显示 - -- **骨架屏已集成到建议弹窗内部**,不再是独立组件 -- 在API调用期间显示骨架屏,提升用户体验 -- 骨架屏固定显示2条建议的布局结构 - -### 分页机制 - -- **API一次性返回所有建议数据**,不是分页请求 -- 每页显示2条建议 -- 根据API返回的总数自动计算页数 -- **点击左右切换只是前端切换显示,不会重新请求接口** - -### 缓存策略 - -- 建议会被缓存,避免重复API调用 -- 只有检测到新的AI消息时才会清空缓存重新获取 -- **自动刷新**:当面板已打开且收到新AI消息时,自动刷新建议 - -## API集成 - -已集成真实的AI建议API(`genSupContentV2`),替换了之前的模拟数据。 - -## 后续扩展 - -- 添加建议个性化定制 -- 支持更多建议类型 -- 添加使用统计和优化 -- 优化缓存策略和错误处理 diff --git a/docs/AvatarSetting.md b/docs/AvatarSetting.md deleted file mode 100644 index ef89406..0000000 --- a/docs/AvatarSetting.md +++ /dev/null @@ -1,101 +0,0 @@ -# AvatarSetting 组件 - -这是一个根据Figma设计稿实现的头像设置模态框组件,支持头像预览、编辑、上传和删除功能。 - -## 功能特性 - -- 🖼️ 大尺寸圆形头像预览 -- ✂️ 头像裁剪功能 -- 📤 文件上传支持 -- 🗑️ 头像删除功能 -- 📱 响应式设计 -- 🎨 符合设计规范的UI -- 🔄 模态框形式,覆盖在页面上 - -## 使用方法 - -```tsx -import AvatarSetting from '@/app/(main)/profile/components/AvatarSetting' - -function ProfilePage() { - const [isAvatarSettingOpen, setIsAvatarSettingOpen] = useState(false) - const [currentAvatar, setCurrentAvatar] = useState('') - - const handleAvatarChange = (avatarUrl: string) => { - setCurrentAvatar(avatarUrl) - // 这里可以调用API保存头像 - } - - const handleAvatarDelete = () => { - setCurrentAvatar('') - // 这里可以调用API删除头像 - } - - const openAvatarSetting = () => { - setIsAvatarSettingOpen(true) - } - - const closeAvatarSetting = () => { - setIsAvatarSettingOpen(false) - } - - return ( -
- {/* 触发按钮 */} - - - {/* 头像设置模态框 */} - -
- ) -} -``` - -## Props - -| 属性 | 类型 | 默认值 | 说明 | -| ---------------- | ----------------------------- | ----------- | ------------------- | -| `isOpen` | `boolean` | `false` | 控制模态框显示/隐藏 | -| `onClose` | `() => void` | `undefined` | 关闭模态框的回调 | -| `currentAvatar` | `string \| undefined` | `undefined` | 当前头像URL | -| `onAvatarChange` | `(avatarUrl: string) => void` | `undefined` | 头像变更回调 | -| `onAvatarDelete` | `() => void` | `undefined` | 头像删除回调 | -| `className` | `string` | `undefined` | 自定义CSS类名 | - -## 层级关系 - -- 头像设置模态框:`z-40` -- 头像裁剪弹窗:`z-50`(更高层级) - -## 文件格式支持 - -- 支持的格式:JPG、JPEG、PNG -- 文件大小限制:5MB -- VIP用户支持GIF格式 - -## 设计规范 - -- 背景色:`#211a2b` -- 头像尺寸:512x512px -- 按钮渐变:从 `#f264a4` 到 `#c241e6` -- 圆角:999px(完全圆形) -- 模态框尺寸:800x800px - -## 测试页面 - -访问 `/test-avatar-setting` 可以查看组件的演示效果。 - -## 注意事项 - -1. 组件现在是模态框形式,会覆盖在页面上 -2. 使用现有的 `AvatarCropModal` 组件进行头像裁剪 -3. 文件上传使用原生的 `input[type="file"]` 实现 -4. 组件会自动验证文件类型和大小 -5. 裁剪后的图片会自动转换为圆形 -6. 裁剪弹窗的层级比头像设置模态框更高 diff --git a/docs/CrushLevelAvatar.md b/docs/CrushLevelAvatar.md deleted file mode 100644 index 9971658..0000000 --- a/docs/CrushLevelAvatar.md +++ /dev/null @@ -1,197 +0,0 @@ -# 心动等级头像组件 (CrushLevelAvatar) - -## 概述 - -`CrushLevelAvatar` 是一个展示用户与AI角色心动等级的头像组件,根据设计稿实现了双头像重叠布局、心动等级徽章显示以及动画效果。 - -## 功能特性 - -### 1. 状态处理 - -- **无等级状态**:只显示AI头像和昵称 -- **有等级状态**:显示AI和用户双头像,包含心动等级信息 - -### 2. 视觉设计 - -- **双头像布局**:AI头像和用户头像并排显示,带有白色边框和阴影 -- **多层背景装饰**:三层渐变圆形背景,从外到内颜色递进 -- **心动等级徽章**:居中显示的心形徽章,包含等级数字 -- **角色信息展示**:角色名称和心动温度标签 - -### 3. 动画效果 - -- **等级变化动画**:心形背景从大到小消失,数字等级渐变切换 -- **分层延迟**:三层心形背景依次消失(0ms, 100ms, 200ms延迟) -- **数字切换**:背景完全消失后,等级数字淡出淡入切换到新等级 - -## 组件属性 - -```typescript -interface CrushLevelAvatarProps { - size?: 'large' | 'small' // 头像尺寸 - showAnimation?: boolean // 是否显示等级变化动画 -} -``` - -## 使用示例 - -```tsx -import CrushLevelAvatar from './components/CrushLevelAvatar'; - -// 基础使用 - - -// 大尺寸带动画 - -``` - -## 依赖要求 - -组件需要在以下上下文中使用: - -1. **ChatConfigContext** - 提供AI信息和ID -2. **用户认证** - 获取当前用户信息 -3. **IM服务** - 获取心动等级数据 - -## 数据来源 - -- `useChatConfig()` - AI信息和聊天配置 -- `useCurrentUser()` - 当前用户信息 -- `useGetHeartbeatLevel()` - 心动等级数据 -- `useHeartLevelTextFromLevel()` - 等级文本转换 - -## 样式系统 - -### CSS 动画类 - -- `.animate-scale-down` - 缩放动画 -- `.animate-delay-100/200/300` - 动画延迟 - -### 颜色设计 - -- 外层背景:`from-purple-500/20` -- 中层背景:`from-pink-500/30` -- 内层背景:`from-magenta-500/40` -- 心形徽章:`from-pink-400 to-red-500` - -## 实现细节 - -### 背景装饰层 - -```tsx -{ - /* 心形背景层 - 使用SVG图标 */ -} -;
- heart background -
-``` - -### 心动等级徽章 - -```tsx -{ - /* 心形背景 + 等级数字 */ -} -;
- heart -
- {displayLevel?.replace('LEVEL_', '') || '1'} -
-
-``` - -### 动画触发机制 - -```tsx -// 监听等级变化触发动画 -useEffect(() => { - if (showAnimation && heartbeatLevel && heartbeatLevel !== displayLevel) { - setIsLevelChanging(true) - setAnimationKey((prev) => prev + 1) - - // 背景消失后更新等级数字 - setTimeout(() => { - setDisplayLevel(heartbeatLevel) - setIsLevelChanging(false) - }, 600) // 背景消失动画时长 - } -}, [heartbeatLevel, showAnimation, displayLevel]) -``` - -### CSS 动画定义 - -```css -/* 心形背景消失动画 */ -@keyframes scale-fade-out { - 0% { - transform: scale(1); - opacity: 1; - } - 100% { - transform: scale(0.3); - opacity: 0; - } -} - -/* 等级数字变化动画 */ -@keyframes level-change { - 0% { - opacity: 1; - transform: scale(1); - } - 50% { - opacity: 0; - transform: scale(0.8); - } - 100% { - opacity: 1; - transform: scale(1); - } -} -``` - -## 注意事项 - -1. **上下文依赖**:组件必须在正确的 Context 环境中使用 -2. **性能考虑**:动画效果会增加渲染开销 -3. **响应式设计**:组件在不同屏幕尺寸下的表现 -4. **数据安全**:处理用户头像加载失败的情况 -5. **图标依赖**:需要确保 `/icons/crushlevel_heart.svg` 文件存在 - -## 测试 - -可以通过访问 `/test-crush-level-avatar` 页面查看组件的不同状态和配置效果。 - -### 调试功能 - -在浏览器控制台中可以调用以下函数来手动触发动画: - -```javascript -window.triggerLevelAnimation() // 触发等级变化动画 -``` - -## 更新历史 - -- 2024-01-XX:初始实现,包含基础功能 -- 2024-01-XX:添加动画效果和背景装饰 -- 2024-01-XX:优化性能和用户体验 diff --git a/docs/DesignTokens.md b/docs/DesignTokens.md deleted file mode 100644 index 83b8cad..0000000 --- a/docs/DesignTokens.md +++ /dev/null @@ -1,404 +0,0 @@ -# Design Tokens for Website - -This document outlines the design tokens defined in the `Tokens.xlsx` file, including global tokens (base values) and web system tokens (specific to Tailwind CSS integration). The tokens are organized into two sections corresponding to the Excel sheets: `Global tokens` and `Web sys tokens`. - -## Global Tokens - -The `Global tokens` sheet defines foundational design tokens, including colors, transparency, angles, typography, ratios, radii, borders, spacing, and breakpoints. These serve as the base values referenced by other tokens. - -| Type | Token | Value | 移动端约定值 | 有调整会标黄 | 新增会标蓝 | 可不录入的文字会变红 | -| ----------- | -------------------------- | ---------------------- | ------------ | ------------ | ---------- | -------------------- | -| color | glo.color.orange.0 | #FFECDE | | | | | -| | glo.color.orange.10 | #FFD7B8 | | | | | -| | glo.color.orange.20 | #FFBF8F | | | | | -| | glo.color.orange.30 | #FFA264 | | | | | -| | glo.color.orange.40 | #FD8239 | | | | | -| | glo.color.orange.50 | #F25E0F | | | | | -| | glo.color.orange.60 | #D04500 | | | | | -| | glo.color.orange.70 | #A83400 | | | | | -| | glo.color.orange.80 | #7B2300 | | | | | -| | glo.color.orange.90 | #4D1400 | | | | | -| | glo.color.yellow.0 | #FFF8DE | | | | | -| | glo.color.yellow.10 | #FFEFB3 | | | | | -| | glo.color.yellow.20 | #FFE386 | | | | | -| | glo.color.yellow.30 | #FCD258 | | | | | -| | glo.color.yellow.40 | #F3BC2A | | | | | -| | glo.color.yellow.50 | #E6A100 | | | | | -| | glo.color.yellow.60 | #C78800 | | | | | -| | glo.color.yellow.70 | #A26B00 | | | | | -| | glo.color.yellow.80 | #784D00 | | | | | -| | glo.color.yellow.90 | #4D2F00 | | | | | -| | glo.color.grass.0 | #F8FFDE | | | | | -| | glo.color.grass.10 | #EDFCB8 | | | | | -| | glo.color.grass.20 | #E0F68F | | | | | -| | glo.color.grass.30 | #CFED67 | | | | | -| | glo.color.grass.40 | #BAE041 | | | | | -| | glo.color.grass.50 | #A0CD1E | | | | | -| | glo.color.grass.60 | #82B500 | | | | | -| | glo.color.grass.70 | #689600 | | | | | -| | glo.color.grass.80 | #4B7200 | | | | | -| | glo.color.grass.90 | #304D00 | | | | | -| | glo.color.green.0 | #DEFFE7 | | | | | -| | glo.color.green.10 | #B9FCCD | | | | | -| | glo.color.green.20 | #94F7B1 | | | | | -| | glo.color.green.30 | #6FEE96 | | | | | -| | glo.color.green.40 | #4AE27B | | | | | -| | glo.color.green.50 | #28D061 | | | | | -| | glo.color.green.60 | #0BB84A | | | | | -| | glo.color.green.70 | #00983C | | | | | -| | glo.color.green.80 | #007331 | | | | | -| | glo.color.green.90 | #004D22 | | | | | -| | glo.color.mint.0 | #DEFFF8 | | | | | -| | glo.color.mint.10 | #B6FBED | | | | | -| | glo.color.mint.20 | #8DF3E2 | | | | | -| | glo.color.mint.30 | #65E9D5 | | | | | -| | glo.color.mint.40 | #3FDAC4 | | | | | -| | glo.color.mint.50 | #1DC7B0 | | | | | -| | glo.color.mint.60 | #00AD96 | | | | | -| | glo.color.mint.70 | #009182 | | | | | -| | glo.color.mint.80 | #006F67 | | | | | -| | glo.color.mint.90 | #004D49 | | | | | -| | glo.color.sky.0 | #DEECFF | | | | | -| | glo.color.sky.10 | #B5D2FD | | | | | -| | glo.color.sky.20 | #8CB5F9 | | | | | -| | glo.color.sky.30 | #6296F2 | | | | | -| | glo.color.sky.40 | #3A76E6 | | | | | -| | glo.color.sky.50 | #1E58D2 | | | | | -| | glo.color.sky.60 | #063BB8 | | | | | -| | glo.color.sky.70 | #002A98 | | | | | -| | glo.color.sky.80 | #001E73 | | | | | -| | glo.color.sky.90 | #00134D | | | | | -| | glo.color.blue.0 | #DEE0FF | | | | | -| | glo.color.blue.10 | #BCBEFF | | | | | -| | glo.color.blue.20 | #9797FF | | | | | -| | glo.color.blue.30 | #7370FF | | | | | -| | glo.color.blue.40 | #4E48FF | | | | | -| | glo.color.blue.50 | #3126E6 | | | | | -| | glo.color.blue.60 | #180AC7 | | | | | -| | glo.color.blue.70 | #0F00A2 | | | | | -| | glo.color.blue.80 | #0D0078 | | | | | -| | glo.color.blue.90 | #09004D | | | | | -| | glo.color.violet.0 | #E4DEFF | | | | | -| | glo.color.violet.10 | #C7B7FD | | | | | -| | glo.color.violet.20 | #AA90F9 | | | | | -| | glo.color.violet.30 | #8D68F2 | | | | | -| | glo.color.violet.40 | #7B47FF | | | | | -| | glo.color.violet.50 | #5923D2 | | | | | -| | glo.color.violet.60 | #4309B8 | | | | | -| | glo.color.violet.70 | #340098 | | | | | -| | glo.color.violet.80 | #290073 | | | | | -| | glo.color.violet.90 | #1C004D | | | | | -| | glo.color.purple.0 | #FBDEFF | | | | | -| | glo.color.purple.10 | #F2B7FD | | | | | -| | glo.color.purple.20 | #E690F9 | | | | | -| | glo.color.purple.30 | #D668F2 | | | | | -| | glo.color.purple.40 | #C241E6 | | | | | -| | glo.color.purple.50 | #A823D2 | | | | | -| | glo.color.purple.60 | #8A09B8 | | | | | -| | glo.color.purple.70 | #6E0098 | | | | | -| | glo.color.purple.80 | #520073 | | | | | -| | glo.color.purple.90 | #36004D | | | | | -| | glo.color.magenta.0 | #FBDEFF | | | | | -| | glo.color.magenta.10 | #FDB6D3 | | | | | -| | glo.color.magenta.20 | #F98DBC | | | | | -| | glo.color.magenta.30 | #F264A4 | | | | | -| | glo.color.magenta.40 | #E63C8B | | | | | -| | glo.color.magenta.50 | #D21F77 | | | | | -| | glo.color.magenta.60 | #B80761 | | | | | -| | glo.color.magenta.70 | #980050 | | | | | -| | glo.color.magenta.80 | #73003E | | | | | -| | glo.color.magenta.90 | #4D002A | | | | | -| | glo.color.red.0 | #FFDEDE | | | | | -| | glo.color.red.10 | #FFBCBC | | | | | -| | glo.color.red.20 | #FF9696 | | | | | -| | glo.color.red.30 | #F97372 | | | | | -| | glo.color.red.40 | #EF4E4D | | | | | -| | glo.color.red.50 | #E12A2A | | | | | -| | glo.color.red.60 | #C2110E | | | | | -| | glo.color.red.70 | #A00700 | | | | | -| | glo.color.red.80 | #770800 | | | | | -| | glo.color.red.90 | #4D0600 | | | | | -| | glo.color.grey.0 | #E8E4EB | | | | | -| | glo.color.grey.10 | #D4D0D8 | | | | | -| | glo.color.grey.20 | #AAA3B1 | | | | | -| | glo.color.grey.30 | #958E9E | | | | | -| | glo.color.grey.40 | #847D8B | | | | | -| | glo.color.grey.50 | #706A78 | | | | | -| | glo.color.grey.60 | #5C5565 | | | | | -| | glo.color.grey.70 | #484151 | | | | | -| | glo.color.grey.80 | #352E3E | | | | | -| | glo.color.grey.90 | #282233 | | | | | -| | glo.color.grey.100 | #211A2B | | | | | -| | glo.color.white | #FFFFFF | | | | | -| | glo.color.black | #000000 | | | | | -| Transparent | glo.transparent.t0 | 0 | | | | | -| | glo.transparent.t2 | 0.02 | | | | | -| | glo.transparent.t4 | 0.04 | | | | | -| | glo.transparent.t6 | 0.06 | | | | | -| | glo.transparent.t8 | 0.08 | | | | | -| | glo.transparent.t12 | 0.12 | | | | | -| | glo.transparent.t15 | 0.15 | | | | | -| | glo.transparent.t20 | 0.2 | | | | | -| | glo.transparent.t25 | 0.25 | | | | | -| | glo.transparent.t30 | 0.3 | | | | | -| | glo.transparent.t45 | 0.45 | | | | | -| | glo.transparent.t65 | 0.65 | | | | | -| | glo.transparent.t85 | 0.85 | | | | | -| Degree | glo.deg.ltr | to Right | | | | | -| | glo.deg.ttb | to Bottom | | | | | -| | glo.deg.lttrb | to Bottom Right | | | | | -| Typeface | glo.font.family.sys | Poppins | | | | | -| | glo.font.family.numDisplay | DIN Alternate | | | | | -| | glo.font.family.num | Poppins | | | | | -| | glo.font.family.display | Oleo Script Swash Caps | | | | | -| | glo.font.style.italic | Italic | | | | | -| | glo.font.size.64 | 64 | | | | | -| | glo.font.size.48 | 48 | | | | | -| | glo.font.size.36 | 36 | | | | | -| | glo.font.size.24 | 24 | | | | | -| | glo.font.size.20 | 20 | | | | | -| | glo.font.size.18 | 18 | | | | | -| | glo.font.size.16 | 16 | | | | | -| | glo.font.size.14 | 14 | | | | | -| | glo.font.size.12 | 12 | | | | | -| | glo.font.weight.regular | 400 | | | | | -| | glo.font.weight.medium | 500 | | | | | -| | glo.font.weight.semibold | 600 | | | | | -| | glo.font.weight.bold | 700 | | | | | -| | glo.font.lineheight.size64 | 80px | | | | | -| | glo.font.lineheight.size48 | 56px | | | | | -| | glo.font.lineheight.size36 | 48px | | | | | -| | glo.font.lineheight.size24 | 28px | | | | | -| | glo.font.lineheight.size20 | 24px | | | | | -| | glo.font.lineheight.size18 | 24px | | | | | -| | glo.font.lineheight.size16 | 24px | | | | | -| | glo.font.lineheight.size14 | 20px | | | | | -| | glo.font.lineheight.size12 | 20px | | | | | -| | glo.font.lineheight.size0 | 1 | | | | | -| radio | glo.radio.1.1 | 1:1 | | | | | -| | glo.radio.4.3 | 4:3 | | | | | -| | glo.radio.3.2 | 3:2 | | | | | -| | glo.radio.2.1 | 2:1 | | | | | -| | glo.radio.16.9 | 16:9 | | | | | -| radius | glo.radius.4 | 4 | | | | | -| | glo.radius.8 | 8 | | | | | -| | glo.radius.12 | 12 | | | | | -| | glo.radius.16 | 16 | | | | | -| | glo.radius.24 | 24 | | | | | -| | glo.radius.round | 0.5 | | | | | -| border | glo.border.1 | 1px | | | | | -| | glo.border.2 | 2px | | | | | -| | glo.border.4 | 4px | | | | | -| space | glo.spacing.4 | 4px | | | | | -| | glo.spacing.8 | 8px | | | | | -| | glo.spacing.12 | 12px | | | | | -| | glo.spacing.16 | 16px | | | | | -| | glo.spacing.24 | 24px | | | | | -| | glo.spacing.32 | 32px | | | | | -| | glo.spacing.48 | 48px | | | | | -| | glo.spacing.64 | 64px | | | | | -| | glo.spacing.80 | 80px | | | | | -| | glo.spacing.128 | 128px | | | | | -| breackpoint | breackpoint.xs | <768px | | | | | -| | breackpoint.s | ≥768px | | | | | -| | breackpoint.m | ≥1024px | | | | | -| | breackpoint.l | ≥1280px | | | | | -| | breackpoint.xl | ≥1536 | | | | | - -## Web System Tokens - -The `Web sys tokens` sheet defines tokens specifically for web use, including colors, typography, shadows, radii, and borders. These are intended for integration with Tailwind CSS, particularly for color definitions in dark and light themes. - -| Type | | Token | Value@Dark Theme(Default) | Value on White | -| ------------ | ---------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -------------------- | -| color | primary | color.primary.normal | $glo.color.magenta.50 | | -| | | color.primary.hover | $glo.color.magenta.40 | | -| | | color.primary.press | $glo.color.magenta.60 | | -| | | color.primary.disabled | $color.surface.nest.disabled | | -| | | color.primary.variant.normal | $glo.color.magenta.40 | | -| | | color.primary.variant.hover | $glo.color.magenta.30 | | -| | | color.primary.variant.press | $glo.color.magenta.50 | | -| | | color.primary.variant.disabled | $color.surface.nest.disabled | | -| | | color.primary.gradient.normal | linear-gradient($glo.deg.ltr,$glo.color.magenta.30,$glo.color.purple.40) | | -| | | color.primary.gradient.hover | linear-gradient($glo.deg.ltr,$glo.color.magenta.20,$glo.color.purple.30) | | -| | | color.primary.gradient.press | linear-gradient($glo.deg.ltr,$glo.color.magenta.40,$glo.color.purple.50) | | -| | | color.primary.gradient.disabled | $color.surface.nest.disabled | | -| | | color.primary.onpic.normal | $glo.color.violet.40 | $glo.transparent.t85 | -| | | color.primary.onpic.hover | $glo.color.violet.30 | $glo.transparent.t85 | -| | | color.primary.onpic.press | $glo.color.violet.50 | $glo.transparent.t85 | -| | Important | color.important.normal | $glo.color.red.50 | | -| | | color.important.hover | $glo.color.red.40 | | -| | | color.important.press | $glo.color.red.60 | | -| | | color.important.disabled | $color.surface.nest.disabled | | -| | | color.important.variant.normal | $glo.color.red.40 | | -| | | color.important.variant.hover | $glo.color.red.30 | | -| | | color.important.variant.press | $glo.color.red.50 | | -| | | color.important.variant.disabled | $glo.color.blue.10 | $glo.transparent.t25 | -| | | color.important.gradient.normal | sha | | -| | | color.important.gradient.hover | linear-gradient($glo.deg.ltr,$glo.color.orange.40,$glo.color.red.40) | | -| | | color.important.gradient.press | linear-gradient($glo.deg.ltr,$glo.color.orange.60,$glo.color.red.60) | | -| | | color.important.gradient.disabled | $color.surface.nest.disabled | | -| | | color.important.onpic.normal | $glo.color.red.50 | $glo.transparent.t85 | -| | positive | color.positive.normal | $glo.color.mint.60 | | -| | | color.positive.hover | $glo.color.mint.50 | | -| | | color.positive.press | $glo.color.mint.70 | | -| | | color.positive.disabled | $color.surface.nest.disabled | | -| | | color.positive.variant.normal | $glo.color.mint.40 | | -| | | color.positive.variant.hover | $glo.color.mint.30 | | -| | | color.positive.variant.press | $glo.color.mint.50 | | -| | | color.positive.variant.disabled | $glo.color.blue.10 | $glo.transparent.t25 | -| | | color.positive.gradient.normal | linear-gradient($glo.deg.ltr,$glo.color.green.40,$glo.color.mint.60) | | -| | | color.positive.gradient.hover | linear-gradient($glo.deg.ltr,$glo.color.green.40,$glo.color.mint.50) | | -| | | color.positive.gradient.press | | | -| | | color.positive.gradient.disabled | $color.surface.nest.disabled | | -| | | color.positive.onpic.normal | $glo.color.mint.60 | $glo.transparent.t85 | -| | warning | color.warning.normal | $glo.color.orange.50 | | -| | | color.warning.hover | $glo.color.orange.40 | | -| | | color.warning.press | $glo.color.orange.60 | | -| | | color.warning.disabled | $color.surface.nest.disabled | | -| | | color.warning.variant.normal | $glo.color.orange.40 | | -| | | color.warning.variant.hover | $glo.color.orange.30 | | -| | | color.warning.variant.press | $glo.color.orange.50 | | -| | | color.warning.variant.disabled | $glo.color.blue.10 | $glo.transparent.t25 | -| | | color.warning.gradient.normal | linear-gradient($glo.deg.ltr,$glo.color.yellow.40,$glo.color.orange.50) | | -| | | color.warning.gradient.hover | linear-gradient($glo.deg.ltr,$glo.color.yellow.30,$glo.color.orange40) | | -| | | color.warning.gradient.press | linear-gradient($glo.deg.ltr,$glo.color.yellow.50,$glo.color.orange.60) | | -| | | color.warning.gradient.disabled | $color.surface.nest.disabled | | -| | | color.warning.onpic.normal | $glo.color.orange.50 | $glo.transparent.t85 | -| | emphasis | color.emphasis.normal | $glo.color.blue.40 | | -| | | color.emphasis.hover | $glo.color.blue.30 | | -| | | color.emphasis.press | $glo.color.blue.50 | | -| | | color.emphasis.disabled | $color.surface.nest.disabled | | -| | | color.emphasis.variant.normal | $glo.color.blue.30 | | -| | | color.emphasis.variant.hover | $glo.color.blue.20 | | -| | | color.emphasis.variant.press | $glo.color.blue.40 | | -| | | color.emphasis.variant.disabled | $glo.color.blue.10 | $glo.transparent.t25 | -| | | color.emphasis.gradient.normal | linear-gradient($glo.deg.ltr,$glo.color.sky.30,$glo.color.blue.40) | | -| | | color.emphasis.gradient.hover | linear-gradient($glo.deg.ltr,$glo.color.sky.20,$glo.color.blue.30) | | -| | | color.emphasis.gradient.press | linear-gradient($glo.deg.ltr,$glo.color.sky.40,$glo.color.blue.50) | | -| | | color.emphasis.gradient.disabled | $color.surface.nest.disabled | | -| | | color.emphasis.onpic.normal | $glo.color.blue.40 | $glo.transparent.t85 | -| | Background | color.background.default | $glo.color.grey.100 | | -| | | color.background.specialmap | $glo.color.grey.100 | | -| | | color.background.district | $glo.color.black | $glo.transparent.t30 | -| | Surface | color.surface.base.normal | $glo.color.grey.80 | | -| | | color.surface.base.hover | $glo.color.grey.70 | | -| | | color.surface.base.press | $glo.color.grey.90 | | -| | | color.surface.base.disabled | $glo.color.grey.90 | | -| | | color.surface.base.specialmap.normal | $glo.color.grey.80 | | -| | | color.surface.base.specialmap.hover | $glo.color.grey.70 | | -| | | color.surface.base.specialmap.press | $glo.color.grey.90 | $glo.transparent.t30 | -| | | color.surface.base.specialmap.disabled | $glo.color.white | $glo.transparent.t8 | -| | | color.surface.float.normal | $glo.color.grey.70 | | -| | | color.surface.float.hover | $glo.color.grey.60 | | -| | | color.surface.float.press | $glo.color.grey.80 | | -| | | color.surface.float.disabled | $glo.color.grey.80 | | -| | | color.surface.top.normal | $glo.color.black | $glo.transparent.t65 | -| | | color.surface.top.hover | $glo.color.black | $glo.transparent.t45 | -| | | color.surface.top.press | $glo.color.black | $glo.transparent.t85 | -| | | color.surface.top.disabled | $glo.color.black | $glo.transparent.t30 | -| | | color.surface.district.normal | $glo.color.purple.0 | $glo.transparent.t4 | -| | | color.surface.district.hover | $glo.color.purple.0 | $glo.transparent.t12 | -| | | color.surface.district.press | $glo.color.black | $glo.transparent.t25 | -| | | color.surface.district.disabled | $glo.color.black | $glo.transparent.t25 | -| | | color.surface.nest.normal | $glo.color.purple.0 | $glo.transparent.t8 | -| | | color.surface.nest.hover | $glo.color.purple.0 | $glo.transparent.t12 | -| | | color.surface.nest.press | $glo.color.purple.0 | $glo.transparent.t4 | -| | | color.surface.nest.disabled | $glo.color.purple.0 | $glo.transparent.t4 | -| | | color.surface.element.normal | $color.surface.nest.normal | | -| | | color.surface.element.hover | $color.surface.nest.hover | | -| | | color.surface.element.press | $color.surface.nest.press | | -| | | color.surface.element.disabled | $color.surface.nest.disabled | | -| | | color.surface.element.dark.normal | $glo.color.black | $glo.transparent.t65 | -| | | color.surface.element.dark.hover | $glo.color.black | $glo.transparent.t45 | -| | | color.surface.element.dark.press | $glo.color.black | $glo.transparent.t85 | -| | | color.surface.element.dark.disabled | $glo.color.black | $glo.transparent.t45 | -| | | color.surface.element.light.normal | $glo.color.white | $glo.transparent.t15 | -| | | color.surface.element.light.hover | $glo.color.white | $glo.transparent.t25 | -| | | color.surface.element.light.press | $glo.color.white | $glo.transparent.t8 | -| | | color.surface.element.light.disabled | $glo.color.white | $glo.transparent.t8 | -| | | color.surface.white.normal | $glo.color.white | | -| | | color.surface.white.hover | $glo.color.white | $glo.transparent.t85 | -| | | color.surface.white.press | $glo.color.white | $glo.transparent.t65 | -| | | color.surface.white.disabled | $glo.color.white | $glo.transparent.t45 | -| | | color.surface.black.normal | $glo.color.black | | -| | Outline | color.outline.normal | $glo.color.purple.0 | $glo.transparent.t20 | -| | | color.outline.hover | $glo.color.purple.0 | $glo.transparent.t30 | -| | | color.outline.press | $glo.color.purple.0 | $glo.transparent.t8 | -| | | color.outline.disabled | $color.surface.element.disabled | | -| | Overlay | color.overlay.primary | $glo.color.violet.30 | $glo.transparent.t30 | -| | | color.overlay.gradient | linear-gradient($glo.deg.ttb,$glo.color.black $glo.transparent.t0,$glo.color.black $glo.transparent.t100) | | -| | | color.overlay.dark | $glo.color.black | $glo.transparent.t65 | -| | | color.overlay.background | linear-gradient($glo.deg.ttb,$color.background.default $glo.transparent.t0,$color.background.default $glo.transparent.t100) | | -| | | color.overlay.base | linear-gradient($glo.deg.ttb,$color.surface.base.normal $glo.transparent.t100,$color.surface.base.normal $glo.transparent.t0) | | -| | Context | color.context.subscribe.normal | linear-gradient($glo.deg.ltr,$glo.color.purple.50,$glo.color.violet.50) | | -| | | color.context.subscribe.hover | linear-gradient($glo.deg.ltr,$glo.color.purple.30,$glo.color.violet.30) | | -| | | color.context.subscribe.press | linear-gradient($glo.deg.ltr,$glo.color.purple.70,$glo.color.violet.70) | | -| | | color.context.subscribe.disabled | $color.surface.nest.disabled | | -| | | color.context.legends.normal | linear-gradient($glo.deg.ltr,$glo.color.yellow.20,$glo.color.yellow.60) | | -| | | color.context.legends.hover | linear-gradient($glo.deg.ltr,$glo.color.yellow.10,$glo.color.yellow.40) | | -| | | color.context.legends.press | linear-gradient($glo.deg.ltr,$glo.color.yellow.60,$glo.color.yellow.90) | | -| | | color.context.legends.disabled | $color.surface.nest.disabled | | -| | | color.context.legends.variant.normal | $glo.color.yellow.20 | | -| | | color.context.legends.variant.hover | $glo.color.yellow.10 | | -| | | color.context.legends.variant.press | $glo.color.yellow.40 | | -| | | color.context.legends.variant.disabled | $color.surface.nest.disabled | | -| | | color.context.vip.normal | linear-gradient($glo.deg.ltr,$glo.color.sky.20 0%,$glo.color.violet.40 60%,$glo.color.purple.30 100%) | | -| | | color.context.recharge.normal | linear-gradient($glo.deg.ltr, $glo.color.yellow.0, $glo.color.yellow.70) | | -| | Text&icon | color.txt.primary.normal | $glo.color.white | | -| | | color.txt.primary.hover | $glo.color.magenta.30 | | -| | | color.txt.primary.press | $glo.color.magenta.40 | | -| | | color.txt.primary.disabled | $color.txt.disabled | | -| | | color.txt.primary.specialmap.normal | $glo.color.white | | -| | | color.txt.primary.specialmap.hover | $glo.color.white | $glo.transparent.t85 | -| | | color.txt.primary.specialmap.press | $glo.color.white | $glo.transparent.t65 | -| | | color.txt.primary.specialmap.disable | $glo.color.white | $glo.transparent.t45 | -| | | color.txt.secondary.normal | $glo.color.grey.30 | | -| | | color.txt.secondary.hover | $glo.color.magenta.30 | | -| | | color.txt.secondary.press | $glo.color.magenta.40 | | -| | | color.txt.secondary.disabled | $color.txt.disabled | | -| | | color.txt.tertiary.normal | $glo.color.grey.40 | | -| | | color.txt.tertiary.hover | $glo.color.grey.30 | | -| | | color.txt.tertiary | $glo.color.grey.50 | | -| | | color.txt.tertiary.disabled | $color.txt.disabled | | -| | | color.txt.grass | $glo.color.grass.40 | | -| | | color.txt.disabled | $glo.color.grey.50 | | -| Typography | display | txt.display.l | $glo.font.family.display,$glo.font.size.64,$glo.font.weight.regular,$glo.font.lineheight.size64 | | -| | | txt.display.m | $glo.font.family.display,$glo.font.size.48,$glo.font.weight.regular,$glo.font.lineheight.size48 | | -| | | txt.display.s | $glo.font.family.display,$glo.font.size.24,$glo.font.weight.regular,$glo.font.lineheight.size24 | | -| | headline | txt.headline.l | $glo.font.family.sys,$glo.font.size.48,$glo.font.weight.bold,$glo.font.lineheight.size48 | | -| | | txt.headline.m | $glo.font.family.sys,$glo.font.size.36,$glo.font.weight.bold,$glo.font.lineheight.size36 | | -| | title | txt.title.l | $glo.font.family.sys,$glo.font.size.24,$glo.font.weight.semibold,$glo.font.lineheight.size24 | | -| | | txt.title.m | $glo.font.family.sys,$glo.font.size.20,$glo.font.weight.semibold,$glo.font.lineheight.size20 | | -| | | txt.title.s | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.semibold,$glo.font.lineheight.size16 | | -| | body | txt.bodySemibold.l | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.semibold,$glo.font.lineheight.size16 | | -| | | txt.bodySemibold.m | $glo.font.family.sys,$glo.font.size.14,$glo.font.weight.semibold,$glo.font.lineheight.size14 | | -| | | txt.bodySemibold.s | $glo.font.family.sys,$glo.font.size.12,$glo.font.weight.semibold,$glo.font.lineheight.size12 | | -| | | txt.body.l | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.regular,$glo.font.lineheight.size16 | | -| | | txt.body.m | $glo.font.family.sys,$glo.font.size.14,$glo.font.weight.regular,$glo.font.lineheight.size14 | | -| | | txt.body.s | $glo.font.family.sys,$glo.font.size.12,$glo.font.weight.regular,$glo.font.lineheight.size12 | | -| | | txt.bodyItalic.l | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.regular,$glo.font.lineheight.size16,$glo.font.style.italic | | -| | label | txt.label.l | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.medium,$glo.font.lineheight.size16 | | -| | | txt.label.m | $glo.font.family.sys,$glo.font.size.14,$glo.font.weight.medium,$glo.font.lineheight.size14 | | -| | | txt.label.s | $glo.font.family.sys,$glo.font.size.12,$glo.font.weight.medium,$glo.font.lineheight.size12 | | -| | number | txt.numDisplay.xl | $glo.font.family.numDisplay,$glo.font.size.64,$glo.font.weight.bold,$glo.font.lineheight.size64 | | -| | | txt.numDisplay.l | $glo.font.family.numDisplay,$glo.font.size.48,$glo.font.weight.bold,$glo.font.lineheight.size48 | | -| | | txt.numMonotype.xl | $glo.font.family.sys,$glo.font.size.24,$glo.font.weight.bold,$glo.font.lineheight.size24 | | -| | | txt.numMonotype.l | $glo.font.family.sys,$glo.font.size.20,$glo.font.weight.bold,$glo.font.lineheight.size20 | | -| | | txt.numMonotype.m | $glo.font.family.sys,$glo.font.size.16,$glo.font.weight.bold,$glo.font.lineheight.size16 | | -| | | txt.numMonotype.s | $glo.font.family.sys,$glo.font.size.14,$glo.font.weight.medium,$glo.font.lineheight.size14 | | -| | | txt.numMonotype.xs | $glo.font.family.sys,$glo.font.size.12,$glo.font.weight.regular,$glo.font.lineheight.size12 | | -| visual style | shadow | shadow.s | @SHA:$glo.color.black,$$glo.transparent.t45,0&0,4,渐变色,ShadowOpacity,便宜,半径 | | -| | | shadow.m | @SHA:$glo.color.black,$$glo.transparent.t45,0&0,8 | | -| | | shadow.l | @SHA:$glo.color.black,$$glo.transparent.t45,0&0,16 | | -| | radius | radius.xs | $glo.radius.4 | | -| | | radius.s | $glo.radius.8 | | -| | | radius.m | $glo.radius.12 | | -| | | radius.l | $glo.radius.16 | | -| | | radius.xl | $glo.radius.24 | | -| | | radius.round | $glo.radius.round | | -| | | radius.pill | $glo.radius.round | | -| | border | border.divider | $glo.border.1 | | -| | | border.s | $glo.border.1 | | -| | | border.m | $glo.border.2 | | -| | | border.l | $glo.border.4 | | diff --git a/docs/EnvironmentVariables.md b/docs/EnvironmentVariables.md deleted file mode 100644 index aa3a407..0000000 --- a/docs/EnvironmentVariables.md +++ /dev/null @@ -1,177 +0,0 @@ -# 环境变量配置说明 - -## 概述 - -本文档说明项目所需的环境变量配置。请在项目根目录创建 `.env.local` 文件并添加以下配置。 - -## 必需的环境变量 - -### 应用配置 - -```bash -# 应用的基础 URL -# 开发环境: http://localhost:3000 -# 生产环境: https://test.crushlevel.ai 或您的域名 -NEXT_PUBLIC_APP_URL=https://test.crushlevel.ai -``` - -### Discord OAuth 配置 - -```bash -# Discord OAuth 客户端 ID -# 从 Discord Developer Portal 获取 -# https://discord.com/developers/applications -NEXT_PUBLIC_DISCORD_CLIENT_ID=your_discord_client_id_here -``` - -**获取步骤**: - -1. 访问 [Discord Developer Portal](https://discord.com/developers/applications) -2. 创建或选择应用 -3. 在 OAuth2 设置中配置回调 URL: - - `https://test.crushlevel.ai/api/auth/discord/callback` - - `http://localhost:3000/api/auth/discord/callback` (开发环境) -4. 复制 Client ID - -### Google OAuth 配置 - -```bash -# Google OAuth 客户端 ID -# 从 Google Cloud Console 获取 -# https://console.cloud.google.com/ -NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id_here -``` - -**获取步骤**: - -1. 访问 [Google Cloud Console](https://console.cloud.google.com/) -2. 创建或选择项目 -3. 启用 Google+ API -4. 创建 OAuth 2.0 客户端 ID -5. 配置授权重定向 URI: - - `https://test.crushlevel.ai/api/auth/google/callback` - - `http://localhost:3000/api/auth/google/callback` (开发环境) -6. 复制客户端 ID - -## 环境变量文件示例 - -创建 `.env.local` 文件: - -```bash -# .env.local - -# App Configuration -NEXT_PUBLIC_APP_URL=http://localhost:3000 - -# Discord OAuth -NEXT_PUBLIC_DISCORD_CLIENT_ID=1234567890123456789 - -# Google OAuth -NEXT_PUBLIC_GOOGLE_CLIENT_ID=1234567890-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com -``` - -## 不同环境的配置 - -### 开发环境 (`.env.local`) - -```bash -NEXT_PUBLIC_APP_URL=http://localhost:3000 -NEXT_PUBLIC_DISCORD_CLIENT_ID=dev_discord_client_id -NEXT_PUBLIC_GOOGLE_CLIENT_ID=dev_google_client_id -``` - -### 生产环境 (`.env.production`) - -```bash -NEXT_PUBLIC_APP_URL=https://test.crushlevel.ai -NEXT_PUBLIC_DISCORD_CLIENT_ID=prod_discord_client_id -NEXT_PUBLIC_GOOGLE_CLIENT_ID=prod_google_client_id -``` - -## 安全注意事项 - -### ⚠️ 重要提醒 - -1. **不要提交敏感信息到 Git** - - `.env.local` 已在 `.gitignore` 中 - - 不要将真实的密钥提交到代码库 - -2. **使用不同的凭据** - - 开发环境和生产环境使用不同的 OAuth 凭据 - - 定期轮换生产环境的密钥 - -3. **限制回调 URL** - - 只添加必要的回调 URL - - 不要使用通配符 - -4. **环境变量前缀** - - `NEXT_PUBLIC_` 前缀的变量会暴露到浏览器 - - 敏感的服务端密钥不要使用此前缀 - -## 验证配置 - -### 检查环境变量是否正确加载 - -在组件中添加调试代码(仅开发环境): - -```typescript -console.log('App URL:', process.env.NEXT_PUBLIC_APP_URL) -console.log('Discord Client ID:', process.env.NEXT_PUBLIC_DISCORD_CLIENT_ID) -console.log('Google Client ID:', process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID) -``` - -### 常见问题 - -**问题 1**: 环境变量未生效 - -**解决方案**: - -- 重启开发服务器 (`npm run dev`) -- 确保文件名正确 (`.env.local`) -- 检查变量名拼写 - -**问题 2**: OAuth 回调失败 - -**解决方案**: - -- 检查 `NEXT_PUBLIC_APP_URL` 是否正确 -- 确保回调 URL 在 OAuth 提供商处正确配置 -- 开发环境使用 `http://localhost:3000`,生产环境使用实际域名 - -**问题 3**: 客户端 ID 无效 - -**解决方案**: - -- 确认复制的是 Client ID 而不是 Client Secret -- 检查是否有多余的空格或换行符 -- 确认 OAuth 应用状态为已发布/激活 - -## 添加新的环境变量 - -当添加新的环境变量时: - -1. 在 `.env.local` 中添加变量 -2. 更新本文档 -3. 通知团队成员更新他们的本地配置 -4. 在部署平台(Vercel/Netlify 等)配置生产环境变量 - -## 部署平台配置 - -### Vercel - -1. 进入项目设置 -2. 选择 "Environment Variables" -3. 添加所有 `NEXT_PUBLIC_*` 变量 -4. 为不同环境(Production/Preview/Development)设置不同的值 - -### Netlify - -1. 进入 Site settings -2. 选择 "Build & deploy" > "Environment" -3. 添加环境变量 - -## 相关文档 - -- [Next.js 环境变量文档](https://nextjs.org/docs/app/building-your-application/configuring/environment-variables) -- [Discord OAuth 文档](https://discord.com/developers/docs/topics/oauth2) -- [Google OAuth 文档](https://developers.google.com/identity/protocols/oauth2) diff --git a/docs/GoogleOAuth-GIS.md b/docs/GoogleOAuth-GIS.md deleted file mode 100644 index 77965e1..0000000 --- a/docs/GoogleOAuth-GIS.md +++ /dev/null @@ -1,420 +0,0 @@ -# Google Identity Services (GIS) 登录集成文档 - -## 概述 - -使用最新的 **Google Identity Services (GIS)** SDK 实现 Google 登录,无需页面跳转,通过弹窗方式完成授权,用户体验更好。 - -## 新旧方式对比 - -### 旧方式(OAuth 2.0 重定向流程) - -``` -用户点击按钮 → 跳转到 Google 授权页面 → 授权后重定向回应用 -``` - -❌ 需要页面跳转 -❌ 需要配置回调路由 -❌ 用户体验不连贯 - -### 新方式(Google Identity Services) - -``` -用户点击按钮 → 弹出 Google 授权窗口 → 授权后直接回调 -``` - -✅ 无需页面跳转 -✅ 无需回调路由 -✅ 用户体验流畅 -✅ 更安全(弹窗隔离) - -## 实现架构 - -### 工作流程 - -``` -用户点击 "Continue with Google" - ↓ -加载 Google Identity Services SDK - ↓ -初始化 Code Client - ↓ -弹出 Google 授权窗口 - ↓ -用户授权 - ↓ -回调函数接收授权码 - ↓ -调用后端登录接口 - ↓ -登录成功,跳转到首页 -``` - -## 核心文件 - -### 1. Google OAuth 配置 (`src/lib/oauth/google.ts`) - -**主要功能**: - -- 定义 Google Identity Services 的 TypeScript 类型 -- 提供 SDK 加载方法 -- 提供 Code Client 初始化方法 - -**关键代码**: - -```typescript -export const googleOAuth = { - // 加载 Google Identity Services SDK - loadScript: (): Promise => { - return new Promise((resolve, reject) => { - if (window.google?.accounts) { - resolve() - return - } - - const script = document.createElement('script') - script.src = 'https://accounts.google.com/gsi/client' - script.async = true - script.defer = true - script.onload = () => resolve() - script.onerror = () => reject(new Error('Failed to load SDK')) - - document.head.appendChild(script) - }) - }, - - // 初始化 Code Client(获取授权码) - initCodeClient: (callback, errorCallback) => { - return window.google.accounts.oauth2.initCodeClient({ - client_id: GOOGLE_CLIENT_ID, - scope: GOOGLE_SCOPES, - ux_mode: 'popup', - callback, - error_callback: errorCallback, - }) - }, -} -``` - -### 2. GoogleButton 组件 (`src/app/(auth)/login/components/GoogleButton.tsx`) - -**主要功能**: - -- 加载 Google Identity Services SDK -- 初始化 Code Client -- 处理授权码回调 -- 调用后端登录接口 - -**关键实现**: - -#### SDK 加载 - -```typescript -useEffect(() => { - const loadGoogleSDK = async () => { - try { - await googleOAuth.loadScript() - console.log('Google Identity Services SDK loaded') - } catch (error) { - console.error('Failed to load Google SDK:', error) - toast.error('Failed to load Google login') - } - } - - loadGoogleSDK() -}, []) -``` - -#### 授权码处理 - -```typescript -const handleGoogleResponse = async (response: GoogleCodeResponse) => { - const deviceId = tokenManager.getDeviceId() - const loginData = { - appClient: AppClient.Web, - deviceCode: deviceId, - thirdToken: response.code, // Google 授权码 - thirdType: ThirdType.Google, - } - - login.mutate(loginData, { - onSuccess: () => { - toast.success('Login successful') - router.push('/') - }, - onError: (error) => { - toast.error('Login failed') - }, - }) -} -``` - -#### 登录按钮点击 - -```typescript -const handleGoogleLogin = async () => { - // 确保 SDK 已加载 - if (!window.google?.accounts?.oauth2) { - await googleOAuth.loadScript() - } - - // 初始化 Code Client - if (!codeClientRef.current) { - codeClientRef.current = googleOAuth.initCodeClient(handleGoogleResponse, handleGoogleError) - } - - // 请求授权码(弹出授权窗口) - codeClientRef.current.requestCode() -} -``` - -## 环境变量配置 - -只需要配置客户端 ID,不需要配置回调 URL: - -```bash -# .env.local -NEXT_PUBLIC_GOOGLE_CLIENT_ID=你的Google客户端ID -``` - -### 获取 Google OAuth 凭据 - -1. 访问 [Google Cloud Console](https://console.cloud.google.com/) -2. 创建或选择项目 -3. 启用 Google+ API -4. 创建 OAuth 2.0 客户端 ID -5. 应用类型选择 "Web 应用" -6. **授权的 JavaScript 来源**添加: - ``` - http://localhost:3000 - https://test.crushlevel.ai - ``` -7. **授权的重定向 URI** 可以留空(GIS 不需要) -8. 复制客户端 ID - -## 后端接口要求 - -与之前相同,后端接收授权码并完成登录: - -```typescript -POST /api/auth/login - -{ - "appClient": "WEB", - "deviceCode": "设备ID", - "thirdToken": "Google授权码", - "thirdType": "GOOGLE" -} -``` - -后端需要: - -1. 使用授权码向 Google 交换 access_token -2. 使用 access_token 获取用户信息 -3. 创建或更新用户 -4. 返回应用的登录 token - -## 优势 - -### 1. 更好的用户体验 - -- ✅ 无需离开当前页面 -- ✅ 弹窗授权,快速完成 -- ✅ 不打断用户操作流程 - -### 2. 更简单的实现 - -- ✅ 不需要回调路由 -- ✅ 不需要处理 URL 参数 -- ✅ 不需要 state 验证 -- ✅ 代码更简洁 - -### 3. 更安全 - -- ✅ 弹窗隔离,防止钓鱼 -- ✅ SDK 自动处理安全验证 -- ✅ 支持 CORS 和 CSP - -### 4. 更现代 - -- ✅ Google 官方推荐方式 -- ✅ 持续维护和更新 -- ✅ 更好的浏览器兼容性 - -## 与旧实现的对比 - -| 特性 | 旧方式(重定向) | 新方式(GIS) | -| ------------ | ---------------- | --------------- | -| 页面跳转 | ✅ 需要 | ❌ 不需要 | -| 回调路由 | ✅ 需要 | ❌ 不需要 | -| State 验证 | ✅ 需要手动实现 | ❌ SDK 自动处理 | -| URL 参数处理 | ✅ 需要 | ❌ 不需要 | -| 用户体验 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | -| 代码复杂度 | 高 | 低 | -| 维护成本 | 高 | 低 | - -## 常见问题 - -### Q: SDK 加载失败怎么办? - -A: - -- 检查网络连接 -- 确认没有被广告拦截器阻止 -- 检查浏览器控制台错误信息 - -### Q: 弹窗被浏览器拦截? - -A: - -- 确保在用户点击事件中调用 `requestCode()` -- 不要在异步操作后调用 -- 检查浏览器弹窗设置 - -### Q: 授权后没有回调? - -A: - -- 检查回调函数是否正确绑定 -- 查看浏览器控制台是否有错误 -- 确认 Client ID 配置正确 - -### Q: 用户取消授权如何处理? - -A: - -```typescript -const handleGoogleError = (error: any) => { - // 用户取消授权不显示错误提示 - if (error.type === 'popup_closed') { - return - } - - toast.error('Google login failed') -} -``` - -## 测试清单 - -### 本地测试 - -- [ ] SDK 正常加载 -- [ ] 点击按钮弹出授权窗口 -- [ ] 授权后正确回调 -- [ ] 授权码正确传递给后端 -- [ ] 登录成功后正确跳转 -- [ ] 用户取消授权的处理 -- [ ] 错误情况的处理 - -### 生产环境测试 - -- [ ] 配置正确的 JavaScript 来源 -- [ ] HTTPS 证书有效 -- [ ] 环境变量配置正确 -- [ ] 后端接口正常工作 -- [ ] 不同浏览器测试 - -## 浏览器兼容性 - -Google Identity Services 支持: - -- ✅ Chrome 90+ -- ✅ Firefox 88+ -- ✅ Safari 14+ -- ✅ Edge 90+ - -## 安全注意事项 - -### 1. 客户端 ID 保护 - -虽然客户端 ID 是公开的,但仍需注意: - -- 限制授权的 JavaScript 来源 -- 定期检查使用情况 -- 发现异常及时更换 - -### 2. 授权码处理 - -- 授权码只能使用一次 -- 及时传递给后端 -- 不要在客户端存储 - -### 3. HTTPS 要求 - -- 生产环境必须使用 HTTPS -- 本地开发可以使用 HTTP - -## 迁移指南 - -如果你之前使用的是旧的重定向方式,迁移步骤: - -1. **更新配置文件** - - 使用新的 `src/lib/oauth/google.ts` - -2. **更新组件** - - 使用新的 `GoogleButton.tsx` - -3. **删除回调路由** - - 删除 `src/app/api/auth/google/callback/route.ts` - -4. **更新 Google Cloud Console** - - 添加授权的 JavaScript 来源 - - 可以移除重定向 URI(可选) - -5. **测试** - - 完整测试登录流程 - - 确认所有功能正常 - -## 扩展功能 - -### 1. One Tap 登录 - -可以添加 Google One Tap 功能,自动显示登录提示: - -```typescript -window.google.accounts.id.initialize({ - client_id: GOOGLE_CLIENT_ID, - callback: handleCredentialResponse, -}) - -window.google.accounts.id.prompt() -``` - -### 2. 自动登录 - -可以实现自动登录功能: - -```typescript -window.google.accounts.id.initialize({ - client_id: GOOGLE_CLIENT_ID, - callback: handleCredentialResponse, - auto_select: true, -}) -``` - -### 3. 自定义按钮样式 - -可以使用 Google 提供的标准按钮: - -```typescript -window.google.accounts.id.renderButton(document.getElementById('buttonDiv'), { - theme: 'outline', - size: 'large', -}) -``` - -## 相关文档 - -- [Google Identity Services 官方文档](https://developers.google.com/identity/gsi/web) -- [Code Model 文档](https://developers.google.com/identity/oauth2/web/guides/use-code-model) -- [迁移指南](https://developers.google.com/identity/gsi/web/guides/migration) - -## 总结 - -使用 Google Identity Services 是 Google 官方推荐的最新方式,相比传统的 OAuth 重定向流程: - -✅ **用户体验更好** - 无需页面跳转 -✅ **实现更简单** - 代码量更少 -✅ **维护更容易** - 无需处理复杂的回调 -✅ **更加安全** - SDK 自动处理安全验证 - -强烈建议新项目直接使用这种方式! diff --git a/docs/GoogleOAuth-QuickStart.md b/docs/GoogleOAuth-QuickStart.md deleted file mode 100644 index e55d771..0000000 --- a/docs/GoogleOAuth-QuickStart.md +++ /dev/null @@ -1,142 +0,0 @@ -# Google OAuth 快速开始指南 - -## 5 分钟快速集成 - -### 步骤 1: 获取 Google OAuth 凭据 - -1. 访问 [Google Cloud Console](https://console.cloud.google.com/) -2. 创建新项目或选择现有项目 -3. 在左侧菜单选择 "API 和服务" > "凭据" -4. 点击 "创建凭据" > "OAuth 客户端 ID" -5. 选择应用类型为 "Web 应用" -6. 配置授权重定向 URI: - ``` - http://localhost:3000/api/auth/google/callback - ``` -7. 点击"创建"并复制客户端 ID - -### 步骤 2: 配置环境变量 - -在项目根目录创建 `.env.local` 文件: - -```bash -NEXT_PUBLIC_APP_URL=http://localhost:3000 -NEXT_PUBLIC_GOOGLE_CLIENT_ID=你的客户端ID -``` - -### 步骤 3: 重启开发服务器 - -```bash -npm run dev -``` - -### 步骤 4: 测试登录 - -1. 访问 http://localhost:3000/login -2. 点击 "Continue with Google" 按钮 -3. 选择 Google 账号并授权 -4. 应该会重定向回应用并完成登录 - -## 文件清单 - -已创建的文件: - -- ✅ `src/lib/oauth/google.ts` - Google OAuth 配置 -- ✅ `src/app/(auth)/login/components/GoogleButton.tsx` - Google 登录按钮组件 -- ✅ `src/app/api/auth/google/callback/route.ts` - OAuth 回调路由 -- ✅ `src/app/(auth)/login/components/login-form.tsx` - 已更新使用 GoogleButton - -## 工作流程 - -``` -用户点击按钮 - ↓ -GoogleButton.handleGoogleLogin() - ↓ -跳转到 Google 授权页面 - ↓ -用户授权 - ↓ -Google 重定向到 /api/auth/google/callback - ↓ -API 路由提取 code 并重定向到 /login?google_code=xxx - ↓ -GoogleButton.useEffect() 检测到 google_code - ↓ -调用后端登录接口 (thirdType: Google) - ↓ -登录成功,跳转到首页 -``` - -## 后端接口要求 - -后端需要处理以下登录请求: - -```typescript -POST /api/auth/login - -{ - "appClient": "WEB", - "deviceCode": "设备ID", - "thirdToken": "Google授权码", - "thirdType": "GOOGLE" -} -``` - -后端需要: - -1. 使用授权码向 Google 交换 access_token -2. 使用 access_token 获取用户信息 -3. 创建或更新用户 -4. 返回应用的登录 token - -## 常见问题 - -### Q: 点击按钮后没有跳转? - -A: 检查浏览器控制台是否有错误,确认环境变量已正确配置。 - -### Q: 回调后显示错误? - -A: 检查 Google Cloud Console 中的回调 URL 配置是否正确。 - -### Q: 登录接口调用失败? - -A: 确认后端接口已实现并支持 Google 登录。 - -## 生产环境部署 - -### 1. 更新 Google OAuth 配置 - -在 Google Cloud Console 添加生产环境回调 URL: - -``` -https://your-domain.com/api/auth/google/callback -``` - -### 2. 更新环境变量 - -```bash -NEXT_PUBLIC_APP_URL=https://your-domain.com -NEXT_PUBLIC_GOOGLE_CLIENT_ID=生产环境客户端ID -``` - -### 3. 部署 - -确保在部署平台(Vercel/Netlify)配置了正确的环境变量。 - -## 下一步 - -- [ ] 测试完整的登录流程 -- [ ] 添加错误处理和用户反馈 -- [ ] 实现登出功能 -- [ ] 添加用户信息展示 -- [ ] 考虑添加 Apple 登录 - -## 技术支持 - -如有问题,请参考: - -- [完整文档](./GoogleOAuth.md) -- [环境变量配置](./EnvironmentVariables.md) -- [Google OAuth 官方文档](https://developers.google.com/identity/protocols/oauth2) diff --git a/docs/GoogleOAuth.md b/docs/GoogleOAuth.md deleted file mode 100644 index 89203c2..0000000 --- a/docs/GoogleOAuth.md +++ /dev/null @@ -1,313 +0,0 @@ -# Google OAuth 登录集成文档 - -## 功能概述 - -实现了 Google OAuth 2.0 登录功能,参考 Discord 登录的实现模式,用户可以通过 Google 账号快速登录应用。 - -## 实现架构 - -### 1. OAuth 流程 - -``` -用户点击 "Continue with Google" - ↓ -跳转到 Google 授权页面 - ↓ -用户授权后,Google 重定向到回调 URL - ↓ -API 路由接收授权码并重定向回登录页 - ↓ -前端获取授权码并调用后端登录接口 - ↓ -登录成功,跳转到首页或指定页面 -``` - -## 文件结构 - -``` -src/ -├── lib/ -│ └── oauth/ -│ ├── discord.ts # Discord OAuth 配置 -│ └── google.ts # Google OAuth 配置 (新增) -├── app/ -│ ├── (auth)/ -│ │ └── login/ -│ │ └── components/ -│ │ ├── DiscordButton.tsx # Discord 登录按钮 -│ │ ├── GoogleButton.tsx # Google 登录按钮 (新增) -│ │ └── login-form.tsx # 登录表单 (已更新) -│ └── api/ -│ └── auth/ -│ ├── discord/ -│ │ └── callback/ -│ │ └── route.ts # Discord 回调路由 -│ └── google/ -│ └── callback/ -│ └── route.ts # Google 回调路由 (新增) -``` - -## 核心文件说明 - -### 1. Google OAuth 配置 (`src/lib/oauth/google.ts`) - -```typescript -export const googleOAuth = { - getAuthUrl: (state?: string): string => { - // 构建 Google OAuth 授权 URL - // 包含 client_id, redirect_uri, scope 等参数 - }, -} -``` - -**配置参数**: - -- `client_id`: Google OAuth 客户端 ID -- `redirect_uri`: 授权后的回调 URL -- `scope`: 请求的权限范围(email, profile) -- `access_type`: offline(获取 refresh_token) -- `prompt`: consent(每次都显示授权页面) - -### 2. GoogleButton 组件 (`src/app/(auth)/login/components/GoogleButton.tsx`) - -**功能**: - -- 处理 Google 登录按钮点击事件 -- 生成随机 state 用于安全验证 -- 跳转到 Google 授权页面 -- 处理 OAuth 回调(授权码) -- 调用后端登录接口 -- 处理登录成功/失败的重定向 - -**关键方法**: - -```typescript -const handleGoogleLogin = () => { - // 1. 生成 state - const state = Math.random().toString(36).substring(2, 15) - - // 2. 获取授权 URL - const authUrl = googleOAuth.getAuthUrl(state) - - // 3. 保存 state 到 sessionStorage - sessionStorage.setItem('google_oauth_state', state) - - // 4. 跳转到 Google 授权页面 - window.location.href = authUrl -} -``` - -**OAuth 回调处理**: - -```typescript -useEffect(() => { - const googleCode = searchParams.get('google_code') - const googleState = searchParams.get('google_state') - - if (googleCode) { - // 验证 state - // 调用后端登录接口 - // 处理登录结果 - } -}, []) -``` - -### 3. Google 回调路由 (`src/app/api/auth/google/callback/route.ts`) - -**功能**: - -- 接收 Google OAuth 回调 -- 提取授权码 (code) 和 state -- 重定向回登录页面,并将参数传递给前端 - -```typescript -export async function GET(request: NextRequest) { - const code = searchParams.get('code') - const state = searchParams.get('state') - - // 重定向到登录页,携带 google_code 和 google_state - redirectUrl.searchParams.set('google_code', code) - redirectUrl.searchParams.set('google_state', state) - - return NextResponse.redirect(redirectUrl) -} -``` - -## 环境变量配置 - -需要在 `.env.local` 中添加以下环境变量: - -```bash -# Google OAuth 配置 -NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id_here -NEXT_PUBLIC_APP_URL=https://test.crushlevel.ai -``` - -### 获取 Google OAuth 凭据 - -1. 访问 [Google Cloud Console](https://console.cloud.google.com/) -2. 创建或选择一个项目 -3. 启用 Google+ API -4. 创建 OAuth 2.0 客户端 ID -5. 配置授权重定向 URI: - ``` - https://test.crushlevel.ai/api/auth/google/callback - http://localhost:3000/api/auth/google/callback (开发环境) - ``` -6. 复制客户端 ID 到环境变量 - -## 后端接口要求 - -后端需要实现登录接口,接收以下参数: - -```typescript -interface LoginRequest { - appClient: AppClient.Web - deviceCode: string // 设备唯一标识 - thirdToken: string // Google 授权码 - thirdType: ThirdType.Google // 第三方类型 -} -``` - -后端需要: - -1. 使用授权码向 Google 交换 access_token -2. 使用 access_token 获取用户信息 -3. 创建或更新用户账号 -4. 返回应用的登录 token - -## 安全特性 - -### 1. State 参数验证 - -- 前端生成随机 state 并保存到 sessionStorage -- 回调时验证 state 是否匹配 -- 防止 CSRF 攻击 - -### 2. 授权码模式 - -- 使用 OAuth 2.0 授权码流程 -- 授权码只能使用一次 -- Token 交换在后端进行,更安全 - -### 3. URL 参数清理 - -- 登录成功后清理 URL 中的敏感参数 -- 防止参数泄露 - -## 用户体验优化 - -### 1. 重定向保持 - -```typescript -// 保存登录前的页面 -sessionStorage.setItem('login_redirect_url', redirect || '') - -// 登录成功后跳转回原页面 -const loginRedirectUrl = sessionStorage.getItem('login_redirect_url') -if (loginRedirectUrl) { - router.push(loginRedirectUrl) -} -``` - -### 2. 错误处理 - -- 授权失败时显示友好的错误提示 -- 自动清理 URL 参数 -- 不影响用户继续尝试登录 - -### 3. 加载状态 - -- 使用 `useLogin` Hook 的 loading 状态 -- 可以添加 loading 动画提升体验 - -## 测试清单 - -### 本地测试 - -- [ ] 点击 Google 登录按钮跳转到 Google 授权页面 -- [ ] 授权后正确回调到应用 -- [ ] 授权码正确传递给后端 -- [ ] 登录成功后跳转到首页 -- [ ] State 参数验证正常工作 -- [ ] 错误情况处理正确 - -### 生产环境测试 - -- [ ] 配置正确的回调 URL -- [ ] HTTPS 证书有效 -- [ ] 环境变量配置正确 -- [ ] 后端接口正常工作 - -## 常见问题 - -### 1. 回调 URL 不匹配 - -**错误**: `redirect_uri_mismatch` - -**解决方案**: - -- 检查 Google Cloud Console 中配置的回调 URL -- 确保 `NEXT_PUBLIC_APP_URL` 环境变量正确 -- 开发环境和生产环境需要分别配置 - -### 2. State 验证失败 - -**错误**: "Google login failed" - -**解决方案**: - -- 检查 sessionStorage 是否正常工作 -- 确保没有跨域问题 -- 检查浏览器是否禁用了 cookie/storage - -### 3. 授权码已使用 - -**错误**: 后端返回授权码无效 - -**解决方案**: - -- 授权码只能使用一次 -- 避免重复调用登录接口 -- 清理 URL 参数防止页面刷新时重复使用 - -## 与 Discord 登录的对比 - -| 特性 | Discord | Google | -| -------------- | -------------------------------- | ------------------------------------ | -| OAuth Provider | Discord | Google | -| Scopes | identify, email | userinfo.email, userinfo.profile | -| 授权 URL | discord.com/api/oauth2/authorize | accounts.google.com/o/oauth2/v2/auth | -| 回调路由 | /api/auth/discord/callback | /api/auth/google/callback | -| URL 参数 | discord_code, discord_state | google_code, google_state | -| ThirdType | Discord | Google | - -## 扩展建议 - -### 1. 添加 Apple 登录 - -参考 Google 登录的实现,创建: - -- `src/lib/oauth/apple.ts` -- `src/app/(auth)/login/components/AppleButton.tsx` -- `src/app/api/auth/apple/callback/route.ts` - -### 2. 统一 OAuth 处理 - -可以创建通用的 OAuth Hook: - -```typescript -const useOAuthLogin = (provider: 'google' | 'discord' | 'apple') => { - // 通用的 OAuth 登录逻辑 -} -``` - -### 3. 添加登录统计 - -记录不同登录方式的使用情况,优化用户体验。 - -## 相关文档 - -- [Google OAuth 2.0 文档](https://developers.google.com/identity/protocols/oauth2) -- [Next.js API Routes](https://nextjs.org/docs/app/building-your-application/routing/route-handlers) -- Discord OAuth 实现参考 diff --git a/docs/MessageLikeFeature.md b/docs/MessageLikeFeature.md deleted file mode 100644 index f99c2c3..0000000 --- a/docs/MessageLikeFeature.md +++ /dev/null @@ -1,259 +0,0 @@ -# 消息点赞功能实现 - -## 概述 - -本功能基于网易云信 NIM Web SDK V2 实现了聊天消息的点赞和踩功能,通过更新消息的 `serverExtension` 字段来持久化存储用户的点赞状态,使用 NIM SDK 的 `modifyMessage` API 实现服务端同步。 - -## 功能特性 - -- ✅ 支持对AI回复消息进行点赞/踩 -- ✅ 简洁的状态标记:只记录用户的点赞/踩状态,不统计数量 -- ✅ 视觉反馈:点赞后按钮高亮显示 -- ✅ 防重复点赞:再次点击取消点赞 -- ✅ 状态持久化:通过 NIM SDK 的 `serverExtension` 字段保存到云端 -- ✅ 多用户支持:支持多个用户对同一消息进行独立的点赞 -- ✅ 自动同步:点赞状态自动同步到所有客户端 -- ✅ 轻量级:简化数据结构,减少存储空间 - -## 技术实现 - -### 1. 数据结构 - -#### MessageLikeStatus 枚举 - -```typescript -export enum MessageLikeStatus { - None = 'none', // 未点赞/踩 - Liked = 'liked', // 已点赞 - Disliked = 'disliked', // 已踩 -} -``` - -#### MessageServerExtension 接口(简化版) - -```typescript -export interface MessageServerExtension { - [userId: string]: MessageLikeStatus // 用户ID -> 点赞状态的直接映射 -} -``` - -#### 工具函数 - -```typescript -// 解析消息的serverExtension字段 -export const parseMessageServerExtension = (serverExtension?: string): MessageServerExtension - -// 序列化MessageServerExtension对象 -export const stringifyMessageServerExtension = (extension: MessageServerExtension): string - -// 获取用户对消息的点赞状态 -export const getUserLikeStatus = (message: ExtendedMessage, userId: string): MessageLikeStatus -``` - -### 2. 核心功能 - -#### NimMsgContext 扩展 - -在 `NimMsgContext` 中添加了 `updateMessageLikeStatus` 方法,使用 NIM SDK 的 `modifyMessage` API: - -```typescript -const updateMessageLikeStatus = useCallback( - async (conversationId: string, messageClientId: string, likeStatus: MessageLikeStatus) => { - // 1. 获取当前登录用户ID - const currentUserId = nim.V2NIMLoginService.getLoginUser() - - // 2. 解析当前消息的serverExtension - const currentServerExt = parseMessageServerExtension(targetMessage.serverExtension) - - // 3. 更新用户的点赞状态(简化版) - const newServerExt = { ...currentServerExt } - if (likeStatus === MessageLikeStatus.None) { - delete newServerExt[currentUserId] // 移除点赞状态 - } else { - newServerExt[currentUserId] = likeStatus // 设置新状态 - } - - // 4. 调用NIM SDK更新消息 - const modifyResult = await nim.V2NIMMessageService.modifyMessage(targetMessage, { - serverExtension: stringifyMessageServerExtension(newServerExt), - }) - - // 5. 更新本地状态 - addMsg(conversationId, [modifyResult.message], false) - }, - [addMsg] -) -``` - -#### useMessageLike Hook - -提供便捷的点赞操作方法: - -```typescript -const { - likeMessage, // 点赞消息 - dislikeMessage, // 踩消息 - cancelLikeMessage, // 取消点赞/踩 - toggleLike, // 切换点赞状态 - toggleDislike, // 切换踩状态 -} = useMessageLike() -``` - -### 3. UI组件 - -#### ChatOtherTextContainer - -AI消息容器组件已集成点赞功能: - -- 鼠标悬停显示操作按钮 -- 点赞后按钮高亮(红色) -- 踩后按钮高亮(灰色) -- 显示点赞/踩数量 - -## 使用方法 - -### 基本用法 - -```typescript -import { useMessageLike } from '@/hooks/useMessageLike'; -import { getUserLikeStatus, MessageLikeStatus } from '@/atoms/im'; -import { useNimChat } from '@/context/NimChat/useNimChat'; - -const MyComponent = ({ message }: { message: ExtendedMessage }) => { - const { toggleLike, toggleDislike } = useMessageLike(); - const { nim } = useNimChat(); - - // 获取当前用户的点赞状态 - const currentUserId = nim.V2NIMLoginService.getLoginUser(); - const currentStatus = getUserLikeStatus(message, currentUserId || ''); - - const handleLike = async () => { - await toggleLike(message.conversationId, message.messageClientId, currentStatus); - }; - - const handleDislike = async () => { - await toggleDislike(message.conversationId, message.messageClientId, currentStatus); - }; - - return ( -
- - -
- ); -}; -``` - -### 高级用法 - -```typescript -// 直接设置点赞状态 -await likeMessage(conversationId, messageClientId) - -// 直接设置踩状态 -await dislikeMessage(conversationId, messageClientId) - -// 取消所有状态 -await cancelLikeMessage(conversationId, messageClientId) -``` - -## 状态管理 - -点赞状态通过以下方式管理: - -1. **服务端状态**: 存储在 `message.serverExtension` 字段中,通过 NIM SDK 同步到云端 -2. **多用户支持**: 每个用户的点赞状态独立存储,使用用户ID作为键 -3. **简化存储**: 仅存储用户的点赞状态,不计算总数,节省存储空间 -4. **状态同步**: 通过 `msgListAtom` 全局状态管理,并通过 NIM SDK 自动同步到所有客户端 -5. **持久化**: 点赞状态持久化存储在 NIM 服务器,不会丢失 - -## 扩展建议 - -### 1. 消息更新监听 - -由于使用了 NIM SDK 的 `modifyMessage` API,建议监听消息更新事件: - -```typescript -// 监听消息修改事件 -nim.V2NIMMessageService.on('onMessageUpdated', (messages: V2NIMMessage[]) => { - messages.forEach((message) => { - // 处理点赞状态更新 - const serverExt = parseMessageServerExtension(message.serverExtension) - if (serverExt.likes) { - console.log('消息点赞状态已更新:', message.messageClientId, serverExt) - } - }) -}) -``` - -### 2. 错误处理 - -为点赞操作添加错误处理和重试机制: - -```typescript -const updateMessageLikeStatusWithRetry = async ( - conversationId: string, - messageClientId: string, - likeStatus: MessageLikeStatus, - retryCount = 3 -) => { - try { - await updateMessageLikeStatus(conversationId, messageClientId, likeStatus) - } catch (error) { - if (retryCount > 0) { - console.log(`点赞失败,剩余重试次数: ${retryCount}`, error) - await new Promise((resolve) => setTimeout(resolve, 1000)) // 等待1秒 - return updateMessageLikeStatusWithRetry( - conversationId, - messageClientId, - likeStatus, - retryCount - 1 - ) - } else { - throw error - } - } -} -``` - -### 3. 批量操作 - -对于大量消息的点赞状态批量更新: - -```typescript -const batchUpdateLikes = ( - updates: Array<{ - conversationId: string - messageClientId: string - likeStatus: MessageLikeStatus - }> -) => { - // 批量更新逻辑 -} -``` - -## 注意事项 - -1. **性能考虑**: 点赞状态更新会触发组件重渲染,建议使用 React.memo 优化 -2. **网络请求**: 每次点赞都会调用 NIM SDK 的 `modifyMessage` API,请考虑网络状况 -3. **并发控制**: 快速连续点击可能导致并发请求,建议添加防抖或节流 -4. **权限验证**: NIM SDK 会自动验证用户权限,无需额外处理 -5. **消息类型限制**: `modifyMessage` API 仅支持特定类型的消息,请参考 NIM 文档 -6. **扩展字段大小**: `serverExtension` 字段有大小限制,请合理设计数据结构 - -## 相关文件 - -- `src/atoms/im.ts` - 数据类型定义 -- `src/context/NimChat/NimMsgContext.tsx` - 核心逻辑 -- `src/hooks/useMessageLike.ts` - 便捷Hook -- `src/app/(main)/chat/[aiId]/components/ChatMessageItems/ChatOtherTextContainer.tsx` - UI实现 diff --git a/docs/URLTextParameter.md b/docs/URLTextParameter.md deleted file mode 100644 index 117ef98..0000000 --- a/docs/URLTextParameter.md +++ /dev/null @@ -1,117 +0,0 @@ -# URL Text 参数功能说明 - -## 功能概述 - -实现了从 URL 参数中获取 `text` 并自动填充到聊天输入框的功能。用户点击对话建议时,会跳转到聊天页面并自动填充对应的文本。 - -## 实现细节 - -### 1. StartChatItem 组件 - -**文件位置**: `src/app/(main)/home/components/StartChat/StartChatItem.tsx` - -**功能**: - -- 对话建议列表中的每一项都是一个链接 -- 点击时跳转到聊天页面,并将建议文本作为 URL 参数传递 -- 使用 `encodeURIComponent()` 对文本进行编码,确保特殊字符正确传递 - -**示例**: - -```tsx - - {suggestion} - -``` - -### 2. ChatInput 组件 - -**文件位置**: `src/app/(main)/chat/[aiId]/components/ChatMessageAction/ChatInput.tsx` - -**功能**: - -- 使用 `useSearchParams()` Hook 获取 URL 参数 -- 在组件挂载时检查是否有 `text` 参数 -- 如果有,自动填充到输入框并聚焦 - -**实现代码**: - -```tsx -const searchParams = useSearchParams() - -useEffect(() => { - const textFromUrl = searchParams.get('text') - if (textFromUrl) { - setMessage(textFromUrl) - // 聚焦到输入框 - if (textareaRef.current) { - textareaRef.current.focus() - } - } -}, [searchParams]) -``` - -## 使用场景 - -### 场景 1: 对话建议快捷回复 - -用户在首页看到 AI 角色的对话建议,点击后: - -1. 跳转到聊天页面 -2. 建议文本自动填充到输入框 -3. 用户可以直接发送或修改后发送 - -### 场景 2: 外部链接跳转 - -可以通过外部链接直接跳转到聊天页面并预填充文本: - -``` -https://your-domain.com/chat/123?text=Hello%20there! -``` - -## URL 参数格式 - -- **参数名**: `text` -- **编码方式**: URL 编码 (使用 `encodeURIComponent`) -- **示例**: - - 原始文本: `How is your day ?` - - 编码后: `How%20is%20your%20day%20%3F` - - 完整 URL: `/chat/123?text=How%20is%20your%20day%20%3F` - -## 注意事项 - -1. **URL 编码**: 必须使用 `encodeURIComponent()` 对文本进行编码,避免特殊字符导致 URL 解析错误 -2. **自动聚焦**: 填充文本后会自动聚焦到输入框,提升用户体验 -3. **单次触发**: URL 参数只在组件挂载或 `searchParams` 变化时读取一次 -4. **不影响现有功能**: 如果 URL 中没有 `text` 参数,输入框保持原有行为 - -## 扩展建议 - -### 可能的增强功能: - -1. **清除 URL 参数**: 填充文本后清除 URL 中的 `text` 参数,避免刷新页面时重复填充 - - ```tsx - const router = useRouter() - // 填充后清除参数 - router.replace(`/chat/${aiId}`, { scroll: false }) - ``` - -2. **支持多个参数**: 可以扩展支持其他参数,如 `image`、`voice` 等 - - ``` - /chat/123?text=Hello&image=https://... - ``` - -3. **参数验证**: 添加文本长度限制和内容验证 - ```tsx - if (textFromUrl && textFromUrl.length <= 1000) { - setMessage(textFromUrl) - } - ``` - -## 相关文件 - -- `src/app/(main)/home/components/StartChat/StartChatItem.tsx` - 发起跳转的组件 -- `src/app/(main)/chat/[aiId]/components/ChatMessageAction/ChatInput.tsx` - 接收参数的组件 -- `src/app/(main)/home/context/AudioPlayerContext.tsx` - 音频播放上下文(相关功能) diff --git a/docs/VoiceTTSIntegration.md b/docs/VoiceTTSIntegration.md deleted file mode 100644 index 35a84d0..0000000 --- a/docs/VoiceTTSIntegration.md +++ /dev/null @@ -1,169 +0,0 @@ -# 语音合成功能集成文档 - -## 概述 - -在 VoiceSelector 组件中集成了基于 `useFetchVoiceTtsV2` 接口的语音合成功能,实现了智能缓存、自动播放和错误回退机制。 - -## 核心功能 - -### 1. 智能缓存 - -- 基于配置参数生成唯一哈希值作为缓存键 -- 相同配置的语音只生成一次,存储在内存中 -- 支持手动清除缓存 - -### 2. 参数映射 - -- `tone` (音调) → `loudnessRate` (音量) -- `speed` (语速) → `speechRate` (语速) -- 参数范围:[-50, 100] - -### 3. 播放逻辑 - -1. **优先级**:TTS 生成的语音 > 预设语音文件 -2. **错误回退**:TTS 失败时自动使用预设语音 -3. **状态管理**:生成中、播放中、已缓存等状态 - -## 文件结构 - -``` -src/ -├── hooks/ -│ ├── useVoiceTTS.ts # 语音合成核心 Hook -│ └── useCommon.ts # TTS 接口 Hook -├── components/ -│ └── features/ -│ └── VoiceTTSPlayer.tsx # 独立的语音播放器组件 -├── app/ -│ ├── (main)/create/components/Voice/ -│ │ └── VoiceSelector.tsx # 集成了 TTS 的语音选择器 -│ ├── test-voice-tts/ -│ │ └── page.tsx # TTS 功能测试页面 -│ └── test-voice-selector/ -│ └── page.tsx # VoiceSelector 测试页面 -└── docs/ - └── VoiceTTSIntegration.md # 本文档 -``` - -## 使用方法 - -### 基础用法 - -```tsx -import { useVoiceTTS } from '@/hooks/useVoiceTTS' - -function MyComponent() { - const { generateAndPlay, isPlaying, isGenerating } = useVoiceTTS() - - const config = { - text: '你好,这是测试语音', - voiceType: 'S_zh_xiaoxiao_emotion', - speechRate: 0, - loudnessRate: 0, - } - - return ( - - ) -} -``` - -### VoiceSelector 集成 - -```tsx -import VoiceSelector from '@/app/(main)/create/components/Voice/VoiceSelector' - -function CreateForm() { - const [voiceConfig, setVoiceConfig] = useState({ - tone: 0, // 音调 [-50, 100] - speed: 0, // 语速 [-50, 100] - content: 'voice_id', // 语音类型ID - }) - - return ( - - ) -} -``` - -## 接口说明 - -### useFetchVoiceTtsV2 参数 - -```typescript -interface FetchVoiceTtsV2Request { - text?: string // 文本内容 - voiceType?: string // 语音类型 (以 S_ 开头) - speechRate?: number // 语速 [-50, 100] - loudnessRate?: number // 音量 [-50, 100] -} -``` - -### useVoiceTTS 选项 - -```typescript -interface UseVoiceTTSOptions { - autoPlay?: boolean // 生成完成后自动播放,默认 true - cacheEnabled?: boolean // 启用缓存,默认 true - onPlayStart?: (configHash: string) => void - onPlayEnd?: (configHash: string) => void - onGenerateStart?: (config: FetchVoiceTtsV2Request) => void - onGenerateEnd?: (config: FetchVoiceTtsV2Request, url: string) => void - onError?: (error: string) => void -} -``` - -## 状态说明 - -### VoiceSelector 状态 - -- **未选择**:显示提示选择语音 -- **已选择 + 未生成**:显示播放按钮 -- **生成中**:显示动画和 "Generating..." -- **播放中**:显示播放动画 -- **已缓存**:显示 "Cached" 标识 -- **错误**:显示错误信息 - -### 播放优先级 - -1. TTS 生成的语音(如果有有效的 voiceType 和 voiceText) -2. 预设语音文件(回退机制) -3. 错误处理和用户提示 - -## 缓存机制 - -- **缓存键**:基于 `text + voiceType + speechRate + loudnessRate` 生成哈希 -- **存储方式**:内存中存储(页面刷新后清除) -- **清除策略**:手动清除或组件卸载时清除 - -## 错误处理 - -1. **TTS 接口错误**:自动回退到预设语音 -2. **播放错误**:显示错误信息给用户 -3. **网络错误**:重试机制(在 useVoiceTTS 中实现) - -## 测试页面 - -- `/test-voice-tts` - 独立的 TTS 功能测试 -- `/test-voice-selector` - VoiceSelector 组件测试 - -## 性能优化 - -1. **缓存机制**:避免重复生成相同配置的语音 -2. **懒加载**:只在用户点击播放时才生成语音 -3. **错误回退**:TTS 失败时使用预设语音,不影响用户体验 -4. **状态管理**:精确的状态控制,避免不必要的重渲染 - -## 扩展功能 - -- 支持自定义缓存策略 -- 支持批量预生成常用语音 -- 支持语音质量选择 -- 支持播放进度控制 diff --git a/docs/copy-audit.xlsx b/docs/copy-audit.xlsx deleted file mode 100644 index 323b1af17b39c4f0f9ec5989fc4b0174fd27bc94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277338 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 z 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

-opEtwb!u!umuu_!Lnj}iIo9@ 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 S*+7c8fUp{vC^)M@2?YRMIO-k% diff --git a/docs/i18n-scan-report.json b/docs/i18n-scan-report.json deleted file mode 100644 index c2b7ff2..0000000 --- a/docs/i18n-scan-report.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "totalItems": 2887, - "uniqueTexts": 860, - "translationKeys": 849, - "byRoute": { - "/": 107, - "shared": 385, - "debug-mock": 25, - "demo": 154, - "server-device-test": 130, - "test-avatar-crop": 79, - "test-avatar-setting": 5, - "test-discord": 141, - "test-image-crop": 41, - "test-lamejs": 12, - "test-middleware": 16, - "test-mp3-conversion": 35, - "test-s3-upload": 8, - "(auth)/about": 6, - "(auth)/login": 26, - "(main)/chat": 1, - "(main)/contact": 21, - "(main)/creator": 11, - "(main)/crushcoin": 13, - "(main)/explore": 3, - "(main)/leaderboard": 18, - "(main)/profile": 81, - "(main)/test-voice-wave": 70, - "(main)/vip": 19, - "(main)/wallet": 39, - "(auth)/login/fields": 33, - "(auth)/policy/privacy": 123, - "(auth)/policy/recharge": 159, - "(auth)/policy/tos": 131, - "(auth)/share/[userId]": 25, - "(main)/chat/[aiId]": 341, - "(main)/create": 205, - "(main)/generate/image": 23, - "(main)/generate/image-2-background": 26, - "(main)/generate/image-2-image": 25, - "(main)/generate/image-edit": 25, - "(main)/profile/account": 24, - "(main)/profile/edit": 34, - "(main)/user/[userId]": 78, - "(main)/wallet/transactions": 3, - "(main)/edit/[aiId]/character": 39, - "(main)/edit/[aiId]": 16, - "(main)/edit/[aiId]/dialogue": 52, - "(main)/edit/[aiId]/image": 44, - "(main)/edit/[aiId]/type": 25, - "(main)/wallet/charge/result": 10 - }, - "byKind": { - "title": 12, - "text": 2687, - "toast": 37, - "alt": 68, - "validation": 35, - "placeholder": 37, - "aria": 3, - "error": 5, - "label": 2, - "dialog": 1 - }, - "sampleKeys": [ - "_.notfound.title.empty_title", - "common.mockprovider.text.div", - "common.mockprovider.text.p", - "common.uselogout.toast.toast_success", - "common.useregister.toast.toast_success", - "common.useregister.toast.toast_error", - "debug_mock.debugmockpage.text.div", - "debug_mock.debugmockpage.text.h1", - "debug_mock.debugmockpage.text.h2", - "debug_mock.debugmockpage.text.button" - ] -} diff --git a/docs/i18n-scan-report.xlsx b/docs/i18n-scan-report.xlsx deleted file mode 100644 index 8ab0944ad200bf4a37d0c39559d98a0d089213b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087925 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

{=MsiRY! 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 ={?wd6*h*0UmX6+PFpZPa4T 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 a9)0rjfAz1qLSLZ&{R%aTAOC$PQvW})l{ZNM diff --git a/docs/project-overview.md b/docs/project-overview.md deleted file mode 100644 index aa404c3..0000000 --- a/docs/project-overview.md +++ /dev/null @@ -1,67 +0,0 @@ -# 项目概述 - -这是一个使用 Next.js App Router 的 Web 应用. - -crushlevel-next/ -├── app/ -│ ├── (auth)/ # 路由组:认证相关页面 -│ │ ├── login/ -│ │ │ └── page.tsx # /login 页面 -│ │ ├── register/ -│ │ │ └── page.tsx # /register 页面 -│ │ └── layout.tsx # 认证页面共享布局 -│ ├── (dashboard)/ # 路由组:仪表盘相关页面 -│ │ ├── page.tsx # /dashboard 页面 -│ │ ├── settings/ -│ │ │ └── page.tsx # /dashboard/settings 页面 -│ │ └── layout.tsx # 仪表盘页面共享布局 -│ ├── api/ # API 路由 -│ │ ├── auth/ -│ │ │ └── route.ts # /api/auth 路由 -│ │ └── users/ -│ │ └── route.ts # /api/users 路由 -│ ├── layout.tsx # 根布局(全局布局) -│ ├── page.tsx # 根页面(/ 路由) -│ ├── globals.css # 全局样式 -│ ├── favicon.ico # 网站图标 -│ └── not-found.tsx # 404 页面 -├── components/ # 可复用组件 -│ ├── ui/ # UI 组件(如按钮、卡片等) -│ │ ├── Button.tsx -│ │ └── Card.tsx -│ ├── layout/ # 布局相关组件 -│ │ ├── Navbar.tsx -│ │ └── Footer.tsx -│ └── features/ # 功能相关组件 -│ ├── AuthForm.tsx -│ └── DashboardChart.tsx -├── lib/ # 工具函数和库 -│ ├── api.ts # API 调用封装 -│ ├── auth.ts # 认证相关逻辑 -│ └── db/ # 数据库连接和查询 -│ ├── prisma.ts -│ └── models.ts -├── types/ # TypeScript 类型定义 -│ ├── user.ts -│ └── post.ts -├── public/ # 静态资源 -│ ├── images/ -│ └── fonts/ -├── styles/ # 样式文件(如果不使用 globals.css) -│ ├── tailwind.css -│ └── components/ -├── middleware.ts # 中间件(如认证、国际化) -├── next.config.mjs # Next.js 配置文件 -├── tsconfig.json # TypeScript 配置文件 -├── package.json -├── docs # 文档 -└── README.md - -## UI库 - -使用Shadcn/U作为UI的基础组件,结合tailwindcss实现。 -token都存放在global.css中。 - -## 组件库 - -基础组件库components/ui diff --git a/package.json b/package.json index 2486f70..2fd3a92 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "crushlevel-next", + "name": "spicyxxai", "version": "0.1.0", "private": true, "scripts": { @@ -46,7 +46,6 @@ "dayjs": "^1.11.13", "decimal.js": "^10.6.0", "embla-carousel-react": "^8.6.0", - "jotai": "^2.13.1", "js-cookie": "^3.0.5", "lamejs": "^1.2.1", "lucide-react": "^0.525.0", @@ -98,11 +97,6 @@ "typescript": "^5", "xlsx": "^0.18.5" }, - "msw": { - "workerDirectory": [ - "public" - ] - }, "overrides": { "@types/react": "19.2.7", "@types/react-dom": "19.2.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d70eed..203c96f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,9 +107,6 @@ importers: embla-carousel-react: specifier: ^8.6.0 version: 8.6.0(react@19.2.1) - jotai: - specifier: ^2.13.1 - version: 2.13.1(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1) js-cookie: specifier: ^3.0.5 version: 3.0.5 @@ -227,7 +224,7 @@ importers: version: 4.6.0(typescript@5.8.3) msw: specifier: ^2.10.4 - version: 2.10.4(@types/node@20.19.8)(typescript@5.8.3) + version: 2.12.4(@types/node@20.19.8)(typescript@5.8.3) prettier: specifier: ^3.7.1 version: 3.7.1 @@ -524,15 +521,6 @@ packages: react: '>=18.0.0' react-dom: '>=18.0.0' - '@bundled-es-modules/cookie@2.0.1': - resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} - - '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - - '@bundled-es-modules/tough-cookie@0.1.6': - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@byteplus/rtc@4.67.4': resolution: {integrity: sha512-UABVde+HBJtYlax4VZ1+iZtxG2+mbAA2HakwOkdCafpc4ltqWcCnLW/2HHF00nMGG36FxB8ho6sweiECBI9iTQ==} @@ -977,8 +965,12 @@ packages: cpu: [x64] os: [win32] - '@inquirer/confirm@5.1.13': - resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -986,8 +978,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.14': - resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -995,12 +987,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.12': - resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/type@3.0.7': - resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1039,8 +1031,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mswjs/interceptors@0.39.3': - resolution: {integrity: sha512-9bw/wBL7pblsnOCIqvn1788S9o4h+cC5HWXg0Xhh0dOzsZ53IyfmBM+FYqpDDPbm0xjCqEqvCITloF3Dm4TXRQ==} + '@mswjs/interceptors@0.40.0': + resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} '@napi-rs/wasm-runtime@0.2.12': @@ -2093,9 +2085,6 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/crypto-js@4.2.2': resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} @@ -2140,9 +2129,6 @@ packages: '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -2365,10 +2351,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2596,9 +2578,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3096,8 +3078,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} gulp-sort@2.0.0: @@ -3337,24 +3319,6 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jotai@2.13.1: - resolution: {integrity: sha512-cRsw6kFeGC9Z/D3egVKrTXRweycZ4z/k7i2MrfCzPYsL9SIWcPXTyqv258/+Ay8VUEcihNiE/coBLE6Kic6b8A==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@babel/core': '>=7.0.0' - '@babel/template': '>=7.0.0' - '@types/react': '>=17.0.0' - react: '>=17.0.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@babel/template': - optional: true - '@types/react': - optional: true - react: - optional: true - js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -3594,8 +3558,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.10.4: - resolution: {integrity: sha512-6R1or/qyele7q3RyPwNuvc0IxO8L8/Aim6Sz5ncXEgcWUNxSKE+udriTOWHtpMwmfkLYlacA2y7TIx4cL5lgHA==} + msw@2.12.4: + resolution: {integrity: sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -3873,9 +3837,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3884,9 +3845,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3999,9 +3957,6 @@ packages: resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} engines: {node: '>=0.10.5'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -4025,6 +3980,9 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + rettime@0.7.0: + resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4242,6 +4200,10 @@ packages: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.3.1: resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} @@ -4272,6 +4234,13 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4280,9 +4249,9 @@ packages: resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} engines: {node: '>=10.13.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} @@ -4325,13 +4294,9 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} + type-fest@5.3.1: + resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} + engines: {node: '>=20'} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -4372,13 +4337,12 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + update-browserslist-db@1.2.2: resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} hasBin: true @@ -4388,9 +4352,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -4552,8 +4513,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} zod-validation-error@4.0.2: @@ -5238,19 +5199,6 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@bundled-es-modules/cookie@2.0.1': - dependencies: - cookie: 0.7.2 - - '@bundled-es-modules/statuses@1.0.1': - dependencies: - statuses: 2.0.2 - - '@bundled-es-modules/tough-cookie@0.1.6': - dependencies: - '@types/tough-cookie': 4.0.5 - tough-cookie: 4.1.4 - '@byteplus/rtc@4.67.4': dependencies: eventemitter3: 4.0.7 @@ -5612,29 +5560,31 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/confirm@5.1.13(@types/node@20.19.8)': + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21(@types/node@20.19.8)': dependencies: - '@inquirer/core': 10.1.14(@types/node@20.19.8) - '@inquirer/type': 3.0.7(@types/node@20.19.8) + '@inquirer/core': 10.3.2(@types/node@20.19.8) + '@inquirer/type': 3.0.10(@types/node@20.19.8) optionalDependencies: '@types/node': 20.19.8 - '@inquirer/core@10.1.14(@types/node@20.19.8)': + '@inquirer/core@10.3.2(@types/node@20.19.8)': dependencies: - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@20.19.8) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.8) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 20.19.8 - '@inquirer/figures@1.0.12': {} + '@inquirer/figures@1.0.15': {} - '@inquirer/type@3.0.7(@types/node@20.19.8)': + '@inquirer/type@3.0.10(@types/node@20.19.8)': optionalDependencies: '@types/node': 20.19.8 @@ -5672,7 +5622,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 - '@mswjs/interceptors@0.39.3': + '@mswjs/interceptors@0.40.0': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -6760,8 +6710,6 @@ snapshots: tslib: 2.8.1 optional: true - '@types/cookie@0.6.0': {} - '@types/crypto-js@4.2.2': {} '@types/estree@1.0.8': {} @@ -6801,8 +6749,6 @@ snapshots: '@types/statuses@2.0.6': {} - '@types/tough-cookie@4.0.5': {} - '@types/uuid@9.0.8': {} '@types/ws@8.18.1': @@ -7023,10 +6969,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -7270,7 +7212,7 @@ snapshots: convert-source-map@2.0.0: {} - cookie@0.7.2: {} + cookie@1.1.1: {} core-util-is@1.0.3: {} @@ -7930,7 +7872,7 @@ snapshots: graceful-fs@4.2.11: {} - graphql@16.11.0: {} + graphql@16.12.0: {} gulp-sort@2.0.0: dependencies: @@ -8178,13 +8120,6 @@ snapshots: jiti@2.4.2: {} - jotai@2.13.1(@babel/core@7.28.5)(@babel/template@7.27.2)(@types/react@19.2.7)(react@19.2.1): - optionalDependencies: - '@babel/core': 7.28.5 - '@babel/template': 7.27.2 - '@types/react': 19.2.7 - react: 19.2.1 - js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -8387,25 +8322,25 @@ snapshots: ms@2.1.3: {} - msw@2.10.4(@types/node@20.19.8)(typescript@5.8.3): + msw@2.12.4(@types/node@20.19.8)(typescript@5.8.3): dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.13(@types/node@20.19.8) - '@mswjs/interceptors': 0.39.3 + '@inquirer/confirm': 5.1.21(@types/node@20.19.8) + '@mswjs/interceptors': 0.40.0 '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 '@types/statuses': 2.0.6 - graphql: 16.11.0 + cookie: 1.1.1 + graphql: 16.12.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 picocolors: 1.1.1 + rettime: 0.7.0 + statuses: 2.0.2 strict-event-emitter: 0.5.1 - type-fest: 4.41.0 + tough-cookie: 6.0.0 + type-fest: 5.3.1 + until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: typescript: 5.8.3 @@ -8617,18 +8552,12 @@ snapshots: proxy-from-env@1.1.0: {} - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode@2.3.1: {} qs@6.14.0: dependencies: side-channel: 1.1.0 - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} raf@3.4.1: @@ -8747,8 +8676,6 @@ snapshots: requireindex@1.1.0: {} - requires-port@1.0.0: {} - resize-observer-polyfill@1.5.1: {} resolve-from@4.0.0: {} @@ -8771,6 +8698,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + rettime@0.7.0: {} + reusify@1.1.0: {} run-parallel@1.2.0: @@ -9060,6 +8989,8 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 + tagged-tag@1.0.0: {} + tailwind-merge@3.3.1: {} tailwindcss@4.1.11: {} @@ -9102,6 +9033,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -9113,12 +9050,9 @@ snapshots: - bare-abort-controller - react-native-b4a - tough-cookie@4.1.4: + tough-cookie@6.0.0: dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.0.19 ts-api-utils@2.1.0(typescript@5.8.3): dependencies: @@ -9171,9 +9105,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - - type-fest@4.41.0: {} + type-fest@5.3.1: + dependencies: + tagged-tag: 1.0.0 typed-array-buffer@1.0.3: dependencies: @@ -9232,8 +9166,6 @@ snapshots: unicorn-magic@0.3.0: {} - universalify@0.2.0: {} - unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.0 @@ -9258,6 +9190,8 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + until-async@3.0.2: {} + update-browserslist-db@1.2.2(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -9268,11 +9202,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.1): dependencies: react: 19.2.1 @@ -9469,7 +9398,7 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.2: {} + yoctocolors-cjs@2.1.3: {} zod-validation-error@4.0.2(zod@4.0.5): dependencies: diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js deleted file mode 100644 index be4527c..0000000 --- a/public/mockServiceWorker.js +++ /dev/null @@ -1,344 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ - -/** - * Mock Service Worker. - * @see https://github.com/mswjs/msw - * - Please do NOT modify this file. - */ - -const PACKAGE_VERSION = '2.10.4' -const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' -const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') -const activeClientIds = new Set() - -addEventListener('install', function () { - self.skipWaiting() -}) - -addEventListener('activate', function (event) { - event.waitUntil(self.clients.claim()) -}) - -addEventListener('message', async function (event) { - const clientId = Reflect.get(event.source || {}, 'id') - - if (!clientId || !self.clients) { - return - } - - const client = await self.clients.get(clientId) - - if (!client) { - return - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - switch (event.data) { - case 'KEEPALIVE_REQUEST': { - sendToClient(client, { - type: 'KEEPALIVE_RESPONSE', - }) - break - } - - case 'INTEGRITY_CHECK_REQUEST': { - sendToClient(client, { - type: 'INTEGRITY_CHECK_RESPONSE', - payload: { - packageVersion: PACKAGE_VERSION, - checksum: INTEGRITY_CHECKSUM, - }, - }) - break - } - - case 'MOCK_ACTIVATE': { - activeClientIds.add(clientId) - - sendToClient(client, { - type: 'MOCKING_ENABLED', - payload: { - client: { - id: client.id, - frameType: client.frameType, - }, - }, - }) - break - } - - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - - case 'CLIENT_CLOSED': { - activeClientIds.delete(clientId) - - const remainingClients = allClients.filter((client) => { - return client.id !== clientId - }) - - // Unregister itself when there are no more clients - if (remainingClients.length === 0) { - self.registration.unregister() - } - - break - } - } -}) - -addEventListener('fetch', function (event) { - // Bypass navigation requests. - if (event.request.mode === 'navigate') { - return - } - - // Opening the DevTools triggers the "only-if-cached" request - // that cannot be handled by the worker. Bypass such requests. - if ( - event.request.cache === 'only-if-cached' && - event.request.mode !== 'same-origin' - ) { - return - } - - // Bypass all requests when there are no active clients. - // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). - if (activeClientIds.size === 0) { - return - } - - const requestId = crypto.randomUUID() - event.respondWith(handleRequest(event, requestId)) -}) - -/** - * @param {FetchEvent} event - * @param {string} requestId - */ -async function handleRequest(event, requestId) { - const client = await resolveMainClient(event) - const requestCloneForEvents = event.request.clone() - const response = await getResponse(event, client, requestId) - - // Send back the response clone for the "response:*" life-cycle events. - // Ensure MSW is active and ready to handle the message, otherwise - // this message will pend indefinitely. - if (client && activeClientIds.has(client.id)) { - const serializedRequest = await serializeRequest(requestCloneForEvents) - - // Clone the response so both the client and the library could consume it. - const responseClone = response.clone() - - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - isMockedResponse: IS_MOCKED_RESPONSE in response, - request: { - id: requestId, - ...serializedRequest, - }, - response: { - type: responseClone.type, - status: responseClone.status, - statusText: responseClone.statusText, - headers: Object.fromEntries(responseClone.headers.entries()), - body: responseClone.body, - }, - }, - }, - responseClone.body ? [serializedRequest.body, responseClone.body] : [], - ) - } - - return response -} - -/** - * Resolve the main client for the given event. - * Client that issues a request doesn't necessarily equal the client - * that registered the worker. It's with the latter the worker should - * communicate with during the response resolving phase. - * @param {FetchEvent} event - * @returns {Promise} - */ -async function resolveMainClient(event) { - const client = await self.clients.get(event.clientId) - - if (activeClientIds.has(event.clientId)) { - return client - } - - if (client?.frameType === 'top-level') { - return client - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - return allClients - .filter((client) => { - // Get only those clients that are currently visible. - return client.visibilityState === 'visible' - }) - .find((client) => { - // Find the client ID that's recorded in the - // set of clients that have registered the worker. - return activeClientIds.has(client.id) - }) -} - -/** - * @param {FetchEvent} event - * @param {Client | undefined} client - * @param {string} requestId - * @returns {Promise} - */ -async function getResponse(event, client, requestId) { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const requestClone = event.request.clone() - - function passthrough() { - // Cast the request headers to a new Headers instance - // so the headers can be manipulated with. - const headers = new Headers(requestClone.headers) - - // Remove the "accept" header value that marked this request as passthrough. - // This prevents request alteration and also keeps it compliant with the - // user-defined CORS policies. - const acceptHeader = headers.get('accept') - if (acceptHeader) { - const values = acceptHeader.split(',').map((value) => value.trim()) - const filteredValues = values.filter( - (value) => value !== 'msw/passthrough', - ) - - if (filteredValues.length > 0) { - headers.set('accept', filteredValues.join(', ')) - } else { - headers.delete('accept') - } - } - - return fetch(requestClone, { headers }) - } - - // Bypass mocking when the client is not active. - if (!client) { - return passthrough() - } - - // Bypass initial page load requests (i.e. static assets). - // The absence of the immediate/parent client in the map of the active clients - // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet - // and is not ready to handle requests. - if (!activeClientIds.has(client.id)) { - return passthrough() - } - - // Notify the client that a request has been intercepted. - const serializedRequest = await serializeRequest(event.request) - const clientMessage = await sendToClient( - client, - { - type: 'REQUEST', - payload: { - id: requestId, - ...serializedRequest, - }, - }, - [serializedRequest.body], - ) - - switch (clientMessage.type) { - case 'MOCK_RESPONSE': { - return respondWithMock(clientMessage.data) - } - - case 'PASSTHROUGH': { - return passthrough() - } - } - - return passthrough() -} - -/** - * @param {Client} client - * @param {any} message - * @param {Array} transferrables - * @returns {Promise} - */ -function sendToClient(client, message, transferrables = []) { - return new Promise((resolve, reject) => { - const channel = new MessageChannel() - - channel.port1.onmessage = (event) => { - if (event.data && event.data.error) { - return reject(event.data.error) - } - - resolve(event.data) - } - - client.postMessage(message, [ - channel.port2, - ...transferrables.filter(Boolean), - ]) - }) -} - -/** - * @param {Response} response - * @returns {Response} - */ -function respondWithMock(response) { - // Setting response status code to 0 is a no-op. - // However, when responding with a "Response.error()", the produced Response - // instance will have status code set to 0. Since it's not possible to create - // a Response instance with status code 0, handle that use-case separately. - if (response.status === 0) { - return Response.error() - } - - const mockedResponse = new Response(response.body, response) - - Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { - value: true, - enumerable: true, - }) - - return mockedResponse -} - -/** - * @param {Request} request - */ -async function serializeRequest(request) { - return { - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.arrayBuffer(), - keepalive: request.keepalive, - } -} diff --git a/scripts/TRANSLATION_SUMMARY.md b/scripts/TRANSLATION_SUMMARY.md deleted file mode 100644 index 6b8a2fe..0000000 --- a/scripts/TRANSLATION_SUMMARY.md +++ /dev/null @@ -1,81 +0,0 @@ -# 文案翻译覆盖总结 - -## 执行结果 - -✅ **成功完成文案翻译覆盖任务** - -### 统计数据 - -- **总翻译条目**: 378 条(去重后) -- **成功替换**: 334 条 -- **成功率**: 88.4% -- **剩余冲突**: 44 条 - -### 冲突分析 - -- **文本未找到**: 24 条 - 主要是包含特殊字符(如 emoji)的文本 -- **多处匹配**: 20 条 - 同一文本在文件中出现多次,需要人工确认 - -## 实现的功能 - -### 1. 智能文案替换 - -- 基于 `ts-morph` AST 解析,精确定位不同类型的文案 -- 支持 JSX 文本、属性值、函数参数等多种文案类型 -- 保持代码格式和缩进不变 - -### 2. 冲突检测机制 - -- 自动检测文件不存在、文本未找到、多处匹配等冲突 -- 生成详细的冲突报告,便于人工处理 - -### 3. 去重处理 - -- 自动去除翻译数据中的重复条目 -- 避免重复替换导致的错误 - -### 4. 报告生成 - -- 成功替换报告:`scripts/translation-report.json` -- 冲突报告:`scripts/translation-conflicts.xlsx` - -## 使用的脚本 - -### 主要脚本 - -- `scripts/apply-translations.cjs` - 基础翻译应用脚本 -- `scripts/reset-and-apply-translations.cjs` - 重置并应用翻译脚本(推荐使用) - -### 使用方法 - -```bash -# 重置文件并应用翻译(推荐) -node scripts/reset-and-apply-translations.cjs - -# 仅应用翻译(如果文件未被修改过) -node scripts/apply-translations.cjs -``` - -## 处理建议 - -### 对于剩余冲突 - -1. **文本未找到的条目**:检查是否包含特殊字符或格式问题 -2. **多处匹配的条目**:需要人工确认具体替换哪个位置 - -### 后续优化 - -1. 可以针对特殊字符(emoji)的匹配进行优化 -2. 可以添加更智能的多处匹配处理逻辑 -3. 可以添加翻译质量验证机制 - -## 文件变更 - -所有成功替换的文案已直接修改到源代码文件中,包括: - -- React 组件中的 JSX 文本 -- 属性值(title、placeholder、alt 等) -- 函数调用中的字符串参数 -- 表单验证消息等 - -翻译覆盖任务已成功完成!🎉 diff --git a/scripts/apply-translations.cjs b/scripts/apply-translations.cjs deleted file mode 100644 index f08dfbe..0000000 --- a/scripts/apply-translations.cjs +++ /dev/null @@ -1,378 +0,0 @@ -/* - CommonJS runtime for applying translations from Excel to source code. -*/ -const path = require('node:path') -const fs = require('node:fs') -const { Project, SyntaxKind, Node } = require('ts-morph') -const XLSX = require('xlsx') - -const WORKDIR = process.cwd() -const TRANSLATES_FILE = path.join(WORKDIR, 'scripts', 'translates.xlsx') -const REPORT_FILE = path.join(WORKDIR, 'scripts', 'translation-report.json') -const CONFLICTS_FILE = path.join(WORKDIR, 'scripts', 'translation-conflicts.xlsx') - -// 统计信息 -const stats = { - total: 0, - success: 0, - conflicts: 0, - fileNotFound: 0, - textNotFound: 0, - multipleMatches: 0, -} - -// 冲突列表 -const conflicts = [] - -// 成功替换列表 -const successfulReplacements = [] - -function loadTranslations() { - console.log('📖 读取翻译数据...') - const wb = XLSX.readFile(TRANSLATES_FILE) - const ws = wb.Sheets[wb.SheetNames[0]] - const data = XLSX.utils.sheet_to_json(ws, { defval: '' }) - - // 筛选出需要替换的条目 - let translations = data.filter( - (row) => row.text && row.corrected_text && row.text !== row.corrected_text - ) - - // 去重:按 file + line + text 去重,保留第一个 - const seen = new Set() - translations = translations.filter((row) => { - const key = `${row.file}:${row.line}:${row.text}` - if (seen.has(key)) { - return false - } - seen.add(key) - return true - }) - - console.log(`📊 找到 ${translations.length} 条需要替换的翻译(已去重)`) - stats.total = translations.length - - return translations -} - -function groupByFile(translations) { - const groups = new Map() - for (const translation of translations) { - const filePath = path.join(WORKDIR, translation.file) - if (!groups.has(filePath)) { - groups.set(filePath, []) - } - groups.get(filePath).push(translation) - } - return groups -} - -function findTextInNode(node, targetText, kind) { - if (!node) return null - - // 处理 JSX 文本节点 - if (Node.isJsxText(node)) { - const text = node.getText().replace(/\s+/g, ' ').trim() - if (text === targetText) return node - } - - // 处理字符串字面量 - if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) { - const text = node.getLiteralText() - if (text === targetText) return node - } - - // 处理 JSX 表达式中的字符串 - if (Node.isJsxExpression(node)) { - const expr = node.getExpression() - if (expr && (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr))) { - const text = expr.getLiteralText() - if (text === targetText) return node - } - } - - return null -} - -function findTextInFile(sourceFile, translation) { - const { text, line, kind } = translation - const matches = [] - - sourceFile.forEachDescendant((node) => { - // 根据 kind 类型进行不同的匹配 - if (kind === 'text') { - // 查找 JSX 文本节点 - if (Node.isJsxText(node)) { - const nodeText = node.getText().replace(/\s+/g, ' ').trim() - if (nodeText === text) { - matches.push({ node, type: 'jsx-text', line: node.getStartLineNumber() }) - } - } - // 查找 JSX 表达式中的字符串 - if (Node.isJsxExpression(node)) { - const expr = node.getExpression() - if (expr && (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr))) { - const nodeText = expr.getLiteralText() - if (nodeText === text) { - matches.push({ node: expr, type: 'jsx-expression', line: node.getStartLineNumber() }) - } - } - } - } else if (['placeholder', 'title', 'alt', 'label', 'aria'].includes(kind)) { - // 查找 JSX 属性 - if (Node.isJsxAttribute(node)) { - const name = node.getNameNode().getText().toLowerCase() - const value = getStringFromInitializer(node) - if (value === text) { - matches.push({ node, type: 'jsx-attribute', line: node.getStartLineNumber() }) - } - } - } else if (['toast', 'dialog', 'error', 'validation'].includes(kind)) { - // 查找函数调用中的字符串参数 - if (Node.isCallExpression(node)) { - const args = node.getArguments() - for (const arg of args) { - if (Node.isStringLiteral(arg) || Node.isNoSubstitutionTemplateLiteral(arg)) { - const nodeText = arg.getLiteralText() - if (nodeText === text) { - matches.push({ node: arg, type: 'function-arg', line: node.getStartLineNumber() }) - } - } - } - } - } - }) - - return matches -} - -function getStringFromInitializer(attr) { - const init = attr.getInitializer() - if (!init) return undefined - if (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) { - return init.getLiteralText() - } - if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (!expr) return undefined - if (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr)) { - return expr.getLiteralText() - } - } - return undefined -} - -function replaceText(node, newText, type) { - try { - if (type === 'jsx-text') { - // JSX 文本节点需要特殊处理,保持空白字符 - const originalText = node.getText() - const newTextWithWhitespace = originalText.replace(/\S+/g, newText) - node.replaceWithText(newTextWithWhitespace) - } else if (type === 'jsx-expression' || type === 'function-arg') { - // 字符串字面量 - if (Node.isStringLiteral(node)) { - node.replaceWithText(`"${newText}"`) - } else if (Node.isNoSubstitutionTemplateLiteral(node)) { - node.replaceWithText(`\`${newText}\``) - } - } else if (type === 'jsx-attribute') { - // JSX 属性值 - const init = node.getInitializer() - if (init) { - if (Node.isStringLiteral(init)) { - init.replaceWithText(`"${newText}"`) - } else if (Node.isNoSubstitutionTemplateLiteral(init)) { - init.replaceWithText(`\`${newText}\``) - } else if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (expr && (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr))) { - if (Node.isStringLiteral(expr)) { - expr.replaceWithText(`"${newText}"`) - } else { - expr.replaceWithText(`\`${newText}\``) - } - } - } - } - } - return true - } catch (error) { - console.error(`❌ 替换失败: ${error.message}`) - return false - } -} - -function processFile(filePath, translations) { - if (!fs.existsSync(filePath)) { - console.log(`❌ 文件不存在: ${path.relative(WORKDIR, filePath)}`) - translations.forEach((t) => { - conflicts.push({ - ...t, - conflictType: 'FILE_NOT_FOUND', - conflictReason: '文件不存在', - }) - }) - stats.fileNotFound += translations.length - return - } - - console.log(`📝 处理文件: ${path.relative(WORKDIR, filePath)}`) - - try { - const project = new Project({ - tsConfigFilePath: path.join(WORKDIR, 'tsconfig.json'), - skipAddingFilesFromTsConfig: true, - }) - const sourceFile = project.addSourceFileAtPath(filePath) - - for (const translation of translations) { - const { text, corrected_text, line, kind } = translation - - // 首先在指定行附近查找 - let matches = findTextInFile(sourceFile, translation) - - // 如果没找到,在整个文件中搜索 - if (matches.length === 0) { - matches = findTextInFile(sourceFile, translation) - } - - if (matches.length === 0) { - conflicts.push({ - ...translation, - conflictType: 'TEXT_NOT_FOUND_IN_FILE', - conflictReason: '在文件中找不到匹配的文本', - }) - stats.textNotFound++ - continue - } - - if (matches.length > 1) { - conflicts.push({ - ...translation, - conflictType: 'MULTIPLE_MATCHES', - conflictReason: `找到 ${matches.length} 个匹配项,需要人工确认`, - }) - stats.multipleMatches++ - continue - } - - // 执行替换 - const match = matches[0] - const success = replaceText(match.node, corrected_text, match.type) - - if (success) { - successfulReplacements.push({ - ...translation, - actualLine: match.line, - replacementType: match.type, - }) - stats.success++ - console.log(`✅ 替换成功: "${text}" -> "${corrected_text}" (行 ${match.line})`) - } else { - conflicts.push({ - ...translation, - conflictType: 'REPLACEMENT_FAILED', - conflictReason: '替换操作失败', - }) - stats.conflicts++ - } - } - - // 保存修改后的文件 - sourceFile.saveSync() - } catch (error) { - console.error(`❌ 处理文件失败: ${filePath}`, error.message) - translations.forEach((t) => { - conflicts.push({ - ...t, - conflictType: 'PARSE_ERROR', - conflictReason: `文件解析失败: ${error.message}`, - }) - }) - stats.conflicts += translations.length - } -} - -function generateReport() { - console.log('\n📊 生成报告...') - - // 生成成功替换报告 - const report = { - timestamp: new Date().toISOString(), - stats, - successfulReplacements, - conflicts: conflicts.map((c) => ({ - file: c.file, - line: c.line, - text: c.text, - corrected_text: c.corrected_text, - conflictType: c.conflictType, - conflictReason: c.conflictReason, - })), - } - - fs.writeFileSync(REPORT_FILE, JSON.stringify(report, null, 2)) - console.log(`📄 成功替换报告已保存: ${REPORT_FILE}`) - - // 生成冲突报告 Excel - if (conflicts.length > 0) { - const conflictRows = conflicts.map((c) => ({ - file: c.file, - line: c.line, - text: c.text, - corrected_text: c.corrected_text, - conflictType: c.conflictType, - conflictReason: c.conflictReason, - route: c.route, - componentOrFn: c.componentOrFn, - kind: c.kind, - keyOrLocator: c.keyOrLocator, - })) - - const ws = XLSX.utils.json_to_sheet(conflictRows) - const wb = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(wb, ws, 'conflicts') - XLSX.writeFile(wb, CONFLICTS_FILE) - console.log(`📄 冲突报告已保存: ${CONFLICTS_FILE}`) - } -} - -function printSummary() { - console.log('\n📈 处理完成!') - console.log(`总翻译条目: ${stats.total}`) - console.log(`✅ 成功替换: ${stats.success}`) - console.log(`❌ 文件不存在: ${stats.fileNotFound}`) - console.log(`❌ 文本未找到: ${stats.textNotFound}`) - console.log(`❌ 多处匹配: ${stats.multipleMatches}`) - console.log(`❌ 其他冲突: ${stats.conflicts}`) - console.log(`\n成功率: ${((stats.success / stats.total) * 100).toFixed(1)}%`) -} - -async function main() { - console.log('🚀 开始应用翻译...\n') - - try { - // 1. 读取翻译数据 - const translations = loadTranslations() - - // 2. 按文件分组 - const fileGroups = groupByFile(translations) - - // 3. 处理每个文件 - for (const [filePath, fileTranslations] of fileGroups) { - processFile(filePath, fileTranslations) - } - - // 4. 生成报告 - generateReport() - - // 5. 打印总结 - printSummary() - } catch (error) { - console.error('❌ 执行失败:', error) - process.exitCode = 1 - } -} - -main() diff --git a/scripts/convert-to-i18n.js b/scripts/convert-to-i18n.js deleted file mode 100644 index 342cd5f..0000000 --- a/scripts/convert-to-i18n.js +++ /dev/null @@ -1,105 +0,0 @@ -/* - 将现有的 copy-audit.xlsx 转换为 i18next 格式的翻译文件 -*/ - -const fs = require('fs') -const path = require('path') -const XLSX = require('xlsx') - -const WORKDIR = process.cwd() - -function generateI18nKey(item) { - // 生成 i18next 格式的键名 - const route = item.route === 'shared' ? 'common' : item.route.replace(/[^a-zA-Z0-9]/g, '_') - const component = item.componentOrFn.replace(/[^a-zA-Z0-9]/g, '_') - const kind = item.kind - const locator = item.keyOrLocator.replace(/[^a-zA-Z0-9]/g, '_') - - return `${route}.${component}.${kind}.${locator}`.toLowerCase() -} - -function main() { - // 读取现有的 Excel 文件 - const excelFile = path.join(WORKDIR, 'docs', 'copy-audit.xlsx') - if (!fs.existsSync(excelFile)) { - console.error('❌ 找不到 copy-audit.xlsx 文件,请先运行 extract-copy 脚本') - process.exit(1) - } - - const workbook = XLSX.readFile(excelFile) - const sheetName = workbook.SheetNames[0] - const worksheet = workbook.Sheets[sheetName] - const data = XLSX.utils.sheet_to_json(worksheet) - - console.log(`📊 读取到 ${data.length} 条记录`) - - // 生成 i18next 格式的翻译文件 - const translation = {} - const i18nKeys = [] - - data.forEach((item, index) => { - if (item.text && item.text.trim()) { - const key = generateI18nKey(item) - translation[key] = item.text - i18nKeys.push({ - key, - value: item.text, - route: item.route, - file: item.file, - line: item.line, - kind: item.kind, - }) - } - }) - - // 确保目录存在 - const localesDir = path.join(WORKDIR, 'public', 'locales', 'en') - if (!fs.existsSync(localesDir)) { - fs.mkdirSync(localesDir, { recursive: true }) - } - - // 写入翻译文件 - const translationFile = path.join(localesDir, 'translation.json') - fs.writeFileSync(translationFile, JSON.stringify(translation, null, 2)) - - // 生成详细的 i18n 扫描报告 - const report = { - totalItems: data.length, - uniqueTexts: new Set(data.map((item) => item.text)).size, - translationKeys: Object.keys(translation).length, - byRoute: data.reduce((acc, item) => { - acc[item.route] = (acc[item.route] || 0) + 1 - return acc - }, {}), - byKind: data.reduce((acc, item) => { - acc[item.kind] = (acc[item.kind] || 0) + 1 - return acc - }, {}), - sampleKeys: Object.keys(translation).slice(0, 10), - } - - // 生成 Excel 格式的 i18n 报告 - const i18nWorkbook = XLSX.utils.book_new() - const i18nSheet = XLSX.utils.json_to_sheet(i18nKeys) - XLSX.utils.book_append_sheet(i18nWorkbook, i18nSheet, 'i18n-keys') - - const i18nReportFile = path.join(WORKDIR, 'docs', 'i18n-scan-report.xlsx') - XLSX.writeFile(i18nWorkbook, i18nReportFile) - - // 生成 JSON 报告 - const reportFile = path.join(WORKDIR, 'docs', 'i18n-scan-report.json') - fs.writeFileSync(reportFile, JSON.stringify(report, null, 2)) - - console.log('✅ i18next 扫描转换完成!') - console.log(`📊 总扫描条目: ${data.length}`) - console.log(`🔑 生成翻译键: ${Object.keys(translation).length}`) - console.log(`📁 翻译文件: ${translationFile}`) - console.log(`📋 i18n Excel 报告: ${i18nReportFile}`) - console.log(`📄 JSON 报告: ${reportFile}`) - console.log('\n📝 示例翻译键:') - report.sampleKeys.forEach((key) => { - console.log(` ${key}: "${translation[key]}"`) - }) -} - -main() diff --git a/scripts/extract-copy.cjs b/scripts/extract-copy.cjs deleted file mode 100644 index 22c3ba2..0000000 --- a/scripts/extract-copy.cjs +++ /dev/null @@ -1,333 +0,0 @@ -/* - CommonJS runtime for extracting user-facing copy into Excel. -*/ -const path = require('node:path') -const fs = require('node:fs') -const { globby } = require('globby') -const { Project, SyntaxKind, Node } = require('ts-morph') -const XLSX = require('xlsx') - -const WORKDIR = process.cwd() -const SRC_DIR = path.join(WORKDIR, 'src') -const APP_DIR = path.join(SRC_DIR, 'app') - -function ensureExcelDir() { - const docsDir = path.join(WORKDIR, 'docs') - if (!fs.existsSync(docsDir)) fs.mkdirSync(docsDir, { recursive: true }) -} - -function isMeaningfulText(value) { - if (!value) return false - const trimmed = String(value).replace(/\s+/g, ' ').trim() - if (!trimmed) return false - if (/^[A-Za-z0-9_.$-]+$/.test(trimmed) && trimmed.length > 24) return false - return true -} - -function getRouteForFile(absFilePath) { - if (!absFilePath.startsWith(APP_DIR)) return 'shared' - let dir = path.dirname(absFilePath) - while (dir.startsWith(APP_DIR)) { - const pageTsx = path.join(dir, 'page.tsx') - const pageTs = path.join(dir, 'page.ts') - if (fs.existsSync(pageTsx) || fs.existsSync(pageTs)) { - const rel = path.relative(APP_DIR, dir) - return rel || '/' - } - const parent = path.dirname(dir) - if (parent === dir) break - dir = parent - } - const relToApp = path.relative(APP_DIR, absFilePath) - const parts = relToApp.split(path.sep) - return parts.length > 0 ? parts[0] : 'shared' -} - -function getComponentOrFnName(node) { - const fn = node.getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) - if (fn && fn.getName && fn.getName()) return fn.getName() - const varDecl = node.getFirstAncestorByKind(SyntaxKind.VariableDeclaration) - if (varDecl && varDecl.getName) return varDecl.getName() - const cls = node.getFirstAncestorByKind(SyntaxKind.ClassDeclaration) - if (cls && cls.getName && cls.getName()) return cls.getName() - const sf = node.getSourceFile() - return path.basename(sf.getFilePath()) -} - -function getNodeLine(node) { - const pos = node.getStartLineNumber && node.getStartLineNumber() - return pos || 1 -} - -function getAttrName(attr) { - return attr.getNameNode().getText() -} - -function getStringFromInitializer(attr) { - const init = attr.getInitializer() - if (!init) return undefined - if (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - return init.getLiteralText() - if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (!expr) return undefined - if (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr)) - return expr.getLiteralText() - } - return undefined -} - -async function collectFiles() { - const patterns = ['src/**/*.{ts,tsx}'] - const ignore = [ - '**/node_modules/**', - '**/.next/**', - '**/__tests__/**', - '**/mocks/**', - '**/mock/**', - '**/*.d.ts', - ] - return await globby(patterns, { gitignore: true, ignore }) -} - -function pushItem(items, item) { - if (!isMeaningfulText(item.text)) return - items.push(item) -} - -function extractFromSourceFile(abs, items, project) { - const sf = project.addSourceFileAtPath(abs) - sf.forEachDescendant((node) => { - // JSX text nodes - if (Node.isJsxElement(node)) { - const opening = node.getOpeningElement() - const componentOrFn = getComponentOrFnName(node) - const route = getRouteForFile(abs) - const tagName = opening.getTagNameNode().getText() - // 递归抓取所有子层级文本节点 - const textNodes = node.getDescendantsOfKind(SyntaxKind.JsxText) - textNodes.forEach((t) => { - const text = t.getText() - const cleaned = text.replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(t), - }) - } - }) - // 抓取 {'...'} 这类表达式中的字符串字面量 - const exprs = node.getDescendantsOfKind(SyntaxKind.JsxExpression) - exprs.forEach((expr) => { - const inner = expr.getExpression() - if (inner && (Node.isStringLiteral(inner) || Node.isNoSubstitutionTemplateLiteral(inner))) { - const cleaned = inner.getLiteralText().replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(expr), - }) - } - } - }) - } - - // JSX attributes - if (Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const tag = node.getTagNameNode().getText() - const attrs = node.getAttributes().filter(Node.isJsxAttribute) - attrs.forEach((attr) => { - const name = getAttrName(attr) - const lower = name.toLowerCase() - const value = getStringFromInitializer(attr) - if (!value) return - let kind = null - if (lower === 'placeholder') kind = 'placeholder' - else if (lower === 'title') kind = 'title' - else if (lower === 'alt') kind = 'alt' - else if (lower.startsWith('aria-')) kind = 'aria' - else if (lower === 'label') kind = 'label' - if (kind) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator: `${tag}.${name}`, - text: value, - line: getNodeLine(attr), - }) - } - }) - } - - // Interaction messages - if (Node.isCallExpression(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const expr = node.getExpression() - let kind = null - let keyOrLocator = '' - if (Node.isPropertyAccessExpression(expr)) { - const left = expr.getExpression().getText() - const name = expr.getName() - if (left === 'toast' || left === 'message') { - kind = 'toast' - keyOrLocator = `${left}.${name}` - } - if ((left || '').toLowerCase().includes('dialog')) { - kind = 'dialog' - keyOrLocator = `${left}.${name}` - } - } else if (Node.isIdentifier(expr)) { - const id = expr.getText() - if (id === 'alert' || id === 'confirm') { - kind = 'dialog' - keyOrLocator = id - } - } - if (kind) { - const arg0 = node.getArguments()[0] - if (arg0 && (Node.isStringLiteral(arg0) || Node.isNoSubstitutionTemplateLiteral(arg0))) { - const text = arg0.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator, - text, - line: getNodeLine(node), - }) - } - } - - // form.setError("field", { message: "..." }) - if (Node.isPropertyAccessExpression(expr) && expr.getName() === 'setError') { - const args = node.getArguments() - if (args.length >= 2) { - const second = args[1] - if (Node.isObjectLiteralExpression(second)) { - const msgProp = second.getProperty('message') - if (msgProp && Node.isPropertyAssignment(msgProp)) { - const init = msgProp.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'error', - keyOrLocator: 'form.setError', - text, - line: getNodeLine(msgProp), - }) - } - } - } - } - } - - // Generic validation object { message: "..." } - const args = node.getArguments() - for (const a of args) { - if (Node.isObjectLiteralExpression(a)) { - const prop = a.getProperty('message') - if (prop && Node.isPropertyAssignment(prop)) { - const init = prop.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'validation', - keyOrLocator: 'message', - text, - line: getNodeLine(prop), - }) - } - } - } - } - } - }) -} - -function aggregate(items) { - const map = new Map() - for (const it of items) { - const key = `${it.route}__${it.kind}__${it.keyOrLocator}__${it.text}` - if (!map.has(key)) map.set(key, { item: it, count: 1 }) - else map.get(key).count += 1 - } - const result = [] - for (const { item, count } of map.values()) { - result.push({ ...item, count }) - } - return result -} - -function toWorkbook(items) { - const rows = items.map((it) => ({ - route: it.route, - file: it.file, - componentOrFn: it.componentOrFn, - kind: it.kind, - keyOrLocator: it.keyOrLocator, - text: it.text, - line: it.line, - count: it.count || 1, - notes: it.notes || '', - })) - const ws = XLSX.utils.json_to_sheet(rows, { skipHeader: false }) - const wb = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(wb, ws, 'copy') - return wb -} - -async function main() { - ensureExcelDir() - const files = await collectFiles() - const project = new Project({ - tsConfigFilePath: path.join(WORKDIR, 'tsconfig.json'), - skipAddingFilesFromTsConfig: true, - }) - const items = [] - for (const rel of files) { - const abs = path.join(WORKDIR, rel) - try { - extractFromSourceFile(abs, items, project) - } catch (e) { - // continue on parse errors - } - } - const aggregated = aggregate(items) - const wb = toWorkbook(aggregated) - const out = path.join(WORKDIR, 'docs', 'copy-audit.xlsx') - XLSX.writeFile(wb, out) - console.log(`Wrote ${aggregated.length} rows to ${out}`) -} - -main().catch((err) => { - console.error(err) - process.exitCode = 1 -}) diff --git a/scripts/extract-copy.ts b/scripts/extract-copy.ts deleted file mode 100644 index 7e4f3d1..0000000 --- a/scripts/extract-copy.ts +++ /dev/null @@ -1,376 +0,0 @@ -/* - Extract all user-facing copy from the codebase into an Excel file. - Scans TS/TSX under src/, groups by Next.js App Router route, and writes docs/copy-audit.xlsx. -*/ - -import path from 'node:path' -import fs from 'node:fs' -import { globby } from 'globby' -import { - Project, - SyntaxKind, - Node, - JsxAttribute, - StringLiteral, - NoSubstitutionTemplateLiteral, -} from 'ts-morph' -import * as XLSX from 'xlsx' - -type CopyKind = - | 'text' - | 'placeholder' - | 'title' - | 'alt' - | 'aria' - | 'label' - | 'toast' - | 'dialog' - | 'error' - | 'validation' - -interface CopyItem { - route: string - file: string - componentOrFn: string - kind: CopyKind - keyOrLocator: string - text: string - line: number - notes?: string -} - -const WORKDIR = process.cwd() -const SRC_DIR = path.join(WORKDIR, 'src') -const APP_DIR = path.join(SRC_DIR, 'app') - -function ensureExcelDir() { - const docsDir = path.join(WORKDIR, 'docs') - if (!fs.existsSync(docsDir)) fs.mkdirSync(docsDir, { recursive: true }) -} - -function isMeaningfulText(value: string | undefined | null): value is string { - if (!value) return false - const trimmed = value.replace(/\s+/g, ' ').trim() - if (!trimmed) return false - // Filter obvious code-like tokens - if (/^[A-Za-z0-9_.$-]+$/.test(trimmed) && trimmed.length > 24) return false - return true -} - -function getRouteForFile(absFilePath: string): string { - if (!absFilePath.startsWith(APP_DIR)) return 'shared' - let dir = path.dirname(absFilePath) - // Walk up to find nearest folder that contains a page.tsx (or page.ts) - while (dir.startsWith(APP_DIR)) { - const pageTsx = path.join(dir, 'page.tsx') - const pageTs = path.join(dir, 'page.ts') - if (fs.existsSync(pageTsx) || fs.existsSync(pageTs)) { - const rel = path.relative(APP_DIR, dir) - return rel || '/' - } - const parent = path.dirname(dir) - if (parent === dir) break - dir = parent - } - // Fallback: route is the first app subfolder segment - const relToApp = path.relative(APP_DIR, absFilePath) - const parts = relToApp.split(path.sep) - return parts.length > 0 ? parts[0] : 'shared' -} - -function getComponentOrFnName(node: Node): string { - const fn = node.getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) - if (fn?.getName()) return fn.getName()! - const varDecl = node.getFirstAncestorByKind(SyntaxKind.VariableDeclaration) - if (varDecl?.getName()) return varDecl.getName() - const cls = node.getFirstAncestorByKind(SyntaxKind.ClassDeclaration) - if (cls?.getName()) return cls.getName()! - const sf = node.getSourceFile() - return path.basename(sf.getFilePath()) -} - -function getNodeLine(node: Node): number { - const pos = node.getStartLineNumber() - return pos ?? 1 -} - -function getAttrName(attr: JsxAttribute): string { - return attr.getNameNode().getText() -} - -function getStringFromInitializer(attr: JsxAttribute): string | undefined { - const init = attr.getInitializer() - if (!init) return undefined - if (Node.isStringLiteral(init)) return init.getLiteralText() - if (Node.isNoSubstitutionTemplateLiteral(init)) return init.getLiteralText() - if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (!expr) return undefined - if (Node.isStringLiteral(expr)) return expr.getLiteralText() - if (Node.isNoSubstitutionTemplateLiteral(expr)) return expr.getLiteralText() - } - return undefined -} - -function pushItem(items: CopyItem[], item: CopyItem) { - if (!isMeaningfulText(item.text)) return - items.push(item) -} - -async function collectFiles(): Promise { - const patterns = ['src/**/*.{ts,tsx}'] - const ignore = [ - '**/node_modules/**', - '**/.next/**', - '**/__tests__/**', - '**/mocks/**', - '**/mock/**', - '**/*.d.ts', - ] - return await globby(patterns, { gitignore: true, ignore }) -} - -function extractFromSourceFile(abs: string, items: CopyItem[], project: Project) { - const sf = project.addSourceFileAtPath(abs) - // JSX text nodes - sf.forEachDescendant((node) => { - if (Node.isJsxElement(node)) { - const opening = node.getOpeningElement() - const componentOrFn = getComponentOrFnName(node) - const route = getRouteForFile(abs) - // 递归提取所有 JsxText 与 {'...'} 字面量 - const tagName = opening.getTagNameNode().getText() - const textNodes = node.getDescendantsOfKind(SyntaxKind.JsxText) - textNodes.forEach((t) => { - const text = t.getText() - const cleaned = text.replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(t), - }) - } - }) - const exprs = node.getDescendantsOfKind(SyntaxKind.JsxExpression) - exprs.forEach((expr) => { - const inner = expr.getExpression() - if (inner && (Node.isStringLiteral(inner) || Node.isNoSubstitutionTemplateLiteral(inner))) { - const cleaned = inner.getLiteralText().replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(expr), - }) - } - } - }) - } - - // JSX attributes - if (Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const tag = Node.isJsxOpeningElement(node) - ? node.getTagNameNode().getText() - : node.getTagNameNode().getText() - const attrs = node.getAttributes().filter(Node.isJsxAttribute) - attrs.forEach((attr) => { - const name = getAttrName(attr) - const lower = name.toLowerCase() - const value = getStringFromInitializer(attr) - if (!value) return - let kind: CopyKind | null = null - if (lower === 'placeholder') kind = 'placeholder' - else if (lower === 'title') kind = 'title' - else if (lower === 'alt') kind = 'alt' - else if (lower.startsWith('aria-')) kind = 'aria' - else if (lower === 'label') kind = 'label' - if (kind) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator: `${tag}.${name}`, - text: value, - line: getNodeLine(attr), - }) - } - }) - } - - // Interaction messages: toast.*, alert, confirm, message.* - if (Node.isCallExpression(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const expr = node.getExpression() - let kind: CopyKind | null = null - let keyOrLocator = '' - if (Node.isPropertyAccessExpression(expr)) { - const left = expr.getExpression().getText() - const name = expr.getName() - if (left === 'toast' || left === 'message') { - kind = 'toast' - keyOrLocator = `${left}.${name}` - } - if (left.toLowerCase().includes('dialog')) { - kind = 'dialog' - keyOrLocator = `${left}.${name}` - } - } else if (Node.isIdentifier(expr)) { - const id = expr.getText() - if (id === 'alert' || id === 'confirm') { - kind = 'dialog' - keyOrLocator = id - } - } - if (kind) { - const arg0 = node.getArguments()[0] - if (arg0 && (Node.isStringLiteral(arg0) || Node.isNoSubstitutionTemplateLiteral(arg0))) { - const text = (arg0 as StringLiteral | NoSubstitutionTemplateLiteral).getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator, - text, - line: getNodeLine(node), - }) - } - } - - // form.setError("field", { message: "..." }) - if (Node.isPropertyAccessExpression(expr) && expr.getName() === 'setError') { - const args = node.getArguments() - if (args.length >= 2) { - const second = args[1] - if (Node.isObjectLiteralExpression(second)) { - const msgProp = second.getProperty('message') - if (msgProp && Node.isPropertyAssignment(msgProp)) { - const init = msgProp.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'error', - keyOrLocator: 'form.setError', - text, - line: getNodeLine(msgProp), - }) - } - } - } - } - } - - // Generic validation: any object literal { message: "..." } inside chained calls - const args = node.getArguments() - for (const a of args) { - if (Node.isObjectLiteralExpression(a)) { - const prop = a.getProperty('message') - if (prop && Node.isPropertyAssignment(prop)) { - const init = prop.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'validation', - keyOrLocator: 'message', - text, - line: getNodeLine(prop), - }) - } - } - } - } - } - }) -} - -function aggregate(items: CopyItem[]): CopyItem[] { - // Deduplicate by route+kind+text+keyOrLocator to keep first occurrence, count separately - const map = new Map() - for (const it of items) { - const key = `${it.route}__${it.kind}__${it.keyOrLocator}__${it.text}` - if (!map.has(key)) { - map.set(key, { item: it, count: 1 }) - } else { - map.get(key)!.count += 1 - } - } - const result: CopyItem[] = [] - for (const { item, count } of map.values()) { - ;(item as any).count = count - result.push(item) - } - return result -} - -function toWorkbook(items: CopyItem[]): XLSX.WorkBook { - const rows = items.map((it) => ({ - route: it.route, - file: it.file, - componentOrFn: it.componentOrFn, - kind: it.kind, - keyOrLocator: it.keyOrLocator, - text: it.text, - line: it.line, - count: (it as any).count ?? 1, - notes: it.notes ?? '', - })) - const ws = XLSX.utils.json_to_sheet(rows, { skipHeader: false }) - const wb = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(wb, ws, 'copy') - return wb -} - -async function main() { - ensureExcelDir() - const files = await collectFiles() - const project = new Project({ - tsConfigFilePath: path.join(WORKDIR, 'tsconfig.json'), - skipAddingFilesFromTsConfig: true, - }) - const items: CopyItem[] = [] - for (const rel of files) { - const abs = path.join(WORKDIR, rel) - try { - extractFromSourceFile(abs, items, project) - } catch (e) { - // swallow parse errors but continue - } - } - const aggregated = aggregate(items) - const wb = toWorkbook(aggregated) - const out = path.join(WORKDIR, 'docs', 'copy-audit.xlsx') - XLSX.writeFile(wb, out) - // eslint-disable-next-line no-console - console.log(`Wrote ${aggregated.length} rows to ${out}`) -} - -main().catch((err) => { - // eslint-disable-next-line no-console - console.error(err) - process.exitCode = 1 -}) diff --git a/scripts/i18n-scan.ts b/scripts/i18n-scan.ts deleted file mode 100644 index 3c896eb..0000000 --- a/scripts/i18n-scan.ts +++ /dev/null @@ -1,447 +0,0 @@ -/* - 使用 i18next-scanner 格式扫描项目中未翻译的文本 - 基于现有的 extract-copy.ts 工具,生成 i18next 格式的扫描报告 -*/ - -import path from 'node:path' -import fs from 'node:fs' -import { globby } from 'globby' -import { - Project, - SyntaxKind, - Node, - JsxAttribute, - StringLiteral, - NoSubstitutionTemplateLiteral, -} from 'ts-morph' -import * as XLSX from 'xlsx' - -type CopyKind = - | 'text' - | 'placeholder' - | 'title' - | 'alt' - | 'aria' - | 'label' - | 'toast' - | 'dialog' - | 'error' - | 'validation' - -interface CopyItem { - route: string - file: string - componentOrFn: string - kind: CopyKind - keyOrLocator: string - text: string - line: number - notes?: string -} - -interface I18nKey { - key: string - value: string - context?: string - file: string - line: number -} - -const WORKDIR = process.cwd() -const SRC_DIR = path.join(WORKDIR, 'src') -const APP_DIR = path.join(SRC_DIR, 'app') - -function ensureExcelDir() { - const docsDir = path.join(WORKDIR, 'docs') - if (!fs.existsSync(docsDir)) fs.mkdirSync(docsDir, { recursive: true }) -} - -function isMeaningfulText(value: string | undefined | null): value is string { - if (!value) return false - const trimmed = value.replace(/\s+/g, ' ').trim() - if (!trimmed) return false - // Filter obvious code-like tokens - if (/^[A-Za-z0-9_.$-]+$/.test(trimmed) && trimmed.length > 24) return false - return true -} - -function getRouteForFile(absFilePath: string): string { - if (!absFilePath.startsWith(APP_DIR)) return 'shared' - let dir = path.dirname(absFilePath) - // Walk up to find nearest folder that contains a page.tsx (or page.ts) - while (dir.startsWith(APP_DIR)) { - const pageTsx = path.join(dir, 'page.tsx') - const pageTs = path.join(dir, 'page.ts') - if (fs.existsSync(pageTsx) || fs.existsSync(pageTs)) { - const rel = path.relative(APP_DIR, dir) - return rel || '/' - } - const parent = path.dirname(dir) - if (parent === dir) break - dir = parent - } - // Fallback: route is the first app subfolder segment - const relToApp = path.relative(APP_DIR, absFilePath) - const parts = relToApp.split(path.sep) - return parts.length > 0 ? parts[0] : 'shared' -} - -function getComponentOrFnName(node: Node): string { - const fn = node.getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) - if (fn?.getName()) return fn.getName()! - const varDecl = node.getFirstAncestorByKind(SyntaxKind.VariableDeclaration) - if (varDecl?.getName()) return varDecl.getName() - const cls = node.getFirstAncestorByKind(SyntaxKind.ClassDeclaration) - if (cls?.getName()) return cls.getName()! - const sf = node.getSourceFile() - return path.basename(sf.getFilePath()) -} - -function getNodeLine(node: Node): number { - const pos = node.getStartLineNumber() - return pos ?? 1 -} - -function getAttrName(attr: JsxAttribute): string { - return attr.getNameNode().getText() -} - -function getStringFromInitializer(attr: JsxAttribute): string | undefined { - const init = attr.getInitializer() - if (!init) return undefined - if (Node.isStringLiteral(init)) return init.getLiteralText() - if (Node.isNoSubstitutionTemplateLiteral(init)) return init.getLiteralText() - if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (!expr) return undefined - if (Node.isStringLiteral(expr)) return expr.getLiteralText() - if (Node.isNoSubstitutionTemplateLiteral(expr)) return expr.getLiteralText() - } - return undefined -} - -function pushItem(items: CopyItem[], item: CopyItem) { - if (!isMeaningfulText(item.text)) return - items.push(item) -} - -function generateI18nKey(item: CopyItem): string { - // 生成 i18next 格式的键名 - const route = item.route === 'shared' ? 'common' : item.route.replace(/[^a-zA-Z0-9]/g, '_') - const component = item.componentOrFn.replace(/[^a-zA-Z0-9]/g, '_') - const kind = item.kind - const locator = item.keyOrLocator.replace(/[^a-zA-Z0-9]/g, '_') - - return `${route}.${component}.${kind}.${locator}`.toLowerCase() -} - -async function collectFiles(): Promise { - const patterns = ['src/**/*.{ts,tsx}'] - const ignore = [ - '**/node_modules/**', - '**/.next/**', - '**/__tests__/**', - '**/mocks/**', - '**/mock/**', - '**/*.d.ts', - ] - return await globby(patterns, { gitignore: true, ignore }) -} - -function extractFromSourceFile(abs: string, items: CopyItem[], project: Project) { - const sf = project.addSourceFileAtPath(abs) - // JSX text nodes - sf.forEachDescendant((node) => { - if (Node.isJsxElement(node)) { - const opening = node.getOpeningElement() - const componentOrFn = getComponentOrFnName(node) - const route = getRouteForFile(abs) - // 递归提取所有 JsxText 与 {'...'} 字面量 - const tagName = opening.getTagNameNode().getText() - const textNodes = node.getDescendantsOfKind(SyntaxKind.JsxText) - textNodes.forEach((t) => { - const text = t.getText() - const cleaned = text.replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(t), - }) - } - }) - const exprs = node.getDescendantsOfKind(SyntaxKind.JsxExpression) - exprs.forEach((expr) => { - const inner = expr.getExpression() - if (inner && (Node.isStringLiteral(inner) || Node.isNoSubstitutionTemplateLiteral(inner))) { - const cleaned = inner.getLiteralText().replace(/\s+/g, ' ').trim() - if (isMeaningfulText(cleaned)) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'text', - keyOrLocator: tagName, - text: cleaned, - line: getNodeLine(expr), - }) - } - } - }) - } - - // JSX attributes - if (Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const tag = Node.isJsxOpeningElement(node) - ? node.getTagNameNode().getText() - : node.getTagNameNode().getText() - const attrs = node.getAttributes().filter(Node.isJsxAttribute) - attrs.forEach((attr) => { - const name = getAttrName(attr) - const lower = name.toLowerCase() - const value = getStringFromInitializer(attr) - if (!value) return - let kind: CopyKind | null = null - if (lower === 'placeholder') kind = 'placeholder' - else if (lower === 'title') kind = 'title' - else if (lower === 'alt') kind = 'alt' - else if (lower.startsWith('aria-')) kind = 'aria' - else if (lower === 'label') kind = 'label' - if (kind) { - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator: `${tag}.${name}`, - text: value, - line: getNodeLine(attr), - }) - } - }) - } - - // Interaction messages: toast.*, alert, confirm, message.* - if (Node.isCallExpression(node)) { - const route = getRouteForFile(abs) - const componentOrFn = getComponentOrFnName(node) - const expr = node.getExpression() - let kind: CopyKind | null = null - let keyOrLocator = '' - if (Node.isPropertyAccessExpression(expr)) { - const left = expr.getExpression().getText() - const name = expr.getName() - if (left === 'toast' || left === 'message') { - kind = 'toast' - keyOrLocator = `${left}.${name}` - } - if (left.toLowerCase().includes('dialog')) { - kind = 'dialog' - keyOrLocator = `${left}.${name}` - } - } else if (Node.isIdentifier(expr)) { - const id = expr.getText() - if (id === 'alert' || id === 'confirm') { - kind = 'dialog' - keyOrLocator = id - } - } - if (kind) { - const arg0 = node.getArguments()[0] - if (arg0 && (Node.isStringLiteral(arg0) || Node.isNoSubstitutionTemplateLiteral(arg0))) { - const text = (arg0 as StringLiteral | NoSubstitutionTemplateLiteral).getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind, - keyOrLocator, - text, - line: getNodeLine(node), - }) - } - } - - // form.setError("field", { message: "..." }) - if (Node.isPropertyAccessExpression(expr) && expr.getName() === 'setError') { - const args = node.getArguments() - if (args.length >= 2) { - const second = args[1] - if (Node.isObjectLiteralExpression(second)) { - const msgProp = second.getProperty('message') - if (msgProp && Node.isPropertyAssignment(msgProp)) { - const init = msgProp.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'error', - keyOrLocator: 'form.setError', - text, - line: getNodeLine(msgProp), - }) - } - } - } - } - } - - // Generic validation: any object literal { message: "..." } inside chained calls - const args = node.getArguments() - for (const a of args) { - if (Node.isObjectLiteralExpression(a)) { - const prop = a.getProperty('message') - if (prop && Node.isPropertyAssignment(prop)) { - const init = prop.getInitializer() - if ( - init && - (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) - ) { - const text = init.getLiteralText() - pushItem(items, { - route, - file: path.relative(WORKDIR, abs), - componentOrFn, - kind: 'validation', - keyOrLocator: 'message', - text, - line: getNodeLine(prop), - }) - } - } - } - } - } - }) -} - -function aggregate(items: CopyItem[]): CopyItem[] { - // Deduplicate by route+kind+text+keyOrLocator to keep first occurrence, count separately - const map = new Map() - for (const it of items) { - const key = `${it.route}__${it.kind}__${it.keyOrLocator}__${it.text}` - if (!map.has(key)) { - map.set(key, { item: it, count: 1 }) - } else { - map.get(key)!.count += 1 - } - } - const result: CopyItem[] = [] - for (const { item, count } of map.values()) { - ;(item as any).count = count - result.push(item) - } - return result -} - -function generateI18nTranslation(items: CopyItem[]): Record { - const translation: Record = {} - - items.forEach((item) => { - const key = generateI18nKey(item) - translation[key] = item.text - }) - - return translation -} - -function toWorkbook(items: CopyItem[]): XLSX.WorkBook { - const rows = items.map((it) => ({ - route: it.route, - file: it.file, - componentOrFn: it.componentOrFn, - kind: it.kind, - keyOrLocator: it.keyOrLocator, - text: it.text, - line: it.line, - count: (it as any).count ?? 1, - i18nKey: generateI18nKey(it), - notes: it.notes ?? '', - })) - const ws = XLSX.utils.json_to_sheet(rows, { skipHeader: false }) - const wb = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(wb, ws, 'i18n-scan') - return wb -} - -async function main() { - ensureExcelDir() - const files = await collectFiles() - const project = new Project({ - tsConfigFilePath: path.join(WORKDIR, 'tsconfig.json'), - skipAddingFilesFromTsConfig: true, - }) - const items: CopyItem[] = [] - for (const rel of files) { - const abs = path.join(WORKDIR, rel) - try { - extractFromSourceFile(abs, items, project) - } catch (e) { - // swallow parse errors but continue - } - } - const aggregated = aggregate(items) - - // 生成 i18next 格式的翻译文件 - const translation = generateI18nTranslation(aggregated) - const localesDir = path.join(WORKDIR, 'public', 'locales', 'en') - if (!fs.existsSync(localesDir)) { - fs.mkdirSync(localesDir, { recursive: true }) - } - const translationFile = path.join(localesDir, 'translation.json') - fs.writeFileSync(translationFile, JSON.stringify(translation, null, 2)) - - // 生成 Excel 报告 - const wb = toWorkbook(aggregated) - const out = path.join(WORKDIR, 'docs', 'i18n-scan-report.xlsx') - XLSX.writeFile(wb, out) - - // 生成扫描报告 - const report = { - totalItems: aggregated.length, - uniqueTexts: new Set(aggregated.map((item) => item.text)).size, - byRoute: aggregated.reduce( - (acc, item) => { - acc[item.route] = (acc[item.route] || 0) + 1 - return acc - }, - {} as Record - ), - byKind: aggregated.reduce( - (acc, item) => { - acc[item.kind] = (acc[item.kind] || 0) + 1 - return acc - }, - {} as Record - ), - translationKeys: Object.keys(translation).length, - } - - const reportFile = path.join(WORKDIR, 'docs', 'i18n-scan-report.json') - fs.writeFileSync(reportFile, JSON.stringify(report, null, 2)) - - // eslint-disable-next-line no-console - console.log(`✅ i18next 扫描完成!`) - console.log(`📊 总扫描条目: ${aggregated.length}`) - console.log(`🔑 生成翻译键: ${Object.keys(translation).length}`) - console.log(`📁 翻译文件: ${translationFile}`) - console.log(`📋 Excel 报告: ${out}`) - console.log(`📄 JSON 报告: ${reportFile}`) -} - -main().catch((err) => { - // eslint-disable-next-line no-console - console.error(err) - process.exitCode = 1 -}) diff --git a/scripts/reset-and-apply-translations.cjs b/scripts/reset-and-apply-translations.cjs deleted file mode 100644 index cd86125..0000000 --- a/scripts/reset-and-apply-translations.cjs +++ /dev/null @@ -1,363 +0,0 @@ -/* - CommonJS runtime for resetting files and applying translations from Excel to source code. - This script first resets files to their original state, then applies translations. -*/ -const path = require('node:path') -const fs = require('node:fs') -const { execSync } = require('child_process') -const { Project, SyntaxKind, Node } = require('ts-morph') -const XLSX = require('xlsx') - -const WORKDIR = process.cwd() -const TRANSLATES_FILE = path.join(WORKDIR, 'scripts', 'translates.xlsx') -const REPORT_FILE = path.join(WORKDIR, 'scripts', 'translation-report.json') -const CONFLICTS_FILE = path.join(WORKDIR, 'scripts', 'translation-conflicts.xlsx') - -// 统计信息 -const stats = { - total: 0, - success: 0, - conflicts: 0, - fileNotFound: 0, - textNotFound: 0, - multipleMatches: 0, -} - -// 冲突列表 -const conflicts = [] - -// 成功替换列表 -const successfulReplacements = [] - -function resetFiles() { - console.log('🔄 重置文件到原始状态...') - try { - // 使用 git 重置所有修改的文件 - execSync('git checkout -- .', { cwd: WORKDIR, stdio: 'inherit' }) - console.log('✅ 文件重置完成') - } catch (error) { - console.error('❌ 重置文件失败:', error.message) - process.exit(1) - } -} - -function loadTranslations() { - console.log('📖 读取翻译数据...') - const wb = XLSX.readFile(TRANSLATES_FILE) - const ws = wb.Sheets[wb.SheetNames[0]] - const data = XLSX.utils.sheet_to_json(ws, { defval: '' }) - - // 筛选出需要替换的条目 - let translations = data.filter( - (row) => row.text && row.corrected_text && row.text !== row.corrected_text - ) - - // 去重:按 file + line + text 去重,保留第一个 - const seen = new Set() - translations = translations.filter((row) => { - const key = `${row.file}:${row.line}:${row.text}` - if (seen.has(key)) { - return false - } - seen.add(key) - return true - }) - - console.log(`📊 找到 ${translations.length} 条需要替换的翻译(已去重)`) - stats.total = translations.length - - return translations -} - -function groupByFile(translations) { - const groups = new Map() - for (const translation of translations) { - const filePath = path.join(WORKDIR, translation.file) - if (!groups.has(filePath)) { - groups.set(filePath, []) - } - groups.get(filePath).push(translation) - } - return groups -} - -function findTextInFile(sourceFile, translation) { - const { text, kind } = translation - const matches = [] - - sourceFile.forEachDescendant((node) => { - // 根据 kind 类型进行不同的匹配 - if (kind === 'text') { - // 查找 JSX 文本节点 - if (Node.isJsxText(node)) { - const nodeText = node.getText().replace(/\s+/g, ' ').trim() - if (nodeText === text) { - matches.push({ node, type: 'jsx-text', line: node.getStartLineNumber() }) - } - } - // 查找 JSX 表达式中的字符串 - if (Node.isJsxExpression(node)) { - const expr = node.getExpression() - if (expr && (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr))) { - const nodeText = expr.getLiteralText() - if (nodeText === text) { - matches.push({ node: expr, type: 'jsx-expression', line: node.getStartLineNumber() }) - } - } - } - } else if (['placeholder', 'title', 'alt', 'label', 'aria'].includes(kind)) { - // 查找 JSX 属性 - if (Node.isJsxAttribute(node)) { - const name = node.getNameNode().getText().toLowerCase() - const value = getStringFromInitializer(node) - if (value === text) { - matches.push({ node, type: 'jsx-attribute', line: node.getStartLineNumber() }) - } - } - } else if (['toast', 'dialog', 'error', 'validation'].includes(kind)) { - // 查找函数调用中的字符串参数 - if (Node.isCallExpression(node)) { - const args = node.getArguments() - for (const arg of args) { - if (Node.isStringLiteral(arg) || Node.isNoSubstitutionTemplateLiteral(arg)) { - const nodeText = arg.getLiteralText() - if (nodeText === text) { - matches.push({ node: arg, type: 'function-arg', line: node.getStartLineNumber() }) - } - } - } - } - } - }) - - return matches -} - -function getStringFromInitializer(attr) { - const init = attr.getInitializer() - if (!init) return undefined - if (Node.isStringLiteral(init) || Node.isNoSubstitutionTemplateLiteral(init)) { - return init.getLiteralText() - } - if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (!expr) return undefined - if (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr)) { - return expr.getLiteralText() - } - } - return undefined -} - -function replaceText(node, newText, type) { - try { - if (type === 'jsx-text') { - // JSX 文本节点需要特殊处理,保持空白字符 - const originalText = node.getText() - const newTextWithWhitespace = originalText.replace(/\S+/g, newText) - node.replaceWithText(newTextWithWhitespace) - } else if (type === 'jsx-expression' || type === 'function-arg') { - // 字符串字面量 - if (Node.isStringLiteral(node)) { - node.replaceWithText(`"${newText}"`) - } else if (Node.isNoSubstitutionTemplateLiteral(node)) { - node.replaceWithText(`\`${newText}\``) - } - } else if (type === 'jsx-attribute') { - // JSX 属性值 - const init = node.getInitializer() - if (init) { - if (Node.isStringLiteral(init)) { - init.replaceWithText(`"${newText}"`) - } else if (Node.isNoSubstitutionTemplateLiteral(init)) { - init.replaceWithText(`\`${newText}\``) - } else if (Node.isJsxExpression(init)) { - const expr = init.getExpression() - if (expr && (Node.isStringLiteral(expr) || Node.isNoSubstitutionTemplateLiteral(expr))) { - if (Node.isStringLiteral(expr)) { - expr.replaceWithText(`"${newText}"`) - } else { - expr.replaceWithText(`\`${newText}\``) - } - } - } - } - } - return true - } catch (error) { - console.error(`❌ 替换失败: ${error.message}`) - return false - } -} - -function processFile(filePath, translations) { - if (!fs.existsSync(filePath)) { - console.log(`❌ 文件不存在: ${path.relative(WORKDIR, filePath)}`) - translations.forEach((t) => { - conflicts.push({ - ...t, - conflictType: 'FILE_NOT_FOUND', - conflictReason: '文件不存在', - }) - }) - stats.fileNotFound += translations.length - return - } - - console.log(`📝 处理文件: ${path.relative(WORKDIR, filePath)}`) - - try { - const project = new Project({ - tsConfigFilePath: path.join(WORKDIR, 'tsconfig.json'), - skipAddingFilesFromTsConfig: true, - }) - const sourceFile = project.addSourceFileAtPath(filePath) - - for (const translation of translations) { - const { text, corrected_text, line, kind } = translation - - // 在文件中查找匹配的文本 - const matches = findTextInFile(sourceFile, translation) - - if (matches.length === 0) { - conflicts.push({ - ...translation, - conflictType: 'TEXT_NOT_FOUND_IN_FILE', - conflictReason: '在文件中找不到匹配的文本', - }) - stats.textNotFound++ - continue - } - - if (matches.length > 1) { - conflicts.push({ - ...translation, - conflictType: 'MULTIPLE_MATCHES', - conflictReason: `找到 ${matches.length} 个匹配项,需要人工确认`, - }) - stats.multipleMatches++ - continue - } - - // 执行替换 - const match = matches[0] - const success = replaceText(match.node, corrected_text, match.type) - - if (success) { - successfulReplacements.push({ - ...translation, - actualLine: match.line, - replacementType: match.type, - }) - stats.success++ - console.log(`✅ 替换成功: "${text}" -> "${corrected_text}" (行 ${match.line})`) - } else { - conflicts.push({ - ...translation, - conflictType: 'REPLACEMENT_FAILED', - conflictReason: '替换操作失败', - }) - stats.conflicts++ - } - } - - // 保存修改后的文件 - sourceFile.saveSync() - } catch (error) { - console.error(`❌ 处理文件失败: ${filePath}`, error.message) - translations.forEach((t) => { - conflicts.push({ - ...t, - conflictType: 'PARSE_ERROR', - conflictReason: `文件解析失败: ${error.message}`, - }) - }) - stats.conflicts += translations.length - } -} - -function generateReport() { - console.log('\n📊 生成报告...') - - // 生成成功替换报告 - const report = { - timestamp: new Date().toISOString(), - stats, - successfulReplacements, - conflicts: conflicts.map((c) => ({ - file: c.file, - line: c.line, - text: c.text, - corrected_text: c.corrected_text, - conflictType: c.conflictType, - conflictReason: c.conflictReason, - })), - } - - fs.writeFileSync(REPORT_FILE, JSON.stringify(report, null, 2)) - console.log(`📄 成功替换报告已保存: ${REPORT_FILE}`) - - // 生成冲突报告 Excel - if (conflicts.length > 0) { - const conflictRows = conflicts.map((c) => ({ - file: c.file, - line: c.line, - text: c.text, - corrected_text: c.corrected_text, - conflictType: c.conflictType, - conflictReason: c.conflictReason, - route: c.route, - componentOrFn: c.componentOrFn, - kind: c.kind, - keyOrLocator: c.keyOrLocator, - })) - - const ws = XLSX.utils.json_to_sheet(conflictRows) - const wb = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(wb, ws, 'conflicts') - XLSX.writeFile(wb, CONFLICTS_FILE) - console.log(`📄 冲突报告已保存: ${CONFLICTS_FILE}`) - } -} - -function printSummary() { - console.log('\n📈 处理完成!') - console.log(`总翻译条目: ${stats.total}`) - console.log(`✅ 成功替换: ${stats.success}`) - console.log(`❌ 文件不存在: ${stats.fileNotFound}`) - console.log(`❌ 文本未找到: ${stats.textNotFound}`) - console.log(`❌ 多处匹配: ${stats.multipleMatches}`) - console.log(`❌ 其他冲突: ${stats.conflicts}`) - console.log(`\n成功率: ${((stats.success / stats.total) * 100).toFixed(1)}%`) -} - -async function main() { - console.log('🚀 开始重置并应用翻译...\n') - - try { - // 1. 重置文件到原始状态 - resetFiles() - - // 2. 读取翻译数据 - const translations = loadTranslations() - - // 3. 按文件分组 - const fileGroups = groupByFile(translations) - - // 4. 处理每个文件 - for (const [filePath, fileTranslations] of fileGroups) { - processFile(filePath, fileTranslations) - } - - // 5. 生成报告 - generateReport() - - // 6. 打印总结 - printSummary() - } catch (error) { - console.error('❌ 执行失败:', error) - process.exitCode = 1 - } -} - -main() diff --git a/scripts/translates.xlsx b/scripts/translates.xlsx deleted file mode 100644 index 872257968d1e3902786e92ec561c3d2fda55def8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160879 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%0DQ?}i1*1rvxx)Qq9_~a#W070x8nuA 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�#b2mdcahEy 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 z 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 console.log('上传成功:', url), onError: (error) => console.error('上传失败:', error), onProgress: (progress) => console.log('进度:', progress.percentage + '%') }) // 使用 await uploadFile(file)", - "corrected_text": "Import { useS3Upload } from '@/hooks/useS3Upload' import { BizTypeEnum } from '@/services/common/types' const { uploading, progress, error, uploadFile } = useS3Upload({ bizType: BizTypeEnum.Role, maxRetries: 3, retryDelay: 2000, onSuccess: (url) => console.log('上传成功:', url), onError: (error) => console.error('上传失败:', error), onProgress: (progress) => console.log('进度:', progress.percentage + '%') }) // 使用 await uploadFile(file)", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/components/features/device-info.tsx", - "line": 41, - "text": " 设备信息", - "corrected_text": " Device information", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/components/features/device-info.tsx", - "line": 82, - "text": " 设备ID说明", - "corrected_text": " Device ID Description", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/components/features/genderInput.tsx", - "line": 20, - "text": true, - "corrected_text": "True", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/creator/creator-page.tsx", - "line": 40, - "text": "gift", - "corrected_text": "Gift", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 38, - "text": " 整体渐变:", - "corrected_text": " Overall gradual change:", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 39, - "text": " 涟漪扩散:", - "corrected_text": " Ripple diffusion:", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 40, - "text": "动画停止时所有声波条统一为短高度", - "corrected_text": "When the animation stops, all sound bars are unified to a short height", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 41, - "text": " 平滑过渡:", - "corrected_text": " Smooth transition:", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 123, - "text": "import { VoiceWaveAnimation } from \"@/components/ui/voice-wave-animation\"; // 基础使用 // 自定义声波条数量 // 停止动画时的效果 ", - "corrected_text": "Import { VoiceWaveAnimation } from \"@/components/ui/voice-wave-animation\"; // 基础使用 // 自定义声波条数量 // 停止动画时的效果 ", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/test-voice-wave/page.tsx", - "line": 148, - "text": "动画停止时所有声波条统一为短高度", - "corrected_text": "When the animation stops, all sound bars are unified to a short height", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/vip/vip-page.tsx", - "line": 40, - "text": "Crush Level VIP", - "corrected_text": "CrushLevel VIP", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/vip/vip-page.tsx", - "line": 45, - "text": "Crush Level VIP", - "corrected_text": "CrushLevel VIP", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(auth)/login/components/DiscordButton.tsx", - "line": 34, - "text": "Discord登录失败", - "corrected_text": "Login failed", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(auth)/share/[userId]/share-page.tsx", - "line": 124, - "text": "chat", - "corrected_text": "Chat", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/create/components/ImageForm.tsx", - "line": 45, - "text": "请上传或生成一张图片", - "corrected_text": "Please upload or generate an image", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/create/components/ImageForm.tsx", - "line": 418, - "text": "you have reached the maximum number of AI creations.", - "corrected_text": "You have reached the maximum number of AI creations.", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/generate/components/GenaralImageCard.tsx", - "line": 29, - "text": "image", - "corrected_text": "Image", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/generate/components/GeneralBuyTimesDialog.tsx", - "line": 106, - "text": "diamond", - "corrected_text": "Diamond", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/generate/components/GeneralImageWithCountButton.tsx", - "line": 60, - "text": "vip", - "corrected_text": "Vip", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/edit/[aiId]/image/image-page.tsx", - "line": 34, - "text": "请上传或生成一张图片", - "corrected_text": "Please upload or generate an image", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/home/components/Meet/MeetCard.tsx", - "line": 172, - "text": true, - "corrected_text": "True", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/user/[userId]/components/AlbumImageViewerAction.tsx", - "line": 111, - "text": "diamond", - "corrected_text": "Diamond", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/wallet/charge/result/result-page.tsx", - "line": 69, - "text": "pending", - "corrected_text": "Pending", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/wallet/components/Dashboard/IncomeCard.tsx", - "line": 43, - "text": "diamond-icon", - "corrected_text": "Diamond-icon", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 2 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/chat/[aiId]/components/ChatDrawers/ChatButtleDrawer.tsx", - "line": 98, - "text": "vip", - "corrected_text": "Vip", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/chat/[aiId]/components/ChatDrawers/ChatModelDrawer.tsx", - "line": 61, - "text": "diamond", - "corrected_text": "Diamond", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 3 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/chat/[aiId]/components/ChatDrawers/CrushLevelRetrieveDrawer.tsx", - "line": 118, - "text": "Crush Level", - "corrected_text": "CrushLevel", - "conflictType": "MULTIPLE_MATCHES", - "conflictReason": "找到 4 个匹配项,需要人工确认" - }, - { - "file": "src/app/(main)/chat/[aiId]/components/ChatMessageAction/ChatInput.tsx", - "line": 109, - "text": "图片上传失败,请重试", - "corrected_text": "Image upload failed, please try again.", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - }, - { - "file": "src/app/(main)/chat/[aiId]/components/ChatMessageAction/ChatInput.tsx", - "line": 303, - "text": "图片处理失败,请重试", - "corrected_text": "Image processing failed, please try again.", - "conflictType": "TEXT_NOT_FOUND_IN_FILE", - "conflictReason": "在文件中找不到匹配的文本" - } - ] -} diff --git a/src/app/(auth)/about/page.tsx b/src/app/(auth)/about/page.tsx index 0e8f5bd..b9482f4 100644 --- a/src/app/(auth)/about/page.tsx +++ b/src/app/(auth)/about/page.tsx @@ -23,11 +23,11 @@ const AboutPage = () => {
- Grow your love story with CrushLevel AI—From "Hi" to "I Do", sparked by every chat + Grow your love story with Spicyxx.AI—From "Hi" to "I Do", sparked by every chat
- At CrushLevel AI, every chat writes a new verse in your love epic— + At Spicyxx.AI, every chat writes a new verse in your love epic—
From that tentative "Hi" to the trembling "I do", find a home for the flirts you never diff --git a/src/app/(main)/chat/[id]/Drawer/MaskCreate.tsx b/src/app/(main)/chat/[id]/Drawer/MaskCreate.tsx index 6c826be..2a77e14 100644 --- a/src/app/(main)/chat/[id]/Drawer/MaskCreate.tsx +++ b/src/app/(main)/chat/[id]/Drawer/MaskCreate.tsx @@ -6,7 +6,7 @@ import { ActiveTabType } from '.'; export default function MaskCreate({ onActiveTab }: { onActiveTab: (tab: ActiveTabType) => void }) { return (
- onActiveTab('mask')} /> + onActiveTab('mask_list')} />
); } diff --git a/src/app/(main)/chat/[id]/Drawer/Profile.tsx b/src/app/(main)/chat/[id]/Drawer/Profile.tsx index 98bcd5d..88247d6 100644 --- a/src/app/(main)/chat/[id]/Drawer/Profile.tsx +++ b/src/app/(main)/chat/[id]/Drawer/Profile.tsx @@ -29,44 +29,56 @@ const ChatProfilePersona = React.memo(({ onActiveTab }: ProfileProps) => { const tCommon = useTranslations('common'); const whoAmI = 'whoAmI'; + const items = [ + { + label: t('profile.gender'), + value: ( + gender + ), + }, + { + label: t('profile.age'), + value: 18, + }, + { + label: t('profile.whoAmI'), + className: whoAmI ? 'text-txt-primary-normal' : 'text-txt-secondary-normal', + value: whoAmI || t('profile.unfilled'), + }, + ]; + return (
{t('maskedIdentityMode')}
onActiveTab('mask')} + onClick={() => onActiveTab('mask_create')} > {tCommon('edit')}
+
onActiveTab('mask_list')} + className="bg-surface-element-normal cursor-pointer rounded-m flex items-center justify-between gap-4 px-4 py-3" + > +
{t('profile.nickname')}
+
+ {'John Doe'} + +
+
+
-
-
{t('profile.nickname')}
-
{''}
-
-
-
{t('profile.gender')}
-
- {genderMap[0 as keyof typeof genderMap]} + {items.map((item) => ( +
+
{item.label}
+
+ {item.value} +
-
-
-
{t('profile.age')}
-
{getAge(Number(23))}
-
-
-
{t('profile.whoAmI')}
-
- {whoAmI || t('profile.unfilled')} -
-
+ ))}
); diff --git a/src/app/(main)/chat/[id]/Drawer/index.tsx b/src/app/(main)/chat/[id]/Drawer/index.tsx index 6b6a3f9..33b1014 100644 --- a/src/app/(main)/chat/[id]/Drawer/index.tsx +++ b/src/app/(main)/chat/[id]/Drawer/index.tsx @@ -29,7 +29,7 @@ type SettingProps = { }; export type ActiveTabType = | 'profile' - | 'mask' + | 'mask_list' | 'mask_create' | 'history' | 'voice_actor' @@ -38,24 +38,13 @@ export type ActiveTabType = | 'background' | 'model'; -const backMap = { - mask: 'profile', - mask_create: 'mask', - history: 'profile', - voice_actor: 'profile', - font: 'profile', - max_token: 'profile', - background: 'profile', - model: 'profile', -} as const; - export default function SettingDialog({ open, onOpenChange }: SettingProps) { const t = useTranslations('chat.drawer'); const [activeTab, setActiveTab] = useState('profile'); const updateUserChatSetting = useStreamChatStore((store) => store.updateUserChatSetting); const titleMap = { - mask: t('maskedIdentityMode'), + mask_list: t('maskedIdentityMode'), mask_create: t('createMask'), history: t('history'), voice_actor: t('voiceActorTitle'), @@ -82,18 +71,14 @@ export default function SettingDialog({ open, onOpenChange }: SettingProps) { titleMap[activeTab] )} {activeTab !== 'profile' && ( - setActiveTab(backMap[activeTab])} - > + setActiveTab('profile')}> )}
{activeTab === 'profile' && } - {activeTab === 'mask' && } + {activeTab === 'mask_list' && } {activeTab === 'mask_create' && } {activeTab === 'voice_actor' && } {activeTab === 'font' && } diff --git a/src/app/(main)/vip/components/SubscribeVipDrawer/index.tsx b/src/app/(main)/vip/components/SubscribeVipDrawer/index.tsx index 8e625fd..9957aab 100644 --- a/src/app/(main)/vip/components/SubscribeVipDrawer/index.tsx +++ b/src/app/(main)/vip/components/SubscribeVipDrawer/index.tsx @@ -154,7 +154,7 @@ const SubscribeVipDrawer = () => { onClick={handleClose} /> - CrushLevel Vip + Spicyxx.AI Vip
diff --git a/src/app/(main)/vip/vip-page.tsx b/src/app/(main)/vip/vip-page.tsx index f151d3e..1564f3e 100644 --- a/src/app/(main)/vip/vip-page.tsx +++ b/src/app/(main)/vip/vip-page.tsx @@ -48,13 +48,13 @@ const VipPage = () => { iconfont="icon-arrow-left" onClick={handleBack} /> -

CrushLevel VIP

+

Spicyxx.AI VIP

{/* Hero Section */}

- CrushLevel VIP + Spicyxx.AI VIP

diff --git a/src/app/(main)/wallet/components/RechargeList.tsx b/src/app/(main)/wallet/components/RechargeList.tsx index 6537081..ccbd100 100644 --- a/src/app/(main)/wallet/components/RechargeList.tsx +++ b/src/app/(main)/wallet/components/RechargeList.tsx @@ -1,48 +1,48 @@ -'use client' +'use client'; -import { Button } from '@/components/ui/button' -import { Checkbox } from '@/components/ui/checkbox' +import { Button } from '@/components/ui/button'; +import { Checkbox } from '@/components/ui/checkbox'; import { useGetChargeProductList, useGetWebChargePreOrder, useGetWebChargeCheckout, useUpdateWalletBalance, -} from '@/hooks/useWallet' -import Image from 'next/image' -import Link from 'next/link' -import { useState, useEffect } from 'react' -import Decimal from 'decimal.js' -import numeral from 'numeral' -import { toast } from 'sonner' -import RechargeListSkeleton from './RechargeListSkeleton' -import { formatFromCents } from '@/utils/number' -import QueryString from 'qs' +} from '@/hooks/useWallet'; +import Image from 'next/image'; +import Link from 'next/link'; +import { useState, useEffect } from 'react'; +import Decimal from 'decimal.js'; +import numeral from 'numeral'; +import { toast } from 'sonner'; +import RechargeListSkeleton from './RechargeListSkeleton'; +import { formatFromCents } from '@/utils/number'; +import QueryString from 'qs'; const RechargeList = () => { - const [policyCheck, setpolicyCheck] = useState(true) - const [selectedProductId, setSelectedProductId] = useState(null) + const [policyCheck, setpolicyCheck] = useState(true); + const [selectedProductId, setSelectedProductId] = useState(null); - const { data, isLoading } = useGetChargeProductList() - const { productList } = data || {} + const { data, isLoading } = useGetChargeProductList(); + const { productList } = data || {}; // 支付相关的hooks - const preOrderMutation = useGetWebChargePreOrder() - const checkoutMutation = useGetWebChargeCheckout() + const preOrderMutation = useGetWebChargePreOrder(); + const checkoutMutation = useGetWebChargeCheckout(); // 默认选中第一个产品 useEffect(() => { if (productList && productList.length > 0 && !selectedProductId) { - setSelectedProductId(productList[0].productId || null) + setSelectedProductId(productList[0].productId || null); } - }, [productList, selectedProductId]) + }, [productList, selectedProductId]); - const selectedProduct = productList?.find((p) => p.productId === selectedProductId) - const selectedProductAmount = formatFromCents(selectedProduct?.payAmount || 0, 2) + const selectedProduct = productList?.find((p) => p.productId === selectedProductId); + const selectedProductAmount = formatFromCents(selectedProduct?.payAmount || 0, 2); // 支付处理函数 const handlePayment = async () => { if (!selectedProductId || !policyCheck) { - return + return; } try { @@ -50,45 +50,45 @@ const RechargeList = () => { const preOrderResponse = await preOrderMutation.mutateAsync({ productId: selectedProductId, version: 1, - }) + }); if (!preOrderResponse.tradeNo) { - throw new Error('预下单失败:未获取到交易号') + throw new Error('预下单失败:未获取到交易号'); } // 2. 结账 - const baseURL = `${process.env.NEXT_PUBLIC_APP_URL}/wallet/charge/result` + const baseURL = `${process.env.NEXT_PUBLIC_APP_URL}/wallet/charge/result`; const params = QueryString.stringify({ redirectURL: '/wallet?back=1', back: 1, - }) - const returnUrl = `${baseURL}?${params}` - const cancelUrl = `${baseURL}?${params}` + }); + const returnUrl = `${baseURL}?${params}`; + const cancelUrl = `${baseURL}?${params}`; const checkoutResponse = await checkoutMutation.mutateAsync({ tradeNo: preOrderResponse.tradeNo, payChannel: 'STRIPE', returnUrl, cancelUrl, - }) + }); // 3. 跳转到支付页面 if (checkoutResponse.paymentUrl) { - window.location.href = checkoutResponse.paymentUrl + window.location.href = checkoutResponse.paymentUrl; } else { - throw new Error('支付链接获取失败') + throw new Error('支付链接获取失败'); } } catch (error) { - toast.error('Payment failure, please try again') + toast.error('Payment failure, please try again'); } - } + }; // 检查是否可以支付 const canPay = - selectedProductId && policyCheck && !preOrderMutation.isPending && !checkoutMutation.isPending + selectedProductId && policyCheck && !preOrderMutation.isPending && !checkoutMutation.isPending; // 显示加载状态 if (isLoading) { - return + return ; } return ( @@ -98,7 +98,7 @@ const RechargeList = () => {
{productList?.map((product) => { - const isSelected = selectedProductId === product.productId + const isSelected = selectedProductId === product.productId; return (
{ ${formatFromCents(product.payAmount, 2)}
- ) + ); })}
@@ -143,14 +143,14 @@ const RechargeList = () => { By recharging, you agree to the{' '} e.stopPropagation()}> - CrushLevel Recharge Service Agreement + Spicyxx.AI Recharge Service Agreement
- ) -} + ); +}; -export default RechargeList +export default RechargeList; diff --git a/src/app/page.tsx b/src/app/page.tsx index 68e0af2..acbfa7d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,11 +2,11 @@ import type { Metadata } from 'next'; import { redirect } from 'next/navigation'; export const metadata: Metadata = { - title: 'CrushLevel AI - Grow Your Love Story', + title: 'Spicyxx.AI - Grow Your Love Story', description: - "Grow your love story with CrushLevel AI—From 'Hi' to 'I Do', sparked by every chat. Create, chat, and connect with AI companions.", + "Grow your love story with Spicyxx.AI—From 'Hi' to 'I Do', sparked by every chat. Create, chat, and connect with AI companions.", keywords: [ - 'CrushLevel', + 'Spicyxx.AI', 'AI companion', 'AI chat', 'virtual girlfriend', @@ -18,17 +18,17 @@ export const metadata: Metadata = { 'AI conversation', ], openGraph: { - title: 'CrushLevel AI - Grow Your Love Story', + title: 'Spicyxx.AI - Grow Your Love Story', description: - "Grow your love story with CrushLevel AI—From 'Hi' to 'I Do', sparked by every chat. Create, chat, and connect with AI companions.", + "Grow your love story with Spicyxx.AI—From 'Hi' to 'I Do', sparked by every chat. Create, chat, and connect with AI companions.", url: 'https://www.crushlevel.com', - siteName: 'CrushLevel AI', + siteName: 'Spicyxx.AI', images: [ { url: '/logo.svg', width: 1200, height: 630, - alt: 'CrushLevel AI - Grow Your Love Story', + alt: 'Spicyxx.AI - Grow Your Love Story', }, ], locale: 'en_US', @@ -36,9 +36,8 @@ export const metadata: Metadata = { }, twitter: { card: 'summary_large_image', - title: 'CrushLevel AI - Grow Your Love Story', - description: - "Grow your love story with CrushLevel AI—From 'Hi' to 'I Do', sparked by every chat.", + title: 'Spicyxx.AI - Grow Your Love Story', + description: "Grow your love story with Spicyxx.AI—From 'Hi' to 'I Do', sparked by every chat.", images: ['/logo.svg'], site: '@crushlevel', }, diff --git a/src/atoms/im.ts b/src/atoms/im.ts deleted file mode 100644 index 0062618..0000000 --- a/src/atoms/im.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { atom } from 'jotai' -import { V2NIMConversation } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMConversationService' -import { V2NIMUser } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMUserService' -import { V2NIMMessage } from 'nim-web-sdk-ng/dist/v2/NIM_BROWSER_SDK/V2NIMMessageService' -import { QueueMap } from '@/lib/queue' -import { VipType } from '@/services/wallet' - -/** - * 点赞状态枚举 - */ -export enum MessageLikeStatus { - None = 'none', // 未点赞/踩 - Liked = 'liked', // 已点赞 - Disliked = 'disliked', // 已踩 -} - -/** - * 消息服务端扩展字段接口(简化版) - */ -export interface MessageServerExtension { - [userId: string]: MessageLikeStatus // 用户ID -> 点赞状态的直接映射 -} - -/** - * 消息扩展字段接口 (废弃,改用serverExtension) - * @deprecated 使用 MessageServerExtension 替代 - */ -export interface MessageExtension { - likeStatus?: MessageLikeStatus // 当前用户对该消息的点赞状态 - likeCount?: number // 点赞总数 - dislikeCount?: number // 踩总数 - [key: string]: any // 其他扩展字段 -} - -/** - * 扩展消息类型,包含是否为新消息的标识 - */ -export interface ExtendedMessage extends V2NIMMessage { - isNewMessage?: boolean // 标识是否是新收到的消息(需要打字效果) - isLoadingMessage?: boolean // 标识是否是loading消息 -} - -/** - * 解析消息的serverExtension字段 - */ -export const parseMessageServerExtension = (serverExtension?: string): MessageServerExtension => { - if (!serverExtension) return {} - try { - return JSON.parse(serverExtension) as MessageServerExtension - } catch { - return {} - } -} - -/** - * 将MessageServerExtension对象序列化为JSON字符串 - */ -export const stringifyMessageServerExtension = (extension: MessageServerExtension): string => { - return JSON.stringify(extension) -} - -/** - * 获取用户对消息的点赞状态 - */ -export const getUserLikeStatus = (message: ExtendedMessage, userId: string): MessageLikeStatus => { - const serverExt = parseMessageServerExtension(message.serverExtension) - return serverExt[userId] || MessageLikeStatus.None -} - -/** - * 登录状态 - */ -export const imSyncedAtom = atom(false) - -/** - * IM重连状态 - */ -export enum IMReconnectStatus { - CONNECTED = 'connected', // 已连接 - DISCONNECTED = 'disconnected', // 已断开 - RECONNECTING = 'reconnecting', // 重连中 - FAILED = 'failed', // 重连失败 -} - -export const imReconnectStatusAtom = atom(IMReconnectStatus.DISCONNECTED) - -/** - * 会话列表 - */ -export const conversationListAtom = atom>(new Map()) - -/** - * 用户信息 - */ -export const userListAtom = atom>(new Map()) - -/** - * 消息列表 - */ -export const msgListAtom = atom(new QueueMap(20, 'rightToLeft')) - -/** - * 选中的会话 - */ -export const selectedConversationIdAtom = atom(null) - -/** - * 聊天状态管理 - */ -export const isWaitingForReplyAtom = atom(false) // 是否正在等待AI回复 - -/** - * 通话状态管理 - */ -export const hasReceivedAiGreetingAtom = atom(false) // 是否已收到AI开场白 -export const hasStartAICallAtom = atom(false) // 是否已开始AI通话 - -export const isCoinInsufficientAtom = atom(false) // 是否钻石不足 -export const isChargeDrawerOpenAtom = atom(false) // 是否打开充值抽屉 -export const isVipDrawerOpenAtom = atom<{ open: boolean; vipType?: VipType }>({ - open: false, - vipType: undefined, -}) // 是否打开会员抽屉 - -export const isCallAtom = atom(false) // 是否正在通话 - -/** - * 已删除消息的会话列表 - 用于控制开场白显示 - */ -export const deletedConversationsAtom = atom>(new Set()) diff --git a/src/components/features/album-price-setting.tsx b/src/components/features/album-price-setting.tsx index 1e56c27..47fbc89 100644 --- a/src/components/features/album-price-setting.tsx +++ b/src/components/features/album-price-setting.tsx @@ -1,6 +1,6 @@ -'use client' -import { useEffect, useState } from 'react' -import { useForm } from 'react-hook-form' +'use client'; +import { useEffect, useState } from 'react'; +import { useForm } from 'react-hook-form'; import { AlertDialog, AlertDialogContent, @@ -9,20 +9,20 @@ import { AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, -} from '../ui/alert-dialog' -import { IconButton, Button } from '../ui/button' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select' -import { Input } from '../ui/input' -import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '../ui/form' -import Image from 'next/image' -import { z } from 'zod' -import { zodResolver } from '@hookform/resolvers/zod' -import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip' -import Decimal from 'decimal.js' +} from '../ui/alert-dialog'; +import { IconButton, Button } from '../ui/button'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; +import { Input } from '../ui/input'; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '../ui/form'; +import Image from 'next/image'; +import { z } from 'zod'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'; +import Decimal from 'decimal.js'; export interface AlbumPriceFormData { - unlockMethod: 'pay' | 'free' - price?: string + unlockMethod: 'pay' | 'free'; + price?: string; } const schema = z @@ -35,48 +35,48 @@ const schema = z // 如果选择了 "pay",price 必须填写且有效 if (data.unlockMethod === 'pay') { if (!data.price || data.price.trim() === '') { - return false + return false; } if (Number(data.price) < 20) { - return false + return false; } } - return true + return true; }, { message: 'At least 20 diamonds', path: ['price'], } - ) + ); interface AlbumPriceSettingProps { - defaultUnlockPrice?: number - onConfirm: (data: AlbumPriceFormData) => Promise - children?: React.ReactNode + defaultUnlockPrice?: number; + onConfirm: (data: AlbumPriceFormData) => Promise; + children?: React.ReactNode; } const AlbumPriceSetting = ({ defaultUnlockPrice, onConfirm, children }: AlbumPriceSettingProps) => { - const [isOpen, setIsOpen] = useState(false) - const [isLoading, setIsLoading] = useState(false) + const [isOpen, setIsOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); - console.log('defaultUnlockPrice', defaultUnlockPrice) + console.log('defaultUnlockPrice', defaultUnlockPrice); useEffect(() => { if (isOpen) { if (defaultUnlockPrice === undefined) { - form.setValue('unlockMethod', 'pay') - form.setValue('price', '20') - return + form.setValue('unlockMethod', 'pay'); + form.setValue('price', '20'); + return; } if (defaultUnlockPrice) { - form.setValue('unlockMethod', 'pay') - form.setValue('price', new Decimal(defaultUnlockPrice).div(100).toString()) + form.setValue('unlockMethod', 'pay'); + form.setValue('price', new Decimal(defaultUnlockPrice).div(100).toString()); } else { - form.setValue('unlockMethod', 'free') - form.setValue('price', '') + form.setValue('unlockMethod', 'free'); + form.setValue('price', ''); } } - }, [isOpen, defaultUnlockPrice]) + }, [isOpen, defaultUnlockPrice]); const form = useForm({ resolver: zodResolver(schema), @@ -84,40 +84,40 @@ const AlbumPriceSetting = ({ defaultUnlockPrice, onConfirm, children }: AlbumPri unlockMethod: 'pay', price: '', }, - }) - const unlockMethod = form.watch('unlockMethod') + }); + const unlockMethod = form.watch('unlockMethod'); useEffect(() => { if (unlockMethod === 'free') { - const priceValue = form.getValues('price') + const priceValue = form.getValues('price'); if (!priceValue) { - form.setValue('price', '20') + form.setValue('price', '20'); } } - }, [unlockMethod]) + }, [unlockMethod]); const handleSubmit = async (data: AlbumPriceFormData) => { - setIsLoading(true) + setIsLoading(true); try { - console.log('保存数据:', data) + console.log('保存数据:', data); const result = { unlockMethod: data.unlockMethod, price: data.unlockMethod === 'pay' ? data.price : undefined, - } - await onConfirm(result) - setIsOpen(false) - form.reset() + }; + await onConfirm(result); + setIsOpen(false); + form.reset(); } catch (error) { - console.error('保存失败:', error) + console.error('保存失败:', error); } finally { - setIsLoading(false) + setIsLoading(false); } - } + }; const handleCancel = () => { - setIsOpen(false) - form.reset() - } + setIsOpen(false); + form.reset(); + }; return ( @@ -159,7 +159,7 @@ const AlbumPriceSetting = ({ defaultUnlockPrice, onConfirm, children }: AlbumPri the revenue.

- CrushLevel keeps 20% of each image's sales as a service fee. + Spicyxx.AI keeps 20% of each image's sales as a service fee.

Offering a few free images can encourage users to interact with @@ -203,25 +203,25 @@ const AlbumPriceSetting = ({ defaultUnlockPrice, onConfirm, children }: AlbumPri type="text" placeholder="20~9999" onInput={(e) => { - const target = e.target as HTMLInputElement + const target = e.target as HTMLInputElement; // 只允许输入数字 - let value = target.value.replace(/[^0-9]/g, '') + let value = target.value.replace(/[^0-9]/g, ''); // 如果为空,允许继续输入 if (value === '') { - target.value = '' - field.onChange('') - return + target.value = ''; + field.onChange(''); + return; } // 转换为数字并限制范围 - const numValue = parseInt(value) + const numValue = parseInt(value); if (numValue > 99999) { - value = '99999' + value = '99999'; } - target.value = value - field.onChange(value) + target.value = value; + field.onChange(value); }} prefixIcon={

@@ -268,7 +268,7 @@ const AlbumPriceSetting = ({ defaultUnlockPrice, onConfirm, children }: AlbumPri - ) -} + ); +}; -export default AlbumPriceSetting +export default AlbumPriceSetting; diff --git a/src/components/features/charge-drawer.tsx b/src/components/features/charge-drawer.tsx index 8788e0d..3023785 100644 --- a/src/components/features/charge-drawer.tsx +++ b/src/components/features/charge-drawer.tsx @@ -1,12 +1,12 @@ -'use client' +'use client'; import { useGetChargeProductList, useGetWalletBalance, useGetWebChargeCheckout, useGetWebChargePreOrder, -} from '@/hooks/useWallet' -import { Button, IconButton } from '../ui/button' +} from '@/hooks/useWallet'; +import { Button, IconButton } from '../ui/button'; import { Drawer, DrawerContent, @@ -14,57 +14,57 @@ import { DrawerFooter, DrawerHeader, DrawerTitle, -} from '../ui/drawer' -import { useEffect, useState } from 'react' -import { formatFromCents } from '@/utils/number' -import Image from 'next/image' -import { Checkbox } from '../ui/checkbox' -import Link from 'next/link' -import { toast } from 'sonner' -import { Skeleton } from '../ui/skeleton' -import { usePathname, useSearchParams } from 'next/navigation' -import QueryString from 'qs' -import { useAtom } from 'jotai' -import { isChargeDrawerOpenAtom } from '@/atoms/im' -import { useCurrentUser } from '@/hooks/auth' +} from '../ui/drawer'; +import { useEffect, useState } from 'react'; +import { formatFromCents } from '@/utils/number'; +import Image from 'next/image'; +import { Checkbox } from '../ui/checkbox'; +import Link from 'next/link'; +import { toast } from 'sonner'; +import { Skeleton } from '../ui/skeleton'; +import { usePathname, useSearchParams } from 'next/navigation'; +import QueryString from 'qs'; +import { useAtom } from 'jotai'; +import { isChargeDrawerOpenAtom } from '@/atoms/im'; +import { useCurrentUser } from '@/hooks/auth'; const ChargeDrawer = () => { - const [isChargeDrawerOpen, setIsChargeDrawerOpen] = useAtom(isChargeDrawerOpenAtom) - const [policyCheck, setpolicyCheck] = useState(true) - const [selectedProductId, setSelectedProductId] = useState(null) + const [isChargeDrawerOpen, setIsChargeDrawerOpen] = useAtom(isChargeDrawerOpenAtom); + const [policyCheck, setpolicyCheck] = useState(true); + const [selectedProductId, setSelectedProductId] = useState(null); - const { data, isLoading } = useGetChargeProductList() - const { productList } = data || {} - const pathname = usePathname() - const searchParams = useSearchParams() + const { data, isLoading } = useGetChargeProductList(); + const { productList } = data || {}; + const pathname = usePathname(); + const searchParams = useSearchParams(); // 初始化获取钱包余额 - useGetWalletBalance() + useGetWalletBalance(); // 支付相关的hooks - const preOrderMutation = useGetWebChargePreOrder() - const checkoutMutation = useGetWebChargeCheckout() + const preOrderMutation = useGetWebChargePreOrder(); + const checkoutMutation = useGetWebChargeCheckout(); // 默认选中第一个产品 useEffect(() => { if (productList && productList.length > 0 && !selectedProductId) { - setSelectedProductId(productList[0].productId || null) + setSelectedProductId(productList[0].productId || null); } - }, [productList, selectedProductId]) + }, [productList, selectedProductId]); - const selectedProduct = productList?.find((p) => p.productId === selectedProductId) - const selectedProductAmount = formatFromCents(selectedProduct?.payAmount || 0, 2) + const selectedProduct = productList?.find((p) => p.productId === selectedProductId); + const selectedProductAmount = formatFromCents(selectedProduct?.payAmount || 0, 2); const canPay = - selectedProductId && policyCheck && !preOrderMutation.isPending && !checkoutMutation.isPending + selectedProductId && policyCheck && !preOrderMutation.isPending && !checkoutMutation.isPending; const handleClose = () => { - setIsChargeDrawerOpen(false) - } + setIsChargeDrawerOpen(false); + }; // 支付处理函数 const handlePayment = async () => { if (!selectedProductId || !policyCheck) { - return + return; } try { @@ -72,21 +72,21 @@ const ChargeDrawer = () => { const preOrderResponse = await preOrderMutation.mutateAsync({ productId: selectedProductId, version: 1, - }) + }); if (!preOrderResponse.tradeNo) { - throw new Error('Pre-order failed: No trade number obtained') + throw new Error('Pre-order failed: No trade number obtained'); } - const baseURL = `${process.env.NEXT_PUBLIC_APP_URL}/wallet/charge/result` - const originalSearch = searchParams.toString() - const fullPath = originalSearch ? `${pathname}?${originalSearch}` : pathname + const baseURL = `${process.env.NEXT_PUBLIC_APP_URL}/wallet/charge/result`; + const originalSearch = searchParams.toString(); + const fullPath = originalSearch ? `${pathname}?${originalSearch}` : pathname; const params = QueryString.stringify({ redirectURL: fullPath, back: 1, - }) - const returnUrl = `${baseURL}?${params}` - const cancelUrl = `${baseURL}?${params}` + }); + const returnUrl = `${baseURL}?${params}`; + const cancelUrl = `${baseURL}?${params}`; // 2. 结账 const checkoutResponse = await checkoutMutation.mutateAsync({ @@ -94,18 +94,18 @@ const ChargeDrawer = () => { payChannel: 'STRIPE', returnUrl, cancelUrl, - }) + }); // 3. 跳转到支付页面 if (checkoutResponse.paymentUrl) { - window.location.href = checkoutResponse.paymentUrl + window.location.href = checkoutResponse.paymentUrl; } else { - throw new Error('Failed to get payment link') + throw new Error('Failed to get payment link'); } } catch (error) { - toast.error('Payment failure, please try again') + toast.error('Payment failure, please try again'); } - } + }; const renderList = () => { if (isLoading) { @@ -123,13 +123,13 @@ const ChargeDrawer = () => {
))} - ) + ); } return (
{productList?.map((product) => { - const isSelected = selectedProductId === product.productId + const isSelected = selectedProductId === product.productId; return (
{ ${formatFromCents(product.payAmount, 2)}
- ) + ); })} - ) - } + ); + }; return ( @@ -177,7 +177,7 @@ const ChargeDrawer = () => { By recharging, you agree to the{' '} e.stopPropagation()}> - CrushLevel Recharge Service Agreement + Spicyxx.AI Recharge Service Agreement @@ -200,7 +200,7 @@ const ChargeDrawer = () => { - ) -} + ); +}; -export default ChargeDrawer +export default ChargeDrawer; diff --git a/src/components/mock-provider.tsx b/src/components/mock-provider.tsx deleted file mode 100644 index dca0b43..0000000 --- a/src/components/mock-provider.tsx +++ /dev/null @@ -1,68 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' -import { tokenManager } from '@/lib/auth/token' - -export function MockProvider({ children }: { children: React.ReactNode }) { - const [mockEnabled, setMockEnabled] = useState(false) - - useEffect(() => { - async function initMocking() { - // 首先初始化设备ID(确保用户第一次访问就有设备ID) - tokenManager.initializeDeviceId() - - // 只在开发环境和浏览器环境中启用 - if (process.env.NODE_ENV !== 'development' || typeof window === 'undefined') { - setMockEnabled(true) - return - } - - // 检查是否启用 mock - const shouldMock = process.env.NEXT_PUBLIC_ENABLE_MOCK === 'true' - console.log('🔧 Mock enabled:', shouldMock) - - if (!shouldMock) { - console.log('🚫 MSW 已禁用') - setMockEnabled(true) - return - } - - try { - // 动态导入 MSW - const { worker } = await import('../mocks/browser') - - // 启动 Service Worker - await worker.start({ - onUnhandledRequest: 'bypass', - serviceWorker: { - url: '/mockServiceWorker.js', - }, - // 添加选项以避免拦截页面导航 - quiet: false, - }) - - console.log('🎭 MSW Worker started successfully') - setMockEnabled(true) - } catch (error) { - console.error('❌ Failed to start MSW:', error) - setMockEnabled(true) // 即使失败也继续渲染 - } - } - - initMocking() - }, []) - - // 在 mock 初始化完成前显示加载状态 - if (!mockEnabled) { - return ( -
-
-
-

Initializing development environment...

-
-
- ) - } - - return <>{children} -} diff --git a/src/components/test-heartbeat-loader.tsx b/src/components/test-heartbeat-loader.tsx deleted file mode 100644 index dd60e0e..0000000 --- a/src/components/test-heartbeat-loader.tsx +++ /dev/null @@ -1,24 +0,0 @@ -'use client' - -import { useEffect } from 'react' - -/** - * 测试工具加载器组件 - * 在开发环境中加载心动等级测试工具 - */ -export function TestHeartbeatLoader() { - useEffect(() => { - // 只在开发环境加载测试工具 - if (process.env.NODE_ENV === 'development') { - import('@/utils/testHeartbeatLevel') - .then(() => { - console.log('🔧 心动等级测试工具已加载') - }) - .catch((error) => { - console.error('加载测试工具失败:', error) - }) - } - }, []) - - return null // 不渲染任何内容 -} diff --git a/src/lib/server-mock.ts b/src/lib/server-mock.ts deleted file mode 100644 index 7a5b3c0..0000000 --- a/src/lib/server-mock.ts +++ /dev/null @@ -1,40 +0,0 @@ -// 服务端 Mock 初始化 -let isServerMockEnabled = false - -export async function initServerMock() { - // 避免重复初始化 - if (isServerMockEnabled) { - return - } - - // 只在开发环境启用 - if (process.env.NODE_ENV !== 'development') { - return - } - - // 检查是否启用 mock - const shouldMock = process.env.NEXT_PUBLIC_ENABLE_MOCK === 'true' - if (!shouldMock) { - return - } - - try { - // 动态导入服务端 MSW - const { server } = await import('../mocks/server') - - // 启动服务端 mock - server.listen({ - onUnhandledRequest: 'bypass', - }) - - isServerMockEnabled = true - console.log('🎭 MSW Server started successfully') - } catch (error) { - console.error('❌ Failed to start MSW Server:', error) - } -} - -// 在服务端自动初始化 -if (typeof window === 'undefined') { - initServerMock() -} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 3d2d1c4..d36bee9 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,128 +1,123 @@ -import { clsx, type ClassValue } from 'clsx' -import { twMerge } from 'tailwind-merge' -import dayjs from 'dayjs' -import numeral from 'numeral' +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import dayjs from 'dayjs'; +import numeral from 'numeral'; // 合并类名 export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } // 计算年龄 export function calculateAge(year: string, month: string, day: string) { - const birthDate = dayjs(`${year}-${month}-${day}`) - const today = dayjs() - return today.diff(birthDate, 'year') + const birthDate = dayjs(`${year}-${month}-${day}`); + const today = dayjs(); + return today.diff(birthDate, 'year'); } export function calculateAgeByBirthday(birthday?: string) { - if (!birthday) return '' - const birthDate = dayjs(birthday) - const today = dayjs() - return today.diff(birthDate, 'year') + if (!birthday) return ''; + const birthDate = dayjs(birthday); + const today = dayjs(); + return today.diff(birthDate, 'year'); } // 获取月份天数 export function getDaysInMonth(year: string, month: string) { return Array.from({ length: dayjs(`${year}-${month}`).daysInMonth() }, (_, i) => `${i + 1}`.padStart(2, '0') - ) + ); } // 延迟函数 export function delay(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)) + return new Promise((resolve) => setTimeout(resolve, ms)); } // 加载图片 export async function loadImageAsync(url: string) { return new Promise((resolve, reject) => { - const img = new Image() - img.crossOrigin = 'anonymous' - img.onload = () => resolve(img) - img.onerror = () => reject(new Error(`Failed to load image: ${url}`)) - img.src = url - }) + const img = new Image(); + img.crossOrigin = 'anonymous'; + img.onload = () => resolve(img); + img.onerror = () => reject(new Error(`Failed to load image: ${url}`)); + img.src = url; + }); } // 数字简化显示(K/M/B格式) export function formatNumberToKMB(number: number) { if (number >= 1000000000) { - return numeral(Math.floor(number / 100000000) / 10).format('0.0') + 'B' + return numeral(Math.floor(number / 100000000) / 10).format('0.0') + 'B'; } if (number >= 1000000) { - return numeral(Math.floor(number / 100000) / 10).format('0.0') + 'M' + return numeral(Math.floor(number / 100000) / 10).format('0.0') + 'M'; } if (number >= 1000) { - return numeral(Math.floor(number / 100) / 10).format('0.0') + 'K' + return numeral(Math.floor(number / 100) / 10).format('0.0') + 'K'; } - return number || 0 + return number || 0; } // 根据时间戳(毫秒)获取年龄 export function getAge(birthday: number) { - if (!birthday) return 0 - const birthDate = dayjs(birthday) - const today = dayjs() - let age = today.year() - birthDate.year() + if (!birthday) return 0; + const birthDate = dayjs(birthday); + const today = dayjs(); + let age = today.year() - birthDate.year(); // 如果今年还没过生日,年龄减一 if ( today.month() < birthDate.month() || (today.month() === birthDate.month() && today.date() < birthDate.date()) ) { - age-- + age--; } - return age + return age; } export function getConversationTime(timestamp: number) { - const now = dayjs() - const timestampDate = dayjs(timestamp) + const now = dayjs(); + const timestampDate = dayjs(timestamp); // 当天显示HH:mm if (now.isSame(timestampDate, 'day')) { - return timestampDate.format('HH:mm') + return timestampDate.format('HH:mm'); } // 昨天显示昨天HH:mm if (now.subtract(1, 'day').isSame(timestampDate, 'day')) { - return 'Yesterday ' + timestampDate.format('HH:mm') + return 'Yesterday ' + timestampDate.format('HH:mm'); } // 今年显示MM-DD if (now.isSame(timestampDate, 'year')) { - return timestampDate.format('MM-DD') + return timestampDate.format('MM-DD'); } - return timestampDate.format('YYYY-MM-DD') -} - -// 格式化心动等级值 -export function formatHeartbeatLevel(value: number) { - return `${value.toFixed(1)}℃` + return timestampDate.format('YYYY-MM-DD'); } export function openApp(schemeURI: string) { - const schemeUrl = schemeURI - const downloadUrl = 'https://crushlevel.com/download' // 下载页 URL - const startTime = Date.now() - window.location.href = schemeUrl + const schemeUrl = schemeURI; + const downloadUrl = 'https://crushlevel.com/download'; // 下载页 URL + const startTime = Date.now(); + window.location.href = schemeUrl; setTimeout(() => { if (Date.now() - startTime < 2100) { // 唤起成功 - return + return; } - window.location.href = downloadUrl // 失败跳转下载 - }, 2000) + window.location.href = downloadUrl; // 失败跳转下载 + }, 2000); } // 毫秒转mm:ss, 如果是小时则为hh:mm export function durationText(duration: number) { - const hours = Math.floor(duration / 3600000) - const minutes = Math.floor((duration % 3600000) / 60000) - const seconds = Math.floor((duration % 60000) / 1000) + const hours = Math.floor(duration / 3600000); + const minutes = Math.floor((duration % 3600000) / 60000); + const seconds = Math.floor((duration % 60000) / 1000); if (hours > 0) { - return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}` + return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; } else if (minutes > 0) { - return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}` + return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; } else { - return `00:${seconds.toString().padStart(2, '0')}` + return `00:${seconds.toString().padStart(2, '0')}`; } }