@repzo/widget-react-native 1.0.4 → 1.0.6

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 (108) hide show
  1. package/lib/commonjs/api/client.js +8 -0
  2. package/lib/commonjs/api/client.js.map +1 -1
  3. package/lib/commonjs/i18n.js +14 -0
  4. package/lib/commonjs/i18n.js.map +1 -1
  5. package/lib/commonjs/locales.js +13 -0
  6. package/lib/commonjs/locales.js.map +1 -1
  7. package/lib/commonjs/state/widget-store.js +44 -4
  8. package/lib/commonjs/state/widget-store.js.map +1 -1
  9. package/lib/commonjs/types.js +3 -0
  10. package/lib/commonjs/types.js.map +1 -1
  11. package/lib/commonjs/ui/WidgetProvider.js +93 -64
  12. package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
  13. package/lib/commonjs/ui/components/Gradient.js +18 -2
  14. package/lib/commonjs/ui/components/Gradient.js.map +1 -1
  15. package/lib/commonjs/ui/components/RatingCard.js +347 -0
  16. package/lib/commonjs/ui/components/RatingCard.js.map +1 -0
  17. package/lib/commonjs/ui/hooks/use-top-inset.js +22 -0
  18. package/lib/commonjs/ui/hooks/use-top-inset.js.map +1 -0
  19. package/lib/commonjs/ui/screens/chat/ChatView.js +30 -2
  20. package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
  21. package/lib/commonjs/ui/screens/home/HomeView.js +42 -9
  22. package/lib/commonjs/ui/screens/home/HomeView.js.map +1 -1
  23. package/lib/commonjs/ui/screens/home/HomeView.styles.js +5 -3
  24. package/lib/commonjs/ui/screens/home/HomeView.styles.js.map +1 -1
  25. package/lib/module/api/client.js +8 -0
  26. package/lib/module/api/client.js.map +1 -1
  27. package/lib/module/i18n.js +14 -0
  28. package/lib/module/i18n.js.map +1 -1
  29. package/lib/module/locales.js +13 -0
  30. package/lib/module/locales.js.map +1 -1
  31. package/lib/module/state/widget-store.js +44 -4
  32. package/lib/module/state/widget-store.js.map +1 -1
  33. package/lib/module/types.js +3 -0
  34. package/lib/module/types.js.map +1 -1
  35. package/lib/module/ui/WidgetProvider.js +96 -67
  36. package/lib/module/ui/WidgetProvider.js.map +1 -1
  37. package/lib/module/ui/components/Gradient.js +18 -2
  38. package/lib/module/ui/components/Gradient.js.map +1 -1
  39. package/lib/module/ui/components/RatingCard.js +341 -0
  40. package/lib/module/ui/components/RatingCard.js.map +1 -0
  41. package/lib/module/ui/hooks/use-top-inset.js +17 -0
  42. package/lib/module/ui/hooks/use-top-inset.js.map +1 -0
  43. package/lib/module/ui/screens/chat/ChatView.js +31 -3
  44. package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
  45. package/lib/module/ui/screens/home/HomeView.js +44 -12
  46. package/lib/module/ui/screens/home/HomeView.js.map +1 -1
  47. package/lib/module/ui/screens/home/HomeView.styles.js +4 -2
  48. package/lib/module/ui/screens/home/HomeView.styles.js.map +1 -1
  49. package/lib/typescript/commonjs/api/client.d.ts +7 -1
  50. package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
  51. package/lib/typescript/commonjs/i18n.d.ts +13 -0
  52. package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/locales.d.ts.map +1 -1
  54. package/lib/typescript/commonjs/state/widget-store.d.ts +18 -1
  55. package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/types.d.ts +17 -0
  57. package/lib/typescript/commonjs/types.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
  59. package/lib/typescript/commonjs/ui/components/Gradient.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/ui/components/RatingCard.d.ts +57 -0
  61. package/lib/typescript/commonjs/ui/components/RatingCard.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/ui/hooks/use-top-inset.d.ts +11 -0
  63. package/lib/typescript/commonjs/ui/hooks/use-top-inset.d.ts.map +1 -0
  64. package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts +1 -1
  65. package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +11 -1
  67. package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts +7 -0
  69. package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts.map +1 -1
  70. package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts +3 -1
  71. package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts.map +1 -1
  72. package/lib/typescript/module/api/client.d.ts +7 -1
  73. package/lib/typescript/module/api/client.d.ts.map +1 -1
  74. package/lib/typescript/module/i18n.d.ts +13 -0
  75. package/lib/typescript/module/i18n.d.ts.map +1 -1
  76. package/lib/typescript/module/locales.d.ts.map +1 -1
  77. package/lib/typescript/module/state/widget-store.d.ts +18 -1
  78. package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
  79. package/lib/typescript/module/types.d.ts +17 -0
  80. package/lib/typescript/module/types.d.ts.map +1 -1
  81. package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
  82. package/lib/typescript/module/ui/components/Gradient.d.ts.map +1 -1
  83. package/lib/typescript/module/ui/components/RatingCard.d.ts +57 -0
  84. package/lib/typescript/module/ui/components/RatingCard.d.ts.map +1 -0
  85. package/lib/typescript/module/ui/hooks/use-top-inset.d.ts +11 -0
  86. package/lib/typescript/module/ui/hooks/use-top-inset.d.ts.map +1 -0
  87. package/lib/typescript/module/ui/screens/chat/ChatView.d.ts +1 -1
  88. package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
  89. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +11 -1
  90. package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
  91. package/lib/typescript/module/ui/screens/home/HomeView.d.ts +7 -0
  92. package/lib/typescript/module/ui/screens/home/HomeView.d.ts.map +1 -1
  93. package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts +3 -1
  94. package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts.map +1 -1
  95. package/package.json +1 -1
  96. package/src/api/client.ts +13 -0
  97. package/src/i18n.ts +14 -0
  98. package/src/locales.ts +13 -0
  99. package/src/state/widget-store.ts +53 -4
  100. package/src/types.ts +19 -0
  101. package/src/ui/WidgetProvider.tsx +54 -4
  102. package/src/ui/components/Gradient.tsx +19 -2
  103. package/src/ui/components/RatingCard.tsx +355 -0
  104. package/src/ui/hooks/use-top-inset.ts +16 -0
  105. package/src/ui/screens/chat/ChatView.tsx +35 -2
  106. package/src/ui/screens/chat/ChatView.types.ts +11 -0
  107. package/src/ui/screens/home/HomeView.styles.ts +4 -2
  108. package/src/ui/screens/home/HomeView.tsx +36 -8
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Conversation rating card (CSAT), posted two minutes after a teammate closes
5
+ * the chat. Port of `client/src/widget/components/RatingCard.tsx`.
6
+ *
7
+ * Tapping a face saves it right away; after 😠/🙁 the visitor can also tap a
8
+ * reason, labelled in their language. A comment locks the rating. The server enforces the change window and answers
9
+ * 409 (locked) or 410 (expired), which the card shows instead of the faces'
10
+ * actions.
11
+ */
12
+
13
+ import { useState } from 'react';
14
+ import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
15
+ import { contrastingTextColor, fontSize, palette, radius, spacing, withAlpha } from "../styles/theme.js";
16
+
17
+ /** 1..5, worst to best — Intercom's five faces. */
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ const RATING_SCALE = [{
20
+ value: 1,
21
+ emoji: '😠'
22
+ }, {
23
+ value: 2,
24
+ emoji: '🙁'
25
+ }, {
26
+ value: 3,
27
+ emoji: '😐'
28
+ }, {
29
+ value: 4,
30
+ emoji: '🙂'
31
+ }, {
32
+ value: 5,
33
+ emoji: '🤩'
34
+ }];
35
+ /** 1–2 asks for a reason; 3 is neutral, 4–5 good. */
36
+ export const isBadRating = rating => rating != null && rating <= 2;
37
+ const isRatingReason = value => !!value && typeof value === 'object' && typeof value.id === 'string' && !!value.labels && typeof value.labels === 'object';
38
+
39
+ /** The rating card carried by a system message's metadata, or null. */
40
+ export function getRatingRequest(metadata) {
41
+ if (!metadata || metadata.event !== 'rating_request' || typeof metadata.ratingId !== 'string') return null;
42
+ const rating = typeof metadata.rating === 'number' && metadata.rating >= 1 && metadata.rating <= 5 ? metadata.rating : null;
43
+ const comment = typeof metadata.ratingComment === 'string' && metadata.ratingComment ? metadata.ratingComment : null;
44
+ const reason = typeof metadata.ratingReason === 'string' && metadata.ratingReason ? metadata.ratingReason : null;
45
+ const reasons = Array.isArray(metadata.ratingReasons) ? metadata.ratingReasons.filter(isRatingReason) : [];
46
+ return {
47
+ ratingId: metadata.ratingId,
48
+ rating,
49
+ comment,
50
+ reason,
51
+ reasons
52
+ };
53
+ }
54
+
55
+ /**
56
+ * A reason's label in the first of `locales` it has (full code, then its base
57
+ * language: "ar-SA" → "ar"), else English, else whatever it has.
58
+ */
59
+ export function reasonLabel(reason, locales) {
60
+ for (const locale of [...locales, 'en']) {
61
+ if (!locale) continue;
62
+ const label = reason.labels[locale] || reason.labels[locale.split('-')[0]];
63
+ if (label) return label;
64
+ }
65
+ return Object.values(reason.labels).find(Boolean) ?? reason.id;
66
+ }
67
+ export function RatingCard({
68
+ ratingId,
69
+ initialRating,
70
+ initialComment,
71
+ initialReason,
72
+ reasons,
73
+ locales,
74
+ color,
75
+ labels,
76
+ onRate
77
+ }) {
78
+ const [rating, setRating] = useState(initialRating);
79
+ const [reason, setReason] = useState(initialReason);
80
+ const [comment, setComment] = useState(initialComment);
81
+ const [draft, setDraft] = useState('');
82
+ const [pending, setPending] = useState(false);
83
+ const [closedReason, setClosedReason] = useState(initialComment ? 'locked' : null);
84
+ const [failed, setFailed] = useState(false);
85
+ const interactive = !!onRate && !closedReason && !pending;
86
+ const canSubmit = !pending && draft.trim().length > 0;
87
+ const submit = async next => {
88
+ if (!onRate || pending) return;
89
+ setPending(true);
90
+ setFailed(false);
91
+ try {
92
+ const result = await onRate(ratingId, next);
93
+ setRating(result.rating);
94
+ setReason(result.reason ?? null);
95
+ setComment(result.comment);
96
+ if (result.locked) setClosedReason('locked');
97
+ setDraft('');
98
+ } catch (error) {
99
+ const status = error.status;
100
+ if (status === 409) setClosedReason('locked');else if (status === 410) setClosedReason('expired');else setFailed(true);
101
+ } finally {
102
+ setPending(false);
103
+ }
104
+ };
105
+ const status = closedReason === 'expired' ? labels.expired : closedReason === 'locked' && !comment ? labels.locked : failed ? labels.failed : rating != null ? labels.thanks : null;
106
+ return /*#__PURE__*/_jsx(View, {
107
+ style: styles.row,
108
+ children: /*#__PURE__*/_jsxs(View, {
109
+ style: styles.card,
110
+ testID: "repzo-rating-card",
111
+ children: [/*#__PURE__*/_jsx(Text, {
112
+ style: styles.question,
113
+ children: labels.question
114
+ }), /*#__PURE__*/_jsx(View, {
115
+ style: styles.faces,
116
+ accessibilityRole: "radiogroup",
117
+ children: RATING_SCALE.map((entry, index) => {
118
+ const selected = rating === entry.value;
119
+ return /*#__PURE__*/_jsx(Pressable, {
120
+ accessibilityRole: "radio",
121
+ accessibilityLabel: labels.scale[index],
122
+ accessibilityState: {
123
+ checked: selected,
124
+ disabled: !interactive
125
+ },
126
+ disabled: !interactive,
127
+ hitSlop: 4,
128
+ onPress: () => {
129
+ if (!selected) void submit({
130
+ rating: entry.value
131
+ });
132
+ },
133
+ style: ({
134
+ pressed
135
+ }) => [styles.face, selected && {
136
+ borderColor: color,
137
+ backgroundColor: withAlpha(color, 0.08)
138
+ }, rating != null && !selected && styles.faceDimmed, pressed && styles.facePressed],
139
+ children: /*#__PURE__*/_jsx(Text, {
140
+ style: styles.emoji,
141
+ children: entry.emoji
142
+ })
143
+ }, entry.value);
144
+ })
145
+ }), status ? /*#__PURE__*/_jsx(Text, {
146
+ style: [styles.status, failed && styles.statusFailed],
147
+ children: status
148
+ }) : null, isBadRating(rating) && reasons.length > 0 && (interactive || reason) ? /*#__PURE__*/_jsxs(View, {
149
+ style: styles.reasons,
150
+ children: [interactive ? /*#__PURE__*/_jsx(Text, {
151
+ style: styles.reasonPrompt,
152
+ children: labels.reasonPrompt
153
+ }) : null, /*#__PURE__*/_jsx(View, {
154
+ style: styles.chips,
155
+ accessibilityRole: "radiogroup",
156
+ accessibilityLabel: labels.reasonPrompt,
157
+ children: reasons.filter(item => interactive || item.id === reason).map(item => {
158
+ const selected = item.id === reason;
159
+ return /*#__PURE__*/_jsx(Pressable, {
160
+ accessibilityRole: "radio",
161
+ accessibilityState: {
162
+ checked: selected,
163
+ disabled: !interactive
164
+ },
165
+ disabled: !interactive,
166
+ onPress: () => {
167
+ if (!selected && rating != null) void submit({
168
+ rating,
169
+ reason: item.id
170
+ });
171
+ },
172
+ style: ({
173
+ pressed
174
+ }) => [styles.chip, selected && {
175
+ backgroundColor: color,
176
+ borderColor: color
177
+ }, pressed && styles.facePressed],
178
+ children: /*#__PURE__*/_jsx(Text, {
179
+ style: [styles.chipText, selected && {
180
+ color: contrastingTextColor(color)
181
+ }],
182
+ children: reasonLabel(item, locales)
183
+ })
184
+ }, item.id);
185
+ })
186
+ })]
187
+ }) : null, comment ? /*#__PURE__*/_jsx(Text, {
188
+ style: styles.comment,
189
+ children: comment
190
+ }) : rating != null && !closedReason ? /*#__PURE__*/_jsxs(View, {
191
+ style: styles.form,
192
+ children: [/*#__PURE__*/_jsx(TextInput, {
193
+ value: draft,
194
+ onChangeText: setDraft,
195
+ editable: !pending,
196
+ multiline: true,
197
+ maxLength: 2000,
198
+ placeholder: labels.commentPlaceholder,
199
+ placeholderTextColor: palette.textSubtle,
200
+ style: styles.input
201
+ }), /*#__PURE__*/_jsx(Pressable, {
202
+ accessibilityRole: "button",
203
+ disabled: !canSubmit,
204
+ onPress: () => {
205
+ const text = draft.trim();
206
+ if (text && rating != null) void submit({
207
+ rating,
208
+ comment: text
209
+ });
210
+ },
211
+ style: ({
212
+ pressed
213
+ }) => [styles.submit, {
214
+ backgroundColor: color
215
+ }, !canSubmit && styles.submitDisabled, pressed && canSubmit && styles.facePressed],
216
+ children: /*#__PURE__*/_jsx(Text, {
217
+ style: [styles.submitText, {
218
+ color: contrastingTextColor(color)
219
+ }],
220
+ children: labels.submit
221
+ })
222
+ })]
223
+ }) : null]
224
+ })
225
+ });
226
+ }
227
+ const styles = StyleSheet.create({
228
+ row: {
229
+ alignItems: 'center',
230
+ paddingVertical: spacing.md
231
+ },
232
+ card: {
233
+ width: '100%',
234
+ maxWidth: 340,
235
+ gap: spacing.md,
236
+ padding: spacing.lg,
237
+ borderRadius: radius.xl,
238
+ borderWidth: StyleSheet.hairlineWidth,
239
+ borderColor: palette.border,
240
+ backgroundColor: palette.white
241
+ },
242
+ question: {
243
+ textAlign: 'center',
244
+ color: palette.ink,
245
+ fontSize: fontSize.body,
246
+ fontWeight: '600'
247
+ },
248
+ faces: {
249
+ flexDirection: 'row',
250
+ justifyContent: 'center',
251
+ gap: spacing.sm
252
+ },
253
+ face: {
254
+ width: 48,
255
+ height: 48,
256
+ borderRadius: 24,
257
+ borderWidth: 2,
258
+ borderColor: 'transparent',
259
+ alignItems: 'center',
260
+ justifyContent: 'center'
261
+ },
262
+ faceDimmed: {
263
+ opacity: 0.45
264
+ },
265
+ facePressed: {
266
+ opacity: 0.7
267
+ },
268
+ emoji: {
269
+ fontSize: 28
270
+ },
271
+ status: {
272
+ textAlign: 'center',
273
+ color: palette.textMuted,
274
+ fontSize: fontSize.meta
275
+ },
276
+ statusFailed: {
277
+ color: palette.danger
278
+ },
279
+ reasons: {
280
+ gap: spacing.sm
281
+ },
282
+ reasonPrompt: {
283
+ color: palette.ink,
284
+ fontSize: fontSize.meta,
285
+ fontWeight: '600'
286
+ },
287
+ chips: {
288
+ flexDirection: 'row',
289
+ flexWrap: 'wrap',
290
+ gap: spacing.sm
291
+ },
292
+ chip: {
293
+ paddingHorizontal: spacing.md,
294
+ paddingVertical: spacing.sm,
295
+ borderRadius: radius.pill,
296
+ borderWidth: 1,
297
+ borderColor: palette.border,
298
+ backgroundColor: palette.white
299
+ },
300
+ chipText: {
301
+ color: palette.ink,
302
+ fontSize: fontSize.meta
303
+ },
304
+ comment: {
305
+ paddingHorizontal: spacing.md,
306
+ paddingVertical: spacing.sm,
307
+ borderRadius: radius.md,
308
+ backgroundColor: palette.surfaceAlt,
309
+ color: palette.ink,
310
+ fontSize: fontSize.meta,
311
+ writingDirection: 'auto'
312
+ },
313
+ form: {
314
+ gap: spacing.sm
315
+ },
316
+ input: {
317
+ minHeight: 64,
318
+ paddingHorizontal: spacing.md,
319
+ paddingVertical: spacing.sm,
320
+ borderRadius: radius.md,
321
+ borderWidth: 1,
322
+ borderColor: palette.border,
323
+ color: palette.ink,
324
+ fontSize: fontSize.input,
325
+ textAlignVertical: 'top'
326
+ },
327
+ submit: {
328
+ alignSelf: 'flex-end',
329
+ paddingHorizontal: spacing.lg,
330
+ paddingVertical: spacing.sm,
331
+ borderRadius: radius.pill
332
+ },
333
+ submitDisabled: {
334
+ opacity: 0.5
335
+ },
336
+ submitText: {
337
+ fontSize: fontSize.meta,
338
+ fontWeight: '600'
339
+ }
340
+ });
341
+ //# sourceMappingURL=RatingCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","Pressable","StyleSheet","Text","TextInput","View","contrastingTextColor","fontSize","palette","radius","spacing","withAlpha","jsx","_jsx","jsxs","_jsxs","RATING_SCALE","value","emoji","isBadRating","rating","isRatingReason","id","labels","getRatingRequest","metadata","event","ratingId","comment","ratingComment","reason","ratingReason","reasons","Array","isArray","ratingReasons","filter","reasonLabel","locales","locale","label","split","Object","values","find","Boolean","RatingCard","initialRating","initialComment","initialReason","color","onRate","setRating","setReason","setComment","draft","setDraft","pending","setPending","closedReason","setClosedReason","failed","setFailed","interactive","canSubmit","trim","length","submit","next","result","locked","error","status","expired","thanks","style","styles","row","children","card","testID","question","faces","accessibilityRole","map","entry","index","selected","accessibilityLabel","scale","accessibilityState","checked","disabled","hitSlop","onPress","pressed","face","borderColor","backgroundColor","faceDimmed","facePressed","statusFailed","reasonPrompt","chips","item","chip","chipText","form","onChangeText","editable","multiline","maxLength","placeholder","commentPlaceholder","placeholderTextColor","textSubtle","input","text","submitDisabled","submitText","create","alignItems","paddingVertical","md","width","maxWidth","gap","padding","lg","borderRadius","xl","borderWidth","hairlineWidth","border","white","textAlign","ink","body","fontWeight","flexDirection","justifyContent","sm","height","opacity","textMuted","meta","danger","flexWrap","paddingHorizontal","pill","surfaceAlt","writingDirection","minHeight","textAlignVertical","alignSelf"],"sourceRoot":"../../../../src","sources":["ui/components/RatingCard.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * How far a screen's header must reach up to sit under the status bar.
5
+ *
6
+ * The messenger draws edge to edge. Screens with a brand header (home, chat)
7
+ * extend that header's background into the status-bar area instead of leaving
8
+ * a white strip above it; the provider gives them the inset through this
9
+ * context and pads every other screen itself, so this is 0 for them.
10
+ */
11
+
12
+ import { createContext, useContext } from 'react';
13
+ export const TopInsetContext = /*#__PURE__*/createContext(0);
14
+ export function useTopInset() {
15
+ return useContext(TopInsetContext);
16
+ }
17
+ //# sourceMappingURL=use-top-inset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","TopInsetContext","useTopInset"],"sourceRoot":"../../../../src","sources":["ui/hooks/use-top-inset.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAEjD,OAAO,MAAMC,eAAe,gBAAGF,aAAa,CAAC,CAAC,CAAC;AAE/C,OAAO,SAASG,WAAWA,CAAA,EAAW;EACpC,OAAOF,UAAU,CAACC,eAAe,CAAC;AACpC","ignoreList":[]}
@@ -19,14 +19,16 @@ import { AttachmentChips } from "../../components/AttachmentChips.js";
19
19
  import { AttachmentMenu, showNativeAttachmentMenu } from "../../components/AttachmentMenu.js";
