@octane-xplat/camera 0.13.0 → 0.15.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 (58) hide show
  1. package/README.md +89 -3
  2. package/package.json +35 -11
  3. package/platforms/android/AndroidManifest.xml +2 -0
  4. package/platforms/android/include.gradle +1 -0
  5. package/platforms/android/java/com/octanexplat/camera/CameraPreviewView.java +13 -0
  6. package/platforms/android/java/com/octanexplat/camera/CameraSessionBridge.java +394 -0
  7. package/platforms/ios/Info.plist +2 -0
  8. package/platforms/macos/src/CameraOwnership.swift +22 -0
  9. package/platforms/macos/src/PhotoCaptureLifecycle.swift +34 -0
  10. package/platforms/macos/src/XplatCameraHost.swift +639 -0
  11. package/platforms/macos/src/XplatPhotoCaptureSheet.swift +192 -0
  12. package/src/CameraView.android.tsrx +27 -3
  13. package/src/CameraView.ios.tsrx +32 -4
  14. package/src/CameraView.macos.tsrx +95 -0
  15. package/src/CameraView.web.tsrx +31 -2
  16. package/src/CameraView.windows.tsrx +126 -0
  17. package/src/camera-permission.mobile.ts +18 -4
  18. package/src/camera-permission.windows.ts +76 -0
  19. package/src/camera-session.macos.ts +75 -0
  20. package/src/camera-session.windows.ts +126 -0
  21. package/src/host-movie.web.ts +295 -0
  22. package/src/index.ts +32 -0
  23. package/src/index.web.ts +32 -0
  24. package/src/layout-child.windows.ts +79 -0
  25. package/src/movie-metadata.web.ts +84 -0
  26. package/src/movie-storage.web.ts +164 -0
  27. package/src/preview-tap.ts +34 -0
  28. package/src/props.ts +14 -1
  29. package/src/session-backend.android.ts +439 -0
  30. package/src/session-backend.ios.ts +1258 -0
  31. package/src/session-backend.linux.ts +887 -0
  32. package/src/session-backend.macos.ts +707 -0
  33. package/src/session-backend.ts +59 -0
  34. package/src/session-backend.web.ts +891 -0
  35. package/src/session-backend.windows.ts +1599 -0
  36. package/src/session-core.ts +723 -0
  37. package/src/session.ts +37 -0
  38. package/src/synthetic-session.ts +377 -0
  39. package/src/types.ts +357 -0
  40. package/types/index.d.ts +43 -0
  41. package/types/props.d.ts +14 -1
  42. package/types/session-core.d.ts +139 -0
  43. package/types/synthetic-session.d.ts +51 -0
  44. package/types/types.d.ts +290 -0
  45. package/dist/native/CameraView.android.js +0 -166
  46. package/dist/native/CameraView.ios.js +0 -131
  47. package/dist/native/camera-permission.mobile.js +0 -45
  48. package/dist/native/camera-session.ios.js +0 -45
  49. package/dist/native/cx.mobile.js +0 -9
  50. package/dist/native/index.js +0 -2
  51. package/dist/native/layout-child.js +0 -53
  52. package/dist/native/octane-client-build.json +0 -8
  53. package/dist/web/CameraView.web.tsrx.js +0 -317
  54. package/dist/web/index.js +0 -2
  55. package/dist/web/layout-child.web.js +0 -29
  56. package/dist/web/octane-client-build.json +0 -8
  57. package/src/CameraView.windows.ts +0 -5
  58. package/src/cx.mobile.ts +0 -6
