@unif/react-native-chat 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -0
- package/lib/commonjs/bubble/Bubble.js +131 -0
- package/lib/commonjs/bubble/Bubble.js.map +1 -0
- package/lib/commonjs/bubble/BubbleList.js +73 -0
- package/lib/commonjs/bubble/BubbleList.js.map +1 -0
- package/lib/commonjs/bubble/index.md +111 -0
- package/lib/commonjs/card-wrapper/CardWrapper.js +65 -0
- package/lib/commonjs/card-wrapper/CardWrapper.js.map +1 -0
- package/lib/commonjs/card-wrapper/index.md +78 -0
- package/lib/commonjs/conversations/Conversations.js +184 -0
- package/lib/commonjs/conversations/Conversations.js.map +1 -0
- package/lib/commonjs/conversations/index.md +90 -0
- package/lib/commonjs/index.js +63 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/prompts/Prompts.js +87 -0
- package/lib/commonjs/prompts/Prompts.js.map +1 -0
- package/lib/commonjs/prompts/index.md +81 -0
- package/lib/commonjs/sender/Sender.js +354 -0
- package/lib/commonjs/sender/Sender.js.map +1 -0
- package/lib/commonjs/sender/index.md +131 -0
- package/lib/commonjs/theme/tokens.js +67 -0
- package/lib/commonjs/theme/tokens.js.map +1 -0
- package/lib/commonjs/welcome/Welcome.js +152 -0
- package/lib/commonjs/welcome/Welcome.js.map +1 -0
- package/lib/commonjs/welcome/index.md +95 -0
- package/lib/module/bubble/Bubble.js +126 -0
- package/lib/module/bubble/Bubble.js.map +1 -0
- package/lib/module/bubble/BubbleList.js +68 -0
- package/lib/module/bubble/BubbleList.js.map +1 -0
- package/lib/module/bubble/index.md +111 -0
- package/lib/module/card-wrapper/CardWrapper.js +60 -0
- package/lib/module/card-wrapper/CardWrapper.js.map +1 -0
- package/lib/module/card-wrapper/index.md +78 -0
- package/lib/module/conversations/Conversations.js +179 -0
- package/lib/module/conversations/Conversations.js.map +1 -0
- package/lib/module/conversations/index.md +90 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/prompts/Prompts.js +82 -0
- package/lib/module/prompts/Prompts.js.map +1 -0
- package/lib/module/prompts/index.md +81 -0
- package/lib/module/sender/Sender.js +349 -0
- package/lib/module/sender/Sender.js.map +1 -0
- package/lib/module/sender/index.md +131 -0
- package/lib/module/theme/tokens.js +63 -0
- package/lib/module/theme/tokens.js.map +1 -0
- package/lib/module/welcome/Welcome.js +147 -0
- package/lib/module/welcome/Welcome.js.map +1 -0
- package/lib/module/welcome/index.md +95 -0
- package/lib/typescript/commonjs/bubble/Bubble.d.ts +29 -0
- package/lib/typescript/commonjs/bubble/Bubble.d.ts.map +1 -0
- package/lib/typescript/commonjs/bubble/BubbleList.d.ts +20 -0
- package/lib/typescript/commonjs/bubble/BubbleList.d.ts.map +1 -0
- package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts +22 -0
- package/lib/typescript/commonjs/card-wrapper/CardWrapper.d.ts.map +1 -0
- package/lib/typescript/commonjs/conversations/Conversations.d.ts +37 -0
- package/lib/typescript/commonjs/conversations/Conversations.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +20 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/prompts/Prompts.d.ts +27 -0
- package/lib/typescript/commonjs/prompts/Prompts.d.ts.map +1 -0
- package/lib/typescript/commonjs/sender/Sender.d.ts +58 -0
- package/lib/typescript/commonjs/sender/Sender.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme/tokens.d.ts +52 -0
- package/lib/typescript/commonjs/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/commonjs/welcome/Welcome.d.ts +39 -0
- package/lib/typescript/commonjs/welcome/Welcome.d.ts.map +1 -0
- package/lib/typescript/module/bubble/Bubble.d.ts +29 -0
- package/lib/typescript/module/bubble/Bubble.d.ts.map +1 -0
- package/lib/typescript/module/bubble/BubbleList.d.ts +20 -0
- package/lib/typescript/module/bubble/BubbleList.d.ts.map +1 -0
- package/lib/typescript/module/card-wrapper/CardWrapper.d.ts +22 -0
- package/lib/typescript/module/card-wrapper/CardWrapper.d.ts.map +1 -0
- package/lib/typescript/module/conversations/Conversations.d.ts +37 -0
- package/lib/typescript/module/conversations/Conversations.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +20 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/prompts/Prompts.d.ts +27 -0
- package/lib/typescript/module/prompts/Prompts.d.ts.map +1 -0
- package/lib/typescript/module/sender/Sender.d.ts +58 -0
- package/lib/typescript/module/sender/Sender.d.ts.map +1 -0
- package/lib/typescript/module/theme/tokens.d.ts +52 -0
- package/lib/typescript/module/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/module/welcome/Welcome.d.ts +39 -0
- package/lib/typescript/module/welcome/Welcome.d.ts.map +1 -0
- package/package.json +39 -8
- package/src/sender/Sender.tsx +2 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: CardWrapper 卡片容器
|
|
3
|
+
nav:
|
|
4
|
+
title: 组件
|
|
5
|
+
path: /components
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# CardWrapper 卡片容器
|
|
9
|
+
|
|
10
|
+
通用卡片路由容器,通过 `registry` props 注入实现卡片类型到组件的映射。
|
|
11
|
+
|
|
12
|
+
## 何时使用
|
|
13
|
+
|
|
14
|
+
- AI 回复中包含结构化卡片内容(产品列表、表单、图表等)
|
|
15
|
+
- 需要根据 `cardType` 动态渲染不同业务组件
|
|
16
|
+
|
|
17
|
+
## 代码示例
|
|
18
|
+
|
|
19
|
+
### 基本用法
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { CardWrapper, type CardComponentType } from '@unif/react-native-chat';
|
|
23
|
+
|
|
24
|
+
// 定义业务卡片
|
|
25
|
+
const ProductCard: CardComponentType = ({ data, actions }) => (
|
|
26
|
+
<View>
|
|
27
|
+
<Text>{data.productName as string}</Text>
|
|
28
|
+
<Text>{data.price as string}</Text>
|
|
29
|
+
</View>
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
// 注册卡片
|
|
33
|
+
const registry = {
|
|
34
|
+
product_list: ProductCard,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
<CardWrapper
|
|
38
|
+
cardType="product_list"
|
|
39
|
+
data={{ productName: '基金A', price: '1.2345' }}
|
|
40
|
+
actions={['buy', 'detail']}
|
|
41
|
+
registry={registry}
|
|
42
|
+
/>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 自定义 fallback
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<CardWrapper
|
|
49
|
+
cardType="unknown_type"
|
|
50
|
+
data={{}}
|
|
51
|
+
actions={[]}
|
|
52
|
+
registry={registry}
|
|
53
|
+
fallback={<Text>暂不支持此类型</Text>}
|
|
54
|
+
/>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## API
|
|
58
|
+
|
|
59
|
+
### CardWrapperProps
|
|
60
|
+
|
|
61
|
+
| 属性 | 说明 | 类型 | 默认值 |
|
|
62
|
+
|------|------|------|--------|
|
|
63
|
+
| cardType | 卡片类型标识 | `string` | - |
|
|
64
|
+
| data | 卡片数据 | `Record<string, unknown>` | - |
|
|
65
|
+
| actions | 可用操作列表 | `string[]` | - |
|
|
66
|
+
| registry | 卡片注册表 | `Record<string, CardComponentType>` | `{}` |
|
|
67
|
+
| fallback | 未知卡片类型的 fallback | `ReactNode` | 默认错误提示 |
|
|
68
|
+
| style | 容器样式 | `ViewStyle` | - |
|
|
69
|
+
| testID | 测试标识 | `string` | - |
|
|
70
|
+
|
|
71
|
+
### CardComponentType
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
type CardComponentType = React.ComponentType<{
|
|
75
|
+
data: Record<string, unknown>;
|
|
76
|
+
actions: string[];
|
|
77
|
+
}>;
|
|
78
|
+
```
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Conversations — 会话列表
|
|
5
|
+
*
|
|
6
|
+
* SectionList + 日期分组(今天/昨天/更早)
|
|
7
|
+
* 基于 ListItem 模式渲染
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React, { useCallback, useMemo } from 'react';
|
|
11
|
+
import { View, Text, TouchableOpacity, Alert, SectionList, StyleSheet } from 'react-native';
|
|
12
|
+
import { chatTokens } from "../theme/tokens.js";
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
function groupByDate(sessions) {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
|
|
17
|
+
const yesterdayStart = todayStart - 86400000;
|
|
18
|
+
const groups = [];
|
|
19
|
+
const today = [];
|
|
20
|
+
const yesterday = [];
|
|
21
|
+
const earlier = [];
|
|
22
|
+
for (const s of sessions) {
|
|
23
|
+
if (s.timestamp >= todayStart) {
|
|
24
|
+
today.push(s);
|
|
25
|
+
} else if (s.timestamp >= yesterdayStart) {
|
|
26
|
+
yesterday.push(s);
|
|
27
|
+
} else {
|
|
28
|
+
earlier.push(s);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (today.length > 0) groups.push({
|
|
32
|
+
title: '今天',
|
|
33
|
+
data: today
|
|
34
|
+
});
|
|
35
|
+
if (yesterday.length > 0) groups.push({
|
|
36
|
+
title: '昨天',
|
|
37
|
+
data: yesterday
|
|
38
|
+
});
|
|
39
|
+
if (earlier.length > 0) groups.push({
|
|
40
|
+
title: '更早',
|
|
41
|
+
data: earlier
|
|
42
|
+
});
|
|
43
|
+
return groups;
|
|
44
|
+
}
|
|
45
|
+
const Conversations = ({
|
|
46
|
+
items,
|
|
47
|
+
activeId,
|
|
48
|
+
onSelect,
|
|
49
|
+
onDelete,
|
|
50
|
+
onNew,
|
|
51
|
+
groupByDate: shouldGroup = true,
|
|
52
|
+
header,
|
|
53
|
+
style,
|
|
54
|
+
styles: semanticStyles,
|
|
55
|
+
testID = 'conversations'
|
|
56
|
+
}) => {
|
|
57
|
+
const sections = useMemo(() => {
|
|
58
|
+
if (shouldGroup) {
|
|
59
|
+
return groupByDate(items);
|
|
60
|
+
}
|
|
61
|
+
return [{
|
|
62
|
+
title: '',
|
|
63
|
+
data: items
|
|
64
|
+
}];
|
|
65
|
+
}, [items, shouldGroup]);
|
|
66
|
+
const handleDelete = useCallback(item => {
|
|
67
|
+
if (!onDelete) return;
|
|
68
|
+
Alert.alert('删除会话', `确定删除"${item.title}"?`, [{
|
|
69
|
+
text: '取消',
|
|
70
|
+
style: 'cancel'
|
|
71
|
+
}, {
|
|
72
|
+
text: '删除',
|
|
73
|
+
style: 'destructive',
|
|
74
|
+
onPress: () => onDelete(item.id)
|
|
75
|
+
}]);
|
|
76
|
+
}, [onDelete]);
|
|
77
|
+
const renderItem = useCallback(({
|
|
78
|
+
item
|
|
79
|
+
}) => {
|
|
80
|
+
const isActive = item.id === activeId;
|
|
81
|
+
return /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
82
|
+
style: [defaultStyles.sessionItem, semanticStyles?.item, isActive && defaultStyles.sessionItemActive, isActive && semanticStyles?.itemActive],
|
|
83
|
+
onPress: () => onSelect(item.id),
|
|
84
|
+
onLongPress: () => handleDelete(item),
|
|
85
|
+
activeOpacity: 0.7,
|
|
86
|
+
testID: `${testID}-item-${item.id}`,
|
|
87
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
88
|
+
style: defaultStyles.sessionTitle,
|
|
89
|
+
numberOfLines: 1,
|
|
90
|
+
children: item.title
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
}, [activeId, onSelect, handleDelete, semanticStyles, testID]);
|
|
94
|
+
const renderSectionHeader = useCallback(({
|
|
95
|
+
section
|
|
96
|
+
}) => {
|
|
97
|
+
if (!section.title) return null;
|
|
98
|
+
return /*#__PURE__*/_jsx(Text, {
|
|
99
|
+
style: [defaultStyles.sectionHeader, semanticStyles?.sectionHeader],
|
|
100
|
+
children: section.title
|
|
101
|
+
});
|
|
102
|
+
}, [semanticStyles]);
|
|
103
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
104
|
+
style: [defaultStyles.container, semanticStyles?.root, style],
|
|
105
|
+
testID: testID,
|
|
106
|
+
children: [header, onNew && /*#__PURE__*/_jsx(View, {
|
|
107
|
+
style: defaultStyles.newButtonWrapper,
|
|
108
|
+
children: /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
109
|
+
style: [defaultStyles.newButton, semanticStyles?.newButton],
|
|
110
|
+
onPress: onNew,
|
|
111
|
+
testID: `${testID}-new`,
|
|
112
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
113
|
+
style: defaultStyles.newButtonText,
|
|
114
|
+
children: "\uFF0B \u65B0\u5EFA\u4F1A\u8BDD"
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
}), /*#__PURE__*/_jsx(SectionList, {
|
|
118
|
+
sections: sections,
|
|
119
|
+
keyExtractor: item => item.id,
|
|
120
|
+
renderItem: renderItem,
|
|
121
|
+
renderSectionHeader: renderSectionHeader,
|
|
122
|
+
style: defaultStyles.list,
|
|
123
|
+
showsVerticalScrollIndicator: false,
|
|
124
|
+
stickySectionHeadersEnabled: false
|
|
125
|
+
})]
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const defaultStyles = StyleSheet.create({
|
|
129
|
+
container: {
|
|
130
|
+
flex: 1
|
|
131
|
+
},
|
|
132
|
+
newButtonWrapper: {
|
|
133
|
+
alignItems: 'center',
|
|
134
|
+
paddingVertical: 12,
|
|
135
|
+
paddingHorizontal: 20
|
|
136
|
+
},
|
|
137
|
+
newButton: {
|
|
138
|
+
flexDirection: 'row',
|
|
139
|
+
alignItems: 'center',
|
|
140
|
+
justifyContent: 'center',
|
|
141
|
+
width: '80%',
|
|
142
|
+
paddingVertical: 10,
|
|
143
|
+
borderRadius: chatTokens.radiusFull,
|
|
144
|
+
borderWidth: 1,
|
|
145
|
+
borderColor: chatTokens.colorPrimary
|
|
146
|
+
},
|
|
147
|
+
newButtonText: {
|
|
148
|
+
fontSize: 14,
|
|
149
|
+
fontWeight: '500',
|
|
150
|
+
color: chatTokens.colorPrimary
|
|
151
|
+
},
|
|
152
|
+
sectionHeader: {
|
|
153
|
+
fontSize: 12,
|
|
154
|
+
color: chatTokens.colorTextSecondary,
|
|
155
|
+
paddingHorizontal: 20,
|
|
156
|
+
paddingTop: 16,
|
|
157
|
+
paddingBottom: 6
|
|
158
|
+
},
|
|
159
|
+
sessionItem: {
|
|
160
|
+
flexDirection: 'row',
|
|
161
|
+
alignItems: 'center',
|
|
162
|
+
paddingHorizontal: 20,
|
|
163
|
+
paddingVertical: 12
|
|
164
|
+
},
|
|
165
|
+
sessionItemActive: {
|
|
166
|
+
backgroundColor: '#F3F4F6'
|
|
167
|
+
},
|
|
168
|
+
sessionTitle: {
|
|
169
|
+
flex: 1,
|
|
170
|
+
fontSize: 14,
|
|
171
|
+
fontWeight: '500',
|
|
172
|
+
color: chatTokens.colorText
|
|
173
|
+
},
|
|
174
|
+
list: {
|
|
175
|
+
flex: 1
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
export default /*#__PURE__*/React.memo(Conversations);
|
|
179
|
+
//# sourceMappingURL=Conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useCallback","useMemo","View","Text","TouchableOpacity","Alert","SectionList","StyleSheet","chatTokens","jsx","_jsx","jsxs","_jsxs","groupByDate","sessions","now","Date","todayStart","getFullYear","getMonth","getDate","getTime","yesterdayStart","groups","today","yesterday","earlier","s","timestamp","push","length","title","data","Conversations","items","activeId","onSelect","onDelete","onNew","shouldGroup","header","style","styles","semanticStyles","testID","sections","handleDelete","item","alert","text","onPress","id","renderItem","isActive","defaultStyles","sessionItem","sessionItemActive","itemActive","onLongPress","activeOpacity","children","sessionTitle","numberOfLines","renderSectionHeader","section","sectionHeader","container","root","newButtonWrapper","newButton","newButtonText","keyExtractor","list","showsVerticalScrollIndicator","stickySectionHeadersEnabled","create","flex","alignItems","paddingVertical","paddingHorizontal","flexDirection","justifyContent","width","borderRadius","radiusFull","borderWidth","borderColor","colorPrimary","fontSize","fontWeight","color","colorTextSecondary","paddingTop","paddingBottom","backgroundColor","colorText","memo"],"sourceRoot":"../../../src","sources":["conversations/Conversations.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Conversations 会话列表
|
|
3
|
+
nav:
|
|
4
|
+
title: 组件
|
|
5
|
+
path: /components
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Conversations 会话列表
|
|
9
|
+
|
|
10
|
+
按日期分组的会话列表组件,支持新建、选中、删除操作。
|
|
11
|
+
|
|
12
|
+
## 何时使用
|
|
13
|
+
|
|
14
|
+
- 展示聊天历史会话列表
|
|
15
|
+
- 需要按日期分组(今天/昨天/更早)
|
|
16
|
+
- 侧边栏会话管理
|
|
17
|
+
|
|
18
|
+
## 代码示例
|
|
19
|
+
|
|
20
|
+
### 基本用法
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Conversations } from '@unif/react-native-chat';
|
|
24
|
+
|
|
25
|
+
<Conversations
|
|
26
|
+
items={sessions}
|
|
27
|
+
activeId={currentSessionId}
|
|
28
|
+
onSelect={(id) => switchSession(id)}
|
|
29
|
+
onDelete={(id) => deleteSession(id)}
|
|
30
|
+
onNew={() => createNewSession()}
|
|
31
|
+
/>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 不分组
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<Conversations
|
|
38
|
+
items={sessions}
|
|
39
|
+
activeId={currentSessionId}
|
|
40
|
+
onSelect={handleSelect}
|
|
41
|
+
groupByDate={false}
|
|
42
|
+
/>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 自定义头部
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Conversations
|
|
49
|
+
items={sessions}
|
|
50
|
+
onSelect={handleSelect}
|
|
51
|
+
header={<DrawerHeader />}
|
|
52
|
+
/>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## API
|
|
56
|
+
|
|
57
|
+
### ConversationsProps
|
|
58
|
+
|
|
59
|
+
| 属性 | 说明 | 类型 | 默认值 |
|
|
60
|
+
|------|------|------|--------|
|
|
61
|
+
| items | 会话列表数据 | `ConversationItem[]` | - |
|
|
62
|
+
| activeId | 当前选中会话 ID | `string` | - |
|
|
63
|
+
| onSelect | 选中会话回调 | `(id: string) => void` | - |
|
|
64
|
+
| onDelete | 删除会话回调(长按触发) | `(id: string) => void` | - |
|
|
65
|
+
| onNew | 新建会话回调 | `() => void` | - |
|
|
66
|
+
| groupByDate | 按日期分组 | `boolean` | `true` |
|
|
67
|
+
| header | 列表顶部内容 | `ReactNode` | - |
|
|
68
|
+
| style | 容器样式 | `ViewStyle` | - |
|
|
69
|
+
| styles | 语义样式 | `Partial<ConversationsSemanticStyles>` | - |
|
|
70
|
+
| testID | 测试标识 | `string` | `'conversations'` |
|
|
71
|
+
|
|
72
|
+
### ConversationItem
|
|
73
|
+
|
|
74
|
+
| 属性 | 说明 | 类型 |
|
|
75
|
+
|------|------|------|
|
|
76
|
+
| id | 唯一标识 | `string` |
|
|
77
|
+
| title | 会话标题 | `string` |
|
|
78
|
+
| lastMessage | 最后一条消息 | `string` |
|
|
79
|
+
| timestamp | 时间戳(毫秒) | `number` |
|
|
80
|
+
| messageCount | 消息数量 | `number` |
|
|
81
|
+
|
|
82
|
+
### ConversationsSemanticStyles
|
|
83
|
+
|
|
84
|
+
| 属性 | 说明 | 类型 |
|
|
85
|
+
|------|------|------|
|
|
86
|
+
| root | 外层容器 | `ViewStyle` |
|
|
87
|
+
| newButton | 新建按钮 | `ViewStyle` |
|
|
88
|
+
| sectionHeader | 分组标题 | `TextStyle` |
|
|
89
|
+
| item | 会话项 | `ViewStyle` |
|
|
90
|
+
| itemActive | 选中态会话项 | `ViewStyle` |
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @unif/react-native-chat
|
|
5
|
+
* AI 聊天 UI 组件库 — Bubble、Sender、Conversations、Prompts、Welcome、CardWrapper
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Bubble
|
|
9
|
+
export { default as Bubble } from "./bubble/Bubble.js";
|
|
10
|
+
export { default as BubbleList } from "./bubble/BubbleList.js";
|
|
11
|
+
// Sender
|
|
12
|
+
export { default as Sender } from "./sender/Sender.js";
|
|
13
|
+
// Conversations
|
|
14
|
+
export { default as Conversations } from "./conversations/Conversations.js";
|
|
15
|
+
// Prompts
|
|
16
|
+
export { default as Prompts } from "./prompts/Prompts.js";
|
|
17
|
+
// Welcome
|
|
18
|
+
export { default as Welcome } from "./welcome/Welcome.js";
|
|
19
|
+
// CardWrapper
|
|
20
|
+
export { default as CardWrapper } from "./card-wrapper/CardWrapper.js";
|
|
21
|
+
// Theme
|
|
22
|
+
export { chatTokens } from "./theme/tokens.js";
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["default","Bubble","BubbleList","Sender","Conversations","Prompts","Welcome","CardWrapper","chatTokens"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA;AACA,SAAQA,OAAO,IAAIC,MAAM,QAAO,oBAAiB;AAEjD,SAAQD,OAAO,IAAIE,UAAU,QAAO,wBAAqB;AAGzD;AACA,SAAQF,OAAO,IAAIG,MAAM,QAAO,oBAAiB;AAGjD;AACA,SAAQH,OAAO,IAAII,aAAa,QAAO,kCAA+B;AAOtE;AACA,SAAQJ,OAAO,IAAIK,OAAO,QAAO,sBAAmB;AAGpD;AACA,SAAQL,OAAO,IAAIM,OAAO,QAAO,sBAAmB;AAOpD;AACA,SAAQN,OAAO,IAAIO,WAAW,QAAO,+BAA4B;AAGjE;AACA,SAAQC,UAAU,QAAO,mBAAgB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Prompts — 建议提示
|
|
5
|
+
* 水平 ScrollView + Chip 列表
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { View, Text, ScrollView, TouchableOpacity, StyleSheet } from 'react-native';
|
|
10
|
+
import { chatTokens } from "../theme/tokens.js";
|
|
11
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
|
+
const Prompts = ({
|
|
13
|
+
items,
|
|
14
|
+
onSelect,
|
|
15
|
+
disabled = false,
|
|
16
|
+
wrap = false,
|
|
17
|
+
style,
|
|
18
|
+
styles: semanticStyles,
|
|
19
|
+
testID = 'prompts'
|
|
20
|
+
}) => {
|
|
21
|
+
if (items.length === 0) return null;
|
|
22
|
+
const renderChips = () => items.map(item => /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
23
|
+
style: [defaultStyles.chip, semanticStyles?.chip],
|
|
24
|
+
onPress: () => !disabled && onSelect(item),
|
|
25
|
+
activeOpacity: disabled ? 1 : 0.7,
|
|
26
|
+
disabled: disabled,
|
|
27
|
+
testID: `${testID}-${item.id}`,
|
|
28
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
29
|
+
style: [defaultStyles.chipText, semanticStyles?.chipText, disabled && defaultStyles.chipTextDisabled],
|
|
30
|
+
numberOfLines: 1,
|
|
31
|
+
children: item.label
|
|
32
|
+
})
|
|
33
|
+
}, item.id));
|
|
34
|
+
if (wrap) {
|
|
35
|
+
return /*#__PURE__*/_jsx(View, {
|
|
36
|
+
style: [defaultStyles.container, defaultStyles.wrapContainer, semanticStyles?.root, style],
|
|
37
|
+
testID: testID,
|
|
38
|
+
children: renderChips()
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return /*#__PURE__*/_jsx(View, {
|
|
42
|
+
style: [defaultStyles.container, semanticStyles?.root, style],
|
|
43
|
+
testID: testID,
|
|
44
|
+
children: /*#__PURE__*/_jsx(ScrollView, {
|
|
45
|
+
horizontal: true,
|
|
46
|
+
showsHorizontalScrollIndicator: false,
|
|
47
|
+
contentContainerStyle: defaultStyles.scrollContent,
|
|
48
|
+
children: renderChips()
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
const defaultStyles = StyleSheet.create({
|
|
53
|
+
container: {
|
|
54
|
+
paddingVertical: 8,
|
|
55
|
+
backgroundColor: 'transparent'
|
|
56
|
+
},
|
|
57
|
+
scrollContent: {
|
|
58
|
+
paddingHorizontal: 12,
|
|
59
|
+
gap: 8
|
|
60
|
+
},
|
|
61
|
+
wrapContainer: {
|
|
62
|
+
flexDirection: 'row',
|
|
63
|
+
flexWrap: 'wrap',
|
|
64
|
+
paddingHorizontal: 12,
|
|
65
|
+
gap: 8
|
|
66
|
+
},
|
|
67
|
+
chip: {
|
|
68
|
+
backgroundColor: '#F3F4F6',
|
|
69
|
+
borderRadius: 16,
|
|
70
|
+
paddingHorizontal: 14,
|
|
71
|
+
paddingVertical: 8
|
|
72
|
+
},
|
|
73
|
+
chipText: {
|
|
74
|
+
fontSize: 13,
|
|
75
|
+
color: chatTokens.colorText
|
|
76
|
+
},
|
|
77
|
+
chipTextDisabled: {
|
|
78
|
+
color: chatTokens.colorTextPlaceholder
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
export default /*#__PURE__*/React.memo(Prompts);
|
|
82
|
+
//# sourceMappingURL=Prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","View","Text","ScrollView","TouchableOpacity","StyleSheet","chatTokens","jsx","_jsx","Prompts","items","onSelect","disabled","wrap","style","styles","semanticStyles","testID","length","renderChips","map","item","defaultStyles","chip","onPress","activeOpacity","id","children","chipText","chipTextDisabled","numberOfLines","label","container","wrapContainer","root","horizontal","showsHorizontalScrollIndicator","contentContainerStyle","scrollContent","create","paddingVertical","backgroundColor","paddingHorizontal","gap","flexDirection","flexWrap","borderRadius","fontSize","color","colorText","colorTextPlaceholder","memo"],"sourceRoot":"../../../src","sources":["prompts/Prompts.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Prompts 建议提示
|
|
3
|
+
nav:
|
|
4
|
+
title: 组件
|
|
5
|
+
path: /components
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Prompts 建议提示
|
|
9
|
+
|
|
10
|
+
水平滚动的建议提示 Chip 列表,可选换行模式。
|
|
11
|
+
|
|
12
|
+
## 何时使用
|
|
13
|
+
|
|
14
|
+
- AI 回复后展示后续建议问题
|
|
15
|
+
- 欢迎页展示快捷提问入口
|
|
16
|
+
|
|
17
|
+
## 代码示例
|
|
18
|
+
|
|
19
|
+
### 水平滚动
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { Prompts } from '@unif/react-native-chat';
|
|
23
|
+
|
|
24
|
+
<Prompts
|
|
25
|
+
items={[
|
|
26
|
+
{ id: '1', label: '查询余额' },
|
|
27
|
+
{ id: '2', label: '转账汇款' },
|
|
28
|
+
{ id: '3', label: '理财推荐' },
|
|
29
|
+
]}
|
|
30
|
+
onSelect={(item) => console.log(item.label)}
|
|
31
|
+
/>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 换行模式
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<Prompts
|
|
38
|
+
items={suggestions}
|
|
39
|
+
onSelect={handleSelect}
|
|
40
|
+
wrap={true}
|
|
41
|
+
/>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 禁用状态
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<Prompts
|
|
48
|
+
items={suggestions}
|
|
49
|
+
onSelect={handleSelect}
|
|
50
|
+
disabled={isRequesting}
|
|
51
|
+
/>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## API
|
|
55
|
+
|
|
56
|
+
### PromptsProps
|
|
57
|
+
|
|
58
|
+
| 属性 | 说明 | 类型 | 默认值 |
|
|
59
|
+
|------|------|------|--------|
|
|
60
|
+
| items | 建议项列表 | `PromptItem[]` | - |
|
|
61
|
+
| onSelect | 选中回调 | `(item: PromptItem) => void` | - |
|
|
62
|
+
| disabled | 禁用状态 | `boolean` | `false` |
|
|
63
|
+
| wrap | 换行模式(FlexWrap) | `boolean` | `false` |
|
|
64
|
+
| style | 容器样式 | `ViewStyle` | - |
|
|
65
|
+
| styles | 语义样式 | `Partial<PromptsSemanticStyles>` | - |
|
|
66
|
+
| testID | 测试标识 | `string` | `'prompts'` |
|
|
67
|
+
|
|
68
|
+
### PromptItem
|
|
69
|
+
|
|
70
|
+
| 属性 | 说明 | 类型 |
|
|
71
|
+
|------|------|------|
|
|
72
|
+
| id | 唯一标识 | `string` |
|
|
73
|
+
| label | 显示文字 | `string` |
|
|
74
|
+
|
|
75
|
+
### PromptsSemanticStyles
|
|
76
|
+
|
|
77
|
+
| 属性 | 说明 | 类型 |
|
|
78
|
+
|------|------|------|
|
|
79
|
+
| root | 外层容器 | `ViewStyle` |
|
|
80
|
+
| chip | Chip 样式 | `ViewStyle` |
|
|
81
|
+
| chipText | Chip 文字 | `TextStyle` |
|