@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,76 @@
1
+ import React, { useEffect } from 'react';
2
+ import { View, StyleSheet } from 'react-native';
3
+ import Animated, {
4
+ Easing,
5
+ withRepeat,
6
+ withTiming,
7
+ useSharedValue,
8
+ useAnimatedStyle,
9
+ } from 'react-native-reanimated';
10
+ import { pxToDpWidth } from '../utils';
11
+
12
+ const Loading: React.FC = () => {
13
+ const firstDotScale = useSharedValue(0);
14
+ const secondDotScale = useSharedValue(0);
15
+ const thirdDotScale = useSharedValue(0);
16
+
17
+ useEffect(() => {
18
+ // 创建动画:依次跳动
19
+ firstDotScale.value = withRepeat(
20
+ withTiming(1, { duration: 500, easing: Easing.ease }),
21
+ -1,
22
+ true
23
+ );
24
+
25
+ secondDotScale.value = withRepeat(
26
+ withTiming(1, { duration: 500, easing: Easing.ease }),
27
+ -1,
28
+ true
29
+ );
30
+
31
+ thirdDotScale.value = withRepeat(
32
+ withTiming(1, { duration: 500, easing: Easing.ease }),
33
+ -1,
34
+ true
35
+ );
36
+ }, [firstDotScale, secondDotScale, thirdDotScale]);
37
+
38
+ // 使用 useAnimatedStyle 来绑定动画到样式上
39
+ const animatedStyle1 = useAnimatedStyle(() => ({
40
+ transform: [{ scale: firstDotScale.value }],
41
+ }));
42
+
43
+ const animatedStyle2 = useAnimatedStyle(() => ({
44
+ transform: [{ scale: secondDotScale.value }],
45
+ }));
46
+
47
+ const animatedStyle3 = useAnimatedStyle(() => ({
48
+ transform: [{ scale: thirdDotScale.value }],
49
+ }));
50
+
51
+ return (
52
+ <View style={styles.container}>
53
+ <Animated.View style={[styles.dot, animatedStyle1]} />
54
+ <Animated.View style={[styles.dot, animatedStyle2]} />
55
+ <Animated.View style={[styles.dot, animatedStyle3]} />
56
+ </View>
57
+ );
58
+ };
59
+
60
+ const styles = StyleSheet.create({
61
+ container: {
62
+ flexDirection: 'row',
63
+ justifyContent: 'center',
64
+ alignItems: 'center',
65
+ flex: 1,
66
+ },
67
+ dot: {
68
+ width: pxToDpWidth(20),
69
+ height: pxToDpWidth(20),
70
+ borderRadius: 10,
71
+ backgroundColor: '#FF7600',
72
+ margin: 5,
73
+ },
74
+ });
75
+
76
+ export default Loading;
@@ -0,0 +1,115 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-12-18 13:55:41
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-20 11:33:36
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
10
+ import React, { useState } from 'react';
11
+ import { pxToDpWidth } from '../../utils';
12
+ import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
13
+ import LoadingDots from '../Loading';
14
+
15
+ const Confirm: React.FC<{
16
+ onCancel: () => Promise<void> | void;
17
+ onConfirm: () => Promise<void> | void;
18
+ text?: string;
19
+ title?: string;
20
+ }> = ({ onCancel, onConfirm, text, title }) => {
21
+ const [loading, setLoading] = useState(false);
22
+ const click = async (reset = false) => {
23
+ if (loading) {
24
+ return;
25
+ }
26
+ setLoading(true);
27
+ if (reset) {
28
+ await onConfirm();
29
+ } else {
30
+ await onCancel();
31
+ }
32
+ setLoading(false);
33
+ };
34
+ return (
35
+ <Animated.View style={styles.modal} entering={FadeIn} exiting={FadeOut}>
36
+ <View style={styles.container}>
37
+ <Text style={[styles.text, styles.title]}>{title || '确认提醒'}</Text>
38
+ <Text style={[styles.text, styles.des]}>{text}</Text>
39
+ <View style={styles.footer}>
40
+ {loading ? (
41
+ <LoadingDots />
42
+ ) : (
43
+ <>
44
+ <TouchableOpacity
45
+ style={styles.btn}
46
+ onPress={async () => await click(false)}
47
+ >
48
+ <Text style={styles.btnText}>取消</Text>
49
+ </TouchableOpacity>
50
+ <TouchableOpacity
51
+ style={styles.btn}
52
+ onPress={async () => await click(true)}
53
+ >
54
+ <Text style={[styles.btnText, styles.btnTextConfirm]}>
55
+ 确定
56
+ </Text>
57
+ </TouchableOpacity>
58
+ </>
59
+ )}
60
+ </View>
61
+ </View>
62
+ </Animated.View>
63
+ );
64
+ };
65
+
66
+ export default Confirm;
67
+
68
+ const styles = StyleSheet.create({
69
+ modal: {
70
+ position: 'absolute',
71
+ top: 0,
72
+ left: 0,
73
+ right: 0,
74
+ justifyContent: 'center',
75
+ alignItems: 'center',
76
+ bottom: 0,
77
+ backgroundColor: 'rgba(0,0,0,0.3)',
78
+ },
79
+ container: {
80
+ backgroundColor: '#fff',
81
+ width: '80%',
82
+ borderRadius: 10,
83
+ paddingVertical: 12,
84
+ },
85
+ text: {
86
+ textAlign: 'center',
87
+ paddingHorizontal: pxToDpWidth(12),
88
+ color: '#010101',
89
+ },
90
+ title: {
91
+ fontSize: pxToDpWidth(30),
92
+ fontWeight: '500',
93
+ },
94
+ des: {
95
+ fontWeight: '400',
96
+ fontSize: pxToDpWidth(26),
97
+ marginTop: pxToDpWidth(24),
98
+ marginBottom: pxToDpWidth(36),
99
+ },
100
+ footer: {
101
+ paddingTop: pxToDpWidth(24),
102
+ borderTopWidth: 0.5,
103
+ borderTopColor: '#D4D4D4',
104
+ flexDirection: 'row',
105
+ },
106
+ btn: { flex: 1, justifyContent: 'center', alignItems: 'center' },
107
+ btnText: {
108
+ fontSize: pxToDpWidth(30),
109
+ fontWeight: '400',
110
+ color: '#666',
111
+ },
112
+ btnTextConfirm: {
113
+ color: '#FF7600',
114
+ },
115
+ });
@@ -0,0 +1,3 @@
1
+ import Confirm from './Confirm';
2
+
3
+ export { Confirm };
@@ -0,0 +1,40 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-02-26 14:42:00
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-17 11:33:28
6
+ * @Description:
7
+ * @PageName: 左侧预览
8
+ */
9
+ import {
10
+ StyleSheet,
11
+ TouchableOpacity,
12
+ type ImageStyle,
13
+ Image,
14
+ type GestureResponderEvent,
15
+ } from 'react-native';
16
+ import React from 'react';
17
+
18
+ export type PreviewThumbnailProps = {
19
+ uri: string;
20
+ onPress?: (event: GestureResponderEvent) => void;
21
+ style?: ImageStyle;
22
+ };
23
+
24
+ const PreviewThumbnail: React.FC<PreviewThumbnailProps> = ({
25
+ onPress,
26
+ uri,
27
+ style,
28
+ }) => {
29
+ return (
30
+ <TouchableOpacity onPress={onPress}>
31
+ <Image source={{ uri }} style={{ ...styles.image, ...style }} />
32
+ </TouchableOpacity>
33
+ );
34
+ };
35
+
36
+ export default PreviewThumbnail;
37
+
38
+ const styles = StyleSheet.create({
39
+ image: { width: '100%', height: '100%', borderRadius: 5 },
40
+ });
@@ -0,0 +1,32 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-16 17:51:36
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-16 09:45:43
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import {
10
+ Image,
11
+ TouchableOpacity,
12
+ type ImageStyle,
13
+ type GestureResponderEvent,
14
+ } from 'react-native';
15
+ import React from 'react';
16
+ import { styles } from './Back';
17
+ export type RotateProps = {
18
+ onPress?: (event: GestureResponderEvent) => void;
19
+ style?: ImageStyle;
20
+ };
21
+ const Rotate: React.FC<RotateProps> = ({ onPress, style }) => {
22
+ return (
23
+ <TouchableOpacity onPress={onPress}>
24
+ <Image
25
+ source={require('../assets/preview/rotate.png')}
26
+ style={[styles.image, style]}
27
+ />
28
+ </TouchableOpacity>
29
+ );
30
+ };
31
+
32
+ export default Rotate;
@@ -0,0 +1,37 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-16 17:50:24
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-16 10:24:18
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { Image, StyleSheet, Text, TouchableOpacity } from 'react-native';
10
+ import React from 'react';
11
+
12
+ import { type RotateProps } from './Rotate';
13
+ const Save: React.FC<RotateProps & { text?: string }> = ({
14
+ onPress,
15
+ style,
16
+ text,
17
+ }) => {
18
+ return (
19
+ <TouchableOpacity style={styles.container} onPress={onPress}>
20
+ <Image
21
+ source={require('../assets/preview/save.png')}
22
+ style={[styles.image, style]}
23
+ />
24
+ {text && <Text style={styles.text}>{text}</Text>}
25
+ </TouchableOpacity>
26
+ );
27
+ };
28
+
29
+ export default Save;
30
+
31
+ export const styles = StyleSheet.create({
32
+ container: {
33
+ alignItems: 'center',
34
+ },
35
+ image: { width: 34, height: 34, marginBottom: 4 },
36
+ text: { color: '#fff' },
37
+ });
@@ -0,0 +1,8 @@
1
+ import PreviewThumbnail from './PreviewThumbnail';
2
+ import Rotate from './Rotate';
3
+ import Back from './Back';
4
+ import Delete from './Delete';
5
+ import Save from './Save';
6
+ export * from './Carousel';
7
+ export * from './Modal';
8
+ export { Back, Rotate, PreviewThumbnail, Delete, Save };
@@ -0,0 +1,12 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-17 16:29:43
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-18 15:13:08
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import useCreation from './useCreation';
10
+ import useConfirm from './useConfirm';
11
+
12
+ export { useCreation, useConfirm };
@@ -0,0 +1,96 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-17 16:31:19
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-20 14:58:46
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+
10
+ import React, { useRef, useState } from 'react';
11
+ import { Camera, NoPermission, NoCamera, ModalView } from '../../camera';
12
+ import type { CameraBack, CameraProps, CameraRef } from '../../utils';
13
+ import {
14
+ useCameraDevice,
15
+ useCameraPermission,
16
+ useMicrophonePermission,
17
+ } from 'react-native-vision-camera';
18
+ import { DefaultData } from '../../utils';
19
+ import Container from '../../camera/Container';
20
+
21
+ const useCamera = (): [CameraRef, React.ReactElement] => {
22
+ const [cameraConfig, setCameraConfig] = useState<CameraProps>(DefaultData);
23
+ const [visible, setVisible] = useState(false);
24
+
25
+ const close = (
26
+ data: CameraBack = { code: 200, data: [], message: '返回' }
27
+ ) => {
28
+ setVisible(false);
29
+ ref.current.resolvePromise(data);
30
+ };
31
+ const ref = useRef<{
32
+ resolvePromise: (data: CameraBack) => void;
33
+ }>({
34
+ resolvePromise: () => {},
35
+ });
36
+ const api = React.useMemo<CameraRef>(() => {
37
+ return {
38
+ open: async (config) => {
39
+ setVisible(true);
40
+ setCameraConfig((val) => ({
41
+ ...val,
42
+ ...config,
43
+ }));
44
+ return new Promise<CameraBack>((resolve) => {
45
+ ref.current.resolvePromise = resolve;
46
+ });
47
+ },
48
+ close: () => close(),
49
+ };
50
+ }, []);
51
+
52
+ const isVideo = (cameraConfig?.cameraMode || []).some(
53
+ (item) => item.mode === 'video'
54
+ );
55
+
56
+ const device = useCameraDevice('front');
57
+ // 相机权限请求
58
+ const { hasPermission, requestPermission } = useCameraPermission();
59
+ // 麦克风权限
60
+ const {
61
+ hasPermission: hasMicroPermission,
62
+ requestPermission: hasRequestMicroPermission,
63
+ } = useMicrophonePermission();
64
+
65
+ let Holder = (
66
+ <Camera
67
+ data={cameraConfig}
68
+ visible={visible}
69
+ back={() => close()}
70
+ onChange={(val) => close(val)}
71
+ />
72
+ );
73
+ if (visible) {
74
+ if (!hasPermission) {
75
+ requestPermission();
76
+ Holder = (
77
+ <Container onCancel={() => close()}>
78
+ <NoPermission />
79
+ </Container>
80
+ );
81
+ } else if (isVideo && !hasMicroPermission) {
82
+ hasRequestMicroPermission();
83
+ Holder = (
84
+ <Container onCancel={() => close()}>
85
+ <NoPermission />
86
+ </Container>
87
+ );
88
+ } else if (device == null) {
89
+ Holder = <NoCamera />;
90
+ }
91
+ }
92
+
93
+ return [api, <ModalView visible={visible}>{Holder}</ModalView>];
94
+ };
95
+
96
+ export default useCamera;
@@ -0,0 +1,58 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-17 16:28:56
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-18 16:05:43
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import React, { useRef, useState } from 'react';
10
+ import type { ConfirmConfigProps, ConfirmRef } from '../utils';
11
+ import { Confirm } from '../components';
12
+
13
+ export default function useConfirm() {
14
+ const [visible, setVisible] = useState(false);
15
+ const [config, setConfig] = useState<ConfirmConfigProps>();
16
+ const close = () => {
17
+ setVisible(false);
18
+ };
19
+
20
+ const ref = useRef<{ resolvePromise: (confirmed: boolean) => void }>({
21
+ resolvePromise: () => {},
22
+ });
23
+
24
+ const confirmApi = React.useMemo<ConfirmRef>(() => {
25
+ return {
26
+ open: async (openConfig) => {
27
+ setConfig(openConfig);
28
+ setVisible(true);
29
+ return new Promise<boolean>((resolve) => {
30
+ ref.current.resolvePromise = resolve;
31
+ });
32
+ },
33
+ close: () => close(),
34
+ };
35
+ }, []);
36
+
37
+ let contextHolder = null;
38
+ if (visible) {
39
+ contextHolder = (
40
+ <Confirm
41
+ title={config?.title}
42
+ text={config?.text}
43
+ onCancel={() => {
44
+ close();
45
+ ref.current.resolvePromise(false);
46
+ }}
47
+ onConfirm={() => {
48
+ close();
49
+ ref.current.resolvePromise(true);
50
+ }}
51
+ />
52
+ );
53
+ }
54
+ return {
55
+ confirmApi,
56
+ contextHolder,
57
+ };
58
+ }
@@ -0,0 +1,25 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-17 16:28:56
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-01-17 16:29:26
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import type { DependencyList } from 'react';
10
+ import { useRef } from 'react';
11
+ import depsAreSame from '../../utils/depsAreSame';
12
+
13
+ export default function useCreation<T>(factory: () => T, deps: DependencyList) {
14
+ const { current } = useRef({
15
+ deps,
16
+ obj: undefined as undefined | T,
17
+ initialized: false,
18
+ });
19
+ if (current.initialized === false || !depsAreSame(current.deps, deps)) {
20
+ current.deps = deps;
21
+ current.obj = factory();
22
+ current.initialized = true;
23
+ }
24
+ return current.obj as T;
25
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,38 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-09 13:54:14
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-01-17 16:58:16
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { NativeModules, Platform } from 'react-native';
10
+
11
+ const LINKING_ERROR =
12
+ `The package '@unif/react-native-camera' doesn't seem to be linked. Make sure: \n\n` +
13
+ Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
14
+ '- You rebuilt the app after installing the package\n' +
15
+ '- You are not using Expo Go\n';
16
+
17
+ // @ts-expect-error
18
+ const isTurboModuleEnabled = global.__turboModuleProxy != null;
19
+
20
+ const ReactNativeCameraModule = isTurboModuleEnabled
21
+ ? require('./NativeReactNativeCamera').default
22
+ : NativeModules.ReactNativeCamera;
23
+
24
+ const ReactNativeCamera = ReactNativeCameraModule
25
+ ? ReactNativeCameraModule
26
+ : new Proxy(
27
+ {},
28
+ {
29
+ get() {
30
+ throw new Error(LINKING_ERROR);
31
+ },
32
+ }
33
+ );
34
+
35
+ export default ReactNativeCamera;
36
+
37
+ import useCamera from './hooks/useCamera.tsx';
38
+ export { useCamera };
@@ -0,0 +1,85 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-11 14:53:09
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-20 15:04:23
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ import { Dimensions, Platform } from 'react-native';
10
+ import type {
11
+ CameraModeCommonType,
12
+ CameraModeImageType,
13
+ CameraModeListItem,
14
+ CameraModeVidoType,
15
+ CameraProps,
16
+ } from '../utils';
17
+
18
+ import StaticSafeAreaInsets from 'react-native-static-safe-area-insets';
19
+
20
+ export const CONTENT_SPACING = 0;
21
+
22
+ const SAFE_BOTTOM =
23
+ Platform.select({
24
+ ios: StaticSafeAreaInsets.safeAreaInsetsBottom,
25
+ }) ?? 0;
26
+
27
+ export const SAFE_AREA_PADDING = {
28
+ paddingLeft: StaticSafeAreaInsets.safeAreaInsetsLeft + CONTENT_SPACING,
29
+ paddingTop: StaticSafeAreaInsets.safeAreaInsetsTop + CONTENT_SPACING,
30
+ paddingRight: StaticSafeAreaInsets.safeAreaInsetsRight + CONTENT_SPACING,
31
+ paddingBottom: SAFE_BOTTOM + CONTENT_SPACING,
32
+ };
33
+
34
+ export const SCREEN_WIDTH = Dimensions.get('window').width;
35
+ export const SCREEN_HEIGHT = Platform.select<number>({
36
+ android:
37
+ Dimensions.get('screen').height - StaticSafeAreaInsets.safeAreaInsetsBottom,
38
+ ios: Dimensions.get('window').height,
39
+ }) as number;
40
+
41
+ // Capture Button
42
+ export const CAPTURE_BUTTON_SIZE = 78;
43
+ export const MAX_ZOOM_FACTOR = 10;
44
+
45
+ // Control Button like Flash
46
+ export const CONTROL_BUTTON_SIZE = 44;
47
+
48
+ // 相机拍照模式
49
+ export const CameraModeList: CameraModeListItem[] = [
50
+ { label: '连拍', value: 'continuous' },
51
+ { label: '单拍', value: 'single' },
52
+ { label: '视频', value: 'video' },
53
+ ];
54
+
55
+ // 公用默认值
56
+ export const CameraModeCommonData: CameraModeCommonType = {
57
+ type: 'back',
58
+ flashMode: 'off',
59
+ mode: 'single',
60
+ };
61
+
62
+ // 单拍
63
+ export const SingleData: CameraModeCommonType & CameraModeImageType = {
64
+ ...CameraModeCommonData,
65
+ mode: 'single',
66
+ };
67
+
68
+ // 连拍拍
69
+ export const ContinuousData: CameraModeCommonType & CameraModeImageType = {
70
+ ...CameraModeCommonData,
71
+ mode: 'continuous',
72
+ };
73
+
74
+ // 视频
75
+ export const VideoData: CameraModeCommonType & CameraModeVidoType = {
76
+ ...CameraModeCommonData,
77
+ mode: 'video',
78
+ recTime: 60,
79
+ quantity: 1,
80
+ };
81
+
82
+ export const DefaultData: CameraProps = {
83
+ dataRetainedMode: 'clear',
84
+ cameraMode: [SingleData],
85
+ };
@@ -0,0 +1,12 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ export default function depsAreSame(
4
+ oldDeps: DependencyList,
5
+ deps: DependencyList
6
+ ): boolean {
7
+ if (oldDeps === deps) return true;
8
+ for (let i = 0; i < oldDeps.length; i++) {
9
+ if (!Object.is(oldDeps[i], deps[i])) return false;
10
+ }
11
+ return true;
12
+ }
@@ -0,0 +1,12 @@
1
+ /*
2
+ * @Author: 刘利军
3
+ * @Date: 2024-01-11 14:53:09
4
+ * @LastEditors: 刘利军
5
+ * @LastEditTime: 2024-12-17 16:54:04
6
+ * @Description:
7
+ * @PageName:
8
+ */
9
+ export * from './common';
10
+ export * from './render-item';
11
+ export * from './px-to-dp';
12
+ export * from './interface';