@shakenbake/react-native 0.0.1
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/dist/ShakeNbakeProvider.d.ts +26 -0
- package/dist/ShakeNbakeProvider.d.ts.map +1 -0
- package/dist/ShakeNbakeProvider.js +338 -0
- package/dist/ShakeNbakeProvider.js.map +1 -0
- package/dist/__tests__/capture.test.d.ts +2 -0
- package/dist/__tests__/capture.test.d.ts.map +1 -0
- package/dist/__tests__/capture.test.js +93 -0
- package/dist/__tests__/capture.test.js.map +1 -0
- package/dist/__tests__/collectors.test.d.ts +2 -0
- package/dist/__tests__/collectors.test.d.ts.map +1 -0
- package/dist/__tests__/collectors.test.js +212 -0
- package/dist/__tests__/collectors.test.js.map +1 -0
- package/dist/__tests__/drawing-canvas.test.d.ts +2 -0
- package/dist/__tests__/drawing-canvas.test.d.ts.map +1 -0
- package/dist/__tests__/drawing-canvas.test.js +503 -0
- package/dist/__tests__/drawing-canvas.test.js.map +1 -0
- package/dist/__tests__/provider.test.d.ts +2 -0
- package/dist/__tests__/provider.test.d.ts.map +1 -0
- package/dist/__tests__/provider.test.js +431 -0
- package/dist/__tests__/provider.test.js.map +1 -0
- package/dist/__tests__/report-form.test.d.ts +2 -0
- package/dist/__tests__/report-form.test.d.ts.map +1 -0
- package/dist/__tests__/report-form.test.js +178 -0
- package/dist/__tests__/report-form.test.js.map +1 -0
- package/dist/__tests__/triggers.test.d.ts +2 -0
- package/dist/__tests__/triggers.test.d.ts.map +1 -0
- package/dist/__tests__/triggers.test.js +53 -0
- package/dist/__tests__/triggers.test.js.map +1 -0
- package/dist/annotate/DrawingCanvas.d.ts +13 -0
- package/dist/annotate/DrawingCanvas.d.ts.map +1 -0
- package/dist/annotate/DrawingCanvas.js +475 -0
- package/dist/annotate/DrawingCanvas.js.map +1 -0
- package/dist/annotate/types.d.ts +72 -0
- package/dist/annotate/types.d.ts.map +1 -0
- package/dist/annotate/types.js +34 -0
- package/dist/annotate/types.js.map +1 -0
- package/dist/annotate/useDrawingOperations.d.ts +88 -0
- package/dist/annotate/useDrawingOperations.d.ts.map +1 -0
- package/dist/annotate/useDrawingOperations.js +186 -0
- package/dist/annotate/useDrawingOperations.js.map +1 -0
- package/dist/capture/screenshot.d.ts +31 -0
- package/dist/capture/screenshot.d.ts.map +1 -0
- package/dist/capture/screenshot.js +90 -0
- package/dist/capture/screenshot.js.map +1 -0
- package/dist/context/collectors.d.ts +25 -0
- package/dist/context/collectors.d.ts.map +1 -0
- package/dist/context/collectors.js +244 -0
- package/dist/context/collectors.js.map +1 -0
- package/dist/hooks/useShakeNbake.d.ts +28 -0
- package/dist/hooks/useShakeNbake.d.ts.map +1 -0
- package/dist/hooks/useShakeNbake.js +30 -0
- package/dist/hooks/useShakeNbake.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/triggers/shake.d.ts +16 -0
- package/dist/triggers/shake.d.ts.map +1 -0
- package/dist/triggers/shake.js +41 -0
- package/dist/triggers/shake.js.map +1 -0
- package/dist/ui/ReportForm.d.ts +33 -0
- package/dist/ui/ReportForm.d.ts.map +1 -0
- package/dist/ui/ReportForm.js +608 -0
- package/dist/ui/ReportForm.js.map +1 -0
- package/dist/ui/form-validation.d.ts +26 -0
- package/dist/ui/form-validation.d.ts.map +1 -0
- package/dist/ui/form-validation.js +44 -0
- package/dist/ui/form-validation.js.map +1 -0
- package/dist/ui/state-machine.d.ts +70 -0
- package/dist/ui/state-machine.d.ts.map +1 -0
- package/dist/ui/state-machine.js +107 -0
- package/dist/ui/state-machine.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — DeviceContextCollector
|
|
4
|
+
// Gathers device, screen, network, battery, locale, app, and accessibility
|
|
5
|
+
// context from various Expo and React Native APIs.
|
|
6
|
+
//
|
|
7
|
+
// Every module import is wrapped in its own try/catch so that a missing
|
|
8
|
+
// peer dependency (or a runtime error) never breaks the entire collection.
|
|
9
|
+
//
|
|
10
|
+
// Dynamic imports use string literals so that bundler/test tooling (Vite,
|
|
11
|
+
// Vitest) can correctly intercept and mock the modules at test time.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.DeviceContextCollector = void 0;
|
|
15
|
+
const core_1 = require("@shakenbake/core");
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Helper: safely dynamic-import a module; returns undefined on failure.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
async function safeImport(importFn) {
|
|
20
|
+
try {
|
|
21
|
+
return (await importFn());
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Sub-collectors — grouped by their source module to avoid concurrent
|
|
29
|
+
// duplicate imports of the same package.
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Collects platform, screen, and accessibility from react-native. */
|
|
32
|
+
function extractFromReactNative(rn) {
|
|
33
|
+
const platformResult = {};
|
|
34
|
+
const screenResult = { width: 0, height: 0 };
|
|
35
|
+
const accessibilityResult = {};
|
|
36
|
+
const PlatformAPI = rn['Platform'];
|
|
37
|
+
if (PlatformAPI) {
|
|
38
|
+
platformResult.os = PlatformAPI.OS;
|
|
39
|
+
platformResult.osVersion = String(PlatformAPI.Version);
|
|
40
|
+
}
|
|
41
|
+
const Dimensions = rn['Dimensions'];
|
|
42
|
+
const PixelRatio = rn['PixelRatio'];
|
|
43
|
+
if (Dimensions) {
|
|
44
|
+
const win = Dimensions.get('window');
|
|
45
|
+
screenResult.width = win.width;
|
|
46
|
+
screenResult.height = win.height;
|
|
47
|
+
}
|
|
48
|
+
if (PixelRatio) {
|
|
49
|
+
screenResult.scale = PixelRatio.get();
|
|
50
|
+
screenResult.fontScale = PixelRatio.getFontScale();
|
|
51
|
+
accessibilityResult.fontScale = PixelRatio.getFontScale();
|
|
52
|
+
}
|
|
53
|
+
// Async accessibility calls must be awaited separately.
|
|
54
|
+
const accessibilityAsync = (async () => {
|
|
55
|
+
const result = { ...accessibilityResult };
|
|
56
|
+
const AccessibilityInfoAPI = rn['AccessibilityInfo'];
|
|
57
|
+
if (AccessibilityInfoAPI) {
|
|
58
|
+
try {
|
|
59
|
+
if (typeof AccessibilityInfoAPI.isScreenReaderEnabled === 'function') {
|
|
60
|
+
result.screenReaderEnabled =
|
|
61
|
+
await AccessibilityInfoAPI.isScreenReaderEnabled();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// ignore
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
if (typeof AccessibilityInfoAPI.isReduceMotionEnabled === 'function') {
|
|
69
|
+
result.reduceMotionEnabled =
|
|
70
|
+
await AccessibilityInfoAPI.isReduceMotionEnabled();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// ignore
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
})();
|
|
79
|
+
return {
|
|
80
|
+
platform: platformResult,
|
|
81
|
+
screen: screenResult,
|
|
82
|
+
accessibility: accessibilityResult,
|
|
83
|
+
accessibilityAsync,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Collects platform and app info from expo-constants. */
|
|
87
|
+
function extractFromConstants(constants) {
|
|
88
|
+
const platformResult = {};
|
|
89
|
+
const appResult = {};
|
|
90
|
+
const Constants = (constants['default'] ?? constants);
|
|
91
|
+
const manifest = (Constants['expoConfig'] ?? Constants['manifest']);
|
|
92
|
+
if (manifest) {
|
|
93
|
+
platformResult.runtimeVersion = manifest['runtimeVersion'];
|
|
94
|
+
platformResult.sdkVersion = manifest['sdkVersion'];
|
|
95
|
+
appResult.version = manifest['version'];
|
|
96
|
+
const ios = manifest['ios'];
|
|
97
|
+
const android = manifest['android'];
|
|
98
|
+
appResult.buildNumber =
|
|
99
|
+
ios?.['buildNumber'] ??
|
|
100
|
+
(android?.['versionCode'] !== undefined
|
|
101
|
+
? String(android['versionCode'])
|
|
102
|
+
: undefined);
|
|
103
|
+
appResult.bundleId =
|
|
104
|
+
ios?.['bundleIdentifier'] ??
|
|
105
|
+
android?.['package'];
|
|
106
|
+
}
|
|
107
|
+
return { platform: platformResult, app: appResult };
|
|
108
|
+
}
|
|
109
|
+
async function collectDevice() {
|
|
110
|
+
const result = {};
|
|
111
|
+
const device = await safeImport(() => import('expo-device'));
|
|
112
|
+
if (device) {
|
|
113
|
+
result.manufacturer = device['manufacturer'];
|
|
114
|
+
result.model = device['modelName'];
|
|
115
|
+
result.modelId = device['modelId'];
|
|
116
|
+
result.deviceType =
|
|
117
|
+
device['deviceType'] !== undefined
|
|
118
|
+
? String(device['deviceType'])
|
|
119
|
+
: undefined;
|
|
120
|
+
result.totalMemory = device['totalMemory'];
|
|
121
|
+
result.deviceName = device['deviceName'];
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
async function collectNetwork() {
|
|
126
|
+
const result = {};
|
|
127
|
+
const netinfo = await safeImport(() => import('@react-native-community/netinfo'));
|
|
128
|
+
if (netinfo) {
|
|
129
|
+
const NetInfo = (netinfo['default'] ?? netinfo);
|
|
130
|
+
if (typeof NetInfo.fetch === 'function') {
|
|
131
|
+
const state = await NetInfo.fetch();
|
|
132
|
+
result.type = state.type;
|
|
133
|
+
result.isConnected = state.isConnected ?? undefined;
|
|
134
|
+
result.isInternetReachable = state.isInternetReachable ?? undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
async function collectBattery() {
|
|
140
|
+
const result = {};
|
|
141
|
+
const battery = await safeImport(() => import('expo-battery'));
|
|
142
|
+
if (battery) {
|
|
143
|
+
const getBatteryLevelAsync = battery['getBatteryLevelAsync'];
|
|
144
|
+
const getBatteryStateAsync = battery['getBatteryStateAsync'];
|
|
145
|
+
const isLowPowerModeEnabledAsync = battery['isLowPowerModeEnabledAsync'];
|
|
146
|
+
if (typeof getBatteryLevelAsync === 'function') {
|
|
147
|
+
result.level = await getBatteryLevelAsync();
|
|
148
|
+
}
|
|
149
|
+
if (typeof getBatteryStateAsync === 'function') {
|
|
150
|
+
const state = await getBatteryStateAsync();
|
|
151
|
+
result.state = String(state);
|
|
152
|
+
}
|
|
153
|
+
if (typeof isLowPowerModeEnabledAsync === 'function') {
|
|
154
|
+
result.lowPowerMode = await isLowPowerModeEnabledAsync();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
async function collectLocale() {
|
|
160
|
+
const result = {};
|
|
161
|
+
const localization = await safeImport(() => import('expo-localization'));
|
|
162
|
+
if (localization) {
|
|
163
|
+
const getLocales = localization['getLocales'];
|
|
164
|
+
const getCalendars = localization['getCalendars'];
|
|
165
|
+
if (typeof getLocales === 'function') {
|
|
166
|
+
const locales = getLocales();
|
|
167
|
+
const primary = locales[0];
|
|
168
|
+
if (primary) {
|
|
169
|
+
result.languageCode = primary.languageCode ?? undefined;
|
|
170
|
+
result.regionCode = primary.regionCode ?? undefined;
|
|
171
|
+
result.currencyCode = primary.currencyCode ?? undefined;
|
|
172
|
+
result.isRTL = primary.textDirection === 'rtl';
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (typeof getCalendars === 'function') {
|
|
176
|
+
const calendars = getCalendars();
|
|
177
|
+
const primary = calendars[0];
|
|
178
|
+
if (primary) {
|
|
179
|
+
result.timezone = primary.timeZone ?? undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
class DeviceContextCollector {
|
|
186
|
+
name = 'device';
|
|
187
|
+
platform = 'react-native';
|
|
188
|
+
redactFields;
|
|
189
|
+
constructor(options) {
|
|
190
|
+
this.redactFields = options?.redactFields ?? [];
|
|
191
|
+
}
|
|
192
|
+
async collect() {
|
|
193
|
+
// Import modules once — each import is independent and guarded.
|
|
194
|
+
const [rn, constants, device, network, battery, locale] = await Promise.all([
|
|
195
|
+
safeImport(() => import('react-native')),
|
|
196
|
+
safeImport(() => import('expo-constants')),
|
|
197
|
+
collectDevice(),
|
|
198
|
+
collectNetwork(),
|
|
199
|
+
collectBattery(),
|
|
200
|
+
collectLocale(),
|
|
201
|
+
]);
|
|
202
|
+
// Extract data from react-native (synchronous + async accessibility).
|
|
203
|
+
let platformFromRN = {};
|
|
204
|
+
let screen = { width: 0, height: 0 };
|
|
205
|
+
let accessibility = {};
|
|
206
|
+
if (rn) {
|
|
207
|
+
const extracted = extractFromReactNative(rn);
|
|
208
|
+
platformFromRN = extracted.platform;
|
|
209
|
+
screen = extracted.screen;
|
|
210
|
+
accessibility = await extracted.accessibilityAsync;
|
|
211
|
+
}
|
|
212
|
+
// Extract data from expo-constants (platform + app).
|
|
213
|
+
let platformFromConstants = {};
|
|
214
|
+
let app = {};
|
|
215
|
+
if (constants) {
|
|
216
|
+
const extracted = extractFromConstants(constants);
|
|
217
|
+
platformFromConstants = extracted.platform;
|
|
218
|
+
app = extracted.app;
|
|
219
|
+
}
|
|
220
|
+
// Merge platform data from both sources.
|
|
221
|
+
const platform = {
|
|
222
|
+
os: platformFromRN.os ?? 'unknown',
|
|
223
|
+
osVersion: platformFromRN.osVersion,
|
|
224
|
+
runtimeVersion: platformFromConstants.runtimeVersion,
|
|
225
|
+
sdkVersion: platformFromConstants.sdkVersion,
|
|
226
|
+
};
|
|
227
|
+
const context = {
|
|
228
|
+
platform,
|
|
229
|
+
device,
|
|
230
|
+
screen,
|
|
231
|
+
network,
|
|
232
|
+
battery,
|
|
233
|
+
locale,
|
|
234
|
+
app,
|
|
235
|
+
accessibility,
|
|
236
|
+
};
|
|
237
|
+
if (this.redactFields.length > 0) {
|
|
238
|
+
return (0, core_1.redactContext)(context, this.redactFields);
|
|
239
|
+
}
|
|
240
|
+
return context;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
exports.DeviceContextCollector = DeviceContextCollector;
|
|
244
|
+
//# sourceMappingURL=collectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../src/context/collectors.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,oDAAoD;AACpD,2EAA2E;AAC3E,mDAAmD;AACnD,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,8EAA8E;;;AAe9E,2CAAiD;AAEjD,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CACvB,QAAgC;IAEhC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,QAAQ,EAAE,CAAM,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sEAAsE;AACtE,yCAAyC;AACzC,8EAA8E;AAE9E,sEAAsE;AACtE,SAAS,sBAAsB,CAAC,EAA2B;IAMzD,MAAM,cAAc,GAA6B,EAAE,CAAC;IACpD,MAAM,YAAY,GAAe,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACzD,MAAM,mBAAmB,GAA0B,EAAE,CAAC;IAEtD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAEpB,CAAC;IACd,IAAI,WAAW,EAAE,CAAC;QAChB,cAAc,CAAC,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;QACnC,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAErB,CAAC;IACd,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAErB,CAAC;IAEd,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,YAAY,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QAC/B,YAAY,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QACtC,YAAY,CAAC,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;QACnD,mBAAmB,CAAC,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;IAC5D,CAAC;IAED,wDAAwD;IACxD,MAAM,kBAAkB,GAAG,CAAC,KAAK,IAAoC,EAAE;QACrE,MAAM,MAAM,GAAG,EAAE,GAAG,mBAAmB,EAAE,CAAC;QAC1C,MAAM,oBAAoB,GAAG,EAAE,CAAC,mBAAmB,CAKtC,CAAC;QAEd,IAAI,oBAAoB,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,OAAO,oBAAoB,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;oBACrE,MAAM,CAAC,mBAAmB;wBACxB,MAAM,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,OAAO,oBAAoB,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;oBACrE,MAAM,CAAC,mBAAmB;wBACxB,MAAM,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,YAAY;QACpB,aAAa,EAAE,mBAAmB;QAClC,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,SAAS,oBAAoB,CAAC,SAAkC;IAI9D,MAAM,cAAc,GAA6B,EAAE,CAAC;IACpD,MAAM,SAAS,GAAY,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAGnD,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAErD,CAAC;IAEd,IAAI,QAAQ,EAAE,CAAC;QACb,cAAc,CAAC,cAAc,GAAG,QAAQ,CAAC,gBAAgB,CAE5C,CAAC;QACd,cAAc,CAAC,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAuB,CAAC;QAEzE,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAuB,CAAC;QAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAwC,CAAC;QACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAwC,CAAC;QAC3E,SAAS,CAAC,WAAW;YAClB,GAAG,EAAE,CAAC,aAAa,CAAwB;gBAC5C,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,KAAK,SAAS;oBACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAChC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjB,SAAS,CAAC,QAAQ;YACf,GAAG,EAAE,CAAC,kBAAkB,CAAwB;gBAChD,OAAO,EAAE,CAAC,SAAS,CAAwB,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC;IACF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,cAAc,CAAuB,CAAC;QACnE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAuB,CAAC;QACzD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAuB,CAAC;QACzD,MAAM,CAAC,UAAU;YACf,MAAM,CAAC,YAAY,CAAC,KAAK,SAAS;gBAChC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC9B,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,CAAuB,CAAC;QACjE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAuB,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,GAAG,EAAE,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAChD,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAM7C,CAAC;QACF,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACzB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,SAAS,CAAC;YACpD,MAAM,CAAC,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,IAAI,SAAS,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAC7B,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAE9C,CAAC;QACd,MAAM,oBAAoB,GAAG,OAAO,CAAC,sBAAsB,CAE9C,CAAC;QACd,MAAM,0BAA0B,GAAG,OAAO,CACxC,4BAA4B,CACW,CAAC;QAE1C,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;YAC/C,MAAM,CAAC,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,0BAA0B,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,CAAC,YAAY,GAAG,MAAM,0BAA0B,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,MAAM,YAAY,GAAG,MAAM,UAAU,CACnC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAClC,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,CAO/B,CAAC;QACd,MAAM,YAAY,GAAG,YAAY,CAAC,cAAc,CAEnC,CAAC;QAEd,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;gBACxD,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC;gBACpD,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;gBACxD,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAuBD,MAAa,sBAAsB;IACxB,IAAI,GAAG,QAAQ,CAAC;IAChB,QAAQ,GAAa,cAAc,CAAC;IAE5B,YAAY,CAAW;IAExC,YAAY,OAAuC;QACjD,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,gEAAgE;QAChE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GACrD,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,UAAU,CAA0B,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACjE,UAAU,CAA0B,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACnE,aAAa,EAAE;YACf,cAAc,EAAE;YAChB,cAAc,EAAE;YAChB,aAAa,EAAE;SAChB,CAAC,CAAC;QAEL,sEAAsE;QACtE,IAAI,cAAc,GAA6B,EAAE,CAAC;QAClD,IAAI,MAAM,GAAe,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACjD,IAAI,aAAa,GAA0B,EAAE,CAAC;QAE9C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,SAAS,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;YAC7C,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC;YACpC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAC1B,aAAa,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC;QACrD,CAAC;QAED,qDAAqD;QACrD,IAAI,qBAAqB,GAA6B,EAAE,CAAC;QACzD,IAAI,GAAG,GAAY,EAAE,CAAC;QAEtB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAClD,qBAAqB,GAAG,SAAS,CAAC,QAAQ,CAAC;YAC3C,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAoB;YAChC,EAAE,EAAE,cAAc,CAAC,EAAE,IAAI,SAAS;YAClC,SAAS,EAAE,cAAc,CAAC,SAAS;YACnC,cAAc,EAAE,qBAAqB,CAAC,cAAc;YACpD,UAAU,EAAE,qBAAqB,CAAC,UAAU;SAC7C,CAAC;QAEF,MAAM,OAAO,GAA2B;YACtC,QAAQ;YACR,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO;YACP,MAAM;YACN,GAAG;YACH,aAAa;SACd,CAAC;QAEF,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,IAAA,oBAAa,EAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AArED,wDAqEC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ShakeNbakeConfig } from '@shakenbake/core';
|
|
2
|
+
import type { FlowStep } from '../ui/state-machine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Return type for the useShakeNbake hook.
|
|
5
|
+
*/
|
|
6
|
+
export interface UseShakeNbakeResult {
|
|
7
|
+
/** Programmatically trigger the bug-reporting flow. */
|
|
8
|
+
trigger: () => void;
|
|
9
|
+
/** Whether the reporting flow is currently open (not idle). */
|
|
10
|
+
isOpen: boolean;
|
|
11
|
+
/** The current step in the reporting flow. */
|
|
12
|
+
currentStep: FlowStep;
|
|
13
|
+
/** The SDK configuration. */
|
|
14
|
+
config: ShakeNbakeConfig;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Hook to interact with the ShakeNbake bug-reporting flow.
|
|
18
|
+
*
|
|
19
|
+
* Must be used within a `<ShakeNbakeProvider>`.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const { trigger, isOpen } = useShakeNbake();
|
|
24
|
+
* // trigger() opens the bug-reporting flow programmatically
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function useShakeNbake(): UseShakeNbakeResult;
|
|
28
|
+
//# sourceMappingURL=useShakeNbake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useShakeNbake.d.ts","sourceRoot":"","sources":["../../src/hooks/useShakeNbake.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,WAAW,EAAE,QAAQ,CAAC;IACtB,6BAA6B;IAC7B,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CASnD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — useShakeNbake hook
|
|
4
|
+
//
|
|
5
|
+
// Consumes the ShakeNbake React context provided by ShakeNbakeProvider.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.useShakeNbake = useShakeNbake;
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const ShakeNbakeProvider_js_1 = require("../ShakeNbakeProvider.js");
|
|
11
|
+
/**
|
|
12
|
+
* Hook to interact with the ShakeNbake bug-reporting flow.
|
|
13
|
+
*
|
|
14
|
+
* Must be used within a `<ShakeNbakeProvider>`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { trigger, isOpen } = useShakeNbake();
|
|
19
|
+
* // trigger() opens the bug-reporting flow programmatically
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function useShakeNbake() {
|
|
23
|
+
const ctx = (0, react_1.useContext)(ShakeNbakeProvider_js_1.ShakeNbakeContext);
|
|
24
|
+
if (!ctx) {
|
|
25
|
+
throw new Error('useShakeNbake must be used within a <ShakeNbakeProvider>. ' +
|
|
26
|
+
'Wrap your app with <ShakeNbakeProvider config={...}>.');
|
|
27
|
+
}
|
|
28
|
+
return ctx;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=useShakeNbake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useShakeNbake.js","sourceRoot":"","sources":["../../src/hooks/useShakeNbake.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,gDAAgD;AAChD,EAAE;AACF,wEAAwE;AACxE,8EAA8E;;AAkC9E,sCASC;AAzCD,iCAAmC;AAInC,oEAA6D;AAiB7D;;;;;;;;;;GAUG;AACH,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAA,kBAAU,EAAC,yCAAiB,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,4DAA4D;YAC1D,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { ShakeTrigger } from './triggers/shake.js';
|
|
2
|
+
export { ViewShotCapture } from './capture/screenshot.js';
|
|
3
|
+
export { DeviceContextCollector } from './context/collectors.js';
|
|
4
|
+
export { ShakeNbakeProvider, ShakeNbakeContext } from './ShakeNbakeProvider.js';
|
|
5
|
+
export type { ShakeNbakeProviderProps } from './ShakeNbakeProvider.js';
|
|
6
|
+
export { useShakeNbake } from './hooks/useShakeNbake.js';
|
|
7
|
+
export type { UseShakeNbakeResult } from './hooks/useShakeNbake.js';
|
|
8
|
+
export { ReportForm } from './ui/ReportForm.js';
|
|
9
|
+
export type { ReportFormProps } from './ui/ReportForm.js';
|
|
10
|
+
export { validateTitle, validateForm, isFormValid, } from './ui/form-validation.js';
|
|
11
|
+
export type { FieldError } from './ui/form-validation.js';
|
|
12
|
+
export { createFlowState, flowReducer, } from './ui/state-machine.js';
|
|
13
|
+
export type { FlowStep, FlowData, FlowState, FlowAction, } from './ui/state-machine.js';
|
|
14
|
+
export { DrawingCanvas } from './annotate/DrawingCanvas.js';
|
|
15
|
+
export { useDrawingOperations, createDrawingState, addOperation, undoOperation, redoOperation, clearOperations, } from './annotate/useDrawingOperations.js';
|
|
16
|
+
export type { DrawingOperationsState, DrawingOperationsActions, DrawingState, } from './annotate/useDrawingOperations.js';
|
|
17
|
+
export type { DrawingCanvasProps, DrawingOperation, DrawingTool, DrawingColor, StrokeSize, Point, } from './annotate/types.js';
|
|
18
|
+
export { DRAWING_COLORS, DEFAULT_COLOR, STROKE_WIDTHS, DEFAULT_STROKE_SIZE, } from './annotate/types.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EACL,eAAe,EACf,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,sBAAsB,EACtB,wBAAwB,EACxB,YAAY,GACb,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,GACN,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — Public API
|
|
4
|
+
// Expo SDK (shake trigger, view-shot capture, device context collection,
|
|
5
|
+
// Skia annotation canvas, report form, provider)
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DEFAULT_STROKE_SIZE = exports.STROKE_WIDTHS = exports.DEFAULT_COLOR = exports.DRAWING_COLORS = exports.clearOperations = exports.redoOperation = exports.undoOperation = exports.addOperation = exports.createDrawingState = exports.useDrawingOperations = exports.DrawingCanvas = exports.flowReducer = exports.createFlowState = exports.isFormValid = exports.validateForm = exports.validateTitle = exports.ReportForm = exports.useShakeNbake = exports.ShakeNbakeContext = exports.ShakeNbakeProvider = exports.DeviceContextCollector = exports.ViewShotCapture = exports.ShakeTrigger = void 0;
|
|
9
|
+
// ---- Plugins ----
|
|
10
|
+
var shake_js_1 = require("./triggers/shake.js");
|
|
11
|
+
Object.defineProperty(exports, "ShakeTrigger", { enumerable: true, get: function () { return shake_js_1.ShakeTrigger; } });
|
|
12
|
+
var screenshot_js_1 = require("./capture/screenshot.js");
|
|
13
|
+
Object.defineProperty(exports, "ViewShotCapture", { enumerable: true, get: function () { return screenshot_js_1.ViewShotCapture; } });
|
|
14
|
+
var collectors_js_1 = require("./context/collectors.js");
|
|
15
|
+
Object.defineProperty(exports, "DeviceContextCollector", { enumerable: true, get: function () { return collectors_js_1.DeviceContextCollector; } });
|
|
16
|
+
// ---- Provider & Hook ----
|
|
17
|
+
var ShakeNbakeProvider_js_1 = require("./ShakeNbakeProvider.js");
|
|
18
|
+
Object.defineProperty(exports, "ShakeNbakeProvider", { enumerable: true, get: function () { return ShakeNbakeProvider_js_1.ShakeNbakeProvider; } });
|
|
19
|
+
Object.defineProperty(exports, "ShakeNbakeContext", { enumerable: true, get: function () { return ShakeNbakeProvider_js_1.ShakeNbakeContext; } });
|
|
20
|
+
var useShakeNbake_js_1 = require("./hooks/useShakeNbake.js");
|
|
21
|
+
Object.defineProperty(exports, "useShakeNbake", { enumerable: true, get: function () { return useShakeNbake_js_1.useShakeNbake; } });
|
|
22
|
+
// ---- Report Form ----
|
|
23
|
+
var ReportForm_js_1 = require("./ui/ReportForm.js");
|
|
24
|
+
Object.defineProperty(exports, "ReportForm", { enumerable: true, get: function () { return ReportForm_js_1.ReportForm; } });
|
|
25
|
+
// ---- Form Validation (pure functions) ----
|
|
26
|
+
var form_validation_js_1 = require("./ui/form-validation.js");
|
|
27
|
+
Object.defineProperty(exports, "validateTitle", { enumerable: true, get: function () { return form_validation_js_1.validateTitle; } });
|
|
28
|
+
Object.defineProperty(exports, "validateForm", { enumerable: true, get: function () { return form_validation_js_1.validateForm; } });
|
|
29
|
+
Object.defineProperty(exports, "isFormValid", { enumerable: true, get: function () { return form_validation_js_1.isFormValid; } });
|
|
30
|
+
// ---- State Machine (pure functions) ----
|
|
31
|
+
var state_machine_js_1 = require("./ui/state-machine.js");
|
|
32
|
+
Object.defineProperty(exports, "createFlowState", { enumerable: true, get: function () { return state_machine_js_1.createFlowState; } });
|
|
33
|
+
Object.defineProperty(exports, "flowReducer", { enumerable: true, get: function () { return state_machine_js_1.flowReducer; } });
|
|
34
|
+
// ---- Annotation ----
|
|
35
|
+
var DrawingCanvas_js_1 = require("./annotate/DrawingCanvas.js");
|
|
36
|
+
Object.defineProperty(exports, "DrawingCanvas", { enumerable: true, get: function () { return DrawingCanvas_js_1.DrawingCanvas; } });
|
|
37
|
+
var useDrawingOperations_js_1 = require("./annotate/useDrawingOperations.js");
|
|
38
|
+
Object.defineProperty(exports, "useDrawingOperations", { enumerable: true, get: function () { return useDrawingOperations_js_1.useDrawingOperations; } });
|
|
39
|
+
Object.defineProperty(exports, "createDrawingState", { enumerable: true, get: function () { return useDrawingOperations_js_1.createDrawingState; } });
|
|
40
|
+
Object.defineProperty(exports, "addOperation", { enumerable: true, get: function () { return useDrawingOperations_js_1.addOperation; } });
|
|
41
|
+
Object.defineProperty(exports, "undoOperation", { enumerable: true, get: function () { return useDrawingOperations_js_1.undoOperation; } });
|
|
42
|
+
Object.defineProperty(exports, "redoOperation", { enumerable: true, get: function () { return useDrawingOperations_js_1.redoOperation; } });
|
|
43
|
+
Object.defineProperty(exports, "clearOperations", { enumerable: true, get: function () { return useDrawingOperations_js_1.clearOperations; } });
|
|
44
|
+
var types_js_1 = require("./annotate/types.js");
|
|
45
|
+
Object.defineProperty(exports, "DRAWING_COLORS", { enumerable: true, get: function () { return types_js_1.DRAWING_COLORS; } });
|
|
46
|
+
Object.defineProperty(exports, "DEFAULT_COLOR", { enumerable: true, get: function () { return types_js_1.DEFAULT_COLOR; } });
|
|
47
|
+
Object.defineProperty(exports, "STROKE_WIDTHS", { enumerable: true, get: function () { return types_js_1.STROKE_WIDTHS; } });
|
|
48
|
+
Object.defineProperty(exports, "DEFAULT_STROKE_SIZE", { enumerable: true, get: function () { return types_js_1.DEFAULT_STROKE_SIZE; } });
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,wCAAwC;AACxC,yEAAyE;AACzE,iDAAiD;AACjD,8EAA8E;;;AAE9E,oBAAoB;AACpB,gDAAmD;AAA1C,wGAAA,YAAY,OAAA;AACrB,yDAA0D;AAAjD,gHAAA,eAAe,OAAA;AACxB,yDAAiE;AAAxD,uHAAA,sBAAsB,OAAA;AAE/B,4BAA4B;AAC5B,iEAAgF;AAAvE,2HAAA,kBAAkB,OAAA;AAAE,0HAAA,iBAAiB,OAAA;AAE9C,6DAAyD;AAAhD,iHAAA,aAAa,OAAA;AAGtB,wBAAwB;AACxB,oDAAgD;AAAvC,2GAAA,UAAU,OAAA;AAGnB,6CAA6C;AAC7C,8DAIiC;AAH/B,mHAAA,aAAa,OAAA;AACb,kHAAA,YAAY,OAAA;AACZ,iHAAA,WAAW,OAAA;AAIb,2CAA2C;AAC3C,0DAG+B;AAF7B,mHAAA,eAAe,OAAA;AACf,+GAAA,WAAW,OAAA;AASb,uBAAuB;AACvB,gEAA4D;AAAnD,iHAAA,aAAa,OAAA;AACtB,8EAO4C;AAN1C,+HAAA,oBAAoB,OAAA;AACpB,6HAAA,kBAAkB,OAAA;AAClB,uHAAA,YAAY,OAAA;AACZ,wHAAA,aAAa,OAAA;AACb,wHAAA,aAAa,OAAA;AACb,0HAAA,eAAe,OAAA;AAejB,gDAK6B;AAJ3B,0GAAA,cAAc,OAAA;AACd,yGAAA,aAAa,OAAA;AACb,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TriggerPlugin, Platform } from '@shakenbake/core';
|
|
2
|
+
/**
|
|
3
|
+
* TriggerPlugin that fires when the user physically shakes the device.
|
|
4
|
+
*
|
|
5
|
+
* The underlying native module (`react-native-shake`) is a **peer dependency**
|
|
6
|
+
* and is loaded at runtime via dynamic import. If the module is not installed,
|
|
7
|
+
* `activate()` will throw a descriptive error explaining how to add it.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ShakeTrigger implements TriggerPlugin {
|
|
10
|
+
readonly name = "shake";
|
|
11
|
+
readonly platform: Platform;
|
|
12
|
+
private subscription;
|
|
13
|
+
activate(onTrigger: () => void): Promise<void>;
|
|
14
|
+
deactivate(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=shake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake.d.ts","sourceRoot":"","sources":["../../src/triggers/shake.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAkBhE;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAkB;IAE7C,OAAO,CAAC,YAAY,CAAkC;IAEhD,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpD,UAAU,IAAI,IAAI;CAMnB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — ShakeTrigger plugin
|
|
4
|
+
// Listens for device shake events via react-native-shake.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ShakeTrigger = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* TriggerPlugin that fires when the user physically shakes the device.
|
|
10
|
+
*
|
|
11
|
+
* The underlying native module (`react-native-shake`) is a **peer dependency**
|
|
12
|
+
* and is loaded at runtime via dynamic import. If the module is not installed,
|
|
13
|
+
* `activate()` will throw a descriptive error explaining how to add it.
|
|
14
|
+
*/
|
|
15
|
+
class ShakeTrigger {
|
|
16
|
+
name = 'shake';
|
|
17
|
+
platform = 'react-native';
|
|
18
|
+
subscription = null;
|
|
19
|
+
async activate(onTrigger) {
|
|
20
|
+
let RNShake;
|
|
21
|
+
try {
|
|
22
|
+
// Dynamic import keeps this module from failing at compile time
|
|
23
|
+
// when react-native-shake is not installed (it is a peer dep).
|
|
24
|
+
const mod = await import('react-native-shake');
|
|
25
|
+
RNShake = (mod.default ?? mod);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error('[ShakeTrigger] react-native-shake is required but not installed. ' +
|
|
29
|
+
'Install it with: npx expo install react-native-shake');
|
|
30
|
+
}
|
|
31
|
+
this.subscription = RNShake.addListener(onTrigger);
|
|
32
|
+
}
|
|
33
|
+
deactivate() {
|
|
34
|
+
if (this.subscription) {
|
|
35
|
+
this.subscription.remove();
|
|
36
|
+
this.subscription = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.ShakeTrigger = ShakeTrigger;
|
|
41
|
+
//# sourceMappingURL=shake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake.js","sourceRoot":"","sources":["../../src/triggers/shake.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,0DAA0D;AAC1D,8EAA8E;;;AAoB9E;;;;;;GAMG;AACH,MAAa,YAAY;IACd,IAAI,GAAG,OAAO,CAAC;IACf,QAAQ,GAAa,cAAc,CAAC;IAErC,YAAY,GAA6B,IAAI,CAAC;IAEtD,KAAK,CAAC,QAAQ,CAAC,SAAqB;QAClC,IAAI,OAAsB,CAAC;QAE3B,IAAI,CAAC;YACH,gEAAgE;YAChE,+DAA+D;YAC/D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC/C,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAkB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,mEAAmE;gBACjE,sDAAsD,CACzD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AA9BD,oCA8BC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ReportInput, SubmitResult, DeviceContext } from '@shakenbake/core';
|
|
3
|
+
export interface ReportFormProps {
|
|
4
|
+
/** Base64-encoded annotated screenshot */
|
|
5
|
+
annotatedScreenshot: string;
|
|
6
|
+
/** Base64-encoded original screenshot */
|
|
7
|
+
originalScreenshot: string;
|
|
8
|
+
/** Dimensions of the screenshot */
|
|
9
|
+
dimensions: {
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
};
|
|
13
|
+
/** Collected device context (read-only display) */
|
|
14
|
+
context: Partial<DeviceContext>;
|
|
15
|
+
/** Called when the user submits the form */
|
|
16
|
+
onSubmit: (input: ReportInput) => Promise<SubmitResult>;
|
|
17
|
+
/** Called when the user cancels */
|
|
18
|
+
onCancel: () => void;
|
|
19
|
+
/** Called when the user wants to re-annotate the screenshot */
|
|
20
|
+
onReAnnotate?: () => void;
|
|
21
|
+
/** Light or dark theme */
|
|
22
|
+
theme?: 'light' | 'dark';
|
|
23
|
+
/** Accent color for primary buttons */
|
|
24
|
+
accentColor?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Report form rendered inside a Modal. Collects user input for a bug report
|
|
28
|
+
* and sends it via the provided `onSubmit` callback.
|
|
29
|
+
*
|
|
30
|
+
* Requires `react-native` to be available at runtime (peer dependency).
|
|
31
|
+
*/
|
|
32
|
+
export declare function ReportForm(props: ReportFormProps): React.ReactNode;
|
|
33
|
+
//# sourceMappingURL=ReportForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportForm.d.ts","sourceRoot":"","sources":["../../src/ui/ReportForm.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,KAAK,EAGV,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,kBAAkB,CAAC;AA+B1B,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,mCAAmC;IACnC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAsGD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAAC,SAAS,CAgsBlE"}
|