# 桌面通话邀请链接

桌面「发起通话」联系人选择框现在包含「邀请他人向我发起通话」入口。选择语音或视频后，生成移动端同一服务签发的回呼链接；收到链接的人可通过已有通话落地页向分享者发起呼叫。

## 行为

- 生成前先确认桌面通话引擎已登录并可等待来电。
- 生成成功自动复制链接，展示通话类型和失效时间。复制失败时保留可选择的完整链接，并提供重试按钮。
- 支持系统分享；无系统分享能力时复制邀请文案和链接。取消系统分享不会被报告为错误。
- 服务端链接有效期为 30 分钟，可重复使用。过期后停止复制和分享入口，允许重新生成。
- 关闭邀请弹窗后继续等待来电。来电沿用已打包通话组件的接听、拒绝和挂断界面；结束后恢复等待。
- 主动呼叫时暂停等待引擎，通话结束后恢复。来电和主动呼叫共用账号通话占用检查。
- 退出或切换账号会注销引擎、清除待处理凭据，并丢弃旧账号的异步结果。

## 接口和边界

- 桌面新增 `calls.invite.create`，服务端调用 `POST /api/v1/trtc/share-call-link/create`，参数 `call_media_type` 为语音 `0` / 视频 `1`。
- `calls.receiver.prepare` 仅在桌面受保护的 Host API 中取得当前账号通话凭据，不创建通话房间，也不预先开启摄像头或麦克风。
- `calls.receiver.claim` 复用现有通话占用、心跳和释放逻辑。
- 使用服务端返回的 `call_url` 与配置的 WebRTC origin 生成绝对链接；校验 origin、路径、token、账号、媒体类型和有效期。
- 不修改移动端、后端和链接落地页；通话 SDK bundle 内容及校验和保持原样，使用其已有的来电支持。主动呼叫仍使用 `outgoingOnly: true`，等待来电使用 `outgoingOnly: false`。

## 本次验证

2026-09-18：

- 15 个相关测试文件、260 项测试全部通过。覆盖邀请接口、失效和异常返回、分享交互、来电生命周期、账号切换、重连、原有呼出、联系人选择、摘要模板、私聊跳转、栏宽保存、引导流程、Host API 和通话资源。
- TypeScript 类型检查、完整插件构建、通话资源校验和及 `git diff --check` 通过。
- 使用真实 React 邀请组件和模拟服务响应检查浅色/深色布局、视频类型选择、生成结果、自动复制成功提示和关闭操作；这些检查不代表真实邀请链路已完成联机验收。
- 已登录的真实 DSH Web 中验证通话列表摘要、鼠标拖宽、刷新保留宽度、从通话详情进入对应已有私聊，以及联系人弹窗覆盖整个通话板块。

## 联机验收仍需执行

本地验收使用独立 DSH Web 预览。尚未向其他账号发送真实邀请或呼叫，以下双端验证仍需执行：

1. 安装候选版本并登录账号 A，分别生成语音和视频邀请链接。
2. 账号 B 在手机或浏览器打开链接并呼叫 A，确认桌面来电、接听、双方声音/画面、拒绝和挂断。
3. 关闭邀请弹窗、切换到其他桌面页面后再呼叫；同一链接在有效期内重复呼叫。
4. 检查原有主动呼叫、30 分钟后链接失效，以及退出/切换账号后不再显示旧账号来电。

## 通话记录和私聊入口补齐

- 通话列表兼容移动端摘要模板，按当前用户、联系人备注及参与者名称解析，不为每条记录额外请求详情。完成的摘要最多展示三行，生成中和失败状态各展示一行提示。
- 第二栏与详情之间支持拖动分隔线，沿用对话栏的绿色交互提示；宽度保存在当前 Web 的本地偏好中。支持左右方向键、Home/End，以及双击恢复默认宽度。窗口临时缩小时保留原偏好。
- 每条真实通话详情顶部增加「发起私聊」，按对方用户 ID 打开或复用会话；同名联系人不会误匹配。打开过程防重复点击，离开详情或切换账号后丢弃旧请求结果，失败可重试。
- 联系人选择弹窗使用有边框的搜索框、固定搜索和邀请入口、独立滚动联系人列表。弹窗浮层挂在通话板块根部，统一覆盖通话记录、分隔线和详情，以两栏整体居中；左侧全局导航不纳入遮罩。