@@ -1,53 +0,0 @@
1
- import { isIOS } from "@nativescript/core";
2
- //#region src/layout-child.ts
3
- /** NativeScript reads layout fields from a child view during parent layout. */
4
- function layoutChildProps(props) {
5
- const result = {};
6
- for (const key of [
7
- "row",
8
- "col",
9
- "rowSpan",
10
- "colSpan",
11
- "dock",
12
- "left",
13
- "top",
14
- "flexGrow",
15
- "flexShrink",
16
- "alignSelf",
17
- "order"
18
- ]) if (props[key] !== void 0) result[key] = props[key];
19
- return result;
20
- }
21
- function applyEscapeProps(view, props) {
22
- if (!view) return;
23
- const bag = isIOS ? props.ios : props.android;
24
- if (bag) Object.assign(view, bag);
25
- }
26
- var nativeRoles = {
27
- button: "button",
28
- link: "link",
29
- search: "search",
30
- image: "image",
31
- heading: "header",
32
- adjustable: "adjustable",
33
- summary: "summary",
34
- text: "text",
35
- none: "none",
36
- progressbar: "progressBar",
37
- checkbox: "checkbox",
38
- switch: "switch",
39
- radio: "radioButton",
40
- spinbutton: "spinButton",
41
- tab: "button"
42
- };
43
- function nativeAccessibilityRole(role) {
44
- return role ? nativeRoles[role] : void 0;
45
- }
46
- function nativeAccessibilityState(state) {
47
- if (state?.disabled) return "disabled";
48
- if (state?.selected) return "selected";
49
- if (state?.checked === true) return "checked";
50
- if (state?.checked === false) return "unchecked";
51
- }
52
- //#endregion
53
- export { applyEscapeProps, layoutChildProps, nativeAccessibilityRole, nativeAccessibilityState };
@@ -1,8 +0,0 @@
1
- {
2
- "version": 1,
3
- "buildId": "97c54242-b0e6-41e8-b10c-ee0ed976b44b",
4
- "mode": "production",
5
- "capabilities": {
6
- "independentHydration": false
7
- }
8
- }
@@ -1,317 +0,0 @@
1
- import { applyEscapeProps, layoutChildProps } from "./layout-child.web.js";
2
- import { __s, bag15, bag5, child, clone, delegateEvents, evt2e, evt2u, hookSlots, ifBlock, markDangerouslySetInnerHTMLChildren, queueRefAttach, queueRefDetach, setStyleProperty, snapshotSpread, template, useEffect, useImperativeHandle, useRef } from "octane";
3
- import { bindSignalHostPropSources, enableSignalBindings, replaceRef, setAttributeIfChanged } from "octane/internal/client";
4
- //#region src/CameraView.web.tsrx
5
- enableSignalBindings(1, true);
6
- delegateEvents(["playing"]);
7
- var _t$0 = /* @__PURE__ */ template("<video autoplay=\"\" playsinline=\"\" style=\"display: block; width: 100%; height: 100%; object-fit: cover;\"></video>");
8
- var _t$1 = /* @__PURE__ */ template("<div><!></div>");
9
- var _hs$ = /* @__PURE__ */ hookSlots(5);
10
- var __event = (__eventArg, readyFired, props) => {
11
- if (readyFired.current) return;
12
- readyFired.current = true;
13
- props.onReady?.();
14
- };
15
- var _rm$1 = [
16
- "r",
17
- "b",
18
- "a"
19
- ];
20
- function __then$0(__props, __s, __extra) {
21
- const facing = __extra[0];
22
- const hostRef = __extra[1];
23
- const props = __extra[2];
24
- const readyFired = __extra[3];
25
- const video = __extra[4];
26
- let _b = __s.slots[0];
27
- if (_b === void 0) {
28
- let _m1, _m4;
29
- const _root = clone(_t$0, void 0, "||");
30
- queueRefAttach(__s, _m1 = (element) => {
31
- hostRef.current = element;
32
- video.current = element;
33
- if (!element) return;
34
- applyEscapeProps(element, props);
35
- }, _root);
36
- (__s.cleanups ??= []).push(() => _b && queueRefDetach(_b.b, _b.a));
37
- _m4 = evt2e(_root, "$oplaying", __event, readyFired, props);
38
- _b = bag5(__s, _root, _root, _m1, void 0, __s, _m4);
39
- __s.refFields = _rm$1;
40
- } else {
41
- {
42
- const _r = (element) => {
43
- hostRef.current = element;
44
- video.current = element;
45
- if (!element) return;
46
- applyEscapeProps(element, props);
47
- };
48
- if (_r !== _b.b) _b.b = replaceRef(__s, _b.b, _r, _b.a);
49
- }
50
- evt2u(_b.e, __event, readyFired, props);
51
- }
52
- _b.c = setAttributeIfChanged(true, _b.c, _b.a, "muted");
53
- {
54
- const _v = facing === "front" ? "scaleX(-1)" : void 0;
55
- if (_b.d !== _v) {
56
- setStyleProperty(_b.a, "transform", _v, "display: block; width: 100%; height: 100%; object-fit: cover;", _b.d);
57
- _b.d = _v;
58
- }
59
- }
60
- }
61
- var _rm$3 = [
62
- "s",
63
- "n",
64
- "m"
65
- ];
66
- var CameraView = /* @__PURE__ */ __s(function CameraView(props, __s, __extra) {
67
- const hostRef = useRef(null, _hs$ + 0);
68
- const video = useRef(null, _hs$ + 1);
69
- const facing = props.facing ?? "back";
70
- const active = props.active !== false;
71
- const readyFired = useRef(false, _hs$ + 2);
72
- useEffect(() => {
73
- const element = video.current;
74
- if (!element || !active) return;
75
- const mediaDevices = navigator.mediaDevices;
76
- if (!mediaDevices?.getUserMedia) {
77
- props.onError?.({ message: "camera unsupported" });
78
- return;
79
- }
80
- let stream = null;
81
- let disposed = false;
82
- readyFired.current = false;
83
- mediaDevices.getUserMedia({
84
- video: { facingMode: facing === "front" ? "user" : "environment" },
85
- audio: false
86
- }).then((nextStream) => {
87
- if (disposed) {
88
- for (const track of nextStream.getTracks()) track.stop();
89
- return;
90
- }
91
- stream = nextStream;
92
- element.srcObject = nextStream;
93
- element.play()?.catch(() => {});
94
- }).catch((error) => {
95
- props.onError?.({ message: error?.name === "NotAllowedError" ? "camera permission denied" : String(error?.name ?? error ?? "camera error") });
96
- });
97
- return () => {
98
- disposed = true;
99
- element.srcObject = null;
100
- if (stream) for (const track of stream.getTracks()) track.stop();
101
- };
102
- }, [active, facing], _hs$ + 3);
103
- useImperativeHandle(props.ref, () => ({ native: hostRef.current }), void 0, _hs$ + 4);
104
- let _b = __s.slots[0];
105
- if (_b === void 0) {
106
- let _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m13, _m14;
107
- const _root = clone(_t$1);
108
- _m0 = props.id;
109
- _m1 = [
110
- "vx-layers",
111
- "vx-cameraview",
112
- props.className
113
- ];
114
- _m2 = snapshotSpread(layoutChildProps(props, {
115
- position: "relative",
116
- overflow: "hidden",
117
- backgroundColor: "#000",
118
- ...props.style
119
- }));
120
- _m3 = props.accessibilityRole;
121
- _m4 = props.accessibilityLabel;
122
- _m5 = props.accessible === false ? true : void 0;
123
- _m6 = props.accessibilityHint;
124
- _m7 = props.accessibilityValue;
125
- _m8 = props.accessibilityState?.disabled;
126
- _m9 = props.accessibilityState?.selected;
127
- _m10 = props.accessibilityState?.checked;
128
- _m11 = props.accessibilityLiveRegion === "none" ? "off" : props.accessibilityLiveRegion;
129
- _m13 = bindSignalHostPropSources(__s, void 0, _root, [
130
- [
131
- false,
132
- "id",
133
- _m0
134
- ],
135
- [
136
- false,
137
- "className",
138
- _m1
139
- ],
140
- [true, _m2],
141
- [
142
- false,
143
- "role",
144
- _m3
145
- ],
146
- [
147
- false,
148
- "aria-label",
149
- _m4
150
- ],
151
- [
152
- false,
153
- "aria-hidden",
154
- _m5
155
- ],
156
- [
157
- false,
158
- "aria-description",
159
- _m6
160
- ],
161
- [
162
- false,
163
- "aria-valuetext",
164
- _m7
165
- ],
166
- [
167
- false,
168
- "aria-disabled",
169
- _m8
170
- ],
171
- [
172
- false,
173
- "aria-selected",
174
- _m9
175
- ],
176
- [
177
- false,
178
- "aria-checked",
179
- _m10
180
- ],
181
- [
182
- false,
183
- "aria-live",
184
- _m11
185
- ]
186
- ], "b:25f1aaa9", true);
187
- markDangerouslySetInnerHTMLChildren(_root);
188
- _m14 = child(_root);
189
- _b = bag15(__s, _root, _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _root, _m13, _m14);
190
- __s.refFields = _rm$3;
191
- } else {
192
- {
193
- const _v = props.id;
194
- if (_b.a !== _v) _b.a = _v;
195
- }
196
- {
197
- const _v = [
198
- "vx-layers",
199
- "vx-cameraview",
200
- props.className
201
- ];
202
- if (_b.b !== _v) _b.b = _v;
203
- }
204
- _b.c = snapshotSpread(layoutChildProps(props, {
205
- position: "relative",
206
- overflow: "hidden",
207
- backgroundColor: "#000",
208
- ...props.style
209
- }));
210
- {
211
- const _v = props.accessibilityRole;
212
- if (_b.d !== _v) _b.d = _v;
213
- }
214
- {
215
- const _v = props.accessibilityLabel;
216
- if (_b.e !== _v) _b.e = _v;
217
- }
218
- {
219
- const _v = props.accessible === false ? true : void 0;
220
- if (_b.f !== _v) _b.f = _v;
221
- }
222
- {
223
- const _v = props.accessibilityHint;
224
- if (_b.g !== _v) _b.g = _v;
225
- }
226
- {
227
- const _v = props.accessibilityValue;
228
- if (_b.h !== _v) _b.h = _v;
229
- }
230
- {
231
- const _v = props.accessibilityState?.disabled;
232
- if (_b.i !== _v) _b.i = _v;
233
- }
234
- {
235
- const _v = props.accessibilityState?.selected;
236
- if (_b.j !== _v) _b.j = _v;
237
- }
238
- {
239
- const _v = props.accessibilityState?.checked;
240
- if (_b.k !== _v) _b.k = _v;
241
- }
242
- {
243
- const _v = props.accessibilityLiveRegion === "none" ? "off" : props.accessibilityLiveRegion;
244
- if (_b.l !== _v) _b.l = _v;
245
- }
246
- _b.n = bindSignalHostPropSources(__s, _b.n, _b.m, [
247
- [
248
- false,
249
- "id",
250
- _b.a
251
- ],
252
- [
253
- false,
254
- "className",
255
- _b.b
256
- ],
257
- [true, _b.c],
258
- [
259
- false,
260
- "role",
261
- _b.d
262
- ],
263
- [
264
- false,
265
- "aria-label",
266
- _b.e
267
- ],
268
- [
269
- false,
270
- "aria-hidden",
271
- _b.f
272
- ],
273
- [
274
- false,
275
- "aria-description",
276
- _b.g
277
- ],
278
- [
279
- false,
280
- "aria-valuetext",
281
- _b.h
282
- ],
283
- [
284
- false,
285
- "aria-disabled",
286
- _b.i
287
- ],
288
- [
289
- false,
290
- "aria-selected",
291
- _b.j
292
- ],
293
- [
294
- false,
295
- "aria-checked",
296
- _b.k
297
- ],
298
- [
299
- false,
300
- "aria-live",
301
- _b.l
302
- ]
303
- ], "b:25f1aaa9", true);
304
- }
305
- {
306
- const __ifCondition = active;
307
- ifBlock(__s, 1, _b.m, __ifCondition, __then$0, null, _b.o, __ifCondition ? [
308
- facing,
309
- hostRef,
310
- props,
311
- readyFired,
312
- video
313
- ] : void 0, 1);
314
- }
315
- });
316
- //#endregion
317
- export { CameraView };
package/dist/web/index.js DELETED
@@ -1,2 +0,0 @@
1
- import { CameraView } from "./CameraView.web.tsrx.js";
2
- export { CameraView };
@@ -1,29 +0,0 @@
1
- //#region src/layout-child.web.ts
2
- function layoutChildProps(props, baseStyle = props.style) {
3
- const style = { ...baseStyle };
4
- if (props.row !== void 0) style.gridRow = `${props.row + 1} / span ${props.rowSpan ?? 1}`;
5
- else if (props.rowSpan !== void 0) style.gridRow = `span ${props.rowSpan}`;
6
- if (props.col !== void 0) style.gridColumn = `${props.col + 1} / span ${props.colSpan ?? 1}`;
7
- else if (props.colSpan !== void 0) style.gridColumn = `span ${props.colSpan}`;
8
- if (props.left !== void 0) style.left = props.left;
9
- if (props.top !== void 0) style.top = props.top;
10
- if (props.flexGrow !== void 0) style.flexGrow = props.flexGrow;
11
- if (props.flexShrink !== void 0) style.flexShrink = props.flexShrink;
12
- if (props.alignSelf !== void 0) style.alignSelf = props.alignSelf;
13
- if (props.order !== void 0) style.order = props.order;
14
- return { style };
15
- }
16
- function applyEscapeProps(element, props) {
17
- if (!element || !props.web) return;
18
- for (const [key, value] of Object.entries(props.web)) if (key.includes("-")) {
19
- if (value == null || value === false) element.removeAttribute(key);
20
- else element.setAttribute(key, value === true ? "" : String(value));
21
- } else if (key in element) try {
22
- element[key] = value;
23
- } catch {
24
- element.setAttribute(key, String(value));
25
- }
26
- else if (value != null) element.setAttribute(key, String(value));
27
- }
28
- //#endregion
29
- export { applyEscapeProps, layoutChildProps };
@@ -1,8 +0,0 @@
1
- {
2
- "version": 1,
3
- "buildId": "96cb43a6-c424-49f9-aceb-4c944dfc819a",
4
- "mode": "production",
5
- "capabilities": {
6
- "independentHydration": false
7
- }
8
- }
@@ -1,5 +0,0 @@
1
- import type { UniversalComponent } from 'octane/universal'
2
- import type { CameraViewProps } from './props'
3
-
4
- /** TypeScript fallback — no Windows CameraView implementation exists yet. */
5
- export declare const CameraView: UniversalComponent<CameraViewProps>
package/src/cx.mobile.ts DELETED
@@ -1,6 +0,0 @@
1
- /** Imperative `view.className` writes still need a pre-joined string —
2
- * NativeScript's className setter splits on ' ' only. Normalize arrays here
3
- * so they stay space separated. */
4
- export function cx(...parts: any[]): string {
5
- return parts.flat(Infinity).filter(Boolean).join(' ')
6
- }