@messenger-box/platform-mobile 10.0.3-alpha.20 → 10.0.3-alpha.202

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.
Files changed (112) hide show
  1. package/lib/components/messages-container-ui/BuildModeView.js +428 -0
  2. package/lib/components/messages-container-ui/BuildModeView.js.map +1 -0
  3. package/lib/components/messages-container-ui/MessagesContainerUI.js +55 -0
  4. package/lib/components/messages-container-ui/MessagesContainerUI.js.map +1 -0
  5. package/lib/components/messages-container-ui/PlanModeView.js +336 -0
  6. package/lib/components/messages-container-ui/PlanModeView.js.map +1 -0
  7. package/lib/compute.js +2 -3
  8. package/lib/compute.js.map +1 -1
  9. package/lib/index.js +1 -1
  10. package/lib/index.js.map +1 -1
  11. package/lib/module.js.map +1 -1
  12. package/lib/queries/inboxQueries.js +62 -0
  13. package/lib/queries/inboxQueries.js.map +1 -0
  14. package/lib/routes.json +2 -3
  15. package/lib/screens/inbox/DialogMessages.js +8 -3
  16. package/lib/screens/inbox/DialogMessages.js.map +1 -1
  17. package/lib/screens/inbox/DialogThreadMessages.js +6 -11
  18. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  19. package/lib/screens/inbox/DialogThreads.js +58 -20
  20. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  21. package/lib/screens/inbox/Inbox.js.map +1 -1
  22. package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
  23. package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
  24. package/lib/screens/inbox/components/CachedImage/index.js +125 -115
  25. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  26. package/lib/screens/inbox/components/DialogItem.js +160 -0
  27. package/lib/screens/inbox/components/DialogItem.js.map +1 -0
  28. package/lib/screens/inbox/components/GiftedChatInboxComponent.js +315 -0
  29. package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
  30. package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js +3 -1
  31. package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
  32. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js +194 -0
  33. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js.map +1 -0
  34. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +149 -36
  35. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  36. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js +4 -5
  37. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
  38. package/lib/screens/inbox/components/SubscriptionHandler.js +22 -0
  39. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  40. package/lib/screens/inbox/components/ThreadsViewItem.js +67 -47
  41. package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
  42. package/lib/screens/inbox/config/config.js +4 -2
  43. package/lib/screens/inbox/config/config.js.map +1 -1
  44. package/lib/screens/inbox/containers/ConversationView.js +1099 -1094
  45. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  46. package/lib/screens/inbox/containers/Dialogs.js +132 -534
  47. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  48. package/lib/screens/inbox/containers/ThreadConversationView.js +876 -1357
  49. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  50. package/lib/screens/inbox/containers/ThreadsView.js +81 -54
  51. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  52. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  53. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  54. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +108 -0
  55. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -0
  56. package/lib/screens/inbox/workflow/dialog-threads-xstate.js +151 -0
  57. package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -0
  58. package/package.json +9 -7
  59. package/CHANGELOG.md +0 -164
  60. package/jest.config.js +0 -24
  61. package/lib/screens/inbox/components/DialogsListItem.js +0 -548
  62. package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
  63. package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -489
  64. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
  65. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
  66. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
  67. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
  68. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
  69. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
  70. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
  71. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
  72. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
  73. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
  74. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
  75. package/rollup.config.mjs +0 -45
  76. package/src/components/index.ts +0 -0
  77. package/src/compute.ts +0 -63
  78. package/src/index.ts +0 -7
  79. package/src/module.ts +0 -10
  80. package/src/navigation/InboxNavigation.tsx +0 -102
  81. package/src/navigation/index.ts +0 -1
  82. package/src/screens/inbox/DialogMessages.tsx +0 -21
  83. package/src/screens/inbox/DialogThreadMessages.tsx +0 -97
  84. package/src/screens/inbox/DialogThreads.tsx +0 -129
  85. package/src/screens/inbox/Inbox.tsx +0 -17
  86. package/src/screens/inbox/components/CachedImage/consts.ts +0 -6
  87. package/src/screens/inbox/components/CachedImage/index.tsx +0 -223
  88. package/src/screens/inbox/components/DialogsHeader.tsx +0 -30
  89. package/src/screens/inbox/components/DialogsListItem.tsx +0 -819
  90. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +0 -679
  91. package/src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx +0 -113
  92. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +0 -313
  93. package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +0 -145
  94. package/src/screens/inbox/components/SlackMessageContainer/index.ts +0 -3
  95. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +0 -301
  96. package/src/screens/inbox/components/ThreadsViewItem.tsx +0 -321
  97. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +0 -145
  98. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +0 -159
  99. package/src/screens/inbox/config/config.ts +0 -15
  100. package/src/screens/inbox/config/index.ts +0 -1
  101. package/src/screens/inbox/containers/ConversationView.tsx +0 -1782
  102. package/src/screens/inbox/containers/Dialogs.tsx +0 -794
  103. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +0 -119
  104. package/src/screens/inbox/containers/ThreadConversationView.tsx +0 -2312
  105. package/src/screens/inbox/containers/ThreadsView.tsx +0 -305
  106. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +0 -20
  107. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +0 -313
  108. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +0 -196
  109. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +0 -401
  110. package/src/screens/index.ts +0 -4
  111. package/tsconfig.json +0 -13
  112. package/webpack.config.js +0 -58
