kurihada
|
50ae46fe15
|
fix: AuthModal 重开时重置表单 + 邀请页加入失败显示错误
- #13: useEffect 监听 open 变化时重置所有表单状态(用户名、密码、错误等)
- #14: handleJoin catch 中捕获错误消息并渲染到页面
|
2026-02-26 20:16:25 +08:00 |
|
kurihada
|
5783d522b7
|
fix: SwipeDeck 检测他人重置后自动清空本地状态
当 server 端 swipeCount 归零而本地 currentIndex > 0 时
说明其他用户执行了重置,自动调用 clearLocalState()
|
2026-02-26 20:10:29 +08:00 |
|
kurihada
|
2a3cef890c
|
refactor: 拆分 MatchResult、ProfilePage、BlindboxRoomPage 大组件
- MatchResult: 提取 NoMatchResult、RunnerUpCard(635 → 513 行)
- ProfilePage: 提取 ProfileHistoryCard、ProfileFavoritesCard(692 → 526 行)
- BlindboxRoomPage: 提取 BlindboxMyIdeas、BlindboxDrawnHistory(855 → 668 行)
|
2026-02-26 19:59:35 +08:00 |
|
kurihada
|
423b94440d
|
refactor: 拆分 ShareCardModal(951 行 → 4 个模块)
- ShareCardModal.tsx (199 行): 模态框编排逻辑(图片生成、保存、分享)
- RestaurantShareCard.tsx: 餐厅分享卡片纯展示组件
- BlindboxShareCard.tsx: 盲盒分享卡片纯展示组件
- shareImage.ts: 图片工具函数(toPng 封装、dataUrl 转换、下载)
|
2026-02-26 19:54:12 +08:00 |
|
kurihada
|
0c5676493e
|
refactor: 提取 UserAvatar、Input、Card 三个可复用 UI 组件
- UserAvatar: 统一头像渲染(5 种尺寸),新增 resolveAvatar 工具函数,替换 SwipeDeck 和 RoomManageModal 中的重复逻辑
- Input: 统一表单输入样式(4 种尺寸 + default/purple 变体),替换 AuthModal、ProfilePage、BlindboxPage 共 12 处
- Card: 统一卡片容器样式 + 可选淡入动画和延迟,替换 ProfilePage 中 7 处重复的 motion.div
|
2026-02-26 19:43:07 +08:00 |
|
kurihada
|
9641acbcbd
|
refactor: 提取 buildNavUrl 工具函数,统一 room API 错误处理
- 将 MatchResult.tsx 和 profile/page.tsx 中重复的导航 URL 构建逻辑提取到 src/lib/navigation.ts
- 7 个 room API 路由从 return NextResponse.json({ error }, { status }) 统一改为 throw ApiError,由 apiHandler 统一捕获
|
2026-02-26 19:31:00 +08:00 |
|
kurihada
|
c9e20d4c95
|
refactor: 提取 useShare hook,统一分享和剪贴板逻辑
新增 useShare(Web Share API + clipboard fallback),
消除 QrInviteModal、BlindboxRoomPage、ShareCardModal 三处重复的分享代码。
|
2026-02-26 19:25:44 +08:00 |
|
kurihada
|
455b9e04d8
|
refactor: 提取 Button 组件,统一按钮变体、尺寸和加载状态
新增 Button.tsx 支持 5 种变体(primary/secondary/danger/ghost/purple)、
3 种尺寸(sm/md/lg)、pill/rounded 形状及内置 loading 状态,
替换 8 个文件中 16 处重复的按钮样板代码。
|
2026-02-26 18:39:14 +08:00 |
|
kurihada
|
d4c6da57a1
|
refactor: Toast 升级为全局 Context,消除 onToast prop 透传
将 useToast 从独立 state hook 改为 Context-based,在 layout 中
挂载 ToastProvider 全局渲染 Toast。QrInviteModal、RoomManageModal、
ShareCardModal 不再需要 onToast prop,直接 useToast() 调用即可。
父组件 TopNav、MatchResult、profile、blindbox 移除了本地 Toast
渲染和 onToast 传递逻辑。
|
2026-02-26 17:57:34 +08:00 |
|
kurihada
|
b98920858c
|
refactor: 提取 useToast hook + Toast 组件,消除 4 处重复的通知逻辑
将 state + setTimeout 自动消失逻辑封装为 useToast hook,
Toast UI 统一为组件支持 top/bottom 两种位置,净减约 12 行。
|
2026-02-26 17:50:28 +08:00 |
|
kurihada
|
948274bcb9
|
refactor: 提取 Modal 基础组件,消除 4 个弹窗的重复样板代码
将 backdrop 遮罩、点击关闭、AnimatePresence 动画封装为 Modal 组件,
支持 sheet(底部弹出)和 dialog(居中缩放)两种变体,净减约 110 行。
|
2026-02-26 17:45:52 +08:00 |
|
kurihada
|
b1cbf0d589
|
fix: 修复页面过渡动画导致 fixed 定位失效和全局徽章被遮挡
|
2026-02-26 16:49:06 +08:00 |
|
kurihada
|
add9733bc9
|
ui: 页面切换过渡动画 — AnimatePresence 淡入滑出效果
|
2026-02-26 16:41:39 +08:00 |
|
kurihada
|
20f63c67cb
|
feat: 添加 PWA 支持 — 可安装到主屏幕、离线缓存、刘海屏适配
|
2026-02-26 16:37:40 +08:00 |
|
kurihada
|
31003110e1
|
fix: 滑卡退出距离自适应屏幕宽度,小屏设备体验更顺滑
|
2026-02-26 16:33:41 +08:00 |
|
kurihada
|
37eb7f07d7
|
ui: 滑卡互动增强 — like 徽章动画、分类标签可读性、进度数字区分
- RestaurantCard: like 徽章实时弹跳动画,首次出现滑入效果
- RestaurantCard: 分类标签改为白底黑字,图片上始终清晰
- SwipeDeck: 进度数字加背景色块包裹,与用户名视觉分离
|
2026-02-26 16:32:00 +08:00 |
|
kurihada
|
b2b18327cc
|
ui: 骨架屏替代全部页面级加载 spinner
- 新增 Skeleton 组件库:Skeleton、SkeletonCircle 基础元素 + 5 个业务骨架
(SwipeDeck、ProfileCard、RecordItem、BlindboxRoom、BlindboxList、RoomCard)
- 替换 room、profile、blindbox 列表、blindbox 房间、invite 5 个页面的加载态
- 替换 profile 历史记录 / 收藏列表的内联加载 spinner
- 更新 project-conventions.mdc:新增 Loading States 规范,
要求页面级和列表级加载必须使用骨架屏
|
2026-02-26 16:11:01 +08:00 |
|
kurihada
|
798b883250
|
ui: 房间页布局优化 — TopNav 重排、进度贴近卡片、按钮间距收紧
- TopNav: 退出按钮移到最左侧,房间号合并到邀请按钮,移除右侧内容避免与全局徽章重叠
- SwipeDeck: 移除绿色进度条,UserProgressBar 始终显示并贴在卡片正上方
- ActionButtons: 缩小与卡片的垂直间距
|
2026-02-26 15:50:51 +08:00 |
|
kurihada
|
4ce6ea469c
|
feat: 添加全局 Error Boundary 和餐厅图片加载失败 fallback
- error.tsx: 路由级错误边界,提供重试和返回首页操作
- global-error.tsx: 根布局级兜底,纯内联样式避免依赖加载
- RestaurantImage: 可复用图片组件,加载失败显示餐具占位图标
- 替换 RestaurantCard、MatchResult、profile 中所有餐厅图片
|
2026-02-26 15:22:29 +08:00 |
|
kurihada
|
e86f643c26
|
ui: 个人中心空状态插图优化,替换纯文字为图标动画 + CTA 按钮
提取可复用 EmptyState 组件,决策记录和收藏餐厅空状态
增加浮动图标、光晕动画和"去创建第一个房间"引导按钮
|
2026-02-26 15:18:22 +08:00 |
|
kurihada
|
12279117f3
|
feat: 全局主题切换(浅色/深色/跟随系统)
- CSS 变量驱动的主题系统,所有颜色响应 data-theme 属性
- 新增语义化色彩 heading/secondary/tertiary,替换硬编码 text-white/text-gray-*
- 右上角三态主题按钮(自动/浅色/深色),全局可用无需登录
- layout.tsx 内联脚本防闪烁
- 修复个人中心页面溢出无法滚动
|
2026-02-26 15:15:32 +08:00 |
|
kurihada
|
7aa6c7f792
|
feat: 全局用户头像徽章,所有页面右上角统一显示
- 新增 GlobalUserBadge 组件,固定在右上角,已登录显示头像+用户名,未登录显示登录按钮
- 通过 layout.tsx 全局挂载,仅在个人中心页隐藏
- userId.ts 登录/登出时派发 nowhatever_auth 事件,组件实时响应
- 移除各页面重复的用户指示器(首页、极速救场、周末契约大厅、个人中心顶栏退出按钮)
- TopNav 右侧留出空间避免与全局徽章重叠
- 头像徽章采用暗色主题风格(bg-surface/80)
|
2026-02-26 14:42:40 +08:00 |
|
kurihada
|
f851eed847
|
fix: 匹配结果页标题和副标题添加 text-center 确保居中
|
2026-02-26 14:26:42 +08:00 |
|
kurihada
|
26656f1e01
|
feat: 匹配成功页引导未注册用户注册,保存决策记录
- 未注册用户在匹配成功页看到注册引导卡片
- 注册后自动保存本次决策记录,收藏按钮同步出现
- 将 isRegistered() 调用改为 registered 响应式状态
- 更新 ROADMAP 标记已完成
|
2026-02-26 14:18:32 +08:00 |
|
kurihada
|
4e60dc3cde
|
fix: 单人场景体验优化 — 跳过等待 spinner,适配结果文案
- SwipeDeck: userCount === 1 时不再显示"等待其他人完成选择"
- MatchResult: 单人时标题改为"帮你选好了",副标题改为"你的首选"
- MatchResult: 单人时隐藏"默契度 100%"徽章(无意义)
- 更新 ROADMAP 将 Solo 模式改为单人体验修复
|
2026-02-26 14:15:14 +08:00 |
|
kurihada
|
0f83e9c6ae
|
feat: 匹配成功页体验优化 — 浮动操作栏、收藏、决赛引导
- 底部操作改为固定浮动栏,"再来一轮"和"换一批店"始终可见
- 结果卡片右上角新增收藏按钮,复用已有收藏 API
- 非全员一致时"Top N 决赛"按钮上方增加引导文案
- 更新 ROADMAP 标记已完成项,移除低优先级条目
|
2026-02-26 14:03:38 +08:00 |
|
kurihada
|
afde70c98e
|
fix: 分享卡片关闭按钮定位到卡片右上角
|
2026-02-26 13:53:07 +08:00 |
|
kurihada
|
08eb55ca41
|
feat: 添加分享结果卡片功能,形成用户增长闭环
- 新增 ShareCardModal 组件,支持餐厅匹配和盲盒契约两种分享卡片
- 卡片包含品牌标识、匹配结果、餐厅/想法详情、二维码
- 使用 html-to-image 生成高清 PNG,支持保存图片和 Web Share API 分享
- 餐厅图片通过 canvas 转 data URL 处理跨域
- 集成到 MatchResult(极速救场)和 BlindBox reveal(周末契约)
|
2026-02-26 13:50:38 +08:00 |
|
kurihada
|
14b0aaece4
|
feat: 盲盒房间体系重构 — 强制登录、独立房间、用户归属
- 新增 BlindBoxRoom/BlindBoxMember 模型,BlindBoxIdea 增加 userId/drawnById
- 新增房间 API(创建/加入/列表/详情),所有盲盒 API 增加认证和成员校验
- 新建盲盒大厅页面(三层引导式设计:未登录氛围页/首次创建引导/房间列表)
- 新建盲盒房间页面(成员校验/邀请分享/用户归属展示/自动聚焦)
- 首页删除契约画廊和 localStorage 盲盒逻辑,周末契约跳转到 /blindbox
- 清理旧路由 /room/[id]/blindbox
- 提取共享工具 src/lib/blindbox.ts(错误响应/房间号生成/成员校验)
- AuthModal 支持 defaultTab 参数
- 更新项目规范:新项目原则、代码优雅和复用优先
|
2026-02-26 12:25:32 +08:00 |
|
kurihada
|
e10e3c8230
|
ui: 全站统一暗色主题设计系统
- globals.css 定义语义化 token (background/surface/elevated/border/muted/dim/accent)
- 所有页面和组件迁移至暗色 token,移除硬编码 bg-white/text-zinc-*/bg-gray-*
- RestaurantCard 和 MatchResult 适配暗色卡片风格
- 按钮颜色分层:系统CTA(accent)/模式强调(橙/紫)/危险(rose)/次级(surface)
- 修复 room 页深色文字在深背景不可见的可访问性问题
|
2026-02-26 11:27:18 +08:00 |
|
kurihada
|
30d5ad5ff2
|
ui: 缩小房间页卡片和操作按钮,适配小屏手机
|
2026-02-25 14:51:12 +08:00 |
|
kurihada
|
cc7f6d55a7
|
feat: 添加品牌 Logo、favicon、Apple Touch Icon 和 OG 分享图
- 新增 icon.png (96x96) 和 apple-icon.png (180x180) 作为浏览器/iOS 图标
- 新增 opengraph-image.png 用于微信等社交媒体分享预览
- 新增 BrandLogo SVG 组件,首页标题上方展示品牌图标
|
2026-02-25 11:58:05 +08:00 |
|
kurihada
|
079feddf0e
|
feat: 商家卡片支持多图展示,点击左右切换带 crossfade 过渡
- Restaurant.image 改为 images: string[],API 层从高德取最多 5 张图
- RestaurantCard 新增 ImageGallery:点击图片左右区域切换、顶部圆点指示器、
左右箭头提示、首次查看时文字引导气泡(2.5s 自动消失)
- 图片切换使用 crossfade 动画(旧图渐隐 280ms),过渡平滑
- MatchResult / Profile 页面兼容新旧数据格式,无图时条件渲染
|
2026-02-25 11:51:42 +08:00 |
|
kurihada
|
c86a6c0909
|
feat: 新增「喝什么」场景,支持奶茶/咖啡/酒吧等饮品店搜索
引入场景系统(SceneType),首页增加「吃什么」「喝什么」切换 Tab,
不同场景使用不同的高德 POI 类型、热门标签、价格区间和全链路文案。
场景信息存储在房间数据中,邀请/分享/匹配结果等页面自动适配。
|
2026-02-25 01:12:44 +08:00 |
|
kurihada
|
04c7b547aa
|
feat: 用户名密码登录注册系统
- 新增 /api/auth/register 和 /api/auth/login 接口,使用 bcryptjs 哈希密码
- User 模型改为 username + passwordHash,id 自动生成 cuid
- 新增 AuthModal 组件(登录/注册双标签页),替换旧的 ProfileSetupModal
- 重写 /profile 页面:支持修改用户名、密码、头像、绑定邮箱、退出登录
- /api/user PUT 支持密码修改(需验证当前密码)和用户名唯一性校验
- 游客模式保留,右上角显示"登录"按钮;登录后显示头像和用户名
- 全局 nickname -> username 重命名(types、SwipeDeck、RoomManageModal、buildRoomStatus)
- 新增 logout() 清除登录态并重新生成游客 UUID
|
2026-02-25 00:21:03 +08:00 |
|
kurihada
|
801e922bb6
|
feat: 全员一致时增加 confetti 粒子特效、庆祝音效和默契度文案
|
2026-02-24 22:03:49 +08:00 |
|
kurihada
|
07ffe42176
|
feat: 房间创建者管理权限——锁定房间、踢人、结束投票
|
2026-02-24 21:01:24 +08:00 |
|
kurihada
|
fc0a2a018b
|
feat: 拦截浏览器返回键,退出房间前弹窗确认
|
2026-02-24 20:21:47 +08:00 |
|
kurihada
|
a6fc523f4f
|
feat: 添加二维码邀请功能,扫码即可加入房间
|
2026-02-24 20:00:55 +08:00 |
|
kurihada
|
b5fe3f6cc8
|
feat: 匹配结果页增加"分享结果到群里"按钮,支持 Web Share 和剪贴板
|
2026-02-24 19:39:57 +08:00 |
|
kurihada
|
ee636838d1
|
feat: 新增邀请中间页,分享链接带上下文引导新用户加入
|
2026-02-24 19:36:47 +08:00 |
|
kurihada
|
cb9f4a3d0f
|
feat: 拆分"再来一轮"为 Top N 决赛和换一批餐厅两个选项
|
2026-02-24 19:34:35 +08:00 |
|
kurihada
|
5d297684fc
|
feat: best 匹配结果页展示 Top 3 候选排行,支持折叠查看备选餐厅
|
2026-02-24 19:30:10 +08:00 |
|
kurihada
|
30329df136
|
fix: 0 票最佳匹配时展示"都不太满意"引导页,替代尴尬的 Trophy 展示
|
2026-02-24 19:26:54 +08:00 |
|
kurihada
|
b406acc813
|
feat: 显示每个人的实时滑卡进度,用 emoji 头像区分用户
滑卡时进度条下方展示所有人的进度(如 🐸你 12/15 🐱 8/15),
等待页面也改为详细进度卡片,减少等待焦虑并增强社交临场感。
每个用户根据 userId 确定性分配 emoji 头像,无需手动输入。
|
2026-02-24 19:23:06 +08:00 |
|
kurihada
|
998d0a4e15
|
fix: 刷新页面后恢复滑动进度,防止重复 swipe
服务端 GET room 返回 swipeCounts,前端据此恢复 currentIndex、
swipeHistory 和引导状态;swipe API 增加幂等性检查,跳过已滑过的卡片。
|
2026-02-24 18:40:42 +08:00 |
|
kurihada
|
48e74c03e6
|
feat: 撤回滑动功能,按钮移至进度条旁
- 新增 POST /api/room/[id]/undo 端点,撤回 like 和 swipeCount
- 进度条右侧显示"↩ 撤回"按钮,可一直撤回到第一张
- ActionButtons 恢复干净的两按钮布局,避免误触
|
2026-02-24 17:48:47 +08:00 |
|
kurihada
|
1b06f4fc0e
|
feat: 新用户滑动引导,首次进入展示手势提示
- 首张卡片叠加半透明引导层,左滑不想去/右滑想去动画提示
- 支持点击消失、拖拽消失、3秒自动消失
- localStorage 记录标记,每个用户只展示一次
- 修复 React Strict Mode 下 effect 双执行导致引导不显示的问题
|
2026-02-24 17:43:12 +08:00 |
|
kurihada
|
fb49e21eb2
|
feat: 增加滑动参与感 - 进度条、实时气泡、热度标签
- 卡片上方显示滑动进度条和计数 (3/15)
- 轮询检测到当前卡片新增 like 时弹出"有人也想去这家!"气泡
- 卡片图片角落显示"🔥N 人想去"热度标签
- 后端 GET /api/room/[id] 新增 likeCounts 字段
|
2026-02-24 17:36:04 +08:00 |
|
kurihada
|
e2c3b869eb
|
feat: 两级匹配机制 - 全票通过即时匹配 + 滑完自动推荐得票最高
- 后端 GET /api/room/[id] 新增 findBestMatch,滑完后选出得票最高餐厅
- 平票时取高德评分更高的一家,永远不会出现"无结果"死局
- 返回 matchType (unanimous/best) 和 matchLikes 区分匹配类型
- 全票通过:绿色庆祝 + "大家一拍即合!"
- 得票最高:橙色推荐 + "N/M 人想去这家"
- 移除 noMatch 死局页面,简化 SwipeDeck 状态管理
|
2026-02-24 17:26:16 +08:00 |
|