@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.
Files changed (259) hide show
  1. package/README.md +7 -0
  2. package/lib/module/camera/Camera.js +96 -27
  3. package/lib/module/camera/Camera.js.map +1 -1
  4. package/lib/module/camera/CaptureFlash.js +38 -0
  5. package/lib/module/camera/CaptureFlash.js.map +1 -0
  6. package/lib/module/camera/CaptureFlash.test.js +19 -0
  7. package/lib/module/camera/CaptureFlash.test.js.map +1 -0
  8. package/lib/module/camera/Container.js +166 -64
  9. package/lib/module/camera/Container.js.map +1 -1
  10. package/lib/module/camera/FocusIndicator.js +99 -23
  11. package/lib/module/camera/FocusIndicator.js.map +1 -1
  12. package/lib/module/camera/FocusIndicator.test.js +27 -0
  13. package/lib/module/camera/FocusIndicator.test.js.map +1 -0
  14. package/lib/module/camera/colors/dark.js +22 -0
  15. package/lib/module/camera/colors/dark.js.map +1 -0
  16. package/lib/module/camera/colors/dark.test.js +10 -0
  17. package/lib/module/camera/colors/dark.test.js.map +1 -0
  18. package/lib/module/camera/footer/ActionRow.js +65 -0
  19. package/lib/module/camera/footer/ActionRow.js.map +1 -0
  20. package/lib/module/camera/footer/ActionRow.test.js +53 -0
  21. package/lib/module/camera/footer/ActionRow.test.js.map +1 -0
  22. package/lib/module/camera/footer/FlipButton.js +31 -0
  23. package/lib/module/camera/footer/FlipButton.js.map +1 -0
  24. package/lib/module/camera/footer/FlipButton.test.js +16 -0
  25. package/lib/module/camera/footer/FlipButton.test.js.map +1 -0
  26. package/lib/module/camera/footer/ModeSwitcherPill.js +89 -0
  27. package/lib/module/camera/footer/ModeSwitcherPill.js.map +1 -0
  28. package/lib/module/camera/footer/ModeSwitcherPill.test.js +43 -0
  29. package/lib/module/camera/footer/ModeSwitcherPill.test.js.map +1 -0
  30. package/lib/module/camera/footer/RecordingTimer.js +66 -0
  31. package/lib/module/camera/footer/RecordingTimer.js.map +1 -0
  32. package/lib/module/camera/footer/RecordingTimer.test.js +20 -0
  33. package/lib/module/camera/footer/RecordingTimer.test.js.map +1 -0
  34. package/lib/module/camera/footer/Shutter.js +70 -0
  35. package/lib/module/camera/footer/Shutter.js.map +1 -0
  36. package/lib/module/camera/footer/Shutter.test.js +42 -0
  37. package/lib/module/camera/footer/Shutter.test.js.map +1 -0
  38. package/lib/module/camera/footer/ThumbnailStack.js +71 -0
  39. package/lib/module/camera/footer/ThumbnailStack.js.map +1 -0
  40. package/lib/module/camera/footer/ThumbnailStack.test.js +30 -0
  41. package/lib/module/camera/footer/ThumbnailStack.test.js.map +1 -0
  42. package/lib/module/camera/footer/ZoomChips.js +57 -0
  43. package/lib/module/camera/footer/ZoomChips.js.map +1 -0
  44. package/lib/module/camera/footer/ZoomChips.test.js +17 -0
  45. package/lib/module/camera/footer/ZoomChips.test.js.map +1 -0
  46. package/lib/module/camera/footer/index.js +7 -1
  47. package/lib/module/camera/footer/index.js.map +1 -1
  48. package/lib/module/camera/icons/VolumeIcon.js +44 -0
  49. package/lib/module/camera/icons/VolumeIcon.js.map +1 -0
  50. package/lib/module/camera/icons/VolumeIcon.test.js +18 -0
  51. package/lib/module/camera/icons/VolumeIcon.test.js.map +1 -0
  52. package/lib/module/camera/index.js +3 -1
  53. package/lib/module/camera/index.js.map +1 -1
  54. package/lib/module/camera/preview/PreviewBottomBar.js +69 -0
  55. package/lib/module/camera/preview/PreviewBottomBar.js.map +1 -0
  56. package/lib/module/camera/preview/PreviewBottomBar.test.js +46 -0
  57. package/lib/module/camera/preview/PreviewBottomBar.test.js.map +1 -0
  58. package/lib/module/camera/preview/PreviewOverlay.js +89 -0
  59. package/lib/module/camera/preview/PreviewOverlay.js.map +1 -0
  60. package/lib/module/camera/preview/PreviewOverlay.test.js +45 -0
  61. package/lib/module/camera/preview/PreviewOverlay.test.js.map +1 -0
  62. package/lib/module/camera/preview/PreviewTopBar.js +96 -0
  63. package/lib/module/camera/preview/PreviewTopBar.js.map +1 -0
  64. package/lib/module/camera/preview/PreviewTopBar.test.js +44 -0
  65. package/lib/module/camera/preview/PreviewTopBar.test.js.map +1 -0
  66. package/lib/module/camera/preview/groupTypes.js +11 -0
  67. package/lib/module/camera/preview/groupTypes.js.map +1 -0
  68. package/lib/module/camera/preview/groupTypes.test.js +25 -0
  69. package/lib/module/camera/preview/groupTypes.test.js.map +1 -0
  70. package/lib/module/camera/preview/index.js +3 -4
  71. package/lib/module/camera/preview/index.js.map +1 -1
  72. package/lib/module/camera/setup/SideRail.js +138 -0
  73. package/lib/module/camera/setup/SideRail.js.map +1 -0
  74. package/lib/module/camera/setup/SideRail.test.js +49 -0
  75. package/lib/module/camera/setup/SideRail.test.js.map +1 -0
  76. package/lib/module/camera/setup/index.js +1 -1
  77. package/lib/module/camera/setup/index.js.map +1 -1
  78. package/lib/module/components/Carousel/SlideItem.js +5 -3
  79. package/lib/module/components/Carousel/SlideItem.js.map +1 -1
  80. package/lib/module/components/Carousel/SlideItem.test.js +39 -0
  81. package/lib/module/components/Carousel/SlideItem.test.js.map +1 -0
  82. package/lib/module/components/VideoPlayer.js +34 -0
  83. package/lib/module/components/VideoPlayer.js.map +1 -0
  84. package/lib/module/components/VideoPlayer.test.js +15 -0
  85. package/lib/module/components/VideoPlayer.test.js.map +1 -0
  86. package/lib/module/components/index.js +0 -1
  87. package/lib/module/components/index.js.map +1 -1
  88. package/lib/module/hooks/index.js +0 -1
  89. package/lib/module/hooks/index.js.map +1 -1
  90. package/lib/typescript/src/camera/Camera.d.ts +3 -0
  91. package/lib/typescript/src/camera/Camera.d.ts.map +1 -1
  92. package/lib/typescript/src/camera/CaptureFlash.d.ts +6 -0
  93. package/lib/typescript/src/camera/CaptureFlash.d.ts.map +1 -0
  94. package/lib/typescript/src/camera/CaptureFlash.test.d.ts +2 -0
  95. package/lib/typescript/src/camera/CaptureFlash.test.d.ts.map +1 -0
  96. package/lib/typescript/src/camera/Container.d.ts.map +1 -1
  97. package/lib/typescript/src/camera/FocusIndicator.d.ts.map +1 -1
  98. package/lib/typescript/src/camera/FocusIndicator.test.d.ts +2 -0
  99. package/lib/typescript/src/camera/FocusIndicator.test.d.ts.map +1 -0
  100. package/lib/typescript/src/camera/colors/dark.d.ts +18 -0
  101. package/lib/typescript/src/camera/colors/dark.d.ts.map +1 -0
  102. package/lib/typescript/src/camera/colors/dark.test.d.ts +2 -0
  103. package/lib/typescript/src/camera/colors/dark.test.d.ts.map +1 -0
  104. package/lib/typescript/src/camera/footer/ActionRow.d.ts +14 -0
  105. package/lib/typescript/src/camera/footer/ActionRow.d.ts.map +1 -0
  106. package/lib/typescript/src/camera/footer/ActionRow.test.d.ts +2 -0
  107. package/lib/typescript/src/camera/footer/ActionRow.test.d.ts.map +1 -0
  108. package/lib/typescript/src/camera/footer/FlipButton.d.ts +4 -0
  109. package/lib/typescript/src/camera/footer/FlipButton.d.ts.map +1 -0
  110. package/lib/typescript/src/camera/footer/FlipButton.test.d.ts +2 -0
  111. package/lib/typescript/src/camera/footer/FlipButton.test.d.ts.map +1 -0
  112. package/lib/typescript/src/camera/footer/ModeSwitcherPill.d.ts +10 -0
  113. package/lib/typescript/src/camera/footer/ModeSwitcherPill.d.ts.map +1 -0
  114. package/lib/typescript/src/camera/footer/ModeSwitcherPill.test.d.ts +2 -0
  115. package/lib/typescript/src/camera/footer/ModeSwitcherPill.test.d.ts.map +1 -0
  116. package/lib/typescript/src/camera/footer/RecordingTimer.d.ts +5 -0
  117. package/lib/typescript/src/camera/footer/RecordingTimer.d.ts.map +1 -0
  118. package/lib/typescript/src/camera/footer/RecordingTimer.test.d.ts +2 -0
  119. package/lib/typescript/src/camera/footer/RecordingTimer.test.d.ts.map +1 -0
  120. package/lib/typescript/src/camera/footer/Shutter.d.ts +9 -0
  121. package/lib/typescript/src/camera/footer/Shutter.d.ts.map +1 -0
  122. package/lib/typescript/src/camera/footer/Shutter.test.d.ts +2 -0
  123. package/lib/typescript/src/camera/footer/Shutter.test.d.ts.map +1 -0
  124. package/lib/typescript/src/camera/footer/ThumbnailStack.d.ts +8 -0
  125. package/lib/typescript/src/camera/footer/ThumbnailStack.d.ts.map +1 -0
  126. package/lib/typescript/src/camera/footer/ThumbnailStack.test.d.ts +2 -0
  127. package/lib/typescript/src/camera/footer/ThumbnailStack.test.d.ts.map +1 -0
  128. package/lib/typescript/src/camera/footer/ZoomChips.d.ts +5 -0
  129. package/lib/typescript/src/camera/footer/ZoomChips.d.ts.map +1 -0
  130. package/lib/typescript/src/camera/footer/ZoomChips.test.d.ts +2 -0
  131. package/lib/typescript/src/camera/footer/ZoomChips.test.d.ts.map +1 -0
  132. package/lib/typescript/src/camera/footer/index.d.ts +7 -1
  133. package/lib/typescript/src/camera/footer/index.d.ts.map +1 -1
  134. package/lib/typescript/src/camera/icons/VolumeIcon.d.ts +8 -0
  135. package/lib/typescript/src/camera/icons/VolumeIcon.d.ts.map +1 -0
  136. package/lib/typescript/src/camera/icons/VolumeIcon.test.d.ts +2 -0
  137. package/lib/typescript/src/camera/icons/VolumeIcon.test.d.ts.map +1 -0
  138. package/lib/typescript/src/camera/index.d.ts +3 -1
  139. package/lib/typescript/src/camera/index.d.ts.map +1 -1
  140. package/lib/typescript/src/camera/preview/PreviewBottomBar.d.ts +12 -0
  141. package/lib/typescript/src/camera/preview/PreviewBottomBar.d.ts.map +1 -0
  142. package/lib/typescript/src/camera/preview/PreviewBottomBar.test.d.ts +2 -0
  143. package/lib/typescript/src/camera/preview/PreviewBottomBar.test.d.ts.map +1 -0
  144. package/lib/typescript/src/camera/preview/PreviewOverlay.d.ts +12 -0
  145. package/lib/typescript/src/camera/preview/PreviewOverlay.d.ts.map +1 -0
  146. package/lib/typescript/src/camera/preview/PreviewOverlay.test.d.ts +2 -0
  147. package/lib/typescript/src/camera/preview/PreviewOverlay.test.d.ts.map +1 -0
  148. package/lib/typescript/src/camera/preview/PreviewTopBar.d.ts +10 -0
  149. package/lib/typescript/src/camera/preview/PreviewTopBar.d.ts.map +1 -0
  150. package/lib/typescript/src/camera/preview/PreviewTopBar.test.d.ts +2 -0
  151. package/lib/typescript/src/camera/preview/PreviewTopBar.test.d.ts.map +1 -0
  152. package/lib/typescript/src/camera/preview/groupTypes.d.ts +4 -0
  153. package/lib/typescript/src/camera/preview/groupTypes.d.ts.map +1 -0
  154. package/lib/typescript/src/camera/preview/groupTypes.test.d.ts +2 -0
  155. package/lib/typescript/src/camera/preview/groupTypes.test.d.ts.map +1 -0
  156. package/lib/typescript/src/camera/preview/index.d.ts +3 -4
  157. package/lib/typescript/src/camera/preview/index.d.ts.map +1 -1
  158. package/lib/typescript/src/camera/setup/SideRail.d.ts +15 -0
  159. package/lib/typescript/src/camera/setup/SideRail.d.ts.map +1 -0
  160. package/lib/typescript/src/camera/setup/SideRail.test.d.ts +2 -0
  161. package/lib/typescript/src/camera/setup/SideRail.test.d.ts.map +1 -0
  162. package/lib/typescript/src/camera/setup/index.d.ts +2 -1
  163. package/lib/typescript/src/camera/setup/index.d.ts.map +1 -1
  164. package/lib/typescript/src/components/Carousel/SlideItem.d.ts.map +1 -1
  165. package/lib/typescript/src/components/Carousel/SlideItem.test.d.ts +2 -0
  166. package/lib/typescript/src/components/Carousel/SlideItem.test.d.ts.map +1 -0
  167. package/lib/typescript/src/components/VideoPlayer.d.ts +4 -0
  168. package/lib/typescript/src/components/VideoPlayer.d.ts.map +1 -0
  169. package/lib/typescript/src/components/VideoPlayer.test.d.ts +2 -0
  170. package/lib/typescript/src/components/VideoPlayer.test.d.ts.map +1 -0
  171. package/lib/typescript/src/components/index.d.ts +0 -1
  172. package/lib/typescript/src/components/index.d.ts.map +1 -1
  173. package/lib/typescript/src/hooks/index.d.ts +0 -1
  174. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  175. package/package.json +4 -2
  176. package/src/camera/Camera.tsx +117 -26
  177. package/src/camera/CaptureFlash.test.tsx +11 -0
  178. package/src/camera/CaptureFlash.tsx +42 -0
  179. package/src/camera/Container.tsx +158 -64
  180. package/src/camera/FocusIndicator.test.tsx +17 -0
  181. package/src/camera/FocusIndicator.tsx +111 -27
  182. package/src/camera/colors/dark.test.ts +8 -0
  183. package/src/camera/colors/dark.ts +19 -0
  184. package/src/camera/footer/ActionRow.test.tsx +44 -0
  185. package/src/camera/footer/ActionRow.tsx +80 -0
  186. package/src/camera/footer/FlipButton.test.tsx +9 -0
  187. package/src/camera/footer/FlipButton.tsx +22 -0
  188. package/src/camera/footer/ModeSwitcherPill.test.tsx +29 -0
  189. package/src/camera/footer/ModeSwitcherPill.tsx +97 -0
  190. package/src/camera/footer/RecordingTimer.test.tsx +14 -0
  191. package/src/camera/footer/RecordingTimer.tsx +58 -0
  192. package/src/camera/footer/Shutter.test.tsx +26 -0
  193. package/src/camera/footer/Shutter.tsx +71 -0
  194. package/src/camera/footer/ThumbnailStack.test.tsx +19 -0
  195. package/src/camera/footer/ThumbnailStack.tsx +58 -0
  196. package/src/camera/footer/ZoomChips.test.tsx +9 -0
  197. package/src/camera/footer/ZoomChips.tsx +53 -0
  198. package/src/camera/footer/index.tsx +7 -1
  199. package/src/camera/icons/VolumeIcon.test.tsx +9 -0
  200. package/src/camera/icons/VolumeIcon.tsx +39 -0
  201. package/src/camera/index.tsx +11 -1
  202. package/src/camera/preview/PreviewBottomBar.test.tsx +43 -0
  203. package/src/camera/preview/PreviewBottomBar.tsx +79 -0
  204. package/src/camera/preview/PreviewOverlay.test.tsx +45 -0
  205. package/src/camera/preview/PreviewOverlay.tsx +99 -0
  206. package/src/camera/preview/PreviewTopBar.test.tsx +46 -0
  207. package/src/camera/preview/PreviewTopBar.tsx +91 -0
  208. package/src/camera/preview/groupTypes.test.ts +34 -0
  209. package/src/camera/preview/groupTypes.ts +15 -0
  210. package/src/camera/preview/index.tsx +3 -4
  211. package/src/camera/setup/SideRail.test.tsx +37 -0
  212. package/src/camera/setup/SideRail.tsx +161 -0
  213. package/src/camera/setup/index.tsx +2 -1
  214. package/src/components/Carousel/SlideItem.test.tsx +27 -0
  215. package/src/components/Carousel/SlideItem.tsx +11 -7
  216. package/src/components/VideoPlayer.test.tsx +8 -0
  217. package/src/components/VideoPlayer.tsx +30 -0
  218. package/src/components/index.tsx +0 -1
  219. package/src/hooks/index.ts +0 -1
  220. package/lib/module/camera/footer/Footer.js +0 -94
  221. package/lib/module/camera/footer/Footer.js.map +0 -1
  222. package/lib/module/camera/preview/PreView.js +0 -43
  223. package/lib/module/camera/preview/PreView.js.map +0 -1
  224. package/lib/module/camera/preview/PreViewContainer.js +0 -33
  225. package/lib/module/camera/preview/PreViewContainer.js.map +0 -1
  226. package/lib/module/camera/preview/PreviewFooter.js +0 -36
  227. package/lib/module/camera/preview/PreviewFooter.js.map +0 -1
  228. package/lib/module/camera/preview/SinglePre.js +0 -32
  229. package/lib/module/camera/preview/SinglePre.js.map +0 -1
  230. package/lib/module/camera/setup/SetUp.js +0 -74
  231. package/lib/module/camera/setup/SetUp.js.map +0 -1
  232. package/lib/module/components/PreviewThumbnail.js +0 -39
  233. package/lib/module/components/PreviewThumbnail.js.map +0 -1
  234. package/lib/module/hooks/useConfirm.js +0 -16
  235. package/lib/module/hooks/useConfirm.js.map +0 -1
  236. package/lib/typescript/src/camera/footer/Footer.d.ts +0 -14
  237. package/lib/typescript/src/camera/footer/Footer.d.ts.map +0 -1
  238. package/lib/typescript/src/camera/preview/PreView.d.ts +0 -7
  239. package/lib/typescript/src/camera/preview/PreView.d.ts.map +0 -1
  240. package/lib/typescript/src/camera/preview/PreViewContainer.d.ts +0 -9
  241. package/lib/typescript/src/camera/preview/PreViewContainer.d.ts.map +0 -1
  242. package/lib/typescript/src/camera/preview/PreviewFooter.d.ts +0 -7
  243. package/lib/typescript/src/camera/preview/PreviewFooter.d.ts.map +0 -1
  244. package/lib/typescript/src/camera/preview/SinglePre.d.ts +0 -7
  245. package/lib/typescript/src/camera/preview/SinglePre.d.ts.map +0 -1
  246. package/lib/typescript/src/camera/setup/SetUp.d.ts +0 -13
  247. package/lib/typescript/src/camera/setup/SetUp.d.ts.map +0 -1
  248. package/lib/typescript/src/components/PreviewThumbnail.d.ts +0 -9
  249. package/lib/typescript/src/components/PreviewThumbnail.d.ts.map +0 -1
  250. package/lib/typescript/src/hooks/useConfirm.d.ts +0 -2
  251. package/lib/typescript/src/hooks/useConfirm.d.ts.map +0 -1
  252. package/src/camera/footer/Footer.tsx +0 -113
  253. package/src/camera/preview/PreView.tsx +0 -32
  254. package/src/camera/preview/PreViewContainer.tsx +0 -30
  255. package/src/camera/preview/PreviewFooter.tsx +0 -38
  256. package/src/camera/preview/SinglePre.tsx +0 -30
  257. package/src/camera/setup/SetUp.tsx +0 -93
  258. package/src/components/PreviewThumbnail.tsx +0 -45
  259. 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__*/_jsxs(View, {
176
- style: [styles.frame, {
177
- width: frameW,
178
- height: frameH
179
- }],
180
- children: [/*#__PURE__*/_jsx(VisionCamera, {
181
- ref: cameraRef,
182
- style: StyleSheet.absoluteFill,
183
- resizeMode: "cover",
184
- device: device,
185
- isActive: isActive,
186
- outputs: outputs,
187
- constraints: [{
188
- photoHDR: false
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
- zoom: zoom,
191
- torchMode: currentMode.mode === 'video' && flash === 'on' ? 'on' : 'off',
192
- onSubjectAreaChanged: () => cameraRef.current?.resetFocus(),
193
- nativeID: "vision-camera"
194
- }), focusPoint && /*#__PURE__*/_jsx(FocusIndicator, {
195
- point: focusPoint,
196
- onAnimationEnd: () => setFocusPoint(null)
197
- }, `${focusPoint.x}-${focusPoint.y}`)]
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 { PreViewContainer } from "./preview/index.js";
12
- import { Footer } from "./footer/index.js";
13
- import { SetUp } from "./setup/index.js";
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(r => {
27
+ const settle = useCallback(result => {
22
28
  if (settledRef.current) return;
23
29
  settledRef.current = true;
24
- onSettle(r);
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;单 'wide-angle' 规避 iOS #3773
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 device = useCameraDevice(initialPosition, {
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
- const [flash, setFlash] = useState('off');
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 zoomShared = useSharedValue(NEUTRAL_ZOOM);
77
- const [lensLabel, setLensLabel] = useState(`${NEUTRAL_ZOOM.toFixed(1)}x`);
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
- setPhotos([f]);
88
- setPreviewing(true);
89
- } else {
90
- settle({
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
- if (currentMode?.mode !== 'continuous') {
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(PreViewContainer, {
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
- onConfirm: () => settle({
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 onToggleLens = () => {
163
- if (lensLabel.startsWith(device.minZoom.toFixed(1))) {
164
- zoomShared.value = NEUTRAL_ZOOM;
165
- setLensLabel(`${NEUTRAL_ZOOM.toFixed(1)}x`);
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
- }), !previewing && /*#__PURE__*/_jsx(SetUp, {
182
- flash: flash,
183
- aspectRatio: aspectRatio,
184
- onChangeFlash: setFlash,
185
- onChangeAspectRatio: setAspectRatio,
186
- onToggleLens: onToggleLens,
187
- lensLabel: lensLabel
188
- }), /*#__PURE__*/_jsx(Footer, {
189
- modes: config.cameraMode,
190
- currentIndex: modeIndex,
191
- recording: recording,
192
- onShutter: onShutter,
193
- onSelectMode: i => {
194
- if (config.dataRetainedMode === 'clear' && i !== modeIndex) {
195
- setPhotos([]);
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
- setModeIndex(i);
198
- },
199
- onCancel: () => settle({
200
- code: 0,
201
- data: [],
202
- message: 'cancelled'
203
- }),
204
- onFinishBurst: currentMode?.mode === 'continuous' ? () => setPreviewing(true) : undefined,
205
- burstCount: currentMode?.mode === 'continuous' ? photos.length : undefined
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
- // 相机主容器固定黑底:相机 UX 惯例(预览 / 拍照取景需要黑底凸显),
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