@chatlychat/react-native 0.0.0-stage → 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.
Files changed (114) hide show
  1. package/README.md +208 -2
  2. package/dist/ChatlyProvider.d.ts +69 -0
  3. package/dist/ChatlyProvider.d.ts.map +1 -0
  4. package/dist/ChatlyProvider.js +146 -0
  5. package/dist/ChatlyProvider.js.map +1 -0
  6. package/dist/ChatlyWidget.d.ts +15 -0
  7. package/dist/ChatlyWidget.d.ts.map +1 -0
  8. package/dist/ChatlyWidget.js +122 -0
  9. package/dist/ChatlyWidget.js.map +1 -0
  10. package/dist/blocks/money.d.ts +56 -0
  11. package/dist/blocks/money.d.ts.map +1 -0
  12. package/dist/blocks/money.js +82 -0
  13. package/dist/blocks/money.js.map +1 -0
  14. package/dist/blocks/money.parity.spec.d.ts +2 -0
  15. package/dist/blocks/money.parity.spec.d.ts.map +1 -0
  16. package/dist/blocks/money.parity.spec.js +87 -0
  17. package/dist/blocks/money.parity.spec.js.map +1 -0
  18. package/dist/blocks/read-envelope.d.ts +15 -0
  19. package/dist/blocks/read-envelope.d.ts.map +1 -0
  20. package/dist/blocks/read-envelope.js +196 -0
  21. package/dist/blocks/read-envelope.js.map +1 -0
  22. package/dist/blocks/read-envelope.parity.spec.d.ts +2 -0
  23. package/dist/blocks/read-envelope.parity.spec.d.ts.map +1 -0
  24. package/dist/blocks/read-envelope.parity.spec.js +146 -0
  25. package/dist/blocks/read-envelope.parity.spec.js.map +1 -0
  26. package/dist/blocks/types.d.ts +171 -0
  27. package/dist/blocks/types.d.ts.map +1 -0
  28. package/dist/blocks/types.js +3 -0
  29. package/dist/blocks/types.js.map +1 -0
  30. package/dist/client/RealtimeClient.d.ts +29 -0
  31. package/dist/client/RealtimeClient.d.ts.map +1 -0
  32. package/dist/client/RealtimeClient.js +113 -0
  33. package/dist/client/RealtimeClient.js.map +1 -0
  34. package/dist/client/RealtimeClient.spec.d.ts +2 -0
  35. package/dist/client/RealtimeClient.spec.d.ts.map +1 -0
  36. package/dist/client/RealtimeClient.spec.js +123 -0
  37. package/dist/client/RealtimeClient.spec.js.map +1 -0
  38. package/dist/client/RestClient.d.ts +160 -0
  39. package/dist/client/RestClient.d.ts.map +1 -0
  40. package/dist/client/RestClient.js +395 -0
  41. package/dist/client/RestClient.js.map +1 -0
  42. package/dist/client/RestClient.spec.d.ts +2 -0
  43. package/dist/client/RestClient.spec.d.ts.map +1 -0
  44. package/dist/client/RestClient.spec.js +267 -0
  45. package/dist/client/RestClient.spec.js.map +1 -0
  46. package/dist/client/types.d.ts +148 -0
  47. package/dist/client/types.d.ts.map +1 -0
  48. package/dist/client/types.js +14 -0
  49. package/dist/client/types.js.map +1 -0
  50. package/dist/components/Composer.d.ts +35 -0
  51. package/dist/components/Composer.d.ts.map +1 -0
  52. package/dist/components/Composer.js +180 -0
  53. package/dist/components/Composer.js.map +1 -0
  54. package/dist/components/HelpCenter.d.ts +13 -0
  55. package/dist/components/HelpCenter.d.ts.map +1 -0
  56. package/dist/components/HelpCenter.js +96 -0
  57. package/dist/components/HelpCenter.js.map +1 -0
  58. package/dist/components/MessageBlocks.d.ts +41 -0
  59. package/dist/components/MessageBlocks.d.ts.map +1 -0
  60. package/dist/components/MessageBlocks.js +167 -0
  61. package/dist/components/MessageBlocks.js.map +1 -0
  62. package/dist/components/MessageBubble.d.ts +14 -0
  63. package/dist/components/MessageBubble.d.ts.map +1 -0
  64. package/dist/components/MessageBubble.js +87 -0
  65. package/dist/components/MessageBubble.js.map +1 -0
  66. package/dist/components/MessageBubble.spec.d.ts +2 -0
  67. package/dist/components/MessageBubble.spec.d.ts.map +1 -0
  68. package/dist/components/MessageBubble.spec.js +207 -0
  69. package/dist/components/MessageBubble.spec.js.map +1 -0
  70. package/dist/components/MessageCanvas.d.ts +39 -0
  71. package/dist/components/MessageCanvas.d.ts.map +1 -0
  72. package/dist/components/MessageCanvas.js +144 -0
  73. package/dist/components/MessageCanvas.js.map +1 -0
  74. package/dist/components/MessageCanvas.spec.d.ts +2 -0
  75. package/dist/components/MessageCanvas.spec.d.ts.map +1 -0
  76. package/dist/components/MessageCanvas.spec.js +142 -0
  77. package/dist/components/MessageCanvas.spec.js.map +1 -0
  78. package/dist/components/MessagesList.d.ts +8 -0
  79. package/dist/components/MessagesList.d.ts.map +1 -0
  80. package/dist/components/MessagesList.js +58 -0
  81. package/dist/components/MessagesList.js.map +1 -0
  82. package/dist/index.d.ts +48 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +35 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/push/registerPushToken.d.ts +12 -0
  87. package/dist/push/registerPushToken.d.ts.map +1 -0
  88. package/dist/push/registerPushToken.js +32 -0
  89. package/dist/push/registerPushToken.js.map +1 -0
  90. package/dist/storage/TokenStore.d.ts +53 -0
  91. package/dist/storage/TokenStore.d.ts.map +1 -0
  92. package/dist/storage/TokenStore.js +89 -0
  93. package/dist/storage/TokenStore.js.map +1 -0
  94. package/dist/test/react-native-dom.d.ts +97 -0
  95. package/dist/test/react-native-dom.d.ts.map +1 -0
  96. package/dist/test/react-native-dom.js +155 -0
  97. package/dist/test/react-native-dom.js.map +1 -0
  98. package/dist/test/react-native-dom.spec.d.ts +2 -0
  99. package/dist/test/react-native-dom.spec.d.ts.map +1 -0
  100. package/dist/test/react-native-dom.spec.js +83 -0
  101. package/dist/test/react-native-dom.spec.js.map +1 -0
  102. package/dist/theme/ChatlyTheme.d.ts +37 -0
  103. package/dist/theme/ChatlyTheme.d.ts.map +1 -0
  104. package/dist/theme/ChatlyTheme.js +2 -0
  105. package/dist/theme/ChatlyTheme.js.map +1 -0
  106. package/dist/theme/defaultTheme.d.ts +7 -0
  107. package/dist/theme/defaultTheme.d.ts.map +1 -0
  108. package/dist/theme/defaultTheme.js +37 -0
  109. package/dist/theme/defaultTheme.js.map +1 -0
  110. package/dist/useChatly.d.ts +3 -0
  111. package/dist/useChatly.d.ts.map +1 -0
  112. package/dist/useChatly.js +10 -0
  113. package/dist/useChatly.js.map +1 -0
  114. package/package.json +49 -3
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, TextInput, View, } from 'react-native';
4
+ import { useChatly } from '../useChatly';
5
+ export function Composer({ conversationId, onSent, placeholder = 'Type a message…', }) {
6
+ const { rest, theme } = useChatly();
7
+ const [value, setValue] = useState('');
8
+ const [sending, setSending] = useState(false);
9
+ const [uploading, setUploading] = useState(false);
10
+ const [staged, setStaged] = useState([]);
11
+ const send = async () => {
12
+ const trimmed = value.trim();
13
+ if ((trimmed.length === 0 && staged.length === 0) || sending) {
14
+ return;
15
+ }
16
+ setSending(true);
17
+ try {
18
+ const attachments = staged.length > 0 ? staged : undefined;
19
+ if (conversationId === null) {
20
+ const res = await rest.start(trimmed, attachments);
21
+ onSent?.(res.conversation.id);
22
+ }
23
+ else {
24
+ await rest.reply(conversationId, trimmed, attachments);
25
+ onSent?.(conversationId);
26
+ }
27
+ setValue('');
28
+ setStaged([]);
29
+ }
30
+ catch {
31
+ // Non-fatal: leave the input populated so the user can retry.
32
+ }
33
+ finally {
34
+ setSending(false);
35
+ }
36
+ };
37
+ const attach = async () => {
38
+ const picker = globalThis.__chatlyPicker;
39
+ if (picker === undefined) {
40
+ // No picker installed — silently no-op so the host doesn't crash. Hosts
41
+ // can detect this by checking `globalThis.__chatlyPicker` themselves.
42
+ return;
43
+ }
44
+ if (uploading) {
45
+ return;
46
+ }
47
+ setUploading(true);
48
+ try {
49
+ const picked = await picker();
50
+ if (picked === null) {
51
+ return;
52
+ }
53
+ const attachment = await rest.uploadAttachment({
54
+ bytes: picked.bytes,
55
+ filename: picked.filename,
56
+ mimeType: picked.mimeType,
57
+ });
58
+ setStaged((prev) => [...prev, attachment]);
59
+ }
60
+ catch {
61
+ // No-op; the user can retry.
62
+ }
63
+ finally {
64
+ setUploading(false);
65
+ }
66
+ };
67
+ const removeStaged = (id) => {
68
+ setStaged((prev) => prev.filter((a) => a.id !== id));
69
+ };
70
+ const sendDisabled = sending || (value.trim().length === 0 && staged.length === 0);
71
+ return (_jsxs(View, { style: [
72
+ styles.column,
73
+ {
74
+ borderTopColor: theme.colors.border,
75
+ backgroundColor: theme.colors.background,
76
+ padding: theme.spacing.sm,
77
+ },
78
+ ], children: [(staged.length > 0 || uploading) && (_jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.chipScroll, contentContainerStyle: styles.chipRow, children: [uploading && (_jsxs(View, { style: [
79
+ styles.chip,
80
+ {
81
+ backgroundColor: theme.colors.surface,
82
+ borderColor: theme.colors.border,
83
+ borderRadius: theme.radius.md,
84
+ },
85
+ ], children: [_jsx(ActivityIndicator, { color: theme.colors.primary, size: "small" }), _jsx(Text, { style: {
86
+ color: theme.colors.foreground,
87
+ fontSize: theme.typography.sizeSmall,
88
+ marginLeft: 6,
89
+ }, children: "Uploading\u2026" })] })), staged.map((a) => (_jsxs(View, { style: [
90
+ styles.chip,
91
+ {
92
+ backgroundColor: theme.colors.surface,
93
+ borderColor: theme.colors.border,
94
+ borderRadius: theme.radius.md,
95
+ },
96
+ ], children: [_jsx(Text, { style: {
97
+ color: theme.colors.foreground,
98
+ fontSize: theme.typography.sizeSmall,
99
+ maxWidth: 140,
100
+ }, numberOfLines: 1, ellipsizeMode: "middle", children: a.filename }), _jsx(Pressable, { onPress: () => removeStaged(a.id), accessibilityRole: "button", accessibilityLabel: "Remove attachment", style: styles.removeBtn, children: _jsx(Text, { style: { color: theme.colors.mutedForeground }, children: "\u00D7" }) })] }, a.id)))] })), _jsxs(View, { style: styles.row, children: [_jsx(Pressable, { onPress: attach, disabled: uploading || sending, accessibilityRole: "button", accessibilityLabel: "Attach a file", style: ({ pressed }) => [
101
+ styles.attach,
102
+ {
103
+ opacity: pressed || uploading ? 0.6 : 1,
104
+ marginRight: theme.spacing.sm,
105
+ },
106
+ ], children: uploading ? (_jsx(ActivityIndicator, { color: theme.colors.primary })) : (_jsx(Text, { style: {
107
+ color: theme.colors.primary,
108
+ fontSize: theme.typography.sizeBody + 6,
109
+ fontWeight: theme.typography.weightMedium,
110
+ }, children: "+" })) }), _jsx(TextInput, { value: value, onChangeText: setValue, placeholder: placeholder, placeholderTextColor: theme.colors.mutedForeground, multiline: true, editable: !sending, style: [
111
+ styles.input,
112
+ {
113
+ color: theme.colors.foreground,
114
+ backgroundColor: theme.colors.surface,
115
+ borderColor: theme.colors.border,
116
+ borderRadius: theme.radius.md,
117
+ paddingHorizontal: theme.spacing.md,
118
+ paddingVertical: theme.spacing.sm,
119
+ fontSize: theme.typography.sizeBody,
120
+ },
121
+ ] }), _jsx(Pressable, { onPress: send, disabled: sendDisabled, accessibilityRole: "button", accessibilityLabel: "Send message", style: ({ pressed }) => [
122
+ styles.send,
123
+ {
124
+ backgroundColor: theme.colors.primary,
125
+ borderRadius: theme.radius.md,
126
+ paddingHorizontal: theme.spacing.md,
127
+ paddingVertical: theme.spacing.sm,
128
+ opacity: pressed || sendDisabled ? 0.6 : 1,
129
+ marginLeft: theme.spacing.sm,
130
+ },
131
+ ], children: sending ? (_jsx(ActivityIndicator, { color: theme.colors.onPrimary })) : (_jsx(Text, { style: {
132
+ color: theme.colors.onPrimary,
133
+ fontWeight: theme.typography.weightMedium,
134
+ fontSize: theme.typography.sizeBody,
135
+ }, children: "Send" })) })] })] }));
136
+ }
137
+ const styles = StyleSheet.create({
138
+ column: {
139
+ flexDirection: 'column',
140
+ borderTopWidth: StyleSheet.hairlineWidth,
141
+ },
142
+ row: {
143
+ flexDirection: 'row',
144
+ alignItems: 'flex-end',
145
+ },
146
+ chipScroll: { marginBottom: 6 },
147
+ chipRow: { alignItems: 'center', paddingVertical: 2 },
148
+ chip: {
149
+ flexDirection: 'row',
150
+ alignItems: 'center',
151
+ paddingHorizontal: 10,
152
+ paddingVertical: 4,
153
+ borderWidth: StyleSheet.hairlineWidth,
154
+ marginRight: 6,
155
+ },
156
+ removeBtn: {
157
+ marginLeft: 6,
158
+ paddingHorizontal: 4,
159
+ minWidth: 16,
160
+ alignItems: 'center',
161
+ },
162
+ attach: {
163
+ height: 40,
164
+ width: 40,
165
+ alignItems: 'center',
166
+ justifyContent: 'center',
167
+ },
168
+ input: {
169
+ flex: 1,
170
+ minHeight: 40,
171
+ maxHeight: 120,
172
+ borderWidth: StyleSheet.hairlineWidth,
173
+ },
174
+ send: {
175
+ alignItems: 'center',
176
+ justifyContent: 'center',
177
+ minHeight: 40,
178
+ },
179
+ });
180
+ //# sourceMappingURL=Composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/components/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export interface HelpCenterProps {
3
+ /** Initial query to seed the search box. */
4
+ initialQuery?: string;
5
+ }
6
+ /**
7
+ * Renders a KB search box, a result list, and an article reader. We do not
8
+ * pull in a markdown renderer (would add a non-RN-primitive dep); instead we
9
+ * display the plaintext `body` field. Consumers who want rich rendering can
10
+ * embed their own renderer by re-using `useChatly().rest.getKbArticle`.
11
+ */
12
+ export declare function HelpCenter({ initialQuery }: HelpCenterProps): React.JSX.Element;
13
+ //# sourceMappingURL=HelpCenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpCenter.d.ts","sourceRoot":"","sources":["../../src/components/HelpCenter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAiBhE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,YAAiB,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkKpF"}
@@ -0,0 +1,96 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { ActivityIndicator, FlatList, Pressable, ScrollView, StyleSheet, Text, TextInput, View, } from 'react-native';
4
+ import { useChatly } from '../useChatly';
5
+ /**
6
+ * Renders a KB search box, a result list, and an article reader. We do not
7
+ * pull in a markdown renderer (would add a non-RN-primitive dep); instead we
8
+ * display the plaintext `body` field. Consumers who want rich rendering can
9
+ * embed their own renderer by re-using `useChatly().rest.getKbArticle`.
10
+ */
11
+ export function HelpCenter({ initialQuery = '' }) {
12
+ const { rest, theme } = useChatly();
13
+ const [query, setQuery] = useState(initialQuery);
14
+ const [results, setResults] = useState([]);
15
+ const [article, setArticle] = useState(null);
16
+ const [loading, setLoading] = useState(false);
17
+ const runSearch = useCallback(async (q) => {
18
+ if (q.trim().length === 0) {
19
+ setResults([]);
20
+ return;
21
+ }
22
+ setLoading(true);
23
+ try {
24
+ const res = await rest.searchKb(q.trim());
25
+ setResults(res.results);
26
+ }
27
+ catch {
28
+ setResults([]);
29
+ }
30
+ finally {
31
+ setLoading(false);
32
+ }
33
+ }, [rest]);
34
+ useEffect(() => {
35
+ const handle = setTimeout(() => {
36
+ void runSearch(query);
37
+ }, 200);
38
+ return () => clearTimeout(handle);
39
+ }, [query, runSearch]);
40
+ const openArticle = useCallback(async (slug) => {
41
+ setLoading(true);
42
+ try {
43
+ const res = await rest.getKbArticle(slug);
44
+ setArticle(res.article);
45
+ }
46
+ finally {
47
+ setLoading(false);
48
+ }
49
+ }, [rest]);
50
+ if (article !== null) {
51
+ return (_jsxs(View, { style: [styles.container, { backgroundColor: theme.colors.background }], children: [_jsx(Pressable, { onPress: () => setArticle(null), accessibilityRole: "button", accessibilityLabel: "Back to results", style: { padding: theme.spacing.md }, children: _jsx(Text, { style: { color: theme.colors.primary, fontSize: theme.typography.sizeBody }, children: "\u2190 Back" }) }), _jsxs(ScrollView, { contentContainerStyle: { padding: theme.spacing.lg }, children: [_jsx(Text, { style: {
52
+ color: theme.colors.foreground,
53
+ fontSize: theme.typography.sizeTitle,
54
+ fontWeight: theme.typography.weightBold,
55
+ marginBottom: theme.spacing.md,
56
+ }, children: article.title }), _jsx(Text, { style: {
57
+ color: theme.colors.foreground,
58
+ fontSize: theme.typography.sizeBody,
59
+ lineHeight: theme.typography.sizeBody * 1.5,
60
+ }, children: article.body })] })] }));
61
+ }
62
+ const renderItem = ({ item }) => (_jsxs(Pressable, { onPress: () => void openArticle(item.slug), accessibilityRole: "button", accessibilityLabel: `Open article ${item.title}`, style: ({ pressed }) => [
63
+ {
64
+ padding: theme.spacing.md,
65
+ backgroundColor: pressed ? theme.colors.surface : theme.colors.background,
66
+ borderBottomColor: theme.colors.border,
67
+ borderBottomWidth: StyleSheet.hairlineWidth,
68
+ },
69
+ ], children: [_jsx(Text, { style: {
70
+ color: theme.colors.foreground,
71
+ fontWeight: theme.typography.weightMedium,
72
+ fontSize: theme.typography.sizeBody,
73
+ }, children: item.title }), _jsx(Text, { style: {
74
+ color: theme.colors.mutedForeground,
75
+ fontSize: theme.typography.sizeSmall,
76
+ marginTop: 2,
77
+ }, numberOfLines: 2, children: item.excerpt })] }));
78
+ return (_jsxs(View, { style: [styles.container, { backgroundColor: theme.colors.background }], children: [_jsx(View, { style: { padding: theme.spacing.md }, children: _jsx(TextInput, { value: query, onChangeText: setQuery, placeholder: "Search help articles\u2026", placeholderTextColor: theme.colors.mutedForeground, style: {
79
+ color: theme.colors.foreground,
80
+ backgroundColor: theme.colors.surface,
81
+ borderColor: theme.colors.border,
82
+ borderWidth: StyleSheet.hairlineWidth,
83
+ borderRadius: theme.radius.md,
84
+ paddingHorizontal: theme.spacing.md,
85
+ paddingVertical: theme.spacing.sm,
86
+ fontSize: theme.typography.sizeBody,
87
+ } }) }), loading ? (_jsx(ActivityIndicator, { color: theme.colors.primary, style: { marginTop: theme.spacing.lg } })) : (_jsx(FlatList, { data: results, keyExtractor: (r) => r.id, renderItem: renderItem, ListEmptyComponent: _jsx(Text, { style: {
88
+ color: theme.colors.mutedForeground,
89
+ textAlign: 'center',
90
+ padding: theme.spacing.lg,
91
+ }, children: query.trim().length === 0 ? 'Type to search.' : 'No results.' }) }))] }));
92
+ }
93
+ const styles = StyleSheet.create({
94
+ container: { flex: 1 },
95
+ });
96
+ //# sourceMappingURL=HelpCenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpCenter.js","sourceRoot":"","sources":["../../src/components/HelpCenter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Rich blocks on a native screen — INTERACTIVE, unlike the agent app's.
3
+ *
4
+ * ── What makes this one different ──────────────────────────────────────
5
+ *
6
+ * `apps/mobile-agent`'s renderer draws every action as plain text, because an
7
+ * agent on their phone has no visitor session to act as. This one is the
8
+ * visitor's own app, so a button is a button: a `postback` sends a reply, a
9
+ * `url` opens a link, a `step` asks for a canvas, and a `host_event` is handed
10
+ * to the APP.
11
+ *
12
+ * `host_event` is the whole reason the spec asked for this package. A card
13
+ * saying "Pay $48.20" has to run Stripe with the buyer's real session, and on
14
+ * a phone that means a native payment sheet — not a WebView, not a browser
15
+ * hop. So the action does nothing here and calls `onAction` from the
16
+ * provider, which is the integrator's own code.
17
+ *
18
+ * ── A carousel is a horizontal ScrollView, a grid is a stack ───────────
19
+ *
20
+ * Never two columns. Two cards at 160px on a phone are narrower than the
21
+ * images they carry, which is the same call `apps/mobile-agent` made. A
22
+ * `carousel` layout is honoured because it is horizontal rather than narrow:
23
+ * each card gets most of the width and the row scrolls.
24
+ *
25
+ * ── `status` is rendered here, and skipped in the agent app ────────────
26
+ *
27
+ * There it is "progress, not content" for somebody reading history. Here the
28
+ * shopper is watching it happen — "Looking through the shop…" patched to
29
+ * "Found 6" is the feedback that stops them tapping again.
30
+ */
31
+ import React from 'react';
32
+ export interface MessageBlocksProps {
33
+ /** The stored envelope, straight off the message row. Unvalidated. */
34
+ readonly blocks: unknown;
35
+ /** The conversation the blocks belong to, for `reportAction` and postbacks. */
36
+ readonly conversationId: string | null;
37
+ /** The message they are on, for the same reason. */
38
+ readonly messageId: string;
39
+ }
40
+ export declare function MessageBlocks(props: MessageBlocksProps): React.JSX.Element | null;
41
+ //# sourceMappingURL=MessageBlocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBlocks.d.ts","sourceRoot":"","sources":["../../src/components/MessageBlocks.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AA8OD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAuEjF"}
@@ -0,0 +1,167 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Image, Linking, Pressable, ScrollView, Text, View } from 'react-native';
3
+ import { formatMoney } from '../blocks/money';
4
+ import { readBlocksEnvelope } from '../blocks/read-envelope';
5
+ import { useChatly } from '../useChatly';
6
+ /**
7
+ * The price.
8
+ *
9
+ * ONE line of text rather than a struck-through was-price beside it: React
10
+ * Native has no `<s>`, and `textDecorationLine: 'line-through'` on a nested
11
+ * `Text` is unreliable across the two platforms. "Was X" reads correctly in
12
+ * both and in a screen reader, which the visual version does not — the same
13
+ * call `apps/mobile-agent` made.
14
+ */
15
+ function Price({ value }) {
16
+ const { theme } = useChatly();
17
+ if (value === undefined) {
18
+ return null;
19
+ }
20
+ const was = value.compareAt !== undefined && value.compareAt > value.amount
21
+ ? formatMoney({ amount: value.compareAt, currency: value.currency })
22
+ : null;
23
+ const now = formatMoney(value);
24
+ return (_jsx(Text, { style: { color: theme.colors.foreground, fontSize: theme.typography.sizeBody }, children: was === null ? now : `${now} (was ${was})` }));
25
+ }
26
+ function ActionButton(props) {
27
+ const { theme } = useChatly();
28
+ const { action, onRun } = props;
29
+ return (_jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: action.label, onPress: () => onRun(action), style: {
30
+ borderRadius: theme.radius.md,
31
+ paddingHorizontal: theme.spacing.md,
32
+ paddingVertical: theme.spacing.sm,
33
+ backgroundColor: action.style === 'primary' ? theme.colors.primary : theme.colors.surface,
34
+ borderColor: theme.colors.border,
35
+ borderWidth: action.style === 'primary' ? 0 : 1,
36
+ }, children: _jsx(Text, { style: {
37
+ color: action.style === 'primary' ? theme.colors.onPrimary : theme.colors.foreground,
38
+ fontSize: theme.typography.sizeBody,
39
+ }, children: action.label }) }));
40
+ }
41
+ function Card(props) {
42
+ const { theme } = useChatly();
43
+ const { card, width } = props;
44
+ return (_jsxs(View, { style: {
45
+ borderWidth: 1,
46
+ borderColor: theme.colors.border,
47
+ borderRadius: theme.radius.bubble,
48
+ backgroundColor: theme.colors.surface,
49
+ padding: theme.spacing.sm,
50
+ gap: 4,
51
+ ...(width === undefined ? {} : { width }),
52
+ }, children: [card.image !== undefined && (_jsx(Image, { source: { uri: card.image }, accessibilityLabel: card.title, accessibilityIgnoresInvertColors: true, style: { width: '100%', height: 140, borderRadius: theme.radius.md } })), card.badge !== undefined && (_jsx(Text, { style: { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall }, children: card.badge })), _jsx(Text, { style: { color: theme.colors.foreground, fontSize: theme.typography.sizeBody }, children: card.title }), card.subtitle !== undefined && (_jsx(Text, { style: { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall }, children: card.subtitle })), _jsx(Price, { value: card.price }), (card.fields ?? []).map((f, i) => (_jsx(Text, { style: { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall }, children: `${f.label}: ${f.value}` }, `${f.label}-${String(i)}`))), (card.actions ?? []).length > 0 && (_jsx(View, { style: { flexDirection: 'row', flexWrap: 'wrap', gap: 6, marginTop: 4 }, children: (card.actions ?? []).map((a, i) => (_jsx(ActionButton, { action: a, onRun: props.onRun }, `${a.label}-${String(i)}`))) }))] }));
53
+ }
54
+ function Block(props) {
55
+ const { theme } = useChatly();
56
+ const { block, onRun, onReply } = props;
57
+ const muted = { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall };
58
+ const body = { color: theme.colors.foreground, fontSize: theme.typography.sizeBody };
59
+ switch (block.type) {
60
+ case 'text':
61
+ /*
62
+ * The markdown is rendered as PLAIN TEXT, deliberately.
63
+ *
64
+ * A markdown renderer on React Native is a dependency, and this package
65
+ * has exactly one (`socket.io-client`). The characters a bot actually
66
+ * emits — `**bold**`, a bullet, a link — read acceptably raw, and the
67
+ * alternative a consumer has is to render the block themselves from the
68
+ * envelope, which `readBlocksEnvelope` is exported for.
69
+ */
70
+ return _jsx(Text, { style: body, children: block.markdown });
71
+ case 'media':
72
+ return block.kind === 'image' ? (_jsx(Image, { source: { uri: block.url }, accessibilityLabel: block.alt, accessibilityIgnoresInvertColors: true, style: { width: '100%', height: 180, borderRadius: theme.radius.md } })) : (
73
+ // No video element without a dependency. The alt text plus a tappable
74
+ // link is strictly better than a blank space.
75
+ _jsx(Pressable, { accessibilityRole: "link", onPress: () => void Linking.openURL(block.url), children: _jsx(Text, { style: body, children: block.alt }) }));
76
+ case 'fields':
77
+ return (_jsx(View, { style: { gap: 2 }, children: block.items.map((f, i) => (_jsx(Text, { style: muted, children: `${f.label}: ${f.value}` }, `${f.label}-${String(i)}`))) }));
78
+ case 'card':
79
+ return _jsx(Card, { card: block, onRun: onRun });
80
+ case 'card_grid':
81
+ return block.layout === 'carousel' ? (_jsx(ScrollView, { horizontal: true, accessibilityLabel: "Scrollable options", children: _jsx(View, { style: { flexDirection: 'row', gap: 8 }, children: block.cards.map((c, i) => (_jsx(Card, { card: c, onRun: onRun, width: 240 }, c.id ?? String(i)))) }) })) : (_jsx(View, { style: { gap: 8 }, children: block.cards.map((c, i) => (_jsx(Card, { card: c, onRun: onRun }, c.id ?? String(i)))) }));
82
+ case 'actions':
83
+ return (_jsx(View, { style: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 }, children: block.actions.map((a, i) => (_jsx(ActionButton, { action: a, onRun: onRun }, `${a.label}-${String(i)}`))) }));
84
+ case 'quick_replies':
85
+ return (_jsx(View, { accessibilityLabel: "Quick replies", style: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 }, children: block.options.map((o, i) => (_jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: o.label, onPress: () => onReply(o.value), style: {
86
+ borderRadius: 999,
87
+ borderWidth: 1,
88
+ borderColor: theme.colors.border,
89
+ paddingHorizontal: theme.spacing.md,
90
+ paddingVertical: 6,
91
+ }, children: _jsx(Text, { style: body, children: o.label }) }, `${o.value}-${String(i)}`))) }));
92
+ case 'status':
93
+ return (_jsx(Text, { accessibilityRole: "text", style: muted, children: block.state === 'failed' ? `${block.text} — failed` : block.text }));
94
+ case 'divider':
95
+ return (_jsx(View, { style: { height: 1, backgroundColor: theme.colors.border, marginVertical: 4 }, accessibilityLabel: "divider" }));
96
+ default:
97
+ // Unreachable: `readBlocksEnvelope` drops an unknown type. Present so
98
+ // adding one to the schema is a compile error here rather than a blank
99
+ // space on a shopper's screen — which is what
100
+ // `check-block-renderer-parity.mjs` is also watching for.
101
+ return null;
102
+ }
103
+ }
104
+ export function MessageBlocks(props) {
105
+ const { rest, onAction } = useChatly();
106
+ const envelope = readBlocksEnvelope(props.blocks);
107
+ if (envelope === null) {
108
+ return null;
109
+ }
110
+ /**
111
+ * Run one action.
112
+ *
113
+ * `host_event` is handed to the app and nothing else happens here — the app
114
+ * reports the outcome back with `rest.reportAction`, which is what appends
115
+ * "Added to your cart" under the card and tells the owning bot. Everything
116
+ * else is a call this package can make itself.
117
+ */
118
+ const onRun = (action) => {
119
+ const conversationId = props.conversationId;
120
+ switch (action.kind) {
121
+ case 'host_event':
122
+ onAction?.({
123
+ event: action.event,
124
+ data: action.data ?? {},
125
+ conversationId,
126
+ messageId: props.messageId,
127
+ actionId: action.id ?? action.event,
128
+ });
129
+ return;
130
+ case 'url':
131
+ void Linking.openURL(action.href);
132
+ return;
133
+ case 'postback':
134
+ if (conversationId !== null) {
135
+ void rest.postback(conversationId, {
136
+ value: action.value,
137
+ ...(action.payload === undefined ? {} : { payload: action.payload }),
138
+ silent: action.silent === true,
139
+ });
140
+ }
141
+ return;
142
+ case 'step':
143
+ if (conversationId !== null) {
144
+ void rest.requestCanvasStep(conversationId, action.canvasId, action.params);
145
+ }
146
+ return;
147
+ case 'copy':
148
+ /*
149
+ * No clipboard. `@react-native-clipboard/clipboard` is a native
150
+ * module and this package has no native dependencies by design — a
151
+ * consumer adding one would have to rebuild. The text is shown
152
+ * instead, which is selectable, and an integrator who wants a real
153
+ * copy button renders the envelope themselves.
154
+ */
155
+ return;
156
+ default:
157
+ return;
158
+ }
159
+ };
160
+ const onReply = (value) => {
161
+ if (props.conversationId !== null) {
162
+ void rest.reply(props.conversationId, value);
163
+ }
164
+ };
165
+ return (_jsx(View, { style: { gap: 6, marginTop: 6 }, children: envelope.blocks.map((b, i) => (_jsx(Block, { block: b, onRun: onRun, onReply: onReply }, b.id ?? `${b.type}-${String(i)}`))) }));
166
+ }
167
+ //# sourceMappingURL=MessageBlocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBlocks.js","sourceRoot":"","sources":["../../src/components/MessageBlocks.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { MessageRow } from '../client/types';
3
+ export interface MessageBubbleProps {
4
+ message: MessageRow;
5
+ /**
6
+ * The conversation the message is in, so a card action knows where to
7
+ * report. Optional, because a consumer rendering a bubble outside a thread
8
+ * (a preview, a notification) has no conversation — and then an action
9
+ * renders and does nothing rather than posting to the wrong place.
10
+ */
11
+ conversationId?: string | null;
12
+ }
13
+ export declare function MessageBubble({ message, conversationId }: MessageBubbleProps): React.JSX.Element;
14
+ //# sourceMappingURL=MessageBubble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../src/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgFhG"}