@unif/react-native-camera 1.0.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 (348) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +29 -0
  3. package/UnifRNCamera.podspec +41 -0
  4. package/android/CMakeLists.txt +15 -0
  5. package/android/build.gradle +124 -0
  6. package/android/cpp-adapter.cpp +8 -0
  7. package/android/gradle.properties +5 -0
  8. package/android/src/main/AndroidManifest.xml +3 -0
  9. package/android/src/main/AndroidManifestNew.xml +2 -0
  10. package/android/src/main/java/com/unif/reactnativecamera/ReactNativeCameraModule.java +34 -0
  11. package/android/src/main/java/com/unif/reactnativecamera/ReactNativeCameraPackage.java +45 -0
  12. package/android/src/newarch/ReactNativeCameraSpec.java +9 -0
  13. package/android/src/oldarch/ReactNativeCameraSpec.java +13 -0
  14. package/cpp/unif-react-native-camera.cpp +7 -0
  15. package/cpp/unif-react-native-camera.h +8 -0
  16. package/ios/ReactNativeCamera.h +15 -0
  17. package/ios/ReactNativeCamera.mm +51 -0
  18. package/lib/commonjs/NativeReactNativeCamera.js +17 -0
  19. package/lib/commonjs/NativeReactNativeCamera.js.map +1 -0
  20. package/lib/commonjs/assets/close.png +0 -0
  21. package/lib/commonjs/assets/home/record.png +0 -0
  22. package/lib/commonjs/assets/home/take.png +0 -0
  23. package/lib/commonjs/assets/preview/back.png +0 -0
  24. package/lib/commonjs/assets/preview/del.png +0 -0
  25. package/lib/commonjs/assets/preview/rotate.png +0 -0
  26. package/lib/commonjs/assets/preview/save.png +0 -0
  27. package/lib/commonjs/assets/tools/16_9.png +0 -0
  28. package/lib/commonjs/assets/tools/4_3.png +0 -0
  29. package/lib/commonjs/assets/tools/auto.png +0 -0
  30. package/lib/commonjs/assets/tools/defaultEye.png +0 -0
  31. package/lib/commonjs/assets/tools/enlarge.png +0 -0
  32. package/lib/commonjs/assets/tools/fishEye.png +0 -0
  33. package/lib/commonjs/assets/tools/narrow.png +0 -0
  34. package/lib/commonjs/assets/tools/off.png +0 -0
  35. package/lib/commonjs/assets/tools/on.png +0 -0
  36. package/lib/commonjs/assets/tools/screenRatio.png +0 -0
  37. package/lib/commonjs/assets/tools/volumeOff.png +0 -0
  38. package/lib/commonjs/assets/tools/volumeOn.png +0 -0
  39. package/lib/commonjs/camera/Camera.js +209 -0
  40. package/lib/commonjs/camera/Camera.js.map +1 -0
  41. package/lib/commonjs/camera/Container.js +64 -0
  42. package/lib/commonjs/camera/Container.js.map +1 -0
  43. package/lib/commonjs/camera/ModalView.js +37 -0
  44. package/lib/commonjs/camera/ModalView.js.map +1 -0
  45. package/lib/commonjs/camera/NoCamera.js +23 -0
  46. package/lib/commonjs/camera/NoCamera.js.map +1 -0
  47. package/lib/commonjs/camera/NoPermission.js +50 -0
  48. package/lib/commonjs/camera/NoPermission.js.map +1 -0
  49. package/lib/commonjs/camera/footer/Footer.js +155 -0
  50. package/lib/commonjs/camera/footer/Footer.js.map +1 -0
  51. package/lib/commonjs/camera/footer/index.js +14 -0
  52. package/lib/commonjs/camera/footer/index.js.map +1 -0
  53. package/lib/commonjs/camera/index.js +35 -0
  54. package/lib/commonjs/camera/index.js.map +1 -0
  55. package/lib/commonjs/camera/preview/PreView.js +105 -0
  56. package/lib/commonjs/camera/preview/PreView.js.map +1 -0
  57. package/lib/commonjs/camera/preview/PreViewContainer.js +41 -0
  58. package/lib/commonjs/camera/preview/PreViewContainer.js.map +1 -0
  59. package/lib/commonjs/camera/preview/PreviewFooter.js +35 -0
  60. package/lib/commonjs/camera/preview/PreviewFooter.js.map +1 -0
  61. package/lib/commonjs/camera/preview/SinglePre.js +69 -0
  62. package/lib/commonjs/camera/preview/SinglePre.js.map +1 -0
  63. package/lib/commonjs/camera/preview/index.js +28 -0
  64. package/lib/commonjs/camera/preview/index.js.map +1 -0
  65. package/lib/commonjs/camera/setup/SetUp.js +245 -0
  66. package/lib/commonjs/camera/setup/SetUp.js.map +1 -0
  67. package/lib/commonjs/camera/setup/index.js +14 -0
  68. package/lib/commonjs/camera/setup/index.js.map +1 -0
  69. package/lib/commonjs/components/Back.js +48 -0
  70. package/lib/commonjs/components/Back.js.map +1 -0
  71. package/lib/commonjs/components/Carousel/Carousel.js +51 -0
  72. package/lib/commonjs/components/Carousel/Carousel.js.map +1 -0
  73. package/lib/commonjs/components/Carousel/SlideItem.js +84 -0
  74. package/lib/commonjs/components/Carousel/SlideItem.js.map +1 -0
  75. package/lib/commonjs/components/Carousel/index.js +21 -0
  76. package/lib/commonjs/components/Carousel/index.js.map +1 -0
  77. package/lib/commonjs/components/Delete.js +36 -0
  78. package/lib/commonjs/components/Delete.js.map +1 -0
  79. package/lib/commonjs/components/Loading.js +75 -0
  80. package/lib/commonjs/components/Loading.js.map +1 -0
  81. package/lib/commonjs/components/Modal/Confirm.js +120 -0
  82. package/lib/commonjs/components/Modal/Confirm.js.map +1 -0
  83. package/lib/commonjs/components/Modal/index.js +14 -0
  84. package/lib/commonjs/components/Modal/index.js.map +1 -0
  85. package/lib/commonjs/components/PreviewThumbnail.js +44 -0
  86. package/lib/commonjs/components/PreviewThumbnail.js.map +1 -0
  87. package/lib/commonjs/components/Rotate.js +32 -0
  88. package/lib/commonjs/components/Rotate.js.map +1 -0
  89. package/lib/commonjs/components/Save.js +48 -0
  90. package/lib/commonjs/components/Save.js.map +1 -0
  91. package/lib/commonjs/components/index.js +73 -0
  92. package/lib/commonjs/components/index.js.map +1 -0
  93. package/lib/commonjs/hooks/index.js +21 -0
  94. package/lib/commonjs/hooks/index.js.map +1 -0
  95. package/lib/commonjs/hooks/useCamera.tsx/index.js +91 -0
  96. package/lib/commonjs/hooks/useCamera.tsx/index.js.map +1 -0
  97. package/lib/commonjs/hooks/useConfirm.js +61 -0
  98. package/lib/commonjs/hooks/useConfirm.js.map +1 -0
  99. package/lib/commonjs/hooks/useCreation/index.js +34 -0
  100. package/lib/commonjs/hooks/useCreation/index.js.map +1 -0
  101. package/lib/commonjs/index.js +39 -0
  102. package/lib/commonjs/index.js.map +1 -0
  103. package/lib/commonjs/utils/common.js +84 -0
  104. package/lib/commonjs/utils/common.js.map +1 -0
  105. package/lib/commonjs/utils/depsAreSame.js +14 -0
  106. package/lib/commonjs/utils/depsAreSame.js.map +1 -0
  107. package/lib/commonjs/utils/index.js +50 -0
  108. package/lib/commonjs/utils/index.js.map +1 -0
  109. package/lib/commonjs/utils/interface.js +25 -0
  110. package/lib/commonjs/utils/interface.js.map +1 -0
  111. package/lib/commonjs/utils/px-to-dp.js +21 -0
  112. package/lib/commonjs/utils/px-to-dp.js.map +1 -0
  113. package/lib/commonjs/utils/render-item.js +39 -0
  114. package/lib/commonjs/utils/render-item.js.map +1 -0
  115. package/lib/module/NativeReactNativeCamera.js +12 -0
  116. package/lib/module/NativeReactNativeCamera.js.map +1 -0
  117. package/lib/module/assets/close.png +0 -0
  118. package/lib/module/assets/home/record.png +0 -0
  119. package/lib/module/assets/home/take.png +0 -0
  120. package/lib/module/assets/preview/back.png +0 -0
  121. package/lib/module/assets/preview/del.png +0 -0
  122. package/lib/module/assets/preview/rotate.png +0 -0
  123. package/lib/module/assets/preview/save.png +0 -0
  124. package/lib/module/assets/tools/16_9.png +0 -0
  125. package/lib/module/assets/tools/4_3.png +0 -0
  126. package/lib/module/assets/tools/auto.png +0 -0
  127. package/lib/module/assets/tools/defaultEye.png +0 -0
  128. package/lib/module/assets/tools/enlarge.png +0 -0
  129. package/lib/module/assets/tools/fishEye.png +0 -0
  130. package/lib/module/assets/tools/narrow.png +0 -0
  131. package/lib/module/assets/tools/off.png +0 -0
  132. package/lib/module/assets/tools/on.png +0 -0
  133. package/lib/module/assets/tools/screenRatio.png +0 -0
  134. package/lib/module/assets/tools/volumeOff.png +0 -0
  135. package/lib/module/assets/tools/volumeOn.png +0 -0
  136. package/lib/module/camera/Camera.js +199 -0
  137. package/lib/module/camera/Camera.js.map +1 -0
  138. package/lib/module/camera/Container.js +56 -0
  139. package/lib/module/camera/Container.js.map +1 -0
  140. package/lib/module/camera/ModalView.js +29 -0
  141. package/lib/module/camera/ModalView.js.map +1 -0
  142. package/lib/module/camera/NoCamera.js +15 -0
  143. package/lib/module/camera/NoCamera.js.map +1 -0
  144. package/lib/module/camera/NoPermission.js +42 -0
  145. package/lib/module/camera/NoPermission.js.map +1 -0
  146. package/lib/module/camera/footer/Footer.js +148 -0
  147. package/lib/module/camera/footer/Footer.js.map +1 -0
  148. package/lib/module/camera/footer/index.js +3 -0
  149. package/lib/module/camera/footer/index.js.map +1 -0
  150. package/lib/module/camera/index.js +14 -0
  151. package/lib/module/camera/index.js.map +1 -0
  152. package/lib/module/camera/preview/PreView.js +96 -0
  153. package/lib/module/camera/preview/PreView.js.map +1 -0
  154. package/lib/module/camera/preview/PreViewContainer.js +33 -0
  155. package/lib/module/camera/preview/PreViewContainer.js.map +1 -0
  156. package/lib/module/camera/preview/PreviewFooter.js +27 -0
  157. package/lib/module/camera/preview/PreviewFooter.js.map +1 -0
  158. package/lib/module/camera/preview/SinglePre.js +61 -0
  159. package/lib/module/camera/preview/SinglePre.js.map +1 -0
  160. package/lib/module/camera/preview/index.js +13 -0
  161. package/lib/module/camera/preview/index.js.map +1 -0
  162. package/lib/module/camera/setup/SetUp.js +236 -0
  163. package/lib/module/camera/setup/SetUp.js.map +1 -0
  164. package/lib/module/camera/setup/index.js +3 -0
  165. package/lib/module/camera/setup/index.js.map +1 -0
  166. package/lib/module/components/Back.js +40 -0
  167. package/lib/module/components/Back.js.map +1 -0
  168. package/lib/module/components/Carousel/Carousel.js +43 -0
  169. package/lib/module/components/Carousel/Carousel.js.map +1 -0
  170. package/lib/module/components/Carousel/SlideItem.js +75 -0
  171. package/lib/module/components/Carousel/SlideItem.js.map +1 -0
  172. package/lib/module/components/Carousel/index.js +12 -0
  173. package/lib/module/components/Carousel/index.js.map +1 -0
  174. package/lib/module/components/Delete.js +28 -0
  175. package/lib/module/components/Delete.js.map +1 -0
  176. package/lib/module/components/Loading.js +67 -0
  177. package/lib/module/components/Loading.js.map +1 -0
  178. package/lib/module/components/Modal/Confirm.js +110 -0
  179. package/lib/module/components/Modal/Confirm.js.map +1 -0
  180. package/lib/module/components/Modal/index.js +3 -0
  181. package/lib/module/components/Modal/index.js.map +1 -0
  182. package/lib/module/components/PreviewThumbnail.js +36 -0
  183. package/lib/module/components/PreviewThumbnail.js.map +1 -0
  184. package/lib/module/components/Rotate.js +24 -0
  185. package/lib/module/components/Rotate.js.map +1 -0
  186. package/lib/module/components/Save.js +40 -0
  187. package/lib/module/components/Save.js.map +1 -0
  188. package/lib/module/components/index.js +9 -0
  189. package/lib/module/components/index.js.map +1 -0
  190. package/lib/module/hooks/index.js +12 -0
  191. package/lib/module/hooks/index.js.map +1 -0
  192. package/lib/module/hooks/useCamera.tsx/index.js +82 -0
  193. package/lib/module/hooks/useCamera.tsx/index.js.map +1 -0
  194. package/lib/module/hooks/useConfirm.js +52 -0
  195. package/lib/module/hooks/useConfirm.js.map +1 -0
  196. package/lib/module/hooks/useCreation/index.js +27 -0
  197. package/lib/module/hooks/useCreation/index.js.map +1 -0
  198. package/lib/module/index.js +26 -0
  199. package/lib/module/index.js.map +1 -0
  200. package/lib/module/utils/common.js +76 -0
  201. package/lib/module/utils/common.js.map +1 -0
  202. package/lib/module/utils/depsAreSame.js +8 -0
  203. package/lib/module/utils/depsAreSame.js.map +1 -0
  204. package/lib/module/utils/index.js +13 -0
  205. package/lib/module/utils/index.js.map +1 -0
  206. package/lib/module/utils/interface.js +24 -0
  207. package/lib/module/utils/interface.js.map +1 -0
  208. package/lib/module/utils/px-to-dp.js +15 -0
  209. package/lib/module/utils/px-to-dp.js.map +1 -0
  210. package/lib/module/utils/render-item.js +31 -0
  211. package/lib/module/utils/render-item.js.map +1 -0
  212. package/lib/typescript/src/NativeReactNativeCamera.d.ts +6 -0
  213. package/lib/typescript/src/NativeReactNativeCamera.d.ts.map +1 -0
  214. package/lib/typescript/src/camera/Camera.d.ts +13 -0
  215. package/lib/typescript/src/camera/Camera.d.ts.map +1 -0
  216. package/lib/typescript/src/camera/Container.d.ts +6 -0
  217. package/lib/typescript/src/camera/Container.d.ts.map +1 -0
  218. package/lib/typescript/src/camera/ModalView.d.ts +6 -0
  219. package/lib/typescript/src/camera/ModalView.d.ts.map +1 -0
  220. package/lib/typescript/src/camera/NoCamera.d.ts +4 -0
  221. package/lib/typescript/src/camera/NoCamera.d.ts.map +1 -0
  222. package/lib/typescript/src/camera/NoPermission.d.ts +4 -0
  223. package/lib/typescript/src/camera/NoPermission.d.ts.map +1 -0
  224. package/lib/typescript/src/camera/footer/Footer.d.ts +16 -0
  225. package/lib/typescript/src/camera/footer/Footer.d.ts.map +1 -0
  226. package/lib/typescript/src/camera/footer/index.d.ts +3 -0
  227. package/lib/typescript/src/camera/footer/index.d.ts.map +1 -0
  228. package/lib/typescript/src/camera/index.d.ts +6 -0
  229. package/lib/typescript/src/camera/index.d.ts.map +1 -0
  230. package/lib/typescript/src/camera/preview/PreView.d.ts +10 -0
  231. package/lib/typescript/src/camera/preview/PreView.d.ts.map +1 -0
  232. package/lib/typescript/src/camera/preview/PreViewContainer.d.ts +6 -0
  233. package/lib/typescript/src/camera/preview/PreViewContainer.d.ts.map +1 -0
  234. package/lib/typescript/src/camera/preview/PreviewFooter.d.ts +7 -0
  235. package/lib/typescript/src/camera/preview/PreviewFooter.d.ts.map +1 -0
  236. package/lib/typescript/src/camera/preview/SinglePre.d.ts +28 -0
  237. package/lib/typescript/src/camera/preview/SinglePre.d.ts.map +1 -0
  238. package/lib/typescript/src/camera/preview/index.d.ts +5 -0
  239. package/lib/typescript/src/camera/preview/index.d.ts.map +1 -0
  240. package/lib/typescript/src/camera/setup/SetUp.d.ts +12 -0
  241. package/lib/typescript/src/camera/setup/SetUp.d.ts.map +1 -0
  242. package/lib/typescript/src/camera/setup/index.d.ts +3 -0
  243. package/lib/typescript/src/camera/setup/index.d.ts.map +1 -0
  244. package/lib/typescript/src/components/Back.d.ts +20 -0
  245. package/lib/typescript/src/components/Back.d.ts.map +1 -0
  246. package/lib/typescript/src/components/Carousel/Carousel.d.ts +10 -0
  247. package/lib/typescript/src/components/Carousel/Carousel.d.ts.map +1 -0
  248. package/lib/typescript/src/components/Carousel/SlideItem.d.ts +13 -0
  249. package/lib/typescript/src/components/Carousel/SlideItem.d.ts.map +1 -0
  250. package/lib/typescript/src/components/Carousel/index.d.ts +4 -0
  251. package/lib/typescript/src/components/Carousel/index.d.ts.map +1 -0
  252. package/lib/typescript/src/components/Delete.d.ts +7 -0
  253. package/lib/typescript/src/components/Delete.d.ts.map +1 -0
  254. package/lib/typescript/src/components/Loading.d.ts +4 -0
  255. package/lib/typescript/src/components/Loading.d.ts.map +1 -0
  256. package/lib/typescript/src/components/Modal/Confirm.d.ts +9 -0
  257. package/lib/typescript/src/components/Modal/Confirm.d.ts.map +1 -0
  258. package/lib/typescript/src/components/Modal/index.d.ts +3 -0
  259. package/lib/typescript/src/components/Modal/index.d.ts.map +1 -0
  260. package/lib/typescript/src/components/PreviewThumbnail.d.ts +10 -0
  261. package/lib/typescript/src/components/PreviewThumbnail.d.ts.map +1 -0
  262. package/lib/typescript/src/components/Rotate.d.ts +9 -0
  263. package/lib/typescript/src/components/Rotate.d.ts.map +1 -0
  264. package/lib/typescript/src/components/Save.d.ts +20 -0
  265. package/lib/typescript/src/components/Save.d.ts.map +1 -0
  266. package/lib/typescript/src/components/index.d.ts +9 -0
  267. package/lib/typescript/src/components/index.d.ts.map +1 -0
  268. package/lib/typescript/src/hooks/index.d.ts +4 -0
  269. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  270. package/lib/typescript/src/hooks/useCamera.tsx/index.d.ts +5 -0
  271. package/lib/typescript/src/hooks/useCamera.tsx/index.d.ts.map +1 -0
  272. package/lib/typescript/src/hooks/useConfirm.d.ts +6 -0
  273. package/lib/typescript/src/hooks/useConfirm.d.ts.map +1 -0
  274. package/lib/typescript/src/hooks/useCreation/index.d.ts +3 -0
  275. package/lib/typescript/src/hooks/useCreation/index.d.ts.map +1 -0
  276. package/lib/typescript/src/index.d.ts +5 -0
  277. package/lib/typescript/src/index.d.ts.map +1 -0
  278. package/lib/typescript/src/utils/common.d.ts +20 -0
  279. package/lib/typescript/src/utils/common.d.ts.map +1 -0
  280. package/lib/typescript/src/utils/depsAreSame.d.ts +3 -0
  281. package/lib/typescript/src/utils/depsAreSame.d.ts.map +1 -0
  282. package/lib/typescript/src/utils/index.d.ts +5 -0
  283. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  284. package/lib/typescript/src/utils/interface.d.ts +64 -0
  285. package/lib/typescript/src/utils/interface.d.ts.map +1 -0
  286. package/lib/typescript/src/utils/px-to-dp.d.ts +4 -0
  287. package/lib/typescript/src/utils/px-to-dp.d.ts.map +1 -0
  288. package/lib/typescript/src/utils/render-item.d.ts +10 -0
  289. package/lib/typescript/src/utils/render-item.d.ts.map +1 -0
  290. package/package.json +183 -0
  291. package/src/NativeReactNativeCamera.ts +15 -0
  292. package/src/assets/close.png +0 -0
  293. package/src/assets/home/record.png +0 -0
  294. package/src/assets/home/take.png +0 -0
  295. package/src/assets/preview/back.png +0 -0
  296. package/src/assets/preview/del.png +0 -0
  297. package/src/assets/preview/rotate.png +0 -0
  298. package/src/assets/preview/save.png +0 -0
  299. package/src/assets/tools/16_9.png +0 -0
  300. package/src/assets/tools/4_3.png +0 -0
  301. package/src/assets/tools/auto.png +0 -0
  302. package/src/assets/tools/defaultEye.png +0 -0
  303. package/src/assets/tools/enlarge.png +0 -0
  304. package/src/assets/tools/fishEye.png +0 -0
  305. package/src/assets/tools/narrow.png +0 -0
  306. package/src/assets/tools/off.png +0 -0
  307. package/src/assets/tools/on.png +0 -0
  308. package/src/assets/tools/screenRatio.png +0 -0
  309. package/src/assets/tools/volumeOff.png +0 -0
  310. package/src/assets/tools/volumeOn.png +0 -0
  311. package/src/camera/Camera.tsx +236 -0
  312. package/src/camera/Container.tsx +60 -0
  313. package/src/camera/ModalView.tsx +28 -0
  314. package/src/camera/NoCamera.tsx +16 -0
  315. package/src/camera/NoPermission.tsx +43 -0
  316. package/src/camera/footer/Footer.tsx +196 -0
  317. package/src/camera/footer/index.tsx +2 -0
  318. package/src/camera/index.tsx +13 -0
  319. package/src/camera/preview/PreView.tsx +111 -0
  320. package/src/camera/preview/PreViewContainer.tsx +33 -0
  321. package/src/camera/preview/PreviewFooter.tsx +32 -0
  322. package/src/camera/preview/SinglePre.tsx +66 -0
  323. package/src/camera/preview/index.tsx +13 -0
  324. package/src/camera/setup/SetUp.tsx +273 -0
  325. package/src/camera/setup/index.tsx +3 -0
  326. package/src/components/Back.tsx +37 -0
  327. package/src/components/Carousel/Carousel.tsx +49 -0
  328. package/src/components/Carousel/SlideItem.tsx +95 -0
  329. package/src/components/Carousel/index.tsx +13 -0
  330. package/src/components/Delete.tsx +30 -0
  331. package/src/components/Loading.tsx +76 -0
  332. package/src/components/Modal/Confirm.tsx +115 -0
  333. package/src/components/Modal/index.tsx +3 -0
  334. package/src/components/PreviewThumbnail.tsx +40 -0
  335. package/src/components/Rotate.tsx +32 -0
  336. package/src/components/Save.tsx +37 -0
  337. package/src/components/index.tsx +8 -0
  338. package/src/hooks/index.ts +12 -0
  339. package/src/hooks/useCamera.tsx/index.tsx +96 -0
  340. package/src/hooks/useConfirm.tsx +58 -0
  341. package/src/hooks/useCreation/index.ts +25 -0
  342. package/src/index.tsx +38 -0
  343. package/src/utils/common.ts +85 -0
  344. package/src/utils/depsAreSame.ts +12 -0
  345. package/src/utils/index.ts +12 -0
  346. package/src/utils/interface.ts +90 -0
  347. package/src/utils/px-to-dp.tsx +12 -0
  348. package/src/utils/render-item.tsx +38 -0
