@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,34 +1,29 @@
1
1
  "use strict";
2
2
 
3
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
- import { AppState, Pressable, Text, View } from 'react-native';
5
- import { getThreads, getUnreadCount, markRead, postMessage, registerPush, submitQuery, SupportApiError } from '../api';
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { Text, View } from 'react-native';
5
+ import { postMessage, registerPush, setLanguage as setLanguageRequest, submitQuery, SupportApiError } from '../api';
6
+ import { createTranslator } from '../i18n';
7
+ import { asLanguage, DEFAULT_LANGUAGE, deviceLanguage } from '../i18n/languages';
6
8
  import { ensurePushPermission, isPushAvailable } from '../push';
7
9
  import { resolveTheme } from '../theme';
10
+ import { IDLE_POLL_MS, useSupportThreads } from '../useSupportThreads';
8
11
  import { validateProps } from '../utils';
9
12
  import { BottomSheet } from './BottomSheet';
10
- import { BubbleMark } from './icons';
13
+ import { LauncherButton } from './LauncherButton';
11
14
  import { ComposeScreen } from './screens/ComposeScreen';
12
15
  import { HomeScreen } from './screens/HomeScreen';
16
+ import { LanguageScreen } from './screens/LanguageScreen';
13
17
  import { ThreadScreen } from './screens/ThreadScreen';
14
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
15
- // Poll cadence by context: fast where latency is felt (staring at a thread
16
- // waiting for a reply), slow when the sheet is closed — and the idle tick
17
- // uses the count-only endpoint, so it costs ~18 bytes instead of the full
18
- // thread list.
19
- const THREAD_POLL_MS = 5_000;
20
- const SHEET_POLL_MS = 15_000;
21
- const IDLE_POLL_MS = 60_000;
22
- const MIN_POLL_MS = 3_000;
23
-
18
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
24
19
  /**
25
- * The single entry point of the SDK: a button with an unread badge that
26
- * opens the support bottom sheet. Polls get-threads on mount and whenever
27
- * the sheet opens (no websockets in v1).
20
+ * The single entry point of the SDK: a launcher with an unread badge that
21
+ * opens the support bottom sheet. Threads, polling, and read receipts are
22
+ * handled by useSupportThreads.
28
23
  */
