@unif/react-native-camera 2.6.1 → 2.7.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 +7 -0
- package/lib/module/camera/Camera.js +96 -27
- package/lib/module/camera/Camera.js.map +1 -1
- package/lib/module/camera/CaptureFlash.js +38 -0
- package/lib/module/camera/CaptureFlash.js.map +1 -0
- package/lib/module/camera/CaptureFlash.test.js +19 -0
- package/lib/module/camera/CaptureFlash.test.js.map +1 -0
- package/lib/module/camera/Container.js +166 -64
- package/lib/module/camera/Container.js.map +1 -1
- package/lib/module/camera/FocusIndicator.js +99 -23
- package/lib/module/camera/FocusIndicator.js.map +1 -1
- package/lib/module/camera/FocusIndicator.test.js +27 -0
- package/lib/module/camera/FocusIndicator.test.js.map +1 -0
- package/lib/module/camera/colors/dark.js +22 -0
- package/lib/module/camera/colors/dark.js.map +1 -0
- package/lib/module/camera/colors/dark.test.js +10 -0
- package/lib/module/camera/colors/dark.test.js.map +1 -0
- package/lib/module/camera/footer/ActionRow.js +65 -0
- package/lib/module/camera/footer/ActionRow.js.map +1 -0
- package/lib/module/camera/footer/ActionRow.test.js +53 -0
- package/lib/module/camera/footer/ActionRow.test.js.map +1 -0
- package/lib/module/camera/footer/FlipButton.js +31 -0
- package/lib/module/camera/footer/FlipButton.js.map +1 -0
- package/lib/module/camera/footer/FlipButton.test.js +16 -0
- package/lib/module/camera/footer/FlipButton.test.js.map +1 -0
- package/lib/module/camera/footer/ModeSwitcherPill.js +89 -0
- package/lib/module/camera/footer/ModeSwitcherPill.js.map +1 -0
- package/lib/module/camera/footer/ModeSwitcherPill.test.js +43 -0
- package/lib/module/camera/footer/ModeSwitcherPill.test.js.map +1 -0
- package/lib/module/camera/footer/RecordingTimer.js +66 -0
- package/lib/module/camera/footer/RecordingTimer.js.map +1 -0
- package/lib/module/camera/footer/RecordingTimer.test.js +20 -0
- package/lib/module/camera/footer/RecordingTimer.test.js.map +1 -0
- package/lib/module/camera/footer/Shutter.js +70 -0
- package/lib/module/camera/footer/Shutter.js.map +1 -0
- package/lib/module/camera/footer/Shutter.test.js +42 -0
- package/lib/module/camera/footer/Shutter.test.js.map +1 -0
- package/lib/module/camera/footer/ThumbnailStack.js +71 -0
- package/lib/module/camera/footer/ThumbnailStack.js.map +1 -0
- package/lib/module/camera/footer/ThumbnailStack.test.js +30 -0
- package/lib/module/camera/footer/ThumbnailStack.test.js.map +1 -0
- package/lib/module/camera/footer/ZoomChips.js +57 -0
- package/lib/module/camera/footer/ZoomChips.js.map +1 -0
- package/lib/module/camera/footer/ZoomChips.test.js +17 -0
- package/lib/module/camera/footer/ZoomChips.test.js.map +1 -0
- package/lib/module/camera/footer/index.js +7 -1
- package/lib/module/camera/footer/index.js.map +1 -1
- package/lib/module/camera/icons/VolumeIcon.js +44 -0
- package/lib/module/camera/icons/VolumeIcon.js.map +1 -0
- package/lib/module/camera/icons/VolumeIcon.test.js +18 -0
- package/lib/module/camera/icons/VolumeIcon.test.js.map +1 -0
- package/lib/module/camera/index.js +3 -1
- package/lib/module/camera/index.js.map +1 -1
- package/lib/module/camera/preview/PreviewBottomBar.js +69 -0
- package/lib/module/camera/preview/PreviewBottomBar.js.map +1 -0
- package/lib/module/camera/preview/PreviewBottomBar.test.js +46 -0
- package/lib/module/camera/preview/PreviewBottomBar.test.js.map +1 -0
- package/lib/module/camera/preview/PreviewOverlay.js +89 -0
- package/lib/module/camera/preview/PreviewOverlay.js.map +1 -0
- package/lib/module/camera/preview/PreviewOverlay.test.js +45 -0
- package/lib/module/camera/preview/PreviewOverlay.test.js.map +1 -0
- package/lib/module/camera/preview/PreviewTopBar.js +96 -0
- package/lib/module/camera/preview/PreviewTopBar.js.map +1 -0
- package/lib/module/camera/preview/PreviewTopBar.test.js +44 -0
- package/lib/module/camera/preview/PreviewTopBar.test.js.map +1 -0
- package/lib/module/camera/preview/groupTypes.js +11 -0
- package/lib/module/camera/preview/groupTypes.js.map +1 -0
- package/lib/module/camera/preview/groupTypes.test.js +25 -0
- package/lib/module/camera/preview/groupTypes.test.js.map +1 -0
- package/lib/module/camera/preview/index.js +3 -4
- package/lib/module/camera/preview/index.js.map +1 -1
- package/lib/module/camera/setup/SideRail.js +138 -0
- package/lib/module/camera/setup/SideRail.js.map +1 -0
- package/lib/module/camera/setup/SideRail.test.js +49 -0
- package/lib/module/camera/setup/SideRail.test.js.map +1 -0
- package/lib/module/camera/setup/index.js +1 -1
- package/lib/module/camera/setup/index.js.map +1 -1
- package/lib/module/components/Carousel/SlideItem.js +5 -3
- package/lib/module/components/Carousel/SlideItem.js.map +1 -1
- package/lib/module/components/Carousel/SlideItem.test.js +39 -0
- package/lib/module/components/Carousel/SlideItem.test.js.map +1 -0
- package/lib/module/components/VideoPlayer.js +34 -0
- package/lib/module/components/VideoPlayer.js.map +1 -0
- package/lib/module/components/VideoPlayer.test.js +15 -0
- package/lib/module/components/VideoPlayer.test.js.map +1 -0
- package/lib/module/components/index.js +0 -1
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/hooks/index.js +0 -1
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/typescript/src/camera/Camera.d.ts +3 -0
- package/lib/typescript/src/camera/Camera.d.ts.map +1 -1
- package/lib/typescript/src/camera/CaptureFlash.d.ts +6 -0
- package/lib/typescript/src/camera/CaptureFlash.d.ts.map +1 -0
- package/lib/typescript/src/camera/CaptureFlash.test.d.ts +2 -0
- package/lib/typescript/src/camera/CaptureFlash.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/Container.d.ts.map +1 -1
- package/lib/typescript/src/camera/FocusIndicator.d.ts.map +1 -1
- package/lib/typescript/src/camera/FocusIndicator.test.d.ts +2 -0
- package/lib/typescript/src/camera/FocusIndicator.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/colors/dark.d.ts +18 -0
- package/lib/typescript/src/camera/colors/dark.d.ts.map +1 -0
- package/lib/typescript/src/camera/colors/dark.test.d.ts +2 -0
- package/lib/typescript/src/camera/colors/dark.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ActionRow.d.ts +14 -0
- package/lib/typescript/src/camera/footer/ActionRow.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ActionRow.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/ActionRow.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/FlipButton.d.ts +4 -0
- package/lib/typescript/src/camera/footer/FlipButton.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/FlipButton.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/FlipButton.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ModeSwitcherPill.d.ts +10 -0
- package/lib/typescript/src/camera/footer/ModeSwitcherPill.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ModeSwitcherPill.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/ModeSwitcherPill.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/RecordingTimer.d.ts +5 -0
- package/lib/typescript/src/camera/footer/RecordingTimer.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/RecordingTimer.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/RecordingTimer.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/Shutter.d.ts +9 -0
- package/lib/typescript/src/camera/footer/Shutter.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/Shutter.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/Shutter.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ThumbnailStack.d.ts +8 -0
- package/lib/typescript/src/camera/footer/ThumbnailStack.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ThumbnailStack.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/ThumbnailStack.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ZoomChips.d.ts +5 -0
- package/lib/typescript/src/camera/footer/ZoomChips.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/ZoomChips.test.d.ts +2 -0
- package/lib/typescript/src/camera/footer/ZoomChips.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/footer/index.d.ts +7 -1
- package/lib/typescript/src/camera/footer/index.d.ts.map +1 -1
- package/lib/typescript/src/camera/icons/VolumeIcon.d.ts +8 -0
- package/lib/typescript/src/camera/icons/VolumeIcon.d.ts.map +1 -0
- package/lib/typescript/src/camera/icons/VolumeIcon.test.d.ts +2 -0
- package/lib/typescript/src/camera/icons/VolumeIcon.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/index.d.ts +3 -1
- package/lib/typescript/src/camera/index.d.ts.map +1 -1
- package/lib/typescript/src/camera/preview/PreviewBottomBar.d.ts +12 -0
- package/lib/typescript/src/camera/preview/PreviewBottomBar.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/PreviewBottomBar.test.d.ts +2 -0
- package/lib/typescript/src/camera/preview/PreviewBottomBar.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/PreviewOverlay.d.ts +12 -0
- package/lib/typescript/src/camera/preview/PreviewOverlay.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/PreviewOverlay.test.d.ts +2 -0
- package/lib/typescript/src/camera/preview/PreviewOverlay.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/PreviewTopBar.d.ts +10 -0
- package/lib/typescript/src/camera/preview/PreviewTopBar.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/PreviewTopBar.test.d.ts +2 -0
- package/lib/typescript/src/camera/preview/PreviewTopBar.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/groupTypes.d.ts +4 -0
- package/lib/typescript/src/camera/preview/groupTypes.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/groupTypes.test.d.ts +2 -0
- package/lib/typescript/src/camera/preview/groupTypes.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/preview/index.d.ts +3 -4
- package/lib/typescript/src/camera/preview/index.d.ts.map +1 -1
- package/lib/typescript/src/camera/setup/SideRail.d.ts +15 -0
- package/lib/typescript/src/camera/setup/SideRail.d.ts.map +1 -0
- package/lib/typescript/src/camera/setup/SideRail.test.d.ts +2 -0
- package/lib/typescript/src/camera/setup/SideRail.test.d.ts.map +1 -0
- package/lib/typescript/src/camera/setup/index.d.ts +2 -1
- package/lib/typescript/src/camera/setup/index.d.ts.map +1 -1
- package/lib/typescript/src/components/Carousel/SlideItem.d.ts.map +1 -1
- package/lib/typescript/src/components/Carousel/SlideItem.test.d.ts +2 -0
- package/lib/typescript/src/components/Carousel/SlideItem.test.d.ts.map +1 -0
- package/lib/typescript/src/components/VideoPlayer.d.ts +4 -0
- package/lib/typescript/src/components/VideoPlayer.d.ts.map +1 -0
- package/lib/typescript/src/components/VideoPlayer.test.d.ts +2 -0
- package/lib/typescript/src/components/VideoPlayer.test.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +0 -1
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/index.d.ts +0 -1
- package/lib/typescript/src/hooks/index.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/camera/Camera.tsx +117 -26
- package/src/camera/CaptureFlash.test.tsx +11 -0
- package/src/camera/CaptureFlash.tsx +42 -0
- package/src/camera/Container.tsx +158 -64
- package/src/camera/FocusIndicator.test.tsx +17 -0
- package/src/camera/FocusIndicator.tsx +111 -27
- package/src/camera/colors/dark.test.ts +8 -0
- package/src/camera/colors/dark.ts +19 -0
- package/src/camera/footer/ActionRow.test.tsx +44 -0
- package/src/camera/footer/ActionRow.tsx +80 -0
- package/src/camera/footer/FlipButton.test.tsx +9 -0
- package/src/camera/footer/FlipButton.tsx +22 -0
- package/src/camera/footer/ModeSwitcherPill.test.tsx +29 -0
- package/src/camera/footer/ModeSwitcherPill.tsx +97 -0
- package/src/camera/footer/RecordingTimer.test.tsx +14 -0
- package/src/camera/footer/RecordingTimer.tsx +58 -0
- package/src/camera/footer/Shutter.test.tsx +26 -0
- package/src/camera/footer/Shutter.tsx +71 -0
- package/src/camera/footer/ThumbnailStack.test.tsx +19 -0
- package/src/camera/footer/ThumbnailStack.tsx +58 -0
- package/src/camera/footer/ZoomChips.test.tsx +9 -0
- package/src/camera/footer/ZoomChips.tsx +53 -0
- package/src/camera/footer/index.tsx +7 -1
- package/src/camera/icons/VolumeIcon.test.tsx +9 -0
- package/src/camera/icons/VolumeIcon.tsx +39 -0
- package/src/camera/index.tsx +11 -1
- package/src/camera/preview/PreviewBottomBar.test.tsx +43 -0
- package/src/camera/preview/PreviewBottomBar.tsx +79 -0
- package/src/camera/preview/PreviewOverlay.test.tsx +45 -0
- package/src/camera/preview/PreviewOverlay.tsx +99 -0
- package/src/camera/preview/PreviewTopBar.test.tsx +46 -0
- package/src/camera/preview/PreviewTopBar.tsx +91 -0
- package/src/camera/preview/groupTypes.test.ts +34 -0
- package/src/camera/preview/groupTypes.ts +15 -0
- package/src/camera/preview/index.tsx +3 -4
- package/src/camera/setup/SideRail.test.tsx +37 -0
- package/src/camera/setup/SideRail.tsx +161 -0
- package/src/camera/setup/index.tsx +2 -1
- package/src/components/Carousel/SlideItem.test.tsx +27 -0
- package/src/components/Carousel/SlideItem.tsx +11 -7
- package/src/components/VideoPlayer.test.tsx +8 -0
- package/src/components/VideoPlayer.tsx +30 -0
- package/src/components/index.tsx +0 -1
- package/src/hooks/index.ts +0 -1
- package/lib/module/camera/footer/Footer.js +0 -94
- package/lib/module/camera/footer/Footer.js.map +0 -1
- package/lib/module/camera/preview/PreView.js +0 -43
- package/lib/module/camera/preview/PreView.js.map +0 -1
- package/lib/module/camera/preview/PreViewContainer.js +0 -33
- package/lib/module/camera/preview/PreViewContainer.js.map +0 -1
- package/lib/module/camera/preview/PreviewFooter.js +0 -36
- package/lib/module/camera/preview/PreviewFooter.js.map +0 -1
- package/lib/module/camera/preview/SinglePre.js +0 -32
- package/lib/module/camera/preview/SinglePre.js.map +0 -1
- package/lib/module/camera/setup/SetUp.js +0 -74
- package/lib/module/camera/setup/SetUp.js.map +0 -1
- package/lib/module/components/PreviewThumbnail.js +0 -39
- package/lib/module/components/PreviewThumbnail.js.map +0 -1
- package/lib/module/hooks/useConfirm.js +0 -16
- package/lib/module/hooks/useConfirm.js.map +0 -1
- package/lib/typescript/src/camera/footer/Footer.d.ts +0 -14
- package/lib/typescript/src/camera/footer/Footer.d.ts.map +0 -1
- package/lib/typescript/src/camera/preview/PreView.d.ts +0 -7
- package/lib/typescript/src/camera/preview/PreView.d.ts.map +0 -1
- package/lib/typescript/src/camera/preview/PreViewContainer.d.ts +0 -9
- package/lib/typescript/src/camera/preview/PreViewContainer.d.ts.map +0 -1
- package/lib/typescript/src/camera/preview/PreviewFooter.d.ts +0 -7
- package/lib/typescript/src/camera/preview/PreviewFooter.d.ts.map +0 -1
- package/lib/typescript/src/camera/preview/SinglePre.d.ts +0 -7
- package/lib/typescript/src/camera/preview/SinglePre.d.ts.map +0 -1
- package/lib/typescript/src/camera/setup/SetUp.d.ts +0 -13
- package/lib/typescript/src/camera/setup/SetUp.d.ts.map +0 -1
- package/lib/typescript/src/components/PreviewThumbnail.d.ts +0 -9
- package/lib/typescript/src/components/PreviewThumbnail.d.ts.map +0 -1
- package/lib/typescript/src/hooks/useConfirm.d.ts +0 -2
- package/lib/typescript/src/hooks/useConfirm.d.ts.map +0 -1
- package/src/camera/footer/Footer.tsx +0 -113
- package/src/camera/preview/PreView.tsx +0 -32
- package/src/camera/preview/PreViewContainer.tsx +0 -30
- package/src/camera/preview/PreviewFooter.tsx +0 -38
- package/src/camera/preview/SinglePre.tsx +0 -30
- package/src/camera/setup/SetUp.tsx +0 -93
- package/src/components/PreviewThumbnail.tsx +0 -45
- package/src/hooks/useConfirm.tsx +0 -11
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ yarn add @unif/react-native-camera \
|
|
|
17
17
|
react-native-reanimated \
|
|
18
18
|
react-native-worklets \
|
|
19
19
|
react-native-reanimated-carousel \
|
|
20
|
+
react-native-video \
|
|
20
21
|
react-native-gesture-handler \
|
|
21
22
|
react-native-safe-area-context
|
|
22
23
|
```
|
|
@@ -29,6 +30,12 @@ vision-camera 5.x 把 Frame Processor / 多线程能力拆到了同伴包 `react
|
|
|
29
30
|
|
|
30
31
|
因此它是**必装的同伴包**,版本与 `react-native-vision-camera` 对齐(同为 `^5.x`)。vision-camera 自身未将其声明为 peer(视作可选),本库已在 `peerDependencies` 中显式声明,以提醒消费者一并安装。
|
|
31
32
|
|
|
33
|
+
### 关于 `react-native-video` 与预览
|
|
34
|
+
|
|
35
|
+
预览页的**视频播放**用 `react-native-video`(**7.x**,`useVideoPlayer` + `VideoView` API),消费端需安装并 iOS `pod install`。
|
|
36
|
+
|
|
37
|
+
预览页的**二次确认弹窗**与 **Toast** 复用 `@unif/react-native-design` 的 `confirm` / `toast`,需消费端在 App 根挂 `ConfirmHost` / `ToastHost`(与 `ThemeProvider` 一样一次性挂载);未挂则确认/提示静默失效。
|
|
38
|
+
|
|
32
39
|
### 权限配置
|
|
33
40
|
|
|
34
41
|
iOS `Info.plist`:
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';
|
|
4
|
-
import { StyleSheet, useWindowDimensions, View } from 'react-native';
|
|
3
|
+
import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
4
|
+
import { Animated, StyleSheet, useWindowDimensions, View } from 'react-native';
|
|
5
|
+
import Svg, { Line } from 'react-native-svg';
|
|
5
6
|
import { Camera as VisionCamera, useMicrophonePermission, usePhotoOutput, useVideoOutput } from 'react-native-vision-camera';
|
|
6
7
|
import { runOnJS, useSharedValue } from 'react-native-reanimated';
|
|
7
8
|
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
8
9
|
import { buildPhotoFile } from "../utils/index.js";
|
|
9
10
|
import { capturePhotoToFile } from "./capturePhotoHelper.js";
|
|
10
11
|
import { FocusIndicator } from "./FocusIndicator.js";
|
|
12
|
+
import { DARK } from "./colors/dark.js";
|
|
11
13
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
14
|
const NEUTRAL_ZOOM = 1;
|
|
13
15
|
export const Camera = /*#__PURE__*/forwardRef(function Camera({
|
|
@@ -16,7 +18,10 @@ export const Camera = /*#__PURE__*/forwardRef(function Camera({
|
|
|
16
18
|
isActive = true,
|
|
17
19
|
flash,
|
|
18
20
|
aspectRatio,
|
|
19
|
-
zoomShared
|
|
21
|
+
zoomShared,
|
|
22
|
+
sound,
|
|
23
|
+
grid,
|
|
24
|
+
flipNonce
|
|
20
25
|
}, ref) {
|
|
21
26
|
const cameraRef = useRef(null);
|
|
22
27
|
const cameraType = device.position === 'front' ? 'front' : 'back';
|
|
@@ -62,6 +67,21 @@ export const Camera = /*#__PURE__*/forwardRef(function Camera({
|
|
|
62
67
|
const z = zoomOffset.value * e.scale;
|
|
63
68
|
zoom.value = Math.min(Math.max(z, device.minZoom), device.maxZoom);
|
|
64
69
|
});
|
|
70
|
+
|
|
71
|
+
// 翻转动画:flipNonce 变化时播一次 rotateY 0→180→0(前后摄切换的 3D 翻转视觉)。
|
|
72
|
+
const flipAnim = useRef(new Animated.Value(0)).current;
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (!flipNonce) return;
|
|
75
|
+
Animated.sequence([Animated.timing(flipAnim, {
|
|
76
|
+
toValue: 1,
|
|
77
|
+
duration: 180,
|
|
78
|
+
useNativeDriver: true
|
|
79
|
+
}), Animated.timing(flipAnim, {
|
|
80
|
+
toValue: 0,
|
|
81
|
+
duration: 180,
|
|
82
|
+
useNativeDriver: true
|
|
83
|
+
})]).start();
|
|
84
|
+
}, [flipNonce, flipAnim]);
|
|
65
85
|
const [focusPoint, setFocusPoint] = useState(null);
|
|
66
86
|
const handleFocus = useCallback(async (x, y) => {
|
|
67
87
|
if (!device.supportsFocusMetering) return;
|
|
@@ -96,7 +116,7 @@ export const Camera = /*#__PURE__*/forwardRef(function Camera({
|
|
|
96
116
|
try {
|
|
97
117
|
const raw = await capturePhotoToFile(photoOutput, {
|
|
98
118
|
flashMode: flash ?? 'off',
|
|
99
|
-
enableShutterSound: true
|
|
119
|
+
enableShutterSound: sound ?? true
|
|
100
120
|
});
|
|
101
121
|
return buildPhotoFile({
|
|
102
122
|
path: raw.path,
|
|
@@ -166,39 +186,88 @@ export const Camera = /*#__PURE__*/forwardRef(function Camera({
|
|
|
166
186
|
return null;
|
|
167
187
|
}
|
|
168
188
|
}
|
|
169
|
-
}), [photoOutput, videoOutput, currentMode.mode, hasMic, requestMic, flash, cameraType]);
|
|
189
|
+
}), [photoOutput, videoOutput, currentMode.mode, hasMic, requestMic, flash, cameraType, sound]);
|
|
170
190
|
const outputs = currentMode.mode === 'video' ? [videoOutput] : [photoOutput];
|
|
171
191
|
return /*#__PURE__*/_jsx(View, {
|
|
172
192
|
style: styles.root,
|
|
173
193
|
children: /*#__PURE__*/_jsx(GestureDetector, {
|
|
174
194
|
gesture: composed,
|
|
175
|
-
children: /*#__PURE__*/
|
|
176
|
-
style:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
195
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
196
|
+
style: {
|
|
197
|
+
transform: [{
|
|
198
|
+
perspective: 1000
|
|
199
|
+
}, {
|
|
200
|
+
rotateY: flipAnim.interpolate({
|
|
201
|
+
inputRange: [0, 1],
|
|
202
|
+
outputRange: ['0deg', '180deg']
|
|
203
|
+
})
|
|
204
|
+
}]
|
|
205
|
+
},
|
|
206
|
+
children: /*#__PURE__*/_jsxs(View, {
|
|
207
|
+
style: [styles.frame, {
|
|
208
|
+
width: frameW,
|
|
209
|
+
height: frameH
|
|
189
210
|
}],
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
211
|
+
children: [/*#__PURE__*/_jsx(VisionCamera, {
|
|
212
|
+
ref: cameraRef,
|
|
213
|
+
style: StyleSheet.absoluteFill,
|
|
214
|
+
resizeMode: "cover",
|
|
215
|
+
device: device,
|
|
216
|
+
isActive: isActive,
|
|
217
|
+
outputs: outputs,
|
|
218
|
+
constraints: [{
|
|
219
|
+
photoHDR: false
|
|
220
|
+
}],
|
|
221
|
+
zoom: zoom,
|
|
222
|
+
torchMode: currentMode.mode === 'video' && flash === 'on' ? 'on' : 'off',
|
|
223
|
+
onSubjectAreaChanged: () => cameraRef.current?.resetFocus(),
|
|
224
|
+
nativeID: "vision-camera"
|
|
225
|
+
}), grid && /*#__PURE__*/_jsx(GridOverlay, {}), focusPoint && /*#__PURE__*/_jsx(FocusIndicator, {
|
|
226
|
+
point: focusPoint,
|
|
227
|
+
onAnimationEnd: () => setFocusPoint(null)
|
|
228
|
+
}, `${focusPoint.x}-${focusPoint.y}`)]
|
|
229
|
+
})
|
|
198
230
|
})
|
|
199
231
|
})
|
|
200
232
|
});
|
|
201
233
|
});
|
|
234
|
+
|
|
235
|
+
// 网格叠加:2 竖 2 横线把取景框 3 等分(rule-of-thirds 九宫格)。pointerEvents=none 不挡手势。
|
|
236
|
+
function GridOverlay() {
|
|
237
|
+
return /*#__PURE__*/_jsxs(Svg, {
|
|
238
|
+
style: StyleSheet.absoluteFill,
|
|
239
|
+
pointerEvents: "none",
|
|
240
|
+
children: [/*#__PURE__*/_jsx(Line, {
|
|
241
|
+
x1: "33.33%",
|
|
242
|
+
y1: "0%",
|
|
243
|
+
x2: "33.33%",
|
|
244
|
+
y2: "100%",
|
|
245
|
+
stroke: DARK.white25,
|
|
246
|
+
strokeWidth: 0.5
|
|
247
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
248
|
+
x1: "66.66%",
|
|
249
|
+
y1: "0%",
|
|
250
|
+
x2: "66.66%",
|
|
251
|
+
y2: "100%",
|
|
252
|
+
stroke: DARK.white25,
|
|
253
|
+
strokeWidth: 0.5
|
|
254
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
255
|
+
x1: "0%",
|
|
256
|
+
y1: "33.33%",
|
|
257
|
+
x2: "100%",
|
|
258
|
+
y2: "33.33%",
|
|
259
|
+
stroke: DARK.white25,
|
|
260
|
+
strokeWidth: 0.5
|
|
261
|
+
}), /*#__PURE__*/_jsx(Line, {
|
|
262
|
+
x1: "0%",
|
|
263
|
+
y1: "66.66%",
|
|
264
|
+
x2: "100%",
|
|
265
|
+
y2: "66.66%",
|
|
266
|
+
stroke: DARK.white25,
|
|
267
|
+
strokeWidth: 0.5
|
|
268
|
+
})]
|
|
269
|
+
});
|
|
270
|
+
}
|
|
202
271
|
const styles = StyleSheet.create({
|
|
203
272
|
// 全屏黑底,把取景框居中 → 框外区域是黑边(letterbox)。
|
|
204
273
|
root: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["forwardRef","useCallback","useImperativeHandle","useRef","useState","StyleSheet","useWindowDimensions","View","Camera","VisionCamera","useMicrophonePermission","usePhotoOutput","useVideoOutput","runOnJS","useSharedValue","Gesture","GestureDetector","buildPhotoFile","capturePhotoToFile","FocusIndicator","jsx","_jsx","jsxs","_jsxs","NEUTRAL_ZOOM","device","currentMode","isActive","flash","aspectRatio","zoomShared","ref","cameraRef","cameraType","position","width","screenW","frameRatio","frameW","frameH","targetResolution","height","photoOutput","qualityPrioritization","quality","videoOutput","hasPermission","hasMic","requestPermission","requestMic","activeRecorderRef","preparedRecorderRef","finishResolverRef","internalZoom","zoom","zoomOffset","pinchGesture","Pinch","onBegin","value","onUpdate","e","z","scale","Math","min","max","minZoom","maxZoom","focusPoint","setFocusPoint","handleFocus","x","y","supportsFocusMetering","current","focusTo","responsiveness","adaptiveness","autoResetAfter","console","warn","tapGesture","Tap","onEnd","composed","Simultaneous","capture","raw","flashMode","enableShutterSound","path","mode","startVideo","catch","recorder","createRecorder","startRecording","filePath","_reason","file","error","stopVideo","active","durationSec","recordedDuration","finishedPromise","Promise","resolve","duration","stopRecording","outputs","style","styles","root","children","gesture","frame","absoluteFill","resizeMode","constraints","photoHDR","torchMode","onSubjectAreaChanged","resetFocus","nativeID","point","onAnimationEnd","create","backgroundColor","alignItems","justifyContent","overflow"],"sourceRoot":"../../../src","sources":["camera/Camera.tsx"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","Animated","StyleSheet","useWindowDimensions","View","Svg","Line","Camera","VisionCamera","useMicrophonePermission","usePhotoOutput","useVideoOutput","runOnJS","useSharedValue","Gesture","GestureDetector","buildPhotoFile","capturePhotoToFile","FocusIndicator","DARK","jsx","_jsx","jsxs","_jsxs","NEUTRAL_ZOOM","device","currentMode","isActive","flash","aspectRatio","zoomShared","sound","grid","flipNonce","ref","cameraRef","cameraType","position","width","screenW","frameRatio","frameW","frameH","targetResolution","height","photoOutput","qualityPrioritization","quality","videoOutput","hasPermission","hasMic","requestPermission","requestMic","activeRecorderRef","preparedRecorderRef","finishResolverRef","internalZoom","zoom","zoomOffset","pinchGesture","Pinch","onBegin","value","onUpdate","e","z","scale","Math","min","max","minZoom","maxZoom","flipAnim","Value","current","sequence","timing","toValue","duration","useNativeDriver","start","focusPoint","setFocusPoint","handleFocus","x","y","supportsFocusMetering","focusTo","responsiveness","adaptiveness","autoResetAfter","console","warn","tapGesture","Tap","onEnd","composed","Simultaneous","capture","raw","flashMode","enableShutterSound","path","mode","startVideo","catch","recorder","createRecorder","startRecording","filePath","_reason","file","error","stopVideo","active","durationSec","recordedDuration","finishedPromise","Promise","resolve","stopRecording","outputs","style","styles","root","children","gesture","transform","perspective","rotateY","interpolate","inputRange","outputRange","frame","absoluteFill","resizeMode","constraints","photoHDR","torchMode","onSubjectAreaChanged","resetFocus","nativeID","GridOverlay","point","onAnimationEnd","pointerEvents","x1","y1","x2","y2","stroke","white25","strokeWidth","create","backgroundColor","alignItems","justifyContent","overflow"],"sourceRoot":"../../../src","sources":["camera/Camera.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { Animated, StyleSheet } from 'react-native';
|
|
5
|
+
import { DARK } from "./colors/dark.js";
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
// 拍照闪光:全屏白 overlay。`trigger`(nonce)变化时闪一下 —— opacity 0→0.85(60ms 进)→0(180ms 出)。
|
|
8
|
+
// trigger===0 视为初始态,不播(避免挂载即闪)。
|
|
9
|
+
export function CaptureFlash({
|
|
10
|
+
trigger
|
|
11
|
+
}) {
|
|
12
|
+
const opacity = useRef(new Animated.Value(0)).current;
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (trigger === 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const anim = Animated.sequence([Animated.timing(opacity, {
|
|
18
|
+
toValue: 0.85,
|
|
19
|
+
duration: 60,
|
|
20
|
+
useNativeDriver: true
|
|
21
|
+
}), Animated.timing(opacity, {
|
|
22
|
+
toValue: 0,
|
|
23
|
+
duration: 180,
|
|
24
|
+
useNativeDriver: true
|
|
25
|
+
})]);
|
|
26
|
+
anim.start();
|
|
27
|
+
return () => anim.stop();
|
|
28
|
+
}, [trigger, opacity]);
|
|
29
|
+
return /*#__PURE__*/_jsx(Animated.View, {
|
|
30
|
+
testID: "capture-flash",
|
|
31
|
+
pointerEvents: "none",
|
|
32
|
+
style: [StyleSheet.absoluteFill, {
|
|
33
|
+
backgroundColor: DARK.white,
|
|
34
|
+
opacity
|
|
35
|
+
}]
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=CaptureFlash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","Animated","StyleSheet","DARK","jsx","_jsx","CaptureFlash","trigger","opacity","Value","current","anim","sequence","timing","toValue","duration","useNativeDriver","start","stop","View","testID","pointerEvents","style","absoluteFill","backgroundColor","white"],"sourceRoot":"../../../src","sources":["camera/CaptureFlash.tsx"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,QAAQ,EAAEC,UAAU,QAAQ,cAAc;AACnD,SAASC,IAAI,QAAQ,kBAAe;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAIrC;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAAEC;AAAe,CAAC,EAAE;EAC/C,MAAMC,OAAO,GAAGR,MAAM,CAAC,IAAIC,QAAQ,CAACQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO;EAErDX,SAAS,CAAC,MAAM;IACd,IAAIQ,OAAO,KAAK,CAAC,EAAE;MACjB;IACF;IACA,MAAMI,IAAI,GAAGV,QAAQ,CAACW,QAAQ,CAAC,CAC7BX,QAAQ,CAACY,MAAM,CAACL,OAAO,EAAE;MACvBM,OAAO,EAAE,IAAI;MACbC,QAAQ,EAAE,EAAE;MACZC,eAAe,EAAE;IACnB,CAAC,CAAC,EACFf,QAAQ,CAACY,MAAM,CAACL,OAAO,EAAE;MACvBM,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAE,GAAG;MACbC,eAAe,EAAE;IACnB,CAAC,CAAC,CACH,CAAC;IACFL,IAAI,CAACM,KAAK,CAAC,CAAC;IACZ,OAAO,MAAMN,IAAI,CAACO,IAAI,CAAC,CAAC;EAC1B,CAAC,EAAE,CAACX,OAAO,EAAEC,OAAO,CAAC,CAAC;EAEtB,oBACEH,IAAA,CAACJ,QAAQ,CAACkB,IAAI;IACZC,MAAM,EAAC,eAAe;IACtBC,aAAa,EAAC,MAAM;IACpBC,KAAK,EAAE,CACLpB,UAAU,CAACqB,YAAY,EACvB;MAAEC,eAAe,EAAErB,IAAI,CAACsB,KAAK;MAAEjB;IAAQ,CAAC;EACxC,CACH,CAAC;AAEN","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { render } from '@testing-library/react-native';
|
|
4
|
+
import { CaptureFlash } from "./CaptureFlash.js";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
it('renders overlay', () => {
|
|
7
|
+
const {
|
|
8
|
+
getByTestId
|
|
9
|
+
} = render(/*#__PURE__*/_jsx(CaptureFlash, {
|
|
10
|
+
trigger: 1
|
|
11
|
+
}));
|
|
12
|
+
expect(getByTestId('capture-flash')).toBeTruthy();
|
|
13
|
+
});
|
|
14
|
+
it('does not crash when trigger is 0', () => {
|
|
15
|
+
expect(() => render(/*#__PURE__*/_jsx(CaptureFlash, {
|
|
16
|
+
trigger: 0
|
|
17
|
+
}))).not.toThrow();
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=CaptureFlash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["render","CaptureFlash","jsx","_jsx","it","getByTestId","trigger","expect","toBeTruthy","not","toThrow"],"sourceRoot":"../../../src","sources":["camera/CaptureFlash.test.tsx"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,+BAA+B;AACtD,SAASC,YAAY,QAAQ,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE9CC,EAAE,CAAC,iBAAiB,EAAE,MAAM;EAC1B,MAAM;IAAEC;EAAY,CAAC,GAAGL,MAAM,cAACG,IAAA,CAACF,YAAY;IAACK,OAAO,EAAE;EAAE,CAAE,CAAC,CAAC;EAC5DC,MAAM,CAACF,WAAW,CAAC,eAAe,CAAC,CAAC,CAACG,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC;AAEFJ,EAAE,CAAC,kCAAkC,EAAE,MAAM;EAC3CG,MAAM,CAAC,MAAMP,MAAM,cAACG,IAAA,CAACF,YAAY;IAACK,OAAO,EAAE;EAAE,CAAE,CAAC,CAAC,CAAC,CAACG,GAAG,CAACC,OAAO,CAAC,CAAC;AAClE,CAAC,CAAC","ignoreList":[]}
|
|
@@ -4,24 +4,30 @@ import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
4
4
|
import { Linking, StyleSheet, View } from 'react-native';
|
|
5
5
|
import { useCameraDevice, useCameraPermission } from 'react-native-vision-camera';
|
|
6
6
|
import { useSharedValue } from 'react-native-reanimated';
|
|
7
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
8
|
+
import { r } from '@unif/react-native-design';
|
|
7
9
|
import { NoCamera } from "./NoCamera.js";
|
|
8
10
|
import { NoPermission } from "./NoPermission.js";
|
|
9
11
|
import { Loading } from "../components/Loading.js";
|
|
10
12
|
import { Camera } from "./Camera.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
13
|
+
import { PreviewOverlay } from "./preview/index.js";
|
|
14
|
+
import { CaptureFlash } from "./CaptureFlash.js";
|
|
15
|
+
import { SideRail } from "./setup/index.js";
|
|
16
|
+
import { ZoomChips } from "./footer/ZoomChips.js";
|
|
17
|
+
import { ModeSwitcherPill } from "./footer/ModeSwitcherPill.js";
|
|
18
|
+
import { ActionRow } from "./footer/ActionRow.js";
|
|
19
|
+
import { RecordingTimer } from "./footer/RecordingTimer.js";
|
|
20
|
+
import { DARK } from "./colors/dark.js";
|
|
14
21
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
-
const NEUTRAL_ZOOM = 1;
|
|
16
22
|
export function Container({
|
|
17
23
|
config,
|
|
18
24
|
onSettle
|
|
19
25
|
}) {
|
|
20
26
|
const settledRef = useRef(false);
|
|
21
|
-
const settle = useCallback(
|
|
27
|
+
const settle = useCallback(result => {
|
|
22
28
|
if (settledRef.current) return;
|
|
23
29
|
settledRef.current = true;
|
|
24
|
-
onSettle(
|
|
30
|
+
onSettle(result);
|
|
25
31
|
}, [onSettle]);
|
|
26
32
|
useEffect(() => () => {
|
|
27
33
|
if (!settledRef.current) {
|
|
@@ -57,24 +63,41 @@ export function Container({
|
|
|
57
63
|
cancelled = true;
|
|
58
64
|
};
|
|
59
65
|
}, [hasPermission, requestPermission]);
|
|
60
|
-
|
|
66
|
+
const insets = useSafeAreaInsets();
|
|
61
67
|
// 初始前/后摄由 config 首个 mode 的 type 决定(H5 传入),缺省 back。
|
|
62
|
-
//
|
|
63
|
-
// 5.x:physicalDevices 字符串不带 -camera
|
|
68
|
+
// 运行时翻转(S7):position state + flipNonce 触发 rotateY 动画。
|
|
69
|
+
// 5.x:physicalDevices 字符串不带 -camera;单 'wide-angle' 规避 iOS #3773
|
|
64
70
|
const initialPosition = config.cameraMode[0]?.type ?? 'back';
|
|
65
|
-
const
|
|
71
|
+
const [position, setPosition] = useState(initialPosition);
|
|
72
|
+
const [flipNonce, setFlipNonce] = useState(0);
|
|
73
|
+
const device = useCameraDevice(position, {
|
|
66
74
|
physicalDevices: ['wide-angle']
|
|
67
75
|
});
|
|
68
76
|
const cameraRef = useRef(null);
|
|
69
77
|
const [photos, setPhotos] = useState([]);
|
|
70
78
|
const [previewing, setPreviewing] = useState(false);
|
|
79
|
+
const [previewVariant, setPreviewVariant] = useState('gallery');
|
|
71
80
|
const [recording, setRecording] = useState(false);
|
|
72
81
|
const [modeIndex, setModeIndex] = useState(0);
|
|
73
82
|
const currentMode = config.cameraMode[modeIndex];
|
|
74
|
-
|
|
83
|
+
|
|
84
|
+
// 初始闪光从 config 首个 mode 接线(API 兼容),缺省 off。
|
|
85
|
+
const [flash, setFlash] = useState(config.cameraMode[0]?.flashMode ?? 'off');
|
|
86
|
+
const [sound, setSound] = useState(true);
|
|
87
|
+
const [grid, setGrid] = useState(false);
|
|
75
88
|
const [aspectRatio, setAspectRatio] = useState('4:3');
|
|
76
|
-
const
|
|
77
|
-
const [
|
|
89
|
+
const [flashNonce, setFlashNonce] = useState(0);
|
|
90
|
+
const [recSeconds, setRecSeconds] = useState(0);
|
|
91
|
+
const [zoom, setZoom] = useState(1);
|
|
92
|
+
const zoomShared = useSharedValue(1);
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
if (!recording) {
|
|
95
|
+
setRecSeconds(0);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const id = setInterval(() => setRecSeconds(s => s + 1), 1000);
|
|
99
|
+
return () => clearInterval(id);
|
|
100
|
+
}, [recording]);
|
|
78
101
|
const onShutter = async () => {
|
|
79
102
|
if (currentMode?.mode === 'video') {
|
|
80
103
|
if (!recording) {
|
|
@@ -83,16 +106,11 @@ export function Container({
|
|
|
83
106
|
} else {
|
|
84
107
|
const f = await cameraRef.current?.stopVideo();
|
|
85
108
|
setRecording(false);
|
|
86
|
-
if (f) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
code: 503,
|
|
92
|
-
data: [],
|
|
93
|
-
message: 'video_failed'
|
|
94
|
-
});
|
|
95
|
-
}
|
|
109
|
+
if (f) setPhotos(prev => [...prev, f]);else settle({
|
|
110
|
+
code: 503,
|
|
111
|
+
data: [],
|
|
112
|
+
message: 'video_failed'
|
|
113
|
+
});
|
|
96
114
|
}
|
|
97
115
|
return;
|
|
98
116
|
}
|
|
@@ -105,11 +123,22 @@ export function Container({
|
|
|
105
123
|
});
|
|
106
124
|
return;
|
|
107
125
|
}
|
|
126
|
+
setFlashNonce(n => n + 1);
|
|
108
127
|
setPhotos(prev => [...prev, f]);
|
|
109
|
-
|
|
128
|
+
// 自动预览规则:仅「非保留(clear) + 单拍」拍完进预览;其余累积
|
|
129
|
+
if (currentMode?.mode === 'single' && config.dataRetainedMode === 'clear') {
|
|
130
|
+
setPreviewVariant('confirm');
|
|
110
131
|
setPreviewing(true);
|
|
111
132
|
}
|
|
112
133
|
};
|
|
134
|
+
const onFlip = () => {
|
|
135
|
+
setPosition(p => p === 'back' ? 'front' : 'back');
|
|
136
|
+
setFlipNonce(n => n + 1);
|
|
137
|
+
};
|
|
138
|
+
const onSelectMode = i => {
|
|
139
|
+
if (config.dataRetainedMode === 'clear' && i !== modeIndex) setPhotos([]);
|
|
140
|
+
setModeIndex(i);
|
|
141
|
+
};
|
|
113
142
|
if (state === 'denied') {
|
|
114
143
|
return /*#__PURE__*/_jsx(NoPermission, {
|
|
115
144
|
onCancel: () => settle({
|
|
@@ -128,17 +157,24 @@ export function Container({
|
|
|
128
157
|
});
|
|
129
158
|
}
|
|
130
159
|
if (previewing) {
|
|
131
|
-
return /*#__PURE__*/_jsx(
|
|
160
|
+
return /*#__PURE__*/_jsx(PreviewOverlay, {
|
|
132
161
|
files: photos,
|
|
162
|
+
variant: previewVariant,
|
|
133
163
|
onRetake: () => {
|
|
134
164
|
setPhotos([]);
|
|
135
165
|
setPreviewing(false);
|
|
136
166
|
},
|
|
137
|
-
|
|
167
|
+
onSave: () => settle({
|
|
138
168
|
code: 200,
|
|
139
169
|
data: photos,
|
|
140
170
|
message: 'ok'
|
|
141
|
-
})
|
|
171
|
+
}),
|
|
172
|
+
onBack: () => setPreviewing(false),
|
|
173
|
+
onDelete: f => {
|
|
174
|
+
const next = photos.filter(x => x !== f);
|
|
175
|
+
setPhotos(next);
|
|
176
|
+
if (next.length === 0) setPreviewing(false);
|
|
177
|
+
}
|
|
142
178
|
});
|
|
143
179
|
}
|
|
144
180
|
if (device == null) {
|
|
@@ -159,15 +195,10 @@ export function Container({
|
|
|
159
195
|
})
|
|
160
196
|
});
|
|
161
197
|
}
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
} else {
|
|
167
|
-
zoomShared.value = device.minZoom;
|
|
168
|
-
setLensLabel(`${device.minZoom.toFixed(1)}x`);
|
|
169
|
-
}
|
|
170
|
-
};
|
|
198
|
+
const modeItems = config.cameraMode.map((m, i) => ({
|
|
199
|
+
key: `${m.mode}-${i}`,
|
|
200
|
+
label: m.mode === 'single' ? '单拍' : m.mode === 'continuous' ? '连拍' : '视频'
|
|
201
|
+
}));
|
|
171
202
|
return /*#__PURE__*/_jsxs(View, {
|
|
172
203
|
style: styles.root,
|
|
173
204
|
testID: "device-ready",
|
|
@@ -177,43 +208,114 @@ export function Container({
|
|
|
177
208
|
currentMode: currentMode,
|
|
178
209
|
flash: flash,
|
|
179
210
|
aspectRatio: aspectRatio,
|
|
180
|
-
zoomShared: zoomShared
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
211
|
+
zoomShared: zoomShared,
|
|
212
|
+
sound: sound,
|
|
213
|
+
grid: grid,
|
|
214
|
+
flipNonce: flipNonce
|
|
215
|
+
}), !recording && /*#__PURE__*/_jsx(View, {
|
|
216
|
+
style: [styles.sideRail, {
|
|
217
|
+
bottom: insets.bottom + r(172)
|
|
218
|
+
}],
|
|
219
|
+
children: /*#__PURE__*/_jsx(SideRail, {
|
|
220
|
+
flash: flash,
|
|
221
|
+
aspectRatio: aspectRatio,
|
|
222
|
+
sound: sound,
|
|
223
|
+
grid: grid,
|
|
224
|
+
onChangeFlash: setFlash,
|
|
225
|
+
onChangeAspectRatio: setAspectRatio,
|
|
226
|
+
onToggleSound: () => setSound(v => !v),
|
|
227
|
+
onToggleGrid: () => setGrid(v => !v)
|
|
228
|
+
})
|
|
229
|
+
}), !recording && /*#__PURE__*/_jsx(View, {
|
|
230
|
+
style: [styles.zoomChips, {
|
|
231
|
+
bottom: insets.bottom + r(184)
|
|
232
|
+
}],
|
|
233
|
+
children: /*#__PURE__*/_jsx(ZoomChips, {
|
|
234
|
+
zoom: zoom,
|
|
235
|
+
onSelect: z => {
|
|
236
|
+
// clamp 到设备变焦范围:无超广角设备 minZoom===1,点 0.5x 不应越界
|
|
237
|
+
const clamped = Math.min(Math.max(z, device.minZoom), device.maxZoom);
|
|
238
|
+
setZoom(clamped);
|
|
239
|
+
zoomShared.value = clamped;
|
|
196
240
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
241
|
+
})
|
|
242
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
243
|
+
style: [styles.bottom, {
|
|
244
|
+
paddingBottom: insets.bottom + r(20)
|
|
245
|
+
}],
|
|
246
|
+
children: [recording ? /*#__PURE__*/_jsx(View, {
|
|
247
|
+
style: styles.center,
|
|
248
|
+
children: /*#__PURE__*/_jsx(RecordingTimer, {
|
|
249
|
+
seconds: recSeconds
|
|
250
|
+
})
|
|
251
|
+
}) : /*#__PURE__*/_jsx(View, {
|
|
252
|
+
style: styles.center,
|
|
253
|
+
children: /*#__PURE__*/_jsx(ModeSwitcherPill, {
|
|
254
|
+
items: modeItems,
|
|
255
|
+
currentIndex: modeIndex,
|
|
256
|
+
onSelect: onSelectMode
|
|
257
|
+
})
|
|
258
|
+
}), /*#__PURE__*/_jsx(ActionRow, {
|
|
259
|
+
mode: currentMode.mode,
|
|
260
|
+
recording: recording,
|
|
261
|
+
latestUri: photos.at(-1)?.uri,
|
|
262
|
+
count: photos.length,
|
|
263
|
+
onShutter: onShutter,
|
|
264
|
+
onBack: () => settle({
|
|
265
|
+
code: 0,
|
|
266
|
+
data: [],
|
|
267
|
+
message: 'cancelled'
|
|
268
|
+
}),
|
|
269
|
+
onSave: () => settle({
|
|
270
|
+
code: 200,
|
|
271
|
+
data: photos,
|
|
272
|
+
message: 'ok'
|
|
273
|
+
}),
|
|
274
|
+
onFlip: onFlip,
|
|
275
|
+
onOpenPreview: () => {
|
|
276
|
+
if (photos.length > 0) {
|
|
277
|
+
setPreviewVariant('gallery');
|
|
278
|
+
setPreviewing(true);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
})]
|
|
282
|
+
}), /*#__PURE__*/_jsx(CaptureFlash, {
|
|
283
|
+
trigger: flashNonce
|
|
206
284
|
})]
|
|
207
285
|
});
|
|
208
286
|
}
|
|
209
287
|
const styles = StyleSheet.create({
|
|
288
|
+
// 相机主容器固定黑底:相机 UX 惯例(预览 / 拍照取景需要黑底凸显),
|
|
289
|
+
// 不走 c.background token。
|
|
210
290
|
root: {
|
|
211
291
|
flex: 1,
|
|
212
|
-
|
|
213
|
-
// 不走 c.background token.
|
|
214
|
-
backgroundColor: '#000',
|
|
292
|
+
backgroundColor: DARK.black,
|
|
215
293
|
justifyContent: 'center',
|
|
216
294
|
alignItems: 'center'
|
|
295
|
+
},
|
|
296
|
+
sideRail: {
|
|
297
|
+
position: 'absolute',
|
|
298
|
+
left: r(12),
|
|
299
|
+
zIndex: 9
|
|
300
|
+
},
|
|
301
|
+
zoomChips: {
|
|
302
|
+
position: 'absolute',
|
|
303
|
+
left: 0,
|
|
304
|
+
right: 0,
|
|
305
|
+
alignItems: 'center',
|
|
306
|
+
zIndex: 7
|
|
307
|
+
},
|
|
308
|
+
bottom: {
|
|
309
|
+
position: 'absolute',
|
|
310
|
+
left: 0,
|
|
311
|
+
right: 0,
|
|
312
|
+
bottom: 0,
|
|
313
|
+
paddingTop: r(14),
|
|
314
|
+
zIndex: 8,
|
|
315
|
+
gap: r(16)
|
|
316
|
+
},
|
|
317
|
+
center: {
|
|
318
|
+
alignItems: 'center'
|
|
217
319
|
}
|
|
218
320
|
});
|
|
219
321
|
//# sourceMappingURL=Container.js.map
|