@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.
- package/lib/commonjs/api.js +17 -2
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/components/BottomSheet.js +67 -47
- package/lib/commonjs/components/BottomSheet.js.map +1 -1
- package/lib/commonjs/components/LauncherButton.js +177 -0
- package/lib/commonjs/components/LauncherButton.js.map +1 -0
- package/lib/commonjs/components/SupportButton.js +168 -190
- package/lib/commonjs/components/SupportButton.js.map +1 -1
- package/lib/commonjs/components/icons.js +110 -23
- package/lib/commonjs/components/icons.js.map +1 -1
- package/lib/commonjs/components/primitives.js +191 -44
- package/lib/commonjs/components/primitives.js.map +1 -1
- package/lib/commonjs/components/screens/ComposeScreen.js +108 -60
- package/lib/commonjs/components/screens/ComposeScreen.js.map +1 -1
- package/lib/commonjs/components/screens/HomeScreen.js +221 -118
- package/lib/commonjs/components/screens/HomeScreen.js.map +1 -1
- package/lib/commonjs/components/screens/LanguageScreen.js +150 -0
- package/lib/commonjs/components/screens/LanguageScreen.js.map +1 -0
- package/lib/commonjs/components/screens/ThreadScreen.js +237 -111
- package/lib/commonjs/components/screens/ThreadScreen.js.map +1 -1
- package/lib/commonjs/i18n/index.js +101 -0
- package/lib/commonjs/i18n/index.js.map +1 -0
- package/lib/commonjs/i18n/languages.js +95 -0
- package/lib/commonjs/i18n/languages.js.map +1 -0
- package/lib/commonjs/i18n/strings/de.js +72 -0
- package/lib/commonjs/i18n/strings/de.js.map +1 -0
- package/lib/commonjs/i18n/strings/en.js +88 -0
- package/lib/commonjs/i18n/strings/en.js.map +1 -0
- package/lib/commonjs/i18n/strings/es.js +72 -0
- package/lib/commonjs/i18n/strings/es.js.map +1 -0
- package/lib/commonjs/i18n/strings/fr.js +72 -0
- package/lib/commonjs/i18n/strings/fr.js.map +1 -0
- package/lib/commonjs/i18n/strings/hi.js +72 -0
- package/lib/commonjs/i18n/strings/hi.js.map +1 -0
- package/lib/commonjs/i18n/strings/it.js +72 -0
- package/lib/commonjs/i18n/strings/it.js.map +1 -0
- package/lib/commonjs/i18n/strings/ja.js +72 -0
- package/lib/commonjs/i18n/strings/ja.js.map +1 -0
- package/lib/commonjs/i18n/strings/ko.js +72 -0
- package/lib/commonjs/i18n/strings/ko.js.map +1 -0
- package/lib/commonjs/i18n/strings/nl.js +72 -0
- package/lib/commonjs/i18n/strings/nl.js.map +1 -0
- package/lib/commonjs/i18n/strings/pl.js +72 -0
- package/lib/commonjs/i18n/strings/pl.js.map +1 -0
- package/lib/commonjs/i18n/strings/pt.js +72 -0
- package/lib/commonjs/i18n/strings/pt.js.map +1 -0
- package/lib/commonjs/i18n/strings/ru.js +72 -0
- package/lib/commonjs/i18n/strings/ru.js.map +1 -0
- package/lib/commonjs/i18n/strings/tr.js +72 -0
- package/lib/commonjs/i18n/strings/tr.js.map +1 -0
- package/lib/commonjs/i18n/strings/zh.js +72 -0
- package/lib/commonjs/i18n/strings/zh.js.map +1 -0
- package/lib/commonjs/index.js +31 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/theme.js +136 -17
- package/lib/commonjs/theme.js.map +1 -1
- package/lib/commonjs/types.js +18 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/unread.js +92 -0
- package/lib/commonjs/unread.js.map +1 -0
- package/lib/commonjs/useSupportThreads.js +296 -0
- package/lib/commonjs/useSupportThreads.js.map +1 -0
- package/lib/commonjs/utils.js +58 -10
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/api.js +16 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/components/BottomSheet.js +68 -48
- package/lib/module/components/BottomSheet.js.map +1 -1
- package/lib/module/components/LauncherButton.js +172 -0
- package/lib/module/components/LauncherButton.js.map +1 -0
- package/lib/module/components/SupportButton.js +172 -194
- package/lib/module/components/SupportButton.js.map +1 -1
- package/lib/module/components/icons.js +107 -22
- package/lib/module/components/icons.js.map +1 -1
- package/lib/module/components/primitives.js +187 -45
- package/lib/module/components/primitives.js.map +1 -1
- package/lib/module/components/screens/ComposeScreen.js +114 -64
- package/lib/module/components/screens/ComposeScreen.js.map +1 -1
- package/lib/module/components/screens/HomeScreen.js +224 -121
- package/lib/module/components/screens/HomeScreen.js.map +1 -1
- package/lib/module/components/screens/LanguageScreen.js +147 -0
- package/lib/module/components/screens/LanguageScreen.js.map +1 -0
- package/lib/module/components/screens/ThreadScreen.js +243 -115
- package/lib/module/components/screens/ThreadScreen.js.map +1 -1
- package/lib/module/i18n/index.js +56 -0
- package/lib/module/i18n/index.js.map +1 -0
- package/lib/module/i18n/languages.js +88 -0
- package/lib/module/i18n/languages.js.map +1 -0
- package/lib/module/i18n/strings/de.js +68 -0
- package/lib/module/i18n/strings/de.js.map +1 -0
- package/lib/module/i18n/strings/en.js +84 -0
- package/lib/module/i18n/strings/en.js.map +1 -0
- package/lib/module/i18n/strings/es.js +68 -0
- package/lib/module/i18n/strings/es.js.map +1 -0
- package/lib/module/i18n/strings/fr.js +68 -0
- package/lib/module/i18n/strings/fr.js.map +1 -0
- package/lib/module/i18n/strings/hi.js +68 -0
- package/lib/module/i18n/strings/hi.js.map +1 -0
- package/lib/module/i18n/strings/it.js +68 -0
- package/lib/module/i18n/strings/it.js.map +1 -0
- package/lib/module/i18n/strings/ja.js +68 -0
- package/lib/module/i18n/strings/ja.js.map +1 -0
- package/lib/module/i18n/strings/ko.js +68 -0
- package/lib/module/i18n/strings/ko.js.map +1 -0
- package/lib/module/i18n/strings/nl.js +68 -0
- package/lib/module/i18n/strings/nl.js.map +1 -0
- package/lib/module/i18n/strings/pl.js +68 -0
- package/lib/module/i18n/strings/pl.js.map +1 -0
- package/lib/module/i18n/strings/pt.js +68 -0
- package/lib/module/i18n/strings/pt.js.map +1 -0
- package/lib/module/i18n/strings/ru.js +68 -0
- package/lib/module/i18n/strings/ru.js.map +1 -0
- package/lib/module/i18n/strings/tr.js +68 -0
- package/lib/module/i18n/strings/tr.js.map +1 -0
- package/lib/module/i18n/strings/zh.js +68 -0
- package/lib/module/i18n/strings/zh.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/theme.js +135 -16
- package/lib/module/theme.js.map +1 -1
- package/lib/module/types.js +18 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/unread.js +83 -0
- package/lib/module/unread.js.map +1 -0
- package/lib/module/useSupportThreads.js +291 -0
- package/lib/module/useSupportThreads.js.map +1 -0
- package/lib/module/utils.js +55 -10
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/api.d.ts +9 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/components/BottomSheet.d.ts.map +1 -1
- package/lib/typescript/components/LauncherButton.d.ts +14 -0
- package/lib/typescript/components/LauncherButton.d.ts.map +1 -0
- package/lib/typescript/components/SupportButton.d.ts +3 -3
- package/lib/typescript/components/SupportButton.d.ts.map +1 -1
- package/lib/typescript/components/icons.d.ts +18 -2
- package/lib/typescript/components/icons.d.ts.map +1 -1
- package/lib/typescript/components/primitives.d.ts +42 -7
- package/lib/typescript/components/primitives.d.ts.map +1 -1
- package/lib/typescript/components/screens/ComposeScreen.d.ts +3 -1
- package/lib/typescript/components/screens/ComposeScreen.d.ts.map +1 -1
- package/lib/typescript/components/screens/HomeScreen.d.ts +8 -2
- package/lib/typescript/components/screens/HomeScreen.d.ts.map +1 -1
- package/lib/typescript/components/screens/LanguageScreen.d.ts +30 -0
- package/lib/typescript/components/screens/LanguageScreen.d.ts.map +1 -0
- package/lib/typescript/components/screens/ThreadScreen.d.ts +3 -1
- package/lib/typescript/components/screens/ThreadScreen.d.ts.map +1 -1
- package/lib/typescript/i18n/index.d.ts +15 -0
- package/lib/typescript/i18n/index.d.ts.map +1 -0
- package/lib/typescript/i18n/languages.d.ts +36 -0
- package/lib/typescript/i18n/languages.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/de.d.ts +3 -0
- package/lib/typescript/i18n/strings/de.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/en.d.ts +83 -0
- package/lib/typescript/i18n/strings/en.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/es.d.ts +3 -0
- package/lib/typescript/i18n/strings/es.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/fr.d.ts +3 -0
- package/lib/typescript/i18n/strings/fr.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/hi.d.ts +3 -0
- package/lib/typescript/i18n/strings/hi.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/it.d.ts +3 -0
- package/lib/typescript/i18n/strings/it.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/ja.d.ts +3 -0
- package/lib/typescript/i18n/strings/ja.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/ko.d.ts +3 -0
- package/lib/typescript/i18n/strings/ko.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/nl.d.ts +3 -0
- package/lib/typescript/i18n/strings/nl.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/pl.d.ts +3 -0
- package/lib/typescript/i18n/strings/pl.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/pt.d.ts +3 -0
- package/lib/typescript/i18n/strings/pt.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/ru.d.ts +3 -0
- package/lib/typescript/i18n/strings/ru.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/tr.d.ts +3 -0
- package/lib/typescript/i18n/strings/tr.d.ts.map +1 -0
- package/lib/typescript/i18n/strings/zh.d.ts +3 -0
- package/lib/typescript/i18n/strings/zh.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/theme.d.ts +44 -3
- package/lib/typescript/theme.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +54 -2
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/unread.d.ts +22 -0
- package/lib/typescript/unread.d.ts.map +1 -0
- package/lib/typescript/useSupportThreads.d.ts +38 -0
- package/lib/typescript/useSupportThreads.d.ts.map +1 -0
- package/lib/typescript/utils.d.ts +8 -2
- package/lib/typescript/utils.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/api.ts +24 -1
- package/src/components/BottomSheet.tsx +61 -43
- package/src/components/LauncherButton.tsx +217 -0
- package/src/components/SupportButton.tsx +195 -210
- package/src/components/icons.tsx +113 -19
- package/src/components/primitives.tsx +230 -39
- package/src/components/screens/ComposeScreen.tsx +129 -63
- package/src/components/screens/HomeScreen.tsx +230 -120
- package/src/components/screens/LanguageScreen.tsx +172 -0
- package/src/components/screens/ThreadScreen.tsx +319 -122
- package/src/i18n/index.ts +81 -0
- package/src/i18n/languages.ts +106 -0
- package/src/i18n/strings/de.ts +78 -0
- package/src/i18n/strings/en.ts +94 -0
- package/src/i18n/strings/es.ts +77 -0
- package/src/i18n/strings/fr.ts +78 -0
- package/src/i18n/strings/hi.ts +77 -0
- package/src/i18n/strings/it.ts +77 -0
- package/src/i18n/strings/ja.ts +77 -0
- package/src/i18n/strings/ko.ts +76 -0
- package/src/i18n/strings/nl.ts +77 -0
- package/src/i18n/strings/pl.ts +77 -0
- package/src/i18n/strings/pt.ts +77 -0
- package/src/i18n/strings/ru.ts +77 -0
- package/src/i18n/strings/tr.ts +77 -0
- package/src/i18n/strings/zh.ts +75 -0
- package/src/index.tsx +9 -0
- package/src/theme.ts +165 -18
- package/src/types.ts +56 -2
- package/src/unread.ts +91 -0
- package/src/useSupportThreads.ts +392 -0
- package/src/utils.ts +48 -10
package/lib/module/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["darkColors","lightColors","motion","radii","spacing","
|
|
1
|
+
{"version":3,"names":["darkColors","lightColors","motion","radii","spacing","supportRadii","control","card","cardLg","bubble","bubbleTail","sheet","pill","HEX","parseHex","color","match","exec","trim","digits","undefined","hex","length","split","map","c","join","parseInt","slice","mix","r","g","b","target","amount","channel","Math","round","shadowsFor","name","accent","dark","launcher","shadowColor","shadowOpacity","shadowRadius","shadowOffset","width","height","elevation","badge","launcherFor","rgb","solidRing","minimalMark","buildTheme","colors","shadows","supportDarkTheme","supportLightTheme","withAccent","theme","luminance","accentHover","accentMuted","accentForeground","statusOpen","statusOpenBg","focusRing","resolveTheme","accentColor","base"],"sourceRoot":"../../src","sources":["theme.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/types.js
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* How the launcher renders:
|
|
5
|
+
* solid — accent fill, elevated. The floating action button.
|
|
6
|
+
* soft — app surface + hairline border. Sits in a header or toolbar.
|
|
7
|
+
* minimal — bare mark, no fill or border. Sits in a nav bar.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Note the absence of any admin identity: end users see one support team,
|
|
12
|
+
* not the people staffing it, so the names never leave the server. The
|
|
13
|
+
* dashboard still shows who wrote and who resolved what.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* English labels, kept for host apps that render their own entry points.
|
|
18
|
+
* Inside the sheet the labels come from the string table instead, so they
|
|
19
|
+
* follow the user's language.
|
|
20
|
+
*/
|
|
3
21
|
export const QUERY_TYPE_LABEL = {
|
|
4
22
|
feedback: 'Feedback',
|
|
5
23
|
feature_request: 'Feature request',
|
package/lib/module/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["QUERY_TYPE_LABEL","feedback","feature_request","bug_report","USER_MESSAGE_MIN","USER_MESSAGE_MAX"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["QUERY_TYPE_LABEL","feedback","feature_request","bug_report","USER_MESSAGE_MIN","USER_MESSAGE_MAX"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AASA;AACA;AACA;AACA;AACA;AACA;;AAwFA;AACA;AACA;AACA;AACA;;AAwBA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,gBAA2C,GAAG;EACzDC,QAAQ,EAAE,UAAU;EACpBC,eAAe,EAAE,iBAAiB;EAClCC,UAAU,EAAE;AACd,CAAC;AAED,OAAO,MAAMC,gBAAgB,GAAG,EAAE;AAClC,OAAO,MAAMC,gBAAgB,GAAG,GAAG","ignoreList":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Unread accounting.
|
|
4
|
+
//
|
|
5
|
+
// The server counts a thread's unread as "admin messages newer than the
|
|
6
|
+
// user's read receipt". That number is authoritative, but it is always a
|
|
7
|
+
// little behind the device: between the moment the user opens a thread and
|
|
8
|
+
// the moment `mark-read` lands, every already-in-flight poll still reports
|
|
9
|
+
// the old count — which is what made the badge flicker back on after being
|
|
10
|
+
// cleared, and what made a thread the user was actively reading accumulate
|
|
11
|
+
// unread replies.
|
|
12
|
+
//
|
|
13
|
+
// So the client keeps its own watermark per thread: the `created_at` of the
|
|
14
|
+
// newest admin message the user has actually seen. Those are *server*
|
|
15
|
+
// timestamps, so nothing here compares against the device clock.
|
|
16
|
+
//
|
|
17
|
+
// Displayed unread is then the stricter of the two counts, which is correct
|
|
18
|
+
// in both directions:
|
|
19
|
+
//
|
|
20
|
+
// read here, receipt not written yet → local watermark wins (0)
|
|
21
|
+
// read on another device → server count wins (0)
|
|
22
|
+
|
|
23
|
+
/** Watermark map: thread id → `created_at` (ms) of the newest seen reply. */
|
|
24
|
+
|
|
25
|
+
/** `created_at` (ms) of the newest admin message, or 0 if there are none. */
|
|
26
|
+
export function latestAdminMessageAt(thread) {
|
|
27
|
+
let latest = 0;
|
|
28
|
+
for (const message of thread.messages) {
|
|
29
|
+
if (message.sender !== 'admin') continue;
|
|
30
|
+
const at = Date.parse(message.created_at);
|
|
31
|
+
if (Number.isFinite(at) && at > latest) latest = at;
|
|
32
|
+
}
|
|
33
|
+
return latest;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Admin messages in `thread` newer than `watermark`. */
|
|
37
|
+
export function unreadSince(thread, watermark) {
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (const message of thread.messages) {
|
|
40
|
+
if (message.sender !== 'admin') continue;
|
|
41
|
+
const at = Date.parse(message.created_at);
|
|
42
|
+
if (Number.isFinite(at) && at > watermark) count += 1;
|
|
43
|
+
}
|
|
44
|
+
return count;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Returns `thread` with `unread_count` narrowed by what this device knows
|
|
49
|
+
* the user has read. Identity is preserved when nothing changes so lists
|
|
50
|
+
* stay referentially stable between polls.
|
|
51
|
+
*/
|
|
52
|
+
export function reconcileThread(thread, watermarks) {
|
|
53
|
+
const watermark = watermarks.get(thread.id);
|
|
54
|
+
if (watermark === undefined || thread.unread_count === 0) return thread;
|
|
55
|
+
const unread = Math.min(thread.unread_count, unreadSince(thread, watermark));
|
|
56
|
+
return unread === thread.unread_count ? thread : {
|
|
57
|
+
...thread,
|
|
58
|
+
unread_count: unread
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function reconcileThreads(threads, watermarks) {
|
|
62
|
+
return threads.map(thread => reconcileThread(thread, watermarks));
|
|
63
|
+
}
|
|
64
|
+
export function sumUnread(threads) {
|
|
65
|
+
return threads.reduce((total, thread) => total + thread.unread_count, 0);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Drops watermarks the server has caught up on (its own count is already 0)
|
|
70
|
+
* and ones for threads that no longer exist, so the map can't grow without
|
|
71
|
+
* bound over a long session.
|
|
72
|
+
*/
|
|
73
|
+
export function pruneWatermarks(watermarks, serverThreads) {
|
|
74
|
+
const keep = new Map();
|
|
75
|
+
for (const thread of serverThreads) {
|
|
76
|
+
const watermark = watermarks.get(thread.id);
|
|
77
|
+
if (watermark !== undefined && thread.unread_count > 0) {
|
|
78
|
+
keep.set(thread.id, watermark);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return keep;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=unread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["latestAdminMessageAt","thread","latest","message","messages","sender","at","Date","parse","created_at","Number","isFinite","unreadSince","watermark","count","reconcileThread","watermarks","get","id","undefined","unread_count","unread","Math","min","reconcileThreads","threads","map","sumUnread","reduce","total","pruneWatermarks","serverThreads","keep","Map","set"],"sourceRoot":"../../src","sources":["unread.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AAGA;AACA,OAAO,SAASA,oBAAoBA,CAACC,MAAc,EAAU;EAC3D,IAAIC,MAAM,GAAG,CAAC;EACd,KAAK,MAAMC,OAAO,IAAIF,MAAM,CAACG,QAAQ,EAAE;IACrC,IAAID,OAAO,CAACE,MAAM,KAAK,OAAO,EAAE;IAChC,MAAMC,EAAE,GAAGC,IAAI,CAACC,KAAK,CAACL,OAAO,CAACM,UAAU,CAAC;IACzC,IAAIC,MAAM,CAACC,QAAQ,CAACL,EAAE,CAAC,IAAIA,EAAE,GAAGJ,MAAM,EAAEA,MAAM,GAAGI,EAAE;EACrD;EACA,OAAOJ,MAAM;AACf;;AAEA;AACA,OAAO,SAASU,WAAWA,CAACX,MAAc,EAAEY,SAAiB,EAAU;EACrE,IAAIC,KAAK,GAAG,CAAC;EACb,KAAK,MAAMX,OAAO,IAAIF,MAAM,CAACG,QAAQ,EAAE;IACrC,IAAID,OAAO,CAACE,MAAM,KAAK,OAAO,EAAE;IAChC,MAAMC,EAAE,GAAGC,IAAI,CAACC,KAAK,CAACL,OAAO,CAACM,UAAU,CAAC;IACzC,IAAIC,MAAM,CAACC,QAAQ,CAACL,EAAE,CAAC,IAAIA,EAAE,GAAGO,SAAS,EAAEC,KAAK,IAAI,CAAC;EACvD;EACA,OAAOA,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7Bd,MAAc,EACde,UAA0B,EAClB;EACR,MAAMH,SAAS,GAAGG,UAAU,CAACC,GAAG,CAAChB,MAAM,CAACiB,EAAE,CAAC;EAC3C,IAAIL,SAAS,KAAKM,SAAS,IAAIlB,MAAM,CAACmB,YAAY,KAAK,CAAC,EAAE,OAAOnB,MAAM;EACvE,MAAMoB,MAAM,GAAGC,IAAI,CAACC,GAAG,CAACtB,MAAM,CAACmB,YAAY,EAAER,WAAW,CAACX,MAAM,EAAEY,SAAS,CAAC,CAAC;EAC5E,OAAOQ,MAAM,KAAKpB,MAAM,CAACmB,YAAY,GAAGnB,MAAM,GAAG;IAAE,GAAGA,MAAM;IAAEmB,YAAY,EAAEC;EAAO,CAAC;AACtF;AAEA,OAAO,SAASG,gBAAgBA,CAC9BC,OAAiB,EACjBT,UAA0B,EAChB;EACV,OAAOS,OAAO,CAACC,GAAG,CAAEzB,MAAM,IAAKc,eAAe,CAACd,MAAM,EAAEe,UAAU,CAAC,CAAC;AACrE;AAEA,OAAO,SAASW,SAASA,CAACF,OAAiB,EAAU;EACnD,OAAOA,OAAO,CAACG,MAAM,CAAC,CAACC,KAAK,EAAE5B,MAAM,KAAK4B,KAAK,GAAG5B,MAAM,CAACmB,YAAY,EAAE,CAAC,CAAC;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASU,eAAeA,CAC7Bd,UAA0B,EAC1Be,aAAuB,EACP;EAChB,MAAMC,IAAoB,GAAG,IAAIC,GAAG,CAAC,CAAC;EACtC,KAAK,MAAMhC,MAAM,IAAI8B,aAAa,EAAE;IAClC,MAAMlB,SAAS,GAAGG,UAAU,CAACC,GAAG,CAAChB,MAAM,CAACiB,EAAE,CAAC;IAC3C,IAAIL,SAAS,KAAKM,SAAS,IAAIlB,MAAM,CAACmB,YAAY,GAAG,CAAC,EAAE;MACtDY,IAAI,CAACE,GAAG,CAACjC,MAAM,CAACiB,EAAE,EAAEL,SAAS,CAAC;IAChC;EACF;EACA,OAAOmB,IAAI;AACb","ignoreList":[]}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Threads + unread state for the SDK: fetching, poll cadence, and read
|
|
4
|
+
// tracking. Kept out of SupportButton so the rules below live in one place.
|
|
5
|
+
//
|
|
6
|
+
// Three invariants make the badge trustworthy:
|
|
7
|
+
//
|
|
8
|
+
// 1. Responses are applied in issue order (`appliedSeq`), so a slow poll
|
|
9
|
+
// can never overwrite a newer one.
|
|
10
|
+
// 2. The badge-only endpoint returns a bare number that cannot be
|
|
11
|
+
// reconciled against local reads, so its answer is dropped when a read
|
|
12
|
+
// happened while it was in flight (`readEpoch`), and it isn't used at
|
|
13
|
+
// all while any `mark-read` is still unconfirmed — the full endpoint is
|
|
14
|
+
// polled instead, since that payload *can* be reconciled.
|
|
15
|
+
// 3. `mark-read` failures are retried instead of swallowed, and the local
|
|
16
|
+
// watermark holds the UI correct in the meantime.
|
|
17
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
18
|
+
import { AppState } from 'react-native';
|
|
19
|
+
import { getThreads, getUnreadCount, markRead, SupportApiError } from './api';
|
|
20
|
+
import { latestAdminMessageAt, pruneWatermarks, reconcileThreads, sumUnread } from './unread';
|
|
21
|
+
|
|
22
|
+
// Poll cadence by context: fast where latency is felt (staring at a thread
|
|
23
|
+
// waiting for a reply), slow when the sheet is closed — and the idle tick
|
|
24
|
+
// uses the count-only endpoint, so it costs ~18 bytes instead of the full
|
|
25
|
+
// thread list.
|
|
26
|
+
const THREAD_POLL_MS = 5_000;
|
|
27
|
+
const SHEET_POLL_MS = 15_000;
|
|
28
|
+
export const IDLE_POLL_MS = 60_000;
|
|
29
|
+
const MIN_POLL_MS = 3_000;
|
|
30
|
+
|
|
31
|
+
// A failed mark-read used to be dropped on the floor, which resurrected the
|
|
32
|
+
// badge on the next poll. Retry a few times with backoff; anything still
|
|
33
|
+
// unconfirmed after that is picked up by the next poll tick or foreground.
|
|
34
|
+
const MARK_READ_MAX_ATTEMPTS = 4;
|
|
35
|
+
const MARK_READ_BACKOFF_MS = 1_500;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Load failures the user can act on say so; the rest stay neutral. A 401 is
|
|
39
|
+
* an integration mistake — the end user retrying forever won't fix a key
|
|
40
|
+
* that doesn't match the app — so the real cause is logged for whoever is
|
|
41
|
+
* running the build instead of hidden behind "couldn't load".
|
|
42
|
+
*
|
|
43
|
+
* Returns a key rather than a message: the hook has no business knowing what
|
|
44
|
+
* language the sheet is in, and resolving it here would make every callback
|
|
45
|
+
* depend on the translator.
|
|
46
|
+
*/
|
|
47
|
+
function loadErrorKey(e) {
|
|
48
|
+
if (e instanceof SupportApiError) {
|
|
49
|
+
if (e.offline) return 'error.offline';
|
|
50
|
+
if (e.status === 401 || e.status === 403) {
|
|
51
|
+
if (__DEV__) {
|
|
52
|
+
console.error('SupportButton: the support API rejected this app (401). Check that ' + '`apiKey` is the key shown when the app was registered and that ' + '`appName` matches that app exactly.');
|
|
53
|
+
}
|
|
54
|
+
return 'error.unavailable';
|
|
55
|
+
}
|
|
56
|
+
if (e.status === 429) return 'error.loadRateLimited';
|
|
57
|
+
}
|
|
58
|
+
return 'error.loadFailed';
|
|
59
|
+
}
|
|
60
|
+
export function useSupportThreads({
|
|
61
|
+
config,
|
|
62
|
+
revenuecatId,
|
|
63
|
+
enabled,
|
|
64
|
+
sheetOpen,
|
|
65
|
+
activeThreadId,
|
|
66
|
+
idlePollMs
|
|
67
|
+
}) {
|
|
68
|
+
const [threads, setThreads] = useState(null);
|
|
69
|
+
const [totalUnread, setTotalUnread] = useState(0);
|
|
70
|
+
const [loading, setLoading] = useState(false);
|
|
71
|
+
const [refreshing, setRefreshing] = useState(false);
|
|
72
|
+
const [errorKey, setErrorKey] = useState(null);
|
|
73
|
+
const [serverLanguage, setServerLanguage] = useState(null);
|
|
74
|
+
const [languageLoaded, setLanguageLoaded] = useState(false);
|
|
75
|
+
const mounted = useRef(true);
|
|
76
|
+
/** Last server payload, before local read reconciliation. */
|
|
77
|
+
const rawThreads = useRef(null);
|
|
78
|
+
const watermarks = useRef(new Map());
|
|
79
|
+
const reads = useRef(new Map());
|
|
80
|
+
const requestSeq = useRef(0);
|
|
81
|
+
const appliedSeq = useRef(0);
|
|
82
|
+
const readEpoch = useRef(0);
|
|
83
|
+
const activeThreadIdRef = useRef(activeThreadId);
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
activeThreadIdRef.current = activeThreadId;
|
|
86
|
+
}, [activeThreadId]);
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
mounted.current = true;
|
|
89
|
+
const timers = reads.current;
|
|
90
|
+
return () => {
|
|
91
|
+
mounted.current = false;
|
|
92
|
+
for (const attempt of timers.values()) {
|
|
93
|
+
if (attempt.timer !== null) clearTimeout(attempt.timer);
|
|
94
|
+
}
|
|
95
|
+
timers.clear();
|
|
96
|
+
};
|
|
97
|
+
}, []);
|
|
98
|
+
const publish = useCallback(() => {
|
|
99
|
+
const raw = rawThreads.current;
|
|
100
|
+
if (raw === null) return;
|
|
101
|
+
const reconciled = reconcileThreads(raw, watermarks.current);
|
|
102
|
+
setThreads(reconciled);
|
|
103
|
+
setTotalUnread(sumUnread(reconciled));
|
|
104
|
+
}, []);
|
|
105
|
+
|
|
106
|
+
/** POSTs the receipt, retrying transient failures with backoff. */
|
|
107
|
+
const sendRead = useCallback(threadId => {
|
|
108
|
+
const attempt = reads.current.get(threadId);
|
|
109
|
+
if (!attempt || attempt.inFlight !== null) return;
|
|
110
|
+
const covers = attempt.target;
|
|
111
|
+
attempt.inFlight = covers;
|
|
112
|
+
attempt.timer = null;
|
|
113
|
+
markRead(config, {
|
|
114
|
+
queryId: threadId,
|
|
115
|
+
revenuecatId
|
|
116
|
+
}).then(() => {
|
|
117
|
+
if (!mounted.current) return;
|
|
118
|
+
const current = reads.current.get(threadId);
|
|
119
|
+
if (!current) return;
|
|
120
|
+
current.inFlight = null;
|
|
121
|
+
// A reply that landed while this request was in flight isn't
|
|
122
|
+
// covered by the receipt it just wrote — send one more.
|
|
123
|
+
if (current.target > covers) {
|
|
124
|
+
current.attempts = 0;
|
|
125
|
+
sendRead(threadId);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
reads.current.delete(threadId);
|
|
129
|
+
// The receipt now exists server-side, so any response still in
|
|
130
|
+
// flight predates it and must not be trusted for unread counts.
|
|
131
|
+
readEpoch.current += 1;
|
|
132
|
+
}).catch(() => {
|
|
133
|
+
if (!mounted.current) return;
|
|
134
|
+
const current = reads.current.get(threadId);
|
|
135
|
+
if (!current) return;
|
|
136
|
+
current.inFlight = null;
|
|
137
|
+
current.attempts += 1;
|
|
138
|
+
if (current.attempts >= MARK_READ_MAX_ATTEMPTS) return;
|
|
139
|
+
current.timer = setTimeout(() => sendRead(threadId), MARK_READ_BACKOFF_MS * 2 ** (current.attempts - 1));
|
|
140
|
+
});
|
|
141
|
+
}, [config, revenuecatId]);
|
|
142
|
+
|
|
143
|
+
/** Re-drives receipts that gave up earlier (next poll tick / foreground). */
|
|
144
|
+
const flushReads = useCallback(() => {
|
|
145
|
+
for (const [threadId, attempt] of reads.current) {
|
|
146
|
+
if (attempt.inFlight !== null || attempt.timer !== null) continue;
|
|
147
|
+
attempt.attempts = 0;
|
|
148
|
+
sendRead(threadId);
|
|
149
|
+
}
|
|
150
|
+
}, [sendRead]);
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Records that the user has seen every reply currently in `threadId` and
|
|
154
|
+
* persists it. Idempotent: re-marking a thread with nothing new is a
|
|
155
|
+
* no-op, so the 5s in-thread poll doesn't spam the endpoint.
|
|
156
|
+
*/
|
|
157
|
+
const markThreadRead = useCallback(threadId => {
|
|
158
|
+
const thread = rawThreads.current?.find(t => t.id === threadId);
|
|
159
|
+
if (!thread) return;
|
|
160
|
+
const latest = latestAdminMessageAt(thread);
|
|
161
|
+
if (latest === 0) return;
|
|
162
|
+
if (latest <= (watermarks.current.get(threadId) ?? 0)) return;
|
|
163
|
+
watermarks.current.set(threadId, latest);
|
|
164
|
+
// Invalidate the bare counts of any request already in flight.
|
|
165
|
+
readEpoch.current += 1;
|
|
166
|
+
publish();
|
|
167
|
+
const attempt = reads.current.get(threadId);
|
|
168
|
+
if (attempt) attempt.target = latest;else {
|
|
169
|
+
reads.current.set(threadId, {
|
|
170
|
+
target: latest,
|
|
171
|
+
inFlight: null,
|
|
172
|
+
attempts: 0,
|
|
173
|
+
timer: null
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
sendRead(threadId);
|
|
177
|
+
}, [publish, sendRead]);
|
|
178
|
+
const fetchThreads = useCallback(async mode => {
|
|
179
|
+
if (!enabled) return;
|
|
180
|
+
const seq = requestSeq.current += 1;
|
|
181
|
+
// With nothing cached there is no list to pull down, so a retry shows
|
|
182
|
+
// the skeleton rather than a spinner nobody can see.
|
|
183
|
+
const blank = rawThreads.current === null;
|
|
184
|
+
const spinner = mode === 'user' && !blank;
|
|
185
|
+
const skeleton = mode !== 'background' && blank;
|
|
186
|
+
if (spinner) setRefreshing(true);
|
|
187
|
+
if (skeleton) setLoading(true);
|
|
188
|
+
try {
|
|
189
|
+
const data = await getThreads(config, revenuecatId);
|
|
190
|
+
if (!mounted.current) return;
|
|
191
|
+
// A slower earlier request must never clobber a newer answer.
|
|
192
|
+
if (seq <= appliedSeq.current) return;
|
|
193
|
+
appliedSeq.current = seq;
|
|
194
|
+
rawThreads.current = data.threads;
|
|
195
|
+
watermarks.current = pruneWatermarks(watermarks.current, data.threads);
|
|
196
|
+
setErrorKey(null);
|
|
197
|
+
setServerLanguage(data.language);
|
|
198
|
+
setLanguageLoaded(true);
|
|
199
|
+
publish();
|
|
200
|
+
|
|
201
|
+
// Replies that arrived while the user is sitting in the thread are
|
|
202
|
+
// read on arrival — otherwise the badge climbed while they read.
|
|
203
|
+
const active = activeThreadIdRef.current;
|
|
204
|
+
if (active !== null) markThreadRead(active);
|
|
205
|
+
flushReads();
|
|
206
|
+
} catch (e) {
|
|
207
|
+
if (!mounted.current) return;
|
|
208
|
+
// A failed background poll must not blow away cached threads.
|
|
209
|
+
if (rawThreads.current === null) setErrorKey(loadErrorKey(e));
|
|
210
|
+
} finally {
|
|
211
|
+
if (mounted.current) {
|
|
212
|
+
if (spinner) setRefreshing(false);
|
|
213
|
+
if (skeleton) setLoading(false);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}, [config, enabled, revenuecatId, publish, markThreadRead, flushReads]);
|
|
217
|
+
|
|
218
|
+
/** Badge-only refresh — the cheap endpoint, used while idle. */
|
|
219
|
+
const fetchCount = useCallback(async () => {
|
|
220
|
+
if (!enabled) return;
|
|
221
|
+
const seq = requestSeq.current += 1;
|
|
222
|
+
const epoch = readEpoch.current;
|
|
223
|
+
try {
|
|
224
|
+
const data = await getUnreadCount(config, revenuecatId);
|
|
225
|
+
if (!mounted.current) return;
|
|
226
|
+
// This payload is just a number: there is no way to subtract reads
|
|
227
|
+
// that happened while it was in flight, so discard it instead.
|
|
228
|
+
if (readEpoch.current !== epoch) return;
|
|
229
|
+
if (seq <= appliedSeq.current) return;
|
|
230
|
+
appliedSeq.current = seq;
|
|
231
|
+
setTotalUnread(data.total_unread);
|
|
232
|
+
} catch {
|
|
233
|
+
// Best effort: the next tick or the next sheet open reconciles.
|
|
234
|
+
}
|
|
235
|
+
}, [config, enabled, revenuecatId]);
|
|
236
|
+
|
|
237
|
+
// Initial load.
|
|
238
|
+
useEffect(() => {
|
|
239
|
+
void fetchThreads('initial');
|
|
240
|
+
}, [fetchThreads]);
|
|
241
|
+
|
|
242
|
+
// Opening the sheet always shows fresh data.
|
|
243
|
+
useEffect(() => {
|
|
244
|
+
if (sheetOpen) void fetchThreads('background');
|
|
245
|
+
}, [sheetOpen, fetchThreads]);
|
|
246
|
+
|
|
247
|
+
// Opening a thread marks it read immediately, before the next poll.
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
if (activeThreadId !== null) markThreadRead(activeThreadId);
|
|
250
|
+
}, [activeThreadId, markThreadRead]);
|
|
251
|
+
|
|
252
|
+
// Cadence follows what the user is looking at; the app returning to the
|
|
253
|
+
// foreground always ticks.
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
if (!enabled) return;
|
|
256
|
+
const idle = !sheetOpen;
|
|
257
|
+
const intervalMs = idle ? idlePollMs : activeThreadId !== null ? THREAD_POLL_MS : SHEET_POLL_MS;
|
|
258
|
+
const tick = () => {
|
|
259
|
+
// While a receipt is unconfirmed the count-only endpoint would report
|
|
260
|
+
// replies the user has already read, so pay for the full payload.
|
|
261
|
+
if (idle && reads.current.size === 0) void fetchCount();else void fetchThreads('background');
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// Clamped so a typo like `pollIntervalMs={30}` can't hammer the API;
|
|
265
|
+
// 0 (or negative) disables idle polling entirely.
|
|
266
|
+
const timer = intervalMs > 0 ? setInterval(tick, Math.max(intervalMs, MIN_POLL_MS)) : null;
|
|
267
|
+
const appStateSub = AppState.addEventListener('change', state => {
|
|
268
|
+
if (state === 'active') tick();
|
|
269
|
+
});
|
|
270
|
+
return () => {
|
|
271
|
+
if (timer !== null) clearInterval(timer);
|
|
272
|
+
appStateSub.remove();
|
|
273
|
+
};
|
|
274
|
+
}, [enabled, sheetOpen, activeThreadId, idlePollMs, fetchThreads, fetchCount]);
|
|
275
|
+
const refresh = useCallback(() => {
|
|
276
|
+
void fetchThreads('user');
|
|
277
|
+
}, [fetchThreads]);
|
|
278
|
+
const reload = useCallback(() => fetchThreads('background'), [fetchThreads]);
|
|
279
|
+
return {
|
|
280
|
+
threads,
|
|
281
|
+
totalUnread,
|
|
282
|
+
loading,
|
|
283
|
+
refreshing,
|
|
284
|
+
errorKey,
|
|
285
|
+
serverLanguage,
|
|
286
|
+
languageLoaded,
|
|
287
|
+
refresh,
|
|
288
|
+
reload
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=useSupportThreads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","useState","AppState","getThreads","getUnreadCount","markRead","SupportApiError","latestAdminMessageAt","pruneWatermarks","reconcileThreads","sumUnread","THREAD_POLL_MS","SHEET_POLL_MS","IDLE_POLL_MS","MIN_POLL_MS","MARK_READ_MAX_ATTEMPTS","MARK_READ_BACKOFF_MS","loadErrorKey","e","offline","status","__DEV__","console","error","useSupportThreads","config","revenuecatId","enabled","sheetOpen","activeThreadId","idlePollMs","threads","setThreads","totalUnread","setTotalUnread","loading","setLoading","refreshing","setRefreshing","errorKey","setErrorKey","serverLanguage","setServerLanguage","languageLoaded","setLanguageLoaded","mounted","rawThreads","watermarks","Map","reads","requestSeq","appliedSeq","readEpoch","activeThreadIdRef","current","timers","attempt","values","timer","clearTimeout","clear","publish","raw","reconciled","sendRead","threadId","get","inFlight","covers","target","queryId","then","attempts","delete","catch","setTimeout","flushReads","markThreadRead","thread","find","t","id","latest","set","fetchThreads","mode","seq","blank","spinner","skeleton","data","language","active","fetchCount","epoch","total_unread","idle","intervalMs","tick","size","setInterval","Math","max","appStateSub","addEventListener","state","clearInterval","remove","refresh","reload"],"sourceRoot":"../../src","sources":["useSupportThreads.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/utils.js
CHANGED
|
@@ -1,30 +1,75 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
// Dates and times follow the language the user picked, not the device's:
|
|
4
|
+
// a sheet that says "Traduction…" above "2 days ago" reads as broken.
|
|
5
|
+
|
|
3
6
|
/** "2h ago" relative time — mirrors the web dashboard's formatting. */
|
|
4
|
-
export function relativeTime(iso) {
|
|
7
|
+
export function relativeTime(iso, strings) {
|
|
5
8
|
const then = new Date(iso).getTime();
|
|
6
9
|
const seconds = Math.max(0, Math.floor((Date.now() - then) / 1000));
|
|
7
|
-
if (seconds < 60) return '
|
|
10
|
+
if (seconds < 60) return strings.t('time.justNow');
|
|
8
11
|
const minutes = Math.floor(seconds / 60);
|
|
9
|
-
if (minutes < 60) return
|
|
12
|
+
if (minutes < 60) return strings.t('time.minutes', {
|
|
13
|
+
count: minutes
|
|
14
|
+
});
|
|
10
15
|
const hours = Math.floor(minutes / 60);
|
|
11
|
-
if (hours < 24) return
|
|
16
|
+
if (hours < 24) return strings.t('time.hours', {
|
|
17
|
+
count: hours
|
|
18
|
+
});
|
|
12
19
|
const days = Math.floor(hours / 24);
|
|
13
|
-
if (days < 7) return
|
|
20
|
+
if (days < 7) return strings.t('time.days', {
|
|
21
|
+
count: days
|
|
22
|
+
});
|
|
14
23
|
const weeks = Math.floor(days / 7);
|
|
15
|
-
if (weeks < 5) return
|
|
24
|
+
if (weeks < 5) return strings.t('time.weeks', {
|
|
25
|
+
count: weeks
|
|
26
|
+
});
|
|
16
27
|
const months = Math.floor(days / 30);
|
|
17
|
-
if (months < 12) return
|
|
18
|
-
|
|
28
|
+
if (months < 12) return strings.t('time.months', {
|
|
29
|
+
count: months
|
|
30
|
+
});
|
|
31
|
+
return strings.t('time.years', {
|
|
32
|
+
count: Math.floor(days / 365)
|
|
33
|
+
});
|
|
19
34
|
}
|
|
20
|
-
export function formatDate(iso) {
|
|
21
|
-
return new Date(iso).toLocaleDateString(
|
|
35
|
+
export function formatDate(iso, strings) {
|
|
36
|
+
return new Date(iso).toLocaleDateString(strings.locale, {
|
|
22
37
|
year: 'numeric',
|
|
23
38
|
month: 'short',
|
|
24
39
|
day: 'numeric'
|
|
25
40
|
});
|
|
26
41
|
}
|
|
27
42
|
|
|
43
|
+
/** "14:32" in the user's locale — shown under a group of messages. */
|
|
44
|
+
export function formatTime(iso, strings) {
|
|
45
|
+
return new Date(iso).toLocaleTimeString(strings.locale, {
|
|
46
|
+
hour: 'numeric',
|
|
47
|
+
minute: '2-digit'
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function isSameDay(a, b) {
|
|
51
|
+
const first = new Date(a);
|
|
52
|
+
const second = new Date(b);
|
|
53
|
+
return first.getFullYear() === second.getFullYear() && first.getMonth() === second.getMonth() && first.getDate() === second.getDate();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Date separator label: Today / Yesterday / "Mon, 5 Jan". */
|
|
57
|
+
export function dayLabel(iso, strings) {
|
|
58
|
+
const now = new Date();
|
|
59
|
+
if (isSameDay(iso, now.toISOString())) return strings.t('time.today');
|
|
60
|
+
const yesterday = new Date(now.getTime() - 86_400_000);
|
|
61
|
+
if (isSameDay(iso, yesterday.toISOString())) return strings.t('time.yesterday');
|
|
62
|
+
const date = new Date(iso);
|
|
63
|
+
return date.toLocaleDateString(strings.locale, {
|
|
64
|
+
weekday: 'short',
|
|
65
|
+
month: 'short',
|
|
66
|
+
day: 'numeric',
|
|
67
|
+
...(date.getFullYear() === now.getFullYear() ? {} : {
|
|
68
|
+
year: 'numeric'
|
|
69
|
+
})
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
28
73
|
/** Dev-mode prop validation with actionable messages. */
|
|
29
74
|
export function validateProps(props) {
|
|
30
75
|
if (typeof props.appName !== 'string' || props.appName.length === 0) {
|
package/lib/module/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["relativeTime","iso","then","Date","getTime","seconds","Math","max","floor","now","minutes","hours","days","weeks","months","formatDate","toLocaleDateString","
|
|
1
|
+
{"version":3,"names":["relativeTime","iso","strings","then","Date","getTime","seconds","Math","max","floor","now","t","minutes","count","hours","days","weeks","months","formatDate","toLocaleDateString","locale","year","month","day","formatTime","toLocaleTimeString","hour","minute","isSameDay","a","b","first","second","getFullYear","getMonth","getDate","dayLabel","toISOString","yesterday","date","weekday","validateProps","props","appName","length","apiKey","supabaseUrl","test","user","name","isPaid","revenuecatId","appVersion"],"sourceRoot":"../../src","sources":["utils.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -27,6 +27,13 @@ export declare function registerPush(config: ApiConfig, input: {
|
|
|
27
27
|
}): Promise<{
|
|
28
28
|
ok: boolean;
|
|
29
29
|
}>;
|
|
30
|
+
/** Records the language the user reads and writes support messages in. */
|
|
31
|
+
export declare function setLanguage(config: ApiConfig, input: {
|
|
32
|
+
revenuecatId: string;
|
|
33
|
+
language: string;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
language: string;
|
|
36
|
+
}>;
|
|
30
37
|
export declare function submitQuery(config: ApiConfig, input: {
|
|
31
38
|
queryType: QueryType;
|
|
32
39
|
message: string;
|
|
@@ -34,6 +41,7 @@ export declare function submitQuery(config: ApiConfig, input: {
|
|
|
34
41
|
isPaid: boolean;
|
|
35
42
|
revenuecatId: string;
|
|
36
43
|
appVersion: string;
|
|
44
|
+
language: string;
|
|
37
45
|
}): Promise<{
|
|
38
46
|
query_id: string;
|
|
39
47
|
}>;
|
|
@@ -41,6 +49,7 @@ export declare function postMessage(config: ApiConfig, input: {
|
|
|
41
49
|
queryId: string;
|
|
42
50
|
revenuecatId: string;
|
|
43
51
|
message: string;
|
|
52
|
+
language: string;
|
|
44
53
|
}): Promise<{
|
|
45
54
|
message_id: string;
|
|
46
55
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;gBAEL,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,UAAQ;CAMpE;AA2CD,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CAK1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnC;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAW1B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IACL,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;gBAEL,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,UAAQ;CAMpE;AA2CD,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC,CAK1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnC;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAW1B;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IACL,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAe/B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAUjC;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAQ1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../../src/components/BottomSheet.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../../src/components/BottomSheet.tsx"],"names":[],"mappings":"AAWA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAWjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,sCAyJA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type StyleProp, type ViewStyle } from 'react-native';
|
|
2
|
+
import type { SupportTheme } from '../theme';
|
|
3
|
+
import type { LauncherVariant } from '../types';
|
|
4
|
+
export declare function LauncherButton({ theme, unread, variant, size, label, style, onPress, }: {
|
|
5
|
+
theme: SupportTheme;
|
|
6
|
+
unread: number;
|
|
7
|
+
variant?: LauncherVariant;
|
|
8
|
+
size?: number;
|
|
9
|
+
/** Renders a pill with text next to the mark instead of a circle. */
|
|
10
|
+
label?: string;
|
|
11
|
+
style?: StyleProp<ViewStyle>;
|
|
12
|
+
onPress: () => void;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=LauncherButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LauncherButton.d.ts","sourceRoot":"","sources":["../../../src/components/LauncherButton.tsx"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAUhD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,OAAiB,EACjB,IAAS,EACT,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,+BA8KA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { SupportButtonProps } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
* The single entry point of the SDK: a
|
|
4
|
-
* opens the support bottom sheet.
|
|
5
|
-
*
|
|
3
|
+
* The single entry point of the SDK: a launcher with an unread badge that
|
|
4
|
+
* opens the support bottom sheet. Threads, polling, and read receipts are
|
|
5
|
+
* handled by useSupportThreads.
|
|
6
6
|
*/
|
|
7
7
|
export declare function SupportButton(props: SupportButtonProps): import("react").JSX.Element | null;
|
|
8
8
|
//# sourceMappingURL=SupportButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupportButton.d.ts","sourceRoot":"","sources":["../../../src/components/SupportButton.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SupportButton.d.ts","sourceRoot":"","sources":["../../../src/components/SupportButton.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAa,kBAAkB,EAAU,MAAM,UAAU,CAAC;AAgBtE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,sCAmTtD"}
|