Your Name and Claude Opus 5
505a6d7d56
补齐第3-4章composer功能缺口:跨话题草稿/@提醒/表情面板/附件面板/名片/收藏发送/按住说话/语音未读红点
...
第3-4章复测确认这批原型图要求的功能之前完全没做(真实聊天引擎 messages-view.jsx/
send-message.jsx 从Ch1开始一直是最基础的版本:两个附件图标+文本框+发送/麦克风,
没有@、没有表情面板、没有7宫格附件面板、没有名片/收藏发送、语音是点一下进入录音模式
不是按住说话)。这次一次性把8项都接上,除了新功能外,过程中顺带发现并修了4个真bug。
**跨话题草稿**(im-api.js 新增 getTopicDraft/updateTopicDraft,messages-view.jsx)
话题切换时拉取 GET /topics/{topic}/draft(真实验证过P2P用原生话题名——对方user_id——
可以正常读写,接口内部自己会查Subs.Get校验,不需要额外归一化),输入框内容600ms防抖
PUT回去;真正发送成功后立即清空服务端草稿,不等下一次防抖。真实验证:输入文字→切走
再切回→草稿还在;刷新整个页面(新WS会话)→草稿依然从服务端正确恢复。
**@提醒**(send-message.jsx 新增 mention 相关状态和UI,messages-view.jsx 新增
mentionSearch/mentionedUsers/applyMentionResolution)
只在群聊开放,检测"光标前最近一个未闭合的@"触发面板,调 getGroupMembers(topic,
{mentionable:true, query}) 做实时搜索。协议层面:Tinode原生Drafty.parse本来就会把
纯文本里的"@word"自动识别成MN实体,但data.val存的是匹配到的原始文字,不是uid——
真正的uid只有用户从选择器里点选时才知道,记在 messages-view.jsx 的
this.mentionedUsers,发送前重新parse一遍把匹配上的占位符换成真uid。真实验证:选
"kcg051307"发送后直接查后端存储,MN实体的data.val确认是真实uid
"usrYVeV0yZs8tw",不是原始文字。
**表情面板**(send-message.jsx)
2个tab(😊 表情/♡常用),常用表情本地localStorage维护。图片没有拍到第二个tab具体
内容,判断"常用"是这类两tab设计里最常见、也是本项目里唯一有本地存储依据能撑起来的
语义。真实验证:点表情正确插入文本框,用过的表情正确出现在"常用"tab。
**7宫格附件面板**(send-message.jsx,替换原来常驻的照片/文件两个图标)
照片/拍摄/语音通话/名片/文件/收藏/视频通话。语音通话、视频通话复用第8章已有的
handleStartAudioCall/handleStartVideoCall(从 tinode-web.jsx 新抽出 canStartCall()
方法,同时替换掉"..."菜单里原来的内联判断,避免同一个判断逻辑两处维护),仅P2P且
真实通话功能可用时才不置灰——真实验证过群聊里这两项正确显示为禁用状态。
**名片消息**(send-message.jsx openCardPicker/sendCard,复用原生TheCard/
Drafty.appendTheCard)
选好友生成名片,uid必须用TheCard.setTinodeID写进vCard的comm数组(不是随便塞进某个
字段——widgets/the-card-mini.jsx渲染时用TheCard.getFirstTinodeID读这个协议项来判断
"发消息"按钮指向谁)。真实验证:选中好友后发出的名片消息真实带"聊天"按钮,点击可用。
**收藏发送到当前会话**(send-message.jsx openFavPicker/sendFavorite,复用Ch7的
forwardFavorites接口)
真实联调中发现并修复一个新bug:这个接口和其它几个批量接口一样,HTTP层恒定200,
真实成败要看items[].status——原来的写法完全没检查这个字段,等于假装总是成功。已改成
检查失败项并报错。同时真实测试还发现该接口对P2P目标会返回200+items[0].status:
"failed", reason:"PERMISSION_DENIED"(哪怕是真实好友、这个会话本身发消息完全正常),
看起来是后端这个接口自己的写权限判断有问题,不是前端能修的,已记录。
**按住说话+上滑取消录音**(send-message.jsx新增手势处理,audio-recorder.jsx新增
holdMode展示态)
mousedown/touchstart直接挂载AudioRecorder(挂载即开始录音,复用原有机制不动),
移动超过80px判定为"松开取消",松手时通过ref直接调组件内部的handleDone/handleDelete。
过程中发现并修复3个真bug:① injectIntl包裹AudioRecorder默认不支持ref转发
("Function components cannot be given refs"警告,ref静默失效),加
{forwardRef:true}修好;② handleDelete从来没有像handleDone那样判空mediaRecorder,
录音还没真正开始(getUserMedia尚未resolve)就点删除会直接抛TypeError,这是原有代码
一直存在的问题,这次因为按住松手可能在录音刚开始的瞬间发生而被真实触发;③
cleanUp()同理没判空this.stream。补上判空后,"从未真正开始录音就结束"这个场景会
直接当作取消处理并正确调用onDeleted,不会再把UI卡在录音态出不来(真实验证:这个
环境的浏览器面板本身会拦截麦克风访问,用这个"getUserMedia永远拒绝"的真实场景反而
完整测出了正常/取消两条路径在录音真正开始前结束时都不再卡死或报错)。
**语音消息未读红点**(chat-message.jsx/audio-player.jsx/formatters.js)
纯客户端概念,原生Tinode的recv/read只到"消息本身有没有被看到",跟"这条语音有没有
真的被点开听过"是两回事。audio-player.jsx的播放按钮新增可选onPlay回调(不传不影响
现有调用方),formatters.js的AU分支透传给它,chat-message.jsx按话题维护一份
localStorage"已播放seq集合",对收到的(非自己发的)语音消息,没播放过就在气泡右上角
显示红点。真实验证:用原生SDK的_routeData往话题本地缓存注入一条真实结构的语音消息
(浏览器面板拦截麦克风,没有真实语音消息可用,用这个方式验证渲染/播放回调/持久化
三段逻辑),红点正确出现;直接触发播放回调后红点消失且localStorage正确写入对应seq。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 21:59:09 +08:00
Your Name and Claude Opus 5
d01547d3de
重新生成 base.min.css(自9月3日起已落后11次真实CSS提交,生产环境从未见过)
...
生产环境的 index.html 引用的是 base.min.css,本地/测试用的 index-dev.html 引用的
是未压缩的 base.css——这次全需求复测(含第6-11章一系列真实bug修复+今天新增的
实名提醒弹窗/群主转让确认等样式)改的都是 base.css,没有一次顺手跑
`npm run build:css` 重新生成压缩版。也就是说,这段时间验证过的每一处CSS修复,
如果现在直接照旧部署 index.html 到生产,用户会一处都看不到。
跑 `npx postcss css/base.css > css/base.min.css` 补上这次遗漏,往前追平到
c4189646 之后累计的 11 次 base.css 提交。这个文件本身是纯构建产物(postcss确定性
输出,源头 base.css 早就在开发环境反复验证过),不涉及任何新的手写代码,但下次
真正部署生产环境前必须包含这次重新生成的版本,否则等于白修。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 17:21:33 +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
0ba3577c96
群头像图标贴顶不居中;成员格子文字区过窄
...
用户实机反馈的三点,逐项查证后:
1. 图标垂直不居中(真bug,已修):.group-settings-header span 这条规则把 .group-avatar 一起
命中了——它本身就是个 span,被改成 flex-direction:column 之后,自己的 place-items:center
只剩交叉轴(水平)生效,主轴(垂直)退回 flex-start,图标贴着方块顶部。实测头部群头像上边距
0px、下边距 28.7px,左右各 14.3px,正好对应这个成因。选择器改为
> span:not(.group-avatar) 精确排除;同时给 .group-avatar 补 align-content/justify-content,
以后再被外部规则改成 flex 也不会散架。修完三处(头部群头像、成员头像、添加格)实测上下左右
边距全部对称。
2. 文字区过窄只显示两个字(真问题,已修):上一版把成员格子宽度收到与头像等宽(3rem),昵称
被截成"测试..."。按参考图比例重算——那张图里头像约占格子宽七成、相邻头像间隙约头像宽四成,
且五字昵称完整显示——格子改 4.4rem、头像改 3.6rem、间距 0.5rem。实测"测试昵称A"完整显示
不再截断。
3. 头像配色:上一版我把兜底头像从饱和蓝底白图标改成了浅蓝底蓝图标,这是自作主张、用户没要求,
已还原成原来的 #4389df 底 + 白色图标。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 17:54:22 +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 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
or-else
7bf3fa71d6
partially dependencies updated
2026-07-04 15:19:03 +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
e9d6c2e5bf
fix #139 : use dvh/dvw css units for the top viewport size
2026-02-13 15:38:45 +03:00
or-else
a54ae70746
split out a few modules, handle esc key
2026-01-19 15:41:33 +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
c17a314640
fix dark mode button color
2025-11-08 10:20:30 +03:00
or-else
896505e49d
fix incoming call colors in dark mode
2025-11-06 18:39:05 +03:00
or-else
ad3c6f5d36
fixed position of controls in incoming call
2025-11-06 13:15:57 +03:00
or-else
b4ba9ab7d8
slightly stronger indicator of pinned chat
2025-10-28 12:36:05 +03:00
or-else
89c1cc7add
minor UI tweak, screenshots updated
2025-10-27 19:07:25 +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
16e688d4c1
fix CallPannel: do not remount between menimized/full screen
2025-10-10 14:58:01 +03:00
or-else
1085d1caf6
allow messaging while call is in progress (same topic only for now)
2025-10-08 16:49:45 +03:00
or-else
44e2fc3a23
rebuilt with the sdk changes
2025-09-30 14:41:02 +03:00
or-else
e505b0a607
minor visual adjustments
2025-09-29 20:52:17 +03:00
or-else
a74ad9dd63
adjust pinned topic background in dark mode
2025-09-24 19:41:20 +03:00
or-else
5faacc1f53
pinning topics work as expected
2025-09-23 17:08:34 +03:00
or-else
4818ee7a25
support for pinning topics; truncate text with support for RTL languages
2025-09-20 18:18:01 +03:00
or-else
0fb5132d24
fix error color in dark mode
2025-09-14 17:50:35 +03:00
or-else
89e9b85551
cropper: fix incorrect image positioning after zoom-out
2025-08-21 10:13:43 +03:00
or-else
0b05d480c7
change fixed color to light-dark
2025-08-10 12:18:43 +03:00
or-else
7d1011400e
merge devel
2025-08-10 12:15:14 +03:00
or-else
fa436b61be
remove unused css style
2025-08-09 14:45:14 +03:00
or-else
bb1a3f4cea
some colors fixed in doc preview
2025-08-09 09:43:40 +03:00
or-else
6a208cf040
rebuilt
2025-07-09 10:54:31 +03:00
or-else
6d02cc903c
dark mode mostly done
2025-06-13 16:26:48 +03:00
or-else
7c6fb38b02
rebuilt
2025-05-28 12:56:59 +03:00
or-else
7d627edfce
make background dark when viewing images
2025-05-01 15:05:42 +03:00
or-else
11436a80ee
support fro unique aliases, https://github.com/tinode/chat/issues/446
2025-03-04 13:05:51 +03:00
or-else
30bf77d4ba
sending messages to self works
2025-02-16 22:06:02 +03:00
or-else
6c1c8cf336
removed incomplete video conferences
2025-02-14 21:40:44 +03:00
or-else
f91d8a979d
implement touch swiping pinned messages
2025-02-14 17:38:49 +03:00
or-else
17b91c4bb8
prevent accidental clicks from tiggering scroll
2025-02-09 18:46:36 +03:00
or-else
02e8bd2f74
merge devel
2025-02-08 19:50:34 +03:00
or-else
bc8f20977e
changed browserslist config, improved browser sleep detection
2025-02-07 20:59:45 +03:00
or-else
ed34a46865
make emoji-only messages larger for 1-5 emojis
2024-05-08 13:39:10 -07:00
or-else
a4befc4cd3
make font larger for emoji-only messages
2024-05-01 14:36:18 -07:00
or-else
9eaa172030
add QR code display
2024-02-02 16:26:49 -08:00
or-else
df4b9c312a
fix height of title panel in image preview
2023-06-27 19:06:29 -07:00