@@ -0,0 +1,236 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-09 16:27:07
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-20 14:59:37
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { StyleSheet } from 'react-native';
10
+ import React, { useEffect, useRef, useState } from 'react';
11
+ import {
12
+ Camera as VisionCamera,
13
+ useCameraDevice,
14
+ useCameraFormat,
15
+ } from 'react-native-vision-camera';
16
+ import NoCamera from './NoCamera';
17
+
18
+ import {
19
+ type CameraBack,
20
+ type CameraMode,
21
+ type CameraProps,
22
+ type CameraType,
23
+ type CustomPhotoFile,
24
+ type FlashMode,
25
+ } from '../utils';
26
+ import { Footer } from './footer';
27
+ import { SetUp } from './setup';
28
+ import { PreView, PreViewContainer, SinglePre } from './preview';
29
+ import { SAFE_AREA_PADDING } from '../utils';
30
+ import { GestureHandlerRootView } from 'react-native-gesture-handler';
31
+ import { useConfirm } from '../hooks';
32
+
33
+ export const PhotoAspectRatio: { [key: number]: number } = {
34
+ 4: 4 / 3,
35
+ 16: 16 / 9,
36
+ };
37
+
38
+ let enableShutterSound = false;
39
+ let flash: FlashMode = 'off';
40
+ const Camera: React.FC<{
41
+ data: CameraProps;
42
+ visible: boolean;
43
+ back: () => void;
44
+ onChange: (data: CameraBack) => void;
45
+ }> = ({ visible, data, back, onChange }) => {
46
+ const { cameraMode, dataRetainedMode } = data;
47
+
48
+ const [position, setPosition] = useState<CameraType>('front');
49
+ const [isActive, setIsActive] = useState(false);
50
+ const [preVis, setPreVis] = useState(false);
51
+
52
+ const device = useCameraDevice(position, {
53
+ physicalDevices: [
54
+ 'ultra-wide-angle-camera',
55
+ 'wide-angle-camera',
56
+ 'telephoto-camera',
57
+ ],
58
+ });
59
+
60
+ const [aspectRatio, setAspectRatio] = useState<number>(16);
61
+ const [resizeMode, setResizeMode] = useState<
62
+ 'cover' | 'contain' | undefined
63
+ >();
64
+
65
+ const [zoom, setZoom] = useState(device?.neutralZoom);
66
+
67
+ const format = useCameraFormat(device, [
68
+ { photoAspectRatio: PhotoAspectRatio[aspectRatio] },
69
+ { videoAspectRatio: PhotoAspectRatio[aspectRatio] },
70
+ ]);
71
+ const camera = useRef<VisionCamera>(null);
72
+ const [photos, setPhotos] = useState<CustomPhotoFile[]>([]);
73
+ const [mode, setMode] = useState(cameraMode[0]?.mode as CameraMode);
74
+
75
+ const { confirmApi, contextHolder } = useConfirm();
76
+
77
+ useEffect(() => {
78
+ setIsActive(visible);
79
+ }, [visible]);
80
+
81
+ if (device == null) {
82
+ return <NoCamera />;
83
+ }
84
+
85
+ const commonBack = () => {
86
+ setPreVis(false);
87
+ setIsActive(true);
88
+ };
89
+ const signleBack = () => {
90
+ setPhotos([]);
91
+ commonBack();
92
+ };
93
+
94
+ const isSingle = () => dataRetainedMode === 'clear' && mode === 'single';
95
+ const showPreview = () => {
96
+ setIsActive(false);
97
+ setPreVis(true);
98
+ };
99
+ const showVideo = () => cameraMode.some((item) => item.mode === 'video');
100
+
101
+ const confirm = () => {
102
+ onChange({
103
+ code: 200,
104
+ data: photos.map((item) => ({
105
+ id: new Date().getTime().toString(),
106
+ file: item.path,
107
+ cameraType: position,
108
+ })),
109
+ message: '保存成功',
110
+ });
111
+ };
112
+ return (
113
+ <GestureHandlerRootView>
114
+ <VisionCamera
115
+ zoom={zoom}
116
+ format={format}
117
+ ref={camera}
118
+ style={styles.camera}
119
+ device={device}
120
+ isActive={isActive}
121
+ enableZoomGesture={true}
122
+ photoQualityBalance="balanced"
123
+ photo={cameraMode.some(
124
+ (item) => item.mode === 'single' || item.mode === 'continuous'
125
+ )}
126
+ video={showVideo()}
127
+ audio={showVideo()}
128
+ resizeMode={resizeMode}
129
+ />
130
+
131
+ <SetUp
132
+ isMultiCam={device?.isMultiCam}
133
+ onChange={(val) => (flash = val)}
134
+ onAspectRationChange={setAspectRatio}
135
+ onScreenChange={setResizeMode}
136
+ onVolumeChange={(val) => (enableShutterSound = val)}
137
+ onFishEyeOpen={(val) => {
138
+ if (val === 'fishEye') {
139
+ setZoom(device.minZoom);
140
+ }
141
+ if (val === 'default') {
142
+ setZoom(device.neutralZoom);
143
+ }
144
+ }}
145
+ />
146
+ <Footer
147
+ cameraMode={cameraMode}
148
+ photos={photos}
149
+ backPress={async () => {
150
+ if (photos.length > 0) {
151
+ const isBack = await confirmApi.open({
152
+ text: '返回会清空已拍摄数据,请确认!',
153
+ });
154
+ if (isBack) {
155
+ back();
156
+ }
157
+ } else {
158
+ back();
159
+ }
160
+ }}
161
+ thumbnailPress={showPreview}
162
+ onChange={(val) => {
163
+ if (dataRetainedMode === 'clear') {
164
+ setPhotos([]);
165
+ }
166
+ setMode(val);
167
+ }}
168
+ takePress={async () => {
169
+ const photo = await camera.current?.takePhoto({
170
+ flash,
171
+ enableShutterSound: enableShutterSound,
172
+ });
173
+ if (photo) {
174
+ setPhotos((p) => [...p, { ...photo, mode }]);
175
+ }
176
+ if (isSingle()) {
177
+ showPreview();
178
+ }
179
+ }}
180
+ savePress={() => {
181
+ confirm();
182
+ }}
183
+ rotatePress={() => {
184
+ setPosition((val) => {
185
+ if (val === 'back') {
186
+ return 'front';
187
+ }
188
+ return 'back';
189
+ });
190
+ }}
191
+ />
192
+
193
+ <PreViewContainer visible={preVis}>
194
+ {isSingle() ? (
195
+ <SinglePre
196
+ uri={photos[0]?.path as string}
197
+ onBack={() => signleBack()}
198
+ onSave={() => confirm()}
199
+ />
200
+ ) : (
201
+ <PreView
202
+ cameraMode={cameraMode}
203
+ data={photos}
204
+ onBack={() => commonBack()}
205
+ onDel={async (snapItem) => {
206
+ const isConfirm = await confirmApi.open({
207
+ text: '图片删除后无法恢复,请确认!',
208
+ });
209
+ if (isConfirm) {
210
+ setPhotos((photoList) => {
211
+ return photoList.filter(
212
+ (photo) => photo.path !== snapItem?.path
213
+ );
214
+ });
215
+ return isConfirm;
216
+ }
217
+ return isConfirm;
218
+ }}
219
+ />
220
+ )}
221
+ </PreViewContainer>
222
+ {contextHolder}
223
+ </GestureHandlerRootView>
224
+ );
225
+ };
226
+
227
+ export default Camera;
228
+
229
+ const styles = StyleSheet.create({
230
+ camera: { flex: 1 },
231
+ captureButton: {
232
+ position: 'absolute',
233
+ alignSelf: 'center',
234
+ bottom: SAFE_AREA_PADDING.paddingBottom,
235
+ },
236
+ });
@@ -0,0 +1,60 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-12-02 11:24:47
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-16 09:33:14
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import {
10
+ Image,
11
+ SafeAreaView,
12
+ StyleSheet,
13
+ TouchableNativeFeedback,
14
+ View,
15
+ } from 'react-native';
16
+ import React, { type FC, type PropsWithChildren } from 'react';
17
+
18
+ const Container: FC<PropsWithChildren<{ onCancel?: () => void }>> = ({
19
+ children,
20
+ onCancel,
21
+ }) => {
22
+ return (
23
+ <SafeAreaView style={styles.container}>
24
+ <View style={styles.headerContainer}>
25
+ <TouchableNativeFeedback onPress={onCancel}>
26
+ <Image style={styles.img} source={require('../assets/close.png')} />
27
+ </TouchableNativeFeedback>
28
+ </View>
29
+ <View style={styles.children}>{children}</View>
30
+ </SafeAreaView>
31
+ );
32
+ };
33
+
34
+ export default Container;
35
+
36
+ const styles = StyleSheet.create({
37
+ modal: {
38
+ flex: 1,
39
+ margin: 0,
40
+ backgroundColor: '#fff',
41
+ },
42
+ container: { flex: 1 },
43
+ headerContainer: {
44
+ marginHorizontal: 12,
45
+ marginBottom: 12,
46
+ height: 25,
47
+ display: 'flex',
48
+ alignItems: 'flex-end',
49
+ },
50
+ img: {
51
+ width: 25,
52
+ height: 25,
53
+ },
54
+ children: {
55
+ display: 'flex',
56
+ flex: 1,
57
+ justifyContent: 'center',
58
+ alignItems: 'center',
59
+ },
60
+ });
@@ -0,0 +1,28 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-10 10:56:25
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-18 13:52:49
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { Modal, StyleSheet } from 'react-native';
10
+ import React from 'react';
11
+
12
+ const ModalView: React.FC<{ visible: boolean }> = ({ children, visible }) => {
13
+ return (
14
+ <Modal style={styles.modal} animationType="slide" visible={visible}>
15
+ {children}
16
+ </Modal>
17
+ );
18
+ };
19
+
20
+ export default ModalView;
21
+
22
+ const styles = StyleSheet.create({
23
+ modal: {
24
+ flex: 1,
25
+ margin: 0,
26
+ backgroundColor: '#000',
27
+ },
28
+ });
@@ -0,0 +1,16 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-10 10:56:25
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-01-17 16:34:19
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { Text } from 'react-native';
10
+ import React from 'react';
11
+
12
+ const NoCamera: React.FC = () => {
13
+ return <Text>未检测到摄像头!</Text>;
14
+ };
15
+
16
+ export default NoCamera;
@@ -0,0 +1,43 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-10 10:56:25
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-01-16 13:55:15
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { Linking, View, Text, StyleSheet } from 'react-native';
10
+ import React from 'react';
11
+
12
+ const NoPermission: React.FC = () => {
13
+ return (
14
+ <View>
15
+ <View>
16
+ <Text style={{ ...styles.fontSize }}>未获得授权,</Text>
17
+ </View>
18
+ <View>
19
+ <Text style={{ ...styles.fontSize }}>
20
+ 需要访问相机或麦克风权限,
21
+ <Text
22
+ style={{ ...styles.fontSize, ...styles.on }}
23
+ onPress={async () => {
24
+ const res = await Linking.openSettings();
25
+ console.log('res', res);
26
+ }}
27
+ >
28
+ 去开启>
29
+ </Text>
30
+ </Text>
31
+ </View>
32
+ </View>
33
+ );
34
+ };
35
+
36
+ export default NoPermission;
37
+
38
+ const styles = StyleSheet.create({
39
+ fontSize: { textAlign: 'center', marginBottom: 6, fontSize: 15 },
40
+ on: {
41
+ color: '#FF7600',
42
+ },
43
+ });
@@ -0,0 +1,196 @@
1
+ import {
2
+ Image,
3
+ StyleSheet,
4
+ Text,
5
+ TouchableOpacity,
6
+ View,
7
+ type GestureResponderEvent,
8
+ } from 'react-native';
9
+ import React, { useState } from 'react';
10
+ import { SAFE_AREA_PADDING } from '../../utils';
11
+ import {
12
+ CameraModeEnum,
13
+ type CameraMode,
14
+ type CameraModeType,
15
+ } from '../../utils';
16
+ import { Back, Rotate, PreviewThumbnail } from '../../components';
17
+ import type { PhotoFile } from 'react-native-vision-camera';
18
+
19
+ const Take = require('../../assets/home/take.png');
20
+
21
+ const Footer: React.FC<{
22
+ cameraMode: CameraModeType[];
23
+ photos: PhotoFile[];
24
+ backPress?: (event: GestureResponderEvent) => void;
25
+ thumbnailPress?: (event: GestureResponderEvent) => void;
26
+ savePress?: (event: GestureResponderEvent) => void;
27
+ rotatePress?: (event: GestureResponderEvent) => void;
28
+ takePress?: (event: GestureResponderEvent) => void;
29
+ onChange?: (val: CameraMode) => void;
30
+ }> = ({
31
+ cameraMode,
32
+ photos,
33
+ backPress,
34
+ thumbnailPress,
35
+ takePress,
36
+ savePress,
37
+ rotatePress,
38
+ onChange,
39
+ }) => {
40
+ const isPhotos = () => photos.length > 0;
41
+ const [stateText, setStateText] = useState('');
42
+ const back = (e: GestureResponderEvent) => {
43
+ backPress && backPress(e);
44
+ };
45
+ const [mode, setMode] = useState<CameraMode | undefined>(cameraMode[0]?.mode);
46
+ return (
47
+ <View style={styles.footer}>
48
+ {stateText ? (
49
+ <View>
50
+ <Text style={styles.stateText}>{stateText}</Text>
51
+ </View>
52
+ ) : (
53
+ <>
54
+ <View style={styles.footerTop}>
55
+ {cameraMode.map((item) => {
56
+ return (
57
+ <TouchableOpacity
58
+ key={item.mode}
59
+ style={[
60
+ styles.footerTopText,
61
+ item.mode === mode
62
+ ? styles.footerTopTextSelected
63
+ : undefined,
64
+ ]}
65
+ onPress={() => {
66
+ if (item.mode !== mode) {
67
+ setMode(item.mode);
68
+ }
69
+ if (cameraMode.length > 1) {
70
+ onChange && onChange(item.mode);
71
+ }
72
+ }}
73
+ >
74
+ <Text
75
+ style={[
76
+ styles.footerTopTextColor,
77
+ item.mode === mode
78
+ ? styles.footerTopTextSelected
79
+ : undefined,
80
+ ]}
81
+ >
82
+ {CameraModeEnum[item.mode]}
83
+ </Text>
84
+ </TouchableOpacity>
85
+ );
86
+ })}
87
+ </View>
88
+ <View style={styles.footerBottom}>
89
+ <View style={styles.footerHorizontal}>
90
+ {isPhotos() ? (
91
+ <PreviewThumbnail
92
+ uri={`file://${photos[photos.length - 1]?.path}`}
93
+ onPress={thumbnailPress}
94
+ />
95
+ ) : (
96
+ <Back onPress={back} />
97
+ )}
98
+ </View>
99
+ <View style={styles.footerCenter}>
100
+ {isPhotos() && (
101
+ <Text style={styles.back} onPress={back}>
102
+ 返回
103
+ </Text>
104
+ )}
105
+ <TouchableOpacity onPress={takePress}>
106
+ <Image source={Take} style={styles.image} />
107
+ </TouchableOpacity>
108
+ {isPhotos() && (
109
+ <Text
110
+ style={styles.save}
111
+ onPress={(e) => {
112
+ setStateText('保存中...');
113
+ savePress && savePress(e);
114
+ }}
115
+ >
116
+ 保存
117
+ </Text>
118
+ )}
119
+ </View>
120
+ <View style={styles.footerHorizontal}>
121
+ <Rotate onPress={rotatePress} />
122
+ </View>
123
+ </View>
124
+ </>
125
+ )}
126
+ </View>
127
+ );
128
+ };
129
+
130
+ export default Footer;
131
+
132
+ const styles = StyleSheet.create({
133
+ image: { width: 62, height: 62 },
134
+ stateText: {
135
+ textAlign: 'center',
136
+ color: '#fff',
137
+ },
138
+ footer: {
139
+ ...StyleSheet.absoluteFillObject,
140
+ top: undefined,
141
+ backgroundColor: 'rgba(0,0,0,0.3)',
142
+ paddingTop: 6,
143
+ paddingBottom: SAFE_AREA_PADDING.paddingBottom + 6,
144
+ display: 'flex',
145
+ borderTopLeftRadius: 10,
146
+ borderTopRightRadius: 10,
147
+ paddingHorizontal: 16,
148
+ },
149
+ footerBottom: {
150
+ flexDirection: 'row',
151
+ justifyContent: 'space-between',
152
+ alignItems: 'center',
153
+ },
154
+ footerHorizontal: { width: 34, height: 34 },
155
+ footerCenter: {
156
+ flex: 1,
157
+ justifyContent: 'center',
158
+ alignItems: 'center',
159
+ flexDirection: 'row',
160
+ },
161
+ footerTop: {
162
+ display: 'flex',
163
+ flexDirection: 'row',
164
+ justifyContent: 'center',
165
+ paddingBottom: 6,
166
+ },
167
+ footerTopText: {
168
+ paddingVertical: 6,
169
+ paddingHorizontal: 24,
170
+ marginHorizontal: 2,
171
+ borderRadius: 10,
172
+ },
173
+ footerTopTextColor: {
174
+ color: '#fff',
175
+ borderRadius: 10,
176
+ fontSize: 16,
177
+ },
178
+ footerTopTextSelected: {
179
+ color: '#E96C00',
180
+ borderRadius: 10,
181
+ },
182
+ save: {
183
+ flex: 1,
184
+ paddingVertical: 24,
185
+ marginLeft: 24,
186
+ color: '#fff',
187
+ textAlign: 'left',
188
+ },
189
+ back: {
190
+ paddingVertical: 24,
191
+ flex: 1,
192
+ textAlign: 'right',
193
+ color: '#fff',
194
+ marginRight: 24,
195
+ },
196
+ });
@@ -0,0 +1,2 @@
1
+ import Footer from './Footer';
2
+ export { Footer };
@@ -0,0 +1,13 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-12 13:44:47
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-16 13:08:44
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import Camera from './Camera';
10
+ import NoCamera from './NoCamera';
11
+ import NoPermission from './NoPermission';
12
+ import ModalView from './ModalView';
13
+ export { Camera, NoCamera, NoPermission, ModalView };
@@ -0,0 +1,111 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-12-02 13:37:36
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-20 13:03:12
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
10
+ import React, { useState } from 'react';
11
+
12
+ import { CameraModeEnum, type CameraModeType } from '../../utils';
13
+ import { Back, Delete, MyCarousel } from '../../components';
14
+ import { pxToDpWidth, type CustomPhotoFile } from '../../utils';
15
+ import PreviewFooter from './PreviewFooter';
16
+
17
+ import { styles as singleStyles, type CommonProps } from './SinglePre';
18
+ const PreView: React.FC<
19
+ {
20
+ cameraMode: CameraModeType[];
21
+ data: CustomPhotoFile[];
22
+ } & CommonProps
23
+ > = ({ cameraMode, data, onBack, onDel }) => {
24
+ const [mode, setMode] = useState(data[0]?.mode);
25
+ const showData = data.filter((item) => item.mode === mode);
26
+ const [snapToIndex, setSnapToIndex] = useState<number>(0);
27
+ return (
28
+ <View style={styles.container}>
29
+ <View style={styles.mode}>
30
+ {cameraMode
31
+ .filter((item) => {
32
+ return data.some((dItem) => {
33
+ return item.mode === dItem.mode;
34
+ });
35
+ })
36
+ .map((item, index) => {
37
+ return (
38
+ <TouchableOpacity
39
+ style={styles.modeItem}
40
+ key={`${item.mode}_${index}`}
41
+ onPress={() => setMode(item.mode)}
42
+ >
43
+ <Text
44
+ style={[
45
+ styles.modeText,
46
+ item.mode === mode ? styles.modeTextSelected : undefined,
47
+ ]}
48
+ >
49
+ {CameraModeEnum[item.mode]}
50
+ </Text>
51
+ </TouchableOpacity>
52
+ );
53
+ })}
54
+ </View>
55
+ <View style={{ paddingHorizontal: pxToDpWidth(34) }}>
56
+ <MyCarousel data={showData} onSnapToItem={setSnapToIndex} />
57
+ </View>
58
+ <View style={singleStyles.footer}>
59
+ <PreviewFooter
60
+ actions={[
61
+ <Back
62
+ key="back"
63
+ style={singleStyles.image}
64
+ text="返回"
65
+ onPress={onBack}
66
+ />,
67
+ <Delete
68
+ key="del"
69
+ style={singleStyles.image}
70
+ text="删除"
71
+ onPress={async () => {
72
+ if (onDel) {
73
+ const isDel = await onDel(showData[snapToIndex]);
74
+ if (isDel && snapToIndex > 0) {
75
+ setSnapToIndex((val) => val - 1);
76
+ }
77
+ }
78
+ }}
79
+ />,
80
+ ]}
81
+ />
82
+ </View>
83
+ </View>
84
+ );
85
+ };
86
+
87
+ export default PreView;
88
+
89
+ const styles = StyleSheet.create({
90
+ container: {
91
+ flex: 1,
92
+ backgroundColor: '#3C3A3E',
93
+ },
94
+ mode: {
95
+ flexDirection: 'row',
96
+ marginVertical: pxToDpWidth(24),
97
+ },
98
+ modeItem: {
99
+ padding: 10,
100
+ },
101
+ modeText: {
102
+ color: '#fff',
103
+ fontSize: 14,
104
+ fontWeight: 400,
105
+ },
106
+ modeTextSelected: {
107
+ color: '#E96C00',
108
+ fontSize: 16,
109
+ fontWeight: 500,
110
+ },
111
+ });