@appsupportkit/support-sdk 0.1.1 → 0.1.2

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.
@@ -5,8 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.SupportApiError = void 0;
7
7
  exports.getThreads = getThreads;
8
+ exports.getUnreadCount = getUnreadCount;
8
9
  exports.markRead = markRead;
9
10
  exports.postMessage = postMessage;
11
+ exports.registerPush = registerPush;
10
12
  exports.submitQuery = submitQuery;
11
13
  // Thin client for the Supabase Edge Functions. Every call authenticates with
12
14
  // the per-app x-api-key header; no Supabase JS client is needed on-device.
@@ -57,6 +59,33 @@ function getThreads(config, revenuecatId) {
57
59
  method: 'GET'
58
60
  });
59
61
  }
62
+
63
+ /**
64
+ * Badge-only endpoint (~18 bytes) used for idle polling, instead of
65
+ * re-fetching every thread and message just to check for new replies.
66
+ */
67
+ function getUnreadCount(config, revenuecatId) {
68
+ const params = new URLSearchParams({
69
+ revenuecat_id: revenuecatId
70
+ });
71
+ return request(config, `get-unread-count?${params.toString()}`, {
72
+ method: 'GET'
73
+ });
74
+ }
75
+
76
+ /** Reports the OS notification permission outcome (including denials). */
77
+ function registerPush(config, input) {
78
+ return request(config, 'register-push', {
79
+ method: 'POST',
80
+ body: JSON.stringify({
81
+ app_name: config.appName,
82
+ revenuecat_id: input.revenuecatId,
83
+ permission_status: input.permissionStatus,
84
+ expo_push_token: input.expoPushToken,
85
+ asked: input.asked
86
+ })
87
+ });
88
+ }
60
89
  function submitQuery(config, input) {
61
90
  return request(config, 'submit-query', {
62
91
  method: 'POST',
@@ -1 +1 @@
1
- {"version":3,"names":["SupportApiError","Error","constructor","message","status","offline","name","exports","request","config","path","init","url","supabaseUrl","replace","response","fetch","headers","apiKey","payload","json","ok","error","getThreads","revenuecatId","params","URLSearchParams","revenuecat_id","toString","method","submitQuery","input","body","JSON","stringify","app_name","appName","query_type","queryType","user_name","userName","is_paid","isPaid","app_version","appVersion","postMessage","query_id","queryId","markRead"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["SupportApiError","Error","constructor","message","status","offline","name","exports","request","config","path","init","url","supabaseUrl","replace","response","fetch","headers","apiKey","payload","json","ok","error","getThreads","revenuecatId","params","URLSearchParams","revenuecat_id","toString","method","getUnreadCount","registerPush","input","body","JSON","stringify","app_name","appName","permission_status","permissionStatus","expo_push_token","expoPushToken","asked","submitQuery","query_type","queryType","user_name","userName","is_paid","isPaid","app_version","appVersion","postMessage","query_id","queryId","markRead"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,7 @@ exports.SupportButton = SupportButton;
7
7
  var _react = require("react");
8
8
  var _reactNative = require("react-native");
9
9
  var _api = require("../api");
10
+ var _push = require("../push");
10
11
  var _theme = require("../theme");
11
12
  var _utils = require("../utils");
12
13
  var _BottomSheet = require("./BottomSheet");
@@ -15,6 +16,15 @@ var _ComposeScreen = require("./screens/ComposeScreen");
15
16
  var _HomeScreen = require("./screens/HomeScreen");
16
17
  var _ThreadScreen = require("./screens/ThreadScreen");
17
18
  var _jsxRuntime = require("react/jsx-runtime");
19
+ // Poll cadence by context: fast where latency is felt (staring at a thread
20
+ // waiting for a reply), slow when the sheet is closed — and the idle tick
21
+ // uses the count-only endpoint, so it costs ~18 bytes instead of the full
22
+ // thread list.
23
+ const THREAD_POLL_MS = 5_000;
24
+ const SHEET_POLL_MS = 15_000;
25
+ const IDLE_POLL_MS = 60_000;
26
+ const MIN_POLL_MS = 3_000;
27
+
18
28
  /**
19
29
  * The single entry point of the SDK: a button with an unread badge that
20
30
  * opens the support bottom sheet. Polls get-threads on mount and whenever
@@ -60,26 +70,65 @@ function SupportButton(props) {
60
70
  }
61
71
  }, [config, props.user.revenuecatId, validationError]);
62
72
 
73
+ /** Badge-only refresh — the cheap endpoint used while idle. */
74
+ const refreshBadge = (0, _react.useCallback)(async () => {
75
+ if (validationError) return;
76
+ try {
77
+ const data = await (0, _api.getUnreadCount)(config, props.user.revenuecatId);
78
+ if (mounted.current) setTotalUnread(data.total_unread);
79
+ } catch {
80
+ // Best-effort: the next tick or the next sheet open reconciles.
81
+ }
82
+ }, [config, props.user.revenuecatId, validationError]);
83
+
63
84
  // Poll on mount…
64
85
  (0, _react.useEffect)(() => {
65
86
  void refresh();
66
87
  }, [refresh]);
67
88
 
68
- // …in the background so the badge stays current without opening the
69
- // sheet, and whenever the app returns to the foreground.
70
- const pollIntervalMs = props.pollIntervalMs ?? 30_000;
89
+ // …then adapt the cadence to what the user is looking at, and refresh
90
+ // whenever the app returns to the foreground.
91
+ const idlePollMs = props.pollIntervalMs ?? IDLE_POLL_MS;
92
+ const screenName = screen.name;
71
93
  (0, _react.useEffect)(() => {
72
- // Clamp to a sane floor so a typo like `pollIntervalMs={30}` doesn't
73
- // hammer the API. 0 (or negative) disables interval polling.
74
- const interval = pollIntervalMs > 0 ? setInterval(() => void refresh(), Math.max(pollIntervalMs, 5_000)) : null;
94
+ const idle = !sheetOpen;
95
+ const intervalMs = idle ? idlePollMs : screenName === 'thread' ? THREAD_POLL_MS : SHEET_POLL_MS;
96
+
97
+ // While idle only the badge matters, so use the count-only endpoint.
98
+ const tick = () => void (idle ? refreshBadge() : refresh());
99
+
100
+ // Clamped so a typo like `pollIntervalMs={30}` can't hammer the API;
101
+ // 0 (or negative) disables idle polling entirely.
102
+ const timer = intervalMs > 0 ? setInterval(tick, Math.max(intervalMs, MIN_POLL_MS)) : null;
75
103
  const appStateSub = _reactNative.AppState.addEventListener('change', state => {
76
- if (state === 'active') void refresh();
104
+ if (state === 'active') tick();
77
105
  });
78
106
  return () => {
79
- if (interval !== null) clearInterval(interval);
107
+ if (timer !== null) clearInterval(timer);
80
108
  appStateSub.remove();
81
109
  };
82
- }, [pollIntervalMs, refresh]);
110
+ }, [sheetOpen, screenName, idlePollMs, refresh, refreshBadge]);
111
+
112
+ /**
113
+ * Asks for notification permission the moment the sheet opens, then
114
+ * reports the outcome (including denials) so the dashboard knows whether
115
+ * this user is reachable. Deliberately fire-and-forget: nothing in the
116
+ * support flow waits on it or breaks if it fails.
117
+ */
118
+ const syncPushPermission = (0, _react.useCallback)(async () => {
119
+ if (validationError || !_push.isPushAvailable) return;
120
+ try {
121
+ const registration = await (0, _push.ensurePushPermission)(props.expoProjectId);
122
+ await (0, _api.registerPush)(config, {
123
+ revenuecatId: props.user.revenuecatId,
124
+ permissionStatus: registration.status,
125
+ expoPushToken: registration.token,
126
+ asked: registration.asked
127
+ });
128
+ } catch {
129
+ // Push is an enhancement — never surfaced to the user as an error.
130
+ }
131
+ }, [config, props.user.revenuecatId, props.expoProjectId, validationError]);
83
132
 
84
133
  // …and on sheet open.
85
134
  function openSheet() {
@@ -88,6 +137,9 @@ function SupportButton(props) {
88
137
  });
89
138
  setSheetOpen(true);
90
139
  void refresh();
140
+ // The OS prompt appears right as the sheet opens; if the user declines,
141
+ // everything below carries on exactly as before.
142
+ void syncPushPermission();
91
143
  }
92
144
  function closeSheet() {
93
145
  setSheetOpen(false);
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_api","_theme","_utils","_BottomSheet","_icons","_ComposeScreen","_HomeScreen","_ThreadScreen","_jsxRuntime","SupportButton","props","validationError","validateProps","theme","resolveTheme","config","useMemo","supabaseUrl","apiKey","appName","sheetOpen","setSheetOpen","useState","screen","setScreen","name","threads","setThreads","totalUnread","setTotalUnread","loading","setLoading","error","setError","mounted","useRef","useEffect","current","refresh","useCallback","data","getThreads","user","revenuecatId","total_unread","e","SupportApiError","offline","pollIntervalMs","interval","setInterval","Math","max","appStateSub","AppState","addEventListener","state","clearInterval","remove","openSheet","closeSheet","__DEV__","console","jsx","View","style","padding","borderWidth","borderColor","colors","statusDanger","borderRadius","radii","control","children","Text","fontSize","color","openThread","thread","threadId","id","unread_count","prev","map","t","n","markRead","queryId","catch","writeErrorMessage","status","handleSubmit","type","message","submitQuery","queryType","userName","isPaid","appVersion","handleSend","postMessage","activeThread","find","jsxs","Fragment","Pressable","onPress","accessibilityRole","accessibilityLabel","pressed","width","height","border","backgroundColor","surfaceHover","surface","alignItems","justifyContent","BubbleMark","textPrimary","size","position","top","right","minWidth","paddingHorizontal","accent","fontWeight","accentForeground","fontVariant","BottomSheet","visible","onClose","HomeScreen","onRetry","onCompose","onOpenThread","ComposeScreen","onBack","onSubmit","ThreadScreen","onSend"],"sourceRoot":"../../../src","sources":["components/SupportButton.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_api","_push","_theme","_utils","_BottomSheet","_icons","_ComposeScreen","_HomeScreen","_ThreadScreen","_jsxRuntime","THREAD_POLL_MS","SHEET_POLL_MS","IDLE_POLL_MS","MIN_POLL_MS","SupportButton","props","validationError","validateProps","theme","resolveTheme","config","useMemo","supabaseUrl","apiKey","appName","sheetOpen","setSheetOpen","useState","screen","setScreen","name","threads","setThreads","totalUnread","setTotalUnread","loading","setLoading","error","setError","mounted","useRef","useEffect","current","refresh","useCallback","data","getThreads","user","revenuecatId","total_unread","e","SupportApiError","offline","refreshBadge","getUnreadCount","idlePollMs","pollIntervalMs","screenName","idle","intervalMs","tick","timer","setInterval","Math","max","appStateSub","AppState","addEventListener","state","clearInterval","remove","syncPushPermission","isPushAvailable","registration","ensurePushPermission","expoProjectId","registerPush","permissionStatus","status","expoPushToken","token","asked","openSheet","closeSheet","__DEV__","console","jsx","View","style","padding","borderWidth","borderColor","colors","statusDanger","borderRadius","radii","control","children","Text","fontSize","color","openThread","thread","threadId","id","unread_count","prev","map","t","n","markRead","queryId","catch","writeErrorMessage","handleSubmit","type","message","submitQuery","queryType","userName","isPaid","appVersion","handleSend","postMessage","activeThread","find","jsxs","Fragment","Pressable","onPress","accessibilityRole","accessibilityLabel","pressed","width","height","border","backgroundColor","surfaceHover","surface","alignItems","justifyContent","BubbleMark","textPrimary","size","position","top","right","minWidth","paddingHorizontal","accent","fontWeight","accentForeground","fontVariant","BottomSheet","visible","onClose","HomeScreen","onRetry","onCompose","onOpenThread","ComposeScreen","onBack","onSubmit","ThreadScreen","onSend"],"sourceRoot":"../../../src","sources":["components/SupportButton.tsx"],"mappings":"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","ignoreList":[]}
@@ -33,6 +33,12 @@ Object.defineProperty(exports, "USER_MESSAGE_MIN", {
33
33
  return _types.USER_MESSAGE_MIN;
34
34
  }
35
35
  });
36
+ Object.defineProperty(exports, "isPushAvailable", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _push.isPushAvailable;
40
+ }
41
+ });
36
42
  Object.defineProperty(exports, "resolveTheme", {
37
43
  enumerable: true,
38
44
  get: function () {
@@ -54,5 +60,6 @@ Object.defineProperty(exports, "supportLightTheme", {
54
60
  var _SupportButton = require("./components/SupportButton");
55
61
  var _theme = require("./theme");
56
62
  var _api = require("./api");
63
+ var _push = require("./push");
57
64
  var _types = require("./types");
58
65
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_SupportButton","require","_theme","_api","_types"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,IAAA,GAAAF,OAAA;AAYA,IAAAG,MAAA,GAAAH,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_SupportButton","require","_theme","_api","_push","_types"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,IAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AAaA,IAAAI,MAAA,GAAAJ,OAAA","ignoreList":[]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ensurePushPermission = ensurePushPermission;
7
+ exports.isPushAvailable = void 0;
8
+ // Optional push-notification support.
9
+ //
10
+ // expo-notifications is an OPTIONAL peer dependency: if the host app has it
11
+ // installed we ask for permission and mint a token, otherwise every function
12
+ // here degrades to "undetermined" and the support flow is unaffected. The
13
+ // require is wrapped in try/catch so bundling succeeds either way.
14
+ //
15
+ // Nothing in the support experience is gated on the result — a user who
16
+ // denies notifications keeps full use of threads, replies, and unread
17
+ // badges. The status is reported purely so the dashboard can show whether
18
+ // the user is reachable.
19
+
20
+ /** The slice of expo-notifications this SDK uses. */
21
+
22
+ function loadNotifications() {
23
+ try {
24
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
25
+ const mod = require('expo-notifications');
26
+ return typeof mod?.getPermissionsAsync === 'function' ? mod : null;
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+ const notifications = loadNotifications();
32
+
33
+ /** True when the host app has expo-notifications installed. */
34
+ const isPushAvailable = exports.isPushAvailable = notifications !== null;
35
+ function normalizeStatus(status) {
36
+ if (status === 'granted') return 'granted';
37
+ if (status === 'denied') return 'denied';
38
+ return 'undetermined';
39
+ }
40
+
41
+ /**
42
+ * Ensures notification permission has been requested, and returns the
43
+ * outcome plus an Expo push token when one is obtainable.
44
+ *
45
+ * Never throws: any failure resolves to an 'undetermined' registration so
46
+ * callers can report it and move on.
47
+ */
48
+ async function ensurePushPermission(expoProjectId) {
49
+ if (!notifications) {
50
+ return {
51
+ status: 'undetermined',
52
+ asked: false,
53
+ token: null
54
+ };
55
+ }
56
+ try {
57
+ const current = await notifications.getPermissionsAsync();
58
+ let status = normalizeStatus(current.status);
59
+ let asked = false;
60
+
61
+ // Only prompt when the OS will actually show something. Re-prompting a
62
+ // user who already decided is impossible on iOS and annoying on Android.
63
+ if (status === 'undetermined' && current.canAskAgain) {
64
+ const requested = await notifications.requestPermissionsAsync();
65
+ status = normalizeStatus(requested.status);
66
+ asked = true;
67
+ }
68
+ if (status !== 'granted') {
69
+ return {
70
+ status,
71
+ asked,
72
+ token: null
73
+ };
74
+ }
75
+
76
+ // Token minting needs a dev/production build with push credentials —
77
+ // it fails in Expo Go. A granted permission with no token is still
78
+ // useful information for the dashboard, so report it either way.
79
+ try {
80
+ const token = await notifications.getExpoPushTokenAsync(expoProjectId ? {
81
+ projectId: expoProjectId
82
+ } : undefined);
83
+ return {
84
+ status,
85
+ asked,
86
+ token: token.data
87
+ };
88
+ } catch {
89
+ return {
90
+ status,
91
+ asked,
92
+ token: null
93
+ };
94
+ }
95
+ } catch {
96
+ return {
97
+ status: 'undetermined',
98
+ asked: false,
99
+ token: null
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["loadNotifications","mod","require","getPermissionsAsync","notifications","isPushAvailable","exports","normalizeStatus","status","ensurePushPermission","expoProjectId","asked","token","current","canAskAgain","requested","requestPermissionsAsync","getExpoPushTokenAsync","projectId","undefined","data"],"sourceRoot":"../../src","sources":["push.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AASA,SAASA,iBAAiBA,CAAA,EAAmC;EAC3D,IAAI;IACF;IACA,MAAMC,GAAG,GAAGC,OAAO,CAAC,oBAAoB,CAA4B;IACpE,OAAO,OAAOD,GAAG,EAAEE,mBAAmB,KAAK,UAAU,GAAGF,GAAG,GAAG,IAAI;EACpE,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,MAAMG,aAAa,GAAGJ,iBAAiB,CAAC,CAAC;;AAEzC;AACO,MAAMK,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGD,aAAa,KAAK,IAAI;AASrD,SAASG,eAAeA,CAACC,MAAc,EAAwB;EAC7D,IAAIA,MAAM,KAAK,SAAS,EAAE,OAAO,SAAS;EAC1C,IAAIA,MAAM,KAAK,QAAQ,EAAE,OAAO,QAAQ;EACxC,OAAO,cAAc;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeC,oBAAoBA,CACxCC,aAAsB,EACK;EAC3B,IAAI,CAACN,aAAa,EAAE;IAClB,OAAO;MAAEI,MAAM,EAAE,cAAc;MAAEG,KAAK,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9D;EAEA,IAAI;IACF,MAAMC,OAAO,GAAG,MAAMT,aAAa,CAACD,mBAAmB,CAAC,CAAC;IACzD,IAAIK,MAAM,GAAGD,eAAe,CAACM,OAAO,CAACL,MAAM,CAAC;IAC5C,IAAIG,KAAK,GAAG,KAAK;;IAEjB;IACA;IACA,IAAIH,MAAM,KAAK,cAAc,IAAIK,OAAO,CAACC,WAAW,EAAE;MACpD,MAAMC,SAAS,GAAG,MAAMX,aAAa,CAACY,uBAAuB,CAAC,CAAC;MAC/DR,MAAM,GAAGD,eAAe,CAACQ,SAAS,CAACP,MAAM,CAAC;MAC1CG,KAAK,GAAG,IAAI;IACd;IAEA,IAAIH,MAAM,KAAK,SAAS,EAAE;MACxB,OAAO;QAAEA,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC;IACvC;;IAEA;IACA;IACA;IACA,IAAI;MACF,MAAMA,KAAK,GAAG,MAAMR,aAAa,CAACa,qBAAqB,CACrDP,aAAa,GAAG;QAAEQ,SAAS,EAAER;MAAc,CAAC,GAAGS,SACjD,CAAC;MACD,OAAO;QAAEX,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAEA,KAAK,CAACQ;MAAK,CAAC;IAC7C,CAAC,CAAC,MAAM;MACN,OAAO;QAAEZ,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC;IACvC;EACF,CAAC,CAAC,MAAM;IACN,OAAO;MAAEJ,MAAM,EAAE,cAAc;MAAEG,KAAK,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9D;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["QUERY_TYPE_LABEL","exports","feedback","feature_request","bug_report","USER_MESSAGE_MIN","USER_MESSAGE_MAX"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAsEO,MAAMA,gBAA2C,GAAAC,OAAA,CAAAD,gBAAA,GAAG;EACzDE,QAAQ,EAAE,UAAU;EACpBC,eAAe,EAAE,iBAAiB;EAClCC,UAAU,EAAE;AACd,CAAC;AAEM,MAAMC,gBAAgB,GAAAJ,OAAA,CAAAI,gBAAA,GAAG,EAAE;AAC3B,MAAMC,gBAAgB,GAAAL,OAAA,CAAAK,gBAAA,GAAG,GAAG","ignoreList":[]}
1
+ {"version":3,"names":["QUERY_TYPE_LABEL","exports","feedback","feature_request","bug_report","USER_MESSAGE_MIN","USER_MESSAGE_MAX"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAiFO,MAAMA,gBAA2C,GAAAC,OAAA,CAAAD,gBAAA,GAAG;EACzDE,QAAQ,EAAE,UAAU;EACpBC,eAAe,EAAE,iBAAiB;EAClCC,UAAU,EAAE;AACd,CAAC;AAEM,MAAMC,gBAAgB,GAAAJ,OAAA,CAAAI,gBAAA,GAAG,EAAE;AAC3B,MAAMC,gBAAgB,GAAAL,OAAA,CAAAK,gBAAA,GAAG,GAAG","ignoreList":[]}
package/lib/module/api.js CHANGED
@@ -48,6 +48,33 @@ export function getThreads(config, revenuecatId) {
48
48
  method: 'GET'
49
49
  });
50
50
  }
51
+
52
+ /**
53
+ * Badge-only endpoint (~18 bytes) used for idle polling, instead of
54
+ * re-fetching every thread and message just to check for new replies.
55
+ */
56
+ export function getUnreadCount(config, revenuecatId) {
57
+ const params = new URLSearchParams({
58
+ revenuecat_id: revenuecatId
59
+ });
60
+ return request(config, `get-unread-count?${params.toString()}`, {
61
+ method: 'GET'
62
+ });
63
+ }
64
+
65
+ /** Reports the OS notification permission outcome (including denials). */
66
+ export function registerPush(config, input) {
67
+ return request(config, 'register-push', {
68
+ method: 'POST',
69
+ body: JSON.stringify({
70
+ app_name: config.appName,
71
+ revenuecat_id: input.revenuecatId,
72
+ permission_status: input.permissionStatus,
73
+ expo_push_token: input.expoPushToken,
74
+ asked: input.asked
75
+ })
76
+ });
77
+ }
51
78
  export function submitQuery(config, input) {
52
79
  return request(config, 'submit-query', {
53
80
  method: 'POST',
@@ -1 +1 @@
1
- {"version":3,"names":["SupportApiError","Error","constructor","message","status","offline","name","request","config","path","init","url","supabaseUrl","replace","response","fetch","headers","apiKey","payload","json","ok","error","getThreads","revenuecatId","params","URLSearchParams","revenuecat_id","toString","method","submitQuery","input","body","JSON","stringify","app_name","appName","query_type","queryType","user_name","userName","is_paid","isPaid","app_version","appVersion","postMessage","query_id","queryId","markRead"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["SupportApiError","Error","constructor","message","status","offline","name","request","config","path","init","url","supabaseUrl","replace","response","fetch","headers","apiKey","payload","json","ok","error","getThreads","revenuecatId","params","URLSearchParams","revenuecat_id","toString","method","getUnreadCount","registerPush","input","body","JSON","stringify","app_name","appName","permission_status","permissionStatus","expo_push_token","expoPushToken","asked","submitQuery","query_type","queryType","user_name","userName","is_paid","isPaid","app_version","appVersion","postMessage","query_id","queryId","markRead"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
@@ -2,7 +2,8 @@
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { AppState, Pressable, Text, View } from 'react-native';
5
- import { getThreads, markRead, postMessage, submitQuery, SupportApiError } from '../api';
5
+ import { getThreads, getUnreadCount, markRead, postMessage, registerPush, submitQuery, SupportApiError } from '../api';
6
+ import { ensurePushPermission, isPushAvailable } from '../push';
6
7
  import { resolveTheme } from '../theme';
7
8
  import { validateProps } from '../utils';
8
9
  import { BottomSheet } from './BottomSheet';
@@ -11,6 +12,15 @@ import { ComposeScreen } from './screens/ComposeScreen';
11
12
  import { HomeScreen } from './screens/HomeScreen';
12
13
  import { ThreadScreen } from './screens/ThreadScreen';
13
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
+
14
24
  /**
15
25
  * The single entry point of the SDK: a button with an unread badge that
16
26
  * opens the support bottom sheet. Polls get-threads on mount and whenever
@@ -56,26 +66,65 @@ export function SupportButton(props) {
56
66
  }
57
67
  }, [config, props.user.revenuecatId, validationError]);
58
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]);
79
+
59
80
  // Poll on mount…
60
81
  useEffect(() => {
61
82
  void refresh();
62
83
  }, [refresh]);
63
84
 
64
- // …in the background so the badge stays current without opening the
65
- // sheet, and whenever the app returns to the foreground.
66
- const pollIntervalMs = props.pollIntervalMs ?? 30_000;
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;
67
89
  useEffect(() => {
68
- // Clamp to a sane floor so a typo like `pollIntervalMs={30}` doesn't
69
- // hammer the API. 0 (or negative) disables interval polling.
70
- const interval = pollIntervalMs > 0 ? setInterval(() => void refresh(), Math.max(pollIntervalMs, 5_000)) : null;
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());
95
+
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;
71
99
  const appStateSub = AppState.addEventListener('change', state => {
72
- if (state === 'active') void refresh();
100
+ if (state === 'active') tick();
73
101
  });
74
102
  return () => {
75
- if (interval !== null) clearInterval(interval);
103
+ if (timer !== null) clearInterval(timer);
76
104
  appStateSub.remove();
77
105
  };
78
- }, [pollIntervalMs, refresh]);
106
+ }, [sheetOpen, screenName, idlePollMs, refresh, refreshBadge]);
107
+
108
+ /**
109
+ * Asks for notification permission the moment the sheet opens, then
110
+ * reports the outcome (including denials) so the dashboard knows whether
111
+ * this user is reachable. Deliberately fire-and-forget: nothing in the
112
+ * support flow waits on it or breaks if it fails.
113
+ */
114
+ const syncPushPermission = useCallback(async () => {
115
+ if (validationError || !isPushAvailable) return;
116
+ try {
117
+ const registration = await ensurePushPermission(props.expoProjectId);
118
+ await registerPush(config, {
119
+ revenuecatId: props.user.revenuecatId,
120
+ permissionStatus: registration.status,
121
+ expoPushToken: registration.token,
122
+ asked: registration.asked
123
+ });
124
+ } catch {
125
+ // Push is an enhancement — never surfaced to the user as an error.
126
+ }
127
+ }, [config, props.user.revenuecatId, props.expoProjectId, validationError]);
79
128
 
80
129
  // …and on sheet open.
81
130
  function openSheet() {
@@ -84,6 +133,9 @@ export function SupportButton(props) {
84
133
  });
85
134
  setSheetOpen(true);
86
135
  void refresh();
136
+ // The OS prompt appears right as the sheet opens; if the user declines,
137
+ // everything below carries on exactly as before.
138
+ void syncPushPermission();
87
139
  }
88
140
  function closeSheet() {
89
141
  setSheetOpen(false);
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","AppState","Pressable","Text","View","getThreads","markRead","postMessage","submitQuery","SupportApiError","resolveTheme","validateProps","BottomSheet","BubbleMark","ComposeScreen","HomeScreen","ThreadScreen","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","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","pollIntervalMs","interval","setInterval","Math","max","appStateSub","addEventListener","state","clearInterval","remove","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","status","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":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACzE,SAASC,QAAQ,EAAEC,SAAS,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AAC9D,SAASC,UAAU,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,WAAW,EAAEC,eAAe,QAAwB,QAAQ;AACxG,SAASC,YAAY,QAAQ,UAAU;AAEvC,SAASC,aAAa,QAAQ,UAAU;AACxC,SAASC,WAAW,QAAQ,eAAe;AAC3C,SAASC,UAAU,QAAQ,SAAS;AACpC,SAASC,aAAa,QAAQ,yBAAyB;AACvD,SAASC,UAAU,QAAQ,sBAAsB;AACjD,SAASC,YAAY,QAAQ,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAOtD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACC,KAAyB,EAAE;EACvD,MAAMC,eAAe,GAAGd,aAAa,CAACa,KAAK,CAAC;EAC5C,MAAME,KAAK,GAAGhB,YAAY,CAACc,KAAK,CAACE,KAAK,CAAC;EAEvC,MAAMC,MAAiB,GAAG7B,OAAO,CAC/B,OAAO;IACL8B,WAAW,EAAEJ,KAAK,CAACI,WAAW;IAC9BC,MAAM,EAAEL,KAAK,CAACK,MAAM;IACpBC,OAAO,EAAEN,KAAK,CAACM;EACjB,CAAC,CAAC,EACF,CAACN,KAAK,CAACI,WAAW,EAAEJ,KAAK,CAACK,MAAM,EAAEL,KAAK,CAACM,OAAO,CACjD,CAAC;EAED,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGhC,QAAQ,CAAC,KAAK,CAAC;EACjD,MAAM,CAACiC,MAAM,EAAEC,SAAS,CAAC,GAAGlC,QAAQ,CAAS;IAAEmC,IAAI,EAAE;EAAO,CAAC,CAAC;EAC9D,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGrC,QAAQ,CAAkB,IAAI,CAAC;EAC7D,MAAM,CAACsC,WAAW,EAAEC,cAAc,CAAC,GAAGvC,QAAQ,CAAC,CAAC,CAAC;EACjD,MAAM,CAACwC,OAAO,EAAEC,UAAU,CAAC,GAAGzC,QAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC0C,KAAK,EAAEC,QAAQ,CAAC,GAAG3C,QAAQ,CAAgB,IAAI,CAAC;EACvD,MAAM4C,OAAO,GAAG7C,MAAM,CAAC,IAAI,CAAC;EAE5BF,SAAS,CAAC,MAAM;IACd+C,OAAO,CAACC,OAAO,GAAG,IAAI;IACtB,OAAO,MAAM;MACXD,OAAO,CAACC,OAAO,GAAG,KAAK;IACzB,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,OAAO,GAAGlD,WAAW,CAAC,YAAY;IACtC,IAAI6B,eAAe,EAAE;IACrBgB,UAAU,CAAC,IAAI,CAAC;IAChBE,QAAQ,CAAC,IAAI,CAAC;IACd,IAAI;MACF,MAAMI,IAAI,GAAG,MAAM1C,UAAU,CAACsB,MAAM,EAAEH,KAAK,CAACwB,IAAI,CAACC,YAAY,CAAC;MAC9D,IAAI,CAACL,OAAO,CAACC,OAAO,EAAE;MACtBR,UAAU,CAACU,IAAI,CAACX,OAAO,CAAC;MACxBG,cAAc,CAACQ,IAAI,CAACG,YAAY,CAAC;IACnC,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,IAAI,CAACP,OAAO,CAACC,OAAO,EAAE;MACtBF,QAAQ,CACNQ,CAAC,YAAY1C,eAAe,IAAI0C,CAAC,CAACC,OAAO,GACrC,wCAAwC,GACxC,uBACN,CAAC;IACH,CAAC,SAAS;MACR,IAAIR,OAAO,CAACC,OAAO,EAAEJ,UAAU,CAAC,KAAK,CAAC;IACxC;EACF,CAAC,EAAE,CAACd,MAAM,EAAEH,KAAK,CAACwB,IAAI,CAACC,YAAY,EAAExB,eAAe,CAAC,CAAC;;EAEtD;EACA5B,SAAS,CAAC,MAAM;IACd,KAAKiD,OAAO,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;;EAEb;EACA;EACA,MAAMO,cAAc,GAAG7B,KAAK,CAAC6B,cAAc,IAAI,MAAM;EACrDxD,SAAS,CAAC,MAAM;IACd;IACA;IACA,MAAMyD,QAAQ,GACZD,cAAc,GAAG,CAAC,GACdE,WAAW,CAAC,MAAM,KAAKT,OAAO,CAAC,CAAC,EAAEU,IAAI,CAACC,GAAG,CAACJ,cAAc,EAAE,KAAK,CAAC,CAAC,GAClE,IAAI;IAEV,MAAMK,WAAW,GAAGzD,QAAQ,CAAC0D,gBAAgB,CAAC,QAAQ,EAAGC,KAAK,IAAK;MACjE,IAAIA,KAAK,KAAK,QAAQ,EAAE,KAAKd,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO,MAAM;MACX,IAAIQ,QAAQ,KAAK,IAAI,EAAEO,aAAa,CAACP,QAAQ,CAAC;MAC9CI,WAAW,CAACI,MAAM,CAAC,CAAC;IACtB,CAAC;EACH,CAAC,EAAE,CAACT,cAAc,EAAEP,OAAO,CAAC,CAAC;;EAE7B;EACA,SAASiB,SAASA,CAAA,EAAG;IACnB7B,SAAS,CAAC;MAAEC,IAAI,EAAE;IAAO,CAAC,CAAC;IAC3BH,YAAY,CAAC,IAAI,CAAC;IAClB,KAAKc,OAAO,CAAC,CAAC;EAChB;EAEA,SAASkB,UAAUA,CAAA,EAAG;IACpBhC,YAAY,CAAC,KAAK,CAAC;IACnBE,SAAS,CAAC;MAAEC,IAAI,EAAE;IAAO,CAAC,CAAC;EAC7B;EAEA,IAAIV,eAAe,EAAE;IACnB;IACA;IACA,IAAIwC,OAAO,EAAE;MACXC,OAAO,CAACxB,KAAK,CAACjB,eAAe,CAAC;MAC9B,oBACEP,IAAA,CAACd,IAAI;QACH+D,KAAK,EAAE;UACLC,OAAO,EAAE,CAAC;UACVC,WAAW,EAAE,CAAC;UACdC,WAAW,EAAE5C,KAAK,CAAC6C,MAAM,CAACC,YAAY;UACtCC,YAAY,EAAE/C,KAAK,CAACgD,KAAK,CAACC;QAC5B,CAAE;QAAAC,QAAA,eAEF1D,IAAA,CAACf,IAAI;UAACgE,KAAK,EAAE;YAAEU,QAAQ,EAAE,EAAE;YAAEC,KAAK,EAAEpD,KAAK,CAAC6C,MAAM,CAACC;UAAa,CAAE;UAAAI,QAAA,EAC7DnD;QAAe,CACZ;MAAC,CACH,CAAC;IAEX;IACA,OAAO,IAAI;EACb;EAEA,SAASsD,UAAUA,CAACC,MAAc,EAAE;IAClC9C,SAAS,CAAC;MAAEC,IAAI,EAAE,QAAQ;MAAE8C,QAAQ,EAAED,MAAM,CAACE;IAAG,CAAC,CAAC;IAClD,IAAIF,MAAM,CAACG,YAAY,GAAG,CAAC,EAAE;MAC3B;MACA9C,UAAU,CACP+C,IAAI,IACHA,IAAI,EAAEC,GAAG,CAAEC,CAAC,IACVA,CAAC,CAACJ,EAAE,KAAKF,MAAM,CAACE,EAAE,GAAG;QAAE,GAAGI,CAAC;QAAEH,YAAY,EAAE;MAAE,CAAC,GAAGG,CACnD,CAAC,IAAI,IACT,CAAC;MACD/C,cAAc,CAAEgD,CAAC,IAAK/B,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE8B,CAAC,GAAGP,MAAM,CAACG,YAAY,CAAC,CAAC;MAC3D,KAAK7E,QAAQ,CAACqB,MAAM,EAAE;QACpB6D,OAAO,EAAER,MAAM,CAACE,EAAE;QAClBjC,YAAY,EAAEzB,KAAK,CAACwB,IAAI,CAACC;MAC3B,CAAC,CAAC,CAACwC,KAAK,CAAC,MAAM;QACb;MAAA,CACD,CAAC;IACJ;EACF;EAEA,SAASC,iBAAiBA,CAACvC,CAAU,EAAU;IAC7C,IAAIA,CAAC,YAAY1C,eAAe,EAAE;MAChC,IAAI0C,CAAC,CAACwC,MAAM,KAAK,GAAG,EAAE,OAAO,qCAAqC;MAClE,IAAIxC,CAAC,CAACC,OAAO,EAAE,OAAO,wCAAwC;IAChE;IACA,OAAO,2BAA2B;EACpC;EAEA,eAAewC,YAAYA,CACzBC,IAAe,EACfC,OAAe,EACS;IACxB,IAAI;MACF,MAAMtF,WAAW,CAACmB,MAAM,EAAE;QACxBoE,SAAS,EAAEF,IAAI;QACfC,OAAO;QACPE,QAAQ,EAAExE,KAAK,CAACwB,IAAI,CAACb,IAAI;QACzB8D,MAAM,EAAEzE,KAAK,CAACwB,IAAI,CAACiD,MAAM;QACzBhD,YAAY,EAAEzB,KAAK,CAACwB,IAAI,CAACC,YAAY;QACrCiD,UAAU,EAAE1E,KAAK,CAACwB,IAAI,CAACkD;MACzB,CAAC,CAAC;MACF,KAAKpD,OAAO,CAAC,CAAC;MACd,OAAO,IAAI;IACb,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,OAAOuC,iBAAiB,CAACvC,CAAC,CAAC;IAC7B;EACF;EAEA,eAAegD,UAAUA,CACvBlB,QAAgB,EAChBa,OAAe,EACS;IACxB,IAAI;MACF,MAAMvF,WAAW,CAACoB,MAAM,EAAE;QACxB6D,OAAO,EAAEP,QAAQ;QACjBhC,YAAY,EAAEzB,KAAK,CAACwB,IAAI,CAACC,YAAY;QACrC6C;MACF,CAAC,CAAC;MACF,MAAMhD,OAAO,CAAC,CAAC;MACf,OAAO,IAAI;IACb,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,OAAOuC,iBAAiB,CAACvC,CAAC,CAAC;IAC7B;EACF;EAEA,MAAMiD,YAAY,GAChBnE,MAAM,CAACE,IAAI,KAAK,QAAQ,GACpB,CAACC,OAAO,IAAI,EAAE,EAAEiE,IAAI,CAAEf,CAAC,IAAKA,CAAC,CAACJ,EAAE,KAAKjD,MAAM,CAACgD,QAAQ,CAAC,IAAI,IAAI,GAC7D,IAAI;EAEV,oBACE7D,KAAA,CAAAE,SAAA;IAAAsD,QAAA,gBACExD,KAAA,CAAClB,SAAS;MACRoG,OAAO,EAAEvC,SAAU;MACnBwC,iBAAiB,EAAC,QAAQ;MAC1BC,kBAAkB,EAChBlE,WAAW,GAAG,CAAC,GACX,YAAYA,WAAW,WAAWA,WAAW,KAAK,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,GAC3E,SACL;MACD6B,KAAK,EAAEA,CAAC;QAAEsC;MAAQ,CAAC,MAAM;QACvBC,KAAK,EAAE,EAAE;QACTC,MAAM,EAAE,EAAE;QACVlC,YAAY,EAAE,EAAE;QAChBJ,WAAW,EAAE,CAAC;QACdC,WAAW,EAAE5C,KAAK,CAAC6C,MAAM,CAACqC,MAAM;QAChCC,eAAe,EAAEJ,OAAO,GACpB/E,KAAK,CAAC6C,MAAM,CAACuC,YAAY,GACzBpF,KAAK,CAAC6C,MAAM,CAACwC,OAAO;QACxBC,UAAU,EAAE,QAAQ;QACpBC,cAAc,EAAE;MAClB,CAAC,CAAE;MAAArC,QAAA,gBAEH1D,IAAA,CAACL,UAAU;QAACiE,KAAK,EAAEpD,KAAK,CAAC6C,MAAM,CAAC2C,WAAY;QAACC,IAAI,EAAE;MAAG,CAAE,CAAC,EACxD7E,WAAW,GAAG,CAAC,iBACdpB,IAAA,CAACd,IAAI;QACH+D,KAAK,EAAE;UACLiD,QAAQ,EAAE,UAAU;UACpBC,GAAG,EAAE,CAAC,CAAC;UACPC,KAAK,EAAE,CAAC,CAAC;UACTC,QAAQ,EAAE,EAAE;UACZZ,MAAM,EAAE,EAAE;UACVlC,YAAY,EAAE,CAAC;UACf+C,iBAAiB,EAAE,CAAC;UACpBX,eAAe,EAAEnF,KAAK,CAAC6C,MAAM,CAACkD,MAAM;UACpCT,UAAU,EAAE,QAAQ;UACpBC,cAAc,EAAE;QAClB,CAAE;QAAArC,QAAA,eAEF1D,IAAA,CAACf,IAAI;UACHgE,KAAK,EAAE;YACLU,QAAQ,EAAE,EAAE;YACZ6C,UAAU,EAAE,KAAK;YACjB5C,KAAK,EAAEpD,KAAK,CAAC6C,MAAM,CAACoD,gBAAgB;YACpCC,WAAW,EAAE,CAAC,cAAc;UAC9B,CAAE;UAAAhD,QAAA,EAEDtC,WAAW,GAAG,CAAC,GAAG,IAAI,GAAGA;QAAW,CACjC;MAAC,CACH,CACP;IAAA,CACQ,CAAC,eAEZlB,KAAA,CAACR,WAAW;MAACiH,OAAO,EAAE9F,SAAU;MAAC+F,OAAO,EAAE9D,UAAW;MAACtC,KAAK,EAAEA,KAAM;MAAAkD,QAAA,GAChE3C,MAAM,CAACE,IAAI,KAAK,MAAM,iBACrBjB,IAAA,CAACH,UAAU;QACTW,KAAK,EAAEA,KAAM;QACbU,OAAO,EAAEA,OAAQ;QACjBI,OAAO,EAAEA,OAAQ;QACjBE,KAAK,EAAEA,KAAM;QACbqF,OAAO,EAAEA,CAAA,KAAM,KAAKjF,OAAO,CAAC,CAAE;QAC9BkF,SAAS,EAAGnC,IAAI,IAAK3D,SAAS,CAAC;UAAEC,IAAI,EAAE,SAAS;UAAE0D;QAAK,CAAC,CAAE;QAC1DoC,YAAY,EAAElD,UAAW;QACzB+C,OAAO,EAAE9D;MAAW,CACrB,CACF,EACA/B,MAAM,CAACE,IAAI,KAAK,SAAS,iBACxBjB,IAAA,CAACJ,aAAa;QACZY,KAAK,EAAEA,KAAM;QACbmE,IAAI,EAAE5D,MAAM,CAAC4D,IAAK;QAClBqC,MAAM,EAAEA,CAAA,KAAMhG,SAAS,CAAC;UAAEC,IAAI,EAAE;QAAO,CAAC,CAAE;QAC1CgG,QAAQ,EAAGrC,OAAO,IAAKF,YAAY,CAAC3D,MAAM,CAAC4D,IAAI,EAAEC,OAAO;MAAE,CAC3D,CACF,EACA7D,MAAM,CAACE,IAAI,KAAK,QAAQ,KACtBiE,YAAY,gBACXlF,IAAA,CAACF,YAAY;QACXU,KAAK,EAAEA,KAAM;QACbsD,MAAM,EAAEoB,YAAa;QACrB8B,MAAM,EAAEA,CAAA,KAAMhG,SAAS,CAAC;UAAEC,IAAI,EAAE;QAAO,CAAC,CAAE;QAC1CiG,MAAM,EAAGtC,OAAO,IAAKK,UAAU,CAACC,YAAY,CAAClB,EAAE,EAAEY,OAAO;MAAE,CAC3D,CAAC,gBAEF5E,IAAA,CAACH,UAAU;QACTW,KAAK,EAAEA,KAAM;QACbU,OAAO,EAAEA,OAAQ;QACjBI,OAAO,EAAEA,OAAQ;QACjBE,KAAK,EAAEA,KAAM;QACbqF,OAAO,EAAEA,CAAA,KAAM,KAAKjF,OAAO,CAAC,CAAE;QAC9BkF,SAAS,EAAGnC,IAAI,IAAK3D,SAAS,CAAC;UAAEC,IAAI,EAAE,SAAS;UAAE0D;QAAK,CAAC,CAAE;QAC1DoC,YAAY,EAAElD,UAAW;QACzB+C,OAAO,EAAE9D;MAAW,CACrB,CACF,CAAC;IAAA,CACO,CAAC;EAAA,CACd,CAAC;AAEP","ignoreList":[]}
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":[]}
@@ -3,5 +3,6 @@
3
3
  export { SupportButton } from './components/SupportButton';
4
4
  export { supportDarkTheme, supportLightTheme, resolveTheme } from './theme';
5
5
  export { SupportApiError } from './api';
6
+ export { isPushAvailable } from './push';
6
7
  export { QUERY_TYPE_LABEL, USER_MESSAGE_MAX, USER_MESSAGE_MIN } from './types';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SupportButton","supportDarkTheme","supportLightTheme","resolveTheme","SupportApiError","QUERY_TYPE_LABEL","USER_MESSAGE_MAX","USER_MESSAGE_MIN"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SACEC,gBAAgB,EAChBC,iBAAiB,EACjBC,YAAY,QAEP,SAAS;AAChB,SAASC,eAAe,QAAQ,OAAO;AAYvC,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,QACX,SAAS","ignoreList":[]}
1
+ {"version":3,"names":["SupportButton","supportDarkTheme","supportLightTheme","resolveTheme","SupportApiError","isPushAvailable","QUERY_TYPE_LABEL","USER_MESSAGE_MAX","USER_MESSAGE_MIN"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SACEC,gBAAgB,EAChBC,iBAAiB,EACjBC,YAAY,QAEP,SAAS;AAChB,SAASC,eAAe,QAAQ,OAAO;AACvC,SAASC,eAAe,QAAQ,QAAQ;AAaxC,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,QACX,SAAS","ignoreList":[]}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ // Optional push-notification support.
4
+ //
5
+ // expo-notifications is an OPTIONAL peer dependency: if the host app has it
6
+ // installed we ask for permission and mint a token, otherwise every function
7
+ // here degrades to "undetermined" and the support flow is unaffected. The
8
+ // require is wrapped in try/catch so bundling succeeds either way.
9
+ //
10
+ // Nothing in the support experience is gated on the result — a user who
11
+ // denies notifications keeps full use of threads, replies, and unread
12
+ // badges. The status is reported purely so the dashboard can show whether
13
+ // the user is reachable.
14
+
15
+ /** The slice of expo-notifications this SDK uses. */
16
+
17
+ function loadNotifications() {
18
+ try {
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const mod = require('expo-notifications');
21
+ return typeof mod?.getPermissionsAsync === 'function' ? mod : null;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+ const notifications = loadNotifications();
27
+
28
+ /** True when the host app has expo-notifications installed. */
29
+ export const isPushAvailable = notifications !== null;
30
+ function normalizeStatus(status) {
31
+ if (status === 'granted') return 'granted';
32
+ if (status === 'denied') return 'denied';
33
+ return 'undetermined';
34
+ }
35
+
36
+ /**
37
+ * Ensures notification permission has been requested, and returns the
38
+ * outcome plus an Expo push token when one is obtainable.
39
+ *
40
+ * Never throws: any failure resolves to an 'undetermined' registration so
41
+ * callers can report it and move on.
42
+ */
43
+ export async function ensurePushPermission(expoProjectId) {
44
+ if (!notifications) {
45
+ return {
46
+ status: 'undetermined',
47
+ asked: false,
48
+ token: null
49
+ };
50
+ }
51
+ try {
52
+ const current = await notifications.getPermissionsAsync();
53
+ let status = normalizeStatus(current.status);
54
+ let asked = false;
55
+
56
+ // Only prompt when the OS will actually show something. Re-prompting a
57
+ // user who already decided is impossible on iOS and annoying on Android.
58
+ if (status === 'undetermined' && current.canAskAgain) {
59
+ const requested = await notifications.requestPermissionsAsync();
60
+ status = normalizeStatus(requested.status);
61
+ asked = true;
62
+ }
63
+ if (status !== 'granted') {
64
+ return {
65
+ status,
66
+ asked,
67
+ token: null
68
+ };
69
+ }
70
+
71
+ // Token minting needs a dev/production build with push credentials —
72
+ // it fails in Expo Go. A granted permission with no token is still
73
+ // useful information for the dashboard, so report it either way.
74
+ try {
75
+ const token = await notifications.getExpoPushTokenAsync(expoProjectId ? {
76
+ projectId: expoProjectId
77
+ } : undefined);
78
+ return {
79
+ status,
80
+ asked,
81
+ token: token.data
82
+ };
83
+ } catch {
84
+ return {
85
+ status,
86
+ asked,
87
+ token: null
88
+ };
89
+ }
90
+ } catch {
91
+ return {
92
+ status: 'undetermined',
93
+ asked: false,
94
+ token: null
95
+ };
96
+ }
97
+ }
98
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["loadNotifications","mod","require","getPermissionsAsync","notifications","isPushAvailable","normalizeStatus","status","ensurePushPermission","expoProjectId","asked","token","current","canAskAgain","requested","requestPermissionsAsync","getExpoPushTokenAsync","projectId","undefined","data"],"sourceRoot":"../../src","sources":["push.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AASA,SAASA,iBAAiBA,CAAA,EAAmC;EAC3D,IAAI;IACF;IACA,MAAMC,GAAG,GAAGC,OAAO,CAAC,oBAAoB,CAA4B;IACpE,OAAO,OAAOD,GAAG,EAAEE,mBAAmB,KAAK,UAAU,GAAGF,GAAG,GAAG,IAAI;EACpE,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,MAAMG,aAAa,GAAGJ,iBAAiB,CAAC,CAAC;;AAEzC;AACA,OAAO,MAAMK,eAAe,GAAGD,aAAa,KAAK,IAAI;AASrD,SAASE,eAAeA,CAACC,MAAc,EAAwB;EAC7D,IAAIA,MAAM,KAAK,SAAS,EAAE,OAAO,SAAS;EAC1C,IAAIA,MAAM,KAAK,QAAQ,EAAE,OAAO,QAAQ;EACxC,OAAO,cAAc;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,oBAAoBA,CACxCC,aAAsB,EACK;EAC3B,IAAI,CAACL,aAAa,EAAE;IAClB,OAAO;MAAEG,MAAM,EAAE,cAAc;MAAEG,KAAK,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9D;EAEA,IAAI;IACF,MAAMC,OAAO,GAAG,MAAMR,aAAa,CAACD,mBAAmB,CAAC,CAAC;IACzD,IAAII,MAAM,GAAGD,eAAe,CAACM,OAAO,CAACL,MAAM,CAAC;IAC5C,IAAIG,KAAK,GAAG,KAAK;;IAEjB;IACA;IACA,IAAIH,MAAM,KAAK,cAAc,IAAIK,OAAO,CAACC,WAAW,EAAE;MACpD,MAAMC,SAAS,GAAG,MAAMV,aAAa,CAACW,uBAAuB,CAAC,CAAC;MAC/DR,MAAM,GAAGD,eAAe,CAACQ,SAAS,CAACP,MAAM,CAAC;MAC1CG,KAAK,GAAG,IAAI;IACd;IAEA,IAAIH,MAAM,KAAK,SAAS,EAAE;MACxB,OAAO;QAAEA,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC;IACvC;;IAEA;IACA;IACA;IACA,IAAI;MACF,MAAMA,KAAK,GAAG,MAAMP,aAAa,CAACY,qBAAqB,CACrDP,aAAa,GAAG;QAAEQ,SAAS,EAAER;MAAc,CAAC,GAAGS,SACjD,CAAC;MACD,OAAO;QAAEX,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAEA,KAAK,CAACQ;MAAK,CAAC;IAC7C,CAAC,CAAC,MAAM;MACN,OAAO;QAAEZ,MAAM;QAAEG,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC;IACvC;EACF,CAAC,CAAC,MAAM;IACN,OAAO;MAAEJ,MAAM,EAAE,cAAc;MAAEG,KAAK,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9D;AACF","ignoreList":[]}
@@ -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":";;AAsEA,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":[]}
1
+ {"version":3,"names":["QUERY_TYPE_LABEL","feedback","feature_request","bug_report","USER_MESSAGE_MIN","USER_MESSAGE_MAX"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAiFA,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":[]}
@@ -1,4 +1,4 @@
1
- import type { QueryType, ThreadsResponse } from './types';
1
+ import type { PushPermissionStatus, QueryType, ThreadsResponse } from './types';
2
2
  export interface ApiConfig {
3
3
  supabaseUrl: string;
4
4
  apiKey: string;
@@ -11,6 +11,22 @@ export declare class SupportApiError extends Error {
11
11
  constructor(message: string, status: number | null, offline?: boolean);
12
12
  }
13
13
  export declare function getThreads(config: ApiConfig, revenuecatId: string): Promise<ThreadsResponse>;
14
+ /**
15
+ * Badge-only endpoint (~18 bytes) used for idle polling, instead of
16
+ * re-fetching every thread and message just to check for new replies.
17
+ */
18
+ export declare function getUnreadCount(config: ApiConfig, revenuecatId: string): Promise<{
19
+ total_unread: number;
20
+ }>;
21
+ /** Reports the OS notification permission outcome (including denials). */
22
+ export declare function registerPush(config: ApiConfig, input: {
23
+ revenuecatId: string;
24
+ permissionStatus: PushPermissionStatus;
25
+ expoPushToken: string | null;
26
+ asked: boolean;
27
+ }): Promise<{
28
+ ok: boolean;
29
+ }>;
14
30
  export declare function submitQuery(config: ApiConfig, input: {
15
31
  queryType: QueryType;
16
32
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1D,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,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;CACpB,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CASjC;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
+ {"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;CACpB,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CASjC;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":"SupportButton.d.ts","sourceRoot":"","sources":["../../../src/components/SupportButton.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,kBAAkB,EAAU,MAAM,UAAU,CAAC;AAatE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,sCAqRtD"}
1
+ {"version":3,"file":"SupportButton.d.ts","sourceRoot":"","sources":["../../../src/components/SupportButton.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAa,kBAAkB,EAAU,MAAM,UAAU,CAAC;AAsBtE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,sCAiUtD"}
@@ -1,6 +1,7 @@
1
1
  export { SupportButton } from './components/SupportButton';
2
2
  export { supportDarkTheme, supportLightTheme, resolveTheme, type SupportTheme, } from './theme';
3
3
  export { SupportApiError } from './api';
4
- export type { MessageSender, QueryStatus, QueryType, SupportButtonProps, SupportUser, Thread, ThreadMessage, ThreadsResponse, ThemeName, } from './types';
4
+ export { isPushAvailable } from './push';
5
+ export type { MessageSender, PushPermissionStatus, QueryStatus, QueryType, SupportButtonProps, SupportUser, Thread, ThreadMessage, ThreadsResponse, ThemeName, } from './types';
5
6
  export { QUERY_TYPE_LABEL, USER_MESSAGE_MAX, USER_MESSAGE_MIN, } from './types';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,KAAK,YAAY,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,YAAY,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,MAAM,EACN,aAAa,EACb,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,KAAK,YAAY,GAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,MAAM,EACN,aAAa,EACb,eAAe,EACf,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { PushPermissionStatus } from './types';
2
+ /** True when the host app has expo-notifications installed. */
3
+ export declare const isPushAvailable: boolean;
4
+ export interface PushRegistration {
5
+ status: PushPermissionStatus;
6
+ /** Whether the OS prompt was actually presented during this call. */
7
+ asked: boolean;
8
+ token: string | null;
9
+ }
10
+ /**
11
+ * Ensures notification permission has been requested, and returns the
12
+ * outcome plus an Expo push token when one is obtainable.
13
+ *
14
+ * Never throws: any failure resolves to an 'undetermined' registration so
15
+ * callers can report it and move on.
16
+ */
17
+ export declare function ensurePushPermission(expoProjectId?: string): Promise<PushRegistration>;
18
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/push.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAuBpD,+DAA+D;AAC/D,eAAO,MAAM,eAAe,SAAyB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAQD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAoC3B"}
@@ -2,6 +2,7 @@ export type QueryType = 'feedback' | 'feature_request' | 'bug_report';
2
2
  export type QueryStatus = 'open' | 'resolved';
3
3
  export type MessageSender = 'user' | 'admin';
4
4
  export type ThemeName = 'dark' | 'light';
5
+ export type PushPermissionStatus = 'undetermined' | 'granted' | 'denied';
5
6
  export interface SupportUser {
6
7
  /** Display name shown to the support team. */
7
8
  name: string;
@@ -28,12 +29,22 @@ export interface SupportButtonProps {
28
29
  /** Visual theme. Matches the admin dashboard tokens. Default "dark". */
29
30
  theme?: ThemeName;
30
31
  /**
31
- * How often (ms) to re-fetch threads in the background so the unread badge
32
- * stays current without opening the sheet. Also refreshes whenever the app
33
- * returns to the foreground. Default 30000; set 0 to disable background
34
- * polling (mount / sheet-open / foreground refreshes still happen).
32
+ * Idle poll interval (ms) — how often the unread badge is refreshed while
33
+ * the sheet is CLOSED, using a lightweight count-only endpoint. Default
34
+ * 60000; set 0 to disable idle polling (mount / sheet-open / foreground
35
+ * refreshes still happen).
36
+ *
37
+ * While the sheet is open the SDK polls faster on its own: every 15s on
38
+ * the thread list and every 5s inside a thread, where latency is felt.
35
39
  */
36
40
  pollIntervalMs?: number;
41
+ /**
42
+ * Optional EAS project id, forwarded to expo-notifications when minting a
43
+ * push token. Only needed if the host app's config doesn't already
44
+ * provide one. Push is skipped entirely when expo-notifications isn't
45
+ * installed — it is an optional peer dependency.
46
+ */
47
+ expoProjectId?: string;
37
48
  }
38
49
  export interface ThreadMessage {
39
50
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,iBAAiB,GAAG,YAAY,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,IAAI,EAAE,WAAW,CAAC;IAClB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,aAAa,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAItD,CAAC;AAEF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,iBAAiB,GAAG,YAAY,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACzC,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,IAAI,EAAE,WAAW,CAAC;IAClB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,aAAa,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAItD,CAAC;AAEF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appsupportkit/support-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "In-app customer support for React Native: feedback, feature requests, and bug reports with two-way threads.",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/module/index.js",
@@ -22,10 +22,16 @@
22
22
  "@appsupportkit/design-tokens": "^0.1.0"
23
23
  },
24
24
  "peerDependencies": {
25
+ "expo-notifications": ">=0.27.0",
25
26
  "react": ">=18.0.0",
26
27
  "react-native": ">=0.73.0",
27
28
  "react-native-safe-area-context": ">=4.0.0"
28
29
  },
30
+ "peerDependenciesMeta": {
31
+ "expo-notifications": {
32
+ "optional": true
33
+ }
34
+ },
29
35
  "devDependencies": {
30
36
  "@types/react": "^19.0.2",
31
37
  "react": "19.0.0",
package/src/api.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  // Thin client for the Supabase Edge Functions. Every call authenticates with
2
2
  // the per-app x-api-key header; no Supabase JS client is needed on-device.
3
- import type { QueryType, ThreadsResponse } from './types';
3
+ import type {
4
+ PushPermissionStatus,
5
+ QueryType,
6
+ ThreadsResponse,
7
+ } from './types';
4
8
 
5
9
  export interface ApiConfig {
6
10
  supabaseUrl: string;
@@ -72,6 +76,42 @@ export function getThreads(
72
76
  });
73
77
  }
74
78
 
79
+ /**
80
+ * Badge-only endpoint (~18 bytes) used for idle polling, instead of
81
+ * re-fetching every thread and message just to check for new replies.
82
+ */
83
+ export function getUnreadCount(
84
+ config: ApiConfig,
85
+ revenuecatId: string,
86
+ ): Promise<{ total_unread: number }> {
87
+ const params = new URLSearchParams({ revenuecat_id: revenuecatId });
88
+ return request(config, `get-unread-count?${params.toString()}`, {
89
+ method: 'GET',
90
+ });
91
+ }
92
+
93
+ /** Reports the OS notification permission outcome (including denials). */
94
+ export function registerPush(
95
+ config: ApiConfig,
96
+ input: {
97
+ revenuecatId: string;
98
+ permissionStatus: PushPermissionStatus;
99
+ expoPushToken: string | null;
100
+ asked: boolean;
101
+ },
102
+ ): Promise<{ ok: boolean }> {
103
+ return request(config, 'register-push', {
104
+ method: 'POST',
105
+ body: JSON.stringify({
106
+ app_name: config.appName,
107
+ revenuecat_id: input.revenuecatId,
108
+ permission_status: input.permissionStatus,
109
+ expo_push_token: input.expoPushToken,
110
+ asked: input.asked,
111
+ }),
112
+ });
113
+ }
114
+
75
115
  export function submitQuery(
76
116
  config: ApiConfig,
77
117
  input: {
@@ -1,6 +1,16 @@
1
1
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { AppState, Pressable, Text, View } from 'react-native';
3
- import { getThreads, markRead, postMessage, submitQuery, SupportApiError, type ApiConfig } from '../api';
3
+ import {
4
+ getThreads,
5
+ getUnreadCount,
6
+ markRead,
7
+ postMessage,
8
+ registerPush,
9
+ submitQuery,
10
+ SupportApiError,
11
+ type ApiConfig,
12
+ } from '../api';
13
+ import { ensurePushPermission, isPushAvailable } from '../push';
4
14
  import { resolveTheme } from '../theme';
5
15
  import type { QueryType, SupportButtonProps, Thread } from '../types';
6
16
  import { validateProps } from '../utils';
@@ -15,6 +25,15 @@ type Screen =
15
25
  | { name: 'compose'; type: QueryType }
16
26
  | { name: 'thread'; threadId: string };
17
27
 
28
+ // Poll cadence by context: fast where latency is felt (staring at a thread
29
+ // waiting for a reply), slow when the sheet is closed — and the idle tick
30
+ // uses the count-only endpoint, so it costs ~18 bytes instead of the full
31
+ // thread list.
32
+ const THREAD_POLL_MS = 5_000;
33
+ const SHEET_POLL_MS = 15_000;
34
+ const IDLE_POLL_MS = 60_000;
35
+ const MIN_POLL_MS = 3_000;
36
+
18
37
  /**
19
38
  * The single entry point of the SDK: a button with an unread badge that
20
39
  * opens the support bottom sheet. Polls get-threads on mount and whenever
@@ -69,37 +88,81 @@ export function SupportButton(props: SupportButtonProps) {
69
88
  }
70
89
  }, [config, props.user.revenuecatId, validationError]);
71
90
 
91
+ /** Badge-only refresh — the cheap endpoint used while idle. */
92
+ const refreshBadge = useCallback(async () => {
93
+ if (validationError) return;
94
+ try {
95
+ const data = await getUnreadCount(config, props.user.revenuecatId);
96
+ if (mounted.current) setTotalUnread(data.total_unread);
97
+ } catch {
98
+ // Best-effort: the next tick or the next sheet open reconciles.
99
+ }
100
+ }, [config, props.user.revenuecatId, validationError]);
101
+
72
102
  // Poll on mount…
73
103
  useEffect(() => {
74
104
  void refresh();
75
105
  }, [refresh]);
76
106
 
77
- // …in the background so the badge stays current without opening the
78
- // sheet, and whenever the app returns to the foreground.
79
- const pollIntervalMs = props.pollIntervalMs ?? 30_000;
107
+ // …then adapt the cadence to what the user is looking at, and refresh
108
+ // whenever the app returns to the foreground.
109
+ const idlePollMs = props.pollIntervalMs ?? IDLE_POLL_MS;
110
+ const screenName = screen.name;
80
111
  useEffect(() => {
81
- // Clamp to a sane floor so a typo like `pollIntervalMs={30}` doesn't
82
- // hammer the API. 0 (or negative) disables interval polling.
83
- const interval =
84
- pollIntervalMs > 0
85
- ? setInterval(() => void refresh(), Math.max(pollIntervalMs, 5_000))
86
- : null;
112
+ const idle = !sheetOpen;
113
+ const intervalMs = idle
114
+ ? idlePollMs
115
+ : screenName === 'thread'
116
+ ? THREAD_POLL_MS
117
+ : SHEET_POLL_MS;
118
+
119
+ // While idle only the badge matters, so use the count-only endpoint.
120
+ const tick = () => void (idle ? refreshBadge() : refresh());
121
+
122
+ // Clamped so a typo like `pollIntervalMs={30}` can't hammer the API;
123
+ // 0 (or negative) disables idle polling entirely.
124
+ const timer =
125
+ intervalMs > 0 ? setInterval(tick, Math.max(intervalMs, MIN_POLL_MS)) : null;
87
126
 
88
127
  const appStateSub = AppState.addEventListener('change', (state) => {
89
- if (state === 'active') void refresh();
128
+ if (state === 'active') tick();
90
129
  });
91
130
 
92
131
  return () => {
93
- if (interval !== null) clearInterval(interval);
132
+ if (timer !== null) clearInterval(timer);
94
133
  appStateSub.remove();
95
134
  };
96
- }, [pollIntervalMs, refresh]);
135
+ }, [sheetOpen, screenName, idlePollMs, refresh, refreshBadge]);
136
+
137
+ /**
138
+ * Asks for notification permission the moment the sheet opens, then
139
+ * reports the outcome (including denials) so the dashboard knows whether
140
+ * this user is reachable. Deliberately fire-and-forget: nothing in the
141
+ * support flow waits on it or breaks if it fails.
142
+ */
143
+ const syncPushPermission = useCallback(async () => {
144
+ if (validationError || !isPushAvailable) return;
145
+ try {
146
+ const registration = await ensurePushPermission(props.expoProjectId);
147
+ await registerPush(config, {
148
+ revenuecatId: props.user.revenuecatId,
149
+ permissionStatus: registration.status,
150
+ expoPushToken: registration.token,
151
+ asked: registration.asked,
152
+ });
153
+ } catch {
154
+ // Push is an enhancement — never surfaced to the user as an error.
155
+ }
156
+ }, [config, props.user.revenuecatId, props.expoProjectId, validationError]);
97
157
 
98
158
  // …and on sheet open.
99
159
  function openSheet() {
100
160
  setScreen({ name: 'home' });
101
161
  setSheetOpen(true);
102
162
  void refresh();
163
+ // The OS prompt appears right as the sheet opens; if the user declines,
164
+ // everything below carries on exactly as before.
165
+ void syncPushPermission();
103
166
  }
104
167
 
105
168
  function closeSheet() {
package/src/index.tsx CHANGED
@@ -6,8 +6,10 @@ export {
6
6
  type SupportTheme,
7
7
  } from './theme';
8
8
  export { SupportApiError } from './api';
9
+ export { isPushAvailable } from './push';
9
10
  export type {
10
11
  MessageSender,
12
+ PushPermissionStatus,
11
13
  QueryStatus,
12
14
  QueryType,
13
15
  SupportButtonProps,
package/src/push.ts ADDED
@@ -0,0 +1,97 @@
1
+ // Optional push-notification support.
2
+ //
3
+ // expo-notifications is an OPTIONAL peer dependency: if the host app has it
4
+ // installed we ask for permission and mint a token, otherwise every function
5
+ // here degrades to "undetermined" and the support flow is unaffected. The
6
+ // require is wrapped in try/catch so bundling succeeds either way.
7
+ //
8
+ // Nothing in the support experience is gated on the result — a user who
9
+ // denies notifications keeps full use of threads, replies, and unread
10
+ // badges. The status is reported purely so the dashboard can show whether
11
+ // the user is reachable.
12
+
13
+ import type { PushPermissionStatus } from './types';
14
+
15
+ /** The slice of expo-notifications this SDK uses. */
16
+ interface ExpoNotificationsModule {
17
+ getPermissionsAsync(): Promise<{ status: string; canAskAgain: boolean }>;
18
+ requestPermissionsAsync(): Promise<{ status: string; canAskAgain: boolean }>;
19
+ getExpoPushTokenAsync(options?: {
20
+ projectId?: string;
21
+ }): Promise<{ data: string }>;
22
+ }
23
+
24
+ function loadNotifications(): ExpoNotificationsModule | null {
25
+ try {
26
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
27
+ const mod = require('expo-notifications') as ExpoNotificationsModule;
28
+ return typeof mod?.getPermissionsAsync === 'function' ? mod : null;
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ const notifications = loadNotifications();
35
+
36
+ /** True when the host app has expo-notifications installed. */
37
+ export const isPushAvailable = notifications !== null;
38
+
39
+ export interface PushRegistration {
40
+ status: PushPermissionStatus;
41
+ /** Whether the OS prompt was actually presented during this call. */
42
+ asked: boolean;
43
+ token: string | null;
44
+ }
45
+
46
+ function normalizeStatus(status: string): PushPermissionStatus {
47
+ if (status === 'granted') return 'granted';
48
+ if (status === 'denied') return 'denied';
49
+ return 'undetermined';
50
+ }
51
+
52
+ /**
53
+ * Ensures notification permission has been requested, and returns the
54
+ * outcome plus an Expo push token when one is obtainable.
55
+ *
56
+ * Never throws: any failure resolves to an 'undetermined' registration so
57
+ * callers can report it and move on.
58
+ */
59
+ export async function ensurePushPermission(
60
+ expoProjectId?: string,
61
+ ): Promise<PushRegistration> {
62
+ if (!notifications) {
63
+ return { status: 'undetermined', asked: false, token: null };
64
+ }
65
+
66
+ try {
67
+ const current = await notifications.getPermissionsAsync();
68
+ let status = normalizeStatus(current.status);
69
+ let asked = false;
70
+
71
+ // Only prompt when the OS will actually show something. Re-prompting a
72
+ // user who already decided is impossible on iOS and annoying on Android.
73
+ if (status === 'undetermined' && current.canAskAgain) {
74
+ const requested = await notifications.requestPermissionsAsync();
75
+ status = normalizeStatus(requested.status);
76
+ asked = true;
77
+ }
78
+
79
+ if (status !== 'granted') {
80
+ return { status, asked, token: null };
81
+ }
82
+
83
+ // Token minting needs a dev/production build with push credentials —
84
+ // it fails in Expo Go. A granted permission with no token is still
85
+ // useful information for the dashboard, so report it either way.
86
+ try {
87
+ const token = await notifications.getExpoPushTokenAsync(
88
+ expoProjectId ? { projectId: expoProjectId } : undefined,
89
+ );
90
+ return { status, asked, token: token.data };
91
+ } catch {
92
+ return { status, asked, token: null };
93
+ }
94
+ } catch {
95
+ return { status: 'undetermined', asked: false, token: null };
96
+ }
97
+ }
package/src/types.ts CHANGED
@@ -2,6 +2,7 @@ export type QueryType = 'feedback' | 'feature_request' | 'bug_report';
2
2
  export type QueryStatus = 'open' | 'resolved';
3
3
  export type MessageSender = 'user' | 'admin';
4
4
  export type ThemeName = 'dark' | 'light';
5
+ export type PushPermissionStatus = 'undetermined' | 'granted' | 'denied';
5
6
 
6
7
  export interface SupportUser {
7
8
  /** Display name shown to the support team. */
@@ -30,12 +31,22 @@ export interface SupportButtonProps {
30
31
  /** Visual theme. Matches the admin dashboard tokens. Default "dark". */
31
32
  theme?: ThemeName;
32
33
  /**
33
- * How often (ms) to re-fetch threads in the background so the unread badge
34
- * stays current without opening the sheet. Also refreshes whenever the app
35
- * returns to the foreground. Default 30000; set 0 to disable background
36
- * polling (mount / sheet-open / foreground refreshes still happen).
34
+ * Idle poll interval (ms) — how often the unread badge is refreshed while
35
+ * the sheet is CLOSED, using a lightweight count-only endpoint. Default
36
+ * 60000; set 0 to disable idle polling (mount / sheet-open / foreground
37
+ * refreshes still happen).
38
+ *
39
+ * While the sheet is open the SDK polls faster on its own: every 15s on
40
+ * the thread list and every 5s inside a thread, where latency is felt.
37
41
  */
38
42
  pollIntervalMs?: number;
43
+ /**
44
+ * Optional EAS project id, forwarded to expo-notifications when minting a
45
+ * push token. Only needed if the host app's config doesn't already
46
+ * provide one. Push is skipped entirely when expo-notifications isn't
47
+ * installed — it is an optional peer dependency.
48
+ */
49
+ expoProjectId?: string;
39
50
  }
40
51
 
41
52
  export interface ThreadMessage {