@@ -0,0 +1,428 @@
1
+ import React__default,{useRef,useState,useCallback,useMemo}from'react';import {StyleSheet,View,KeyboardAvoidingView,Platform,TouchableOpacity,Text}from'react-native';import {Bubble,GiftedChat}from'react-native-gifted-chat';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const BUBBLE_BG = "#f3f4f6";
21
+ const USER_BUBBLE_BG = "#2563eb";
22
+ const BORDER_COLOR = "#e5e7eb";
23
+ const GREEN_DOT = "#22c55e";
24
+ function buildMessageToGifted(msg, currentUserId, index, total) {
25
+ const isUser = msg.role === "user";
26
+ return {
27
+ _id: msg.id,
28
+ text: msg.content,
29
+ createdAt: new Date(Date.now() - (total - 1 - index) * 6e4),
30
+ user: {
31
+ _id: isUser ? currentUserId : "assistant",
32
+ name: isUser ? "You" : "Agent"
33
+ },
34
+ buildMessage: msg
35
+ };
36
+ }
37
+ function TaskStatusBubble({
38
+ status,
39
+ taskTitle,
40
+ onExpand
41
+ }) {
42
+ return /* @__PURE__ */ React__default.createElement(View, { style: [styles.taskBubble, status === "completed" && styles.taskBubbleCompleted] }, /* @__PURE__ */ React__default.createElement(View, { style: styles.taskBubbleRow }, /* @__PURE__ */ React__default.createElement(View, { style: [styles.greenDot, status === "executing" && styles.greenDotPulse] }), /* @__PURE__ */ React__default.createElement(Text, { style: styles.taskBubbleTitle }, status === "executing" ? "Executing task..." : "Task completed"), onExpand && /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.expandButton, onPress: onExpand }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.expandIcon }, "\u2922"))), taskTitle ? /* @__PURE__ */ React__default.createElement(Text, { style: styles.taskBubbleSubtitle }, taskTitle) : null);
43
+ }
44
+ function NextStepsBlock({
45
+ steps
46
+ }) {
47
+ return /* @__PURE__ */ React__default.createElement(View, { style: styles.nextStepsBlock }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.nextStepsTitle }, "Next steps:"), steps.map((s, i) => /* @__PURE__ */ React__default.createElement(Text, { key: i, style: styles.nextStepsItem }, "\u2022 ", s)));
48
+ }
49
+ function ActionCardsRow({
50
+ cards
51
+ }) {
52
+ if (!(cards == null ? void 0 : cards.length)) return null;
53
+ return /* @__PURE__ */ React__default.createElement(View, { style: styles.actionCardsRow }, cards.map((c) => /* @__PURE__ */ React__default.createElement(TouchableOpacity, { key: c.id, style: styles.actionCard, onPress: c.onPress }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.actionCardIcon }, c.icon === "globe" ? "\u{1F310}" : c.icon === "folder" ? "\u{1F4C1}" : "\u2022"), /* @__PURE__ */ React__default.createElement(View, { style: styles.actionCardText }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.actionCardTitle }, c.title, " ", c.badge ? ` ${c.badge}` : ""), c.subtitle ? /* @__PURE__ */ React__default.createElement(Text, { style: styles.actionCardSubtitle }, c.subtitle) : null))));
54
+ }
55
+ function AgentStepsInline({
56
+ steps
57
+ }) {
58
+ if (!(steps == null ? void 0 : steps.length)) return null;
59
+ return /* @__PURE__ */ React__default.createElement(View, { style: styles.agentStepsInline }, steps.map((s) => /* @__PURE__ */ React__default.createElement(TouchableOpacity, { key: s.id, style: styles.agentStepChip, onPress: s.onPress }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.agentStepLabel }, s.label))));
60
+ }
61
+ function BuildMessageBubble({
62
+ message,
63
+ isLeft,
64
+ showBorder
65
+ }) {
66
+ const taskStatus = message.taskStatus === "executing" || message.taskStatus === "completed" ? message.taskStatus : null;
67
+ const showContent = message.content.trim().length > 0;
68
+ return /* @__PURE__ */ React__default.createElement(View, { style: [styles.buildBubble, isLeft ? styles.buildBubbleLeft : styles.buildBubbleRight, isLeft && !showBorder && styles.buildBubbleLeftNoBorder] }, taskStatus && /* @__PURE__ */ React__default.createElement(TaskStatusBubble, { status: taskStatus, taskTitle: message.taskTitle, onExpand: () => {
69
+ } }), showContent && /* @__PURE__ */ React__default.createElement(Text, { style: [styles.buildBubbleText, !isLeft && styles.buildBubbleTextUser] }, message.content), message.steps && message.steps.length > 0 && /* @__PURE__ */ React__default.createElement(AgentStepsInline, { steps: message.steps }), message.nextSteps && message.nextSteps.length > 0 && /* @__PURE__ */ React__default.createElement(NextStepsBlock, { steps: message.nextSteps }), message.actionCards && message.actionCards.length > 0 && /* @__PURE__ */ React__default.createElement(ActionCardsRow, { cards: message.actionCards }), /* @__PURE__ */ React__default.createElement(View, { style: styles.feedbackRow }, /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.feedbackIcon }, /* @__PURE__ */ React__default.createElement(Text, null, "\u{1F50A}")), /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.feedbackIcon }, /* @__PURE__ */ React__default.createElement(Text, null, "\u{1F4CB}")), /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.feedbackIcon }, /* @__PURE__ */ React__default.createElement(Text, null, "\u{1F44D}")), /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.feedbackIcon }, /* @__PURE__ */ React__default.createElement(Text, null, "\u{1F44E}")), /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.feedbackIcon }, /* @__PURE__ */ React__default.createElement(Text, null, "\u2197"))));
70
+ }
71
+ function BuildModeView({
72
+ messages,
73
+ streamingContent,
74
+ currentUser,
75
+ onSend,
76
+ disabled = false,
77
+ isLoading = false,
78
+ showDate = false,
79
+ showAvatar = false,
80
+ showMessageBubbleBorder = false,
81
+ renderInputToolbar
82
+ }) {
83
+ var _a;
84
+ const [inputValue, setInputValue] = React__default.useState("");
85
+ const messageListRef = useRef(null);
86
+ const [scrollFlags, setScrollFlags] = useState({
87
+ showScrollToBottom: false,
88
+ showScrollToTop: false
89
+ });
90
+ const SCROLL_THRESHOLD = 60;
91
+ const handleScroll = useCallback((e) => {
92
+ var _a2, _b;
93
+ const {
94
+ contentOffset,
95
+ contentSize,
96
+ layoutMeasurement
97
+ } = e.nativeEvent;
98
+ const {
99
+ y: offsetY
100
+ } = contentOffset;
101
+ const contentHeight = (_a2 = contentSize == null ? void 0 : contentSize.height) != null ? _a2 : 0;
102
+ const layoutHeight = (_b = layoutMeasurement == null ? void 0 : layoutMeasurement.height) != null ? _b : 0;
103
+ const maxOffset = Math.max(0, contentHeight - layoutHeight);
104
+ setScrollFlags({
105
+ showScrollToBottom: maxOffset > SCROLL_THRESHOLD && offsetY > SCROLL_THRESHOLD,
106
+ showScrollToTop: maxOffset > SCROLL_THRESHOLD && offsetY < maxOffset - SCROLL_THRESHOLD
107
+ });
108
+ }, []);
109
+ const scrollToBottom = useCallback(() => {
110
+ var _a2, _b;
111
+ (_b = (_a2 = messageListRef.current) == null ? void 0 : _a2.scrollToOffset) == null ? void 0 : _b.call(_a2, {
112
+ offset: 0,
113
+ animated: true
114
+ });
115
+ }, []);
116
+ const scrollToTop = useCallback(() => {
117
+ var _a2, _b;
118
+ (_b = (_a2 = messageListRef.current) == null ? void 0 : _a2.scrollToEnd) == null ? void 0 : _b.call(_a2, {
119
+ animated: true
120
+ });
121
+ }, []);
122
+ const giftedMessages = useMemo(() => {
123
+ const list = messages.map((m, i) => buildMessageToGifted(m, currentUser.id, i, messages.length));
124
+ return [...list].reverse();
125
+ }, [messages, currentUser.id]);
126
+ const messagesWithStreaming = useMemo(() => {
127
+ if (!(streamingContent == null ? void 0 : streamingContent.trim())) return giftedMessages;
128
+ const streamMsg = {
129
+ _id: "__streaming__",
130
+ text: streamingContent,
131
+ createdAt: new Date(Date.now() + 6e4),
132
+ user: {
133
+ _id: "assistant",
134
+ name: "Agent"
135
+ }
136
+ };
137
+ return [streamMsg, ...giftedMessages];
138
+ }, [giftedMessages, streamingContent]);
139
+ const onSendFromInput = useCallback(() => {
140
+ const t = inputValue.trim();
141
+ if (!t) return;
142
+ onSend(t);
143
+ setInputValue("");
144
+ }, [inputValue, onSend]);
145
+ const renderMessage = useCallback((props) => {
146
+ var _a2, _b, _c;
147
+ const buildMsg = (_a2 = props.currentMessage) == null ? void 0 : _a2.buildMessage;
148
+ if (buildMsg) {
149
+ const isLeft = props.currentMessage.user._id !== currentUser.id;
150
+ return /* @__PURE__ */ React__default.createElement(BuildMessageBubble, { message: buildMsg, isLeft, showBorder: showMessageBubbleBorder });
151
+ }
152
+ ((_c = (_b = props.currentMessage) == null ? void 0 : _b.user) == null ? void 0 : _c._id) === currentUser.id;
153
+ return /* @__PURE__ */ React__default.createElement(Bubble, __spreadProps(__spreadValues({}, props), { renderTime: showDate ? void 0 : () => null, wrapperStyle: {
154
+ right: {
155
+ backgroundColor: USER_BUBBLE_BG,
156
+ borderRadius: 16,
157
+ padding: 12,
158
+ maxWidth: "92%",
159
+ marginHorizontal: 8
160
+ },
161
+ left: __spreadValues({
162
+ backgroundColor: BUBBLE_BG,
163
+ borderRadius: 16,
164
+ padding: 12,
165
+ width: "100%",
166
+ maxWidth: "100%",
167
+ alignSelf: "stretch",
168
+ marginHorizontal: 0
169
+ }, showMessageBubbleBorder && {
170
+ borderWidth: 1,
171
+ borderColor: BORDER_COLOR
172
+ })
173
+ }, textStyle: {
174
+ right: {
175
+ color: "#ffffff",
176
+ fontSize: 15
177
+ },
178
+ left: {
179
+ color: "#111827",
180
+ fontSize: 15
181
+ }
182
+ } }));
183
+ }, [currentUser.id, showDate, showMessageBubbleBorder]);
184
+ const renderInputToolbarCallback = useCallback(() => /* @__PURE__ */ React__default.createElement(View, { style: styles.inputToolbarWrap }, renderInputToolbar({
185
+ value: inputValue,
186
+ onChange: setInputValue,
187
+ onSend: onSendFromInput,
188
+ disabled: disabled || isLoading
189
+ })), [inputValue, disabled, isLoading, onSendFromInput, renderInputToolbar]);
190
+ return /* @__PURE__ */ React__default.createElement(KeyboardAvoidingView, { style: styles.container, behavior: Platform.OS === "ios" ? "padding" : void 0, keyboardVerticalOffset: Platform.OS === "ios" ? 64 : 0 }, /* @__PURE__ */ React__default.createElement(View, { style: styles.chatArea }, /* @__PURE__ */ React__default.createElement(GiftedChat, { messageContainerRef: messageListRef, messages: messagesWithStreaming, onSend: (msgs) => {
191
+ var _a2, _b;
192
+ const t = (_b = (_a2 = msgs[0]) == null ? void 0 : _a2.text) == null ? void 0 : _b.trim();
193
+ if (t) onSend(t);
194
+ }, user: {
195
+ _id: currentUser.id,
196
+ name: (_a = currentUser.name) != null ? _a : "You",
197
+ avatar: currentUser.avatar
198
+ }, renderMessage, renderInputToolbar: renderInputToolbarCallback, renderComposer: () => null, renderSend: () => null, renderAvatar: showAvatar ? void 0 : () => null, showUserAvatar: showAvatar, renderTime: showDate ? void 0 : () => null, renderDay: showDate ? void 0 : () => null, listViewProps: {
199
+ style: styles.list,
200
+ contentContainerStyle: [styles.listContent, {
201
+ paddingHorizontal: 0
202
+ }],
203
+ onScroll: handleScroll,
204
+ scrollEventThrottle: 100
205
+ }, messagesContainerStyle: [styles.messagesContainer, styles.messagesContainerFullWidth], scrollToBottom: false, minInputToolbarHeight: 56 }), scrollFlags.showScrollToBottom && /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.scrollFabBottom, onPress: scrollToBottom, activeOpacity: 0.8, accessibilityLabel: "Scroll to bottom" }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.scrollFabText }, "\u2193")), scrollFlags.showScrollToTop && /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.scrollFabTop, onPress: scrollToTop, activeOpacity: 0.8, accessibilityLabel: "Scroll to top" }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.scrollFabText }, "\u2191"))));
206
+ }
207
+ const styles = StyleSheet.create({
208
+ container: {
209
+ flex: 1
210
+ },
211
+ chatArea: {
212
+ flex: 1
213
+ },
214
+ list: {
215
+ flex: 1
216
+ },
217
+ listContent: {
218
+ flexGrow: 1,
219
+ justifyContent: "flex-end",
220
+ paddingTop: 0,
221
+ paddingBottom: 8,
222
+ paddingHorizontal: 0
223
+ },
224
+ messagesContainer: {
225
+ paddingTop: 0,
226
+ paddingBottom: 8
227
+ },
228
+ messagesContainerFullWidth: {
229
+ paddingHorizontal: 0,
230
+ paddingLeft: 0,
231
+ paddingRight: 0,
232
+ marginHorizontal: 0
233
+ },
234
+ scrollToBottom: {
235
+ width: 32,
236
+ height: 32,
237
+ borderRadius: 16,
238
+ backgroundColor: "#fff",
239
+ marginBottom: 8
240
+ },
241
+ scrollFabBottom: {
242
+ position: "absolute",
243
+ right: 12,
244
+ bottom: 120,
245
+ width: 40,
246
+ height: 40,
247
+ borderRadius: 20,
248
+ backgroundColor: "#fff",
249
+ alignItems: "center",
250
+ justifyContent: "center",
251
+ shadowColor: "#000",
252
+ shadowOffset: {
253
+ width: 0,
254
+ height: 1
255
+ },
256
+ shadowOpacity: 0.2,
257
+ shadowRadius: 2,
258
+ elevation: 3
259
+ },
260
+ scrollFabTop: {
261
+ position: "absolute",
262
+ right: 12,
263
+ top: 12,
264
+ width: 40,
265
+ height: 40,
266
+ borderRadius: 20,
267
+ backgroundColor: "#fff",
268
+ alignItems: "center",
269
+ justifyContent: "center",
270
+ shadowColor: "#000",
271
+ shadowOffset: {
272
+ width: 0,
273
+ height: 1
274
+ },
275
+ shadowOpacity: 0.2,
276
+ shadowRadius: 2,
277
+ elevation: 3
278
+ },
279
+ scrollFabText: {
280
+ fontSize: 20,
281
+ color: "#2563eb",
282
+ fontWeight: "600"
283
+ },
284
+ inputToolbarWrap: {
285
+ paddingHorizontal: 8,
286
+ paddingVertical: 8,
287
+ backgroundColor: "#fff",
288
+ borderTopWidth: 1,
289
+ borderTopColor: BORDER_COLOR
290
+ },
291
+ taskBubble: {
292
+ backgroundColor: BUBBLE_BG,
293
+ borderRadius: 12,
294
+ padding: 12,
295
+ marginBottom: 8,
296
+ borderWidth: 1,
297
+ borderColor: BORDER_COLOR
298
+ },
299
+ taskBubbleCompleted: {},
300
+ taskBubbleRow: {
301
+ flexDirection: "row",
302
+ alignItems: "center"
303
+ },
304
+ greenDot: {
305
+ width: 8,
306
+ height: 8,
307
+ borderRadius: 4,
308
+ backgroundColor: GREEN_DOT,
309
+ marginRight: 8
310
+ },
311
+ greenDotPulse: {
312
+ opacity: 0.8
313
+ },
314
+ taskBubbleTitle: {
315
+ flex: 1,
316
+ fontWeight: "600",
317
+ color: "#111827",
318
+ fontSize: 14
319
+ },
320
+ expandButton: {
321
+ padding: 4
322
+ },
323
+ expandIcon: {
324
+ fontSize: 14,
325
+ color: "#6b7280"
326
+ },
327
+ taskBubbleSubtitle: {
328
+ marginTop: 4,
329
+ marginLeft: 16,
330
+ color: "#6b7280",
331
+ fontSize: 13
332
+ },
333
+ nextStepsBlock: {
334
+ marginTop: 8
335
+ },
336
+ nextStepsTitle: {
337
+ fontWeight: "700",
338
+ color: "#111827",
339
+ marginBottom: 4,
340
+ fontSize: 14
341
+ },
342
+ nextStepsItem: {
343
+ color: "#374151",
344
+ fontSize: 13,
345
+ marginBottom: 2
346
+ },
347
+ actionCardsRow: {
348
+ marginTop: 12,
349
+ gap: 8
350
+ },
351
+ actionCard: {
352
+ flexDirection: "row",
353
+ alignItems: "center",
354
+ backgroundColor: BUBBLE_BG,
355
+ borderRadius: 12,
356
+ padding: 12,
357
+ marginBottom: 8,
358
+ borderWidth: 1,
359
+ borderColor: BORDER_COLOR
360
+ },
361
+ actionCardIcon: {
362
+ marginRight: 10,
363
+ fontSize: 18
364
+ },
365
+ actionCardText: {
366
+ flex: 1
367
+ },
368
+ actionCardTitle: {
369
+ fontWeight: "600",
370
+ color: "#111827",
371
+ fontSize: 14
372
+ },
373
+ actionCardSubtitle: {
374
+ marginTop: 2,
375
+ color: "#6b7280",
376
+ fontSize: 12
377
+ },
378
+ agentStepsInline: {
379
+ flexDirection: "row",
380
+ flexWrap: "wrap",
381
+ marginTop: 8,
382
+ gap: 6
383
+ },
384
+ agentStepChip: {
385
+ backgroundColor: "#e5e7eb",
386
+ paddingHorizontal: 10,
387
+ paddingVertical: 6,
388
+ borderRadius: 8
389
+ },
390
+ agentStepLabel: {
391
+ color: "#374151",
392
+ fontSize: 13
393
+ },
394
+ buildBubble: {
395
+ maxWidth: "100%",
396
+ marginVertical: 4,
397
+ padding: 12,
398
+ borderRadius: 16
399
+ },
400
+ buildBubbleLeft: {
401
+ alignSelf: "flex-start",
402
+ backgroundColor: BUBBLE_BG,
403
+ borderWidth: 1,
404
+ borderColor: BORDER_COLOR
405
+ },
406
+ buildBubbleLeftNoBorder: {
407
+ borderWidth: 0
408
+ },
409
+ buildBubbleRight: {
410
+ alignSelf: "flex-end",
411
+ backgroundColor: USER_BUBBLE_BG
412
+ },
413
+ buildBubbleText: {
414
+ color: "#111827",
415
+ fontSize: 15
416
+ },
417
+ buildBubbleTextUser: {
418
+ color: "#ffffff"
419
+ },
420
+ feedbackRow: {
421
+ flexDirection: "row",
422
+ marginTop: 8,
423
+ gap: 12
424
+ },
425
+ feedbackIcon: {
426
+ padding: 4
427
+ }
428
+ });export{BuildModeView};//# sourceMappingURL=BuildModeView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildModeView.js","sources":["../../../src/components/messages-container-ui/BuildModeView.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity, Platform, KeyboardAvoidingView } from 'react-native';\nimport { GiftedChat, IMessage, Bubble } from 'react-native-gifted-chat';\nimport type { BuildMessage } from './types';\n\nconst BUBBLE_BG = '#f3f4f6';\nconst USER_BUBBLE_BG = '#2563eb';\nconst BORDER_COLOR = '#e5e7eb';\nconst GREEN_DOT = '#22c55e';\n\nexport interface BuildModeViewInputToolbarProps {\n value: string;\n onChange: (text: string) => void;\n onSend: () => void;\n disabled?: boolean;\n}\n\nexport interface BuildModeViewProps {\n messages: BuildMessage[];\n streamingContent?: string;\n currentUser: { id: string; name?: string; avatar?: string };\n onSend: (text: string) => void;\n disabled?: boolean;\n isLoading?: boolean;\n onStop?: () => void;\n /** Show date/timestamp on messages. Default false (Kimi-style: hide). */\n showDate?: boolean;\n /** Show avatar/icon next to messages. Default false (Kimi-style: hide). */\n showAvatar?: boolean;\n /** Show border around assistant/left message bubbles. Default false (hide). */\n showMessageBubbleBorder?: boolean;\n /** Input component is passed from outside; receives value, onChange, onSend, disabled */\n renderInputToolbar: (props: BuildModeViewInputToolbarProps) => React.ReactNode;\n}\n\nfunction buildMessageToGifted(\n msg: BuildMessage,\n currentUserId: string,\n index: number,\n total: number,\n): IMessage & { buildMessage?: BuildMessage } {\n const isUser = msg.role === 'user';\n return {\n _id: msg.id,\n text: msg.content,\n createdAt: new Date(Date.now() - (total - 1 - index) * 60000),\n user: { _id: isUser ? currentUserId : 'assistant', name: isUser ? 'You' : 'Agent' },\n buildMessage: msg,\n };\n}\n\nfunction TaskStatusBubble({\n status,\n taskTitle,\n onExpand,\n}: {\n status: 'executing' | 'completed';\n taskTitle?: string;\n onExpand?: () => void;\n}) {\n return (\n <View style={[styles.taskBubble, status === 'completed' && styles.taskBubbleCompleted]}>\n <View style={styles.taskBubbleRow}>\n <View style={[styles.greenDot, status === 'executing' && styles.greenDotPulse]} />\n <Text style={styles.taskBubbleTitle}>\n {status === 'executing' ? 'Executing task...' : 'Task completed'}\n </Text>\n {onExpand && (\n <TouchableOpacity style={styles.expandButton} onPress={onExpand}>\n <Text style={styles.expandIcon}>⤢</Text>\n </TouchableOpacity>\n )}\n </View>\n {taskTitle ? <Text style={styles.taskBubbleSubtitle}>{taskTitle}</Text> : null}\n </View>\n );\n}\n\nfunction NextStepsBlock({ steps }: { steps: string[] }) {\n return (\n <View style={styles.nextStepsBlock}>\n <Text style={styles.nextStepsTitle}>Next steps:</Text>\n {steps.map((s, i) => (\n <Text key={i} style={styles.nextStepsItem}>\n • {s}\n </Text>\n ))}\n </View>\n );\n}\n\nfunction ActionCardsRow({ cards }: { cards: BuildMessage['actionCards'] }) {\n if (!cards?.length) return null;\n return (\n <View style={styles.actionCardsRow}>\n {cards.map((c) => (\n <TouchableOpacity key={c.id} style={styles.actionCard} onPress={c.onPress}>\n <Text style={styles.actionCardIcon}>\n {c.icon === 'globe' ? '🌐' : c.icon === 'folder' ? '📁' : '•'}\n </Text>\n <View style={styles.actionCardText}>\n <Text style={styles.actionCardTitle}>\n {c.title} {c.badge ? ` ${c.badge}` : ''}\n </Text>\n {c.subtitle ? <Text style={styles.actionCardSubtitle}>{c.subtitle}</Text> : null}\n </View>\n </TouchableOpacity>\n ))}\n </View>\n );\n}\n\nfunction AgentStepsInline({ steps }: { steps: BuildMessage['steps'] }) {\n if (!steps?.length) return null;\n return (\n <View style={styles.agentStepsInline}>\n {steps.map((s) => (\n <TouchableOpacity key={s.id} style={styles.agentStepChip} onPress={s.onPress}>\n <Text style={styles.agentStepLabel}>{s.label}</Text>\n </TouchableOpacity>\n ))}\n </View>\n );\n}\n\nfunction BuildMessageBubble({\n message,\n isLeft,\n showBorder,\n}: {\n message: BuildMessage;\n isLeft: boolean;\n showBorder: boolean;\n}) {\n const taskStatus =\n message.taskStatus === 'executing' || message.taskStatus === 'completed' ? message.taskStatus : null;\n const showContent = message.content.trim().length > 0;\n\n return (\n <View\n style={[\n styles.buildBubble,\n isLeft ? styles.buildBubbleLeft : styles.buildBubbleRight,\n isLeft && !showBorder && styles.buildBubbleLeftNoBorder,\n ]}\n >\n {taskStatus && <TaskStatusBubble status={taskStatus} taskTitle={message.taskTitle} onExpand={() => {}} />}\n {showContent && (\n <Text style={[styles.buildBubbleText, !isLeft && styles.buildBubbleTextUser]}>{message.content}</Text>\n )}\n {message.steps && message.steps.length > 0 && <AgentStepsInline steps={message.steps} />}\n {message.nextSteps && message.nextSteps.length > 0 && <NextStepsBlock steps={message.nextSteps} />}\n {message.actionCards && message.actionCards.length > 0 && <ActionCardsRow cards={message.actionCards} />}\n <View style={styles.feedbackRow}>\n <TouchableOpacity style={styles.feedbackIcon}>\n <Text>🔊</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.feedbackIcon}>\n <Text>📋</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.feedbackIcon}>\n <Text>👍</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.feedbackIcon}>\n <Text>👎</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.feedbackIcon}>\n <Text>↗</Text>\n </TouchableOpacity>\n </View>\n </View>\n );\n}\n\nexport function BuildModeView({\n messages,\n streamingContent,\n currentUser,\n onSend,\n disabled = false,\n isLoading = false,\n showDate = false,\n showAvatar = false,\n showMessageBubbleBorder = false,\n renderInputToolbar,\n}: BuildModeViewProps) {\n const [inputValue, setInputValue] = React.useState('');\n const messageListRef = useRef<any>(null);\n const [scrollFlags, setScrollFlags] = useState({ showScrollToBottom: false, showScrollToTop: false });\n\n const SCROLL_THRESHOLD = 60;\n const handleScroll = useCallback((e: any) => {\n const { contentOffset, contentSize, layoutMeasurement } = e.nativeEvent;\n const { y: offsetY } = contentOffset;\n const contentHeight = contentSize?.height ?? 0;\n const layoutHeight = layoutMeasurement?.height ?? 0;\n const maxOffset = Math.max(0, contentHeight - layoutHeight);\n setScrollFlags({\n showScrollToBottom: maxOffset > SCROLL_THRESHOLD && offsetY > SCROLL_THRESHOLD,\n showScrollToTop: maxOffset > SCROLL_THRESHOLD && offsetY < maxOffset - SCROLL_THRESHOLD,\n });\n }, []);\n\n const scrollToBottom = useCallback(() => {\n messageListRef.current?.scrollToOffset?.({ offset: 0, animated: true });\n }, []);\n const scrollToTop = useCallback(() => {\n messageListRef.current?.scrollToEnd?.({ animated: true });\n }, []);\n\n const giftedMessages: (IMessage & { buildMessage?: BuildMessage })[] = useMemo(() => {\n const list = messages.map((m, i) => buildMessageToGifted(m, currentUser.id, i, messages.length));\n return [...list].reverse();\n }, [messages, currentUser.id]);\n\n const messagesWithStreaming = useMemo(() => {\n if (!streamingContent?.trim()) return giftedMessages;\n const streamMsg: IMessage & { buildMessage?: BuildMessage } = {\n _id: '__streaming__',\n text: streamingContent,\n createdAt: new Date(Date.now() + 60000),\n user: { _id: 'assistant', name: 'Agent' },\n };\n return [streamMsg, ...giftedMessages];\n }, [giftedMessages, streamingContent]);\n\n const onSendFromInput = useCallback(() => {\n const t = inputValue.trim();\n if (!t) return;\n onSend(t);\n setInputValue('');\n }, [inputValue, onSend]);\n\n const renderMessage = useCallback(\n (props: any) => {\n const buildMsg = (props.currentMessage as IMessage & { buildMessage?: BuildMessage })?.buildMessage;\n if (buildMsg) {\n const isLeft = props.currentMessage.user._id !== currentUser.id;\n return <BuildMessageBubble message={buildMsg} isLeft={isLeft} showBorder={showMessageBubbleBorder} />;\n }\n const isUser = props.currentMessage?.user?._id === currentUser.id;\n return (\n <Bubble\n {...props}\n renderTime={showDate ? undefined : () => null}\n wrapperStyle={{\n right: {\n backgroundColor: USER_BUBBLE_BG,\n borderRadius: 16,\n padding: 12,\n maxWidth: '92%',\n marginHorizontal: 8,\n },\n left: {\n backgroundColor: BUBBLE_BG,\n borderRadius: 16,\n padding: 12,\n width: '100%',\n maxWidth: '100%',\n alignSelf: 'stretch',\n marginHorizontal: 0,\n ...(showMessageBubbleBorder && { borderWidth: 1, borderColor: BORDER_COLOR }),\n },\n }}\n textStyle={{\n right: { color: '#ffffff', fontSize: 15 },\n left: { color: '#111827', fontSize: 15 },\n }}\n />\n );\n },\n [currentUser.id, showDate, showMessageBubbleBorder],\n );\n\n const renderInputToolbarCallback = useCallback(\n () => (\n <View style={styles.inputToolbarWrap}>\n {renderInputToolbar({\n value: inputValue,\n onChange: setInputValue,\n onSend: onSendFromInput,\n disabled: disabled || isLoading,\n })}\n </View>\n ),\n [inputValue, disabled, isLoading, onSendFromInput, renderInputToolbar],\n );\n\n return (\n <KeyboardAvoidingView\n style={styles.container}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n keyboardVerticalOffset={Platform.OS === 'ios' ? 64 : 0}\n >\n <View style={styles.chatArea}>\n <GiftedChat\n messageContainerRef={messageListRef}\n messages={messagesWithStreaming}\n onSend={(msgs) => {\n const t = msgs[0]?.text?.trim();\n if (t) onSend(t);\n }}\n user={{ _id: currentUser.id, name: currentUser.name ?? 'You', avatar: currentUser.avatar }}\n renderMessage={renderMessage}\n renderInputToolbar={renderInputToolbarCallback}\n renderComposer={() => null}\n renderSend={() => null}\n renderAvatar={showAvatar ? undefined : () => null}\n showUserAvatar={showAvatar}\n renderTime={showDate ? undefined : () => null}\n renderDay={showDate ? undefined : () => null}\n listViewProps={{\n style: styles.list,\n contentContainerStyle: [styles.listContent, { paddingHorizontal: 0 }],\n onScroll: handleScroll,\n scrollEventThrottle: 100,\n }}\n messagesContainerStyle={[styles.messagesContainer, styles.messagesContainerFullWidth]}\n scrollToBottom={false}\n minInputToolbarHeight={56}\n />\n {scrollFlags.showScrollToBottom && (\n <TouchableOpacity\n style={styles.scrollFabBottom}\n onPress={scrollToBottom}\n activeOpacity={0.8}\n accessibilityLabel=\"Scroll to bottom\"\n >\n <Text style={styles.scrollFabText}>↓</Text>\n </TouchableOpacity>\n )}\n {scrollFlags.showScrollToTop && (\n <TouchableOpacity\n style={styles.scrollFabTop}\n onPress={scrollToTop}\n activeOpacity={0.8}\n accessibilityLabel=\"Scroll to top\"\n >\n <Text style={styles.scrollFabText}>↑</Text>\n </TouchableOpacity>\n )}\n </View>\n </KeyboardAvoidingView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n chatArea: { flex: 1 },\n list: { flex: 1 },\n listContent: { flexGrow: 1, justifyContent: 'flex-end', paddingTop: 0, paddingBottom: 8, paddingHorizontal: 0 },\n messagesContainer: { paddingTop: 0, paddingBottom: 8 },\n messagesContainerFullWidth: { paddingHorizontal: 0, paddingLeft: 0, paddingRight: 0, marginHorizontal: 0 },\n scrollToBottom: { width: 32, height: 32, borderRadius: 16, backgroundColor: '#fff', marginBottom: 8 },\n scrollFabBottom: {\n position: 'absolute',\n right: 12,\n bottom: 120,\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.2,\n shadowRadius: 2,\n elevation: 3,\n },\n scrollFabTop: {\n position: 'absolute',\n right: 12,\n top: 12,\n width: 40,\n height: 40,\n borderRadius: 20,\n backgroundColor: '#fff',\n alignItems: 'center',\n justifyContent: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.2,\n shadowRadius: 2,\n elevation: 3,\n },\n scrollFabText: { fontSize: 20, color: '#2563eb', fontWeight: '600' },\n inputToolbarWrap: {\n paddingHorizontal: 8,\n paddingVertical: 8,\n backgroundColor: '#fff',\n borderTopWidth: 1,\n borderTopColor: BORDER_COLOR,\n },\n taskBubble: {\n backgroundColor: BUBBLE_BG,\n borderRadius: 12,\n padding: 12,\n marginBottom: 8,\n borderWidth: 1,\n borderColor: BORDER_COLOR,\n },\n taskBubbleCompleted: {},\n taskBubbleRow: { flexDirection: 'row', alignItems: 'center' },\n greenDot: { width: 8, height: 8, borderRadius: 4, backgroundColor: GREEN_DOT, marginRight: 8 },\n greenDotPulse: { opacity: 0.8 },\n taskBubbleTitle: { flex: 1, fontWeight: '600', color: '#111827', fontSize: 14 },\n expandButton: { padding: 4 },\n expandIcon: { fontSize: 14, color: '#6b7280' },\n taskBubbleSubtitle: { marginTop: 4, marginLeft: 16, color: '#6b7280', fontSize: 13 },\n nextStepsBlock: { marginTop: 8 },\n nextStepsTitle: { fontWeight: '700', color: '#111827', marginBottom: 4, fontSize: 14 },\n nextStepsItem: { color: '#374151', fontSize: 13, marginBottom: 2 },\n actionCardsRow: { marginTop: 12, gap: 8 },\n actionCard: {\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: BUBBLE_BG,\n borderRadius: 12,\n padding: 12,\n marginBottom: 8,\n borderWidth: 1,\n borderColor: BORDER_COLOR,\n },\n actionCardIcon: { marginRight: 10, fontSize: 18 },\n actionCardText: { flex: 1 },\n actionCardTitle: { fontWeight: '600', color: '#111827', fontSize: 14 },\n actionCardSubtitle: { marginTop: 2, color: '#6b7280', fontSize: 12 },\n agentStepsInline: { flexDirection: 'row', flexWrap: 'wrap', marginTop: 8, gap: 6 },\n agentStepChip: { backgroundColor: '#e5e7eb', paddingHorizontal: 10, paddingVertical: 6, borderRadius: 8 },\n agentStepLabel: { color: '#374151', fontSize: 13 },\n buildBubble: { maxWidth: '100%', marginVertical: 4, padding: 12, borderRadius: 16 },\n buildBubbleLeft: { alignSelf: 'flex-start', backgroundColor: BUBBLE_BG, borderWidth: 1, borderColor: BORDER_COLOR },\n buildBubbleLeftNoBorder: { borderWidth: 0 },\n buildBubbleRight: { alignSelf: 'flex-end', backgroundColor: USER_BUBBLE_BG },\n buildBubbleText: { color: '#111827', fontSize: 15 },\n buildBubbleTextUser: { color: '#ffffff' },\n feedbackRow: { flexDirection: 'row', marginTop: 8, gap: 12 },\n feedbackIcon: { padding: 4 },\n});\n"],"names":["React","_a"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import React__default from'react';import {StyleSheet,View,TouchableOpacity,Text}from'react-native';import {useSafeAreaInsets}from'react-native-safe-area-context';import {PlanModeView}from'./PlanModeView.js';import {BuildModeView}from'./BuildModeView.js';function MessagesContainerUI({
2
+ mode,
3
+ messages,
4
+ streamingContent,
5
+ currentUser,
6
+ onSend,
7
+ disabled = false,
8
+ isLoading = false,
9
+ onStop,
10
+ messagesContainerStyle,
11
+ listContentStyle,
12
+ showDate = false,
13
+ showAvatar = false,
14
+ showBackButton = false,
15
+ onBackPress,
16
+ compactTop = false,
17
+ showMessageBubbleBorder = false,
18
+ renderPlanInputToolbar,
19
+ renderBuildInputToolbar
20
+ }) {
21
+ const insets = useSafeAreaInsets();
22
+ const containerStyle = compactTop ? {
23
+ marginTop: -insets.top
24
+ } : void 0;
25
+ const content = mode === "build" ? /* @__PURE__ */ React__default.createElement(BuildModeView, { messages, streamingContent, currentUser, onSend, disabled, isLoading, onStop, showDate, showAvatar, showMessageBubbleBorder, renderInputToolbar: renderBuildInputToolbar }) : /* @__PURE__ */ React__default.createElement(PlanModeView, { messages, streamingContent, currentUser, onSend, disabled, isLoading, onStop, messagesContainerStyle, listContentStyle, showDate, showAvatar, showMessageBubbleBorder, renderInputToolbar: renderPlanInputToolbar });
26
+ return /* @__PURE__ */ React__default.createElement(View, { style: [styles.container, containerStyle] }, showBackButton && /* @__PURE__ */ React__default.createElement(View, { style: styles.backHeader }, /* @__PURE__ */ React__default.createElement(TouchableOpacity, { style: styles.backButton, onPress: onBackPress, activeOpacity: 0.7, accessibilityLabel: "Go back" }, /* @__PURE__ */ React__default.createElement(Text, { style: styles.backButtonText }, "\u2190 Back"))), /* @__PURE__ */ React__default.createElement(View, { style: styles.content }, content));
27
+ }
28
+ const styles = StyleSheet.create({
29
+ container: {
30
+ flex: 1,
31
+ marginTop: 0,
32
+ paddingTop: 0
33
+ },
34
+ backHeader: {
35
+ flexDirection: "row",
36
+ alignItems: "center",
37
+ paddingHorizontal: 12,
38
+ paddingVertical: 12,
39
+ borderBottomWidth: 1,
40
+ borderBottomColor: "#e5e7eb",
41
+ backgroundColor: "#fff"
42
+ },
43
+ backButton: {
44
+ paddingVertical: 4,
45
+ paddingRight: 8
46
+ },
47
+ backButtonText: {
48
+ fontSize: 17,
49
+ color: "#2563eb",
50
+ fontWeight: "500"
51
+ },
52
+ content: {
53
+ flex: 1
54
+ }
55
+ });export{MessagesContainerUI};//# sourceMappingURL=MessagesContainerUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagesContainerUI.js","sources":["../../../src/components/messages-container-ui/MessagesContainerUI.tsx"],"sourcesContent":["import React from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet, type StyleProp, type ViewStyle } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { PlanModeView } from './PlanModeView';\nimport { BuildModeView } from './BuildModeView';\nimport type { DisplayMode, PlanMessage, BuildMessage } from './types';\nimport type { PlanModeViewInputToolbarProps } from './PlanModeView';\nimport type { BuildModeViewInputToolbarProps } from './BuildModeView';\n\nexport interface MessagesContainerUIProps {\n mode: DisplayMode;\n /** Messages in shared shape; for build mode use BuildMessage with taskStatus, nextSteps, actionCards, etc. */\n messages: PlanMessage[] | BuildMessage[];\n streamingContent?: string;\n currentUser: { id: string; name?: string; avatar?: string };\n onSend: (text: string) => void;\n disabled?: boolean;\n isLoading?: boolean;\n onStop?: () => void;\n /** Optional: override message list container style */\n messagesContainerStyle?: StyleProp<ViewStyle>;\n /** Optional: override list content style */\n listContentStyle?: StyleProp<ViewStyle>;\n /** Show date/timestamp on messages. Default false (Kimi-style: hide). */\n showDate?: boolean;\n /** Show avatar/icon next to messages. Default false (Kimi-style: hide). */\n showAvatar?: boolean;\n /** Show back button in header. Default false (hidden). */\n showBackButton?: boolean;\n /** Called when back button is pressed. Use when showBackButton is true. */\n onBackPress?: () => void;\n /** When true, removes top safe area so content sits under app header (use when screen already has a header). Default false. */\n compactTop?: boolean;\n /** Show border around assistant/left message bubbles. Default false (hide). */\n showMessageBubbleBorder?: boolean;\n /** Input component for plan mode (chat/search/research). Pass your Input from outside. */\n renderPlanInputToolbar: (props: PlanModeViewInputToolbarProps) => React.ReactNode;\n /** Input component for build mode. Pass your Input from outside. */\n renderBuildInputToolbar: (props: BuildModeViewInputToolbarProps) => React.ReactNode;\n}\n\n/**\n * Messages container UI: plan mode (simple chat/search/research) or build mode (agent tasks, status, cards).\n * Kimi-style message display. Use with messages from HomeScreen-style chat/search/research or build flows.\n */\nexport function MessagesContainerUI({\n mode,\n messages,\n streamingContent,\n currentUser,\n onSend,\n disabled = false,\n isLoading = false,\n onStop,\n messagesContainerStyle,\n listContentStyle,\n showDate = false,\n showAvatar = false,\n showBackButton = false,\n onBackPress,\n compactTop = false,\n showMessageBubbleBorder = false,\n renderPlanInputToolbar,\n renderBuildInputToolbar,\n}: MessagesContainerUIProps) {\n const insets = useSafeAreaInsets();\n const containerStyle = compactTop ? { marginTop: -insets.top } : undefined;\n\n const content =\n mode === 'build' ? (\n <BuildModeView\n messages={messages as BuildMessage[]}\n streamingContent={streamingContent}\n currentUser={currentUser}\n onSend={onSend}\n disabled={disabled}\n isLoading={isLoading}\n onStop={onStop}\n showDate={showDate}\n showAvatar={showAvatar}\n showMessageBubbleBorder={showMessageBubbleBorder}\n renderInputToolbar={renderBuildInputToolbar}\n />\n ) : (\n <PlanModeView\n messages={messages as PlanMessage[]}\n streamingContent={streamingContent}\n currentUser={currentUser}\n onSend={onSend}\n disabled={disabled}\n isLoading={isLoading}\n onStop={onStop}\n messagesContainerStyle={messagesContainerStyle}\n listContentStyle={listContentStyle}\n showDate={showDate}\n showAvatar={showAvatar}\n showMessageBubbleBorder={showMessageBubbleBorder}\n renderInputToolbar={renderPlanInputToolbar}\n />\n );\n\n return (\n <View style={[styles.container, containerStyle]}>\n {showBackButton && (\n <View style={styles.backHeader}>\n <TouchableOpacity\n style={styles.backButton}\n onPress={onBackPress}\n activeOpacity={0.7}\n accessibilityLabel=\"Go back\"\n >\n <Text style={styles.backButtonText}>← Back</Text>\n </TouchableOpacity>\n </View>\n )}\n <View style={styles.content}>{content}</View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1, marginTop: 0, paddingTop: 0 },\n backHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#e5e7eb',\n backgroundColor: '#fff',\n },\n backButton: { paddingVertical: 4, paddingRight: 8 },\n backButtonText: { fontSize: 17, color: '#2563eb', fontWeight: '500' },\n content: { flex: 1 },\n});\n\nexport default MessagesContainerUI;\n"],"names":["React"],"mappings":"8PAgDO,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,KAAA;AAAA,EACb,cAAA,GAAiB,KAAA;AAAA,EACjB,WAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,uBAAA,GAA0B,KAAA;AAAA,EAC1B,sBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,iBAAiB,UAAA,GAAa;AAAA,IAClC,SAAA,EAAW,CAAC,MAAA,CAAO;AAAA,GACrB,GAAI,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAA,KAAS,OAAA,mBAAUA,cAAA,CAAA,aAAA,CAAC,iBAAc,QAAA,EAAsC,gBAAA,EAAoC,WAAA,EAA0B,MAAA,EAAgB,QAAA,EAAoB,SAAA,EAAsB,MAAA,EAAgB,QAAA,EAAoB,YAAwB,uBAAA,EAAkD,kBAAA,EAAoB,uBAAA,EAAyB,CAAA,mBAAKA,cAAA,CAAA,aAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAqC,gBAAA,EAAoC,aAA0B,MAAA,EAAgB,QAAA,EAAoB,SAAA,EAAsB,MAAA,EAAgB,wBAAgD,gBAAA,EAAoC,QAAA,EAAoB,UAAA,EAAwB,uBAAA,EAAkD,oBAAoB,sBAAA,EAAwB,CAAA;AACzwB,EAAA,oDAAQ,IAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,SAAA,EAAW,cAAc,CAAA,EAAA,EAC1C,cAAA,oBAAkBA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,OAAO,MAAA,CAAO,UAAA,EAAA,+CAC9B,gBAAA,EAAA,EAAiB,KAAA,EAAO,OAAO,UAAA,EAAY,OAAA,EAAS,WAAA,EAAa,aAAA,EAAe,KAAK,kBAAA,EAAmB,SAAA,EAAA,+CACpG,IAAA,EAAA,EAAK,KAAA,EAAO,OAAO,cAAA,EAAA,EAAgB,aAAM,CAC9C,CACJ,mBACJA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,OAAO,MAAA,CAAO,OAAA,EAAA,EAAU,OAAQ,CAC1C,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO;AAAA,EAC/B,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AAAA,EACA,UAAA,EAAY;AAAA,IACV,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,iBAAA,EAAmB,EAAA;AAAA,IACnB,eAAA,EAAiB,EAAA;AAAA,IACjB,iBAAA,EAAmB,CAAA;AAAA,IACnB,iBAAA,EAAmB,SAAA;AAAA,IACnB,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,eAAA,EAAiB,CAAA;AAAA,IACjB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,QAAA,EAAU,EAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM;AAAA;AAEV,CAAC,CAAA"}