20
20
  import { Avatar } from "../../components/Avatar.js";
21
21
  import { ImageViewer } from "../../components/ImageViewer.js";
22
+ import { getRatingRequest, RatingCard } from "../../components/RatingCard.js";
22
23
  import { WidgetErrorBoundary } from "../../components/ErrorBoundary.js";
23
24
  import { GradientBackground } from "../../components/Gradient.js";
24
25
  import { ArrowUpIcon, ChatOutlineIcon, ChevronIcon, ClockIcon, PaperclipIcon } from "../../components/icons.js";
25
26
  import { TeamAvatars } from "../../components/TeamAvatars.js";
26
27
  import { Markdown } from "../../components/Markdown.js";
27
28
  import { useReduceMotion } from "../../hooks/use-reduce-motion.js";
29
+ import { useTopInset } from "../../hooks/use-top-inset.js";
28
30
  import { globalStyles } from "../../styles/global.js";
29
- import { contrastingTextColor, mixHex, palette, withAlpha } from "../../styles/theme.js";
31
+ import { contrastingTextColor, mixHex, palette, spacing, withAlpha } from "../../styles/theme.js";
30
32
  import { formatClockTime, formatDayLabel, isSameDay } from "../../utils/conversations.js";
31
33
  import { stripHtml } from "../../utils/html.js";
