@appsupportkit/support-sdk 0.1.2 → 0.3.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 (224) hide show
  1. package/lib/commonjs/api.js +17 -2
  2. package/lib/commonjs/api.js.map +1 -1
  3. package/lib/commonjs/components/BottomSheet.js +67 -47
  4. package/lib/commonjs/components/BottomSheet.js.map +1 -1
  5. package/lib/commonjs/components/LauncherButton.js +177 -0
  6. package/lib/commonjs/components/LauncherButton.js.map +1 -0
  7. package/lib/commonjs/components/SupportButton.js +168 -190
  8. package/lib/commonjs/components/SupportButton.js.map +1 -1
  9. package/lib/commonjs/components/icons.js +110 -23
  10. package/lib/commonjs/components/icons.js.map +1 -1
  11. package/lib/commonjs/components/primitives.js +191 -44
  12. package/lib/commonjs/components/primitives.js.map +1 -1
  13. package/lib/commonjs/components/screens/ComposeScreen.js +108 -60
  14. package/lib/commonjs/components/screens/ComposeScreen.js.map +1 -1
  15. package/lib/commonjs/components/screens/HomeScreen.js +221 -118
  16. package/lib/commonjs/components/screens/HomeScreen.js.map +1 -1
  17. package/lib/commonjs/components/screens/LanguageScreen.js +150 -0
  18. package/lib/commonjs/components/screens/LanguageScreen.js.map +1 -0
  19. package/lib/commonjs/components/screens/ThreadScreen.js +237 -111
  20. package/lib/commonjs/components/screens/ThreadScreen.js.map +1 -1
  21. package/lib/commonjs/i18n/index.js +101 -0
  22. package/lib/commonjs/i18n/index.js.map +1 -0
  23. package/lib/commonjs/i18n/languages.js +95 -0
  24. package/lib/commonjs/i18n/languages.js.map +1 -0
  25. package/lib/commonjs/i18n/strings/de.js +72 -0
  26. package/lib/commonjs/i18n/strings/de.js.map +1 -0
  27. package/lib/commonjs/i18n/strings/en.js +88 -0
  28. package/lib/commonjs/i18n/strings/en.js.map +1 -0
  29. package/lib/commonjs/i18n/strings/es.js +72 -0
  30. package/lib/commonjs/i18n/strings/es.js.map +1 -0
  31. package/lib/commonjs/i18n/strings/fr.js +72 -0
  32. package/lib/commonjs/i18n/strings/fr.js.map +1 -0
  33. package/lib/commonjs/i18n/strings/hi.js +72 -0
  34. package/lib/commonjs/i18n/strings/hi.js.map +1 -0
  35. package/lib/commonjs/i18n/strings/it.js +72 -0
  36. package/lib/commonjs/i18n/strings/it.js.map +1 -0
  37. package/lib/commonjs/i18n/strings/ja.js +72 -0
  38. package/lib/commonjs/i18n/strings/ja.js.map +1 -0
  39. package/lib/commonjs/i18n/strings/ko.js +72 -0
  40. package/lib/commonjs/i18n/strings/ko.js.map +1 -0
  41. package/lib/commonjs/i18n/strings/nl.js +72 -0
  42. package/lib/commonjs/i18n/strings/nl.js.map +1 -0
  43. package/lib/commonjs/i18n/strings/pl.js +72 -0
  44. package/lib/commonjs/i18n/strings/pl.js.map +1 -0
  45. package/lib/commonjs/i18n/strings/pt.js +72 -0
  46. package/lib/commonjs/i18n/strings/pt.js.map +1 -0
  47. package/lib/commonjs/i18n/strings/ru.js +72 -0
  48. package/lib/commonjs/i18n/strings/ru.js.map +1 -0
  49. package/lib/commonjs/i18n/strings/tr.js +72 -0
  50. package/lib/commonjs/i18n/strings/tr.js.map +1 -0
  51. package/lib/commonjs/i18n/strings/zh.js +72 -0
  52. package/lib/commonjs/i18n/strings/zh.js.map +1 -0
  53. package/lib/commonjs/index.js +31 -0
  54. package/lib/commonjs/index.js.map +1 -1
  55. package/lib/commonjs/theme.js +136 -17
  56. package/lib/commonjs/theme.js.map +1 -1
  57. package/lib/commonjs/types.js +18 -0
  58. package/lib/commonjs/types.js.map +1 -1
  59. package/lib/commonjs/unread.js +92 -0
  60. package/lib/commonjs/unread.js.map +1 -0
  61. package/lib/commonjs/useSupportThreads.js +296 -0
  62. package/lib/commonjs/useSupportThreads.js.map +1 -0
  63. package/lib/commonjs/utils.js +58 -10
  64. package/lib/commonjs/utils.js.map +1 -1
  65. package/lib/module/api.js +16 -2
  66. package/lib/module/api.js.map +1 -1
  67. package/lib/module/components/BottomSheet.js +68 -48
  68. package/lib/module/components/BottomSheet.js.map +1 -1
  69. package/lib/module/components/LauncherButton.js +172 -0
  70. package/lib/module/components/LauncherButton.js.map +1 -0
  71. package/lib/module/components/SupportButton.js +172 -194
  72. package/lib/module/components/SupportButton.js.map +1 -1
  73. package/lib/module/components/icons.js +107 -22
  74. package/lib/module/components/icons.js.map +1 -1
  75. package/lib/module/components/primitives.js +187 -45
  76. package/lib/module/components/primitives.js.map +1 -1
  77. package/lib/module/components/screens/ComposeScreen.js +114 -64
  78. package/lib/module/components/screens/ComposeScreen.js.map +1 -1
  79. package/lib/module/components/screens/HomeScreen.js +224 -121
  80. package/lib/module/components/screens/HomeScreen.js.map +1 -1
  81. package/lib/module/components/screens/LanguageScreen.js +147 -0
  82. package/lib/module/components/screens/LanguageScreen.js.map +1 -0
  83. package/lib/module/components/screens/ThreadScreen.js +243 -115
  84. package/lib/module/components/screens/ThreadScreen.js.map +1 -1
  85. package/lib/module/i18n/index.js +56 -0
  86. package/lib/module/i18n/index.js.map +1 -0
  87. package/lib/module/i18n/languages.js +88 -0
  88. package/lib/module/i18n/languages.js.map +1 -0
  89. package/lib/module/i18n/strings/de.js +68 -0
  90. package/lib/module/i18n/strings/de.js.map +1 -0
  91. package/lib/module/i18n/strings/en.js +84 -0
  92. package/lib/module/i18n/strings/en.js.map +1 -0
  93. package/lib/module/i18n/strings/es.js +68 -0
  94. package/lib/module/i18n/strings/es.js.map +1 -0
  95. package/lib/module/i18n/strings/fr.js +68 -0
  96. package/lib/module/i18n/strings/fr.js.map +1 -0
  97. package/lib/module/i18n/strings/hi.js +68 -0
  98. package/lib/module/i18n/strings/hi.js.map +1 -0
  99. package/lib/module/i18n/strings/it.js +68 -0
  100. package/lib/module/i18n/strings/it.js.map +1 -0
  101. package/lib/module/i18n/strings/ja.js +68 -0
  102. package/lib/module/i18n/strings/ja.js.map +1 -0
  103. package/lib/module/i18n/strings/ko.js +68 -0
  104. package/lib/module/i18n/strings/ko.js.map +1 -0
  105. package/lib/module/i18n/strings/nl.js +68 -0
  106. package/lib/module/i18n/strings/nl.js.map +1 -0
  107. package/lib/module/i18n/strings/pl.js +68 -0
  108. package/lib/module/i18n/strings/pl.js.map +1 -0
  109. package/lib/module/i18n/strings/pt.js +68 -0
  110. package/lib/module/i18n/strings/pt.js.map +1 -0
  111. package/lib/module/i18n/strings/ru.js +68 -0
  112. package/lib/module/i18n/strings/ru.js.map +1 -0
  113. package/lib/module/i18n/strings/tr.js +68 -0
  114. package/lib/module/i18n/strings/tr.js.map +1 -0
  115. package/lib/module/i18n/strings/zh.js +68 -0
  116. package/lib/module/i18n/strings/zh.js.map +1 -0
  117. package/lib/module/index.js +1 -0
  118. package/lib/module/index.js.map +1 -1
  119. package/lib/module/theme.js +135 -16
  120. package/lib/module/theme.js.map +1 -1
  121. package/lib/module/types.js +18 -0
  122. package/lib/module/types.js.map +1 -1
  123. package/lib/module/unread.js +83 -0
  124. package/lib/module/unread.js.map +1 -0
  125. package/lib/module/useSupportThreads.js +291 -0
  126. package/lib/module/useSupportThreads.js.map +1 -0
  127. package/lib/module/utils.js +55 -10
  128. package/lib/module/utils.js.map +1 -1
  129. package/lib/typescript/api.d.ts +9 -0
  130. package/lib/typescript/api.d.ts.map +1 -1
  131. package/lib/typescript/components/BottomSheet.d.ts.map +1 -1
  132. package/lib/typescript/components/LauncherButton.d.ts +14 -0
  133. package/lib/typescript/components/LauncherButton.d.ts.map +1 -0
  134. package/lib/typescript/components/SupportButton.d.ts +3 -3
  135. package/lib/typescript/components/SupportButton.d.ts.map +1 -1
  136. package/lib/typescript/components/icons.d.ts +18 -2
  137. package/lib/typescript/components/icons.d.ts.map +1 -1
  138. package/lib/typescript/components/primitives.d.ts +42 -7
  139. package/lib/typescript/components/primitives.d.ts.map +1 -1
  140. package/lib/typescript/components/screens/ComposeScreen.d.ts +3 -1
  141. package/lib/typescript/components/screens/ComposeScreen.d.ts.map +1 -1
  142. package/lib/typescript/components/screens/HomeScreen.d.ts +8 -2
  143. package/lib/typescript/components/screens/HomeScreen.d.ts.map +1 -1
  144. package/lib/typescript/components/screens/LanguageScreen.d.ts +30 -0
  145. package/lib/typescript/components/screens/LanguageScreen.d.ts.map +1 -0
  146. package/lib/typescript/components/screens/ThreadScreen.d.ts +3 -1
  147. package/lib/typescript/components/screens/ThreadScreen.d.ts.map +1 -1
  148. package/lib/typescript/i18n/index.d.ts +15 -0
  149. package/lib/typescript/i18n/index.d.ts.map +1 -0
  150. package/lib/typescript/i18n/languages.d.ts +36 -0
  151. package/lib/typescript/i18n/languages.d.ts.map +1 -0
  152. package/lib/typescript/i18n/strings/de.d.ts +3 -0
  153. package/lib/typescript/i18n/strings/de.d.ts.map +1 -0
  154. package/lib/typescript/i18n/strings/en.d.ts +83 -0
  155. package/lib/typescript/i18n/strings/en.d.ts.map +1 -0
  156. package/lib/typescript/i18n/strings/es.d.ts +3 -0
  157. package/lib/typescript/i18n/strings/es.d.ts.map +1 -0
  158. package/lib/typescript/i18n/strings/fr.d.ts +3 -0
  159. package/lib/typescript/i18n/strings/fr.d.ts.map +1 -0
  160. package/lib/typescript/i18n/strings/hi.d.ts +3 -0
  161. package/lib/typescript/i18n/strings/hi.d.ts.map +1 -0
  162. package/lib/typescript/i18n/strings/it.d.ts +3 -0
  163. package/lib/typescript/i18n/strings/it.d.ts.map +1 -0
  164. package/lib/typescript/i18n/strings/ja.d.ts +3 -0
  165. package/lib/typescript/i18n/strings/ja.d.ts.map +1 -0
  166. package/lib/typescript/i18n/strings/ko.d.ts +3 -0
  167. package/lib/typescript/i18n/strings/ko.d.ts.map +1 -0
  168. package/lib/typescript/i18n/strings/nl.d.ts +3 -0
  169. package/lib/typescript/i18n/strings/nl.d.ts.map +1 -0
  170. package/lib/typescript/i18n/strings/pl.d.ts +3 -0
  171. package/lib/typescript/i18n/strings/pl.d.ts.map +1 -0
  172. package/lib/typescript/i18n/strings/pt.d.ts +3 -0
  173. package/lib/typescript/i18n/strings/pt.d.ts.map +1 -0
  174. package/lib/typescript/i18n/strings/ru.d.ts +3 -0
  175. package/lib/typescript/i18n/strings/ru.d.ts.map +1 -0
  176. package/lib/typescript/i18n/strings/tr.d.ts +3 -0
  177. package/lib/typescript/i18n/strings/tr.d.ts.map +1 -0
  178. package/lib/typescript/i18n/strings/zh.d.ts +3 -0
  179. package/lib/typescript/i18n/strings/zh.d.ts.map +1 -0
  180. package/lib/typescript/index.d.ts +2 -1
  181. package/lib/typescript/index.d.ts.map +1 -1
  182. package/lib/typescript/theme.d.ts +44 -3
  183. package/lib/typescript/theme.d.ts.map +1 -1
  184. package/lib/typescript/types.d.ts +54 -2
  185. package/lib/typescript/types.d.ts.map +1 -1
  186. package/lib/typescript/unread.d.ts +22 -0
  187. package/lib/typescript/unread.d.ts.map +1 -0
  188. package/lib/typescript/useSupportThreads.d.ts +38 -0
  189. package/lib/typescript/useSupportThreads.d.ts.map +1 -0
  190. package/lib/typescript/utils.d.ts +8 -2
  191. package/lib/typescript/utils.d.ts.map +1 -1
  192. package/package.json +3 -3
  193. package/src/api.ts +24 -1
  194. package/src/components/BottomSheet.tsx +61 -43
  195. package/src/components/LauncherButton.tsx +217 -0
  196. package/src/components/SupportButton.tsx +195 -210
  197. package/src/components/icons.tsx +113 -19
  198. package/src/components/primitives.tsx +230 -39
  199. package/src/components/screens/ComposeScreen.tsx +129 -63
  200. package/src/components/screens/HomeScreen.tsx +230 -120
  201. package/src/components/screens/LanguageScreen.tsx +172 -0
  202. package/src/components/screens/ThreadScreen.tsx +319 -122
  203. package/src/i18n/index.ts +81 -0
  204. package/src/i18n/languages.ts +106 -0
  205. package/src/i18n/strings/de.ts +78 -0
  206. package/src/i18n/strings/en.ts +94 -0
  207. package/src/i18n/strings/es.ts +77 -0
  208. package/src/i18n/strings/fr.ts +78 -0
  209. package/src/i18n/strings/hi.ts +77 -0
  210. package/src/i18n/strings/it.ts +77 -0
  211. package/src/i18n/strings/ja.ts +77 -0
  212. package/src/i18n/strings/ko.ts +76 -0
  213. package/src/i18n/strings/nl.ts +77 -0
  214. package/src/i18n/strings/pl.ts +77 -0
  215. package/src/i18n/strings/pt.ts +77 -0
  216. package/src/i18n/strings/ru.ts +77 -0
  217. package/src/i18n/strings/tr.ts +77 -0
  218. package/src/i18n/strings/zh.ts +75 -0
  219. package/src/index.tsx +9 -0
  220. package/src/theme.ts +165 -18
  221. package/src/types.ts +56 -2
  222. package/src/unread.ts +91 -0
  223. package/src/useSupportThreads.ts +392 -0
  224. package/src/utils.ts +48 -10