29
24
  export function SupportButton(props) {
30
25
  const validationError = validateProps(props);
31
- const theme = resolveTheme(props.theme);
26
+ const theme = useMemo(() => resolveTheme(props.theme, props.accentColor), [props.theme, props.accentColor]);
32
27
  const config = useMemo(() => ({
33
28
  supabaseUrl: props.supabaseUrl,
34
29
  apiKey: props.apiKey,
@@ -38,72 +33,51 @@ export function SupportButton(props) {
38
33
  const [screen, setScreen] = useState({
39
34
  name: 'home'
40
35
  });
41
- const [threads, setThreads] = useState(null);
42
- const [totalUnread, setTotalUnread] = useState(0);
43
- const [loading, setLoading] = useState(false);
44
- const [error, setError] = useState(null);
45
- const mounted = useRef(true);
46
- useEffect(() => {
47
- mounted.current = true;
48
- return () => {
49
- mounted.current = false;
50
- };
51
- }, []);
52
- const refresh = useCallback(async () => {
53
- if (validationError) return;
54
- setLoading(true);
55
- setError(null);
56
- try {
57
- const data = await getThreads(config, props.user.revenuecatId);
58
- if (!mounted.current) return;
59
- setThreads(data.threads);
60
- setTotalUnread(data.total_unread);
61
- } catch (e) {
62
- if (!mounted.current) return;
63
- setError(e instanceof SupportApiError && e.offline ? "You're offline — check your connection" : "Couldn't load threads");
64
- } finally {
65
- if (mounted.current) setLoading(false);
66
- }
67
- }, [config, props.user.revenuecatId, validationError]);
68
-
69
- /** Badge-only refresh — the cheap endpoint used while idle. */
70
- const refreshBadge = useCallback(async () => {
71
- if (validationError) return;
72
- try {
73
- const data = await getUnreadCount(config, props.user.revenuecatId);
74
- if (mounted.current) setTotalUnread(data.total_unread);
75
- } catch {
76
- // Best-effort: the next tick or the next sheet open reconciles.
77
- }
78
- }, [config, props.user.revenuecatId, validationError]);
36
+ const {
37
+ threads,
38
+ totalUnread,
39
+ loading,
40
+ refreshing,
41
+ errorKey,
42
+ serverLanguage,
43
+ languageLoaded,
44
+ refresh,
45
+ reload
46
+ } = useSupportThreads({
47
+ config,
48
+ revenuecatId: props.user.revenuecatId,
49
+ enabled: validationError === null,
50
+ sheetOpen,
51
+ activeThreadId: screen.name === 'thread' ? screen.threadId : null,
52
+ idlePollMs: props.pollIntervalMs ?? IDLE_POLL_MS
53
+ });
79
54
 
80
- // Poll on mount…
81
- useEffect(() => {
82
- void refresh();
83
- }, [refresh]);
55
+ /**
56
+ * What the user picked, once they have picked. Until then the sheet is
57
+ * rendered in the host app's hint or the device's language, which is a
58
+ * guess — hence `chosen`, which is what decides whether to ask.
59
+ */
60
+ const [chosen, setChosen] = useState(null);
61
+ const [draftLanguage, setDraftLanguage] = useState(null);
62
+ const [savingLanguage, setSavingLanguage] = useState(false);
63
+ const [languageError, setLanguageError] = useState(null);
84
64
 
85
- // …then adapt the cadence to what the user is looking at, and refresh
86
- // whenever the app returns to the foreground.
87
- const idlePollMs = props.pollIntervalMs ?? IDLE_POLL_MS;
88
- const screenName = screen.name;
65
+ // A preference saved on another device (or an earlier install) wins over
66
+ // any local guess, and answers the "have they chosen?" question for free.
89
67
  useEffect(() => {
90
- const idle = !sheetOpen;
91
- const intervalMs = idle ? idlePollMs : screenName === 'thread' ? THREAD_POLL_MS : SHEET_POLL_MS;
92
-
93
- // While idle only the badge matters, so use the count-only endpoint.
94
- const tick = () => void (idle ? refreshBadge() : refresh());
68
+ const stored = asLanguage(serverLanguage);
69
+ if (stored !== null) setChosen(stored);
70
+ }, [serverLanguage]);
71
+ const fallbackLanguage = props.defaultLanguage ?? deviceLanguage() ?? DEFAULT_LANGUAGE;
72
+ const language = chosen ?? fallbackLanguage;
73
+ const strings = useMemo(() => createTranslator(draftLanguage ?? language), [draftLanguage, language]);
95
74
 
96
- // Clamped so a typo like `pollIntervalMs={30}` can't hammer the API;
97
- // 0 (or negative) disables idle polling entirely.
98
- const timer = intervalMs > 0 ? setInterval(tick, Math.max(intervalMs, MIN_POLL_MS)) : null;
99
- const appStateSub = AppState.addEventListener('change', state => {
100
- if (state === 'active') tick();
101
- });
102
- return () => {
103
- if (timer !== null) clearInterval(timer);
104
- appStateSub.remove();
105
- };
106
- }, [sheetOpen, screenName, idlePollMs, refresh, refreshBadge]);
75
+ /**
76
+ * Ask once, on first open — but only once the server has told us whether
77
+ * this user already answered. Asking before then would show the picker to
78
+ * someone who chose months ago on another device.
79
+ */
80
+ const mustChooseLanguage = languageLoaded && chosen === null;
107
81
 
108
82
  /**
109
83
  * Asks for notification permission the moment the sheet opens, then
@@ -112,7 +86,7 @@ export function SupportButton(props) {
112
86
  * support flow waits on it or breaks if it fails.
113
87
  */
114
88
  const syncPushPermission = useCallback(async () => {
115
- if (validationError || !isPushAvailable) return;
89
+ if (validationError !== null || !isPushAvailable) return;
116
90
  try {
117
91
  const registration = await ensurePushPermission(props.expoProjectId);
118
92
  await registerPush(config, {
@@ -125,14 +99,11 @@ export function SupportButton(props) {
125
99
  // Push is an enhancement — never surfaced to the user as an error.
126
100
  }
127
101
  }, [config, props.user.revenuecatId, props.expoProjectId, validationError]);
128
-
129
- // …and on sheet open.
130
102
  function openSheet() {
131
103
  setScreen({
132
104
  name: 'home'
133
105
  });
134
106
  setSheetOpen(true);
135
- void refresh();
136
107
  // The OS prompt appears right as the sheet opens; if the user declines,
137
108
  // everything below carries on exactly as before.
138
109
  void syncPushPermission();
@@ -142,8 +113,10 @@ export function SupportButton(props) {
142
113
  setScreen({
143
114
  name: 'home'
144
115
  });
116
+ setDraftLanguage(null);
117
+ setLanguageError(null);
145
118
  }
146
- if (validationError) {
119
+ if (validationError !== null) {
147
120
  // Dev-mode: loud and actionable. Production: render nothing rather than
148
121
  // a broken button.
149
122
  if (__DEV__) {
@@ -166,32 +139,43 @@ export function SupportButton(props) {
166
139
  }
167
140
  return null;
168
141
  }
169
- function openThread(thread) {
170
- setScreen({
171
- name: 'thread',
172
- threadId: thread.id
173
- });
174
- if (thread.unread_count > 0) {
175
- // Optimistically clear the badge; persist via mark-read.
176
- setThreads(prev => prev?.map(t => t.id === thread.id ? {
177
- ...t,
178
- unread_count: 0
179
- } : t) ?? null);
180
- setTotalUnread(n => Math.max(0, n - thread.unread_count));
181
- void markRead(config, {
182
- queryId: thread.id,
183
- revenuecatId: props.user.revenuecatId
184
- }).catch(() => {
185
- // Non-fatal: the next get-threads reconciles the badge.
186
- });
187
- }
188
- }
189
142
  function writeErrorMessage(e) {
190
143
  if (e instanceof SupportApiError) {
191
- if (e.status === 429) return 'Too many requests — try again later';
192
- if (e.offline) return "You're offline — check your connection";
144
+ if (e.status === 429) return strings.t('error.rateLimited');
145
+ if (e.offline) return strings.t('error.offline');
146
+ }
147
+ return strings.t('error.sendFailed');
148
+ }
149
+
150
+ /**
151
+ * Persists the picked language and leaves the picker.
152
+ *
153
+ * A failed save keeps the user on the screen with a retry: getting this
154
+ * wrong means every message they write is translated from the wrong
155
+ * language, which is worse than one more tap.
156
+ */
157
+ async function confirmLanguage() {
158
+ const next = draftLanguage ?? language;
159
+ setSavingLanguage(true);
160
+ setLanguageError(null);
161
+ try {
162
+ await setLanguageRequest(config, {
163
+ revenuecatId: props.user.revenuecatId,
164
+ language: next
165
+ });
166
+ setChosen(next);
167
+ setDraftLanguage(null);
168
+ setScreen({
169
+ name: 'home'
170
+ });
171
+ // On a change, the server re-queues existing replies for translation
172
+ // into the new language; they arrive over the next poll or two.
173
+ void reload();
174
+ } catch (e) {
175
+ setLanguageError(e instanceof SupportApiError && e.offline ? strings.t('error.offline') : strings.t('lang.saveFailed'));
176
+ } finally {
177
+ setSavingLanguage(false);
193
178
  }
194
- return "Couldn't send — try again";
195
179
  }
196
180
  async function handleSubmit(type, message) {
197
181
  try {
@@ -201,9 +185,10 @@ export function SupportButton(props) {
201
185
  userName: props.user.name,
202
186
  isPaid: props.user.isPaid,
203
187
  revenuecatId: props.user.revenuecatId,
204
- appVersion: props.user.appVersion
188
+ appVersion: props.user.appVersion,
189
+ language
205
190
  });
206
- void refresh();
191
+ void reload();
207
192
  return null;
208
193
  } catch (e) {
209
194
  return writeErrorMessage(e);
@@ -214,101 +199,94 @@ export function SupportButton(props) {
214
199
  await postMessage(config, {
215
200
  queryId: threadId,
216
201
  revenuecatId: props.user.revenuecatId,
217
- message
202
+ message,
203
+ language
218
204
  });
219
- await refresh();
205
+ await reload();
220
206
  return null;
221
207
  } catch (e) {
222
208
  return writeErrorMessage(e);
223
209
  }
224
210
  }
225
211
  const activeThread = screen.name === 'thread' ? (threads ?? []).find(t => t.id === screen.threadId) ?? null : null;
212
+ const home = /*#__PURE__*/_jsx(HomeScreen, {
213
+ theme: theme,
214
+ strings: strings,
215
+ language: language,
216
+ threads: threads,
217
+ loading: loading,
218
+ refreshing: refreshing,
219
+ error: errorKey === null ? null : strings.t(errorKey),
220
+ onRefresh: refresh,
221
+ onCompose: type => setScreen({
222
+ name: 'compose',
223
+ type
224
+ }),
225
+ onOpenThread: thread => setScreen({
226
+ name: 'thread',
227
+ threadId: thread.id
228
+ }),
229
+ onChangeLanguage: () => {
230
+ setDraftLanguage(language);
231
+ setLanguageError(null);
232
+ setScreen({
233
+ name: 'language'
234
+ });
235
+ },
236
+ onClose: closeSheet
237
+ });
238
+ const languagePicker = /*#__PURE__*/_jsx(LanguageScreen, {
239
+ theme: theme,
240
+ strings: strings,
241
+ selected: draftLanguage ?? language,
242
+ onSelect: setDraftLanguage,
243
+ onConfirm: () => void confirmLanguage()
244
+ // No way back on first run: there is nothing behind it yet, so the
245
+ // only exit is choosing — or closing the sheet, which asks again.
246
+ ,
247
+ onBack: mustChooseLanguage ? undefined : () => {
248
+ setDraftLanguage(null);
249
+ setLanguageError(null);
250
+ setScreen({
251
+ name: 'home'
252
+ });
253
+ },
254
+ onDismiss: mustChooseLanguage ? closeSheet : undefined,
255
+ saving: savingLanguage,
256
+ error: languageError
257
+ });
226
258
  return /*#__PURE__*/_jsxs(_Fragment, {
227
- children: [/*#__PURE__*/_jsxs(Pressable, {
228
- onPress: openSheet,
229
- accessibilityRole: "button",
230
- accessibilityLabel: totalUnread > 0 ? `Support, ${totalUnread} unread ${totalUnread === 1 ? 'reply' : 'replies'}` : 'Support',
231
- style: ({
232
- pressed
233
- }) => ({
234
- width: 44,
235
- height: 44,
236
- borderRadius: 22,
237
- borderWidth: 1,
238
- borderColor: theme.colors.border,
239
- backgroundColor: pressed ? theme.colors.surfaceHover : theme.colors.surface,
240
- alignItems: 'center',
241
- justifyContent: 'center'
242
- }),
243
- children: [/*#__PURE__*/_jsx(BubbleMark, {
244
- color: theme.colors.textPrimary,
245
- size: 18
246
- }), totalUnread > 0 && /*#__PURE__*/_jsx(View, {
247
- style: {
248
- position: 'absolute',
249
- top: -3,
250
- right: -3,
251
- minWidth: 16,
252
- height: 16,
253
- borderRadius: 8,
254
- paddingHorizontal: 4,
255
- backgroundColor: theme.colors.accent,
256
- alignItems: 'center',
257
- justifyContent: 'center'
258
- },
259
- children: /*#__PURE__*/_jsx(Text, {
260
- style: {
261
- fontSize: 10,
262
- fontWeight: '600',
263
- color: theme.colors.accentForeground,
264
- fontVariant: ['tabular-nums']
265
- },
266
- children: totalUnread > 9 ? '9+' : totalUnread
267
- })
268
- })]
269
- }), /*#__PURE__*/_jsxs(BottomSheet, {
259
+ children: [/*#__PURE__*/_jsx(LauncherButton, {
260
+ theme: theme,
261
+ unread: totalUnread,
262
+ variant: props.variant,
263
+ size: props.size,
264
+ label: props.label,
265
+ style: props.style,
266
+ onPress: openSheet
267
+ }), /*#__PURE__*/_jsx(BottomSheet, {
270
268
  visible: sheetOpen,
271
269
  onClose: closeSheet,
272
270
  theme: theme,
273
- children: [screen.name === 'home' && /*#__PURE__*/_jsx(HomeScreen, {
274
- theme: theme,
275
- threads: threads,
276
- loading: loading,
277
- error: error,
278
- onRetry: () => void refresh(),
279
- onCompose: type => setScreen({
280
- name: 'compose',
281
- type
282
- }),
283
- onOpenThread: openThread,
284
- onClose: closeSheet
285
- }), screen.name === 'compose' && /*#__PURE__*/_jsx(ComposeScreen, {
286
- theme: theme,
287
- type: screen.type,
288
- onBack: () => setScreen({
289
- name: 'home'
290
- }),
291
- onSubmit: message => handleSubmit(screen.type, message)
292
- }), screen.name === 'thread' && (activeThread ? /*#__PURE__*/_jsx(ThreadScreen, {
293
- theme: theme,
294
- thread: activeThread,
295
- onBack: () => setScreen({
296
- name: 'home'
297
- }),
298
- onSend: message => handleSend(activeThread.id, message)
299
- }) : /*#__PURE__*/_jsx(HomeScreen, {
300
- theme: theme,
301
- threads: threads,
302
- loading: loading,
303
- error: error,
304
- onRetry: () => void refresh(),
305
- onCompose: type => setScreen({
306
- name: 'compose',
307
- type
308
- }),
309
- onOpenThread: openThread,
310
- onClose: closeSheet
311
- }))]
271
+ children: mustChooseLanguage || screen.name === 'language' ? languagePicker : /*#__PURE__*/_jsxs(_Fragment, {
272
+ children: [screen.name === 'home' && home, screen.name === 'compose' && /*#__PURE__*/_jsx(ComposeScreen, {
273
+ theme: theme,
274
+ strings: strings,
275
+ type: screen.type,
276
+ onBack: () => setScreen({
277
+ name: 'home'
278
+ }),
279
+ onSubmit: message => handleSubmit(screen.type, message)
280
+ }), screen.name === 'thread' && (activeThread !== null ? /*#__PURE__*/_jsx(ThreadScreen, {
281
+ theme: theme,
282
+ strings: strings,
283
+ thread: activeThread,
284
+ onBack: () => setScreen({
285
+ name: 'home'
286
+ }),
287
+ onSend: message => handleSend(activeThread.id, message)
288
+ }) : home)]
289
+ })
312
290
  })]
313
291
  });
314
292
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","AppState","Pressable","Text","View","getThreads","getUnreadCount","markRead","postMessage","registerPush","submitQuery","SupportApiError","ensurePushPermission","isPushAvailable","resolveTheme","validateProps","BottomSheet","BubbleMark","ComposeScreen","HomeScreen","ThreadScreen","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","THREAD_POLL_MS","SHEET_POLL_MS","IDLE_POLL_MS","MIN_POLL_MS","SupportButton","props","validationError","theme","config","supabaseUrl","apiKey","appName","sheetOpen","setSheetOpen","screen","setScreen","name","threads","setThreads","totalUnread","setTotalUnread","loading","setLoading","error","setError","mounted","current","refresh","data","user","revenuecatId","total_unread","e","offline","refreshBadge","idlePollMs","pollIntervalMs","screenName","idle","intervalMs","tick","timer","setInterval","Math","max","appStateSub","addEventListener","state","clearInterval","remove","syncPushPermission","registration","expoProjectId","permissionStatus","status","expoPushToken","token","asked","openSheet","closeSheet","__DEV__","console","style","padding","borderWidth","borderColor","colors","statusDanger","borderRadius","radii","control","children","fontSize","color","openThread","thread","threadId","id","unread_count","prev","map","t","n","queryId","catch","writeErrorMessage","handleSubmit","type","message","queryType","userName","isPaid","appVersion","handleSend","activeThread","find","onPress","accessibilityRole","accessibilityLabel","pressed","width","height","border","backgroundColor","surfaceHover","surface","alignItems","justifyContent","textPrimary","size","position","top","right","minWidth","paddingHorizontal","accent","fontWeight","accentForeground","fontVariant","visible","onClose","onRetry","onCompose","onOpenThread","onBack","onSubmit","onSend"],"sourceRoot":"../../../src","sources":["components/SupportButton.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","useState","Text","View","postMessage","registerPush","setLanguage","setLanguageRequest","submitQuery","SupportApiError","createTranslator","asLanguage","DEFAULT_LANGUAGE","deviceLanguage","ensurePushPermission","isPushAvailable","resolveTheme","IDLE_POLL_MS","useSupportThreads","validateProps","BottomSheet","LauncherButton","ComposeScreen","HomeScreen","LanguageScreen","ThreadScreen","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","SupportButton","props","validationError","theme","accentColor","config","supabaseUrl","apiKey","appName","sheetOpen","setSheetOpen","screen","setScreen","name","threads","totalUnread","loading","refreshing","errorKey","serverLanguage","languageLoaded","refresh","reload","revenuecatId","user","enabled","activeThreadId","threadId","idlePollMs","pollIntervalMs","chosen","setChosen","draftLanguage","setDraftLanguage","savingLanguage","setSavingLanguage","languageError","setLanguageError","stored","fallbackLanguage","defaultLanguage","language","strings","mustChooseLanguage","syncPushPermission","registration","expoProjectId","permissionStatus","status","expoPushToken","token","asked","openSheet","closeSheet","__DEV__","console","error","style","padding","borderWidth","borderColor","colors","statusDanger","borderRadius","radii","control","children","fontSize","color","writeErrorMessage","e","t","offline","confirmLanguage","next","handleSubmit","type","message","queryType","userName","isPaid","appVersion","handleSend","queryId","activeThread","find","id","home","onRefresh","onCompose","onOpenThread","thread","onChangeLanguage","onClose","languagePicker","selected","onSelect","onConfirm","onBack","undefined","onDismiss","saving","unread","variant","size","label","onPress","visible","onSubmit","onSend"],"sourceRoot":"../../../src","sources":["components/SupportButton.tsx"],"mappings":"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","ignoreList":[]}
@@ -172,32 +172,116 @@ export function CheckIcon({
172
172
  });
173
173
  }
174
174
 
175
- /** The chat-bubble mark on the floating support button. */
176
- export function BubbleMark({
175
+ /** Globe: circle, equator, and a pill standing in for the meridian curve. */
176
+ export function GlobeIcon({
177
177
  color,
178
- size = 20
178
+ size = 16
179
+ }) {
180
+ const inner = size - STROKE * 2;
181
+ return /*#__PURE__*/_jsxs(View, {
182
+ style: {
183
+ width: size,
184
+ height: size,
185
+ borderWidth: STROKE,
186
+ borderColor: color,
187
+ borderRadius: size / 2,
188
+ alignItems: 'center',
189
+ justifyContent: 'center'
190
+ },
191
+ children: [/*#__PURE__*/_jsx(View, {
192
+ style: {
193
+ position: 'absolute',
194
+ width: inner,
195
+ height: STROKE,
196
+ backgroundColor: color
197
+ }
198
+ }), /*#__PURE__*/_jsx(View, {
199
+ style: {
200
+ width: size * 0.52,
201
+ height: inner,
202
+ borderWidth: STROKE,
203
+ borderColor: color,
204
+ borderRadius: size * 0.26
205
+ }
206
+ })]
207
+ });
208
+ }
209
+
210
+ /** Send arrow: a stem plus a chevron head, both centered on the same axis. */
211
+ export function ArrowUpIcon({
212
+ color,
213
+ size = 16
214
+ }) {
215
+ const stroke = STROKE + 0.4;
216
+ const head = size * 0.44;
217
+ return /*#__PURE__*/_jsxs(View, {
218
+ style: {
219
+ width: size,
220
+ height: size,
221
+ alignItems: 'center',
222
+ justifyContent: 'center'
223
+ },
224
+ children: [/*#__PURE__*/_jsx(View, {
225
+ style: {
226
+ position: 'absolute',
227
+ width: stroke,
228
+ height: size * 0.66,
229
+ borderRadius: stroke,
230
+ backgroundColor: color
231
+ }
232
+ }), /*#__PURE__*/_jsx(View, {
233
+ style: {
234
+ position: 'absolute',
235
+ // Rotating a square by 45° lifts its apex by ~0.207 × side, so
236
+ // offset by that to land the point on top of the stem.
237
+ top: size * 0.17 + head * 0.207,
238
+ width: head,
239
+ height: head,
240
+ borderTopWidth: stroke,
241
+ borderLeftWidth: stroke,
242
+ borderTopLeftRadius: stroke,
243
+ borderColor: color,
244
+ transform: [{
245
+ rotate: '45deg'
246
+ }]
247
+ }
248
+ })]
249
+ });
250
+ }
251
+
252
+ /**
253
+ * The chat-bubble mark on the launcher button: a filled bubble with the
254
+ * dots knocked out in the button's own fill color. Solid shapes read far
255
+ * better than 1.5px strokes at launcher size and on top of a color fill.
256
+ */
257
+ export function ChatBubbleMark({
258
+ color,
259
+ dotColor,
260
+ size = 24
179
261
  }) {
262
+ const bubbleHeight = size * 0.82;
180
263
  const dot = {
181
- width: size * 0.12,
182
- height: size * 0.12,
264
+ width: size * 0.13,
265
+ height: size * 0.13,
183
266
  borderRadius: size,
184
- backgroundColor: color
267
+ backgroundColor: dotColor
185
268
  };
186
269
  return /*#__PURE__*/_jsxs(View, {
187
270
  style: {
188
- alignItems: 'flex-start'
271
+ width: size,
272
+ height: size,
273
+ justifyContent: 'flex-start'
189
274
  },
190
275
  children: [/*#__PURE__*/_jsxs(View, {
191
276
  style: {
192
277
  width: size,
193
- height: size * 0.78,
194
- borderWidth: STROKE + 0.25,
195
- borderColor: color,
196
- borderRadius: size * 0.28,
278
+ height: bubbleHeight,
279
+ borderRadius: size * 0.33,
280
+ backgroundColor: color,
197
281
  flexDirection: 'row',
198
282
  alignItems: 'center',
199
283
  justifyContent: 'center',
200
- gap: size * 0.1
284
+ gap: size * 0.115
201
285
  },
202
286
  children: [/*#__PURE__*/_jsx(View, {
203
287
  style: dot
@@ -208,16 +292,17 @@ export function BubbleMark({
208
292
  })]
209
293
  }), /*#__PURE__*/_jsx(View, {
210
294
  style: {
211
- width: size * 0.22,
212
- height: size * 0.22,
213
- borderLeftWidth: STROKE + 0.25,
214
- borderBottomWidth: STROKE + 0.25,
215
- borderColor: color,
216
- marginLeft: size * 0.18,
217
- marginTop: -STROKE,
218
- transform: [{
219
- skewX: '-12deg'
220
- }]
295
+ position: 'absolute',
296
+ left: size * 0.22,
297
+ top: bubbleHeight - 1,
298
+ width: 0,
299
+ height: 0,
300
+ borderLeftWidth: size * 0.09,
301
+ borderRightWidth: size * 0.16,
302
+ borderTopWidth: size * 0.2,
303
+ borderLeftColor: 'transparent',
304
+ borderRightColor: 'transparent',
305
+ borderTopColor: color
221
306
  }
222
307
  })]
223
308
  });