@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.
- package/README.md +89 -3
- package/package.json +35 -11
- package/platforms/android/AndroidManifest.xml +2 -0
- package/platforms/android/include.gradle +1 -0
- package/platforms/android/java/com/octanexplat/camera/CameraPreviewView.java +13 -0
- package/platforms/android/java/com/octanexplat/camera/CameraSessionBridge.java +394 -0
- package/platforms/ios/Info.plist +2 -0
- package/platforms/macos/src/CameraOwnership.swift +22 -0
- package/platforms/macos/src/PhotoCaptureLifecycle.swift +34 -0
- package/platforms/macos/src/XplatCameraHost.swift +639 -0
- package/platforms/macos/src/XplatPhotoCaptureSheet.swift +192 -0
- package/src/CameraView.android.tsrx +27 -3
- package/src/CameraView.ios.tsrx +32 -4
- package/src/CameraView.macos.tsrx +95 -0
- package/src/CameraView.web.tsrx +31 -2
- package/src/CameraView.windows.tsrx +126 -0
- package/src/camera-permission.mobile.ts +18 -4
- package/src/camera-permission.windows.ts +76 -0
- package/src/camera-session.macos.ts +75 -0
- package/src/camera-session.windows.ts +126 -0
- package/src/host-movie.web.ts +295 -0
- package/src/index.ts +32 -0
- package/src/index.web.ts +32 -0
- package/src/layout-child.windows.ts +79 -0
- package/src/movie-metadata.web.ts +84 -0
- package/src/movie-storage.web.ts +164 -0
- package/src/preview-tap.ts +34 -0
- package/src/props.ts +14 -1
- package/src/session-backend.android.ts +439 -0
- package/src/session-backend.ios.ts +1258 -0
- package/src/session-backend.linux.ts +887 -0
- package/src/session-backend.macos.ts +707 -0
- package/src/session-backend.ts +59 -0
- package/src/session-backend.web.ts +891 -0
- package/src/session-backend.windows.ts +1599 -0
- package/src/session-core.ts +723 -0
- package/src/session.ts +37 -0
- package/src/synthetic-session.ts +377 -0
- package/src/types.ts +357 -0
- package/types/index.d.ts +43 -0
- package/types/props.d.ts +14 -1
- package/types/session-core.d.ts +139 -0
- package/types/synthetic-session.d.ts +51 -0
- package/types/types.d.ts +290 -0
- package/dist/native/CameraView.android.js +0 -166
- package/dist/native/CameraView.ios.js +0 -131
- package/dist/native/camera-permission.mobile.js +0 -45
- package/dist/native/camera-session.ios.js +0 -45
- package/dist/native/cx.mobile.js +0 -9
- package/dist/native/index.js +0 -2
- package/dist/native/layout-child.js +0 -53
- package/dist/native/octane-client-build.json +0 -8
- package/dist/web/CameraView.web.tsrx.js +0 -317
- package/dist/web/index.js +0 -2
- package/dist/web/layout-child.web.js +0 -29
- package/dist/web/octane-client-build.json +0 -8
- package/src/CameraView.windows.ts +0 -5
- 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,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,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 };
|
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
|
-
}
|