@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,285 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Bottom-sheet modal that renders an armed prompt and collects answers.
3
+ //
4
+ // Supports rating, NPS, multiple_choice, short_text. Questions are shown
5
+ // one at a time. Tap-to-select types auto-advance; text inputs render
6
+ // an inline full-width Next button under the field. The X close at the
7
+ // top-right is the only dismiss path. There's no Back button anywhere.
8
+ // Mirrors the SurveyView rules so feedback and surveys feel identical.
9
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
10
+ import { Animated, Dimensions, Easing, KeyboardAvoidingView, Modal, Platform, Pressable, StyleSheet, Text, View, } from 'react-native';
11
+ import { SafeAreaInsetsContext } from 'react-native-safe-area-context';
12
+ import { DEFAULT_THEME, mergeTheme } from './theme.js';
13
+ import { animateIn, animateOut } from './animations.js';
14
+ import { RatingQuestion } from './questions/RatingQuestion.js';
15
+ import { NpsQuestion } from './questions/NpsQuestion.js';
16
+ import { MultipleChoiceQuestion } from './questions/MultipleChoiceQuestion.js';
17
+ import { ShortTextQuestion } from './questions/ShortTextQuestion.js';
18
+ import { useModalSlot } from '../internal/modal-coordinator.js';
19
+ import { promptResponseAnswers, withPromptAnswer, } from '../internal/prompt-answers.js';
20
+ import { promptNeedsExplicitNext, promptNextRequiresAnswer, promptShouldAutoAdvance, } from '../internal/prompt-flow.js';
21
+ // Text inputs render their OWN inline Next button under the field
22
+ // (full-width, disabled until the user types something).
23
+ function isTextInput(type) {
24
+ return type === 'short_text';
25
+ }
26
+ function answerHasValue(v) {
27
+ if (v === null || v === undefined)
28
+ return false;
29
+ if (typeof v === 'string')
30
+ return v.trim().length > 0;
31
+ if (Array.isArray(v))
32
+ return v.length > 0;
33
+ return true;
34
+ }
35
+ export function PromptSheet({ payload, themeOverride, onSubmit, onDismiss, }) {
36
+ const [visible, setVisible] = useState(false);
37
+ const [index, setIndex] = useState(0);
38
+ const [answers, setAnswers] = useState({});
39
+ const answersRef = useRef({});
40
+ const closingRef = useRef(false);
41
+ const advanceTimerRef = useRef(null);
42
+ const modalGranted = useModalSlot('prompt', Boolean(payload));
43
+ const translate = useRef(new Animated.Value(0)).current;
44
+ const height = Dimensions.get('window').height;
45
+ // Read insets from context directly rather than useSafeAreaInsets(), which
46
+ // THROWS when no <SafeAreaProvider> is mounted above us. The SDK Provider
47
+ // renders this component unconditionally, so a host app that hasn't wrapped
48
+ // its tree in a SafeAreaProvider would otherwise crash on mount.
49
+ const insets = React.useContext(SafeAreaInsetsContext) ?? {
50
+ top: 0,
51
+ bottom: 0,
52
+ left: 0,
53
+ right: 0,
54
+ };
55
+ const theme = useMemo(() => {
56
+ if (themeOverride)
57
+ return mergeTheme(themeOverride, payload?.theme);
58
+ return mergeTheme(DEFAULT_THEME, payload?.theme);
59
+ }, [themeOverride, payload?.theme]);
60
+ useEffect(() => {
61
+ if (payload) {
62
+ if (advanceTimerRef.current)
63
+ clearTimeout(advanceTimerRef.current);
64
+ advanceTimerRef.current = null;
65
+ answersRef.current = {};
66
+ closingRef.current = false;
67
+ setAnswers({});
68
+ setIndex(0);
69
+ setVisible(true);
70
+ requestAnimationFrame(() => animateIn(translate));
71
+ }
72
+ }, [payload, translate]);
73
+ useEffect(() => () => {
74
+ if (advanceTimerRef.current)
75
+ clearTimeout(advanceTimerRef.current);
76
+ }, []);
77
+ // Slide each new question in from the right + fade up. Same
78
+ // pattern surveys use, so feedback and survey feel identical.
79
+ const questionTranslate = useRef(new Animated.Value(0)).current;
80
+ const questionOpacity = useRef(new Animated.Value(1)).current;
81
+ useEffect(() => {
82
+ questionTranslate.setValue(36);
83
+ questionOpacity.setValue(0);
84
+ Animated.parallel([
85
+ Animated.timing(questionTranslate, {
86
+ toValue: 0,
87
+ duration: 240,
88
+ easing: Easing.out(Easing.cubic),
89
+ useNativeDriver: true,
90
+ }),
91
+ Animated.timing(questionOpacity, {
92
+ toValue: 1,
93
+ duration: 240,
94
+ easing: Easing.out(Easing.cubic),
95
+ useNativeDriver: true,
96
+ }),
97
+ ]).start();
98
+ }, [index, questionTranslate, questionOpacity]);
99
+ if (!payload)
100
+ return null;
101
+ const questions = payload.prompt.questions;
102
+ const current = questions[index];
103
+ const isLast = index >= questions.length - 1;
104
+ function close(kind) {
105
+ if (closingRef.current)
106
+ return;
107
+ closingRef.current = true;
108
+ if (advanceTimerRef.current)
109
+ clearTimeout(advanceTimerRef.current);
110
+ advanceTimerRef.current = null;
111
+ animateOut(translate, () => {
112
+ setVisible(false);
113
+ const latencyMs = Date.now() - (payload?.shownAt ?? Date.now());
114
+ const result = {
115
+ promptId: payload.promptId,
116
+ answers: promptResponseAnswers(answersRef.current),
117
+ dismissed: kind === 'dismiss',
118
+ latencyMs,
119
+ };
120
+ if (kind === 'submit')
121
+ onSubmit(result);
122
+ else
123
+ onDismiss(result);
124
+ });
125
+ }
126
+ function setAnswer(qid, v) {
127
+ const nextAnswers = withPromptAnswer(answersRef.current, qid, v);
128
+ answersRef.current = nextAnswers;
129
+ setAnswers(nextAnswers);
130
+ // Auto-advance for tap-to-select question types — same UX rule
131
+ // as the survey shell. multi_choice + text inputs keep the
132
+ // explicit Next button so the user can pick multiple options
133
+ // or finish typing.
134
+ if (current?.id === qid && promptShouldAutoAdvance(current)) {
135
+ if (advanceTimerRef.current)
136
+ clearTimeout(advanceTimerRef.current);
137
+ advanceTimerRef.current = setTimeout(() => {
138
+ advanceTimerRef.current = null;
139
+ next();
140
+ }, 220);
141
+ }
142
+ }
143
+ function next() {
144
+ if (isLast)
145
+ close('submit');
146
+ else
147
+ setIndex((i) => i + 1);
148
+ }
149
+ function renderQuestion(q) {
150
+ switch (q.type) {
151
+ case 'rating': {
152
+ const v = answers[q.id];
153
+ return (_jsx(RatingQuestion, { question: q, value: typeof v === 'number' ? v : null, onChange: (n) => setAnswer(q.id, n), theme: theme }));
154
+ }
155
+ case 'nps': {
156
+ const scoreVal = answers[q.id];
157
+ const followUpKey = `${q.id}__followUp`;
158
+ const followUpVal = answers[followUpKey];
159
+ return (_jsx(NpsQuestion, { question: q, score: typeof scoreVal === 'number' ? scoreVal : null, followUp: typeof followUpVal === 'string' ? followUpVal : '', onScore: (n) => setAnswer(q.id, n), onFollowUp: (s) => setAnswer(followUpKey, s), theme: theme }));
160
+ }
161
+ case 'multiple_choice': {
162
+ const v = answers[q.id];
163
+ const arr = Array.isArray(v) ? v : [];
164
+ return (_jsx(MultipleChoiceQuestion, { question: q, value: arr, onChange: (next2) => setAnswer(q.id, next2), theme: theme }));
165
+ }
166
+ case 'short_text': {
167
+ const v = answers[q.id];
168
+ return (_jsx(ShortTextQuestion, { question: q, value: typeof v === 'string' ? v : '', onChange: (s) => setAnswer(q.id, s), theme: theme }));
169
+ }
170
+ // Unknown/newer question type (e.g. served by a newer dashboard to an
171
+ // older SDK). Render nothing instead of returning undefined, which would
172
+ // throw a React render error and unmount the host app tree.
173
+ default:
174
+ return null;
175
+ }
176
+ }
177
+ const translateY = translate.interpolate({
178
+ inputRange: [0, 1],
179
+ outputRange: [height, 0],
180
+ });
181
+ const opacity = translate.interpolate({
182
+ inputRange: [0, 1],
183
+ outputRange: [0, 1],
184
+ });
185
+ return (_jsx(Modal, { transparent: true, visible: visible && modalGranted, onRequestClose: () => close('dismiss'), animationType: "none", children: _jsxs(KeyboardAvoidingView, { behavior: Platform.OS === 'ios' ? 'padding' : undefined, style: styles.container, children: [_jsx(Animated.View, { style: [StyleSheet.absoluteFill, { backgroundColor: 'rgba(0,0,0,0.4)', opacity }], children: _jsx(Pressable, { style: StyleSheet.absoluteFill, onPress: () => close('dismiss'), accessibilityLabel: "Dismiss" }) }), _jsxs(Animated.View, { style: [
186
+ styles.sheet,
187
+ {
188
+ backgroundColor: theme.colors.background,
189
+ borderTopLeftRadius: theme.radius,
190
+ borderTopRightRadius: theme.radius,
191
+ paddingBottom: Math.max(insets.bottom, 30) + 16,
192
+ transform: [{ translateY }],
193
+ },
194
+ ], children: [_jsxs(View, { style: styles.headerRow, children: [_jsx(View, { style: [styles.handle, { backgroundColor: theme.colors.border }] }), _jsx(Pressable, { onPress: () => close('dismiss'), testID: "feedback-close", accessibilityRole: "button", accessibilityLabel: "Close", hitSlop: 12, style: styles.closeBtn, children: _jsx(Text, { style: {
195
+ color: theme.colors.text,
196
+ fontFamily: theme.fontFamily,
197
+ fontSize: 14,
198
+ fontWeight: '600',
199
+ lineHeight: 18,
200
+ }, children: "\u2715" }) })] }), current ? (_jsxs(Animated.View, { style: {
201
+ opacity: questionOpacity,
202
+ transform: [{ translateX: questionTranslate }],
203
+ }, children: [renderQuestion(current), isTextInput(current.type) ? (_jsx(Pressable, { onPress: next, testID: "feedback-next", disabled: !answerHasValue(answers[current.id]), accessibilityRole: "button", accessibilityLabel: "Next", style: [
204
+ styles.next,
205
+ {
206
+ backgroundColor: theme.colors.primary,
207
+ opacity: answerHasValue(answers[current.id]) ? 1 : 0.4,
208
+ },
209
+ ], children: _jsx(Text, { style: {
210
+ color: '#ffffff',
211
+ fontWeight: '700',
212
+ fontFamily: theme.fontFamily,
213
+ fontSize: 16,
214
+ }, children: "Next" }) })) : null] })) : null, current && promptNeedsExplicitNext(current) && !isTextInput(current.type) ? (_jsx(Pressable, { onPress: next, testID: "feedback-next", disabled: promptNextRequiresAnswer(current) &&
215
+ !answerHasValue(answers[current.id]), accessibilityRole: "button", accessibilityLabel: "Next", style: [
216
+ styles.next,
217
+ {
218
+ backgroundColor: theme.colors.primary,
219
+ opacity: promptNextRequiresAnswer(current) &&
220
+ !answerHasValue(answers[current.id])
221
+ ? 0.4
222
+ : 1,
223
+ },
224
+ ], children: _jsx(Text, { style: {
225
+ color: '#ffffff',
226
+ fontWeight: '700',
227
+ fontFamily: theme.fontFamily,
228
+ fontSize: 16,
229
+ }, children: "Next" }) })) : null] })] }) }));
230
+ }
231
+ const styles = StyleSheet.create({
232
+ container: { flex: 1, justifyContent: 'flex-end' },
233
+ sheet: {
234
+ // Sit somewhere between "tiny single-question pill" and "fills
235
+ // half the screen". 280pt gives the title + answers + endpoint
236
+ // labels a comfortable amount of vertical breathing room without
237
+ // pushing them too far up the device. paddingTop reserves space
238
+ // above the drag handle / X close so neither hugs the rounded
239
+ // top edge of the sheet.
240
+ minHeight: 280,
241
+ paddingTop: 20,
242
+ paddingHorizontal: 20,
243
+ },
244
+ headerRow: {
245
+ // Position the close button absolutely so the drag handle stays
246
+ // perfectly centred regardless of the X's width. The bottom
247
+ // margin pushes the question title down so it doesn't crowd the
248
+ // X — gives the eye a clear separation between the dismiss
249
+ // affordance and the actual content.
250
+ position: 'relative',
251
+ height: 32,
252
+ marginBottom: 24,
253
+ },
254
+ handle: {
255
+ width: 40,
256
+ height: 4,
257
+ borderRadius: 2,
258
+ alignSelf: 'center',
259
+ marginTop: 6,
260
+ },
261
+ closeBtn: {
262
+ position: 'absolute',
263
+ right: 0,
264
+ top: 0,
265
+ width: 32,
266
+ height: 32,
267
+ borderRadius: 16,
268
+ // Subtle gray pill behind the X — gives the dismiss target a
269
+ // visual affordance without competing with the primary action.
270
+ backgroundColor: 'rgba(0,0,0,0.06)',
271
+ alignItems: 'center',
272
+ justifyContent: 'center',
273
+ },
274
+ next: {
275
+ alignSelf: 'stretch',
276
+ marginTop: 20,
277
+ paddingVertical: 16,
278
+ paddingHorizontal: 24,
279
+ borderRadius: 999,
280
+ alignItems: 'center',
281
+ justifyContent: 'center',
282
+ minHeight: 52,
283
+ },
284
+ });
285
+ //# sourceMappingURL=PromptSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptSheet.js","sourceRoot":"","sources":["../../src/ui/PromptSheet.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ interface Props {
3
+ readonly uri: string;
4
+ readonly radius: number;
5
+ }
6
+ /**
7
+ * Renders an optional question photo above the question title.
8
+ * Fixed 16:9 aspect, theme corner radius, native `<Image>` caching.
9
+ */
10
+ export declare function QuestionImageHeader({ uri, radius }: Props): React.ReactElement;
11
+ export {};
12
+ //# sourceMappingURL=QuestionImageHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuestionImageHeader.d.ts","sourceRoot":"","sources":["../../src/ui/QuestionImageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,UAAU,KAAK;IACb,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAW9E"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Image, StyleSheet, View } from 'react-native';
3
+ /**
4
+ * Renders an optional question photo above the question title.
5
+ * Fixed 16:9 aspect, theme corner radius, native `<Image>` caching.
6
+ */
7
+ export function QuestionImageHeader({ uri, radius }) {
8
+ return (_jsx(View, { style: [styles.wrap, { borderRadius: radius }], children: _jsx(Image, { source: { uri }, accessibilityIgnoresInvertColors: true, style: styles.image, resizeMode: "cover" }) }));
9
+ }
10
+ const styles = StyleSheet.create({
11
+ wrap: {
12
+ width: '100%',
13
+ aspectRatio: 16 / 9,
14
+ overflow: 'hidden',
15
+ marginBottom: 16,
16
+ },
17
+ image: {
18
+ width: '100%',
19
+ height: '100%',
20
+ },
21
+ });
22
+ //# sourceMappingURL=QuestionImageHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuestionImageHeader.js","sourceRoot":"","sources":["../../src/ui/QuestionImageHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAOtD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAS;IACxD,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,YAClD,KAAC,KAAK,IACJ,MAAM,EAAE,EAAE,GAAG,EAAE,EACf,gCAAgC,QAChC,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,UAAU,EAAC,OAAO,GAClB,GACG,CACR,CAAA;AACH,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,EAAE,GAAG,CAAC;QACnB,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,EAAE;KACjB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;KACf;CACF,CAAC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import type { SurveyAnswerRecord, SurveyAnswerValue, SurveyCampaignWithFlow, SurveyAttemptSource } from '@usergist/sdk-core/mobile';
3
+ import type { ResolvedTheme } from './theme.js';
4
+ export interface SurveyLifecycleCallbacks {
5
+ readonly onShow?: (surveyId: string) => void;
6
+ readonly onComplete?: (surveyId: string, attemptId: string) => void;
7
+ readonly onAbandon?: (surveyId: string, attemptId: string) => void;
8
+ }
9
+ export interface SurveyViewProps extends SurveyLifecycleCallbacks {
10
+ readonly survey: SurveyCampaignWithFlow | null;
11
+ readonly attemptId: string | null;
12
+ readonly initialSnapshot: SurveyAnswerRecord;
13
+ readonly initialQuestionId: string | null;
14
+ readonly source: SurveyAttemptSource;
15
+ readonly themeOverride?: ResolvedTheme | null;
16
+ readonly onSaveProgress: (attemptId: string, currentQuestionId: string | null, snapshot: SurveyAnswerRecord) => Promise<void>;
17
+ readonly onCompleteAttempt: (attemptId: string, answers: ReadonlyArray<{
18
+ questionId: string;
19
+ value: SurveyAnswerValue;
20
+ }>) => Promise<void>;
21
+ readonly onAbandonAttempt: (attemptId: string) => Promise<void>;
22
+ readonly onDismissRequest: () => void;
23
+ }
24
+ export declare function SurveyView(props: SurveyViewProps): React.ReactElement | null;
25
+ //# sourceMappingURL=SurveyView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurveyView.d.ts","sourceRoot":"","sources":["../../src/ui/SurveyView.tsx"],"names":[],"mappings":"AASA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAgBhF,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EAGtB,mBAAmB,EACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAgB/C,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACnE;AAED,MAAM,WAAW,eAAgB,SAAQ,wBAAwB;IAC/D,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAA;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC7C,QAAQ,CAAC,cAAc,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,QAAQ,EAAE,kBAAkB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAA;KAAE,CAAC,KACrE,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAA;CACtC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAsb5E"}