Your Name and Claude Opus 5
08bd8915c5
修复全页面走查发现的问题(第五批:失效文件状态、日报搜索、client_context)
...
- content-library-view: 收藏列表的 FileCard 一直没传 removed,需求 7.3「失效文件需展示明确
状态而非直接报错」在收藏页就没生效(聊天记录页本来就传了,只有这条漏了)。后端
messageAvailability 在源消息被删/撤回时给 'removed'。
- workplace-collaboration-view: 日报"团队统计"的搜索占位符写着"搜索姓名/部门",但过滤用的
department_name 后端根本不返回(dailyReportListPayload 只有 report_id/author_id/report_date/
content_short/status/draft_updated_at/read_state/version),拼进来恒为空串,"部门"那半个
搜索永远搜不到任何东西。改为按真实有的字段搜(姓名+摘要),占位符也改成如实的;
卡片上同样读了这个不存在字段的角色徽章一并改掉。
- im-api: 企业注册申请 / 入口反馈 / 意见反馈三个接口后端都定义了 client_context 且会入库
(im_http.go:255/263/367,落库点 :790/:840/:1478),需求与对接文档也都要求带设备版本信息,
前端一直没发。在 im-api 层统一注入,三处调用点不用各写一遍。navigator.connection 不是所有
浏览器都有,拿不到就不发 network 这一项。
已用真实提交验证(返回 fb_G9GtMsAbSHQ6z6Li)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:59:09 +08:00
Your Name and Claude Opus 5
35d3e1cf6b
修复全页面走查发现的问题(第四批:精准查找、隐私锁定、搜索防抖)
...
精准查找搜不到手机号(第5章 5.5)
- 一直写死 type=exact_account,而该分支只比对 profile.public_account / u.username / u.id
(tenant_adapter.go:9170-9172),**不匹配 u.phone**。参考图 5.5 里输的恰恰是手机号,
这个场景必然搜不到。改为按输入形态分流:11 位 1 开头走 type=phone。
- phone 分支服务端不做 E.164 归一化(只有模糊的 account 分支才调 normalizeUserPhone),
库里存的是 +86 开头,所以裸号码由前端补区号——注册流程本来也是这么拼的。
- 已用真实后端验证请求正确路由为 q=%2B8613800001188&type=phone。
隐私设置忽略 editable(第10章 10.12/10.13)
- 后端 userPrivacyPayload 返回 editable{add_me_methods, profile_visibility,
last_seen_visibility, read_receipts} 表达"企业强制策略锁死了这一项",前端完全没读。
被锁的开关照样能点,点了 400 再回滚,用户只看到开关自己弹回去。现在禁用并给出说明文案,
同时补 .personal-switch:disabled 的视觉反馈(否则看不出为什么点不动)。
搜索防抖
- 新增共享的 useDebouncedValue,用在三处真正发服务端请求的搜索:收藏、会话内检索、
群列表、群文件。原来 query 直接进 effect 依赖,每敲一个字符发一次请求;群列表更糟,
reload 对三个分类各发一次,一个字符就是 3 个请求。而且返回顺序没有保证,后发的短前缀
请求可能后到、把正确结果覆盖掉。
- 实测:群列表输入 4 个字,请求数从 12 降到 3。
- FavoriteShare 那处搜索是本地过滤 chatList、不发请求,没有动。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:56:41 +08:00
Your Name and Claude Opus 5
c9b8125013
修复全页面走查发现的问题(第三批:转发、i18n、自聊天显示名)
...
第4章 批量转发
- 确认弹层里那栏留言是个只读 <div>,需求 4.19 与对接文档要求的"附加留言"根本没法填,
comment 永远是空串。改成真实输入框(方括号那段是占位文案不是内容),并补 input 的样式。
- 无条数上限:服务端硬卡 sources ≤ 100(im_http.go:3560),超了直接 400 MALFORMED_REQUEST,
用户只看到一句无从下手的"转发失败"。本地先拦并说清超了多少。
- 无目标数上限:bootstrap 下发 limits.max_forward_targets=9、服务端硬限 20,前端两个都不读。
读各视图已在写的同一份 bootstrap 缓存,不额外发请求;选择视图也补上错误显示。
i18n(这几条影响真实页面,不只是演示页)
- menu_item_forward "重定向" → "转发",forward_to "重定向消息" → "转发给"。Forward 被当网络
术语直译了,第4章通篇和参考图用的都是"转发"。
- last_seen_timestamp 中英两侧都丢了 {timestamp} 占位符,离线时头部只显示"最后可见"没有时间。
- peers_messaging_disabled "成员间消息已禁用" → "对方已关闭消息"(原文是 Peer's)。
- search_no_results "搜索返回任何结果" 缺"无";icon_title_send "发信息" → "发送消息"。
- 已跑 build:i18n 同步 src/i18n.min/(那份才是打包进产物的)。
自聊天显示名
- topicDisplayName 不处理 slf,消息首页把"已保存的消息"显示成"未命名会话"。该显示名靠
Tinode.isSelfTopicName 特判得出、不在 public 里。集中到这个共享函数,所有调用点都受益。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:45:13 +08:00
Your Name and Claude Opus 5
02b98cceae
修复全页面走查发现的问题(第二批:登录、通讯录、群聊)
...
第1章
- tinode-web: 手输密码登录失败会 navigateTo('') 把用户弹回企业码页,刚输的账号丢了,而
TenantEntry 不渲染 FormAlert,那句错误提示根本看不到。改成只有存储的 token 失效才回登录入口。
- auth-onboarding IdentityCheck: 限流 429 时服务端会连同未过期的 challenge_id 一起返回,
原来只显示错误文案、challengeId 留空,于是 submit 开头的守卫静默吞掉点击——输完验证码点
"确定"毫无反应也无提示。同文件 VerificationButton 早就处理对了,这里是漏抄。
- auth-onboarding Register: 手机号注册路径硬传 invite_code:'',把用户填的邀请码丢了。后端
user.go:175-181 对邀请码的校验和 RecordUse 不区分注册路径,UI 上也摆着这个输入框。
第5章
- 好友列表主副行显示同一串字:后端在有备注时把 display_name 也设成备注(im_http.go:8500-8507),
两个字段同值。加"不同才显示"的守卫。
- 拉黑确认弹窗把设置页当背景渲染并摆出"操作之后"的样子,但背景组件自己的 getUserProfile
回来后又把开关改回未拉黑、"删除好友"红条重新冒出来。加 pinBlocked 挡住这次覆盖。
第6章
- 群列表把群名显示成 topic id、成员数恒为 0。根因在后端:handler 用 store.Users.GetSubs,而
store 自己的注释就写着它 "Does not load Public/Trusted or Private"(store.go:834-835),
groupListItemPayload 却去读 sub.GetPublic()/GetSubCnt()(应该用 GetTopics)。已记为后端问题;
前端先用本地 Tinode 会话缓存兜底(消息首页一直这么取,是准的)。
- 禁言页每行头像画成群组图标(Avatar 兜底图标默认 'group',没传 icon="person"),
且顺带从成员表带上真实头像。
- 禁言页"以上成员不允许发言"被当成空状态用,语义正好反了——有禁言成员时这句消失、
一个都没有时反而显示。改为列表下方常驻注脚,空态另给文案,并补 .group-inline-note 样式。
- bytesToGB 只输出到 MB,1.4GB 的文件显示成 "1433.6 MB"。
- 群文件"来自"直接显示裸 uploader_id(groupFilePayload 不给昵称),拉成员表交叉引用。
- 群公告从聊天页横幅进入后返回,会把会话一起关掉:navigate 只写 query 参数,path[1] 仍为空,
handleHashRoute 就把 topicSelected 清成 null。Header 支持 onBack,显式把 topic 写回 path[1]。
- 群成员点头像打不开非好友资料页:目标页先读 'profile-seed:' 缓存,因为 getUserProfile 对
非好友直接 403。第5章入口一直有 seed,这里漏了。
- 群简介上限 225 超过后端硬限 200(im_http.go:4667),写满必被打回。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:40:53 +08:00
Your Name and Claude Opus 5
5a07bb4e3b
修复全页面走查发现的 P0 前端问题(第一批)
...
八个 agent 对 11 章逐页对照设计稿+后端源码后,先修其中"功能不可用/崩溃/谎报成功"级别的:
崩溃与数据错误
- content-library-view: Highlight 按 [start,len] 数组解构后端返回的 {start,end} 对象,
对象不可迭代会直接抛 TypeError,任何文本搜索命中都让整个结果区渲染崩掉。服务端偏移还叠加
两个问题(Go 字节下标 vs JS UTF-16;偏移基准是全文但 snippet 会被开窗截断),改为在展示
文本上本地匹配关键词。
- content-library-view: firstAttachment 用 Drafty.attachments,SDK 里硬过滤 tp=='EX'
只认文件附件,图片(IM)/视频(VD)/语音(AU) 一个都取不到——收藏缩略图、语音播放源、聊天记录
图片视频宫格全部拿不到资源。改用 Drafty.entities 按类型分派(chat-message.jsx 已有先例)。
- message-center-view: 系统通知的机器码兜底会把真实数据吞掉(日报提醒的 summary 就是日期
字符串 "2026-08-20",会议通知的 summary 是标题),改为查表命中才替换。
- message-center-view: 会话列表漏了 avatar 字段,每行都只能落到兜底图标;同文件
frequentContacts() 本来就是对的,照它补上。
功能不可用
- auth-onboarding-view: 首次开启青少年模式是死路——设完密码丢弃了服务端返回的
enable_action_token,从不调 enableYouthMode,用户走完短信验证+设密码后模式仍是关的。
现在拿着这个 token 把最后一步做完。
- group-management-view: "投诉/举报"是个 onToast('暂未开放') 死桩,而 target_type='group'
这条链路早就通了。接上真实举报页。
- tinode-web: 刷新/深链会被弹回首页。两个原因叠加:初始化白名单还是上游 Tinode 的
['cred','reset','register'];handleLoginSuccessful 无条件把 hash 改写成 workbench,
刷新触发的自动登录也走这条。抽出 SIDE_PANEL_VIEWS 常量复用,并区分登录流程与自动登录。
- widgets/meta-message: deleted 分支从未实现,撤回一条消息后时间线上什么都不剩。
谎报成功 / 判定错误
- tinode-web + personal-settings-view: 改密码不返回 Promise,服务端拒绝时照样弹"密码已更新"。
- group-management-view: 禁言批量读 result.succeeded,但该接口返回的是 {topic, items},
succeeded 恒为 undefined,不管成没成都弹"设置成功"。两个接口结构不同,分开判定。
- workplace-collaboration-view: 会议取消状态写成 'cancelled',后端是 'canceled' 单 l,
会议取消后"取消会议"按钮还挂着。
样式与显示
- base.css: 删掉旧版 .organization-department 的 padding-left !important,它压过按层级算出的
内联缩进,导致部门行全平、只有人员行缩进。
- base.css: 补 .youth-password-gate(原来 0 条规则),PIN 框缺 position:relative 和居中。
- security-support-view: shield_lock 不在经典 Material Icons 里(只有 Symbols),会显示成
字面文本;.risk-info-page 也是 0 条规则,整页渲染成裸项目符号列表。改用 verified_user 并
补上 .risk-dialog。
- contact-management-view: 好友资料页性别直接输出后端枚举,显示成 "male"。
- workplace-collaboration-view: 层级标注两条路径两种格式(树形深三层变"3级"、搜索硬传"三"),
统一成一个 helper。
已记录不在前端修的后端缺口:recallMessage 的 version 只能传 1,因为所有消息读取接口
(messagePayload/messageSearchPayload/mediaMessagePayload/favoriteSnapshot)都不下发 version,
冲突错误里也不回传真实值,被编辑过的消息撤回必然失败。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:31:26 +08:00
Your Name and Claude Opus 5
c4189646f4
消息首页:群聊头像图标、昨天的时间格式、常联系的人名字截断
...
对照 docs/images/消息.png 逐项核对消息首页,实测 DOM 后确认三处:
1. 群聊会话的兜底头像画成了单人像:normalizeConversations 没给任何会话设 icon,全部落到
Avatar 的默认值 person,列表里分不出哪条是群。按 topic 的 grp 前缀区分,群用 group 图标。
顺带把群的 online 传 undefined——群不存在"在线"概念,之前会给群也渲染一个状态点。
2. 昨天的会话只显示"昨天",参考图是"昨天21:03"带具体时间。实测修复后显示"昨天17:40"。
3. "常联系的人"的名字被截断:格子 3.75rem(50px),而 "kcg051307" 这类用户名需要 52px,
显示成 "kcg0513...";参考图里这一栏名字是完整显示的。加宽到 4.4rem,实测 59px 可见宽、
59px 实际宽,不再截断。
另外记录一个未改的观感偏差供决策:这一栏的头像实测占视口宽 10.1%(42.7px / 424px),参考图
里约占 17%,明显小一号。放大属于观感调整不是缺陷修复,没有自行改动。
本轮还做了一次全局层叠扫描(遍历 19 个页面,自动检测图标在容器内不居中、文字被压成 0 高度、
元素溢出视口、意外截断四类问题):除上面这处截断外没有新命中,说明之前群设置页那组 CSS 层叠
冲突是孤立的,没有蔓延到其他页面。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 18:09:00 +08:00
Your Name and Claude Opus 5
f7bc98811e
群聊设置:重做成员预览区,修掉错位间距、多余横线和被压扁的名字
...
用户实机截图反馈这块"图标和间距有问题"。对照 docs/images/群聊设置.png 逐项查证,实际有四个独立
缺陷叠在一起:
1. 多余横线:成员容器 div 和邀请按钮都是 section 的直接子元素,命中了通用列表项样式
(.group-settings section > button/div 带 border-bottom + min-height + padding),
于是这一块被当成两个普通设置行渲染,凭空多出两截下划线。
2. 间距错位:原来是 flex 布局,成员列表 flex:1 占满剩余宽度,把邀请按钮一路挤到最右,两者之间
出现一大片空白;参考图是等宽网格。
3. 名字看不见:全局 button 规则(base.css:1999)写死 height/line-height 2.2rem,成员格子没有
覆盖它,整个格子被压到 29px 高——48px 的头像直接溢出,名字被压成 0 高度,实测
getBoundingClientRect().height 为 0。
4. 图标撞车:成员头像的兜底图标沿用了 Avatar 的默认值 group(双人图标),跟上方群头像长得一模
一样,分不清哪个是群哪个是人;改传 icon="person"。
改成参考图的结构:一行"群成员"标题(右侧显示人数)+ 5 列等宽网格,最后一格是与头像同尺寸、
同圆角的浅色"添加"块。新样式用 .group-settings section > .group-member-* 提高特异性,明确压过
那套列表项规则,并显式写 height:auto 覆盖全局 button 高度。
刻意没做的两点,都是因为本分支没有对应页面,不想做点了没反应或跳错地方的入口:参考图里"查看
15465群成员"那个可点链接(没有通用群成员列表页,这里只展示人数文字),以及"删除"格(没有移除
成员的页面)。这两个缺口需要单独补页面,不在这次范围内。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 17:43:22 +08:00
Your Name and Claude Opus 5
8225848493
系统消息:按通知自身内容决定入口和文案,不再一律显示"前往安全设置"
...
用户实机测试反馈:系统消息列表里每条通知底部都是同一个"前往安全设置"按钮,点进去跟通知内容毫不
相关;正文还直接显示 "group.settings.updated" 这种原始事件码。查证后两个问题性质不同:
入口按钮(前端问题,已修):原来无条件对所有通知渲染同一个按钮、固定跳 security 页。改为按通知
自己的 action 字段决定——action.topic 是 grp 开头的进对应群聊设置页,好友申请类(action.type
为 friend_request)进"新朋友"页,带 device/ip 的安全类才进安全设置页,都不匹配就不显示按钮。
注意 action.topic 不能直接当群用:好友申请通知的 action 里带的是 p2p 会话 topic
(db/mysql/tenant_adapter.go:8643),所以判断加了 grp 前缀检查。跳转目标都核对过在
tinode-web.jsx 的路由白名单里(friend-requests / group-settings),没有凭空造路由名。
正文文案(后端问题,前端只做兜底):后端多处把机器码直接当 summary 写进通知——群事件统一写
summary=event.EventType(im_group_events.go:42-44,7 种群事件还共用同一个 title"群聊动态"),
好友申请处理结果写 summary=status(im_http.go:5956 等,值就是 "accepted"/"rejected")。前端加
了一层兜底:summary 命中"纯小写字母数字点下划线"这种机器码特征时,按已知码翻译成中文,翻译不了
就退回通用文案;后端以后补上真正的文案会自动优先使用,不会被兜底覆盖。这条已记入后端问题清单。
实机验证:两条群通知正文由 "group.settings.updated" 变为"群设置有更新"、按钮变为"查看群聊"且
点击后正确进入 grpXDkK5cbXoK0 的群聊设置页;两条好友通知正文由 "accepted" 变为"对方已通过你的
好友申请",不再显示无关的安全设置按钮。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 17:32:36 +08:00
Your Name and Claude Opus 5
3bdb0bf40f
群昵称改用专门的接口读取,修好读不回已保存值的问题
...
上一个commit修好了"群资料"页把群名称当成个人群昵称显示的问题,但实机验证发现改完仍然显示"未设置"。
抓包确认根因:GET /groups/{topic}/members 列表接口的每一项里压根没有 group_nickname 字段(只有
acs/display_name/mentionable/role/user_id),所以任何从成员列表里读昵称的写法,不管代码逻辑对不对,
都永远拿不到值——这个文件里原有的 MyNicknameEditor 也是同样的写法,同样存在这个问题(打开编辑器时
不会回填已保存的昵称)。
真正能读到昵称的是保存用的那个路径上对应的 GET:GET /groups/{topic}/members/me/profile,返回
{nickname, version, updated_at}(server/im_http.go:4776-4782)。im-api.js 里之前只封装了 PUT,
补上了对应的 getMyGroupProfile,两处读取(群资料页预览行、昵称编辑器回填)都改成用它。
实机验证:保存"测试昵称A"后重新打开群资料页,"群昵称"正确显示"测试昵称A","群名称"独立显示
"扫码测试群"。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 17:20:36 +08:00
Your Name and Claude Sonnet 5
251c9de87c
Convert im_webapp from static mock prototypes to real backend integration
...
Implements all 11 product chapters (auth, messaging, contacts, groups,
files/favorites, calls, workplace/reports, settings, security) against the
real /v1/im REST API and native Tinode WS protocol, replacing the hardcoded
mock data the ba8f48ee prototype commit shipped with. Adds src/lib/im-api.js
as the REST client, plus supporting fixes across messages-view.jsx and the
attachment/upload/download pipeline (wrong SDK auth headers, group topic
naming, seq/timezone edge cases) found via live end-to-end testing against
the real backend.
Backup checkpoint before reconciling with origin/dev's parallel rewrite.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
2026-09-03 11:40:53 +08:00
richjohnrambo
ba8f48ee83
完成 IM Web Android 端产品页面开发
2026-08-25 18:30:40 +08:00
or-else
14e1e6b549
bug fix: typo
2026-07-04 16:01:47 +03:00
or-else
70a9ab8996
firebase updated, two bugs related to fb fixed
2026-07-04 15:42:55 +03:00
or-else
d24b297685
adding new files
2026-07-04 15:19:29 +03:00
or-else
7bf3fa71d6
partially dependencies updated
2026-07-04 15:19:03 +03:00
or-else
6bd9afe017
update translations
2026-03-02 14:39:27 +03:00
or-else
91799adb9a
rebuilt, new translation modules added to git
2026-03-02 14:11:36 +03:00
or-else
3bfabc90f3
add missing vi translations, rearrange language imports in alpha order
2026-03-02 14:06:40 +03:00
or-else
573f99993a
rebuilt with the sdk bug fix
2026-03-01 19:05:14 +03:00
or-else
e6dfde28f6
restore topic subscription after a reconnect
2026-03-01 18:31:24 +03:00
or-else
389ef305ab
cleanup
2026-03-01 14:03:18 +03:00
or-else
2aa1b731ee
fix for #140 , fix for some UI breakage, cosmetic changes
2026-03-01 13:59:59 +03:00
or-else
656aebdb5d
rebuild with the correct version of the sdk
2026-02-13 15:43:24 +03:00
or-else
e9d6c2e5bf
fix #139 : use dvh/dvw css units for the top viewport size
2026-02-13 15:38:45 +03:00
or-else
e097f134b7
dependencies updated
2026-01-20 13:02:19 +03:00
or-else
d296bebe1c
bump version to 0.25.2
2026-01-20 13:00:39 +03:00
or-else
234fb48b93
cleanup
2026-01-20 12:58:58 +03:00
or-else
a54ae70746
split out a few modules, handle esc key
2026-01-19 15:41:33 +03:00
or-else
5b7565c8f8
debug logging removed
2026-01-17 12:58:36 +03:00
or-else
dea781b423
adding TheCard preview
2026-01-17 12:55:45 +03:00
or-else
930f4f0656
TheCard handling in messages
2026-01-16 20:51:57 +03:00
or-else
16489432cf
fix wallpaper defaults
2026-01-16 11:51:42 +03:00
or-else
8c3d273c34
missing translations added
2025-12-26 15:24:34 +03:00
or-else
b2bae67ed2
version bumped, dependencies updated
2025-12-12 09:13:31 +03:00
or-else
825a6661f3
dependencies updated, version changed to 0.25.0-rc1
2025-11-26 12:02:48 +03:00
or-else
c17a314640
fix dark mode button color
2025-11-08 10:20:30 +03:00
or-else
7fa83d0d3e
merge devel
2025-11-07 19:33:14 +03:00
or-else
b11d1f6d39
dependencies updated, version changed to 25.0-beta3, rebuilt
2025-11-07 15:09:26 +03:00
or-else
ad3c6f5d36
fixed position of controls in incoming call
2025-11-06 13:15:57 +03:00
or-else
4cd3e84178
make subscriber count work with older server
2025-10-28 12:32:52 +03:00
or-else
89c1cc7add
minor UI tweak, screenshots updated
2025-10-27 19:07:25 +03:00
or-else
0a1e2d3a3d
bump version, update dependencies
2025-10-27 10:27:40 +03:00
or-else
3a2a9f90d0
translations added
2025-10-27 10:13:54 +03:00
or-else
ca492e2e93
wallpapers in dark/light mode seem to work now
2025-10-26 21:51:40 +03:00
or-else
ec3974f2f0
dark/light mode wallpaper filters partially work
2025-10-26 19:56:55 +03:00
or-else
478fb421bf
wallpapers are done except the dark mode
2025-10-22 16:04:18 +04:00
or-else
0f8d94ac2f
wallpapers
2025-10-18 15:32:14 +03:00
or-else
1a884d2546
version set to 0.25.0-beta1
2025-10-15 14:52:09 +03:00
or-else
16e688d4c1
fix CallPannel: do not remount between menimized/full screen
2025-10-10 14:58:01 +03:00
or-else
369612afa8
rebuild with the sdk fix
2025-10-08 17:36:11 +03:00