32
34
  import { isHttpUrl, openExternalUrl } from "../../utils/safe-url.js";
@@ -54,6 +56,8 @@ export function ChatView({
54
56
  onPickAttachments,
55
57
  onSendMessage,
56
58
  onIdentifyVisitor,
59
+ onRateConversation,
60
+ defaultLocale,
57
61
  onLoadMore,
58
62
  onTyping,
59
63
  onBack,
@@ -262,6 +266,7 @@ export function ChatView({
262
266
  const lastVisitorMessageId = [...messages].reverse().find(message => message.direction === 'inbound' && (message.messageType ?? 'message') === 'message')?.id;
263
267
  // Two stops off the brand color: flat fill looked like an unstyled block.
264
268
  // A non-hex brand color falls through mixHex unchanged and renders solid.
269
+ const topInset = useTopInset();
265
270
  const headerGradient = [color, mixHex(color, '#000000', 0.16)];
266
271
  const headerControl = {
267
272
  backgroundColor: withAlpha(headerTextColor, 0.16)
@@ -272,7 +277,12 @@ export function ChatView({
272
277
  colors: headerGradient,
273
278
  style: [styles.header, {
274
279
  borderBottomColor: mixHex(color, '#000000', 0.26)
275
- }],
280
+ },
281
+ // Reaches under the status bar so the brand colour runs to the top.
282
+ topInset > 0 ? {
283
+ paddingTop: spacing.md + topInset,
284
+ minHeight: 72 + topInset
285
+ } : null],
276
286
  children: [/*#__PURE__*/_jsx(Pressable, {
277
287
  onPress: onBack,
278
288
  accessibilityRole: "button",
@@ -428,6 +438,8 @@ export function ChatView({
428
438
  color: color,
429
439
  labels: labels,
430
440
  onOpenImage: setViewerImage,
441
+ onRateConversation: onRateConversation,
442
+ locales: [locale, defaultLocale],
431
443
  senderLabel: isAgentMessage && (startsRun || startsDay) ? message.senderName || agentName || labels.team : null,
432
444
  timeLabel: formatClockTime(message.createdAt, locale),
433
445
  receiptLabel: message.id === lastVisitorMessageId ? receiptLabel(message, labels) : undefined,
@@ -563,7 +575,9 @@ function MessageBubble({
563
575
  receiptLabel,
564
576
  onSubmitProcedureForm,
565
577
  onAgentUiAction,
566
- onOpenImage
578
+ onOpenImage,
579
+ onRateConversation,
580
+ locales
567
581
  }) {
568
582
  const joinedName = message.metadata?.event === 'agent_joined' ? message.metadata?.agentName : null;
569
583
  if (message.messageType === 'system' && typeof joinedName === 'string' && joinedName) {
@@ -583,6 +597,20 @@ function MessageBubble({
583
597
  })]
584
598
  });
585
599
  }
600
+ const ratingRequest = message.messageType === 'system' ? getRatingRequest(message.metadata) : null;
601
+ if (ratingRequest) {
602
+ return /*#__PURE__*/_jsx(RatingCard, {
603
+ ratingId: ratingRequest.ratingId,
604
+ initialRating: ratingRequest.rating,
605
+ initialComment: ratingRequest.comment,
606
+ initialReason: ratingRequest.reason,
607
+ reasons: ratingRequest.reasons,
608
+ locales: locales,
609
+ color: color,
610
+ labels: labels.rating,
611
+ onRate: onRateConversation ? (ratingId, data) => onRateConversation(message.id, ratingId, data) : undefined
612
+ });
613
+ }
586
614
  if (message.messageType === 'system') {
587
615
  const text = message.bodyPlain || stripHtml(message.body || '') || labels.conversationUpdated;
588
616
  return /*#__PURE__*/_jsx(View, {