三路独立codereview(群成员UI+资料弹窗 / 未读红点+转发修复 / 搜索+复制修复) 发现并修复: - UserCardRoot 资料弹窗此前完全没读 profile.relationship,对陌生人也直接 显示"发消息"/通话按钮——现在按好友/待验证/对方已申请/不可添加/添加好友 五态分支,和 FriendProfileView 保持一致,接入 AddFriendModal。 - useEscapeKey 注册位置错误:挂在常驻的 UserCardRoot 而不是随卡片开关的 UserCardPanel,导致从其他弹层里打开资料卡片时,按 Escape 关掉的是底下 那层弹层而不是卡片本身。 - "移出"格子的可见性此前只判断 isAdmin,在"群主+多个管理员、没有普通成员" 的群里会显示格子但点进去一个能移出的都没有——改成同时判断成员列表里 是否真的存在能移出的对象。 - flatForwardPayload 对图片/文件/语音/视频/名片/通话结果类消息,转发时直接 返回了原消息的 content 对象引用而不是拷贝——SDK 出站前会就地删除假值 字段,等于转发的同时悄悄改写了原消息在本地缓存里的内容。改成每次转发都 返回浅拷贝;顺手让检查顺序和其余识别这几种格式的地方保持一致(先判类型 明确的附件/名片/通话结果,再判无类型标记的纯文本),并补上和 mobileAttachmentContentOf/contactCardContentOf 同样的字段合法性校验。 - confirmedReadSeq 等聊天列表相关的模块级缓存此前从未在登出/切换企业时清 空——同一个标签页不刷新页面直接换账号登录,会把上一个账号的"已读到哪" 当成新账号的下限,把新账号真实未读的自聊消息误判为已读。补了统一的 reset监听机制(connection.ts 的 resetTinode 现在会广播),topics.ts 据此 清空所有相关缓存。 - 复制功能补final `?? ''`兜底,防止附件数据本身不完整时仍复制出"undefined"。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tinode Web
Briefing
Single-page web chat application for Tinode. The app is built on React. The Tinode javascript SDK has no external dependencies. Overall, it's a lot like open source WhatsApp or Telegram web apps.
Although the app is generally usable, keep in mind that this is work in progress. Some bugs probably exist, some features are missing. The app was tested in the latest Chrome & Firefox only. NPM package is available.
Try possibly newer or older version live at https://sandbox.tinode.co/.
For demo access and other instructions see here.
Installing and running
This is NOT a standalone app, this is just a frontend, a client. It requires a backend. See installation instructions. See instructions for enabling push notifications.
Getting support
- Read client-side and server-side API documentation.
- For support, general questions, discussions post to https://groups.google.com/d/forum/tinode.
- For bugs and feature requests open an issue.
- Use https://tinode.co/contact for commercial inquiries.
Helping out
- If you appreciate our work, please help spread the word! Sharing on Reddit, HN, and other communities helps more than you think.
- Consider buying paid support: https://tinode.co/support.html
- If you are a software developer, send us your pull requests with bug fixes and new features.
- If you use the app and discover bugs or missing features, let us know by filing bug reports and feature requests. Vote for existing feature requests you find most valuable.
- If you speak a language other than English, translate the apps into your language. You may also review and improve existing translations.
- If you are a UI/UX expert, help us polish the app UI.
- Use it: install it for your colleagues or friends at work or at home.
Internationalization
The app is fully internationalized using React-Intl. The UI language is selected automatically from the language specified by the browser. A specific language can be forced by adding #?hl=XX parameter to the URL when starting the app, e.g. https://web.tinode.co/#?hl=fr.
The app is currently available in the following languages:
- English - default
- Arabic
- Chinese simplified
- Chinese traditional
- French
- German
- Italian
- Korean
- Romanian
- Russian
- Spanish
- Thai
- Ukrainian
- Vietnamese
More translations are welcome. See instructions.
Not done yet
- End-to-End encryption.
- Emoji support is weak.
- Mentions, hashtags.
- Previews not generated for links and docs.
- Location and contact sharing.
- Recording video messages.
Other
- Demo avatars and some other graphics are from https://www.pexels.com/ under CC0 license.
- Background patterns from http://subtlepatterns.com/, commercial and non-commercial use allowed with attribution.
- Fonts and icons from Google under license which permits commercial and non-commercial use.
- Push notifications built with https://firebase.google.com/.