@@ -1,14 +1,138 @@
1
1
  "use strict";
2
2
 
3
- import { useEffect, useRef, useState } from 'react';
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { KeyboardAvoidingView, Platform, ScrollView, Text, TextInput, View } from 'react-native';
5
5
  import { USER_MESSAGE_MAX, USER_MESSAGE_MIN } from '../../types';
6
- import { formatDate, relativeTime } from '../../utils';
7
- import { Chevron } from '../icons';
8
- import { PressableRow, PrimaryButton, StatusIndicator, textStyles, TypeChipView } from '../primitives';
6
+ import { dayLabel, formatDate, formatTime, isSameDay, relativeTime } from '../../utils';
7
+ import { ArrowUpIcon, Chevron } from '../icons';
8
+ import { IconButton, StatusIndicator, textStyles, TypeChipView } from '../primitives';
9
+
10
+ /** Consecutive messages from one sender inside this window form a group. */
9
11
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
12
+ const GROUP_WINDOW_MS = 5 * 60 * 1000;
13
+ /** The counter only appears once the limit is actually in play. */
14
+ const COUNTER_VISIBLE_FROM = USER_MESSAGE_MAX - 60;
15
+ function buildRows(messages, unreadCount, strings) {
16
+ // Unread messages are always the newest admin ones, so the divider goes
17
+ // above the Nth-from-last admin message.
18
+ let remaining = unreadCount;
19
+ let firstUnreadId = null;
20
+ for (let i = messages.length - 1; i >= 0 && remaining > 0; i -= 1) {
21
+ const candidate = messages[i];
22
+ if (candidate === undefined || candidate.sender !== 'admin') continue;
23
+ remaining -= 1;
24
+ firstUnreadId = candidate.id;
25
+ }
26
+ return messages.map((message, i) => {
27
+ const previous = i > 0 ? messages[i - 1] ?? null : null;
28
+ const next = i < messages.length - 1 ? messages[i + 1] ?? null : null;
29
+ // Grouped by sender alone. Two replies from two different admins are two
30
+ // messages from "Support" as far as this side is concerned, so breaking
31
+ // the group between them would be a visible seam with no visible cause.
32
+ const withinGroup = (a, b) => a !== null && a.sender === b.sender && Math.abs(Date.parse(b.created_at) - Date.parse(a.created_at)) < GROUP_WINDOW_MS;
33
+ const day = previous === null || !isSameDay(previous.created_at, message.created_at) ? dayLabel(message.created_at, strings) : null;
34
+ const startsUnread = message.id === firstUnreadId;
35
+ return {
36
+ message,
37
+ // A separator always breaks a group.
38
+ firstInGroup: day !== null || startsUnread || !withinGroup(previous, message),
39
+ lastInGroup: next === null || next.id === firstUnreadId || !isSameDay(next.created_at, message.created_at) || !withinGroup(next, message),
40
+ day,
41
+ startsUnread
42
+ };
43
+ });
44
+ }
45
+ function Separator({
46
+ label,
47
+ theme,
48
+ tone = 'muted'
49
+ }) {
50
+ const color = tone === 'accent' ? theme.colors.accent : theme.colors.textTertiary;
51
+ return /*#__PURE__*/_jsxs(View, {
52
+ style: {
53
+ flexDirection: 'row',
54
+ alignItems: 'center',
55
+ gap: 10,
56
+ paddingVertical: 6
57
+ },
58
+ children: [/*#__PURE__*/_jsx(View, {
59
+ style: {
60
+ flex: 1,
61
+ height: 1,
62
+ backgroundColor: tone === 'accent' ? theme.colors.accentMuted : theme.colors.border
63
+ }
64
+ }), /*#__PURE__*/_jsx(Text, {
65
+ style: {
66
+ fontSize: 11,
67
+ fontWeight: '600',
68
+ letterSpacing: 0.3,
69
+ color
70
+ },
71
+ children: label
72
+ }), /*#__PURE__*/_jsx(View, {
73
+ style: {
74
+ flex: 1,
75
+ height: 1,
76
+ backgroundColor: tone === 'accent' ? theme.colors.accentMuted : theme.colors.border
77
+ }
78
+ })]
79
+ });
80
+ }
81
+ function MessageBubble({
82
+ row,
83
+ theme,
84
+ strings
85
+ }) {
86
+ const {
87
+ message,
88
+ firstInGroup,
89
+ lastInGroup
90
+ } = row;
91
+ const own = message.sender === 'user';
92
+ const round = theme.radii.bubble;
93
+ const tight = theme.radii.bubbleTail;
94
+ return /*#__PURE__*/_jsxs(View, {
95
+ style: {
96
+ maxWidth: '86%',
97
+ alignSelf: own ? 'flex-end' : 'flex-start',
98
+ alignItems: own ? 'flex-end' : 'flex-start',
99
+ marginTop: firstInGroup ? 10 : 2,
100
+ gap: 4
101
+ },
102
+ children: [!own && firstInGroup && /*#__PURE__*/_jsx(Text, {
103
+ style: [textStyles.meta(theme), {
104
+ paddingHorizontal: 4
105
+ }],
106
+ children: strings.t('thread.support')
107
+ }), /*#__PURE__*/_jsx(View, {
108
+ style: {
109
+ paddingHorizontal: 14,
110
+ paddingVertical: 10,
111
+ backgroundColor: own ? theme.colors.accent : theme.colors.surface,
112
+ borderWidth: own ? 0 : 1,
113
+ borderColor: theme.colors.border,
114
+ borderTopLeftRadius: own || firstInGroup ? round : tight,
115
+ borderBottomLeftRadius: own || lastInGroup ? round : tight,
116
+ borderTopRightRadius: !own || firstInGroup ? round : tight,
117
+ borderBottomRightRadius: !own || lastInGroup ? round : tight
118
+ },
119
+ children: /*#__PURE__*/_jsx(Text, {
120
+ style: [textStyles.body(theme), own && {
121
+ color: theme.colors.accentForeground
122
+ }],
123
+ children: message.body
124
+ })
125
+ }), lastInGroup && /*#__PURE__*/_jsx(Text, {
126
+ style: [textStyles.meta(theme), {
127
+ paddingHorizontal: 4
128
+ }],
129
+ children: message.translation_pending ? strings.t('thread.translating') : formatTime(message.created_at, strings)
130
+ })]
131
+ });
132
+ }
10
133
  export function ThreadScreen({
11
134
  theme,
135
+ strings,
12
136
  thread,
13
137
  onBack,
14
138
  onSend
@@ -17,9 +141,14 @@ export function ThreadScreen({
17
141
  const [sending, setSending] = useState(false);
18
142
  const [failedMessage, setFailedMessage] = useState(null);
19
143
  const scrollRef = useRef(null);
144
+ // Captured once: opening the thread marks it read within a tick, but the
145
+ // "New" divider should stay put while the user is reading.
146
+ const [unreadOnOpen] = useState(thread.unread_count);
20
147
  const resolved = thread.status === 'resolved';
21
148
  const trimmed = draft.trim();
22
149
  const valid = trimmed.length >= USER_MESSAGE_MIN && trimmed.length <= USER_MESSAGE_MAX;
150
+ const tooShort = trimmed.length > 0 && trimmed.length < USER_MESSAGE_MIN;
151
+ const rows = useMemo(() => buildRows(thread.messages, unreadOnOpen, strings), [thread.messages, unreadOnOpen, strings]);
23
152
  useEffect(() => {
24
153
  scrollRef.current?.scrollToEnd({
25
154
  animated: false
@@ -42,20 +171,17 @@ export function ThreadScreen({
42
171
  style: {
43
172
  flexDirection: 'row',
44
173
  alignItems: 'center',
45
- gap: 8,
174
+ gap: 10,
46
175
  paddingHorizontal: 12,
47
- paddingBottom: 10,
176
+ paddingBottom: 12,
48
177
  borderBottomWidth: 1,
49
178
  borderBottomColor: theme.colors.border
50
179
  },
51
- children: [/*#__PURE__*/_jsx(PressableRow, {
180
+ children: [/*#__PURE__*/_jsx(IconButton, {
52
181
  onPress: onBack,
53
182
  theme: theme,
54
- accessibilityLabel: "Back",
55
- style: {
56
- padding: 6,
57
- borderRadius: theme.radii.control
58
- },
183
+ accessibilityLabel: strings.t('compose.back'),
184
+ size: 32,
59
185
  children: /*#__PURE__*/_jsx(Chevron, {
60
186
  color: theme.colors.textSecondary,
61
187
  direction: "left",
@@ -63,15 +189,17 @@ export function ThreadScreen({
63
189
  })
64
190
  }), /*#__PURE__*/_jsx(TypeChipView, {
65
191
  type: thread.type,
66
- theme: theme
192
+ theme: theme,
193
+ strings: strings
67
194
  }), /*#__PURE__*/_jsx(StatusIndicator, {
68
195
  status: thread.status,
69
- theme: theme
196
+ theme: theme,
197
+ strings: strings
70
198
  }), /*#__PURE__*/_jsx(Text, {
71
199
  style: [textStyles.meta(theme), {
72
200
  marginLeft: 'auto'
73
201
  }],
74
- children: relativeTime(thread.created_at)
202
+ children: relativeTime(thread.created_at, strings)
75
203
  })]
76
204
  }), /*#__PURE__*/_jsxs(ScrollView, {
77
205
  ref: scrollRef,
@@ -79,127 +207,127 @@ export function ThreadScreen({
79
207
  flex: 1
80
208
  },
81
209
  contentContainerStyle: {
82
- padding: 16,
83
- gap: 10
210
+ paddingHorizontal: 16,
211
+ paddingVertical: 12
84
212
  },
85
- children: [thread.messages.map(m => {
86
- const own = m.sender === 'user';
87
- return /*#__PURE__*/_jsxs(View, {
88
- style: {
89
- maxWidth: '85%',
90
- alignSelf: own ? 'flex-end' : 'flex-start',
91
- alignItems: own ? 'flex-end' : 'flex-start',
92
- gap: 3
93
- },
94
- children: [!own && /*#__PURE__*/_jsx(Text, {
95
- style: textStyles.meta(theme),
96
- children: m.admin_name ?? 'Support'
97
- }), /*#__PURE__*/_jsx(View, {
98
- style: {
99
- borderRadius: theme.radii.card,
100
- paddingHorizontal: 12,
101
- paddingVertical: 8,
102
- backgroundColor: own ? theme.colors.accentMuted : theme.colors.surface,
103
- borderWidth: own ? 0 : 1,
104
- borderColor: theme.colors.border
105
- },
106
- children: /*#__PURE__*/_jsx(Text, {
107
- style: textStyles.body(theme),
108
- children: m.body
109
- })
110
- }), /*#__PURE__*/_jsx(Text, {
111
- style: textStyles.meta(theme),
112
- children: relativeTime(m.created_at)
113
- })]
114
- }, m.id);
115
- }), resolved && thread.resolved_at && /*#__PURE__*/_jsxs(View, {
213
+ keyboardShouldPersistTaps: "handled",
214
+ onContentSizeChange: () => scrollRef.current?.scrollToEnd({
215
+ animated: false
216
+ }),
217
+ children: [rows.map(row => /*#__PURE__*/_jsxs(View, {
218
+ children: [row.day !== null && /*#__PURE__*/_jsx(Separator, {
219
+ label: row.day,
220
+ theme: theme
221
+ }), row.startsUnread && /*#__PURE__*/_jsx(Separator, {
222
+ label: strings.t('thread.new'),
223
+ theme: theme,
224
+ tone: "accent"
225
+ }), /*#__PURE__*/_jsx(MessageBubble, {
226
+ row: row,
227
+ theme: theme,
228
+ strings: strings
229
+ })]
230
+ }, row.message.id)), resolved && thread.resolved_at !== null && /*#__PURE__*/_jsx(View, {
116
231
  style: {
117
- flexDirection: 'row',
118
- alignItems: 'center',
119
- gap: 10,
120
- marginVertical: 6
232
+ marginTop: 16
121
233
  },
122
- children: [/*#__PURE__*/_jsx(View, {
123
- style: {
124
- flex: 1,
125
- height: 1,
126
- backgroundColor: theme.colors.border
127
- }
128
- }), /*#__PURE__*/_jsxs(Text, {
129
- style: textStyles.meta(theme),
130
- children: ["Resolved by ", thread.resolved_by_name ?? 'support', " \xB7", ' ', formatDate(thread.resolved_at)]
131
- }), /*#__PURE__*/_jsx(View, {
132
- style: {
133
- flex: 1,
134
- height: 1,
135
- backgroundColor: theme.colors.border
136
- }
137
- })]
234
+ children: /*#__PURE__*/_jsx(Separator, {
235
+ label: strings.t('thread.resolvedAt', {
236
+ date: formatDate(thread.resolved_at, strings)
237
+ }),
238
+ theme: theme
239
+ })
138
240
  })]
139
241
  }), /*#__PURE__*/_jsx(View, {
140
242
  style: {
141
243
  borderTopWidth: 1,
142
244
  borderTopColor: theme.colors.border,
143
245
  paddingHorizontal: 16,
144
- paddingTop: 10
246
+ paddingTop: 10,
247
+ paddingBottom: 4
145
248
  },
146
- children: resolved ? /*#__PURE__*/_jsx(Text, {
147
- style: [textStyles.meta(theme), {
148
- textAlign: 'center',
149
- paddingVertical: 8
150
- }],
151
- children: "This thread is resolved and read-only"
249
+ children: resolved ? /*#__PURE__*/_jsx(View, {
250
+ style: {
251
+ alignItems: 'center',
252
+ paddingVertical: 10,
253
+ borderRadius: theme.radii.control,
254
+ backgroundColor: theme.colors.surface
255
+ },
256
+ children: /*#__PURE__*/_jsx(Text, {
257
+ style: textStyles.secondary(theme),
258
+ children: strings.t('thread.readOnly')
259
+ })
152
260
  }) : /*#__PURE__*/_jsxs(_Fragment, {
153
- children: [/*#__PURE__*/_jsx(TextInput, {
154
- value: draft,
155
- onChangeText: v => {
156
- setDraft(v);
157
- setFailedMessage(null);
158
- },
159
- multiline: true,
160
- placeholder: "Reply",
161
- placeholderTextColor: theme.colors.textTertiary,
261
+ children: [/*#__PURE__*/_jsxs(View, {
162
262
  style: {
163
- minHeight: 60,
164
- maxHeight: 120,
165
- borderWidth: 1,
166
- borderColor: theme.colors.border,
167
- borderRadius: theme.radii.control,
168
- backgroundColor: theme.colors.surface,
169
- color: theme.colors.textPrimary,
170
- fontSize: 14,
171
- lineHeight: 20,
172
- padding: 10,
173
- textAlignVertical: 'top'
174
- }
175
- }), /*#__PURE__*/_jsxs(View, {
263
+ flexDirection: 'row',
264
+ alignItems: 'flex-end',
265
+ gap: 10
266
+ },
267
+ children: [/*#__PURE__*/_jsx(TextInput, {
268
+ value: draft,
269
+ onChangeText: v => {
270
+ setDraft(v);
271
+ setFailedMessage(null);
272
+ },
273
+ multiline: true,
274
+ editable: !sending,
275
+ placeholder: strings.t('thread.placeholder'),
276
+ placeholderTextColor: theme.colors.textTertiary,
277
+ style: {
278
+ flex: 1,
279
+ minHeight: 44,
280
+ maxHeight: 120,
281
+ borderWidth: 1,
282
+ borderColor: theme.colors.border,
283
+ borderRadius: theme.radii.cardLg,
284
+ backgroundColor: theme.colors.surface,
285
+ color: theme.colors.textPrimary,
286
+ fontSize: 15,
287
+ lineHeight: 20,
288
+ paddingHorizontal: 14,
289
+ paddingTop: 12,
290
+ paddingBottom: 12,
291
+ textAlignVertical: 'top'
292
+ }
293
+ }), /*#__PURE__*/_jsx(IconButton, {
294
+ onPress: handleSend,
295
+ theme: theme,
296
+ tone: "accent",
297
+ size: 44,
298
+ disabled: !valid || sending,
299
+ accessibilityLabel: strings.t(sending ? 'thread.sendingA11y' : 'thread.sendA11y'),
300
+ children: /*#__PURE__*/_jsx(ArrowUpIcon, {
301
+ color: theme.colors.accentForeground,
302
+ size: 19
303
+ })
304
+ })]
305
+ }), (tooShort || draft.length >= COUNTER_VISIBLE_FROM || failedMessage !== null) && /*#__PURE__*/_jsxs(View, {
176
306
  style: {
177
307
  flexDirection: 'row',
178
308
  alignItems: 'center',
179
- gap: 12,
180
- paddingVertical: 8
309
+ gap: 10,
310
+ paddingTop: 8,
311
+ paddingHorizontal: 4
181
312
  },
182
- children: [/*#__PURE__*/_jsxs(Text, {
183
- style: [textStyles.meta(theme), draft.length > USER_MESSAGE_MAX && {
184
- color: theme.colors.statusDanger
185
- }],
186
- children: [draft.length, "/", USER_MESSAGE_MAX]
187
- }), failedMessage !== null && /*#__PURE__*/_jsx(Text, {
313
+ children: [failedMessage !== null ? /*#__PURE__*/_jsx(Text, {
188
314
  style: {
189
- fontSize: 11,
315
+ fontSize: 12,
190
316
  color: theme.colors.statusDanger
191
317
  },
192
318
  children: failedMessage
193
- }), /*#__PURE__*/_jsx(View, {
194
- style: {
195
- marginLeft: 'auto'
196
- },
197
- children: /*#__PURE__*/_jsx(PrimaryButton, {
198
- label: sending ? 'Sending…' : 'Send',
199
- onPress: handleSend,
200
- disabled: !valid || sending,
201
- theme: theme
319
+ }) : tooShort ? /*#__PURE__*/_jsx(Text, {
320
+ style: textStyles.meta(theme),
321
+ children: strings.t('compose.minChars', {
322
+ count: USER_MESSAGE_MIN
202
323
  })
324
+ }) : null, draft.length >= COUNTER_VISIBLE_FROM && /*#__PURE__*/_jsxs(Text, {
325
+ style: [textStyles.meta(theme), {
326
+ marginLeft: 'auto'
327
+ }, draft.length > USER_MESSAGE_MAX && {
328
+ color: theme.colors.statusDanger
329
+ }],
330
+ children: [draft.length, "/", USER_MESSAGE_MAX]
203
331
  })]
204
332
  })]
205
333
  })
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useState","KeyboardAvoidingView","Platform","ScrollView","Text","TextInput","View","USER_MESSAGE_MAX","USER_MESSAGE_MIN","formatDate","relativeTime","Chevron","PressableRow","PrimaryButton","StatusIndicator","textStyles","TypeChipView","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ThreadScreen","theme","thread","onBack","onSend","draft","setDraft","sending","setSending","failedMessage","setFailedMessage","scrollRef","resolved","status","trimmed","trim","valid","length","current","scrollToEnd","animated","messages","handleSend","errorMessage","style","flex","behavior","OS","undefined","children","flexDirection","alignItems","gap","paddingHorizontal","paddingBottom","borderBottomWidth","borderBottomColor","colors","border","onPress","accessibilityLabel","padding","borderRadius","radii","control","color","textSecondary","direction","size","type","meta","marginLeft","created_at","ref","contentContainerStyle","map","m","own","sender","maxWidth","alignSelf","admin_name","card","paddingVertical","backgroundColor","accentMuted","surface","borderWidth","borderColor","body","id","resolved_at","marginVertical","height","resolved_by_name","borderTopWidth","borderTopColor","paddingTop","textAlign","value","onChangeText","v","multiline","placeholder","placeholderTextColor","textTertiary","minHeight","maxHeight","textPrimary","fontSize","lineHeight","textAlignVertical","statusDanger","label","disabled"],"sourceRoot":"../../../../src","sources":["components/screens/ThreadScreen.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useState","KeyboardAvoidingView","Platform","ScrollView","Text","TextInput","View","USER_MESSAGE_MAX","USER_MESSAGE_MIN","dayLabel","formatDate","formatTime","isSameDay","relativeTime","ArrowUpIcon","Chevron","IconButton","StatusIndicator","textStyles","TypeChipView","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","GROUP_WINDOW_MS","COUNTER_VISIBLE_FROM","buildRows","messages","unreadCount","strings","remaining","firstUnreadId","i","length","candidate","undefined","sender","id","map","message","previous","next","withinGroup","a","b","Math","abs","Date","parse","created_at","day","startsUnread","firstInGroup","lastInGroup","Separator","label","theme","tone","color","colors","accent","textTertiary","style","flexDirection","alignItems","gap","paddingVertical","children","flex","height","backgroundColor","accentMuted","border","fontSize","fontWeight","letterSpacing","MessageBubble","row","own","round","radii","bubble","tight","bubbleTail","maxWidth","alignSelf","marginTop","meta","paddingHorizontal","t","surface","borderWidth","borderColor","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","body","accentForeground","translation_pending","ThreadScreen","thread","onBack","onSend","draft","setDraft","sending","setSending","failedMessage","setFailedMessage","scrollRef","unreadOnOpen","unread_count","resolved","status","trimmed","trim","valid","tooShort","rows","current","scrollToEnd","animated","handleSend","errorMessage","behavior","OS","paddingBottom","borderBottomWidth","borderBottomColor","onPress","accessibilityLabel","size","textSecondary","direction","type","marginLeft","ref","contentContainerStyle","keyboardShouldPersistTaps","onContentSizeChange","resolved_at","date","borderTopWidth","borderTopColor","paddingTop","borderRadius","control","secondary","value","onChangeText","v","multiline","editable","placeholder","placeholderTextColor","minHeight","maxHeight","cardLg","textPrimary","lineHeight","textAlignVertical","disabled","statusDanger","count"],"sourceRoot":"../../../../src","sources":["components/screens/ThreadScreen.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ // UI copy, in the user's language.
4
+ //
5
+ // Message bodies are translated by the backend at write time; the sheet's own
6
+ // chrome is not — it is a fixed set of strings that never changes, so it ships
7
+ // as a bundled table. A model call to render the word "Send" would be absurd,
8
+ // and it would also mean the SDK couldn't draw its own UI offline.
9
+
10
+ import { DEFAULT_LANGUAGE } from './languages';
11
+ import { en } from './strings/en';
12
+ import { de } from './strings/de';
13
+ import { es } from './strings/es';
14
+ import { fr } from './strings/fr';
15
+ import { hi } from './strings/hi';
16
+ import { it } from './strings/it';
17
+ import { ja } from './strings/ja';
18
+ import { ko } from './strings/ko';
19
+ import { nl } from './strings/nl';
20
+ import { pl } from './strings/pl';
21
+ import { pt } from './strings/pt';
22
+ import { ru } from './strings/ru';
23
+ import { tr } from './strings/tr';
24
+ import { zh } from './strings/zh';
25
+ const TABLES = {
26
+ en,
27
+ es,
28
+ fr,
29
+ de,
30
+ nl,
31
+ pt,
32
+ it,
33
+ pl,
34
+ tr,
35
+ ru,
36
+ ja,
37
+ ko,
38
+ zh,
39
+ hi
40
+ };
41
+
42
+ /** Fills `{name}` placeholders. Unknown tokens are left alone, not blanked. */
43
+ function format(template, vars) {
44
+ if (!vars) return template;
45
+ return template.replace(/\{(\w+)\}/g, (match, key) => key in vars ? String(vars[key]) : match);
46
+ }
47
+ export function createTranslator(language) {
48
+ const table = TABLES[language] ?? TABLES[DEFAULT_LANGUAGE];
49
+ return {
50
+ language,
51
+ locale: language,
52
+ t: (key, vars) => format(table[key] ?? en[key], vars)
53
+ };
54
+ }
55
+ export { asLanguage, baseLanguage, DEFAULT_LANGUAGE, deviceLanguage, isSupportedLanguage, LANGUAGE_LABELS, SUPPORTED_LANGUAGES } from './languages';
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_LANGUAGE","en","de","es","fr","hi","it","ja","ko","nl","pl","pt","ru","tr","zh","TABLES","format","template","vars","replace","match","key","String","createTranslator","language","table","locale","t","asLanguage","baseLanguage","deviceLanguage","isSupportedLanguage","LANGUAGE_LABELS","SUPPORTED_LANGUAGES"],"sourceRoot":"../../../src","sources":["i18n/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,gBAAgB,QAAuB,aAAa;AAC7D,SAASC,EAAE,QAA0C,cAAc;AACnE,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AACjC,SAASC,EAAE,QAAQ,cAAc;AAEjC,MAAMC,MAAqC,GAAG;EAC5Cd,EAAE;EACFE,EAAE;EACFC,EAAE;EACFF,EAAE;EACFO,EAAE;EACFE,EAAE;EACFL,EAAE;EACFI,EAAE;EACFG,EAAE;EACFD,EAAE;EACFL,EAAE;EACFC,EAAE;EACFM,EAAE;EACFT;AACF,CAAC;;AAED;AACA,SAASW,MAAMA,CACbC,QAAgB,EAChBC,IAAsC,EAC9B;EACR,IAAI,CAACA,IAAI,EAAE,OAAOD,QAAQ;EAC1B,OAAOA,QAAQ,CAACE,OAAO,CAAC,YAAY,EAAE,CAACC,KAAK,EAAEC,GAAW,KACvDA,GAAG,IAAIH,IAAI,GAAGI,MAAM,CAACJ,IAAI,CAACG,GAAG,CAAC,CAAC,GAAGD,KACpC,CAAC;AACH;AAYA,OAAO,SAASG,gBAAgBA,CAACC,QAAkB,EAAc;EAC/D,MAAMC,KAAK,GAAGV,MAAM,CAACS,QAAQ,CAAC,IAAIT,MAAM,CAACf,gBAAgB,CAAC;EAC1D,OAAO;IACLwB,QAAQ;IACRE,MAAM,EAAEF,QAAQ;IAChBG,CAAC,EAAEA,CAACN,GAAG,EAAEH,IAAI,KAAKF,MAAM,CAACS,KAAK,CAACJ,GAAG,CAAC,IAAIpB,EAAE,CAACoB,GAAG,CAAC,EAAEH,IAAI;EACtD,CAAC;AACH;AAGA,SACEU,UAAU,EACVC,YAAY,EACZ7B,gBAAgB,EAChB8B,cAAc,EACdC,mBAAmB,EACnBC,eAAe,EACfC,mBAAmB,QAEd,aAAa","ignoreList":[]}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, Platform } from 'react-native';
4
+
5
+ /**
6
+ * The languages the picker offers.
7
+ *
8
+ * Kept in sync by hand with supabase/functions/_shared/languages.ts — the two
9
+ * run in different runtimes and share no build step. Adding one means adding a
10
+ * string table here too, which the compiler enforces.
11
+ *
12
+ * Right-to-left languages are deliberately absent for now: React Native only
13
+ * flips layout direction through I18nManager, which needs an app restart the
14
+ * SDK has no business triggering inside a host app.
15
+ */
16
+ export const SUPPORTED_LANGUAGES = ['en', 'es', 'fr', 'de', 'nl', 'pt', 'it', 'pl', 'tr', 'ru', 'ja', 'ko', 'zh', 'hi'];
17
+ /** The language the support team reads and writes. */
18
+ export const DEFAULT_LANGUAGE = 'en';
19
+
20
+ /**
21
+ * Endonyms — a language is listed the way its own speakers write it, so the
22
+ * picker is readable to someone who can't read the current UI language.
23
+ */
24
+ export const LANGUAGE_LABELS = {
25
+ en: 'English',
26
+ es: 'Español',
27
+ fr: 'Français',
28
+ de: 'Deutsch',
29
+ nl: 'Nederlands',
30
+ pt: 'Português',
31
+ it: 'Italiano',
32
+ pl: 'Polski',
33
+ tr: 'Türkçe',
34
+ ru: 'Русский',
35
+ ja: '日本語',
36
+ ko: '한국어',
37
+ zh: '简体中文',
38
+ hi: 'हिन्दी'
39
+ };
40
+
41
+ /** Strips a region qualifier: "pt-BR" → "pt". */
42
+ export function baseLanguage(code) {
43
+ return code.trim().toLowerCase().split(/[-_]/)[0] ?? '';
44
+ }
45
+ export function isSupportedLanguage(code) {
46
+ return SUPPORTED_LANGUAGES.includes(baseLanguage(code));
47
+ }
48
+
49
+ /** Narrows any string to a supported language, or null. */
50
+ export function asLanguage(code) {
51
+ if (!code) return null;
52
+ const base = baseLanguage(code);
53
+ return isSupportedLanguage(base) ? base : null;
54
+ }
55
+ function rawDeviceLocale() {
56
+ try {
57
+ if (Platform.OS === 'ios') {
58
+ const settings = NativeModules.SettingsManager?.settings;
59
+ const locale = settings?.AppleLocale ?? settings?.AppleLanguages?.[0];
60
+ if (typeof locale === 'string') return locale;
61
+ } else {
62
+ const locale = NativeModules.I18nManager?.localeIdentifier;
63
+ if (typeof locale === 'string') return locale;
64
+ }
65
+ } catch {
66
+ // Fall through to Intl.
67
+ }
68
+ try {
69
+ return Intl.DateTimeFormat().resolvedOptions().locale;
70
+ } catch {
71
+ return null;
72
+ }
73
+ }
74
+
75
+ /**
76
+ * The device's language, if the SDK supports it.
77
+ *
78
+ * Used to pre-select a row in the picker and to render the picker itself, so
79
+ * the one screen shown before we know the user's choice is already in a
80
+ * language they probably read. Deliberately not used to *skip* the picker: a
81
+ * device set to French says nothing about which language its owner wants to
82
+ * write support messages in.
83
+ */
84
+ export function deviceLanguage() {
85
+ const locale = rawDeviceLocale();
86
+ return locale === null ? null : asLanguage(locale);
87
+ }
88
+ //# sourceMappingURL=languages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","SUPPORTED_LANGUAGES","DEFAULT_LANGUAGE","LANGUAGE_LABELS","en","es","fr","de","nl","pt","it","pl","tr","ru","ja","ko","zh","hi","baseLanguage","code","trim","toLowerCase","split","isSupportedLanguage","includes","asLanguage","base","rawDeviceLocale","OS","settings","SettingsManager","locale","AppleLocale","AppleLanguages","I18nManager","localeIdentifier","Intl","DateTimeFormat","resolvedOptions","deviceLanguage"],"sourceRoot":"../../../src","sources":["i18n/languages.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG,CACjC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,CACI;AAIV;AACA,OAAO,MAAMC,gBAA0B,GAAG,IAAI;;AAE9C;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAyC,GAAG;EACvDC,EAAE,EAAE,SAAS;EACbC,EAAE,EAAE,SAAS;EACbC,EAAE,EAAE,UAAU;EACdC,EAAE,EAAE,SAAS;EACbC,EAAE,EAAE,YAAY;EAChBC,EAAE,EAAE,WAAW;EACfC,EAAE,EAAE,UAAU;EACdC,EAAE,EAAE,QAAQ;EACZC,EAAE,EAAE,QAAQ;EACZC,EAAE,EAAE,SAAS;EACbC,EAAE,EAAE,KAAK;EACTC,EAAE,EAAE,KAAK;EACTC,EAAE,EAAE,MAAM;EACVC,EAAE,EAAE;AACN,CAAC;;AAED;AACA,OAAO,SAASC,YAAYA,CAACC,IAAY,EAAU;EACjD,OAAOA,IAAI,CAACC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACzD;AAEA,OAAO,SAASC,mBAAmBA,CAACJ,IAAY,EAAoB;EAClE,OAAQlB,mBAAmB,CAAuBuB,QAAQ,CAACN,YAAY,CAACC,IAAI,CAAC,CAAC;AAChF;;AAEA;AACA,OAAO,SAASM,UAAUA,CAACN,IAA+B,EAAmB;EAC3E,IAAI,CAACA,IAAI,EAAE,OAAO,IAAI;EACtB,MAAMO,IAAI,GAAGR,YAAY,CAACC,IAAI,CAAC;EAC/B,OAAOI,mBAAmB,CAACG,IAAI,CAAC,GAAGA,IAAI,GAAG,IAAI;AAChD;AAEA,SAASC,eAAeA,CAAA,EAAkB;EACxC,IAAI;IACF,IAAI3B,QAAQ,CAAC4B,EAAE,KAAK,KAAK,EAAE;MACzB,MAAMC,QAAQ,GAAG9B,aAAa,CAAC+B,eAAe,EAAED,QAAQ;MACxD,MAAME,MAAM,GAAGF,QAAQ,EAAEG,WAAW,IAAIH,QAAQ,EAAEI,cAAc,GAAG,CAAC,CAAC;MACrE,IAAI,OAAOF,MAAM,KAAK,QAAQ,EAAE,OAAOA,MAAM;IAC/C,CAAC,MAAM;MACL,MAAMA,MAAM,GAAGhC,aAAa,CAACmC,WAAW,EAAEC,gBAAgB;MAC1D,IAAI,OAAOJ,MAAM,KAAK,QAAQ,EAAE,OAAOA,MAAM;IAC/C;EACF,CAAC,CAAC,MAAM;IACN;EAAA;EAGF,IAAI;IACF,OAAOK,IAAI,CAACC,cAAc,CAAC,CAAC,CAACC,eAAe,CAAC,CAAC,CAACP,MAAM;EACvD,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,cAAcA,CAAA,EAAoB;EAChD,MAAMR,MAAM,GAAGJ,eAAe,CAAC,CAAC;EAChC,OAAOI,MAAM,KAAK,IAAI,GAAG,IAAI,GAAGN,UAAU,CAACM,MAAM,CAAC;AACpD","ignoreList":[]}