@usergist/feedback-react-native 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +231 -0
  4. package/UserGistFeedback.podspec +31 -0
  5. package/UserGistFeedbackExtension.podspec +23 -0
  6. package/android/build.gradle +92 -0
  7. package/android/consumer-rules.pro +5 -0
  8. package/android/src/main/AndroidManifest.xml +31 -0
  9. package/android/src/main/java/studio/usergist/feedback/UserGistFirebaseMessagingService.kt +153 -0
  10. package/android/src/main/java/studio/usergist/feedback/UserGistPushModule.kt +344 -0
  11. package/android/src/main/java/studio/usergist/feedback/UserGistPushPackage.kt +18 -0
  12. package/dist/NativeUserGistPush.d.ts +35 -0
  13. package/dist/NativeUserGistPush.d.ts.map +1 -0
  14. package/dist/NativeUserGistPush.js +13 -0
  15. package/dist/NativeUserGistPush.js.map +1 -0
  16. package/dist/Provider.d.ts +7 -0
  17. package/dist/Provider.d.ts.map +1 -0
  18. package/dist/Provider.js +300 -0
  19. package/dist/Provider.js.map +1 -0
  20. package/dist/Push.d.ts +103 -0
  21. package/dist/Push.d.ts.map +1 -0
  22. package/dist/Push.js +225 -0
  23. package/dist/Push.js.map +1 -0
  24. package/dist/UserGist.d.ts +210 -0
  25. package/dist/UserGist.d.ts.map +1 -0
  26. package/dist/UserGist.js +1246 -0
  27. package/dist/UserGist.js.map +1 -0
  28. package/dist/index.d.ts +11 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +4 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/internal/consent.d.ts +17 -0
  33. package/dist/internal/consent.d.ts.map +1 -0
  34. package/dist/internal/consent.js +98 -0
  35. package/dist/internal/consent.js.map +1 -0
  36. package/dist/internal/context.d.ts +12 -0
  37. package/dist/internal/context.d.ts.map +1 -0
  38. package/dist/internal/context.js +70 -0
  39. package/dist/internal/context.js.map +1 -0
  40. package/dist/internal/debug.d.ts +14 -0
  41. package/dist/internal/debug.d.ts.map +1 -0
  42. package/dist/internal/debug.js +73 -0
  43. package/dist/internal/debug.js.map +1 -0
  44. package/dist/internal/engine.d.ts +93 -0
  45. package/dist/internal/engine.d.ts.map +1 -0
  46. package/dist/internal/engine.js +904 -0
  47. package/dist/internal/engine.js.map +1 -0
  48. package/dist/internal/events.d.ts +49 -0
  49. package/dist/internal/events.d.ts.map +1 -0
  50. package/dist/internal/events.js +71 -0
  51. package/dist/internal/events.js.map +1 -0
  52. package/dist/internal/frequency-cap.d.ts +15 -0
  53. package/dist/internal/frequency-cap.d.ts.map +1 -0
  54. package/dist/internal/frequency-cap.js +84 -0
  55. package/dist/internal/frequency-cap.js.map +1 -0
  56. package/dist/internal/identity.d.ts +14 -0
  57. package/dist/internal/identity.d.ts.map +1 -0
  58. package/dist/internal/identity.js +113 -0
  59. package/dist/internal/identity.js.map +1 -0
  60. package/dist/internal/inapp-matcher.d.ts +13 -0
  61. package/dist/internal/inapp-matcher.d.ts.map +1 -0
  62. package/dist/internal/inapp-matcher.js +65 -0
  63. package/dist/internal/inapp-matcher.js.map +1 -0
  64. package/dist/internal/inapp-rules-cache.d.ts +16 -0
  65. package/dist/internal/inapp-rules-cache.d.ts.map +1 -0
  66. package/dist/internal/inapp-rules-cache.js +88 -0
  67. package/dist/internal/inapp-rules-cache.js.map +1 -0
  68. package/dist/internal/instruction-dedupe.d.ts +16 -0
  69. package/dist/internal/instruction-dedupe.d.ts.map +1 -0
  70. package/dist/internal/instruction-dedupe.js +52 -0
  71. package/dist/internal/instruction-dedupe.js.map +1 -0
  72. package/dist/internal/lifecycle.d.ts +12 -0
  73. package/dist/internal/lifecycle.d.ts.map +1 -0
  74. package/dist/internal/lifecycle.js +97 -0
  75. package/dist/internal/lifecycle.js.map +1 -0
  76. package/dist/internal/modal-coordinator.d.ts +4 -0
  77. package/dist/internal/modal-coordinator.d.ts.map +1 -0
  78. package/dist/internal/modal-coordinator.js +43 -0
  79. package/dist/internal/modal-coordinator.js.map +1 -0
  80. package/dist/internal/modal-queue.d.ts +9 -0
  81. package/dist/internal/modal-queue.d.ts.map +1 -0
  82. package/dist/internal/modal-queue.js +32 -0
  83. package/dist/internal/modal-queue.js.map +1 -0
  84. package/dist/internal/mutation-queue.d.ts +23 -0
  85. package/dist/internal/mutation-queue.d.ts.map +1 -0
  86. package/dist/internal/mutation-queue.js +66 -0
  87. package/dist/internal/mutation-queue.js.map +1 -0
  88. package/dist/internal/prompt-answers.d.ts +6 -0
  89. package/dist/internal/prompt-answers.d.ts.map +1 -0
  90. package/dist/internal/prompt-answers.js +10 -0
  91. package/dist/internal/prompt-answers.js.map +1 -0
  92. package/dist/internal/prompt-flow.d.ts +8 -0
  93. package/dist/internal/prompt-flow.d.ts.map +1 -0
  94. package/dist/internal/prompt-flow.js +26 -0
  95. package/dist/internal/prompt-flow.js.map +1 -0
  96. package/dist/internal/queue.d.ts +17 -0
  97. package/dist/internal/queue.d.ts.map +1 -0
  98. package/dist/internal/queue.js +172 -0
  99. package/dist/internal/queue.js.map +1 -0
  100. package/dist/internal/requests.d.ts +22 -0
  101. package/dist/internal/requests.d.ts.map +1 -0
  102. package/dist/internal/requests.js +146 -0
  103. package/dist/internal/requests.js.map +1 -0
  104. package/dist/internal/rules-cache.d.ts +16 -0
  105. package/dist/internal/rules-cache.d.ts.map +1 -0
  106. package/dist/internal/rules-cache.js +86 -0
  107. package/dist/internal/rules-cache.js.map +1 -0
  108. package/dist/internal/storage.d.ts +36 -0
  109. package/dist/internal/storage.d.ts.map +1 -0
  110. package/dist/internal/storage.js +213 -0
  111. package/dist/internal/storage.js.map +1 -0
  112. package/dist/internal/survey-completion.d.ts +10 -0
  113. package/dist/internal/survey-completion.d.ts.map +1 -0
  114. package/dist/internal/survey-completion.js +11 -0
  115. package/dist/internal/survey-completion.js.map +1 -0
  116. package/dist/internal/survey-matcher.d.ts +21 -0
  117. package/dist/internal/survey-matcher.d.ts.map +1 -0
  118. package/dist/internal/survey-matcher.js +139 -0
  119. package/dist/internal/survey-matcher.js.map +1 -0
  120. package/dist/internal/survey-rules-cache.d.ts +17 -0
  121. package/dist/internal/survey-rules-cache.d.ts.map +1 -0
  122. package/dist/internal/survey-rules-cache.js +91 -0
  123. package/dist/internal/survey-rules-cache.js.map +1 -0
  124. package/dist/internal/survey-store.d.ts +19 -0
  125. package/dist/internal/survey-store.d.ts.map +1 -0
  126. package/dist/internal/survey-store.js +59 -0
  127. package/dist/internal/survey-store.js.map +1 -0
  128. package/dist/internal/transport.d.ts +210 -0
  129. package/dist/internal/transport.d.ts.map +1 -0
  130. package/dist/internal/transport.js +498 -0
  131. package/dist/internal/transport.js.map +1 -0
  132. package/dist/internal/trigger-matcher.d.ts +21 -0
  133. package/dist/internal/trigger-matcher.d.ts.map +1 -0
  134. package/dist/internal/trigger-matcher.js +114 -0
  135. package/dist/internal/trigger-matcher.js.map +1 -0
  136. package/dist/internal/types.d.ts +89 -0
  137. package/dist/internal/types.d.ts.map +1 -0
  138. package/dist/internal/types.js +2 -0
  139. package/dist/internal/types.js.map +1 -0
  140. package/dist/internal/user-state.d.ts +11 -0
  141. package/dist/internal/user-state.d.ts.map +1 -0
  142. package/dist/internal/user-state.js +118 -0
  143. package/dist/internal/user-state.js.map +1 -0
  144. package/dist/native/events.d.ts +27 -0
  145. package/dist/native/events.d.ts.map +1 -0
  146. package/dist/native/events.js +12 -0
  147. package/dist/native/events.js.map +1 -0
  148. package/dist/native/push-bridge.d.ts +20 -0
  149. package/dist/native/push-bridge.d.ts.map +1 -0
  150. package/dist/native/push-bridge.js +92 -0
  151. package/dist/native/push-bridge.js.map +1 -0
  152. package/dist/preview/PromptShell.d.ts +9 -0
  153. package/dist/preview/PromptShell.d.ts.map +1 -0
  154. package/dist/preview/PromptShell.js +128 -0
  155. package/dist/preview/PromptShell.js.map +1 -0
  156. package/dist/preview/SurveyShell.d.ts +15 -0
  157. package/dist/preview/SurveyShell.d.ts.map +1 -0
  158. package/dist/preview/SurveyShell.js +197 -0
  159. package/dist/preview/SurveyShell.js.map +1 -0
  160. package/dist/preview/index.d.ts +4 -0
  161. package/dist/preview/index.d.ts.map +1 -0
  162. package/dist/preview/index.js +16 -0
  163. package/dist/preview/index.js.map +1 -0
  164. package/dist/ui/InAppMessageView.d.ts +12 -0
  165. package/dist/ui/InAppMessageView.d.ts.map +1 -0
  166. package/dist/ui/InAppMessageView.js +260 -0
  167. package/dist/ui/InAppMessageView.js.map +1 -0
  168. package/dist/ui/PromptSheet.d.ts +12 -0
  169. package/dist/ui/PromptSheet.d.ts.map +1 -0
  170. package/dist/ui/PromptSheet.js +285 -0
  171. package/dist/ui/PromptSheet.js.map +1 -0
  172. package/dist/ui/QuestionImageHeader.d.ts +12 -0
  173. package/dist/ui/QuestionImageHeader.d.ts.map +1 -0
  174. package/dist/ui/QuestionImageHeader.js +22 -0
  175. package/dist/ui/QuestionImageHeader.js.map +1 -0
  176. package/dist/ui/SurveyView.d.ts +25 -0
  177. package/dist/ui/SurveyView.d.ts.map +1 -0
  178. package/dist/ui/SurveyView.js +478 -0
  179. package/dist/ui/SurveyView.js.map +1 -0
  180. package/dist/ui/animations.d.ts +4 -0
  181. package/dist/ui/animations.d.ts.map +1 -0
  182. package/dist/ui/animations.js +24 -0
  183. package/dist/ui/animations.js.map +1 -0
  184. package/dist/ui/questions/MultipleChoiceQuestion.d.ts +12 -0
  185. package/dist/ui/questions/MultipleChoiceQuestion.d.ts.map +1 -0
  186. package/dist/ui/questions/MultipleChoiceQuestion.js +41 -0
  187. package/dist/ui/questions/MultipleChoiceQuestion.js.map +1 -0
  188. package/dist/ui/questions/NpsQuestion.d.ts +14 -0
  189. package/dist/ui/questions/NpsQuestion.d.ts.map +1 -0
  190. package/dist/ui/questions/NpsQuestion.js +73 -0
  191. package/dist/ui/questions/NpsQuestion.js.map +1 -0
  192. package/dist/ui/questions/RatingQuestion.d.ts +21 -0
  193. package/dist/ui/questions/RatingQuestion.d.ts.map +1 -0
  194. package/dist/ui/questions/RatingQuestion.js +91 -0
  195. package/dist/ui/questions/RatingQuestion.js.map +1 -0
  196. package/dist/ui/questions/ShortTextQuestion.d.ts +12 -0
  197. package/dist/ui/questions/ShortTextQuestion.d.ts.map +1 -0
  198. package/dist/ui/questions/ShortTextQuestion.js +25 -0
  199. package/dist/ui/questions/ShortTextQuestion.js.map +1 -0
  200. package/dist/ui/requests/BoardView.d.ts +9 -0
  201. package/dist/ui/requests/BoardView.d.ts.map +1 -0
  202. package/dist/ui/requests/BoardView.js +270 -0
  203. package/dist/ui/requests/BoardView.js.map +1 -0
  204. package/dist/ui/requests/CommentsSection.d.ts +7 -0
  205. package/dist/ui/requests/CommentsSection.d.ts.map +1 -0
  206. package/dist/ui/requests/CommentsSection.js +254 -0
  207. package/dist/ui/requests/CommentsSection.js.map +1 -0
  208. package/dist/ui/requests/DetailView.d.ts +8 -0
  209. package/dist/ui/requests/DetailView.d.ts.map +1 -0
  210. package/dist/ui/requests/DetailView.js +206 -0
  211. package/dist/ui/requests/DetailView.js.map +1 -0
  212. package/dist/ui/requests/RequestsHost.d.ts +12 -0
  213. package/dist/ui/requests/RequestsHost.d.ts.map +1 -0
  214. package/dist/ui/requests/RequestsHost.js +58 -0
  215. package/dist/ui/requests/RequestsHost.js.map +1 -0
  216. package/dist/ui/requests/StatusPill.d.ts +6 -0
  217. package/dist/ui/requests/StatusPill.d.ts.map +1 -0
  218. package/dist/ui/requests/StatusPill.js +25 -0
  219. package/dist/ui/requests/StatusPill.js.map +1 -0
  220. package/dist/ui/requests/SubmitView.d.ts +8 -0
  221. package/dist/ui/requests/SubmitView.d.ts.map +1 -0
  222. package/dist/ui/requests/SubmitView.js +94 -0
  223. package/dist/ui/requests/SubmitView.js.map +1 -0
  224. package/dist/ui/requests/shared.d.ts +21 -0
  225. package/dist/ui/requests/shared.d.ts.map +1 -0
  226. package/dist/ui/requests/shared.js +74 -0
  227. package/dist/ui/requests/shared.js.map +1 -0
  228. package/dist/ui/survey-questions.d.ts +20 -0
  229. package/dist/ui/survey-questions.d.ts.map +1 -0
  230. package/dist/ui/survey-questions.js +211 -0
  231. package/dist/ui/survey-questions.js.map +1 -0
  232. package/dist/ui/theme.d.ts +15 -0
  233. package/dist/ui/theme.d.ts.map +1 -0
  234. package/dist/ui/theme.js +31 -0
  235. package/dist/ui/theme.js.map +1 -0
  236. package/ios/Extension/UserGistNotificationService.swift +292 -0
  237. package/ios/UserGistPush.h +16 -0
  238. package/ios/UserGistPush.mm +158 -0
  239. package/ios/UserGistPushImpl.swift +399 -0
  240. package/ios/UserGistPushSwizzle.m +168 -0
  241. package/package.json +89 -0
  242. package/react-native.config.js +16 -0
