|
| 1 | +import { HTMLAttributes } from 'react'; |
| 2 | +import { DropdownProps } from 'antd'; |
| 3 | + |
1 | 4 | import { ConversationProperties } from '../entity'; |
2 | | -import { IGroupTitleProps } from './GroupTitle'; |
3 | 5 |
|
| 6 | +/** |
| 7 | + * 单条会话信息结构 |
| 8 | + * 用于描述侧边栏会话列表中的一项 |
| 9 | + */ |
4 | 10 | export interface ConversationInfo extends ConversationProperties { |
| 11 | + /** 会话所属分组(用于分组展示,可选,默认以updateAt分组) */ |
5 | 12 | group?: string; |
| 13 | + /** 会话项自定义图标 */ |
6 | 14 | icon?: React.ReactNode; |
| 15 | + /** 是否禁用此会话(禁用点击与交互) */ |
7 | 16 | disabled?: boolean; |
8 | 17 | } |
9 | | - |
10 | | -export type GroupSorter = Parameters<[string, ConversationInfo[]][]['sort']>[0]; |
11 | | - |
12 | | -export type GroupTitleRenderComponents = { |
13 | | - components: { |
14 | | - GroupTitle: React.ComponentType<IGroupTitleProps>; |
| 18 | +/** |
| 19 | + * Conversations 会话组件入参 |
| 20 | + * 用于渲染会话列表与相关交互 |
| 21 | + */ |
| 22 | +export interface ConversationsProps extends React.HTMLAttributes<HTMLUListElement> { |
| 23 | + /** 会话列表数据源 */ |
| 24 | + conversations: ConversationInfo[]; |
| 25 | + /** 当前激活会话的 id(受控模式) */ |
| 26 | + activeKey?: ConversationInfo['id']; |
| 27 | + /** 默认激活会话 id(非受控模式) */ |
| 28 | + defaultActiveKey?: ConversationInfo['id']; |
| 29 | + /** |
| 30 | + * 自定义每一项的下拉菜单 |
| 31 | + * - 传入对象时:所有项共享同一配置 |
| 32 | + * - 传入方法时:可根据不同会话动态生成 |
| 33 | + */ |
| 34 | + dropdown?: |
| 35 | + | ConversationsItemProps['dropdown'] |
| 36 | + | ((info: ConversationInfo) => ConversationsItemProps['dropdown']); |
| 37 | + /** 是否启用按 group 分组展示(true 时使用默认配置,也可传入自定义 Groupable 配置) */ |
| 38 | + groupable?: boolean | Groupable; |
| 39 | + className?: string; |
| 40 | + style?: React.CSSProperties; |
| 41 | + loading?: boolean; |
| 42 | + /** 列表头部区域内容(false 表示不展示) */ |
| 43 | + header?: React.ReactNode | boolean; |
| 44 | + /** 是否为折叠状态(折叠时仅展示图标) */ |
| 45 | + collapsed?: boolean; |
| 46 | + /** 点击某条会话时触发 */ |
| 47 | + onItemClick?: (info: ConversationInfo) => void; |
| 48 | + /** 自定义渲染每一项的内容 */ |
| 49 | + renderItem?: (props: ConversationsItemProps) => React.ReactNode; |
| 50 | +} |
| 51 | +/** |
| 52 | + * Conversations.Item 单个会话项组件的入参 |
| 53 | + * 用于渲染侧边栏中的一条会话 |
| 54 | + */ |
| 55 | +export interface ConversationsItemProps extends Omit<HTMLAttributes<HTMLLIElement>, 'onClick'> { |
| 56 | + /** 当前会话项的数据对象 */ |
| 57 | + info: ConversationInfo; |
| 58 | + /** 是否为激活状态 */ |
| 59 | + active?: boolean; |
| 60 | + /** |
| 61 | + * 下拉菜单配置(用于操作会话项) |
| 62 | + * - 可传入 DropdownProps |
| 63 | + * - 支持通过 triggerDom 自定义触发节点 |
| 64 | + */ |
| 65 | + dropdown?: DropdownProps & { |
| 66 | + triggerDom?: |
| 67 | + | React.ReactNode |
| 68 | + | (( |
| 69 | + conversation: ConversationInfo, |
| 70 | + info: { originNode: React.ReactNode } |
| 71 | + ) => React.ReactNode); |
15 | 72 | }; |
16 | | -}; |
| 73 | + prefixCls?: string; |
| 74 | + onClick?: (info: ConversationInfo) => void; |
| 75 | +} |
| 76 | + |
| 77 | +/** |
| 78 | + * 分组组件入参 |
| 79 | + */ |
| 80 | +export interface GroupTitleProps { |
| 81 | + /** 分组标题内容 */ |
| 82 | + children?: React.ReactNode; |
| 83 | + prefixCls?: string; |
| 84 | +} |
17 | 85 |
|
| 86 | +/** |
| 87 | + * 处理之后的分组数据 |
| 88 | + */ |
18 | 89 | export type GroupInfo = { |
| 90 | + /** 分组内的会话列表 */ |
19 | 91 | conversations: ConversationInfo[]; |
| 92 | + /** 分组唯一标识(可选) */ |
20 | 93 | id?: string; |
| 94 | + /** 自定义渲染后的标题(Groupable.title 的结果) */ |
21 | 95 | title?: Groupable['title']; |
22 | 96 | name?: string; |
23 | 97 | }; |
| 98 | + |
| 99 | +/** 分组排序函数类型,来自 Array.sort 的入参类型 */ |
| 100 | +export type GroupSorter = Parameters<[string, ConversationInfo[]][]['sort']>[0]; |
| 101 | + |
| 102 | +/** 自定义分组标题渲染时可访问的内置组件 */ |
| 103 | +export type GroupTitleRenderComponents = { |
| 104 | + components: { |
| 105 | + GroupTitle: React.ComponentType<GroupTitleProps>; |
| 106 | + }; |
| 107 | +}; |
| 108 | +/** |
| 109 | + * 分组标题渲染函数 |
| 110 | + * 用于完全自定义分组标题渲染逻辑 |
| 111 | + */ |
24 | 112 | export type GroupTitleRender = |
25 | 113 | | ((groupInfo: GroupInfo, info: GroupTitleRenderComponents) => React.ReactNode) |
26 | 114 | | undefined; |
27 | 115 |
|
| 116 | +/** |
| 117 | + * 分组功能配置 |
| 118 | + * 控制会话列表是否按 group 分组显示 |
| 119 | + */ |
28 | 120 | export interface Groupable { |
29 | 121 | /** |
30 | 122 | * @desc 分组排序函数 |
|
0 commit comments