@repzo/widget-react-native 1.3.0 → 1.4.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.
- package/CHANGELOG.md +179 -0
- package/README.md +72 -16
- package/lib/commonjs/api/client.js +113 -0
- package/lib/commonjs/api/client.js.map +1 -1
- package/lib/commonjs/attachments/file-size.js +52 -0
- package/lib/commonjs/attachments/file-size.js.map +1 -0
- package/lib/commonjs/attachments/local-previews.js +40 -0
- package/lib/commonjs/attachments/local-previews.js.map +1 -0
- package/lib/commonjs/attachments/pickers.js +76 -28
- package/lib/commonjs/attachments/pickers.js.map +1 -1
- package/lib/commonjs/i18n.js +24 -3
- package/lib/commonjs/i18n.js.map +1 -1
- package/lib/commonjs/locales.js +13 -3
- package/lib/commonjs/locales.js.map +1 -1
- package/lib/commonjs/state/widget-store.js +486 -63
- package/lib/commonjs/state/widget-store.js.map +1 -1
- package/lib/commonjs/storage.js +3 -1
- package/lib/commonjs/storage.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/ui/WidgetProvider.js +40 -16
- package/lib/commonjs/ui/WidgetProvider.js.map +1 -1
- package/lib/commonjs/ui/components/AttachmentChips.js +109 -40
- package/lib/commonjs/ui/components/AttachmentChips.js.map +1 -1
- package/lib/commonjs/ui/components/ConversationRow.js +65 -10
- package/lib/commonjs/ui/components/ConversationRow.js.map +1 -1
- package/lib/commonjs/ui/components/ImageViewer.js +231 -25
- package/lib/commonjs/ui/components/ImageViewer.js.map +1 -1
- package/lib/commonjs/ui/components/RatingCard.js +5 -2
- package/lib/commonjs/ui/components/RatingCard.js.map +1 -1
- package/lib/commonjs/ui/components/ZoomableImage.js +58 -10
- package/lib/commonjs/ui/components/ZoomableImage.js.map +1 -1
- package/lib/commonjs/ui/components/icons.js +22 -16
- package/lib/commonjs/ui/components/icons.js.map +1 -1
- package/lib/commonjs/ui/hooks/use-retained-state.js +39 -0
- package/lib/commonjs/ui/hooks/use-retained-state.js.map +1 -0
- package/lib/commonjs/ui/screens/chat/ChatView.js +666 -171
- package/lib/commonjs/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js +150 -3
- package/lib/commonjs/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/commonjs/ui/screens/conversations/ConversationsList.js +1 -0
- package/lib/commonjs/ui/screens/conversations/ConversationsList.js.map +1 -1
- package/lib/commonjs/ui/screens/home/HomeView.js +38 -55
- package/lib/commonjs/ui/screens/home/HomeView.js.map +1 -1
- package/lib/commonjs/ui/screens/home/HomeView.styles.js +36 -45
- package/lib/commonjs/ui/screens/home/HomeView.styles.js.map +1 -1
- package/lib/commonjs/ui/styles/theme.js +1 -0
- package/lib/commonjs/ui/styles/theme.js.map +1 -1
- package/lib/commonjs/ui/utils/conversations.js +17 -1
- package/lib/commonjs/ui/utils/conversations.js.map +1 -1
- package/lib/commonjs/ui/utils/html.js +13 -0
- package/lib/commonjs/ui/utils/html.js.map +1 -1
- package/lib/commonjs/ui/utils/image-load-queue.js +114 -0
- package/lib/commonjs/ui/utils/image-load-queue.js.map +1 -0
- package/lib/commonjs/ui/utils/inline-attachments.js +88 -0
- package/lib/commonjs/ui/utils/inline-attachments.js.map +1 -0
- package/lib/module/api/client.js +113 -0
- package/lib/module/api/client.js.map +1 -1
- package/lib/module/attachments/file-size.js +47 -0
- package/lib/module/attachments/file-size.js.map +1 -0
- package/lib/module/attachments/local-previews.js +33 -0
- package/lib/module/attachments/local-previews.js.map +1 -0
- package/lib/module/attachments/pickers.js +74 -27
- package/lib/module/attachments/pickers.js.map +1 -1
- package/lib/module/i18n.js +24 -3
- package/lib/module/i18n.js.map +1 -1
- package/lib/module/locales.js +13 -3
- package/lib/module/locales.js.map +1 -1
- package/lib/module/state/widget-store.js +488 -65
- package/lib/module/state/widget-store.js.map +1 -1
- package/lib/module/storage.js +2 -0
- package/lib/module/storage.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/ui/WidgetProvider.js +40 -16
- package/lib/module/ui/WidgetProvider.js.map +1 -1
- package/lib/module/ui/components/AttachmentChips.js +111 -42
- package/lib/module/ui/components/AttachmentChips.js.map +1 -1
- package/lib/module/ui/components/ConversationRow.js +65 -10
- package/lib/module/ui/components/ConversationRow.js.map +1 -1
- package/lib/module/ui/components/ImageViewer.js +233 -27
- package/lib/module/ui/components/ImageViewer.js.map +1 -1
- package/lib/module/ui/components/RatingCard.js +5 -2
- package/lib/module/ui/components/RatingCard.js.map +1 -1
- package/lib/module/ui/components/ZoomableImage.js +58 -10
- package/lib/module/ui/components/ZoomableImage.js.map +1 -1
- package/lib/module/ui/components/icons.js +21 -15
- package/lib/module/ui/components/icons.js.map +1 -1
- package/lib/module/ui/hooks/use-retained-state.js +34 -0
- package/lib/module/ui/hooks/use-retained-state.js.map +1 -0
- package/lib/module/ui/screens/chat/ChatView.js +672 -177
- package/lib/module/ui/screens/chat/ChatView.js.map +1 -1
- package/lib/module/ui/screens/chat/ChatView.styles.js +152 -4
- package/lib/module/ui/screens/chat/ChatView.styles.js.map +1 -1
- package/lib/module/ui/screens/conversations/ConversationsList.js +1 -0
- package/lib/module/ui/screens/conversations/ConversationsList.js.map +1 -1
- package/lib/module/ui/screens/home/HomeView.js +40 -57
- package/lib/module/ui/screens/home/HomeView.js.map +1 -1
- package/lib/module/ui/screens/home/HomeView.styles.js +36 -45
- package/lib/module/ui/screens/home/HomeView.styles.js.map +1 -1
- package/lib/module/ui/styles/theme.js +1 -0
- package/lib/module/ui/styles/theme.js.map +1 -1
- package/lib/module/ui/utils/conversations.js +15 -1
- package/lib/module/ui/utils/conversations.js.map +1 -1
- package/lib/module/ui/utils/html.js +12 -0
- package/lib/module/ui/utils/html.js.map +1 -1
- package/lib/module/ui/utils/image-load-queue.js +109 -0
- package/lib/module/ui/utils/image-load-queue.js.map +1 -0
- package/lib/module/ui/utils/inline-attachments.js +85 -0
- package/lib/module/ui/utils/inline-attachments.js.map +1 -0
- package/lib/typescript/commonjs/api/client.d.ts +35 -1
- package/lib/typescript/commonjs/api/client.d.ts.map +1 -1
- package/lib/typescript/commonjs/attachments/file-size.d.ts +15 -0
- package/lib/typescript/commonjs/attachments/file-size.d.ts.map +1 -0
- package/lib/typescript/commonjs/attachments/local-previews.d.ts +14 -0
- package/lib/typescript/commonjs/attachments/local-previews.d.ts.map +1 -0
- package/lib/typescript/commonjs/attachments/pickers.d.ts +35 -10
- package/lib/typescript/commonjs/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/commonjs/i18n.d.ts +13 -3
- package/lib/typescript/commonjs/i18n.d.ts.map +1 -1
- package/lib/typescript/commonjs/locales.d.ts.map +1 -1
- package/lib/typescript/commonjs/state/widget-store.d.ts +67 -4
- package/lib/typescript/commonjs/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/commonjs/storage.d.ts +2 -0
- package/lib/typescript/commonjs/storage.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +58 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/AttachmentChips.d.ts +13 -3
- package/lib/typescript/commonjs/ui/components/AttachmentChips.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ConversationRow.d.ts +15 -1
- package/lib/typescript/commonjs/ui/components/ConversationRow.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts +26 -6
- package/lib/typescript/commonjs/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/RatingCard.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts +10 -1
- package/lib/typescript/commonjs/ui/components/ZoomableImage.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/icons.d.ts +2 -1
- package/lib/typescript/commonjs/ui/components/icons.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/use-retained-state.d.ts +11 -0
- package/lib/typescript/commonjs/ui/hooks/use-retained-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts +4 -4
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts +154 -2
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts +30 -1
- package/lib/typescript/commonjs/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.types.d.ts +2 -0
- package/lib/typescript/commonjs/ui/screens/conversations/ConversationsList.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts +7 -5
- package/lib/typescript/commonjs/ui/screens/home/HomeView.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts +30 -35
- package/lib/typescript/commonjs/ui/screens/home/HomeView.styles.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/home/HomeView.types.d.ts +5 -6
- package/lib/typescript/commonjs/ui/screens/home/HomeView.types.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/styles/theme.d.ts +2 -0
- package/lib/typescript/commonjs/ui/styles/theme.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/conversations.d.ts +10 -2
- package/lib/typescript/commonjs/ui/utils/conversations.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/html.d.ts +5 -0
- package/lib/typescript/commonjs/ui/utils/html.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/image-load-queue.d.ts +44 -0
- package/lib/typescript/commonjs/ui/utils/image-load-queue.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/utils/inline-attachments.d.ts +29 -0
- package/lib/typescript/commonjs/ui/utils/inline-attachments.d.ts.map +1 -0
- package/lib/typescript/module/api/client.d.ts +35 -1
- package/lib/typescript/module/api/client.d.ts.map +1 -1
- package/lib/typescript/module/attachments/file-size.d.ts +15 -0
- package/lib/typescript/module/attachments/file-size.d.ts.map +1 -0
- package/lib/typescript/module/attachments/local-previews.d.ts +14 -0
- package/lib/typescript/module/attachments/local-previews.d.ts.map +1 -0
- package/lib/typescript/module/attachments/pickers.d.ts +35 -10
- package/lib/typescript/module/attachments/pickers.d.ts.map +1 -1
- package/lib/typescript/module/i18n.d.ts +13 -3
- package/lib/typescript/module/i18n.d.ts.map +1 -1
- package/lib/typescript/module/locales.d.ts.map +1 -1
- package/lib/typescript/module/state/widget-store.d.ts +67 -4
- package/lib/typescript/module/state/widget-store.d.ts.map +1 -1
- package/lib/typescript/module/storage.d.ts +2 -0
- package/lib/typescript/module/storage.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +58 -0
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/ui/WidgetProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/AttachmentChips.d.ts +13 -3
- package/lib/typescript/module/ui/components/AttachmentChips.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ConversationRow.d.ts +15 -1
- package/lib/typescript/module/ui/components/ConversationRow.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ImageViewer.d.ts +26 -6
- package/lib/typescript/module/ui/components/ImageViewer.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/RatingCard.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts +10 -1
- package/lib/typescript/module/ui/components/ZoomableImage.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/icons.d.ts +2 -1
- package/lib/typescript/module/ui/components/icons.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/use-retained-state.d.ts +11 -0
- package/lib/typescript/module/ui/hooks/use-retained-state.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts +4 -4
- package/lib/typescript/module/ui/screens/chat/ChatView.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts +154 -2
- package/lib/typescript/module/ui/screens/chat/ChatView.styles.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts +30 -1
- package/lib/typescript/module/ui/screens/chat/ChatView.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.types.d.ts +2 -0
- package/lib/typescript/module/ui/screens/conversations/ConversationsList.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.d.ts +7 -5
- package/lib/typescript/module/ui/screens/home/HomeView.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts +30 -35
- package/lib/typescript/module/ui/screens/home/HomeView.styles.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/home/HomeView.types.d.ts +5 -6
- package/lib/typescript/module/ui/screens/home/HomeView.types.d.ts.map +1 -1
- package/lib/typescript/module/ui/styles/theme.d.ts +2 -0
- package/lib/typescript/module/ui/styles/theme.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/conversations.d.ts +10 -2
- package/lib/typescript/module/ui/utils/conversations.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/html.d.ts +5 -0
- package/lib/typescript/module/ui/utils/html.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/image-load-queue.d.ts +44 -0
- package/lib/typescript/module/ui/utils/image-load-queue.d.ts.map +1 -0
- package/lib/typescript/module/ui/utils/inline-attachments.d.ts +29 -0
- package/lib/typescript/module/ui/utils/inline-attachments.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/api/client.ts +148 -2
- package/src/attachments/file-size.ts +42 -0
- package/src/attachments/local-previews.ts +32 -0
- package/src/attachments/pickers.ts +90 -30
- package/src/i18n.ts +24 -3
- package/src/locales.ts +13 -3
- package/src/state/widget-store.ts +519 -70
- package/src/storage.ts +2 -0
- package/src/types.ts +58 -0
- package/src/ui/WidgetProvider.tsx +50 -12
- package/src/ui/components/AttachmentChips.tsx +100 -29
- package/src/ui/components/ConversationRow.tsx +90 -9
- package/src/ui/components/ImageViewer.tsx +250 -28
- package/src/ui/components/RatingCard.tsx +5 -2
- package/src/ui/components/ZoomableImage.tsx +58 -5
- package/src/ui/components/icons.tsx +10 -12
- package/src/ui/hooks/use-retained-state.ts +35 -0
- package/src/ui/screens/chat/ChatView.styles.ts +151 -3
- package/src/ui/screens/chat/ChatView.tsx +760 -213
- package/src/ui/screens/chat/ChatView.types.ts +30 -1
- package/src/ui/screens/conversations/ConversationsList.tsx +1 -0
- package/src/ui/screens/conversations/ConversationsList.types.ts +2 -0
- package/src/ui/screens/home/HomeView.styles.ts +36 -45
- package/src/ui/screens/home/HomeView.tsx +54 -70
- package/src/ui/screens/home/HomeView.types.ts +5 -6
- package/src/ui/styles/theme.ts +6 -0
- package/src/ui/utils/conversations.ts +16 -2
- package/src/ui/utils/html.ts +26 -0
- package/src/ui/utils/image-load-queue.ts +108 -0
- package/src/ui/utils/inline-attachments.ts +71 -0
|
@@ -15,6 +15,7 @@ import { forwardDirection, START_ALIGN } from "../utils/rtl.js";
|
|
|
15
15
|
import { fontSize, palette, spacing } from "../styles/theme.js";
|
|
16
16
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
17
|
const AVATAR_SIZE = 40;
|
|
18
|
+
const CARD_AVATAR_SIZE = 32;
|
|
18
19
|
export function ConversationRow({
|
|
19
20
|
conversation,
|
|
20
21
|
color,
|
|
@@ -22,47 +23,59 @@ export function ConversationRow({
|
|
|
22
23
|
timeLabels,
|
|
23
24
|
unreadCount = 0,
|
|
24
25
|
unreadLabel,
|
|
26
|
+
lastMessageLabels,
|
|
25
27
|
horizontalPadding = spacing.xl,
|
|
28
|
+
variant = 'list',
|
|
26
29
|
onPress
|
|
27
30
|
}) {
|
|
31
|
+
const card = variant === 'card';
|
|
28
32
|
const displayName = conversation.agentName || fallbackName;
|
|
29
33
|
const hasUnread = unreadCount > 0;
|
|
30
34
|
const unreadSuffix = hasUnread && unreadLabel ? `. ${formatLabel(unreadLabel, {
|
|
31
35
|
count: unreadCount
|
|
32
36
|
})}` : '';
|
|
37
|
+
const attachment = conversation.lastMessageAttachment;
|
|
38
|
+
// "Photo" or "File" over Workstation's "2 attachments".
|
|
39
|
+
const snippet = attachment && lastMessageLabels?.[attachment] || conversation.snippet || '';
|
|
40
|
+
// "You: " is drawn a shade stronger than the message, so it reads as a label.
|
|
41
|
+
const [youBefore, youAfter] = snippet && conversation.lastMessageFromVisitor && lastMessageLabels?.you ? splitAround(lastMessageLabels.you, '{message}') : ['', ''];
|
|
42
|
+
const snippetLabel = `${youBefore}${snippet}${youAfter}`;
|
|
33
43
|
return /*#__PURE__*/_jsxs(Pressable, {
|
|
34
44
|
onPress: onPress,
|
|
35
45
|
accessibilityRole: "button",
|
|
36
|
-
accessibilityLabel: `${
|
|
46
|
+
accessibilityLabel: `${snippet ? `${displayName}. ${snippetLabel}` : displayName}${unreadSuffix}`,
|
|
37
47
|
android_ripple: {
|
|
38
48
|
color: palette.borderSoft
|
|
39
49
|
},
|
|
40
50
|
style: ({
|
|
41
51
|
pressed
|
|
42
|
-
}) => [styles.row, {
|
|
52
|
+
}) => [styles.row, card && cardStyles.row, {
|
|
43
53
|
paddingHorizontal: horizontalPadding
|
|
44
54
|
}, pressed && styles.rowPressed],
|
|
45
55
|
children: [/*#__PURE__*/_jsx(Avatar, {
|
|
46
56
|
avatar: conversation.agentAvatar,
|
|
47
57
|
name: conversation.agentName,
|
|
48
|
-
size: AVATAR_SIZE,
|
|
58
|
+
size: card ? CARD_AVATAR_SIZE : AVATAR_SIZE,
|
|
49
59
|
color: color
|
|
50
60
|
}), /*#__PURE__*/_jsxs(View, {
|
|
51
61
|
style: styles.content,
|
|
52
62
|
children: [/*#__PURE__*/_jsxs(View, {
|
|
53
|
-
style: styles.topLine,
|
|
63
|
+
style: [styles.topLine, card && cardStyles.topLine],
|
|
54
64
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
55
|
-
style: [styles.name, hasUnread && styles.nameUnread],
|
|
65
|
+
style: card ? [cardStyles.name, hasUnread && cardStyles.nameUnread] : [styles.name, hasUnread && styles.nameUnread],
|
|
56
66
|
numberOfLines: 1,
|
|
57
67
|
children: displayName
|
|
58
68
|
}), /*#__PURE__*/_jsx(Text, {
|
|
59
|
-
style: styles.time,
|
|
69
|
+
style: [styles.time, card && cardStyles.time],
|
|
60
70
|
children: conversation.lastMessageAt ? formatRelativeTime(conversation.lastMessageAt, timeLabels) : ''
|
|
61
71
|
})]
|
|
62
|
-
}),
|
|
63
|
-
style: [styles.snippet, hasUnread && styles.snippetUnread],
|
|
72
|
+
}), snippet ? /*#__PURE__*/_jsxs(Text, {
|
|
73
|
+
style: [styles.snippet, card && cardStyles.snippet, hasUnread && styles.snippetUnread],
|
|
64
74
|
numberOfLines: 2,
|
|
65
|
-
children:
|
|
75
|
+
children: [youBefore ? /*#__PURE__*/_jsx(Text, {
|
|
76
|
+
style: styles.snippetYou,
|
|
77
|
+
children: youBefore
|
|
78
|
+
}) : null, snippet, youAfter]
|
|
66
79
|
}) : null]
|
|
67
80
|
}), hasUnread ? /*#__PURE__*/_jsx(View, {
|
|
68
81
|
style: [styles.badge, {
|
|
@@ -72,7 +85,7 @@ export function ConversationRow({
|
|
|
72
85
|
style: styles.badgeLabel,
|
|
73
86
|
children: unreadCount > 9 ? '9+' : unreadCount
|
|
74
87
|
})
|
|
75
|
-
}) : /*#__PURE__*/_jsx(ChevronIcon, {
|
|
88
|
+
}) : card ? null : /*#__PURE__*/_jsx(ChevronIcon, {
|
|
76
89
|
size: 16,
|
|
77
90
|
direction: forwardDirection(),
|
|
78
91
|
color: palette.textSubtle
|
|
@@ -80,6 +93,13 @@ export function ConversationRow({
|
|
|
80
93
|
});
|
|
81
94
|
}
|
|
82
95
|
|
|
96
|
+
/** `'You: {message}'` → `['You: ', '']`; a template without the token goes in front. */
|
|
97
|
+
function splitAround(template, token) {
|
|
98
|
+
const index = template.indexOf(token);
|
|
99
|
+
if (index < 0) return [`${template} `, ''];
|
|
100
|
+
return [template.slice(0, index), template.slice(index + token.length)];
|
|
101
|
+
}
|
|
102
|
+
|
|
83
103
|
/** Where a divider should start so it sits under the text, not the avatar. */
|
|
84
104
|
export function rowDividerInset(horizontalPadding = spacing.xl) {
|
|
85
105
|
return horizontalPadding + AVATAR_SIZE + spacing.md;
|
|
@@ -131,6 +151,10 @@ const styles = StyleSheet.create({
|
|
|
131
151
|
color: palette.text,
|
|
132
152
|
fontWeight: '500'
|
|
133
153
|
},
|
|
154
|
+
snippetYou: {
|
|
155
|
+
color: palette.text,
|
|
156
|
+
fontWeight: '600'
|
|
157
|
+
},
|
|
134
158
|
// Replaces the chevron rather than crowding beside it, so the row keeps
|
|
135
159
|
// the same width whether or not there is anything unread.
|
|
136
160
|
badge: {
|
|
@@ -147,4 +171,35 @@ const styles = StyleSheet.create({
|
|
|
147
171
|
fontWeight: '700'
|
|
148
172
|
}
|
|
149
173
|
});
|
|
174
|
+
|
|
175
|
+
// Overrides for the `card` variant. It sits under the card's title, so it
|
|
176
|
+
// drops the list's minimum height, and its name, time and last message share
|
|
177
|
+
// one size, the way the Home design draws them.
|
|
178
|
+
const cardStyles = StyleSheet.create({
|
|
179
|
+
row: {
|
|
180
|
+
minHeight: 0,
|
|
181
|
+
paddingVertical: spacing.sm
|
|
182
|
+
},
|
|
183
|
+
// The time follows the name instead of being pushed to the far edge.
|
|
184
|
+
topLine: {
|
|
185
|
+
justifyContent: 'flex-start'
|
|
186
|
+
},
|
|
187
|
+
name: {
|
|
188
|
+
textAlign: START_ALIGN,
|
|
189
|
+
flexShrink: 1,
|
|
190
|
+
fontSize: fontSize.body,
|
|
191
|
+
color: palette.ink
|
|
192
|
+
},
|
|
193
|
+
nameUnread: {
|
|
194
|
+
fontWeight: '600'
|
|
195
|
+
},
|
|
196
|
+
time: {
|
|
197
|
+
fontSize: fontSize.body
|
|
198
|
+
},
|
|
199
|
+
snippet: {
|
|
200
|
+
fontSize: fontSize.body,
|
|
201
|
+
lineHeight: fontSize.body * 1.35,
|
|
202
|
+
color: palette.textSubtle
|
|
203
|
+
}
|
|
204
|
+
});
|
|
150
205
|
//# sourceMappingURL=ConversationRow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Pressable","StyleSheet","Text","View","Avatar","formatLabel","formatRelativeTime","ChevronIcon","forwardDirection","START_ALIGN","fontSize","palette","spacing","jsx","_jsx","jsxs","_jsxs","AVATAR_SIZE","ConversationRow","conversation","color","fallbackName","timeLabels","unreadCount","unreadLabel","horizontalPadding","xl","onPress","displayName","agentName","hasUnread","unreadSuffix","count","
|
|
1
|
+
{"version":3,"names":["Pressable","StyleSheet","Text","View","Avatar","formatLabel","formatRelativeTime","ChevronIcon","forwardDirection","START_ALIGN","fontSize","palette","spacing","jsx","_jsx","jsxs","_jsxs","AVATAR_SIZE","CARD_AVATAR_SIZE","ConversationRow","conversation","color","fallbackName","timeLabels","unreadCount","unreadLabel","lastMessageLabels","horizontalPadding","xl","variant","onPress","card","displayName","agentName","hasUnread","unreadSuffix","count","attachment","lastMessageAttachment","snippet","youBefore","youAfter","lastMessageFromVisitor","you","splitAround","snippetLabel","accessibilityRole","accessibilityLabel","android_ripple","borderSoft","style","pressed","styles","row","cardStyles","paddingHorizontal","rowPressed","children","avatar","agentAvatar","name","size","content","topLine","nameUnread","numberOfLines","time","lastMessageAt","snippetUnread","snippetYou","badge","backgroundColor","badgeLabel","direction","textSubtle","template","token","index","indexOf","slice","length","rowDividerInset","md","create","flexDirection","alignItems","gap","minHeight","paddingVertical","white","surface","flex","minWidth","justifyContent","sm","textAlign","body","fontWeight","ink","caption","meta","lineHeight","textMuted","marginTop","text","height","borderRadius","xs","micro","flexShrink"],"sourceRoot":"../../../../src","sources":["ui/components/ConversationRow.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,29 +3,137 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Full-screen viewer for image attachments, so a tap on a photo the agent sent
|
|
5
5
|
* stays inside the messenger instead of bouncing to the browser. Pinch, drag
|
|
6
|
-
* and double-tap zoom work on iOS and Android (see ZoomableImage).
|
|
6
|
+
* and double-tap zoom work on iOS and Android (see ZoomableImage). With
|
|
7
|
+
* several photos in one message, a sideways swipe moves between them.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
|
-
import { useState } from 'react';
|
|
10
|
-
import { ActivityIndicator, Modal, Platform, Pressable, StyleSheet, Text, View } from 'react-native';
|
|
10
|
+
import { useLayoutEffect, useRef, useState } from 'react';
|
|
11
|
+
import { ActivityIndicator, Animated, Image, Modal, Platform, Pressable, StyleSheet, Text, View } from 'react-native';
|
|
12
|
+
import { formatLabel } from "../../i18n.js";
|
|
13
|
+
import { useReduceMotion } from "../hooks/use-reduce-motion.js";
|
|
11
14
|
import { useWidgetInsets } from "../hooks/use-widget-insets.js";
|
|
12
15
|
import { fontSize, palette, spacing } from "../styles/theme.js";
|
|
16
|
+
import { isRTL } from "../utils/rtl.js";
|
|
17
|
+
import { isHttpUrl } from "../utils/safe-url.js";
|
|
13
18
|
import { CloseIcon } from "./icons.js";
|
|
14
19
|
import { ZoomableImage } from "./ZoomableImage.js";
|
|
20
|
+
|
|
21
|
+
/** The photos of one message, opened at the one tapped. */
|
|
15
22
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
|
+
/** A swipe changes photo past this share of the screen, or this fast (px/ms). */
|
|
24
|
+
const SWIPE_DISTANCE = 0.25;
|
|
25
|
+
const SWIPE_VELOCITY = 0.5;
|
|
26
|
+
/** Past the first or last photo the strip only gives this much. */
|
|
27
|
+
const EDGE_RESISTANCE = 0.25;
|
|
16
28
|
export function ImageViewer({
|
|
17
|
-
|
|
29
|
+
gallery,
|
|
18
30
|
labels,
|
|
19
31
|
onClose,
|
|
20
32
|
onOpenExternally
|
|
21
33
|
}) {
|
|
22
34
|
const insets = useWidgetInsets();
|
|
23
|
-
|
|
35
|
+
const reduceMotion = useReduceMotion();
|
|
36
|
+
// The photo on screen, for the gallery it belongs to: a new gallery opens at its own.
|
|
37
|
+
const [position, setPosition] = useState({
|
|
38
|
+
of: null,
|
|
39
|
+
index: 0
|
|
40
|
+
});
|
|
41
|
+
const images = gallery?.images ?? [];
|
|
42
|
+
const index = position.of === gallery ? position.index : gallery?.index ?? 0;
|
|
43
|
+
const image = images[index] ?? null;
|
|
44
|
+
// Photos whose own URL failed, now shown from their fallback.
|
|
45
|
+
const [fellBack, setFellBack] = useState(() => new Set());
|
|
46
|
+
const sourceOf = photo => photo.fallbackUrl && fellBack.has(photo.url) ? photo.fallbackUrl : photo.url;
|
|
47
|
+
const source = image ? sourceOf(image) : null;
|
|
48
|
+
// Keyed by URL so each photo starts from a clean loading state.
|
|
24
49
|
const [status, setStatus] = useState({
|
|
25
50
|
url: null,
|
|
26
51
|
state: 'loading'
|
|
27
52
|
});
|
|
28
|
-
const state = status.url ===
|
|
53
|
+
const state = status.url === source ? status.state : 'loading';
|
|
54
|
+
// False once there's nothing left to try, so the caller shows the failure.
|
|
55
|
+
const fallBack = photo => {
|
|
56
|
+
if (!photo.fallbackUrl || fellBack.has(photo.url)) return false;
|
|
57
|
+
setFellBack(current => new Set(current).add(photo.url));
|
|
58
|
+
return true;
|
|
59
|
+
};
|
|
60
|
+
// Photos whose screen-size copy is drawn: no spinner over those while the full one decodes.
|
|
61
|
+
const [previewed, setPreviewed] = useState(() => new Set());
|
|
62
|
+
const markPreviewed = url => setPreviewed(current => current.has(url) ? current : new Set(current).add(url));
|
|
63
|
+
const [width, setWidth] = useState(0);
|
|
64
|
+
// One page per photo, never reordered: a swipe slides the strip to the photo
|
|
65
|
+
// it lands on and leaves it there. (Re-centring three pages instead showed the
|
|
66
|
+
// wrong photo, then a black frame, for a moment on Android.)
|
|
67
|
+
const [offset] = useState(() => new Animated.Value(0));
|
|
68
|
+
const rtl = isRTL();
|
|
69
|
+
// Pages run left to right in every language; in Arabic the first photo is the rightmost.
|
|
70
|
+
const restingAt = photo => -(rtl ? images.length - 1 - photo : photo) * width;
|
|
71
|
+
const swiping = useRef(false);
|
|
72
|
+
// Closing the viewer mid-swipe stops the slide unfinished, so it never
|
|
73
|
+
// settles: the next gallery is placed afresh.
|
|
74
|
+
useLayoutEffect(() => {
|
|
75
|
+
swiping.current = false;
|
|
76
|
+
}, [gallery]);
|
|
77
|
+
// Places the strip when the viewer opens, the screen turns or the screen reader
|
|
78
|
+
// moves; after a swipe it is already there.
|
|
79
|
+
useLayoutEffect(() => {
|
|
80
|
+
if (!swiping.current) offset.setValue(restingAt(index));
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// In Arabic the next photo is the one on the left.
|
|
84
|
+
const step = rtl ? -1 : 1;
|
|
85
|
+
const neighbour = side => {
|
|
86
|
+
const next = index + side * step;
|
|
87
|
+
return next >= 0 && next < images.length ? next : null;
|
|
88
|
+
};
|
|
89
|
+
const show = next => {
|
|
90
|
+
if (next !== null) setPosition({
|
|
91
|
+
of: gallery,
|
|
92
|
+
index: next
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
const swipe = {
|
|
96
|
+
move: dx => {
|
|
97
|
+
swiping.current = true;
|
|
98
|
+
const resisted = neighbour(dx < 0 ? 1 : -1) === null ? dx * EDGE_RESISTANCE : dx;
|
|
99
|
+
offset.setValue(restingAt(index) + resisted);
|
|
100
|
+
},
|
|
101
|
+
end: (dx, vx) => {
|
|
102
|
+
const next = neighbour(dx < 0 ? 1 : -1);
|
|
103
|
+
const far = Math.abs(dx) > width * SWIPE_DISTANCE || Math.abs(vx) > SWIPE_VELOCITY && Math.sign(vx) === Math.sign(dx);
|
|
104
|
+
const target = next !== null && dx !== 0 && far ? next : index;
|
|
105
|
+
const toValue = restingAt(target);
|
|
106
|
+
// Switched as the finger lifts: the counter changes at once, and the full
|
|
107
|
+
// photo decodes while the strip is still sliding to it.
|
|
108
|
+
show(target === index ? null : target);
|
|
109
|
+
if (reduceMotion !== false) {
|
|
110
|
+
offset.setValue(toValue);
|
|
111
|
+
swiping.current = false;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const animation = target === index ? Animated.spring(offset, {
|
|
115
|
+
toValue,
|
|
116
|
+
useNativeDriver: true,
|
|
117
|
+
bounciness: 0,
|
|
118
|
+
speed: 18
|
|
119
|
+
}) : Animated.timing(offset, {
|
|
120
|
+
toValue,
|
|
121
|
+
duration: 180,
|
|
122
|
+
useNativeDriver: true
|
|
123
|
+
});
|
|
124
|
+
// A swipe that starts before this one lands takes over the strip; it settles it.
|
|
125
|
+
animation.start(({
|
|
126
|
+
finished
|
|
127
|
+
}) => {
|
|
128
|
+
if (finished) swiping.current = false;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const several = images.length > 1;
|
|
133
|
+
const handleAccessibilityAction = event => {
|
|
134
|
+
if (event.nativeEvent.actionName === 'increment' && index < images.length - 1) show(index + 1);
|
|
135
|
+
if (event.nativeEvent.actionName === 'decrement' && index > 0) show(index - 1);
|
|
136
|
+
};
|
|
29
137
|
return /*#__PURE__*/_jsx(Modal, {
|
|
30
138
|
visible: !!image,
|
|
31
139
|
transparent: true,
|
|
@@ -35,30 +143,98 @@ export function ImageViewer({
|
|
|
35
143
|
children: /*#__PURE__*/_jsxs(View, {
|
|
36
144
|
style: styles.backdrop,
|
|
37
145
|
accessibilityViewIsModal: true,
|
|
38
|
-
|
|
39
|
-
/*#__PURE__*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
146
|
+
onLayout: event => setWidth(event.nativeEvent.layout.width),
|
|
147
|
+
children: [image && width > 0 ? /*#__PURE__*/_jsx(Animated.View, {
|
|
148
|
+
style: [styles.strip, {
|
|
149
|
+
width: width * images.length,
|
|
150
|
+
transform: [{
|
|
151
|
+
translateX: offset
|
|
152
|
+
}]
|
|
153
|
+
}],
|
|
154
|
+
children: (rtl ? [...images].reverse() : images).map(photo => {
|
|
155
|
+
const page = images.indexOf(photo);
|
|
156
|
+
const centre = page === index;
|
|
157
|
+
const uri = sourceOf(photo);
|
|
158
|
+
// Only the photo on screen and the ones a swipe reveals are drawn.
|
|
159
|
+
const near = Math.abs(page - index) <= 1;
|
|
160
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
161
|
+
style: [styles.page, {
|
|
162
|
+
width
|
|
163
|
+
}],
|
|
164
|
+
...(centre && several ? {
|
|
165
|
+
accessible: true,
|
|
166
|
+
accessibilityRole: 'adjustable',
|
|
167
|
+
accessibilityLabel: photo.name,
|
|
168
|
+
accessibilityValue: {
|
|
169
|
+
text: formatLabel(labels.position, {
|
|
170
|
+
current: index + 1,
|
|
171
|
+
total: images.length
|
|
172
|
+
})
|
|
173
|
+
},
|
|
174
|
+
accessibilityActions: [{
|
|
175
|
+
name: 'increment'
|
|
176
|
+
}, {
|
|
177
|
+
name: 'decrement'
|
|
178
|
+
}],
|
|
179
|
+
onAccessibilityAction: handleAccessibilityAction
|
|
180
|
+
} : null),
|
|
181
|
+
children: [!near ? null : photo.large ? centre ? null : /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
182
|
+
style: styles.layer,
|
|
183
|
+
color: palette.white
|
|
184
|
+
}) :
|
|
185
|
+
/*#__PURE__*/
|
|
186
|
+
// Decoded at the screen's size, so it's ready mid-swipe, and shown
|
|
187
|
+
// until the full photo on top has decoded.
|
|
188
|
+
_jsx(Image, {
|
|
189
|
+
source: {
|
|
190
|
+
uri
|
|
191
|
+
},
|
|
192
|
+
style: [styles.layer, centre && state === 'ready' && styles.covered],
|
|
193
|
+
resizeMode: "contain",
|
|
194
|
+
resizeMethod: "resize",
|
|
195
|
+
onLoad: () => markPreviewed(uri),
|
|
196
|
+
onError: () => fallBack(photo),
|
|
197
|
+
importantForAccessibility: "no",
|
|
198
|
+
accessibilityIgnoresInvertColors: true
|
|
199
|
+
}), centre ?
|
|
200
|
+
/*#__PURE__*/
|
|
201
|
+
// Keyed by URL so each photo opens at 1×, not at the last one's zoom.
|
|
202
|
+
_jsx(View, {
|
|
203
|
+
style: styles.layer,
|
|
204
|
+
children: /*#__PURE__*/_jsx(ZoomableImage, {
|
|
205
|
+
uri: uri,
|
|
206
|
+
accessibilityLabel: photo.name,
|
|
207
|
+
onLoad: () => setStatus({
|
|
208
|
+
url: uri,
|
|
209
|
+
state: 'ready'
|
|
210
|
+
}),
|
|
211
|
+
onError: () => {
|
|
212
|
+
if (!fallBack(photo)) setStatus({
|
|
213
|
+
url: uri,
|
|
214
|
+
state: 'failed'
|
|
215
|
+
});
|
|
216
|
+
},
|
|
217
|
+
onSwipe: several ? swipe : undefined
|
|
218
|
+
})
|
|
219
|
+
}, uri) : null]
|
|
220
|
+
}, `${page}:${photo.url}`);
|
|
51
221
|
})
|
|
52
|
-
}
|
|
222
|
+
}) : null, image && source && state === 'loading' && !previewed.has(source) ? /*#__PURE__*/_jsx(View, {
|
|
53
223
|
style: StyleSheet.absoluteFill,
|
|
54
|
-
|
|
55
|
-
|
|
224
|
+
pointerEvents: "none",
|
|
225
|
+
children: /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
226
|
+
style: StyleSheet.absoluteFill,
|
|
227
|
+
color: palette.white
|
|
228
|
+
})
|
|
229
|
+
}) : null, image && source && state === 'failed' ? /*#__PURE__*/_jsxs(View, {
|
|
56
230
|
style: [StyleSheet.absoluteFill, styles.center, styles.failed],
|
|
231
|
+
pointerEvents: "box-none",
|
|
57
232
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
58
233
|
style: styles.failedText,
|
|
234
|
+
pointerEvents: "none",
|
|
59
235
|
children: labels.loadFailed
|
|
60
|
-
}), /*#__PURE__*/_jsx(Pressable, {
|
|
61
|
-
onPress: () => onOpenExternally(
|
|
236
|
+
}), isHttpUrl(source) ? /*#__PURE__*/_jsx(Pressable, {
|
|
237
|
+
onPress: () => onOpenExternally(source),
|
|
62
238
|
accessibilityRole: "button",
|
|
63
239
|
style: ({
|
|
64
240
|
pressed
|
|
@@ -67,7 +243,7 @@ export function ImageViewer({
|
|
|
67
243
|
style: styles.externalLabel,
|
|
68
244
|
children: labels.openExternally
|
|
69
245
|
})
|
|
70
|
-
})]
|
|
246
|
+
}) : null]
|
|
71
247
|
}) : null, /*#__PURE__*/_jsxs(View, {
|
|
72
248
|
style: [styles.header, {
|
|
73
249
|
paddingTop: insets.top + spacing.sm
|
|
@@ -77,7 +253,12 @@ export function ImageViewer({
|
|
|
77
253
|
style: styles.title,
|
|
78
254
|
numberOfLines: 1,
|
|
79
255
|
children: image?.name ?? ''
|
|
80
|
-
}), /*#__PURE__*/
|
|
256
|
+
}), several ? /*#__PURE__*/_jsxs(Text, {
|
|
257
|
+
style: styles.counter,
|
|
258
|
+
accessibilityElementsHidden: true,
|
|
259
|
+
importantForAccessibility: "no",
|
|
260
|
+
children: [index + 1, " / ", images.length]
|
|
261
|
+
}) : null, /*#__PURE__*/_jsx(Pressable, {
|
|
81
262
|
onPress: onClose,
|
|
82
263
|
accessibilityRole: "button",
|
|
83
264
|
accessibilityLabel: labels.close,
|
|
@@ -97,7 +278,27 @@ export function ImageViewer({
|
|
|
97
278
|
const styles = StyleSheet.create({
|
|
98
279
|
backdrop: {
|
|
99
280
|
flex: 1,
|
|
100
|
-
backgroundColor: '#000000'
|
|
281
|
+
backgroundColor: '#000000',
|
|
282
|
+
overflow: 'hidden'
|
|
283
|
+
},
|
|
284
|
+
// One screen per photo, laid out left to right in every language (see `restingAt`).
|
|
285
|
+
strip: {
|
|
286
|
+
position: 'absolute',
|
|
287
|
+
top: 0,
|
|
288
|
+
bottom: 0,
|
|
289
|
+
left: 0,
|
|
290
|
+
flexDirection: 'row',
|
|
291
|
+
direction: 'ltr'
|
|
292
|
+
},
|
|
293
|
+
page: {
|
|
294
|
+
height: '100%'
|
|
295
|
+
},
|
|
296
|
+
layer: {
|
|
297
|
+
...StyleSheet.absoluteFillObject
|
|
298
|
+
},
|
|
299
|
+
// Hidden, not removed: it shows again the moment its page stops being the middle one.
|
|
300
|
+
covered: {
|
|
301
|
+
opacity: 0
|
|
101
302
|
},
|
|
102
303
|
center: {
|
|
103
304
|
flexGrow: 1,
|
|
@@ -123,6 +324,11 @@ const styles = StyleSheet.create({
|
|
|
123
324
|
fontSize: fontSize.body,
|
|
124
325
|
fontWeight: '600'
|
|
125
326
|
},
|
|
327
|
+
counter: {
|
|
328
|
+
color: 'rgba(255,255,255,0.8)',
|
|
329
|
+
fontSize: fontSize.meta,
|
|
330
|
+
fontVariant: ['tabular-nums']
|
|
331
|
+
},
|
|
126
332
|
closeButton: {
|
|
127
333
|
width: 36,
|
|
128
334
|
height: 36,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useState","ActivityIndicator","Modal","Platform","Pressable","StyleSheet","Text","View","useWidgetInsets","fontSize","palette","spacing","CloseIcon","ZoomableImage","jsx","_jsx","jsxs","_jsxs","ImageViewer","image","labels","onClose","onOpenExternally","insets","status","setStatus","url","state","visible","transparent","animationType","statusBarTranslucent","onRequestClose","children","style","styles","backdrop","accessibilityViewIsModal","uri","accessibilityLabel","name","onLoad","onError","absoluteFill","color","white","center","failed","failedText","loadFailed","onPress","accessibilityRole","pressed","externalButton","externalLabel","openExternally","header","paddingTop","top","sm","pointerEvents","title","numberOfLines","close","hitSlop","closeButton","size","create","flex","backgroundColor","flexGrow","alignItems","justifyContent","position","left","right","flexDirection","gap","md","paddingHorizontal","lg","paddingBottom","minWidth","body","fontWeight","width","height","borderRadius","opacity","xxl","textAlign","paddingVertical","borderWidth","hairlineWidth","borderColor","meta","OS"],"sourceRoot":"../../../../src","sources":["ui/components/ImageViewer.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useLayoutEffect","useRef","useState","ActivityIndicator","Animated","Image","Modal","Platform","Pressable","StyleSheet","Text","View","formatLabel","useReduceMotion","useWidgetInsets","fontSize","palette","spacing","isRTL","isHttpUrl","CloseIcon","ZoomableImage","jsx","_jsx","jsxs","_jsxs","SWIPE_DISTANCE","SWIPE_VELOCITY","EDGE_RESISTANCE","ImageViewer","gallery","labels","onClose","onOpenExternally","insets","reduceMotion","position","setPosition","of","index","images","image","fellBack","setFellBack","Set","sourceOf","photo","fallbackUrl","has","url","source","status","setStatus","state","fallBack","current","add","previewed","setPreviewed","markPreviewed","width","setWidth","offset","Value","rtl","restingAt","length","swiping","setValue","step","neighbour","side","next","show","swipe","move","dx","resisted","end","vx","far","Math","abs","sign","target","toValue","animation","spring","useNativeDriver","bounciness","speed","timing","duration","start","finished","several","handleAccessibilityAction","event","nativeEvent","actionName","visible","transparent","animationType","statusBarTranslucent","onRequestClose","children","style","styles","backdrop","accessibilityViewIsModal","onLayout","layout","strip","transform","translateX","reverse","map","page","indexOf","centre","uri","near","accessible","accessibilityRole","accessibilityLabel","name","accessibilityValue","text","total","accessibilityActions","onAccessibilityAction","large","layer","color","white","covered","resizeMode","resizeMethod","onLoad","onError","importantForAccessibility","accessibilityIgnoresInvertColors","onSwipe","undefined","absoluteFill","pointerEvents","center","failed","failedText","loadFailed","onPress","pressed","externalButton","externalLabel","openExternally","header","paddingTop","top","sm","title","numberOfLines","counter","accessibilityElementsHidden","close","hitSlop","closeButton","size","create","flex","backgroundColor","overflow","bottom","left","flexDirection","direction","height","absoluteFillObject","opacity","flexGrow","alignItems","justifyContent","right","gap","md","paddingHorizontal","lg","paddingBottom","minWidth","body","fontWeight","meta","fontVariant","borderRadius","xxl","textAlign","paddingVertical","borderWidth","hairlineWidth","borderColor","OS"],"sourceRoot":"../../../../src","sources":["ui/components/ImageViewer.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import { useState } from 'react';
|
|
14
14
|
import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
|
|
15
|
+
import { useRetainedState } from "../hooks/use-retained-state.js";
|
|
15
16
|
import { contrastingTextColor, fontSize, palette, radius, spacing, withAlpha } from "../styles/theme.js";
|
|
16
17
|
|
|
17
18
|
/** 1..5, worst to best — Intercom's five faces. */
|
|
@@ -78,12 +79,14 @@ export function RatingCard({
|
|
|
78
79
|
const [rating, setRating] = useState(initialRating);
|
|
79
80
|
const [reason, setReason] = useState(initialReason);
|
|
80
81
|
const [comment, setComment] = useState(initialComment);
|
|
81
|
-
|
|
82
|
+
// Kept while the thread unmounts the card far off screen; the rating
|
|
83
|
+
// itself is saved on the message.
|
|
84
|
+
const [draft, setDraft] = useRetainedState(`${ratingId}:draft`, '');
|
|
82
85
|
// The comment is optional: "Done" with nothing typed just closes the box —
|
|
83
86
|
// the face (and reason) are already saved. A card that opens with a saved
|
|
84
87
|
// rating starts closed too, so "Done" sticks when the thread is reopened;
|
|
85
88
|
// tapping the chosen face opens the box again.
|
|
86
|
-
const [finished, setFinished] =
|
|
89
|
+
const [finished, setFinished] = useRetainedState(`${ratingId}:finished`, initialRating != null);
|
|
87
90
|
const [pending, setPending] = useState(false);
|
|
88
91
|
const [closedReason, setClosedReason] = useState(initialComment ? 'locked' : null);
|
|
89
92
|
const [failed, setFailed] = useState(false);
|