makecindy / makecindy/cindy

bug(mobile): 排队消息标识被误读为「未发出」,需与发送中明确区分

Open
#899 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
401
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 问题描述 / What happened

移动端排队消息的标识会被用户读成「这条消息没发出去」。

实际语义是:消息已经提交,正在**排队等前一轮跑完**(Cindy 支持连发多条、排队执行,也支持插话)。但用户看到气泡下方那个标识,第一反应是"发送失败 / 还没发出去",于是重复点发送、或者以为网络断了。

深度用户的原话:「我这个消息都没出去」——他把排队标识理解成了未发送。这是**图标语义的歧义**,不是同步链路的 bug。

期望:让「排队中」和「发送中 / 未送达」在视觉上一眼可分,并且排队态要能让人看懂它是**正常状态**而不是异常。

## 环境 / Environment

- Cindy 版本或 commit / version or commit:`main`(当前 HEAD)
- 平台与版本 / platform & OS version:iOS(Android 同样适用)
- 安装方式 / install method:dev / 内部版

## 复现步骤 / Steps to reproduce

1. 移动端在一轮任务还没跑完时,连续再发 1–2 条消息。
2. 观察新消息气泡上的标识。
3. 判断:能否分辨"这条在排队"和"这条没发出去"。

## 相关代码线索

- 排队区渲染:`apps/mobile/src/session/InlineQueueSection.tsx`(文件头注释写了当前设计:右对齐、与已发送气泡同款但整体半透明,气泡左侧「排入队尾 list-end」徽标表示排队态,落定时原位变实)
- 输入投影 / 排队状态来源:`apps/mobile/src/session/inputProjection.ts`
- 会话主屏:`apps/mobile/src/session/MessageRenderer.tsx`

## 建议方向(实现者可自行决定,但要能通过下面的验收)

1. 换掉当前徽标的图形,选一个语义上明确指向"队列 / 等待轮次"的图标,与"上传中 / 发送中"的转圈明确区分开。
2. 给排队态补一个可读的文字线索(气泡旁的短标签或长按/点击后的说明,如「排队中,等当前任务结束后发送」),不要只靠一个图形承载语义。
3. 排队态与「上传中 k/N」态(同文件里已有)视觉上不要混淆。
4. i18n 文案按 `docs/dev-rules/engineering-conventions.md` 落地;新术语先查 `i18n/GLOSSARY.md`,表里没有的加 `status: "proposed"` 条目再讨论(门禁 `pnpm check:i18n-glossary`)。

## 明确不在本 issue 范围

- **不要改发送状态机 / 同步链路**。"消息已提交但转圈标识长时间残留"是另一个问题,属于同步链路,会单独处理。本 issue 只解决排队态的**表意**。
- 半透明→变实的落定动画机制不用重做,沿用现有实现。

## 交付要求

- 必读 `docs/design-rules/DESIGN.md`(图标规格、状态色)与 `i18n/GLOSSARY.md`。
- Light + Dark 两种模式都要实现。
- 提交前跑仓库根 `pnpm test:unit` + `pnpm --filter mobile run --if-present typecheck`。
- commit 带 `Signed-off-by`(`git commit -s`)。

## 验收标准

- [ ] 排队中的消息一眼能看出是"在排队",不会被读成"发送失败"
- [ ] 排队中 / 上传中 / 已发送三种态视觉可分
- [ ] 排队态有文字可读线索(标签或说明),不只依赖图形
- [ ] 文案已过 i18n,且 `pnpm check:i18n-glossary` 通过
- [ ] Light / Dark 双模式均已实现
- [ ] 未改动发送状态机与同步链路

Contributor guide

Open the contributing guide

Research direction

Read docs/design-rules/DESIGN.md and i18n/GLOSSARY.md first, then inspect apps/mobile/src/session/InlineQueueSection.tsx with inputProjection.ts and MessageRenderer.tsx. Keep the existing queue and sync behavior, but make queued, uploading, and sent states distinct in light and dark modes, with a readable localized queue cue. Run pnpm test:unit, the mobile typecheck, and pnpm check:i18n-glossary.

Written by the indexing model from the issue text.

Assessment

Tech stack
react-native, typescript
Domain
design, frontend, internationalization, mobile
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.