react-native-chatbot-ai 0.1.0 → 0.1.1
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/lib/module/components/chat/ChatEmpty.js +6 -1
- package/lib/module/components/chat/ChatEmpty.js.map +1 -1
- package/lib/module/components/chat/ChatMessageList.js +33 -6
- package/lib/module/components/chat/ChatMessageList.js.map +1 -1
- package/lib/module/components/chat/item/ChatAIAnswerMessageItem.js +28 -7
- package/lib/module/components/chat/item/ChatAIAnswerMessageItem.js.map +1 -1
- package/lib/module/components/chat/item/ChatAIThinkingMessageItem.js +18 -7
- package/lib/module/components/chat/item/ChatAIThinkingMessageItem.js.map +1 -1
- package/lib/module/constants/events.js +2 -1
- package/lib/module/constants/events.js.map +1 -1
- package/lib/typescript/src/assets/icons/index.d.ts.map +1 -1
- package/lib/typescript/src/components/chat/ChatEmpty.d.ts.map +1 -1
- package/lib/typescript/src/components/chat/ChatMessageList.d.ts.map +1 -1
- package/lib/typescript/src/components/chat/item/ChatAIAnswerMessageItem.d.ts.map +1 -1
- package/lib/typescript/src/components/chat/item/ChatAIThinkingMessageItem.d.ts.map +1 -1
- package/lib/typescript/src/constants/events.d.ts +1 -0
- package/lib/typescript/src/constants/events.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/assets/icons/index.ts +1 -1
- package/src/components/chat/ChatEmpty.tsx +5 -2
- package/src/components/chat/ChatMessageList.tsx +42 -5
- package/src/components/chat/item/ChatAIAnswerMessageItem.tsx +47 -29
- package/src/components/chat/item/ChatAIThinkingMessageItem.tsx +37 -31
- package/src/constants/events.ts +1 -0
|
@@ -19,6 +19,11 @@ const ChatEmpty = () => {
|
|
|
19
19
|
}, 200);
|
|
20
20
|
return /*#__PURE__*/_jsxs(KContainer.ScrollView, {
|
|
21
21
|
contentContainerStyle: styles.container,
|
|
22
|
+
style: {
|
|
23
|
+
transform: [{
|
|
24
|
+
scaleY: -1
|
|
25
|
+
}]
|
|
26
|
+
},
|
|
22
27
|
children: [/*#__PURE__*/_jsx(KLabel.Text, {
|
|
23
28
|
typo: "TextXLgMedium",
|
|
24
29
|
center: true,
|
|
@@ -34,7 +39,7 @@ const ChatEmpty = () => {
|
|
|
34
39
|
typo: "TextMdNormal",
|
|
35
40
|
center: true,
|
|
36
41
|
color: KColors.gray.normal,
|
|
37
|
-
children: '
|
|
42
|
+
children: 'Những gợi ý dành cho bạn:'
|
|
38
43
|
})]
|
|
39
44
|
}), data?.suggestions?.map(item => /*#__PURE__*/_jsx(SuggestionItem, {
|
|
40
45
|
item: item,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["KColors","KContainer","KLabel","KSpacingValue","StyleSheet","useFetchSuggestions","SuggestionItem","useSendMessage","debounce","jsx","_jsx","jsxs","_jsxs","ChatEmpty","data","onSendMessage","onPress","item","content","ScrollView","contentContainerStyle","styles","container","children","Text","typo","center","View","color","gray","normal","suggestions","map","onPressItem","suggestion_id","light","textAlign","create","flexGrow","justifyContent","alignItems","padding","gap"],"sourceRoot":"../../../../src","sources":["components/chat/ChatEmpty.tsx"],"mappings":";;AAAA,SAASA,OAAO,EAAEC,UAAU,EAAEC,MAAM,EAAEC,aAAa,QAAQ,eAAe;AAC1E,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,mBAAmB,QAAQ,gDAA6C;AACjF,OAAOC,cAAc,MAAM,qBAAkB;AAC7C,SAASC,cAAc,QAAQ,uCAAoC;AACnE,OAAOC,QAAQ,MAAM,iBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGvC,MAAMC,SAAS,GAAGA,CAAA,KAAM;EACtB,MAAM;IAAEC;EAAK,CAAC,GAAGT,mBAAmB,CAAC,CAAC;EACtC,MAAM;IAAEU;EAAc,CAAC,GAAGR,cAAc,CAAC,CAAC;EAE1C,MAAMS,OAAO,GAAGR,QAAQ,CAAES,IAAqB,IAAK;IAClDF,aAAa,CAACE,IAAI,CAACC,OAAO,CAAC;EAC7B,CAAC,EAAE,GAAG,CAAC;EAEP,oBACEN,KAAA,CAACX,UAAU,CAACkB,UAAU;
|
|
1
|
+
{"version":3,"names":["KColors","KContainer","KLabel","KSpacingValue","StyleSheet","useFetchSuggestions","SuggestionItem","useSendMessage","debounce","jsx","_jsx","jsxs","_jsxs","ChatEmpty","data","onSendMessage","onPress","item","content","ScrollView","contentContainerStyle","styles","container","style","transform","scaleY","children","Text","typo","center","View","color","gray","normal","suggestions","map","onPressItem","suggestion_id","light","textAlign","create","flexGrow","justifyContent","alignItems","padding","gap"],"sourceRoot":"../../../../src","sources":["components/chat/ChatEmpty.tsx"],"mappings":";;AAAA,SAASA,OAAO,EAAEC,UAAU,EAAEC,MAAM,EAAEC,aAAa,QAAQ,eAAe;AAC1E,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,mBAAmB,QAAQ,gDAA6C;AACjF,OAAOC,cAAc,MAAM,qBAAkB;AAC7C,SAASC,cAAc,QAAQ,uCAAoC;AACnE,OAAOC,QAAQ,MAAM,iBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGvC,MAAMC,SAAS,GAAGA,CAAA,KAAM;EACtB,MAAM;IAAEC;EAAK,CAAC,GAAGT,mBAAmB,CAAC,CAAC;EACtC,MAAM;IAAEU;EAAc,CAAC,GAAGR,cAAc,CAAC,CAAC;EAE1C,MAAMS,OAAO,GAAGR,QAAQ,CAAES,IAAqB,IAAK;IAClDF,aAAa,CAACE,IAAI,CAACC,OAAO,CAAC;EAC7B,CAAC,EAAE,GAAG,CAAC;EAEP,oBACEN,KAAA,CAACX,UAAU,CAACkB,UAAU;IACpBC,qBAAqB,EAAEC,MAAM,CAACC,SAAU;IACxCC,KAAK,EAAE;MAAEC,SAAS,EAAE,CAAC;QAAEC,MAAM,EAAE,CAAC;MAAE,CAAC;IAAE,CAAE;IAAAC,QAAA,gBAEvChB,IAAA,CAACR,MAAM,CAACyB,IAAI;MAACC,IAAI,EAAC,eAAe;MAACC,MAAM;MAAAH,QAAA,EACrC;IAA4B,CAClB,CAAC,eACdd,KAAA,CAACX,UAAU,CAAC6B,IAAI;MAACD,MAAM;MAAAH,QAAA,gBACrBhB,IAAA,CAACR,MAAM,CAACyB,IAAI;QAACC,IAAI,EAAC,cAAc;QAACC,MAAM;QAACE,KAAK,EAAE/B,OAAO,CAACgC,IAAI,CAACC,MAAO;QAAAP,QAAA,EAChE;MAA8C,CACpC,CAAC,eACdhB,IAAA,CAACR,MAAM,CAACyB,IAAI;QAACC,IAAI,EAAC,cAAc;QAACC,MAAM;QAACE,KAAK,EAAE/B,OAAO,CAACgC,IAAI,CAACC,MAAO;QAAAP,QAAA,EAChE;MAA2B,CACjB,CAAC;IAAA,CACC,CAAC,EACjBZ,IAAI,EAAEoB,WAAW,EAAEC,GAAG,CAAElB,IAAqB,iBAC5CP,IAAA,CAACJ,cAAc;MAEbW,IAAI,EAAEA,IAAK;MACXmB,WAAW,EAAEpB;IAAQ,GAFhBC,IAAI,CAACoB,aAGX,CACF,CAAC,eACF3B,IAAA,CAACR,MAAM,CAACyB,IAAI;MACVC,IAAI,EAAC,cAAc;MACnBG,KAAK,EAAE/B,OAAO,CAACgC,IAAI,CAACM,KAAM;MAC1BC,SAAS,EAAC,QAAQ;MAAAb,QAAA,EAGhB;IAAgG,CAEvF,CAAC;EAAA,CACO,CAAC;AAE5B,CAAC;AAED,eAAeb,SAAS;AAExB,MAAMQ,MAAM,GAAGjB,UAAU,CAACoC,MAAM,CAAC;EAC/BlB,SAAS,EAAE;IACTmB,QAAQ,EAAE,CAAC;IACXC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,OAAO,EAAEzC,aAAa,CAAC,SAAS,CAAC;IACjC0C,GAAG,EAAE1C,aAAa,CAAC,QAAQ;EAC7B;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,19 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { FlatList, StyleSheet } from 'react-native';
|
|
3
|
+
import { FlatList, StyleSheet, DeviceEventEmitter } from 'react-native';
|
|
4
4
|
import ChatEmpty from "./ChatEmpty.js";
|
|
5
5
|
import { useMessage } from "../../hooks/message/useMessage.js";
|
|
6
6
|
import ChatItem from "./item/index.js";
|
|
7
7
|
import { KSpacingValue } from '@droppii/libs';
|
|
8
|
+
import { useCallback, useRef } from 'react';
|
|
9
|
+
import { useEffect } from 'react';
|
|
10
|
+
import { events } from "../../constants/events.js";
|
|
8
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
12
|
const ChatMessageList = () => {
|
|
10
13
|
const {
|
|
11
14
|
messageState
|
|
12
15
|
} = useMessage();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
const flatListRef = useRef(null);
|
|
17
|
+
const scrollOffsetRef = useRef(0);
|
|
18
|
+
const onScroll = useCallback(event => {
|
|
19
|
+
scrollOffsetRef.current = event?.nativeEvent?.contentOffset?.y;
|
|
20
|
+
}, []);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const subExpandThinkingStep = DeviceEventEmitter.addListener(events.expandThinkingStep, isExpand => {
|
|
23
|
+
try {
|
|
24
|
+
const scrollToOffset = flatListRef.current?.scrollToOffset({
|
|
25
|
+
offset: scrollOffsetRef.current + (isExpand ? 60 : -60),
|
|
26
|
+
animated: true
|
|
27
|
+
});
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
scrollToOffset?.();
|
|
30
|
+
}, 100);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error(error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
subExpandThinkingStep.remove();
|
|
37
|
+
};
|
|
38
|
+
}, []);
|
|
16
39
|
return /*#__PURE__*/_jsx(FlatList, {
|
|
40
|
+
ref: flatListRef,
|
|
17
41
|
data: messageState?.messages || [],
|
|
18
42
|
renderItem: ({
|
|
19
43
|
item,
|
|
@@ -24,7 +48,9 @@ const ChatMessageList = () => {
|
|
|
24
48
|
}),
|
|
25
49
|
keyExtractor: item => item.id,
|
|
26
50
|
contentContainerStyle: styles.container,
|
|
27
|
-
inverted: true
|
|
51
|
+
inverted: true,
|
|
52
|
+
ListEmptyComponent: /*#__PURE__*/_jsx(ChatEmpty, {}),
|
|
53
|
+
onScroll: onScroll
|
|
28
54
|
});
|
|
29
55
|
};
|
|
30
56
|
export default ChatMessageList;
|
|
@@ -32,7 +58,8 @@ const styles = StyleSheet.create({
|
|
|
32
58
|
container: {
|
|
33
59
|
flexGrow: 1,
|
|
34
60
|
gap: KSpacingValue['0.5rem'],
|
|
35
|
-
paddingVertical: KSpacingValue['1rem']
|
|
61
|
+
paddingVertical: KSpacingValue['1rem'],
|
|
62
|
+
justifyContent: 'flex-end'
|
|
36
63
|
}
|
|
37
64
|
});
|
|
38
65
|
//# sourceMappingURL=ChatMessageList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FlatList","StyleSheet","ChatEmpty","useMessage","ChatItem","KSpacingValue","jsx","_jsx","ChatMessageList","messageState","
|
|
1
|
+
{"version":3,"names":["FlatList","StyleSheet","DeviceEventEmitter","ChatEmpty","useMessage","ChatItem","KSpacingValue","useCallback","useRef","useEffect","events","jsx","_jsx","ChatMessageList","messageState","flatListRef","scrollOffsetRef","onScroll","event","current","nativeEvent","contentOffset","y","subExpandThinkingStep","addListener","expandThinkingStep","isExpand","scrollToOffset","offset","animated","setTimeout","error","console","remove","ref","data","messages","renderItem","item","index","keyExtractor","id","contentContainerStyle","styles","container","inverted","ListEmptyComponent","create","flexGrow","gap","paddingVertical","justifyContent"],"sourceRoot":"../../../../src","sources":["components/chat/ChatMessageList.tsx"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,UAAU,EAAEC,kBAAkB,QAAQ,cAAc;AACvE,OAAOC,SAAS,MAAM,gBAAa;AACnC,SAASC,UAAU,QAAQ,mCAAgC;AAC3D,OAAOC,QAAQ,MAAM,iBAAQ;AAC7B,SAASC,aAAa,QAAQ,eAAe;AAE7C,SAASC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,MAAM,QAAQ,2BAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEhD,MAAMC,eAAe,GAAGA,CAAA,KAAM;EAC5B,MAAM;IAAEC;EAAa,CAAC,GAAGV,UAAU,CAAC,CAAC;EAErC,MAAMW,WAAW,GAAGP,MAAM,CAAM,IAAI,CAAC;EACrC,MAAMQ,eAAe,GAAGR,MAAM,CAAC,CAAC,CAAC;EAEjC,MAAMS,QAAQ,GAAGV,WAAW,CACzBW,KAAU,IAAK;IACdF,eAAe,CAACG,OAAO,GAAGD,KAAK,EAAEE,WAAW,EAAEC,aAAa,EAAEC,CAAC;EAChE,CAAC,EACD,EACF,CAAC;EAEDb,SAAS,CAAC,MAAM;IACd,MAAMc,qBAAqB,GAAGrB,kBAAkB,CAACsB,WAAW,CAC1Dd,MAAM,CAACe,kBAAkB,EACxBC,QAAiB,IAAK;MACrB,IAAI;QACF,MAAMC,cAAc,GAAGZ,WAAW,CAACI,OAAO,EAAEQ,cAAc,CAAC;UACzDC,MAAM,EAAEZ,eAAe,CAACG,OAAO,IAAIO,QAAQ,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;UACvDG,QAAQ,EAAE;QACZ,CAAC,CAAC;QACFC,UAAU,CAAC,MAAM;UACfH,cAAc,GAAG,CAAC;QACpB,CAAC,EAAE,GAAG,CAAC;MACT,CAAC,CAAC,OAAOI,KAAK,EAAE;QACdC,OAAO,CAACD,KAAK,CAACA,KAAK,CAAC;MACtB;IACF,CACF,CAAC;IAED,OAAO,MAAM;MACXR,qBAAqB,CAACU,MAAM,CAAC,CAAC;IAChC,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,oBACErB,IAAA,CAACZ,QAAQ;IACPkC,GAAG,EAAEnB,WAAY;IACjBoB,IAAI,EAAErB,YAAY,EAAEsB,QAAQ,IAAI,EAAG;IACnCC,UAAU,EAAEA,CAAC;MAAEC,IAAI;MAAEC;IAA6C,CAAC,kBACjE3B,IAAA,CAACP,QAAQ;MAACiC,IAAI,EAAEA,IAAK;MAACC,KAAK,EAAEA;IAAM,CAAE,CACrC;IACFC,YAAY,EAAGF,IAAkB,IAAKA,IAAI,CAACG,EAAG;IAC9CC,qBAAqB,EAAEC,MAAM,CAACC,SAAU;IACxCC,QAAQ;IACRC,kBAAkB,eAAElC,IAAA,CAACT,SAAS,IAAE,CAAE;IAClCc,QAAQ,EAAEA;EAAS,CACpB,CAAC;AAEN,CAAC;AAED,eAAeJ,eAAe;AAE9B,MAAM8B,MAAM,GAAG1C,UAAU,CAAC8C,MAAM,CAAC;EAC/BH,SAAS,EAAE;IACTI,QAAQ,EAAE,CAAC;IACXC,GAAG,EAAE3C,aAAa,CAAC,QAAQ,CAAC;IAC5B4C,eAAe,EAAE5C,aAAa,CAAC,MAAM,CAAC;IACtC6C,cAAc,EAAE;EAClB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ import { KColors, KContainer, KLabel, KSpacingValue } from '@droppii/libs';
|
|
|
4
4
|
import { StyleSheet } from 'react-native';
|
|
5
5
|
import useStreamMessageStore from "../../../store/streamMessage.js";
|
|
6
6
|
import { useEffect, useRef, useState } from 'react';
|
|
7
|
-
import Markdown, { Renderer, MarkedTokenizer } from
|
|
7
|
+
import Markdown, { Renderer, MarkedTokenizer } from 'react-native-marked';
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
9
|
class CustomTokenizer extends MarkedTokenizer {}
|
|
10
10
|
class CustomRenderer extends Renderer {
|
|
@@ -15,13 +15,14 @@ class CustomRenderer extends Renderer {
|
|
|
15
15
|
const match = /^<!--\s*@component:product\(id:([\w-]+)\)\s*-->/.exec(text);
|
|
16
16
|
return /*#__PURE__*/_jsx(KLabel.Text, {
|
|
17
17
|
typo: "TextMdNormal",
|
|
18
|
-
children: match?.[1] ||
|
|
18
|
+
children: match?.[1] || ''
|
|
19
19
|
}, this.getKey());
|
|
20
20
|
}
|
|
21
|
-
paragraph(children) {
|
|
21
|
+
paragraph(children, style) {
|
|
22
22
|
return /*#__PURE__*/_jsx(KContainer.View, {
|
|
23
23
|
background: KColors.white,
|
|
24
24
|
paddingV: 0,
|
|
25
|
+
style: style,
|
|
25
26
|
children: children
|
|
26
27
|
}, this.getKey());
|
|
27
28
|
}
|
|
@@ -46,11 +47,24 @@ class CustomRenderer extends Renderer {
|
|
|
46
47
|
}
|
|
47
48
|
const tokenizer = new CustomTokenizer();
|
|
48
49
|
const renderer = new CustomRenderer();
|
|
50
|
+
const markedStyles = {
|
|
51
|
+
paragraph: {
|
|
52
|
+
marginVertical: 5
|
|
53
|
+
},
|
|
54
|
+
blockquote: {
|
|
55
|
+
marginVertical: 5
|
|
56
|
+
},
|
|
57
|
+
li: {
|
|
58
|
+
marginVertical: 5,
|
|
59
|
+
justifyContent: 'center'
|
|
60
|
+
}
|
|
61
|
+
};
|
|
49
62
|
const ChatAIAnswerMessageItem = ({
|
|
50
63
|
item,
|
|
51
64
|
isLast = false
|
|
52
65
|
}) => {
|
|
53
66
|
const streamMessage = useStreamMessageStore(state => state.streamMessage?.[item.id]);
|
|
67
|
+
const isStreaming = useStreamMessageStore(state => state.isStreaming);
|
|
54
68
|
const [display, setDisplay] = useState('');
|
|
55
69
|
const indexRef = useRef(0);
|
|
56
70
|
useEffect(() => {
|
|
@@ -65,11 +79,11 @@ const ChatAIAnswerMessageItem = ({
|
|
|
65
79
|
clearInterval(interval);
|
|
66
80
|
return;
|
|
67
81
|
}
|
|
68
|
-
const chunkSize =
|
|
82
|
+
const chunkSize = 50;
|
|
69
83
|
const chunk = remaining.slice(0, chunkSize);
|
|
70
84
|
setDisplay(prev => prev + chunk);
|
|
71
85
|
indexRef.current += chunk.length;
|
|
72
|
-
},
|
|
86
|
+
}, 50);
|
|
73
87
|
return () => clearInterval(interval);
|
|
74
88
|
}, [streamMessage, item]);
|
|
75
89
|
return /*#__PURE__*/_jsxs(KContainer.View, {
|
|
@@ -77,9 +91,13 @@ const ChatAIAnswerMessageItem = ({
|
|
|
77
91
|
children: [/*#__PURE__*/_jsx(Markdown, {
|
|
78
92
|
renderer: renderer,
|
|
79
93
|
value: display,
|
|
80
|
-
tokenizer: tokenizer
|
|
94
|
+
tokenizer: tokenizer,
|
|
95
|
+
styles: markedStyles,
|
|
96
|
+
flatListProps: {
|
|
97
|
+
style: styles.flatList
|
|
98
|
+
}
|
|
81
99
|
}), /*#__PURE__*/_jsx(KContainer.VisibleView, {
|
|
82
|
-
visible: isLast && !
|
|
100
|
+
visible: isLast && !isStreaming,
|
|
83
101
|
children: /*#__PURE__*/_jsx(KLabel.Text, {
|
|
84
102
|
typo: "TextSmNormal",
|
|
85
103
|
color: KColors.gray.light,
|
|
@@ -94,6 +112,9 @@ const styles = StyleSheet.create({
|
|
|
94
112
|
container: {
|
|
95
113
|
paddingHorizontal: KSpacingValue['1rem'],
|
|
96
114
|
gap: KSpacingValue['0.5rem']
|
|
115
|
+
},
|
|
116
|
+
flatList: {
|
|
117
|
+
backgroundColor: KColors.transparent
|
|
97
118
|
}
|
|
98
119
|
});
|
|
99
120
|
//# sourceMappingURL=ChatAIAnswerMessageItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["KColors","KContainer","KLabel","KSpacingValue","StyleSheet","useStreamMessageStore","useEffect","useRef","useState","Markdown","Renderer","MarkedTokenizer","jsx","_jsx","jsxs","_jsxs","CustomTokenizer","CustomRenderer","constructor","html","text","match","exec","Text","typo","children","getKey","paragraph","View","background","white","paddingV","codespan","strong","tokenizer","renderer","ChatAIAnswerMessageItem","item","isLast","streamMessage","state","id","display","setDisplay","indexRef","current","content","interval","setInterval","remaining","slice","length","clearInterval","chunkSize","chunk","prev","
|
|
1
|
+
{"version":3,"names":["KColors","KContainer","KLabel","KSpacingValue","StyleSheet","useStreamMessageStore","useEffect","useRef","useState","Markdown","Renderer","MarkedTokenizer","jsx","_jsx","jsxs","_jsxs","CustomTokenizer","CustomRenderer","constructor","html","text","match","exec","Text","typo","children","getKey","paragraph","style","View","background","white","paddingV","codespan","strong","tokenizer","renderer","markedStyles","marginVertical","blockquote","li","justifyContent","ChatAIAnswerMessageItem","item","isLast","streamMessage","state","id","isStreaming","display","setDisplay","indexRef","current","content","interval","setInterval","remaining","slice","length","clearInterval","chunkSize","chunk","prev","styles","container","value","flatListProps","flatList","VisibleView","visible","color","gray","light","textAlign","create","paddingHorizontal","gap","backgroundColor","transparent"],"sourceRoot":"../../../../../src","sources":["components/chat/item/ChatAIAnswerMessageItem.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { KContainer, KLabel, KColors, KSpacingValue, KListItem, KImage } from '@droppii/libs';
|
|
4
|
-
import { StyleSheet } from 'react-native';
|
|
4
|
+
import { StyleSheet, DeviceEventEmitter } from 'react-native';
|
|
5
5
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import { IconThinkingStep } from "../../../assets/svgIcon/IconThinkingStep.js";
|
|
7
7
|
import { IconChatArrow } from "../../../assets/svgIcon/IconChatArrow.js";
|
|
8
8
|
import useStreamMessageStore from "../../../store/streamMessage.js";
|
|
9
|
-
import Markdown, { Renderer } from
|
|
9
|
+
import Markdown, { Renderer } from 'react-native-marked';
|
|
10
10
|
import icons from "../../../assets/icons/index.js";
|
|
11
|
+
import { events } from "../../../constants/events.js";
|
|
11
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
13
|
class CustomRenderer extends Renderer {
|
|
13
14
|
constructor() {
|
|
@@ -16,7 +17,7 @@ class CustomRenderer extends Renderer {
|
|
|
16
17
|
paragraph(children, styles) {
|
|
17
18
|
return /*#__PURE__*/_jsx(KContainer.View, {
|
|
18
19
|
style: styles,
|
|
19
|
-
background: KColors.
|
|
20
|
+
background: KColors.transparent,
|
|
20
21
|
paddingV: 0,
|
|
21
22
|
children: children
|
|
22
23
|
}, this.getKey());
|
|
@@ -42,7 +43,7 @@ class CustomRenderer extends Renderer {
|
|
|
42
43
|
image(uri, _alt, _style) {
|
|
43
44
|
return /*#__PURE__*/_jsx(KImage.Thumbnail, {
|
|
44
45
|
uri: uri,
|
|
45
|
-
resizeMode:
|
|
46
|
+
resizeMode: 'contain',
|
|
46
47
|
size: 'lg'
|
|
47
48
|
}, this.getKey());
|
|
48
49
|
}
|
|
@@ -55,6 +56,9 @@ const ChatAIThinkingMessageItem = ({
|
|
|
55
56
|
const streamMessage = useStreamMessageStore(state => state.streamMessage?.[item.id]);
|
|
56
57
|
const [display, setDisplay] = useState('');
|
|
57
58
|
const indexRef = useRef(0);
|
|
59
|
+
const onPressExpandThinkingStep = useCallback(expand => {
|
|
60
|
+
DeviceEventEmitter.emit(events.expandThinkingStep, expand);
|
|
61
|
+
}, []);
|
|
58
62
|
const renderHeader = useCallback(() => {
|
|
59
63
|
return /*#__PURE__*/_jsxs(KContainer.View, {
|
|
60
64
|
style: styles.header,
|
|
@@ -77,7 +81,7 @@ const ChatAIThinkingMessageItem = ({
|
|
|
77
81
|
clearInterval(interval);
|
|
78
82
|
return;
|
|
79
83
|
}
|
|
80
|
-
const chunkSize =
|
|
84
|
+
const chunkSize = 5;
|
|
81
85
|
const chunk = remaining.slice(0, chunkSize);
|
|
82
86
|
setDisplay(prev => prev + chunk);
|
|
83
87
|
indexRef.current += chunk.length;
|
|
@@ -90,13 +94,16 @@ const ChatAIThinkingMessageItem = ({
|
|
|
90
94
|
children: [/*#__PURE__*/_jsx(KContainer.View, {
|
|
91
95
|
style: styles.arrow,
|
|
92
96
|
children: /*#__PURE__*/_jsx(IconChatArrow, {
|
|
93
|
-
fill:
|
|
97
|
+
fill: KColors.gray.light
|
|
94
98
|
})
|
|
95
99
|
}), /*#__PURE__*/_jsx(KContainer.View, {
|
|
96
100
|
style: styles.content,
|
|
97
101
|
children: /*#__PURE__*/_jsx(Markdown, {
|
|
98
102
|
renderer: renderer,
|
|
99
|
-
value: display
|
|
103
|
+
value: display,
|
|
104
|
+
flatListProps: {
|
|
105
|
+
style: styles.flatList
|
|
106
|
+
}
|
|
100
107
|
})
|
|
101
108
|
})]
|
|
102
109
|
});
|
|
@@ -107,6 +114,7 @@ const ChatAIThinkingMessageItem = ({
|
|
|
107
114
|
containerStyle: styles.container,
|
|
108
115
|
headerStyle: styles.mHeader,
|
|
109
116
|
defaultValue: true,
|
|
117
|
+
onChangeValue: onPressExpandThinkingStep,
|
|
110
118
|
children: renderThinkingContent()
|
|
111
119
|
}, item.id.toString()) : /*#__PURE__*/_jsxs(KContainer.View, {
|
|
112
120
|
style: styles.containerLoading,
|
|
@@ -153,6 +161,9 @@ const styles = StyleSheet.create({
|
|
|
153
161
|
transform: [{
|
|
154
162
|
rotateY: '180deg'
|
|
155
163
|
}]
|
|
164
|
+
},
|
|
165
|
+
flatList: {
|
|
166
|
+
backgroundColor: KColors.transparent
|
|
156
167
|
}
|
|
157
168
|
});
|
|
158
169
|
//# sourceMappingURL=ChatAIThinkingMessageItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["KContainer","KLabel","KColors","KSpacingValue","KListItem","KImage","StyleSheet","useCallback","useEffect","useRef","useState","IconThinkingStep","IconChatArrow","useStreamMessageStore","Markdown","Renderer","icons","jsx","_jsx","jsxs","_jsxs","CustomRenderer","constructor","paragraph","children","styles","View","style","background","
|
|
1
|
+
{"version":3,"names":["KContainer","KLabel","KColors","KSpacingValue","KListItem","KImage","StyleSheet","DeviceEventEmitter","useCallback","useEffect","useRef","useState","IconThinkingStep","IconChatArrow","useStreamMessageStore","Markdown","Renderer","icons","events","jsx","_jsx","jsxs","_jsxs","CustomRenderer","constructor","paragraph","children","styles","View","style","background","transparent","paddingV","getKey","text","Text","typo","codespan","strong","image","uri","_alt","_style","Thumbnail","resizeMode","size","renderer","ChatAIThinkingMessageItem","item","isLast","streamMessage","state","id","display","setDisplay","indexRef","onPressExpandThinkingStep","expand","emit","expandThinkingStep","renderHeader","header","color","gray","normal","current","content","interval","setInterval","remaining","slice","length","clearInterval","chunkSize","chunk","prev","renderThinkingContent","contentContainer","arrow","fill","light","value","flatListProps","flatList","metadata","status","Accordion","containerStyle","container","headerStyle","mHeader","defaultValue","onChangeValue","toString","containerLoading","Base","icon_thinking_step","create","paddingHorizontal","borderBottomWidth","paddingVertical","gap","flexDirection","alignItems","marginBottom","maxWidth","backgroundColor","hexToRgba","borderRadius","borderTopLeftRadius","transform","rotateY"],"sourceRoot":"../../../../../src","sources":["components/chat/item/ChatAIThinkingMessageItem.tsx"],"mappings":";;AAAA,SACEA,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,aAAa,EACbC,SAAS,EACTC,MAAM,QACD,eAAe;AAEtB,SAASC,UAAU,EAAEC,kBAAkB,QAAQ,cAAc;AAC7D,SAAoBC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAC3E,SAASC,gBAAgB,QAAQ,6CAA0C;AAC3E,SAASC,aAAa,QAAQ,0CAAuC;AACrE,OAAOC,qBAAqB,MAAM,iCAA8B;AAChE,OAAOC,QAAQ,IAAIC,QAAQ,QAA2B,qBAAqB;AAC3E,OAAOC,KAAK,MAAM,gCAAuB;AACzC,SAASC,MAAM,QAAQ,8BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAOnD,MAAMC,cAAc,SAASP,QAAQ,CAA8B;EACjEQ,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,CAAC;EACT;EAEAC,SAASA,CAACC,QAAqB,EAAEC,MAAY,EAAa;IACxD,oBACEP,IAAA,CAACpB,UAAU,CAAC4B,IAAI;MAEdC,KAAK,EAAEF,MAAO;MACdG,UAAU,EAAE5B,OAAO,CAAC6B,WAAY;MAChCC,QAAQ,EAAE,CAAE;MAAAN,QAAA,EAEXA;IAAQ,GALJ,IAAI,CAACO,MAAM,CAAC,CAMF,CAAC;EAEtB;EAEAC,IAAIA,CAACA,IAA0B,EAAa;IAC1C,oBACEd,IAAA,CAACnB,MAAM,CAACkC,IAAI;MAAqBC,IAAI,EAAC,cAAc;MAAAV,QAAA,EACjDQ;IAAI,GADW,IAAI,CAACD,MAAM,CAAC,CAEjB,CAAC;EAElB;EAEAI,QAAQA,CAACH,IAAY,EAAa;IAChC,oBACEd,IAAA,CAACnB,MAAM,CAACkC,IAAI;MAAqBC,IAAI,EAAC,cAAc;MAAAV,QAAA,EACjDQ;IAAI,GADW,IAAI,CAACD,MAAM,CAAC,CAEjB,CAAC;EAElB;EAEAK,MAAMA,CAACZ,QAA8B,EAAa;IAChD,oBACEN,IAAA,CAACnB,MAAM,CAACkC,IAAI;MAAqBC,IAAI,EAAC,cAAc;MAAAV,QAAA,EACjDA;IAAQ,GADO,IAAI,CAACO,MAAM,CAAC,CAEjB,CAAC;EAElB;EAEAM,KAAKA,CAACC,GAAW,EAAEC,IAAa,EAAEC,MAAY,EAAa;IACzD,oBACEtB,IAAA,CAACf,MAAM,CAACsC,SAAS;MAEfH,GAAG,EAAEA,GAAI;MACTI,UAAU,EAAE,SAAU;MACtBC,IAAI,EAAE;IAAK,GAHN,IAAI,CAACZ,MAAM,CAAC,CAIlB,CAAC;EAEN;AACF;AAEA,MAAMa,QAAQ,GAAG,IAAIvB,cAAc,CAAC,CAAC;AAErC,MAAMwB,yBAAyB,GAAGA,CAAC;EACjCC,IAAI;EACJC,MAAM,GAAG;AACqB,CAAC,KAAK;EACpC,MAAMC,aAAa,GAAGpC,qBAAqB,CACxCqC,KAAK,IAAKA,KAAK,CAACD,aAAa,GAAGF,IAAI,CAACI,EAAE,CAC1C,CAAC;EAED,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAG3C,QAAQ,CAAC,EAAE,CAAC;EAC1C,MAAM4C,QAAQ,GAAG7C,MAAM,CAAC,CAAC,CAAC;EAE1B,MAAM8C,yBAAyB,GAAGhD,WAAW,CAAEiD,MAAe,IAAK;IACjElD,kBAAkB,CAACmD,IAAI,CAACxC,MAAM,CAACyC,kBAAkB,EAAEF,MAAM,CAAC;EAC5D,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,YAAY,GAAGpD,WAAW,CAAC,MAAM;IACrC,oBACEc,KAAA,CAACtB,UAAU,CAAC4B,IAAI;MAACC,KAAK,EAAEF,MAAM,CAACkC,MAAO;MAAAnC,QAAA,gBACpCN,IAAA,CAACR,gBAAgB,IAAE,CAAC,eACpBQ,IAAA,CAACnB,MAAM,CAACkC,IAAI;QAACC,IAAI,EAAC,YAAY;QAAC0B,KAAK,EAAE5D,OAAO,CAAC6D,IAAI,CAACC,MAAO;QAAAtC,QAAA,EACvD;MAAW,CACD,CAAC;IAAA,CACC,CAAC;EAEtB,CAAC,EAAE,EAAE,CAAC;EAENjB,SAAS,CAAC,MAAM;IACd,IAAI,CAACyC,aAAa,EAAE;MAClBK,QAAQ,CAACU,OAAO,GAAG,CAAC;MACpBX,UAAU,CAACN,IAAI,CAACkB,OAAO,CAAC;MACxB;IACF;IAEA,MAAMC,QAAQ,GAAGC,WAAW,CAAC,MAAM;MACjC,MAAMC,SAAS,GAAGnB,aAAa,CAACgB,OAAO,CAACI,KAAK,CAACf,QAAQ,CAACU,OAAO,CAAC;MAC/D,IAAII,SAAS,CAACE,MAAM,KAAK,CAAC,EAAE;QAC1BC,aAAa,CAACL,QAAQ,CAAC;QACvB;MACF;MAEA,MAAMM,SAAS,GAAG,CAAC;MACnB,MAAMC,KAAK,GAAGL,SAAS,CAACC,KAAK,CAAC,CAAC,EAAEG,SAAS,CAAC;MAE3CnB,UAAU,CAAEqB,IAAI,IAAKA,IAAI,GAAGD,KAAK,CAAC;MAClCnB,QAAQ,CAACU,OAAO,IAAIS,KAAK,CAACH,MAAM;IAClC,CAAC,EAAE,EAAE,CAAC;IAEN,OAAO,MAAMC,aAAa,CAACL,QAAQ,CAAC;EACtC,CAAC,EAAE,CAACjB,aAAa,EAAEF,IAAI,CAAC,CAAC;EAEzB,MAAM4B,qBAAqB,GAAGpE,WAAW,CAAC,MAAM;IAC9C,oBACEc,KAAA,CAACtB,UAAU,CAAC4B,IAAI;MAACC,KAAK,EAAEF,MAAM,CAACkD,gBAAiB;MAAAnD,QAAA,gBAC9CN,IAAA,CAACpB,UAAU,CAAC4B,IAAI;QAACC,KAAK,EAAEF,MAAM,CAACmD,KAAM;QAAApD,QAAA,eACnCN,IAAA,CAACP,aAAa;UAACkE,IAAI,EAAE7E,OAAO,CAAC6D,IAAI,CAACiB;QAAM,CAAE;MAAC,CAC5B,CAAC,eAClB5D,IAAA,CAACpB,UAAU,CAAC4B,IAAI;QAACC,KAAK,EAAEF,MAAM,CAACuC,OAAQ;QAAAxC,QAAA,eACrCN,IAAA,CAACL,QAAQ;UACP+B,QAAQ,EAAEA,QAAS;UACnBmC,KAAK,EAAE5B,OAAQ;UACf6B,aAAa,EAAE;YACbrD,KAAK,EAAEF,MAAM,CAACwD;UAChB;QAAE,CACH;MAAC,CACa,CAAC;IAAA,CACH,CAAC;EAEtB,CAAC,EAAE,CAAC9B,OAAO,CAAC,CAAC;EAEb,oBACEjC,IAAA,CAACpB,UAAU,CAAC4B,IAAI;IAAAF,QAAA,EACb,CAACuB,MAAM,IAAIC,aAAa,EAAEkC,QAAQ,EAAEC,MAAM,KAAK,MAAM,gBACpDjE,IAAA,CAAChB,SAAS,CAACkF,SAAS;MAClBzB,MAAM,EAAED,YAAa;MAErB2B,cAAc,EAAE5D,MAAM,CAAC6D,SAAU;MACjCC,WAAW,EAAE9D,MAAM,CAAC+D,OAAQ;MAC5BC,YAAY,EAAE,IAAK;MACnBC,aAAa,EAAEpC,yBAA0B;MAAA9B,QAAA,EAExCkD,qBAAqB,CAAC;IAAC,GANnB5B,IAAI,CAACI,EAAE,CAACyC,QAAQ,CAAC,CAOH,CAAC,gBAEtBvE,KAAA,CAACtB,UAAU,CAAC4B,IAAI;MAACC,KAAK,EAAEF,MAAM,CAACmE,gBAAiB;MAAApE,QAAA,GAC7CkD,qBAAqB,CAAC,CAAC,EACvB3B,MAAM,iBAAI7B,IAAA,CAACf,MAAM,CAAC0F,IAAI;QAAClD,IAAI,EAAE,EAAG;QAACL,GAAG,EAAEvB,KAAK,CAAC+E;MAAmB,CAAE,CAAC;IAAA,CACpD;EAClB,CACc,CAAC;AAEtB,CAAC;AAED,eAAejD,yBAAyB;AAExC,MAAMpB,MAAM,GAAGrB,UAAU,CAAC2F,MAAM,CAAC;EAC/BT,SAAS,EAAE;IACTU,iBAAiB,EAAE/F,aAAa,CAAC,MAAM,CAAC;IACxCgG,iBAAiB,EAAE,CAAC;IACpBC,eAAe,EAAE;EACnB,CAAC;EACDN,gBAAgB,EAAE;IAChBI,iBAAiB,EAAE/F,aAAa,CAAC,MAAM,CAAC;IACxCkG,GAAG,EAAElG,aAAa,CAAC,QAAQ;EAC7B,CAAC;EACD0D,MAAM,EAAE;IACNyC,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBH,eAAe,EAAEjG,aAAa,CAAC,SAAS,CAAC;IACzCkG,GAAG,EAAElG,aAAa,CAAC,QAAQ;EAC7B,CAAC;EACDuF,OAAO,EAAE;IACPU,eAAe,EAAE,CAAC;IAClBI,YAAY,EAAErG,aAAa,CAAC,SAAS;EACvC,CAAC;EACD0E,gBAAgB,EAAE;IAChByB,aAAa,EAAE;EACjB,CAAC;EACDpC,OAAO,EAAE;IACPuC,QAAQ,EAAE,KAAK;IACfP,iBAAiB,EAAE/F,aAAa,CAAC,MAAM,CAAC;IACxCiG,eAAe,EAAEjG,aAAa,CAAC,QAAQ,CAAC;IACxCuG,eAAe,EAAExG,OAAO,CAACyG,SAAS,CAACzG,OAAO,CAAC6D,IAAI,CAACiB,KAAK,EAAE,GAAG,CAAC;IAC3D4B,YAAY,EAAEzG,aAAa,CAAC,QAAQ,CAAC;IACrC0G,mBAAmB,EAAE;EACvB,CAAC;EACD/B,KAAK,EAAE;IACLgC,SAAS,EAAE,CAAC;MAAEC,OAAO,EAAE;IAAS,CAAC;EACnC,CAAC;EACD5B,QAAQ,EAAE;IACRuB,eAAe,EAAExG,OAAO,CAAC6B;EAC3B;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
export const events = {
|
|
4
4
|
updateOneMessage: 'update_one_message',
|
|
5
5
|
updateMultipleMessage: 'update_multiple_message',
|
|
6
|
-
forceUpdateMessages: 'force_update_messages'
|
|
6
|
+
forceUpdateMessages: 'force_update_messages',
|
|
7
|
+
expandThinkingStep: 'expand_thinking_step'
|
|
7
8
|
};
|
|
8
9
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["events","updateOneMessage","updateMultipleMessage","forceUpdateMessages"],"sourceRoot":"../../../src","sources":["constants/events.ts"],"mappings":";;AAAA,OAAO,MAAMA,MAAM,GAAG;EACpBC,gBAAgB,EAAE,oBAAoB;EACtCC,qBAAqB,EAAE,yBAAyB;EAChDC,mBAAmB,EAAE;
|
|
1
|
+
{"version":3,"names":["events","updateOneMessage","updateMultipleMessage","forceUpdateMessages","expandThinkingStep"],"sourceRoot":"../../../src","sources":["constants/events.ts"],"mappings":";;AAAA,OAAO,MAAMA,MAAM,GAAG;EACpBC,gBAAgB,EAAE,oBAAoB;EACtCC,qBAAqB,EAAE,yBAAyB;EAChDC,mBAAmB,EAAE,uBAAuB;EAC5CC,kBAAkB,EAAE;AACtB,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/assets/icons/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/assets/icons/index.ts"],"names":[],"mappings":";;;AAAA,wBAEE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatEmpty.d.ts","sourceRoot":"","sources":["../../../../../src/components/chat/ChatEmpty.tsx"],"names":[],"mappings":"AAQA,QAAA,MAAM,SAAS,+
|
|
1
|
+
{"version":3,"file":"ChatEmpty.d.ts","sourceRoot":"","sources":["../../../../../src/components/chat/ChatEmpty.tsx"],"names":[],"mappings":"AAQA,QAAA,MAAM,SAAS,+CA0Cd,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessageList.d.ts","sourceRoot":"","sources":["../../../../../src/components/chat/ChatMessageList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatMessageList.d.ts","sourceRoot":"","sources":["../../../../../src/components/chat/ChatMessageList.tsx"],"names":[],"mappings":"AAUA,QAAA,MAAM,eAAe,+CAkDpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatAIAnswerMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIAnswerMessageItem.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatAIAnswerMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIAnswerMessageItem.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,UAAU,4BAA4B;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwED,QAAA,MAAM,uBAAuB,GAAI,mBAG9B,4BAA4B,4CAyD9B,CAAC;AACF,eAAe,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatAIThinkingMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIThinkingMessageItem.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatAIThinkingMessageItem.d.ts","sourceRoot":"","sources":["../../../../../../src/components/chat/item/ChatAIThinkingMessageItem.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAUnD,UAAU,8BAA8B;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA0DD,QAAA,MAAM,yBAAyB,GAAI,mBAGhC,8BAA8B,4CAuFhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/constants/events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/constants/events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;CAKlB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-chatbot-ai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "React Native library for Chatbot AI",
|
|
5
|
-
"main": "./
|
|
5
|
+
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
9
|
"source": "./src/index.ts",
|
|
10
10
|
"types": "./lib/typescript/src/index.d.ts",
|
|
11
|
-
"default": "./
|
|
11
|
+
"default": "./lib/module/index.js"
|
|
12
12
|
},
|
|
13
13
|
"./package.json": "./package.json"
|
|
14
14
|
},
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
39
39
|
"clean": "del-cli lib",
|
|
40
40
|
"prepare": "bob build",
|
|
41
|
-
"release": "release-it --no-git --ci"
|
|
41
|
+
"release": "release-it --no-git --ci --no-increment"
|
|
42
42
|
},
|
|
43
43
|
"keywords": [
|
|
44
44
|
"react-native",
|
|
@@ -15,7 +15,10 @@ const ChatEmpty = () => {
|
|
|
15
15
|
}, 200);
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
|
-
<KContainer.ScrollView
|
|
18
|
+
<KContainer.ScrollView
|
|
19
|
+
contentContainerStyle={styles.container}
|
|
20
|
+
style={{ transform: [{ scaleY: -1 }] }}
|
|
21
|
+
>
|
|
19
22
|
<KLabel.Text typo="TextXLgMedium" center>
|
|
20
23
|
{'Bạn cần hỗ trợ gì hôm nay?'}
|
|
21
24
|
</KLabel.Text>
|
|
@@ -24,7 +27,7 @@ const ChatEmpty = () => {
|
|
|
24
27
|
{'Hãy đặt câu hỏi hoặc chia sẻ vấn đề của bạn!'}
|
|
25
28
|
</KLabel.Text>
|
|
26
29
|
<KLabel.Text typo="TextMdNormal" center color={KColors.gray.normal}>
|
|
27
|
-
{'
|
|
30
|
+
{'Những gợi ý dành cho bạn:'}
|
|
28
31
|
</KLabel.Text>
|
|
29
32
|
</KContainer.View>
|
|
30
33
|
{data?.suggestions?.map((item: ISuggestionItem) => (
|
|
@@ -1,18 +1,52 @@
|
|
|
1
|
-
import { FlatList, StyleSheet } from 'react-native';
|
|
1
|
+
import { FlatList, StyleSheet, DeviceEventEmitter } from 'react-native';
|
|
2
2
|
import ChatEmpty from './ChatEmpty';
|
|
3
3
|
import { useMessage } from '../../hooks/message/useMessage';
|
|
4
4
|
import ChatItem from './item';
|
|
5
5
|
import { KSpacingValue } from '@droppii/libs';
|
|
6
|
-
import type { IMessageItem } from '
|
|
6
|
+
import type { IMessageItem } from '../../types';
|
|
7
|
+
import { useCallback, useRef } from 'react';
|
|
8
|
+
import { useEffect } from 'react';
|
|
9
|
+
import { events } from '../../constants/events';
|
|
7
10
|
|
|
8
11
|
const ChatMessageList = () => {
|
|
9
12
|
const { messageState } = useMessage();
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
const flatListRef = useRef<any>(null);
|
|
15
|
+
const scrollOffsetRef = useRef(0);
|
|
16
|
+
|
|
17
|
+
const onScroll = useCallback(
|
|
18
|
+
(event: any) => {
|
|
19
|
+
scrollOffsetRef.current = event?.nativeEvent?.contentOffset?.y;
|
|
20
|
+
},
|
|
21
|
+
[]
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const subExpandThinkingStep = DeviceEventEmitter.addListener(
|
|
26
|
+
events.expandThinkingStep,
|
|
27
|
+
(isExpand: boolean) => {
|
|
28
|
+
try {
|
|
29
|
+
const scrollToOffset = flatListRef.current?.scrollToOffset({
|
|
30
|
+
offset: scrollOffsetRef.current + (isExpand ? 60 : -60),
|
|
31
|
+
animated: true,
|
|
32
|
+
});
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
scrollToOffset?.();
|
|
35
|
+
}, 100);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error(error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return () => {
|
|
43
|
+
subExpandThinkingStep.remove();
|
|
44
|
+
};
|
|
45
|
+
}, []);
|
|
46
|
+
|
|
14
47
|
return (
|
|
15
48
|
<FlatList
|
|
49
|
+
ref={flatListRef}
|
|
16
50
|
data={messageState?.messages || []}
|
|
17
51
|
renderItem={({ item, index }: { item: IMessageItem; index: number }) => (
|
|
18
52
|
<ChatItem item={item} index={index} />
|
|
@@ -20,6 +54,8 @@ const ChatMessageList = () => {
|
|
|
20
54
|
keyExtractor={(item: IMessageItem) => item.id}
|
|
21
55
|
contentContainerStyle={styles.container}
|
|
22
56
|
inverted
|
|
57
|
+
ListEmptyComponent={<ChatEmpty />}
|
|
58
|
+
onScroll={onScroll}
|
|
23
59
|
/>
|
|
24
60
|
);
|
|
25
61
|
};
|
|
@@ -31,5 +67,6 @@ const styles = StyleSheet.create({
|
|
|
31
67
|
flexGrow: 1,
|
|
32
68
|
gap: KSpacingValue['0.5rem'],
|
|
33
69
|
paddingVertical: KSpacingValue['1rem'],
|
|
70
|
+
justifyContent: 'flex-end',
|
|
34
71
|
},
|
|
35
72
|
});
|
|
@@ -3,15 +3,19 @@ import { IMessageItem } from '../../../types';
|
|
|
3
3
|
import { StyleSheet } from 'react-native';
|
|
4
4
|
import useStreamMessageStore from '../../../store/streamMessage';
|
|
5
5
|
import { ReactNode, useEffect, useRef, useState } from 'react';
|
|
6
|
-
import Markdown, {
|
|
6
|
+
import Markdown, {
|
|
7
|
+
Renderer,
|
|
8
|
+
RendererInterface,
|
|
9
|
+
MarkedTokenizer,
|
|
10
|
+
MarkedStyles,
|
|
11
|
+
} from 'react-native-marked';
|
|
7
12
|
|
|
8
13
|
interface ChatAIAnswerMessageItemProps {
|
|
9
14
|
item: IMessageItem;
|
|
10
15
|
isLast?: boolean;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
|
-
class CustomTokenizer extends MarkedTokenizer {
|
|
14
|
-
}
|
|
18
|
+
class CustomTokenizer extends MarkedTokenizer {}
|
|
15
19
|
|
|
16
20
|
class CustomRenderer extends Renderer implements RendererInterface {
|
|
17
21
|
constructor() {
|
|
@@ -21,21 +25,19 @@ class CustomRenderer extends Renderer implements RendererInterface {
|
|
|
21
25
|
html(text: string): ReactNode {
|
|
22
26
|
const match = /^<!--\s*@component:product\(id:([\w-]+)\)\s*-->/.exec(text);
|
|
23
27
|
return (
|
|
24
|
-
<KLabel.Text
|
|
25
|
-
|
|
26
|
-
typo="TextMdNormal"
|
|
27
|
-
>
|
|
28
|
-
{match?.[1] || ""}
|
|
28
|
+
<KLabel.Text key={this.getKey()} typo="TextMdNormal">
|
|
29
|
+
{match?.[1] || ''}
|
|
29
30
|
</KLabel.Text>
|
|
30
|
-
)
|
|
31
|
+
);
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
paragraph(children: ReactNode[]): ReactNode {
|
|
34
|
+
paragraph(children: ReactNode[], style?: any): ReactNode {
|
|
34
35
|
return (
|
|
35
36
|
<KContainer.View
|
|
36
37
|
key={this.getKey()}
|
|
37
38
|
background={KColors.white}
|
|
38
39
|
paddingV={0}
|
|
40
|
+
style={style}
|
|
39
41
|
>
|
|
40
42
|
{children}
|
|
41
43
|
</KContainer.View>
|
|
@@ -44,41 +46,45 @@ class CustomRenderer extends Renderer implements RendererInterface {
|
|
|
44
46
|
|
|
45
47
|
text(text: string | ReactNode[]): ReactNode {
|
|
46
48
|
return (
|
|
47
|
-
<KLabel.Text
|
|
48
|
-
key={this.getKey()}
|
|
49
|
-
typo="TextMdNormal"
|
|
50
|
-
>
|
|
49
|
+
<KLabel.Text key={this.getKey()} typo="TextMdNormal">
|
|
51
50
|
{text}
|
|
52
51
|
</KLabel.Text>
|
|
53
|
-
)
|
|
52
|
+
);
|
|
54
53
|
}
|
|
55
54
|
|
|
56
55
|
codespan(text: string): ReactNode {
|
|
57
56
|
return (
|
|
58
|
-
<KLabel.Text
|
|
59
|
-
key={this.getKey()}
|
|
60
|
-
typo="TextMdNormal"
|
|
61
|
-
>
|
|
57
|
+
<KLabel.Text key={this.getKey()} typo="TextMdNormal">
|
|
62
58
|
{text}
|
|
63
59
|
</KLabel.Text>
|
|
64
|
-
)
|
|
60
|
+
);
|
|
65
61
|
}
|
|
66
62
|
|
|
67
63
|
strong(children: string | ReactNode[]): ReactNode {
|
|
68
64
|
return (
|
|
69
|
-
<KLabel.Text
|
|
70
|
-
key={this.getKey()}
|
|
71
|
-
typo="TextMdBold"
|
|
72
|
-
>
|
|
65
|
+
<KLabel.Text key={this.getKey()} typo="TextMdBold">
|
|
73
66
|
{children}
|
|
74
67
|
</KLabel.Text>
|
|
75
|
-
)
|
|
68
|
+
);
|
|
76
69
|
}
|
|
77
70
|
}
|
|
78
71
|
|
|
79
72
|
const tokenizer = new CustomTokenizer();
|
|
80
73
|
const renderer = new CustomRenderer();
|
|
81
74
|
|
|
75
|
+
const markedStyles: MarkedStyles = {
|
|
76
|
+
paragraph: {
|
|
77
|
+
marginVertical: 5,
|
|
78
|
+
},
|
|
79
|
+
blockquote: {
|
|
80
|
+
marginVertical: 5,
|
|
81
|
+
},
|
|
82
|
+
li: {
|
|
83
|
+
marginVertical: 5,
|
|
84
|
+
justifyContent: 'center',
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
82
88
|
const ChatAIAnswerMessageItem = ({
|
|
83
89
|
item,
|
|
84
90
|
isLast = false,
|
|
@@ -86,6 +92,7 @@ const ChatAIAnswerMessageItem = ({
|
|
|
86
92
|
const streamMessage = useStreamMessageStore(
|
|
87
93
|
(state) => state.streamMessage?.[item.id]
|
|
88
94
|
);
|
|
95
|
+
const isStreaming = useStreamMessageStore((state) => state.isStreaming);
|
|
89
96
|
|
|
90
97
|
const [display, setDisplay] = useState('');
|
|
91
98
|
const indexRef = useRef(0);
|
|
@@ -104,20 +111,28 @@ const ChatAIAnswerMessageItem = ({
|
|
|
104
111
|
return;
|
|
105
112
|
}
|
|
106
113
|
|
|
107
|
-
const chunkSize =
|
|
114
|
+
const chunkSize = 50;
|
|
108
115
|
const chunk = remaining.slice(0, chunkSize);
|
|
109
116
|
|
|
110
117
|
setDisplay((prev) => prev + chunk);
|
|
111
118
|
indexRef.current += chunk.length;
|
|
112
|
-
},
|
|
119
|
+
}, 50);
|
|
113
120
|
|
|
114
121
|
return () => clearInterval(interval);
|
|
115
122
|
}, [streamMessage, item]);
|
|
116
123
|
|
|
117
124
|
return (
|
|
118
125
|
<KContainer.View style={styles.container}>
|
|
119
|
-
<Markdown
|
|
120
|
-
|
|
126
|
+
<Markdown
|
|
127
|
+
renderer={renderer}
|
|
128
|
+
value={display}
|
|
129
|
+
tokenizer={tokenizer}
|
|
130
|
+
styles={markedStyles}
|
|
131
|
+
flatListProps={{
|
|
132
|
+
style: styles.flatList,
|
|
133
|
+
}}
|
|
134
|
+
/>
|
|
135
|
+
<KContainer.VisibleView visible={isLast && !isStreaming}>
|
|
121
136
|
<KLabel.Text
|
|
122
137
|
typo="TextSmNormal"
|
|
123
138
|
color={KColors.gray.light}
|
|
@@ -138,4 +153,7 @@ const styles = StyleSheet.create({
|
|
|
138
153
|
paddingHorizontal: KSpacingValue['1rem'],
|
|
139
154
|
gap: KSpacingValue['0.5rem'],
|
|
140
155
|
},
|
|
156
|
+
flatList: {
|
|
157
|
+
backgroundColor: KColors.transparent,
|
|
158
|
+
},
|
|
141
159
|
});
|
|
@@ -7,13 +7,14 @@ import {
|
|
|
7
7
|
KImage,
|
|
8
8
|
} from '@droppii/libs';
|
|
9
9
|
import type { IMessageItem } from '../../../types';
|
|
10
|
-
import { StyleSheet } from 'react-native';
|
|
10
|
+
import { StyleSheet, DeviceEventEmitter } from 'react-native';
|
|
11
11
|
import { ReactNode, useCallback, useEffect, useRef, useState } from 'react';
|
|
12
12
|
import { IconThinkingStep } from '../../../assets/svgIcon/IconThinkingStep';
|
|
13
13
|
import { IconChatArrow } from '../../../assets/svgIcon/IconChatArrow';
|
|
14
14
|
import useStreamMessageStore from '../../../store/streamMessage';
|
|
15
|
-
import Markdown, { Renderer, RendererInterface } from
|
|
15
|
+
import Markdown, { Renderer, RendererInterface } from 'react-native-marked';
|
|
16
16
|
import icons from '../../../assets/icons';
|
|
17
|
+
import { events } from '../../../constants/events';
|
|
17
18
|
|
|
18
19
|
interface ChatAIThinkingMessageItemProps {
|
|
19
20
|
item: IMessageItem;
|
|
@@ -30,7 +31,7 @@ class CustomRenderer extends Renderer implements RendererInterface {
|
|
|
30
31
|
<KContainer.View
|
|
31
32
|
key={this.getKey()}
|
|
32
33
|
style={styles}
|
|
33
|
-
background={KColors.
|
|
34
|
+
background={KColors.transparent}
|
|
34
35
|
paddingV={0}
|
|
35
36
|
>
|
|
36
37
|
{children}
|
|
@@ -40,35 +41,26 @@ class CustomRenderer extends Renderer implements RendererInterface {
|
|
|
40
41
|
|
|
41
42
|
text(text: string | ReactNode[]): ReactNode {
|
|
42
43
|
return (
|
|
43
|
-
<KLabel.Text
|
|
44
|
-
key={this.getKey()}
|
|
45
|
-
typo="TextSmNormal"
|
|
46
|
-
>
|
|
44
|
+
<KLabel.Text key={this.getKey()} typo="TextSmNormal">
|
|
47
45
|
{text}
|
|
48
46
|
</KLabel.Text>
|
|
49
|
-
)
|
|
47
|
+
);
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
codespan(text: string): ReactNode {
|
|
53
51
|
return (
|
|
54
|
-
<KLabel.Text
|
|
55
|
-
key={this.getKey()}
|
|
56
|
-
typo="TextSmNormal"
|
|
57
|
-
>
|
|
52
|
+
<KLabel.Text key={this.getKey()} typo="TextSmNormal">
|
|
58
53
|
{text}
|
|
59
54
|
</KLabel.Text>
|
|
60
|
-
)
|
|
55
|
+
);
|
|
61
56
|
}
|
|
62
57
|
|
|
63
58
|
strong(children: string | ReactNode[]): ReactNode {
|
|
64
59
|
return (
|
|
65
|
-
<KLabel.Text
|
|
66
|
-
key={this.getKey()}
|
|
67
|
-
typo="TextSmNormal"
|
|
68
|
-
>
|
|
60
|
+
<KLabel.Text key={this.getKey()} typo="TextSmNormal">
|
|
69
61
|
{children}
|
|
70
62
|
</KLabel.Text>
|
|
71
|
-
)
|
|
63
|
+
);
|
|
72
64
|
}
|
|
73
65
|
|
|
74
66
|
image(uri: string, _alt?: string, _style?: any): ReactNode {
|
|
@@ -76,7 +68,7 @@ class CustomRenderer extends Renderer implements RendererInterface {
|
|
|
76
68
|
<KImage.Thumbnail
|
|
77
69
|
key={this.getKey()}
|
|
78
70
|
uri={uri}
|
|
79
|
-
resizeMode={
|
|
71
|
+
resizeMode={'contain'}
|
|
80
72
|
size={'lg'}
|
|
81
73
|
/>
|
|
82
74
|
);
|
|
@@ -96,6 +88,10 @@ const ChatAIThinkingMessageItem = ({
|
|
|
96
88
|
const [display, setDisplay] = useState('');
|
|
97
89
|
const indexRef = useRef(0);
|
|
98
90
|
|
|
91
|
+
const onPressExpandThinkingStep = useCallback((expand: boolean) => {
|
|
92
|
+
DeviceEventEmitter.emit(events.expandThinkingStep, expand);
|
|
93
|
+
}, []);
|
|
94
|
+
|
|
99
95
|
const renderHeader = useCallback(() => {
|
|
100
96
|
return (
|
|
101
97
|
<KContainer.View style={styles.header}>
|
|
@@ -121,7 +117,7 @@ const ChatAIThinkingMessageItem = ({
|
|
|
121
117
|
return;
|
|
122
118
|
}
|
|
123
119
|
|
|
124
|
-
const chunkSize =
|
|
120
|
+
const chunkSize = 5;
|
|
125
121
|
const chunk = remaining.slice(0, chunkSize);
|
|
126
122
|
|
|
127
123
|
setDisplay((prev) => prev + chunk);
|
|
@@ -135,34 +131,41 @@ const ChatAIThinkingMessageItem = ({
|
|
|
135
131
|
return (
|
|
136
132
|
<KContainer.View style={styles.contentContainer}>
|
|
137
133
|
<KContainer.View style={styles.arrow}>
|
|
138
|
-
<IconChatArrow fill={
|
|
134
|
+
<IconChatArrow fill={KColors.gray.light} />
|
|
139
135
|
</KContainer.View>
|
|
140
136
|
<KContainer.View style={styles.content}>
|
|
141
|
-
<Markdown
|
|
137
|
+
<Markdown
|
|
138
|
+
renderer={renderer}
|
|
139
|
+
value={display}
|
|
140
|
+
flatListProps={{
|
|
141
|
+
style: styles.flatList,
|
|
142
|
+
}}
|
|
143
|
+
/>
|
|
142
144
|
</KContainer.View>
|
|
143
145
|
</KContainer.View>
|
|
144
|
-
)
|
|
146
|
+
);
|
|
145
147
|
}, [display]);
|
|
148
|
+
|
|
146
149
|
return (
|
|
147
150
|
<KContainer.View>
|
|
148
|
-
{!isLast || streamMessage?.metadata?.status === 'done' ?
|
|
151
|
+
{!isLast || streamMessage?.metadata?.status === 'done' ? (
|
|
149
152
|
<KListItem.Accordion
|
|
150
153
|
header={renderHeader}
|
|
151
154
|
key={item.id.toString()}
|
|
152
155
|
containerStyle={styles.container}
|
|
153
156
|
headerStyle={styles.mHeader}
|
|
154
157
|
defaultValue={true}
|
|
158
|
+
onChangeValue={onPressExpandThinkingStep}
|
|
155
159
|
>
|
|
156
160
|
{renderThinkingContent()}
|
|
157
161
|
</KListItem.Accordion>
|
|
158
|
-
:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
162
|
+
) : (
|
|
163
|
+
<KContainer.View style={styles.containerLoading}>
|
|
164
|
+
{renderThinkingContent()}
|
|
165
|
+
{isLast && <KImage.Base size={42} uri={icons.icon_thinking_step} />}
|
|
166
|
+
</KContainer.View>
|
|
167
|
+
)}
|
|
164
168
|
</KContainer.View>
|
|
165
|
-
|
|
166
169
|
);
|
|
167
170
|
};
|
|
168
171
|
|
|
@@ -202,4 +205,7 @@ const styles = StyleSheet.create({
|
|
|
202
205
|
arrow: {
|
|
203
206
|
transform: [{ rotateY: '180deg' }],
|
|
204
207
|
},
|
|
208
|
+
flatList: {
|
|
209
|
+
backgroundColor: KColors.transparent,
|
|
210
|
+
},
|
|
205
211
|
});
|