fix(order): 修复订单列表页登录后仍看到别人订单问题
- 使用 userIdRef 避免闭包过期,确保加载订单时 userId 正确 - loadOrders 函数开头增加硬拦截,没有 userId 则不加载订单 - useEffect 中添加 user?.userId 判断,等待有效 userId 再加载 - useEffect 依赖数组加入 user?.userId,userId 变化时重新加载订单 feat(index): 首页铃铛接入新订单轮询与提示 - 登录后获取店员身份,使用 isClerkRef 避免闭包问题 - 通过 useNewOrderDetector 每30秒轮询门店订单,仅店员有效 - 新订单时触发震动和提示,铃铛数字角标动态显示新订单数 - 铃铛点击区分店员和普通用户,店员跳门店订单页并清除未读 - 页面展示时刷新店员身份,确保身份状态及时更新
This commit is contained in:
@@ -131,3 +131,38 @@ adapter `/list` 接口忽略分页,一次返回全部收藏;前端 `listShop
|
||||
4. 新增 `handleOrderTabClick(status)` 和 `handleViewAllOrders()`:订单入口 `requireLogin` 拦截,并加 `redirect: '/pages/order/list'` 让登录后回跳订单页
|
||||
5. 未登录时需登录的菜单项和订单按钮加 `opacity-50` 视觉降级
|
||||
6. 「帮助中心」「设置」不需要登录,保持原样
|
||||
|
||||
## 订单列表页登录后仍看到别人订单 Bug 修复(2026-07-14)
|
||||
|
||||
### 问题
|
||||
`pages/order/list` 刚登录成功后仍能看到别人的订单,刷新重进后才正常。
|
||||
|
||||
### 根因
|
||||
`loadOrders` 的 `useCallback` 依赖数组为 `[updateTabState]`,未包含 `user`,导致**闭包过期**——登录后 `isLoggedIn` 变 `true` 触发 effect 调用 `loadOrders`,但闭包中的 `user` 仍是初始渲染时的 `null`,`userId: user?.userId` 传了 `undefined`,后端未按用户过滤返回了全部订单。
|
||||
|
||||
### 修改
|
||||
- **`src/pages/order/list.tsx`**:
|
||||
1. 新增 `userIdRef`(`useRef(user?.userId)`),每渲染同步 `userIdRef.current = user?.userId`,避免闭包过期
|
||||
2. `loadOrders` 开头从 `userIdRef.current` 取 userId,`if (!userId) return` 硬拦截——没有当前登录用户 userId 就禁止加载
|
||||
3. `useEffect` 中增加 `if (!user?.userId) return` 判断,已登录但 userId 还没拿到时等待下次渲染
|
||||
4. `useEffect` 依赖数组加 `user?.userId`,userId 变化时重新触发加载
|
||||
|
||||
## 首页铃铛接入新订单轮询(2026-07-14)
|
||||
|
||||
### 需求
|
||||
首页顶部搜索栏右侧铃铛图标,门店店员有新订单时能收到提醒。
|
||||
|
||||
### 改动
|
||||
- **`src/pages/index/index.tsx`**:
|
||||
1. 导入 `useNewOrderDetector`、`getMyClerk`、`pageShopOrder`、`useDidShow`、`useCallback`、`useRef`
|
||||
2. 登录后调 `getMyClerk()` 检测店员身份,存 `isClerk` state + `isClerkRef` ref(ref 用于轮询回调中读取最新值,避免闭包过期)
|
||||
3. `useDidShow` 时也刷新店员身份
|
||||
4. 接入 `useNewOrderDetector`:30秒轮询 `pageShopOrder({page:1,limit:5})`;`fetchLatestOrders` 内用 `isClerkRef.current` 网关——非店员直接返回空数组(不建 baseline,无副作用)
|
||||
5. 新订单回调:`Taro.vibrateShort` 震动 + `Taro.showToast` 提示"您有 N 条新订单"
|
||||
6. 铃铛角标从静态红点改为动态:`newOrderCount > 0` 显示数字角标(>99 显示 99+),`=== 0` 时显示小圆点
|
||||
7. 点击处理:店员 → `navigateTo` 门店订单页(有新订单时先 `clearUnread()`);普通用户 → 通知页
|
||||
|
||||
### 设计要点
|
||||
- `isClerkRef` 解决 hooks 闭包过期问题——`fetchLatestOrders` 的 `useCallback` 依赖空数组,但通过 ref 读取最新店员状态
|
||||
- 非店员时 `fetchLatestOrders` 返回 `[]`,hook 内 `doCheck` 在 `list.length === 0` 时 return,`knownOrderIdsRef` 保持 `null` 不建 baseline;店员身份确认后首次真实请求才建 baseline,不会误报
|
||||
- `useNewOrderDetector` 内部已处理 `useDidShow`/`useDidHide` 生命周期,tabBar 页切走自动停轮询
|
||||
|
||||
Reference in New Issue
Block a user