@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,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Available drawing tool types for the annotation canvas.
|
|
3
|
+
*/
|
|
4
|
+
export type DrawingTool = 'pen' | 'rectangle' | 'arrow' | 'circle' | 'eraser';
|
|
5
|
+
/**
|
|
6
|
+
* Available stroke widths.
|
|
7
|
+
*/
|
|
8
|
+
export type StrokeSize = 'thin' | 'medium' | 'thick';
|
|
9
|
+
/**
|
|
10
|
+
* Available drawing colors.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DRAWING_COLORS: readonly ["#FF0000", "#FFFF00", "#0066FF", "#00CC00", "#FFFFFF", "#000000"];
|
|
13
|
+
export type DrawingColor = (typeof DRAWING_COLORS)[number];
|
|
14
|
+
/**
|
|
15
|
+
* Default drawing color (red).
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_COLOR: DrawingColor;
|
|
18
|
+
/**
|
|
19
|
+
* Maps stroke size names to pixel values.
|
|
20
|
+
*/
|
|
21
|
+
export declare const STROKE_WIDTHS: Record<StrokeSize, number>;
|
|
22
|
+
/**
|
|
23
|
+
* Default stroke size.
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_STROKE_SIZE: StrokeSize;
|
|
26
|
+
/**
|
|
27
|
+
* A 2D point on the canvas.
|
|
28
|
+
*/
|
|
29
|
+
export interface Point {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Represents a single drawing operation on the annotation canvas.
|
|
35
|
+
*
|
|
36
|
+
* For 'pen' and 'eraser' tools, `points` contains the freehand path points.
|
|
37
|
+
* For 'rectangle', 'arrow', and 'circle' tools, `startPoint` and `endPoint`
|
|
38
|
+
* define the shape bounds.
|
|
39
|
+
*/
|
|
40
|
+
export interface DrawingOperation {
|
|
41
|
+
/** Unique id for this operation (monotonically increasing). */
|
|
42
|
+
id: number;
|
|
43
|
+
/** Which tool created this operation. */
|
|
44
|
+
tool: DrawingTool;
|
|
45
|
+
/** Freehand path points (pen, eraser). */
|
|
46
|
+
points?: Point[];
|
|
47
|
+
/** Stroke/outline color. */
|
|
48
|
+
color: string;
|
|
49
|
+
/** Stroke width in pixels. */
|
|
50
|
+
strokeWidth: number;
|
|
51
|
+
/** Start point for shape tools. */
|
|
52
|
+
startPoint?: Point;
|
|
53
|
+
/** End point for shape tools. */
|
|
54
|
+
endPoint?: Point;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Props for the DrawingCanvas component.
|
|
58
|
+
*/
|
|
59
|
+
export interface DrawingCanvasProps {
|
|
60
|
+
/** Base64-encoded screenshot to annotate. */
|
|
61
|
+
screenshot: string;
|
|
62
|
+
/** Dimensions of the canvas area. */
|
|
63
|
+
dimensions: {
|
|
64
|
+
width: number;
|
|
65
|
+
height: number;
|
|
66
|
+
};
|
|
67
|
+
/** Called when annotation is complete. Receives annotated and original base64 images. */
|
|
68
|
+
onDone: (annotatedBase64: string, originalBase64: string) => void;
|
|
69
|
+
/** Called when user cancels annotation. */
|
|
70
|
+
onCancel: () => void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/annotate/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,cAAc,6EAOjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,YAAwB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAI3C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,IAAI,EAAE,WAAW,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,yFAAyF;IACzF,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — Annotation types
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_STROKE_SIZE = exports.STROKE_WIDTHS = exports.DEFAULT_COLOR = exports.DRAWING_COLORS = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Available drawing colors.
|
|
9
|
+
*/
|
|
10
|
+
exports.DRAWING_COLORS = [
|
|
11
|
+
'#FF0000', // red (default)
|
|
12
|
+
'#FFFF00', // yellow
|
|
13
|
+
'#0066FF', // blue
|
|
14
|
+
'#00CC00', // green
|
|
15
|
+
'#FFFFFF', // white
|
|
16
|
+
'#000000', // black
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Default drawing color (red).
|
|
20
|
+
*/
|
|
21
|
+
exports.DEFAULT_COLOR = '#FF0000';
|
|
22
|
+
/**
|
|
23
|
+
* Maps stroke size names to pixel values.
|
|
24
|
+
*/
|
|
25
|
+
exports.STROKE_WIDTHS = {
|
|
26
|
+
thin: 2,
|
|
27
|
+
medium: 4,
|
|
28
|
+
thick: 8,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Default stroke size.
|
|
32
|
+
*/
|
|
33
|
+
exports.DEFAULT_STROKE_SIZE = 'medium';
|
|
34
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/annotate/types.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;;;AAY9E;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,OAAO;IAClB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,QAAQ;CACX,CAAC;AAIX;;GAEG;AACU,QAAA,aAAa,GAAiB,SAAS,CAAC;AAErD;;GAEG;AACU,QAAA,aAAa,GAA+B;IACvD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACA,CAAC;AAEX;;GAEG;AACU,QAAA,mBAAmB,GAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { DrawingOperation, DrawingTool, DrawingColor, StrokeSize, Point } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* State returned by useDrawingOperations.
|
|
4
|
+
*/
|
|
5
|
+
export interface DrawingOperationsState {
|
|
6
|
+
/** All completed drawing operations (the undo stack). */
|
|
7
|
+
operations: DrawingOperation[];
|
|
8
|
+
/** The current in-progress operation (while user is actively drawing). */
|
|
9
|
+
currentOperation: DrawingOperation | null;
|
|
10
|
+
/** The currently selected drawing tool. */
|
|
11
|
+
tool: DrawingTool;
|
|
12
|
+
/** The currently selected color. */
|
|
13
|
+
color: DrawingColor;
|
|
14
|
+
/** The currently selected stroke size name. */
|
|
15
|
+
strokeSize: StrokeSize;
|
|
16
|
+
/** The resolved stroke width in pixels. */
|
|
17
|
+
strokeWidth: number;
|
|
18
|
+
/** Whether undo is available. */
|
|
19
|
+
canUndo: boolean;
|
|
20
|
+
/** Whether redo is available. */
|
|
21
|
+
canRedo: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Actions returned by useDrawingOperations.
|
|
25
|
+
*/
|
|
26
|
+
export interface DrawingOperationsActions {
|
|
27
|
+
/** Select a drawing tool. Clears redo stack if switching tools. */
|
|
28
|
+
setTool: (tool: DrawingTool) => void;
|
|
29
|
+
/** Select a color. */
|
|
30
|
+
setColor: (color: DrawingColor) => void;
|
|
31
|
+
/** Select a stroke size. */
|
|
32
|
+
setStrokeSize: (size: StrokeSize) => void;
|
|
33
|
+
/** Begin a new drawing operation at the given point. */
|
|
34
|
+
startOperation: (point: Point) => void;
|
|
35
|
+
/** Continue the current operation to the given point. */
|
|
36
|
+
continueOperation: (point: Point) => void;
|
|
37
|
+
/** Complete the current operation. */
|
|
38
|
+
endOperation: () => void;
|
|
39
|
+
/** Undo the last operation. */
|
|
40
|
+
undo: () => void;
|
|
41
|
+
/** Redo the last undone operation. */
|
|
42
|
+
redo: () => void;
|
|
43
|
+
/** Clear all operations. */
|
|
44
|
+
clearAll: () => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* React hook that manages drawing operations with undo/redo support.
|
|
48
|
+
*
|
|
49
|
+
* This hook is pure state management and contains no Skia or platform
|
|
50
|
+
* dependencies, making it easy to test in a Node environment.
|
|
51
|
+
*/
|
|
52
|
+
export declare function useDrawingOperations(): [
|
|
53
|
+
DrawingOperationsState,
|
|
54
|
+
DrawingOperationsActions
|
|
55
|
+
];
|
|
56
|
+
/**
|
|
57
|
+
* Non-React state container for drawing operations.
|
|
58
|
+
* Useful for unit testing the undo/redo logic without needing React.
|
|
59
|
+
*/
|
|
60
|
+
export interface DrawingState {
|
|
61
|
+
operations: DrawingOperation[];
|
|
62
|
+
redoStack: DrawingOperation[];
|
|
63
|
+
currentOperation: DrawingOperation | null;
|
|
64
|
+
nextId: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates an empty drawing state.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createDrawingState(): DrawingState;
|
|
70
|
+
/**
|
|
71
|
+
* Adds a completed operation to the state and clears redo stack.
|
|
72
|
+
*/
|
|
73
|
+
export declare function addOperation(state: DrawingState, operation: Omit<DrawingOperation, 'id'>): DrawingState;
|
|
74
|
+
/**
|
|
75
|
+
* Undoes the last operation: pops from operations, pushes to redoStack.
|
|
76
|
+
* Returns unchanged state if nothing to undo.
|
|
77
|
+
*/
|
|
78
|
+
export declare function undoOperation(state: DrawingState): DrawingState;
|
|
79
|
+
/**
|
|
80
|
+
* Redoes the last undone operation: pops from redoStack, pushes to operations.
|
|
81
|
+
* Returns unchanged state if nothing to redo.
|
|
82
|
+
*/
|
|
83
|
+
export declare function redoOperation(state: DrawingState): DrawingState;
|
|
84
|
+
/**
|
|
85
|
+
* Clears all operations and redo history.
|
|
86
|
+
*/
|
|
87
|
+
export declare function clearOperations(state: DrawingState): DrawingState;
|
|
88
|
+
//# sourceMappingURL=useDrawingOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDrawingOperations.d.ts","sourceRoot":"","sources":["../../src/annotate/useDrawingOperations.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,KAAK,EACN,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,0EAA0E;IAC1E,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,2CAA2C;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,+CAA+C;IAC/C,UAAU,EAAE,UAAU,CAAC;IACvB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACrC,sBAAsB;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,4BAA4B;IAC5B,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,wDAAwD;IACxD,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,yDAAyD;IACzD,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,sCAAsC;IACtC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI;IACtC,sBAAsB;IACtB,wBAAwB;CACzB,CA2HA;AAMD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAOjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,GACtC,YAAY,CAOd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAQ/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAQ/D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAOjE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — Drawing operations state manager
|
|
4
|
+
//
|
|
5
|
+
// Pure business logic for managing the undo/redo stack and current tool state.
|
|
6
|
+
// This is extracted from the DrawingCanvas component so it can be tested
|
|
7
|
+
// independently without any Skia or React Native dependencies.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useDrawingOperations = useDrawingOperations;
|
|
11
|
+
exports.createDrawingState = createDrawingState;
|
|
12
|
+
exports.addOperation = addOperation;
|
|
13
|
+
exports.undoOperation = undoOperation;
|
|
14
|
+
exports.redoOperation = redoOperation;
|
|
15
|
+
exports.clearOperations = clearOperations;
|
|
16
|
+
const react_1 = require("react");
|
|
17
|
+
const types_js_1 = require("./types.js");
|
|
18
|
+
/**
|
|
19
|
+
* React hook that manages drawing operations with undo/redo support.
|
|
20
|
+
*
|
|
21
|
+
* This hook is pure state management and contains no Skia or platform
|
|
22
|
+
* dependencies, making it easy to test in a Node environment.
|
|
23
|
+
*/
|
|
24
|
+
function useDrawingOperations() {
|
|
25
|
+
const [operations, setOperations] = (0, react_1.useState)([]);
|
|
26
|
+
const [redoStack, setRedoStack] = (0, react_1.useState)([]);
|
|
27
|
+
const [currentOperation, setCurrentOperation] = (0, react_1.useState)(null);
|
|
28
|
+
const [tool, setToolState] = (0, react_1.useState)('pen');
|
|
29
|
+
const [color, setColorState] = (0, react_1.useState)(types_js_1.DEFAULT_COLOR);
|
|
30
|
+
const [strokeSize, setStrokeSizeState] = (0, react_1.useState)(types_js_1.DEFAULT_STROKE_SIZE);
|
|
31
|
+
const nextIdRef = (0, react_1.useRef)(1);
|
|
32
|
+
const strokeWidth = types_js_1.STROKE_WIDTHS[strokeSize];
|
|
33
|
+
// ---- Tool / Color / Size setters ----
|
|
34
|
+
const setTool = (0, react_1.useCallback)((newTool) => {
|
|
35
|
+
setToolState(newTool);
|
|
36
|
+
}, []);
|
|
37
|
+
const setColor = (0, react_1.useCallback)((newColor) => {
|
|
38
|
+
setColorState(newColor);
|
|
39
|
+
}, []);
|
|
40
|
+
const setStrokeSize = (0, react_1.useCallback)((size) => {
|
|
41
|
+
setStrokeSizeState(size);
|
|
42
|
+
}, []);
|
|
43
|
+
// ---- Operation lifecycle ----
|
|
44
|
+
const startOperation = (0, react_1.useCallback)((point) => {
|
|
45
|
+
const op = {
|
|
46
|
+
id: nextIdRef.current++,
|
|
47
|
+
tool,
|
|
48
|
+
color,
|
|
49
|
+
strokeWidth,
|
|
50
|
+
...(tool === 'pen' || tool === 'eraser'
|
|
51
|
+
? { points: [point] }
|
|
52
|
+
: { startPoint: point, endPoint: point }),
|
|
53
|
+
};
|
|
54
|
+
setCurrentOperation(op);
|
|
55
|
+
}, [tool, color, strokeWidth]);
|
|
56
|
+
const continueOperation = (0, react_1.useCallback)((point) => {
|
|
57
|
+
setCurrentOperation((prev) => {
|
|
58
|
+
if (!prev)
|
|
59
|
+
return prev;
|
|
60
|
+
if (prev.tool === 'pen' || prev.tool === 'eraser') {
|
|
61
|
+
return { ...prev, points: [...(prev.points ?? []), point] };
|
|
62
|
+
}
|
|
63
|
+
// Shape tools: update endPoint
|
|
64
|
+
return { ...prev, endPoint: point };
|
|
65
|
+
});
|
|
66
|
+
}, []);
|
|
67
|
+
const endOperation = (0, react_1.useCallback)(() => {
|
|
68
|
+
setCurrentOperation((prev) => {
|
|
69
|
+
if (prev) {
|
|
70
|
+
setOperations((ops) => [...ops, prev]);
|
|
71
|
+
// Completing a new operation clears the redo stack
|
|
72
|
+
setRedoStack([]);
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
});
|
|
76
|
+
}, []);
|
|
77
|
+
// ---- Undo / Redo ----
|
|
78
|
+
const undo = (0, react_1.useCallback)(() => {
|
|
79
|
+
setOperations((ops) => {
|
|
80
|
+
if (ops.length === 0)
|
|
81
|
+
return ops;
|
|
82
|
+
const last = ops[ops.length - 1];
|
|
83
|
+
setRedoStack((redo) => [...redo, last]);
|
|
84
|
+
return ops.slice(0, -1);
|
|
85
|
+
});
|
|
86
|
+
}, []);
|
|
87
|
+
const redo = (0, react_1.useCallback)(() => {
|
|
88
|
+
setRedoStack((redoOps) => {
|
|
89
|
+
if (redoOps.length === 0)
|
|
90
|
+
return redoOps;
|
|
91
|
+
const last = redoOps[redoOps.length - 1];
|
|
92
|
+
setOperations((ops) => [...ops, last]);
|
|
93
|
+
return redoOps.slice(0, -1);
|
|
94
|
+
});
|
|
95
|
+
}, []);
|
|
96
|
+
const clearAll = (0, react_1.useCallback)(() => {
|
|
97
|
+
setOperations([]);
|
|
98
|
+
setRedoStack([]);
|
|
99
|
+
setCurrentOperation(null);
|
|
100
|
+
}, []);
|
|
101
|
+
// ---- Return ----
|
|
102
|
+
const state = {
|
|
103
|
+
operations,
|
|
104
|
+
currentOperation,
|
|
105
|
+
tool,
|
|
106
|
+
color,
|
|
107
|
+
strokeSize,
|
|
108
|
+
strokeWidth,
|
|
109
|
+
canUndo: operations.length > 0,
|
|
110
|
+
canRedo: redoStack.length > 0,
|
|
111
|
+
};
|
|
112
|
+
const actions = {
|
|
113
|
+
setTool,
|
|
114
|
+
setColor,
|
|
115
|
+
setStrokeSize,
|
|
116
|
+
startOperation,
|
|
117
|
+
continueOperation,
|
|
118
|
+
endOperation,
|
|
119
|
+
undo,
|
|
120
|
+
redo,
|
|
121
|
+
clearAll,
|
|
122
|
+
};
|
|
123
|
+
return [state, actions];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Creates an empty drawing state.
|
|
127
|
+
*/
|
|
128
|
+
function createDrawingState() {
|
|
129
|
+
return {
|
|
130
|
+
operations: [],
|
|
131
|
+
redoStack: [],
|
|
132
|
+
currentOperation: null,
|
|
133
|
+
nextId: 1,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Adds a completed operation to the state and clears redo stack.
|
|
138
|
+
*/
|
|
139
|
+
function addOperation(state, operation) {
|
|
140
|
+
return {
|
|
141
|
+
...state,
|
|
142
|
+
operations: [...state.operations, { ...operation, id: state.nextId }],
|
|
143
|
+
redoStack: [],
|
|
144
|
+
nextId: state.nextId + 1,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Undoes the last operation: pops from operations, pushes to redoStack.
|
|
149
|
+
* Returns unchanged state if nothing to undo.
|
|
150
|
+
*/
|
|
151
|
+
function undoOperation(state) {
|
|
152
|
+
if (state.operations.length === 0)
|
|
153
|
+
return state;
|
|
154
|
+
const last = state.operations[state.operations.length - 1];
|
|
155
|
+
return {
|
|
156
|
+
...state,
|
|
157
|
+
operations: state.operations.slice(0, -1),
|
|
158
|
+
redoStack: [...state.redoStack, last],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Redoes the last undone operation: pops from redoStack, pushes to operations.
|
|
163
|
+
* Returns unchanged state if nothing to redo.
|
|
164
|
+
*/
|
|
165
|
+
function redoOperation(state) {
|
|
166
|
+
if (state.redoStack.length === 0)
|
|
167
|
+
return state;
|
|
168
|
+
const last = state.redoStack[state.redoStack.length - 1];
|
|
169
|
+
return {
|
|
170
|
+
...state,
|
|
171
|
+
operations: [...state.operations, last],
|
|
172
|
+
redoStack: state.redoStack.slice(0, -1),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Clears all operations and redo history.
|
|
177
|
+
*/
|
|
178
|
+
function clearOperations(state) {
|
|
179
|
+
return {
|
|
180
|
+
...state,
|
|
181
|
+
operations: [],
|
|
182
|
+
redoStack: [],
|
|
183
|
+
currentOperation: null,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=useDrawingOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDrawingOperations.js","sourceRoot":"","sources":["../../src/annotate/useDrawingOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CapturePlugin, CaptureResult, Platform } from '@shakenbake/core';
|
|
2
|
+
import type { RefObject } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* CapturePlugin that takes a screenshot using react-native-view-shot.
|
|
5
|
+
*
|
|
6
|
+
* The `react-native-view-shot` module is a **peer dependency** and is loaded
|
|
7
|
+
* at runtime via dynamic import. If it is not installed, `capture()` will
|
|
8
|
+
* throw a `ShakeNbakeError` with code `UPLOAD_FAILED`.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```ts
|
|
12
|
+
* const capture = new ViewShotCapture();
|
|
13
|
+
* // Later, from your React component:
|
|
14
|
+
* capture.setRef(myViewRef);
|
|
15
|
+
* const result = await capture.capture();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare class ViewShotCapture implements CapturePlugin {
|
|
19
|
+
readonly name = "viewshot";
|
|
20
|
+
readonly platform: Platform;
|
|
21
|
+
private viewRef;
|
|
22
|
+
constructor(viewRef?: RefObject<unknown>);
|
|
23
|
+
/**
|
|
24
|
+
* Set or update the React ref pointing to the capturable view.
|
|
25
|
+
* This is typically called by a provider component once the root
|
|
26
|
+
* view has mounted.
|
|
27
|
+
*/
|
|
28
|
+
setRef(ref: RefObject<unknown>): void;
|
|
29
|
+
capture(): Promise<CaptureResult>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/capture/screenshot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA2BvC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAkB;IAE7C,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC;IAIxC;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI;IAI/B,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;CAiExC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// @shakenbake/react-native — ViewShotCapture plugin
|
|
4
|
+
// Captures a screenshot of the app using react-native-view-shot.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ViewShotCapture = void 0;
|
|
8
|
+
const core_1 = require("@shakenbake/core");
|
|
9
|
+
/**
|
|
10
|
+
* CapturePlugin that takes a screenshot using react-native-view-shot.
|
|
11
|
+
*
|
|
12
|
+
* The `react-native-view-shot` module is a **peer dependency** and is loaded
|
|
13
|
+
* at runtime via dynamic import. If it is not installed, `capture()` will
|
|
14
|
+
* throw a `ShakeNbakeError` with code `UPLOAD_FAILED`.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```ts
|
|
18
|
+
* const capture = new ViewShotCapture();
|
|
19
|
+
* // Later, from your React component:
|
|
20
|
+
* capture.setRef(myViewRef);
|
|
21
|
+
* const result = await capture.capture();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class ViewShotCapture {
|
|
25
|
+
name = 'viewshot';
|
|
26
|
+
platform = 'react-native';
|
|
27
|
+
viewRef;
|
|
28
|
+
constructor(viewRef) {
|
|
29
|
+
this.viewRef = viewRef ?? null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set or update the React ref pointing to the capturable view.
|
|
33
|
+
* This is typically called by a provider component once the root
|
|
34
|
+
* view has mounted.
|
|
35
|
+
*/
|
|
36
|
+
setRef(ref) {
|
|
37
|
+
this.viewRef = ref;
|
|
38
|
+
}
|
|
39
|
+
async capture() {
|
|
40
|
+
// --- resolve captureRef function ---
|
|
41
|
+
let captureRef;
|
|
42
|
+
try {
|
|
43
|
+
const mod = await import('react-native-view-shot');
|
|
44
|
+
captureRef = (mod['captureRef'] ?? mod['default']);
|
|
45
|
+
if (typeof captureRef !== 'function') {
|
|
46
|
+
throw new Error('captureRef is not a function');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new core_1.ShakeNbakeError('[ViewShotCapture] react-native-view-shot is required but not installed. ' +
|
|
51
|
+
'Install it with: npx expo install react-native-view-shot', 'UPLOAD_FAILED', { originalError: err });
|
|
52
|
+
}
|
|
53
|
+
// --- resolve dimensions ---
|
|
54
|
+
let dimensions = { width: 0, height: 0 };
|
|
55
|
+
try {
|
|
56
|
+
const rn = await import('react-native');
|
|
57
|
+
const Dimensions = rn['Dimensions'];
|
|
58
|
+
if (Dimensions) {
|
|
59
|
+
dimensions = Dimensions.get('window');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// react-native not available in test; dimensions stay at 0x0
|
|
64
|
+
}
|
|
65
|
+
// --- capture ---
|
|
66
|
+
if (!this.viewRef) {
|
|
67
|
+
throw new core_1.ShakeNbakeError('[ViewShotCapture] No view ref set. Call setRef() with a ref to the root view before capturing.', 'UPLOAD_FAILED');
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const base64 = await captureRef(this.viewRef, {
|
|
71
|
+
format: 'png',
|
|
72
|
+
quality: 1,
|
|
73
|
+
result: 'base64',
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
imageData: base64,
|
|
77
|
+
dimensions: {
|
|
78
|
+
width: dimensions.width,
|
|
79
|
+
height: dimensions.height,
|
|
80
|
+
},
|
|
81
|
+
mimeType: 'image/png',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
throw new core_1.ShakeNbakeError('[ViewShotCapture] Screenshot capture failed.', 'UPLOAD_FAILED', { originalError: err });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.ViewShotCapture = ViewShotCapture;
|
|
90
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/capture/screenshot.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,oDAAoD;AACpD,iEAAiE;AACjE,8EAA8E;;;AAG9E,2CAAmD;AA4BnD;;;;;;;;;;;;;;GAcG;AACH,MAAa,eAAe;IACjB,IAAI,GAAG,UAAU,CAAC;IAClB,QAAQ,GAAa,cAAc,CAAC;IAErC,OAAO,CAA4B;IAE3C,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAuB;QAC5B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,sCAAsC;QACtC,IAAI,UAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAA4B,MAAM,MAAM,CAC/C,wBAAwB,CACzB,CAAC;YACF,UAAU,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAiB,CAAC;YACnE,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,sBAAe,CACvB,0EAA0E;gBACxE,0DAA0D,EAC5D,eAAe,EACf,EAAE,aAAa,EAAE,GAAG,EAAE,CACvB,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,IAAI,UAAU,GAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,UAAU,GAAI,EAA8B,CAAC,YAAY,CAElD,CAAC;YACd,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,sBAAe,CACvB,gGAAgG,EAChG,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC5C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,OAAO;gBACL,SAAS,EAAE,MAAM;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B;gBACD,QAAQ,EAAE,WAAW;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,sBAAe,CACvB,8CAA8C,EAC9C,eAAe,EACf,EAAE,aAAa,EAAE,GAAG,EAAE,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AApFD,0CAoFC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ContextCollector, DeviceContext, Platform } from '@shakenbake/core';
|
|
2
|
+
/**
|
|
3
|
+
* ContextCollector that gathers rich device and environment information
|
|
4
|
+
* from React Native and Expo APIs.
|
|
5
|
+
*
|
|
6
|
+
* All native modules are **peer dependencies**. Each sub-collector is
|
|
7
|
+
* independently guarded so a missing module produces a partial result
|
|
8
|
+
* rather than an error.
|
|
9
|
+
*/
|
|
10
|
+
/** Options for configuring the device context collector. */
|
|
11
|
+
export interface DeviceContextCollectorOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Dot-path patterns of fields to redact from collected context.
|
|
14
|
+
* E.g. `["device.deviceName", "locale"]` removes the device name and entire locale section.
|
|
15
|
+
*/
|
|
16
|
+
redactFields?: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare class DeviceContextCollector implements ContextCollector {
|
|
19
|
+
readonly name = "device";
|
|
20
|
+
readonly platform: Platform;
|
|
21
|
+
private readonly redactFields;
|
|
22
|
+
constructor(options?: DeviceContextCollectorOptions);
|
|
23
|
+
collect(): Promise<Partial<DeviceContext>>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=collectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../src/context/collectors.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EASb,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAqQ1B;;;;;;;GAOG;AACH,4DAA4D;AAC5D,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAkB;IAE7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;gBAE5B,OAAO,CAAC,EAAE,6BAA6B;IAI7C,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;CA2DjD"}
|