# 自动弹出邀请卡片实现计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **目标:** 为 Widget 模式添加自动弹出邀请卡片,页面加载 1.8 秒后显示,提供快速访问热门话题的入口 **架构:** 在现有 widget.js 中扩展,使用 Shadow DOM 隔离样式,sessionStorage 管理每页独立的关闭状态 **技术栈:** 原生 JavaScript、Shadow DOM、sessionStorage --- ## 文件结构 **修改文件:** - `static/widget.js` - 添加邀请卡片组件和逻辑 **新增代码段:** 1. 邀请卡片 HTML 模板 2. 邀请卡片 CSS 样式 3. 定时器管理 4. 存储管理 5. 事件处理器 6. 自动发送消息函数 7. 热门话题区域 --- ## 任务 1: 添加邀请卡片存储管理 **文件:** - 修改: `static/widget.js` 在现有变量声明区域(第 153-160 行附近)添加存储管理相关变量和函数: - [ ] **Step 1: 添加存储管理变量** 在 `widget.js` 中找到 `var wSessionId = null;` 这一行(约第 155 行),在其后添加: ```javascript // Invite card state management var inviteTimer = null; var invitePanel = null; var inviteShown = false; var inviteStorageKey = "widget_invite_dismissed_" + window.location.pathname; var isPermanentlyClosed = false; ``` - [ ] **Step 2: 添加存储检查函数** 在同一区域添加存储管理函数: ```javascript function checkInviteStorage() { var dismissed = sessionStorage.getItem(inviteStorageKey); if (dismissed === "permanent") { isPermanentlyClosed = true; return true; } return false; } function setInviteDismissed(type) { if (type === "permanent") { sessionStorage.setItem(inviteStorageKey, "permanent"); isPermanentlyClosed = true; } else { sessionStorage.setItem(inviteStorageKey, "temporary"); } } function clearInviteDismissed() { sessionStorage.removeItem(inviteStorageKey); isPermanentlyClosed = false; } ``` - [ ] **Step 3: Commit** ```bash git add static/widget.js git commit -m "feat: add invite card storage management functions" ``` --- ## 任务 2: 添加邀请卡片 HTML 模板 **文件:** - 修改: `static/widget.js` - [ ] **Step 1: 添加邀请卡片 HTML 模板** 在 `widget.js` 中找到聊天面板的 HTML 定义(约第 115-134 行,`panel.innerHTML = [...]`),在其后、toggleBtn 定义之前添加: ```javascript // Invite card HTML template var inviteTemplate = [ '
Invite should appear after 1.8 seconds
``` - [ ] **Step 2: 测试基本功能** 打开测试页面,验证: 1. ✅ 页面加载 1.8 秒后邀请卡片自动弹出 2. ✅ 邀请卡片样式正确(橙色头部、两个话题按钮) 3. ✅ 点击 "Get Quotation" → 邀请关闭 → 聊天打开 → 消息自动发送 4. ✅ 点击 "Distributor Cooperation" → 邀请关闭 → 聊天打开 → 消息自动发送 5. ✅ 点击 "Start Chat" → 邀请关闭 → 聊天打开 6. ✅ 点击 "No Thanks" → 邀请永久关闭 7. ✅ 点击悬浮按钮(邀请可见时)→ 邀请关闭 → 聊天打开 8. ✅ 点击悬浮按钮(邀请隐藏时)→ 聊天打开 - [ ] **Step 3: 测试页面独立性** 在多个标签页/页面中测试: 1. ✅ 页面 A 关闭邀请后,页面 B 仍能弹出邀请 2. ✅ 页面 A 刷新后,已关闭状态保持 3. ✅ 关闭整个网站重新打开,所有状态重置 - [ ] **Step 4: 测试热门话题** 1. ✅ 聊天面板显示 "POPULAR TOPICS" 区域 2. ✅ 点击话题按钮 → 消息自动发送 3. ✅ 发送第一条消息后,热门话题隐藏 - [ ] **Step 5: 测试响应式** 在不同屏幕尺寸下测试: 1. ✅ 移动端(<450px)样式正确 2. ✅ 话题按钮在小屏幕上正确排列 - [ ] **Step 6: 测试边界情况** 1. ✅ 快速连续点击悬浮按钮 2. ✅ 在邀请弹出前打开聊天 3. ✅ 在消息发送过程中关闭邀请 - [ ] **Step 7: Commit** ```bash # 如果创建了测试文件 git add static/widget-test.html git commit -m "test: add widget invite card test page" ``` --- ## 任务 8: 最终清理和文档 - [ ] **Step 1: 代码审查** 检查代码: 1. ✅ 无 console.log 调试语句 2. ✅ 变量命名一致 3. ✅ 注释清晰 4. ✅ 无重复代码 - [ ] **Step 2: 浏览器兼容性测试** 在不同浏览器中测试: 1. ✅ Chrome/Edge (Chromium) 2. ✅ Firefox 3. ✅ Safari (如果可用) - [ ] **Step 3: 性能检查** 1. ✅ 无内存泄漏(定时器清理) 2. ✅ 无不必要的 DOM 操作 3. ✅ 存储操作高效 - [ ] **Step 4: 最终 Commit** ```bash git add static/widget.js git commit -m "chore: final cleanup and polish invite card feature" ``` --- ## 验收标准 ### 功能要求 - ✅ 页面加载 1.8 秒后自动弹出邀请卡片 - ✅ 包含两个话题按钮:Get Quotation、Distributor Cooperation - ✅ 点击话题按钮 → 关闭邀请 → 打开聊天 → 自动发送消息 - ✅ 点击 "Start Chat" → 关闭邀请 → 打开聊天 - ✅ 点击 "No Thanks" → 永久关闭邀请 - ✅ 每个页面独立管理状态 - ✅ 聊天面板显示热门话题区域 ### 样式要求 - ✅ 橙色渐变头部:`linear-gradient(135deg, #F08A34 0%, #EC8C2F 100%)` - ✅ 圆角 26px - ✅ 阴影效果正确 - ✅ 淡入 + 滑入动画 - ✅ 响应式设计 ### 技术要求 - ✅ 使用 sessionStorage 存储状态 - ✅ 使用 Shadow DOM 隔离样式 - ✅ 定时器正确清理 - ✅ 无内存泄漏 --- **预计工作量**: 约 2-3 小时 **文件修改**: 1 个文件(static/widget.js) **新增代码**: 约 250-300 行