@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.
- package/lib/commonjs/api.js +29 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/components/SupportButton.js +61 -9
- package/lib/commonjs/components/SupportButton.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/push.js +103 -0
- package/lib/commonjs/push.js.map +1 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/api.js +27 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/components/SupportButton.js +62 -10
- package/lib/module/components/SupportButton.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/push.js +98 -0
- package/lib/module/push.js.map +1 -0
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/api.d.ts +17 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/components/SupportButton.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/push.d.ts +18 -0
- package/lib/typescript/push.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +15 -4
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +7 -1
- package/src/api.ts +41 -1
- package/src/components/SupportButton.tsx +76 -13
- package/src/index.tsx +2 -0
- package/src/push.ts +97 -0
- package/src/types.ts +15 -4
package/lib/commonjs/api.js
CHANGED
|
@@ -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',
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -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","
|
|
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
|
-
// …
|
|
69
|
-
//
|
|
70
|
-
const
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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')
|
|
104
|
+
if (state === 'active') tick();
|
|
77
105
|
});
|
|
78
106
|
return () => {
|
|
79
|
-
if (
|
|
107
|
+
if (timer !== null) clearInterval(timer);
|
|
80
108
|
appStateSub.remove();
|
|
81
109
|
};
|
|
82
|
-
}, [
|
|
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":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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":"
|
|
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":";;;;;;
|
|
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',
|
package/lib/module/api.js.map
CHANGED
|
@@ -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","
|
|
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
|
-
// …
|
|
65
|
-
//
|
|
66
|
-
const
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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')
|
|
100
|
+
if (state === 'active') tick();
|
|
73
101
|
});
|
|
74
102
|
return () => {
|
|
75
|
-
if (
|
|
103
|
+
if (timer !== null) clearInterval(timer);
|
|
76
104
|
appStateSub.remove();
|
|
77
105
|
};
|
|
78
|
-
}, [
|
|
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":"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","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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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
|
package/lib/module/index.js.map
CHANGED
|
@@ -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;
|
|
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":[]}
|
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":";;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":[]}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -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,
|
|
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":"
|
|
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
|
|
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
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
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;
|
|
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.
|
|
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 {
|
|
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 {
|
|
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
|
-
// …
|
|
78
|
-
//
|
|
79
|
-
const
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
?
|
|
86
|
-
:
|
|
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')
|
|
128
|
+
if (state === 'active') tick();
|
|
90
129
|
});
|
|
91
130
|
|
|
92
131
|
return () => {
|
|
93
|
-
if (
|
|
132
|
+
if (timer !== null) clearInterval(timer);
|
|
94
133
|
appStateSub.remove();
|
|
95
134
|
};
|
|
96
|
-
}, [
|
|
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
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
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
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 {
|