@@ -0,0 +1,89 @@
1
+ import type { ArmedTrigger, ClientPrompt, PromptTheme } from '@usergist/sdk-core/mobile';
2
+ export interface ResolvedConfig {
3
+ readonly writeKey: string;
4
+ readonly apiUrl: string;
5
+ readonly environment: 'production' | 'staging' | 'development';
6
+ readonly flushIntervalMs: number;
7
+ readonly flushBatchSize: number;
8
+ readonly maxQueueSize: number;
9
+ readonly triggerSyncIntervalMs: number;
10
+ readonly debug: boolean;
11
+ readonly appVersion: string | null;
12
+ }
13
+ export interface IdentityState {
14
+ readonly anonymousId: string;
15
+ readonly externalId: string | null;
16
+ }
17
+ export interface ConsentState {
18
+ readonly analytics: boolean;
19
+ readonly feedback: boolean;
20
+ readonly push: boolean;
21
+ readonly survey: boolean;
22
+ readonly updatedAt: string | null;
23
+ readonly version: number;
24
+ }
25
+ export interface QueuedEvent {
26
+ readonly eventId: string;
27
+ readonly purpose: 'analytics' | 'feedback';
28
+ readonly name: string;
29
+ readonly timestamp: string;
30
+ readonly anonymousId: string;
31
+ readonly externalId: string | null;
32
+ readonly properties?: Readonly<Record<string, string | number | boolean | null>>;
33
+ readonly sessionId?: string;
34
+ }
35
+ export interface StoredRulesCache {
36
+ readonly triggers: ReadonlyArray<ArmedTrigger>;
37
+ readonly fetchedAt: string;
38
+ readonly serverTime: string;
39
+ readonly nextSyncMs: number;
40
+ }
41
+ export interface StoredSurveyRulesCache {
42
+ readonly surveys: ReadonlyArray<import('@usergist/sdk-core/mobile').ArmedSurvey>;
43
+ readonly fetchedAt: string;
44
+ readonly serverTime: string;
45
+ readonly nextSyncMs: number;
46
+ }
47
+ export interface FrequencyCapEntry {
48
+ readonly promptId: string;
49
+ readonly lastShownAt: string;
50
+ }
51
+ export interface FrequencyCapState {
52
+ readonly perPrompt: Readonly<Record<string, string>>;
53
+ readonly lastAnyPromptAt: string | null;
54
+ }
55
+ export type DecisionOutcome = 'fired' | 'blocked-by-consent' | 'blocked-by-segment' | 'blocked-by-cap' | 'blocked-no-trigger' | 'blocked-error';
56
+ export interface DecisionTrace {
57
+ readonly eventName: string;
58
+ readonly promptId?: string;
59
+ readonly outcome: DecisionOutcome;
60
+ readonly reason?: string;
61
+ readonly at: string;
62
+ }
63
+ export interface ShowPromptPayload {
64
+ readonly promptId: string;
65
+ readonly prompt: ClientPrompt;
66
+ readonly theme?: PromptTheme;
67
+ readonly shownAt: number;
68
+ readonly triggerEventName: string;
69
+ }
70
+ export interface ResponseEmission {
71
+ readonly promptId: string;
72
+ readonly answers: ReadonlyArray<{
73
+ questionId: string;
74
+ value: number | string | ReadonlyArray<string> | null;
75
+ }>;
76
+ readonly dismissed: boolean;
77
+ readonly latencyMs: number;
78
+ }
79
+ export interface EventCountEntry {
80
+ readonly count: number;
81
+ readonly lastAt: string;
82
+ }
83
+ export interface UserEventHistory {
84
+ readonly timestamps: Readonly<Record<string, ReadonlyArray<string>>>;
85
+ }
86
+ export interface UserPropertiesState {
87
+ readonly properties: Readonly<Record<string, string | number | boolean | null>>;
88
+ }
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { type StorageScope } from './storage.js';
2
+ import type { UserState } from '@usergist/sdk-core/mobile';
3
+ export interface UserStateStore {
4
+ readonly hydrate: () => Promise<void>;
5
+ readonly mergeProperties: (p: Readonly<Record<string, string | number | boolean | null>>) => void;
6
+ readonly recordEvent: (name: string, at?: number) => void;
7
+ readonly buildForEval: () => UserState;
8
+ readonly clear: () => Promise<void>;
9
+ }
10
+ export declare function createUserStateStore(storage: StorageScope): UserStateStore;
11
+ //# sourceMappingURL=user-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-state.d.ts","sourceRoot":"","sources":["../../src/internal/user-state.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAI1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IACjG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,SAAS,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AASD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CAkG1E"}
@@ -0,0 +1,118 @@
1
+ // Local user-state store used by the client-side segment evaluator.
2
+ //
3
+ // We persist:
4
+ // - user properties (from identify() calls)
5
+ // - event timestamp history keyed by event name (capped at 200 per event)
6
+ //
7
+ // The evaluator needs `eventCounts: name -> windowDays -> count` and
8
+ // `lastEventAt: name -> iso`. We derive both on demand from the timestamp
9
+ // history so we don't have to reindex every time a window is asked about.
10
+ import { STORAGE_KEYS } from './storage.js';
11
+ import { reportError } from './debug.js';
12
+ const HISTORY_CAP_PER_EVENT = 200;
13
+ const EMPTY = { properties: {}, history: {} };
14
+ export function createUserStateStore(storage) {
15
+ let state = EMPTY;
16
+ let hydrated = false;
17
+ let persistTimer = null;
18
+ function schedulePersist() {
19
+ if (persistTimer)
20
+ return;
21
+ persistTimer = setTimeout(() => {
22
+ persistTimer = null;
23
+ void storage.setJson(STORAGE_KEYS.userProperties, { properties: state.properties });
24
+ void storage.setJson(STORAGE_KEYS.eventHistory, { history: state.history });
25
+ }, 200);
26
+ }
27
+ return {
28
+ async hydrate() {
29
+ if (hydrated)
30
+ return;
31
+ try {
32
+ const [props, hist] = await Promise.all([
33
+ storage.getJson(STORAGE_KEYS.userProperties),
34
+ storage.getJson(STORAGE_KEYS.eventHistory),
35
+ ]);
36
+ state = {
37
+ properties: props?.properties ?? {},
38
+ history: hist?.history ?? {},
39
+ };
40
+ }
41
+ catch (e) {
42
+ reportError('userState.hydrate failed', e);
43
+ }
44
+ hydrated = true;
45
+ },
46
+ mergeProperties(p) {
47
+ state = {
48
+ ...state,
49
+ properties: { ...state.properties, ...p },
50
+ };
51
+ schedulePersist();
52
+ },
53
+ recordEvent(name, at = Date.now()) {
54
+ const iso = new Date(at).toISOString();
55
+ const existing = state.history[name] ?? [];
56
+ const appended = [...existing, iso];
57
+ const trimmed = appended.length > HISTORY_CAP_PER_EVENT
58
+ ? appended.slice(appended.length - HISTORY_CAP_PER_EVENT)
59
+ : appended;
60
+ state = {
61
+ ...state,
62
+ history: { ...state.history, [name]: trimmed },
63
+ };
64
+ schedulePersist();
65
+ },
66
+ buildForEval() {
67
+ // Counts: we return counts for common windows (1,3,7,14,30,60,90,180,365).
68
+ // The evaluator reads by windowDays — a missing bucket returns 0, and
69
+ // rules typically use canonical windows. We also compute on-demand for
70
+ // exact matches stored in the rules, but this handles the 99% case
71
+ // without reindexing per-track.
72
+ const windows = [1, 3, 7, 14, 30, 60, 90, 180, 365];
73
+ const now = Date.now();
74
+ const counts = {};
75
+ const lastAt = {};
76
+ for (const name of Object.keys(state.history)) {
77
+ const stamps = state.history[name] ?? [];
78
+ if (stamps.length === 0)
79
+ continue;
80
+ const lastStamp = stamps[stamps.length - 1];
81
+ if (lastStamp)
82
+ lastAt[name] = lastStamp;
83
+ const bucket = {};
84
+ for (const w of windows) {
85
+ const cutoff = now - w * 86_400_000;
86
+ let c = 0;
87
+ // stamps are chronological; count from the tail
88
+ for (let i = stamps.length - 1; i >= 0; i--) {
89
+ const s = stamps[i];
90
+ if (!s)
91
+ continue;
92
+ if (Date.parse(s) >= cutoff)
93
+ c += 1;
94
+ else
95
+ break;
96
+ }
97
+ bucket[w] = c;
98
+ }
99
+ counts[name] = bucket;
100
+ }
101
+ return {
102
+ properties: state.properties,
103
+ eventCounts: counts,
104
+ lastEventAt: lastAt,
105
+ };
106
+ },
107
+ async clear() {
108
+ state = EMPTY;
109
+ hydrated = true;
110
+ if (persistTimer) {
111
+ clearTimeout(persistTimer);
112
+ persistTimer = null;
113
+ }
114
+ await storage.clearAll([STORAGE_KEYS.userProperties, STORAGE_KEYS.eventHistory]);
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=user-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-state.js","sourceRoot":"","sources":["../../src/internal/user-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Native event names emitted by UserGistPushImpl (iOS) /
3
+ * UserGistFirebaseMessagingService (Android). Keep in sync with the
4
+ * native sides — these are the contract.
5
+ */
6
+ export declare const USERGIST_PUSH_EVENTS: {
7
+ readonly TOKEN_RECEIVED: "UserGistPush:tokenReceived";
8
+ readonly TOKEN_ERROR: "UserGistPush:tokenError";
9
+ readonly NOTIFICATION_RECEIVED: "UserGistPush:notificationReceived";
10
+ readonly NOTIFICATION_OPENED: "UserGistPush:notificationOpened";
11
+ };
12
+ export type UserGistPushEventName = (typeof USERGIST_PUSH_EVENTS)[keyof typeof USERGIST_PUSH_EVENTS];
13
+ export interface TokenReceivedPayload {
14
+ readonly token: string;
15
+ readonly platform: 'ios' | 'android';
16
+ }
17
+ export interface TokenErrorPayload {
18
+ readonly error: string;
19
+ }
20
+ export interface NotificationPayload {
21
+ readonly title?: string;
22
+ readonly body?: string;
23
+ readonly data?: Record<string, unknown>;
24
+ readonly deliveryId?: string;
25
+ readonly actionIdentifier?: string;
26
+ }
27
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/native/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKvB,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Native event names emitted by UserGistPushImpl (iOS) /
3
+ * UserGistFirebaseMessagingService (Android). Keep in sync with the
4
+ * native sides — these are the contract.
5
+ */
6
+ export const USERGIST_PUSH_EVENTS = {
7
+ TOKEN_RECEIVED: 'UserGistPush:tokenReceived',
8
+ TOKEN_ERROR: 'UserGistPush:tokenError',
9
+ NOTIFICATION_RECEIVED: 'UserGistPush:notificationReceived',
10
+ NOTIFICATION_OPENED: 'UserGistPush:notificationOpened',
11
+ };
12
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/native/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,4BAA4B;IAC5C,WAAW,EAAE,yBAAyB;IACtC,qBAAqB,EAAE,mCAAmC;IAC1D,mBAAmB,EAAE,iCAAiC;CAC9C,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { EnablePushOptions, EnablePushResult, PushPermissionStatus } from '../NativeUserGistPush.js';
2
+ import { type NotificationPayload, type UserGistPushEventName, type TokenErrorPayload, type TokenReceivedPayload } from './events.js';
3
+ export declare const UserGistPushNative: {
4
+ isAvailable(): boolean;
5
+ enablePush(options?: EnablePushOptions): Promise<EnablePushResult>;
6
+ disablePush(): Promise<void>;
7
+ getPermissionStatus(): Promise<PushPermissionStatus>;
8
+ setBadgeCount(count: number): Promise<void>;
9
+ getInitialNotification(): Promise<NotificationPayload | null>;
10
+ };
11
+ export interface PushEventSubscription {
12
+ remove(): void;
13
+ }
14
+ export declare function onPushEvent<T = unknown>(name: UserGistPushEventName, cb: (payload: T) => void): PushEventSubscription;
15
+ export declare const onTokenReceived: (cb: (p: TokenReceivedPayload) => void) => PushEventSubscription;
16
+ export declare const onTokenError: (cb: (p: TokenErrorPayload) => void) => PushEventSubscription;
17
+ export declare const onNotificationReceived: (cb: (p: NotificationPayload) => void) => PushEventSubscription;
18
+ export declare const onNotificationOpened: (cb: (p: NotificationPayload) => void) => PushEventSubscription;
19
+ export type { EnablePushOptions, EnablePushResult, PushPermissionStatus };
20
+ //# sourceMappingURL=push-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-bridge.d.ts","sourceRoot":"","sources":["../../src/native/push-bridge.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAQ,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAE/G,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAA;AAuBpB,eAAO,MAAM,kBAAkB;mBACd,OAAO;yBAII,iBAAiB,GAAQ,OAAO,CAAC,gBAAgB,CAAC;mBAQvD,OAAO,CAAC,IAAI,CAAC;2BAQL,OAAO,CAAC,oBAAoB,CAAC;yBAK/B,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;8BAKjB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAKpE,CAAA;AAkBD,MAAM,WAAW,qBAAqB;IACpC,MAAM,IAAI,IAAI,CAAA;CACf;AAED,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,IAAI,EAAE,qBAAqB,EAC3B,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GACvB,qBAAqB,CAKvB;AAID,eAAO,MAAM,eAAe,GAAI,IAAI,CAAC,CAAC,EAAE,oBAAoB,KAAK,IAAI,0BACO,CAAA;AAC5E,eAAO,MAAM,YAAY,GAAI,IAAI,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,0BACO,CAAA;AACtE,eAAO,MAAM,sBAAsB,GAAI,IAAI,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,0BACO,CAAA;AAClF,eAAO,MAAM,oBAAoB,GAAI,IAAI,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,0BACO,CAAA;AAEhF,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAA"}
@@ -0,0 +1,92 @@
1
+ // Runtime bridge to the UserGist native push module.
2
+ //
3
+ // Strategy:
4
+ // 1. Try TurboModuleRegistry first (new architecture). If available, use it.
5
+ // 2. Fallback to legacy `NativeModules.UserGistPush`.
6
+ // 3. If neither is present (e.g., autolinking didn't run, or the consumer
7
+ // is on Expo Go), expose a stub that resolves to `{ granted: false,
8
+ // status: 'denied' }` so JS-side code never crashes — host devs see a
9
+ // clear console warning explaining what to do.
10
+ import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
11
+ import TurboModule from '../NativeUserGistPush.js';
12
+ import { USERGIST_PUSH_EVENTS, } from './events.js';
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const LegacyModule = NativeModules.UserGistPush;
15
+ const Module = TurboModule ?? LegacyModule ?? null;
16
+ let warned = false;
17
+ function warnMissing() {
18
+ if (warned)
19
+ return;
20
+ warned = true;
21
+ // eslint-disable-next-line no-console
22
+ console.warn('[usergist] Native push module not found. Make sure @usergist/feedback-react-native is installed and rebuild the app (`pod install` for iOS, rebuild for Android). Push acquisition is disabled until then.');
23
+ }
24
+ const STUB_RESULT = {
25
+ granted: false,
26
+ status: 'denied',
27
+ platform: Platform.OS === 'ios' ? 'ios' : 'android',
28
+ };
29
+ export const UserGistPushNative = {
30
+ isAvailable() {
31
+ return Module != null;
32
+ },
33
+ async enablePush(options = {}) {
34
+ if (!Module) {
35
+ warnMissing();
36
+ return STUB_RESULT;
37
+ }
38
+ return Module.enablePush(options);
39
+ },
40
+ async disablePush() {
41
+ if (!Module) {
42
+ warnMissing();
43
+ return;
44
+ }
45
+ await Module.disablePush();
46
+ },
47
+ async getPermissionStatus() {
48
+ if (!Module)
49
+ return 'denied';
50
+ return Module.getPushPermissionStatus();
51
+ },
52
+ async setBadgeCount(count) {
53
+ if (!Module)
54
+ return;
55
+ await Module.setBadgeCount(count);
56
+ },
57
+ async getInitialNotification() {
58
+ if (!Module)
59
+ return null;
60
+ const raw = await Module.getInitialNotification();
61
+ return raw;
62
+ },
63
+ };
64
+ // ---------- NativeEventEmitter ----------
65
+ let emitter = null;
66
+ function getEmitter() {
67
+ if (!Module)
68
+ return null;
69
+ if (!emitter) {
70
+ // RN >= 0.65 accepts undefined for non-iOS modules; the legacy iOS
71
+ // RCTEventEmitter requires the module reference. Cast through unknown
72
+ // because the public `NativeEventEmitter` constructor signature isn't
73
+ // compatible with TurboModule's stronger typing.
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ emitter = new NativeEventEmitter(Module);
76
+ }
77
+ return emitter;
78
+ }
79
+ export function onPushEvent(name, cb) {
80
+ const e = getEmitter();
81
+ if (!e)
82
+ return { remove: () => undefined };
83
+ const sub = e.addListener(name, cb);
84
+ return { remove: () => sub.remove() };
85
+ }
86
+ // Typed convenience wrappers — use these from UserGist.ts so the payload
87
+ // shapes are compile-checked at call sites.
88
+ export const onTokenReceived = (cb) => onPushEvent(USERGIST_PUSH_EVENTS.TOKEN_RECEIVED, cb);
89
+ export const onTokenError = (cb) => onPushEvent(USERGIST_PUSH_EVENTS.TOKEN_ERROR, cb);
90
+ export const onNotificationReceived = (cb) => onPushEvent(USERGIST_PUSH_EVENTS.NOTIFICATION_RECEIVED, cb);
91
+ export const onNotificationOpened = (cb) => onPushEvent(USERGIST_PUSH_EVENTS.NOTIFICATION_OPENED, cb);
92
+ //# sourceMappingURL=push-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-bridge.js","sourceRoot":"","sources":["../../src/native/push-bridge.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,YAAY;AACZ,+EAA+E;AAC/E,wDAAwD;AACxD,4EAA4E;AAC5E,yEAAyE;AACzE,2EAA2E;AAC3E,oDAAoD;AAEpD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE1E,OAAO,WAAW,MAAM,0BAA0B,CAAA;AAClD,OAAO,EACL,oBAAoB,GAKrB,MAAM,aAAa,CAAA;AAEpB,8DAA8D;AAC9D,MAAM,YAAY,GAAsB,aAAqB,CAAC,YAAY,CAAA;AAE1E,MAAM,MAAM,GAAgB,WAAW,IAAI,YAAY,IAAI,IAAI,CAAA;AAE/D,IAAI,MAAM,GAAG,KAAK,CAAA;AAClB,SAAS,WAAW;IAClB,IAAI,MAAM;QAAE,OAAM;IAClB,MAAM,GAAG,IAAI,CAAA;IACb,sCAAsC;IACtC,OAAO,CAAC,IAAI,CACV,4MAA4M,CAC7M,CAAA;AACH,CAAC;AAED,MAAM,WAAW,GAAqB;IACpC,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;CACpD,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,WAAW;QACT,OAAO,MAAM,IAAI,IAAI,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA6B,EAAE;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,WAAW,EAAE,CAAA;YACb,OAAO,WAAW,CAAA;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,OAAgD,CAAC,CAAA;IAC5E,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,WAAW,EAAE,CAAA;YACb,OAAM;QACR,CAAC;QACD,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAA;QAC5B,OAAO,MAAM,CAAC,uBAAuB,EAAE,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,sBAAsB,EAAE,CAAA;QACjD,OAAO,GAAiC,CAAA;IAC1C,CAAC;CACF,CAAA;AAED,2CAA2C;AAE3C,IAAI,OAAO,GAA8B,IAAI,CAAA;AAC7C,SAAS,UAAU;IACjB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,iDAAiD;QACjD,8DAA8D;QAC9D,OAAO,GAAG,IAAI,kBAAkB,CAAC,MAAa,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAMD,MAAM,UAAU,WAAW,CACzB,IAA2B,EAC3B,EAAwB;IAExB,MAAM,CAAC,GAAG,UAAU,EAAE,CAAA;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAA8B,CAAC,CAAA;IAC/D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;AACvC,CAAC;AAED,yEAAyE;AACzE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAqC,EAAE,EAAE,CACvE,WAAW,CAAuB,oBAAoB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAkC,EAAE,EAAE,CACjE,WAAW,CAAoB,oBAAoB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EAAoC,EAAE,EAAE,CAC7E,WAAW,CAAsB,oBAAoB,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAoC,EAAE,EAAE,CAC3E,WAAW,CAAsB,oBAAoB,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { PromptTheme, Question } from '@usergist/sdk-core/mobile';
3
+ export interface PromptShellProps {
4
+ readonly questions: ReadonlyArray<Question>;
5
+ readonly currentQuestionId?: string | null;
6
+ readonly theme?: PromptTheme | null;
7
+ }
8
+ export declare function PromptShell({ questions, currentQuestionId, theme, }: PromptShellProps): React.ReactElement;
9
+ //# sourceMappingURL=PromptShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptShell.d.ts","sourceRoot":"","sources":["../../src/preview/PromptShell.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAWtE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CACpC;AAMD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,iBAAiB,EACjB,KAAK,GACN,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAqGvC"}
@@ -0,0 +1,128 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Pure-presentational feedback bottom-sheet renderer used by the
3
+ // dashboard composer's live preview. Same JSX shape as PromptSheet
4
+ // (scrim + sheet + skip/submit) minus Modal + animations + dismiss
5
+ // wiring. The dashboard mounts this via react-native-web inside an
6
+ // iPhone PhoneFrame so the BUILD / DESIGN previews show exactly what
7
+ // the SDK ships on iOS / Android.
8
+ import { useMemo } from 'react';
9
+ import { ScrollView, StyleSheet, Text, View } from 'react-native';
10
+ import { DEFAULT_THEME, mergeTheme } from '../ui/theme.js';
11
+ import { RatingQuestion } from '../ui/questions/RatingQuestion.js';
12
+ import { NpsQuestion } from '../ui/questions/NpsQuestion.js';
13
+ import { MultipleChoiceQuestion } from '../ui/questions/MultipleChoiceQuestion.js';
14
+ import { ShortTextQuestion } from '../ui/questions/ShortTextQuestion.js';
15
+ import { promptNeedsExplicitNext, promptNextRequiresAnswer, } from '../internal/prompt-flow.js';
16
+ function isTextInput(type) {
17
+ return type === 'short_text';
18
+ }
19
+ export function PromptShell({ questions, currentQuestionId, theme, }) {
20
+ const resolvedTheme = useMemo(() => mergeTheme(DEFAULT_THEME, theme ?? undefined), [theme]);
21
+ const current = questions.find((q) => q.id === currentQuestionId) ?? questions[0] ?? null;
22
+ const currentIndex = current
23
+ ? Math.max(0, questions.findIndex((q) => q.id === current.id))
24
+ : 0;
25
+ // currentIndex retained for potential progress display in future
26
+ // iterations; isLast is no longer needed since the button text is
27
+ // always 'Next' (the runtime fires submit when there's nowhere
28
+ // further to go).
29
+ void currentIndex;
30
+ return (_jsxs(View, { style: styles.root, children: [_jsx(View, { style: styles.scrim, pointerEvents: "none" }), _jsxs(View, { style: [
31
+ styles.sheet,
32
+ {
33
+ backgroundColor: resolvedTheme.colors.background,
34
+ borderTopLeftRadius: resolvedTheme.radius,
35
+ borderTopRightRadius: resolvedTheme.radius,
36
+ },
37
+ ], children: [_jsxs(View, { style: styles.headerRow, children: [_jsx(View, { style: [styles.handle, { backgroundColor: resolvedTheme.colors.border }] }), _jsx(View, { style: styles.closeBtn, children: _jsx(Text, { style: {
38
+ color: resolvedTheme.colors.text,
39
+ fontFamily: resolvedTheme.fontFamily,
40
+ fontSize: 14,
41
+ fontWeight: '600',
42
+ lineHeight: 18,
43
+ }, children: "\u2715" }) })] }), _jsx(ScrollView, { contentContainerStyle: styles.body, children: current ? (_jsxs(_Fragment, { children: [renderQuestion(current, resolvedTheme), isTextInput(current.type) ? (_jsx(View, { style: [
44
+ styles.next,
45
+ { backgroundColor: resolvedTheme.colors.primary, opacity: 0.4 },
46
+ ], children: _jsx(Text, { style: {
47
+ color: '#ffffff',
48
+ fontWeight: '700',
49
+ fontFamily: resolvedTheme.fontFamily,
50
+ fontSize: 16,
51
+ }, children: "Next" }) })) : null] })) : null }), current && promptNeedsExplicitNext(current) && !isTextInput(current.type) ? (_jsx(View, { style: [
52
+ styles.next,
53
+ {
54
+ backgroundColor: resolvedTheme.colors.primary,
55
+ opacity: promptNextRequiresAnswer(current) ? 0.4 : 1,
56
+ },
57
+ ], children: _jsx(Text, { style: {
58
+ color: '#ffffff',
59
+ fontWeight: '700',
60
+ fontFamily: resolvedTheme.fontFamily,
61
+ fontSize: 16,
62
+ }, children: "Next" }) })) : null] })] }));
63
+ }
64
+ function renderQuestion(q, theme) {
65
+ switch (q.type) {
66
+ case 'rating':
67
+ return (_jsx(RatingQuestion, { question: q, value: null, onChange: () => undefined, theme: theme }));
68
+ case 'nps':
69
+ return (_jsx(NpsQuestion, { question: q, score: null, followUp: "", onScore: () => undefined, onFollowUp: () => undefined, theme: theme }));
70
+ case 'multiple_choice':
71
+ return (_jsx(MultipleChoiceQuestion, { question: q, value: [], onChange: () => undefined, theme: theme }));
72
+ case 'short_text':
73
+ return (_jsx(ShortTextQuestion, { question: q, value: "", onChange: () => undefined, theme: theme }));
74
+ }
75
+ }
76
+ const styles = StyleSheet.create({
77
+ root: {
78
+ flex: 1,
79
+ justifyContent: 'flex-end',
80
+ },
81
+ scrim: {
82
+ ...StyleSheet.absoluteFillObject,
83
+ backgroundColor: 'rgba(0,0,0,0.4)',
84
+ },
85
+ sheet: {
86
+ minHeight: 280,
87
+ paddingTop: 20,
88
+ paddingHorizontal: 20,
89
+ paddingBottom: 30,
90
+ },
91
+ headerRow: {
92
+ position: 'relative',
93
+ height: 32,
94
+ marginBottom: 24,
95
+ },
96
+ handle: {
97
+ width: 40,
98
+ height: 4,
99
+ borderRadius: 2,
100
+ alignSelf: 'center',
101
+ marginTop: 6,
102
+ },
103
+ closeBtn: {
104
+ position: 'absolute',
105
+ right: 0,
106
+ top: 0,
107
+ width: 32,
108
+ height: 32,
109
+ borderRadius: 16,
110
+ backgroundColor: 'rgba(0,0,0,0.06)',
111
+ alignItems: 'center',
112
+ justifyContent: 'center',
113
+ },
114
+ body: {
115
+ paddingBottom: 16,
116
+ },
117
+ next: {
118
+ alignSelf: 'stretch',
119
+ marginTop: 20,
120
+ paddingVertical: 16,
121
+ paddingHorizontal: 24,
122
+ borderRadius: 999,
123
+ alignItems: 'center',
124
+ justifyContent: 'center',
125
+ minHeight: 52,
126
+ },
127
+ });
128
+ //# sourceMappingURL=PromptShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptShell.js","sourceRoot":"","sources":["../../src/preview/PromptShell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { PromptTheme, SurveyAnswerRecord, SurveyAnswerValue, SurveyCampaignWithFlow } from '@usergist/sdk-core/mobile';
3
+ export interface SurveyShellProps {
4
+ readonly survey: SurveyCampaignWithFlow;
5
+ readonly theme?: PromptTheme | null;
6
+ readonly currentQuestionId?: string | null;
7
+ readonly answers?: SurveyAnswerRecord;
8
+ readonly onAnswerChange?: (qid: string, value: SurveyAnswerValue) => void;
9
+ readonly onAdvance?: () => void;
10
+ readonly onBack?: () => void;
11
+ readonly onClose?: () => void;
12
+ readonly showEndScreen?: boolean;
13
+ }
14
+ export declare function SurveyShell({ survey, theme, currentQuestionId, answers, onAnswerChange, onAdvance, onBack, onClose, showEndScreen, }: SurveyShellProps): React.ReactElement;
15
+ //# sourceMappingURL=SurveyShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurveyShell.d.ts","sourceRoot":"","sources":["../../src/preview/SurveyShell.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAQtC,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EAGvB,MAAM,2BAA2B,CAAA;AAgBlC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAEnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAG1C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAGzE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAG7B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAID,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,OAAY,EACZ,cAAqB,EACrB,SAAgB,EAChB,MAAa,EACb,OAAc,EACd,aAAqB,GACtB,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAiJvC"}