@chatlychat/react-native 0.0.0-stage → 0.1.0

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 +50 -4
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Image, StyleSheet, Text, View } from 'react-native';
3
+ import { useChatly } from '../useChatly';
4
+ import { MessageBlocks } from './MessageBlocks';
5
+ import { MessageCanvas } from './MessageCanvas';
6
+ export function MessageBubble({ message, conversationId }) {
7
+ const { theme } = useChatly();
8
+ const isContact = message.authorType === 'contact';
9
+ const isSystem = message.authorType === 'system' || message.kind === 'event';
10
+ const attachments = message.attachments ?? [];
11
+ if (isSystem) {
12
+ return (_jsx(View, { style: styles.systemRow, children: _jsx(Text, { style: [
13
+ styles.systemText,
14
+ { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall },
15
+ ], children: message.body }) }));
16
+ }
17
+ return (_jsx(View, { style: [styles.row, isContact ? styles.rowRight : styles.rowLeft], children: _jsxs(View, { style: [
18
+ styles.bubble,
19
+ {
20
+ borderRadius: theme.radius.bubble,
21
+ paddingHorizontal: theme.spacing.md,
22
+ paddingVertical: theme.spacing.sm,
23
+ backgroundColor: isContact ? theme.colors.primary : theme.colors.surface,
24
+ borderColor: theme.colors.border,
25
+ borderWidth: isContact ? 0 : StyleSheet.hairlineWidth,
26
+ maxWidth: '80%',
27
+ },
28
+ ], children: [message.body.length > 0 && (_jsx(Text, { style: {
29
+ color: isContact ? theme.colors.onPrimary : theme.colors.foreground,
30
+ fontSize: theme.typography.sizeBody,
31
+ }, children: message.body })), attachments.map((a) => (_jsx(AttachmentView, { attachment: a, isContact: isContact, withCaption: message.body.length > 0 }, a.id))), _jsx(MessageBlocks, { blocks: message.blocks, conversationId: conversationId ?? null, messageId: message.id }), _jsx(MessageCanvas, { canvas: message.canvas, conversationId: conversationId ?? null, messageId: message.id })] }) }));
32
+ }
33
+ function AttachmentView(props) {
34
+ const { theme } = useChatly();
35
+ const { attachment, isContact, withCaption } = props;
36
+ const isImage = attachment.mimeType.toLowerCase().startsWith('image/');
37
+ const topMargin = withCaption ? 6 : 0;
38
+ if (isImage) {
39
+ return (_jsx(Image, { source: { uri: attachment.url }, resizeMode: "cover", accessibilityLabel: attachment.filename, style: {
40
+ width: 220,
41
+ height: 180,
42
+ borderRadius: 10,
43
+ marginTop: topMargin,
44
+ } }));
45
+ }
46
+ return (_jsxs(View, { style: [
47
+ styles.fileRow,
48
+ {
49
+ backgroundColor: isContact ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.04)',
50
+ marginTop: topMargin,
51
+ },
52
+ ], children: [_jsx(Text, { style: {
53
+ color: isContact ? theme.colors.onPrimary : theme.colors.foreground,
54
+ fontSize: 13,
55
+ fontWeight: theme.typography.weightMedium,
56
+ flexShrink: 1,
57
+ }, numberOfLines: 1, ellipsizeMode: "middle", children: attachment.filename }), _jsx(Text, { style: {
58
+ color: isContact ? 'rgba(255,255,255,0.75)' : theme.colors.mutedForeground,
59
+ fontSize: 11,
60
+ marginLeft: 8,
61
+ }, children: formatSize(attachment.sizeBytes) })] }));
62
+ }
63
+ function formatSize(bytes) {
64
+ if (bytes < 1024) {
65
+ return `${bytes} B`;
66
+ }
67
+ if (bytes < 1024 * 1024) {
68
+ return `${(bytes / 1024).toFixed(1)} KB`;
69
+ }
70
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
71
+ }
72
+ const styles = StyleSheet.create({
73
+ row: { width: '100%', flexDirection: 'row', marginVertical: 4 },
74
+ rowLeft: { justifyContent: 'flex-start' },
75
+ rowRight: { justifyContent: 'flex-end' },
76
+ bubble: {},
77
+ fileRow: {
78
+ flexDirection: 'row',
79
+ alignItems: 'center',
80
+ paddingHorizontal: 8,
81
+ paddingVertical: 6,
82
+ borderRadius: 8,
83
+ },
84
+ systemRow: { width: '100%', alignItems: 'center', marginVertical: 6 },
85
+ systemText: { fontStyle: 'italic' },
86
+ });
87
+ //# sourceMappingURL=MessageBubble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.js","sourceRoot":"","sources":["../../src/components/MessageBubble.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MessageBubble.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.spec.d.ts","sourceRoot":"","sources":["../../src/components/MessageBubble.spec.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,207 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The bubble, with rich blocks and a canvas MOUNTED.
4
+ *
5
+ * ── Why the mount is the thing under test ──────────────────────────────
6
+ *
7
+ * A renderer that handles every block type and that nothing mounts passes
8
+ * its own unit test and renders nowhere. That exact pair of defects shipped
9
+ * in this product once already: the agent inbox mounted blocks inside an
10
+ * `if (isNote)` early return so the AI answer the feature exists for never
11
+ * reached it, and the mobile renderer was exported, spec'd, and imported by
12
+ * nothing but its own spec. `check-block-renderer-parity.mjs` asserts the
13
+ * mount literal is in this file and that THIS spec carries a block envelope;
14
+ * it cannot tell which branches a component has, so the assertions below are
15
+ * the half that reads the output.
16
+ *
17
+ * The interactive half matters as much. On the agent app every action is
18
+ * plain text, because an agent has no visitor session; here a tap must reach
19
+ * either the API or the integrator's own code, and `host_event` reaching the
20
+ * app is the single feature this package exists for.
21
+ */
22
+ import { cleanup, render, screen } from '@testing-library/react';
23
+ import userEvent from '@testing-library/user-event';
24
+ import { afterEach, describe, expect, it, vi } from 'vitest';
25
+ import { ChatlyContext } from '../ChatlyProvider';
26
+ import { MessageBubble } from './MessageBubble';
27
+ import { defaultTheme } from '../theme/defaultTheme';
28
+ const CONV = 'conv-1';
29
+ /*
30
+ * Explicit, not inherited.
31
+ *
32
+ * `@testing-library/react` auto-cleans only when vitest runs with
33
+ * `globals: true`, which this package does not. Without it each render
34
+ * accumulates in the same document and `getByText` starts failing with
35
+ * "found multiple elements" — which reads as a duplicate-render bug in the
36
+ * component rather than as a missing afterEach. Three tests failed that way
37
+ * before this line existed.
38
+ */
39
+ afterEach(cleanup);
40
+ function harness(over = {}) {
41
+ const rest = {
42
+ reply: vi.fn().mockResolvedValue({}),
43
+ postback: vi.fn().mockResolvedValue({}),
44
+ reportAction: vi.fn().mockResolvedValue({}),
45
+ requestCanvasStep: vi.fn().mockResolvedValue({}),
46
+ submitCanvas: vi.fn().mockResolvedValue({ canvas: null, errors: {} }),
47
+ };
48
+ const value = {
49
+ theme: defaultTheme,
50
+ rest,
51
+ ...over,
52
+ };
53
+ const wrap = (message) => render(_jsx(ChatlyContext.Provider, { value: value, children: _jsx(MessageBubble, { message: message, conversationId: CONV }) }));
54
+ return { rest, wrap };
55
+ }
56
+ const row = (over) => ({
57
+ id: 'm1',
58
+ authorType: 'bot',
59
+ kind: 'text',
60
+ body: 'Here are six hats',
61
+ createdAt: '2026-10-12T00:00:00.000Z',
62
+ ...over,
63
+ });
64
+ describe('MessageBubble + blocks', () => {
65
+ it('renders the body and the card beside it', () => {
66
+ const h = harness();
67
+ h.wrap(row({
68
+ blocks: {
69
+ v: 1,
70
+ blocks: [{ type: 'card', title: 'Wool hat', price: { amount: 4820, currency: 'USD' } }],
71
+ },
72
+ }));
73
+ expect(screen.getByText('Here are six hats')).toBeDefined();
74
+ expect(screen.getByText('Wool hat')).toBeDefined();
75
+ // Through the shared formatter: minor units, and the divisor read off the
76
+ // currency rather than assumed to be 100.
77
+ expect(screen.getByText('$48.20')).toBeDefined();
78
+ });
79
+ it('shows a was-price as words, not as a strike-through', () => {
80
+ // RN has no `<s>` and `textDecorationLine` on a nested `Text` is
81
+ // unreliable across the two platforms; "was" reads in a screen reader too.
82
+ const h = harness();
83
+ h.wrap(row({
84
+ blocks: {
85
+ v: 1,
86
+ blocks: [
87
+ {
88
+ type: 'card',
89
+ title: 'Wool hat',
90
+ price: { amount: 4820, currency: 'USD', compareAt: 6000 },
91
+ },
92
+ ],
93
+ },
94
+ }));
95
+ expect(screen.getByText('$48.20 (was $60.00)')).toBeDefined();
96
+ });
97
+ it('hands a host_event to the APP and calls no API', async () => {
98
+ // The feature this package exists for: a native payment sheet cannot be
99
+ // opened from inside a chat library.
100
+ const onAction = vi.fn();
101
+ const h = harness({ onAction });
102
+ h.wrap(row({
103
+ blocks: {
104
+ v: 1,
105
+ blocks: [
106
+ {
107
+ type: 'actions',
108
+ actions: [
109
+ { kind: 'host_event', label: 'Pay', event: 'pay', id: 'a1', data: { x: 1 } },
110
+ ],
111
+ },
112
+ ],
113
+ },
114
+ }));
115
+ await userEvent.click(screen.getByRole('button', { name: 'Pay' }));
116
+ expect(onAction).toHaveBeenCalledWith({
117
+ event: 'pay',
118
+ data: { x: 1 },
119
+ conversationId: CONV,
120
+ messageId: 'm1',
121
+ actionId: 'a1',
122
+ });
123
+ expect(h.rest.reply).not.toHaveBeenCalled();
124
+ expect(h.rest.postback).not.toHaveBeenCalled();
125
+ });
126
+ it('sends a postback through the API, silently when asked', async () => {
127
+ const h = harness();
128
+ h.wrap(row({
129
+ blocks: {
130
+ v: 1,
131
+ blocks: [
132
+ {
133
+ type: 'actions',
134
+ actions: [{ kind: 'postback', label: 'Under $50', value: 'under_50', silent: true }],
135
+ },
136
+ ],
137
+ },
138
+ }));
139
+ await userEvent.click(screen.getByRole('button', { name: 'Under $50' }));
140
+ expect(h.rest.postback).toHaveBeenCalledWith(CONV, { value: 'under_50', silent: true });
141
+ });
142
+ it('sends a quick reply as an ordinary message', async () => {
143
+ const h = harness();
144
+ h.wrap(row({
145
+ blocks: {
146
+ v: 1,
147
+ blocks: [{ type: 'quick_replies', options: [{ label: 'Under $50', value: 'under_50' }] }],
148
+ },
149
+ }));
150
+ await userEvent.click(screen.getByRole('button', { name: 'Under $50' }));
151
+ expect(h.rest.reply).toHaveBeenCalledWith(CONV, 'under_50');
152
+ });
153
+ it('renders a carousel as a scrollable row of every card', () => {
154
+ const h = harness();
155
+ h.wrap(row({
156
+ blocks: {
157
+ v: 1,
158
+ blocks: [
159
+ {
160
+ type: 'card_grid',
161
+ layout: 'carousel',
162
+ cards: [{ title: 'One' }, { title: 'Two' }, { title: 'Three' }],
163
+ },
164
+ ],
165
+ },
166
+ }));
167
+ expect(screen.getByLabelText('Scrollable options')).toBeDefined();
168
+ for (const title of ['One', 'Two', 'Three']) {
169
+ expect(screen.getByText(title)).toBeDefined();
170
+ }
171
+ });
172
+ it('renders a status line — unlike the agent app, which skips it', () => {
173
+ // There it is "progress, not content" for somebody reading history. Here
174
+ // the shopper is watching it happen.
175
+ const h = harness();
176
+ h.wrap(row({ blocks: { v: 1, blocks: [{ type: 'status', id: 's1', text: 'Looking…' }] } }));
177
+ expect(screen.getByText('Looking…')).toBeDefined();
178
+ });
179
+ it('drops an unsafe card image and keeps the card', () => {
180
+ const h = harness();
181
+ h.wrap(row({
182
+ blocks: {
183
+ v: 1,
184
+ blocks: [{ type: 'card', title: 'Wool hat', image: 'javascript:alert(1)' }],
185
+ },
186
+ }));
187
+ expect(screen.getByText('Wool hat')).toBeDefined();
188
+ expect(screen.queryByRole('img')).toBeNull();
189
+ });
190
+ it('renders nothing extra for a message with no blocks', () => {
191
+ const h = harness();
192
+ h.wrap(row({}));
193
+ expect(screen.getByText('Here are six hats')).toBeDefined();
194
+ expect(screen.queryByRole('button')).toBeNull();
195
+ });
196
+ it('renders a system line WITHOUT blocks — a system message is never a card', () => {
197
+ const h = harness();
198
+ h.wrap(row({
199
+ authorType: 'system',
200
+ body: 'Buyer support is taking over from here.',
201
+ blocks: { v: 1, blocks: [{ type: 'card', title: 'Should not render' }] },
202
+ }));
203
+ expect(screen.getByText('Buyer support is taking over from here.')).toBeDefined();
204
+ expect(screen.queryByText('Should not render')).toBeNull();
205
+ });
206
+ });
207
+ //# sourceMappingURL=MessageBubble.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.spec.js","sourceRoot":"","sources":["../../src/components/MessageBubble.spec.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A Tier 2 canvas on a native screen — a form inside a message bubble.
3
+ *
4
+ * ── What it is for ────────────────────────────────────────────────────
5
+ *
6
+ * A confirm step: the total is quoted, the shopper confirms, the server
7
+ * re-quotes and refuses if it moved. The price guard is the server-held
8
+ * `state`, which is why submission goes back through the API rather than
9
+ * being resolved here.
10
+ *
11
+ * ── Two properties worth stating ──────────────────────────────────────
12
+ *
13
+ * The canvas on screen is REPLACED by whatever the submission returns, not
14
+ * merged. A refused submission comes back as the same canvas with messages on
15
+ * it, and a changed total comes back as a FRESH step rather than a charge —
16
+ * so a renderer that kept its own copy would show the shopper the old price
17
+ * next to the new errors.
18
+ *
19
+ * A `hostEvent` on the answer is handed to the app. That is how 3-D Secure
20
+ * works on a phone: the step's answer says "now run this", the app runs it
21
+ * natively, and nothing in this library has to know what Stripe is.
22
+ *
23
+ * ── Tier 3 is deliberately not rendered ───────────────────────────────
24
+ *
25
+ * An `app` canvas is an integrator's own page in a sandboxed iframe, and
26
+ * there is no React Native equivalent of a sandbox attribute — an app frame
27
+ * here would be a WebView, which is the thing a native SDK exists to avoid.
28
+ * The title and a one-line explanation are shown instead, and the integrator
29
+ * can present it natively if they want to.
30
+ */
31
+ import React from 'react';
32
+ export interface MessageCanvasProps {
33
+ /** The stored canvas, straight off the message row. Unvalidated. */
34
+ readonly canvas: unknown;
35
+ readonly conversationId: string | null;
36
+ readonly messageId: string;
37
+ }
38
+ export declare function MessageCanvas(props: MessageCanvasProps): React.JSX.Element | null;
39
+ //# sourceMappingURL=MessageCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageCanvas.d.ts","sourceRoot":"","sources":["../../src/components/MessageCanvas.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAA4B,MAAM,OAAO,CAAC;AASjD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAkMjF"}
@@ -0,0 +1,144 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * A Tier 2 canvas on a native screen — a form inside a message bubble.
4
+ *
5
+ * ── What it is for ────────────────────────────────────────────────────
6
+ *
7
+ * A confirm step: the total is quoted, the shopper confirms, the server
8
+ * re-quotes and refuses if it moved. The price guard is the server-held
9
+ * `state`, which is why submission goes back through the API rather than
10
+ * being resolved here.
11
+ *
12
+ * ── Two properties worth stating ──────────────────────────────────────
13
+ *
14
+ * The canvas on screen is REPLACED by whatever the submission returns, not
15
+ * merged. A refused submission comes back as the same canvas with messages on
16
+ * it, and a changed total comes back as a FRESH step rather than a charge —
17
+ * so a renderer that kept its own copy would show the shopper the old price
18
+ * next to the new errors.
19
+ *
20
+ * A `hostEvent` on the answer is handed to the app. That is how 3-D Secure
21
+ * works on a phone: the step's answer says "now run this", the app runs it
22
+ * natively, and nothing in this library has to know what Stripe is.
23
+ *
24
+ * ── Tier 3 is deliberately not rendered ───────────────────────────────
25
+ *
26
+ * An `app` canvas is an integrator's own page in a sandboxed iframe, and
27
+ * there is no React Native equivalent of a sandbox attribute — an app frame
28
+ * here would be a WebView, which is the thing a native SDK exists to avoid.
29
+ * The title and a one-line explanation are shown instead, and the integrator
30
+ * can present it natively if they want to.
31
+ */
32
+ import { useMemo, useState } from 'react';
33
+ import { Pressable, Text, TextInput, View } from 'react-native';
34
+ import { readCanvas } from '../blocks/read-envelope';
35
+ import { useChatly } from '../useChatly';
36
+ import { MessageBlocks } from './MessageBlocks';
37
+ /** The value a field starts with, as a string the input can hold. */
38
+ function initialValue(field) {
39
+ if (field.type === 'checkbox') {
40
+ return field.value === true ? 'true' : '';
41
+ }
42
+ return field.value ?? '';
43
+ }
44
+ export function MessageCanvas(props) {
45
+ const { theme, rest, onAction } = useChatly();
46
+ const initial = useMemo(() => readCanvas(props.canvas), [props.canvas]);
47
+ /**
48
+ * The canvas is STATE, seeded from the prop.
49
+ *
50
+ * A submission returns the next canvas — or the same one with errors — and
51
+ * that answer has to win over the message row this component was handed,
52
+ * because the row only catches up when the realtime `message.updated`
53
+ * arrives. Rendering the prop would flash the pre-submission step back onto
54
+ * the screen in between.
55
+ */
56
+ const [canvas, setCanvas] = useState(initial);
57
+ const [values, setValues] = useState(() => Object.fromEntries((initial?.fields ?? []).map((f) => [f.name, initialValue(f)])));
58
+ const [errors, setErrors] = useState({});
59
+ const [busy, setBusy] = useState(false);
60
+ if (canvas === null) {
61
+ return null;
62
+ }
63
+ const submit = (actionId, kind) => {
64
+ const conversationId = props.conversationId;
65
+ if (conversationId === null || busy) {
66
+ return;
67
+ }
68
+ setBusy(true);
69
+ void rest
70
+ .submitCanvas(conversationId, {
71
+ messageId: props.messageId,
72
+ actionId,
73
+ // Checkboxes go as booleans; everything else as the string typed.
74
+ values: Object.fromEntries((canvas.fields ?? []).map((f) => [
75
+ f.name,
76
+ f.type === 'checkbox' ? values[f.name] === 'true' : (values[f.name] ?? ''),
77
+ ])),
78
+ })
79
+ .then((answer) => {
80
+ const next = readCanvas(answer.canvas);
81
+ if (next !== null) {
82
+ setCanvas(next);
83
+ setValues(Object.fromEntries((next.fields ?? []).map((f) => [f.name, initialValue(f)])));
84
+ }
85
+ setErrors(answer.errors);
86
+ const hostEvent = answer.hostEvent;
87
+ if (hostEvent?.event !== undefined) {
88
+ // 3-D Secure, a native screen, whatever the integrator needs. The
89
+ // step asked; the app does it.
90
+ onAction?.({
91
+ event: hostEvent.event,
92
+ data: hostEvent.data ?? {},
93
+ conversationId,
94
+ messageId: props.messageId,
95
+ actionId,
96
+ });
97
+ }
98
+ })
99
+ .catch(() => {
100
+ // A failed submit must leave the form usable. The shopper can retry,
101
+ // and the server is the only thing that can settle the price.
102
+ setErrors({ _: 'That did not go through. Try again.' });
103
+ })
104
+ .finally(() => setBusy(false));
105
+ if (kind === 'cancel') {
106
+ setErrors({});
107
+ }
108
+ };
109
+ const label = { color: theme.colors.foreground, fontSize: theme.typography.sizeSmall };
110
+ return (_jsxs(View, { accessibilityLabel: canvas.title ?? 'Step', style: {
111
+ borderWidth: 1,
112
+ borderColor: theme.colors.border,
113
+ borderRadius: theme.radius.bubble,
114
+ backgroundColor: theme.colors.surface,
115
+ padding: theme.spacing.sm,
116
+ marginTop: 6,
117
+ gap: 6,
118
+ }, children: [canvas.title !== undefined && (_jsx(Text, { style: { color: theme.colors.foreground, fontSize: theme.typography.sizeTitle }, children: canvas.title })), canvas.blocks !== undefined && canvas.blocks.length > 0 && (_jsx(MessageBlocks, { blocks: { v: 1, blocks: canvas.blocks }, conversationId: props.conversationId, messageId: props.messageId })), canvas.app !== undefined && (_jsx(Text, { style: { color: theme.colors.mutedForeground, fontSize: theme.typography.sizeSmall }, children: `${canvas.app.title ?? 'This step'} opens outside the chat.` })), (canvas.fields ?? []).map((f) => (_jsxs(View, { style: { gap: 2 }, children: [_jsx(Text, { style: label, children: f.required === true ? `${f.label} *` : f.label }), f.type === 'checkbox' ? (_jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: f.label, onPress: () => setValues((v) => ({ ...v, [f.name]: v[f.name] === 'true' ? '' : 'true' })), children: _jsx(Text, { style: label, children: values[f.name] === 'true' ? 'Yes' : 'No' }) })) : (_jsx(TextInput, { accessibilityLabel: f.label, value: values[f.name] ?? '', placeholder: 'placeholder' in f ? f.placeholder : undefined, editable: !busy, onChangeText: (text) => setValues((v) => ({ ...v, [f.name]: text })), style: {
119
+ borderWidth: 1,
120
+ borderColor: theme.colors.border,
121
+ borderRadius: theme.radius.md,
122
+ paddingHorizontal: theme.spacing.sm,
123
+ paddingVertical: 6,
124
+ color: theme.colors.foreground,
125
+ } })), errors[f.name] !== undefined && (_jsx(Text, { style: { color: theme.colors.danger, fontSize: theme.typography.sizeSmall }, children: errors[f.name] }))] }, f.name))), errors['_'] !== undefined && (_jsx(Text, { style: { color: theme.colors.danger, fontSize: theme.typography.sizeSmall }, children: errors['_'] })), (canvas.actions ?? []).length > 0 && (_jsx(View, { style: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 }, children: (canvas.actions ?? []).map((a) => (_jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: a.label, disabled: busy, onPress: () => submit(a.id, a.kind), style: {
126
+ borderRadius: theme.radius.md,
127
+ paddingHorizontal: theme.spacing.md,
128
+ paddingVertical: theme.spacing.sm,
129
+ backgroundColor: a.style === 'primary'
130
+ ? theme.colors.primary
131
+ : a.style === 'danger'
132
+ ? theme.colors.danger
133
+ : theme.colors.surface,
134
+ borderColor: theme.colors.border,
135
+ borderWidth: a.style === undefined || a.style === 'secondary' ? 1 : 0,
136
+ opacity: busy ? 0.6 : 1,
137
+ }, children: _jsx(Text, { style: {
138
+ color: a.style === 'primary' || a.style === 'danger'
139
+ ? theme.colors.onPrimary
140
+ : theme.colors.foreground,
141
+ fontSize: theme.typography.sizeBody,
142
+ }, children: a.label }) }, a.id))) }))] }));
143
+ }
144
+ //# sourceMappingURL=MessageCanvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageCanvas.js","sourceRoot":"","sources":["../../src/components/MessageCanvas.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MessageCanvas.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageCanvas.spec.d.ts","sourceRoot":"","sources":["../../src/components/MessageCanvas.spec.tsx"],"names":[],"mappings":""}