调整内置功能
内置功能可以调整到三个程度:开关、换位置、自己摆放。
三档
哪些功能能换位置
只有带独立控件的功能可以换位置:
其余功能的位置是固定的,只能开关:复制、赞踩、重新生成在回答的操作栏;编辑在用户消息上;划词追问在选中文字旁边。
会话列表不属于这里:它是单独的组件 SessionList,本来就由业务方摆放,见会话列表。
自己摆放
写 slot: false 后,把导出的组件放进任意插槽:
放到聊天区之外:ChatkitProvider
要把内置组件放到页面头部、侧边栏这些聊天区之外的地方,用 <ChatkitProvider> 把页面包起来:
ChatkitProvider接受聊天配置和children。里面的<Chatkit />继承配置,自身提供的值优先;settings、features、slots、renderers只在各组第一层合并,嵌套对象整体替换。例如覆盖settings.composer时,需要一并保留所需的hidden/disabled等字段。sessions与runtime选择一个提供;完整应用使用前者,固定单会话使用后者。- 公开 hooks 在 Provider 下的组件里可用。共享配置应放在 Provider 上;仅写在
<Chatkit>上的onSend等覆盖不影响其外部兄弟组件。输入框和面板必须挂载后才能接受对应命令。 SessionList始终要显式传受控会话数组sessions和选择回调onSelect,Provider 不提供目录数据。useChatSessions的返回值传给 Chatkit/Provider 的sessions,不是传给 SessionList 的数组,见受控会话列表。
主题和作用域
上例中 Chatkit 和外置附件按钮都使用暗色;root 只落在 Chatkit 根节点,外置按钮有自己的 .chatkit-wrapper。VoiceInput 在外置时也有独立 wrapper。Provider 的 root.className/style 不复制到这些 wrapper,因此覆写 Chatkit 根节点的品牌色不会自动影响外置控件。
Provider 的 theme 和 root 是默认配置;Chatkit 自己传入时按顶层整体替换,不深合并。例如实例只传 root={{ className: 'other-chat' }} 就不会保留 Provider 的 480px 高度。显式 theme={{ appearance: 'inherit' }} 会重新跟随该实例最近的 DOM 主题祖先。
需要共享品牌色时,给这组组件的宿主容器起一个业务类名,并直接命中它里面的 wrapper:
这里会命中该容器内的每个 wrapper,包括嵌套实例;只覆盖一个实例时应使用更精确的选择器。明暗继承、独立入口分类和焦点模式差异见主题与样式覆盖。
哪些导出不能直接放在 Provider 旁边
ComposerAddAttachment 是 Chatkit 内的附件菜单,StaticMarkdownText 读取内部渲染配置;它们应通过 Chatkit 的插槽或消息渲染器使用。外层 ChatkitProvider 提供共享运行时和配置,并不等于内部 Chatkit context;仅手工加 .chatkit-wrapper 也不能补齐这个 context。
要在聊天区外选文件,用 AttachmentButton;要在聊天区外将语音转写写入输入框,用同一 Provider 下的 VoiceInput,且输入框需要已挂载。只有样式可见,不表示上传或输入框命令已就绪。TooltipIconButton 则可在没有 Provider 时独立显示,主题跟随自己的 DOM 祖先,不读取 Provider 的显式明暗配置。
配置项
false | ChatkitToolbarSlotName'composer.toolbarStart'附件按钮的位置;`false` 表示不自动放,由接入方自己摆。false | ChatkitToolbarSlotName'composer.toolbarEnd'语音按钮的位置;`false` 表示不自动放,由接入方自己摆。说明
slot写了这个功能不支持的位置时,控件放回默认位置。- 内置功能和业务方的内容走同一套插槽:排序、错误隔离的规则一样,内置功能的顺序固定在负数
order之后。 - 功能的显示条件不变:自己摆放的
AttachmentButton在没有给upload时同样不显示。