react-native-ensys-camera-x 1.0.7

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 (506) hide show
  1. package/CustomCamera.podspec +20 -0
  2. package/LICENSE +20 -0
  3. package/README.md +833 -0
  4. package/android/build.gradle +135 -0
  5. package/android/consumer-rules.pro +47 -0
  6. package/android/src/main/AndroidManifest.xml +72 -0
  7. package/android/src/main/java/android/print/PdfPrint.java +51 -0
  8. package/android/src/main/java/com/customcamera/AnimatedImageViewManager.kt +199 -0
  9. package/android/src/main/java/com/customcamera/AudioPlayerView.kt +322 -0
  10. package/android/src/main/java/com/customcamera/AudioRecorder.kt +506 -0
  11. package/android/src/main/java/com/customcamera/BarcodeScannerActivity.kt +361 -0
  12. package/android/src/main/java/com/customcamera/BlurBackgroundView.kt +199 -0
  13. package/android/src/main/java/com/customcamera/CacheCleanupManager.kt +386 -0
  14. package/android/src/main/java/com/customcamera/CameraAspectRatioMode.kt +77 -0
  15. package/android/src/main/java/com/customcamera/CameraAsset.kt +211 -0
  16. package/android/src/main/java/com/customcamera/CameraTheme.kt +479 -0
  17. package/android/src/main/java/com/customcamera/CompressionCacheStore.kt +504 -0
  18. package/android/src/main/java/com/customcamera/CompressionFileNameUtils.kt +7 -0
  19. package/android/src/main/java/com/customcamera/CompressionProfile.kt +195 -0
  20. package/android/src/main/java/com/customcamera/CustomCameraActivity.kt +7291 -0
  21. package/android/src/main/java/com/customcamera/CustomCameraFileProvider.kt +9 -0
  22. package/android/src/main/java/com/customcamera/CustomCameraModule.kt +2479 -0
  23. package/android/src/main/java/com/customcamera/CustomCameraPackage.kt +53 -0
  24. package/android/src/main/java/com/customcamera/DisplayUtils.kt +9 -0
  25. package/android/src/main/java/com/customcamera/DocumentPreviewView.kt +846 -0
  26. package/android/src/main/java/com/customcamera/DrawingView.kt +214 -0
  27. package/android/src/main/java/com/customcamera/EmojiPickerData.kt +228 -0
  28. package/android/src/main/java/com/customcamera/FilterStripAdapter.kt +158 -0
  29. package/android/src/main/java/com/customcamera/GifSupport.kt +215 -0
  30. package/android/src/main/java/com/customcamera/GlobalAudioPlayer.kt +320 -0
  31. package/android/src/main/java/com/customcamera/ImageExporter.kt +1394 -0
  32. package/android/src/main/java/com/customcamera/ImageFormatSupport.kt +163 -0
  33. package/android/src/main/java/com/customcamera/Localization.kt +206 -0
  34. package/android/src/main/java/com/customcamera/MediaAdapters.kt +758 -0
  35. package/android/src/main/java/com/customcamera/MediaCacheManager.kt +782 -0
  36. package/android/src/main/java/com/customcamera/MediaExportFormats.kt +201 -0
  37. package/android/src/main/java/com/customcamera/MediaFileIo.kt +310 -0
  38. package/android/src/main/java/com/customcamera/MediaMetadataStore.kt +494 -0
  39. package/android/src/main/java/com/customcamera/MediaPreviewEditor.kt +14865 -0
  40. package/android/src/main/java/com/customcamera/MediaPublisher.kt +423 -0
  41. package/android/src/main/java/com/customcamera/MediaStorageWorkflow.kt +722 -0
  42. package/android/src/main/java/com/customcamera/MediaStoreRepository.kt +378 -0
  43. package/android/src/main/java/com/customcamera/MediaThumbnailView.kt +286 -0
  44. package/android/src/main/java/com/customcamera/MediaUtils.kt +37 -0
  45. package/android/src/main/java/com/customcamera/NativeVideoViewManager.kt +845 -0
  46. package/android/src/main/java/com/customcamera/OfficeDocumentConverter.kt +2791 -0
  47. package/android/src/main/java/com/customcamera/PendingCaptureCrops.kt +88 -0
  48. package/android/src/main/java/com/customcamera/PowerPointPreview.kt +4077 -0
  49. package/android/src/main/java/com/customcamera/RecentPickerStore.kt +74 -0
  50. package/android/src/main/java/com/customcamera/SecureFileEraser.kt +411 -0
  51. package/android/src/main/java/com/customcamera/SecureKeyModule.kt +88 -0
  52. package/android/src/main/java/com/customcamera/SecureMediaDeleter.kt +493 -0
  53. package/android/src/main/java/com/customcamera/StickerPickerData.kt +107 -0
  54. package/android/src/main/java/com/customcamera/SvgDrawable.kt +175 -0
  55. package/android/src/main/java/com/customcamera/SvgIconViewManager.kt +77 -0
  56. package/android/src/main/java/com/customcamera/TextEntryController.kt +553 -0
  57. package/android/src/main/java/com/customcamera/ThumbnailLoader.kt +455 -0
  58. package/android/src/main/java/com/customcamera/UploadService.kt +909 -0
  59. package/android/src/main/java/com/customcamera/VideoEditUtils.kt +210 -0
  60. package/android/src/main/java/com/customcamera/VideoRotationTranscoder.kt +1992 -0
  61. package/android/src/main/java/com/customcamera/gif/AnimatedGifEncoder.kt +473 -0
  62. package/android/src/main/java/com/customcamera/gif/GifDecoder.kt +690 -0
  63. package/android/src/main/java/com/customcamera/gif/GifFramesDrawable.kt +160 -0
  64. package/android/src/main/java/com/customcamera/gif/GifHttp.kt +112 -0
  65. package/android/src/main/java/com/customcamera/gif/GifImageLoader.kt +186 -0
  66. package/android/src/main/java/com/customcamera/gif/GifModels.kt +74 -0
  67. package/android/src/main/java/com/customcamera/gif/GifProvider.kt +49 -0
  68. package/android/src/main/java/com/customcamera/gif/GifProviders.kt +27 -0
  69. package/android/src/main/java/com/customcamera/gif/GifRepository.kt +124 -0
  70. package/android/src/main/java/com/customcamera/gif/GifSafety.kt +33 -0
  71. package/android/src/main/java/com/customcamera/gif/GiphyGifProvider.kt +146 -0
  72. package/android/src/main/java/com/customcamera/gif/LZWEncoder.kt +258 -0
  73. package/android/src/main/java/com/customcamera/gif/NeuQuant.kt +435 -0
  74. package/android/src/main/java/com/customcamera/gif/TenorGifProvider.kt +147 -0
  75. package/android/src/main/res/drawable/bg_brush_selected.xml +5 -0
  76. package/android/src/main/res/drawable/bg_color_swatch.xml +5 -0
  77. package/android/src/main/res/drawable/bg_editor_toolbar.xml +6 -0
  78. package/android/src/main/res/drawable/bg_icon_circle.xml +5 -0
  79. package/android/src/main/res/drawable/bg_icon_circle_light.xml +5 -0
  80. package/android/src/main/res/drawable/bg_mode_tab_active.xml +6 -0
  81. package/android/src/main/res/drawable/bg_pill.xml +6 -0
  82. package/android/src/main/res/drawable/bg_recording_dot.xml +6 -0
  83. package/android/src/main/res/drawable/bg_selection_badge.xml +8 -0
  84. package/android/src/main/res/drawable/bg_send_button.xml +5 -0
  85. package/android/src/main/res/drawable/bg_shutter_inner.xml +5 -0
  86. package/android/src/main/res/drawable/bg_shutter_recording.xml +6 -0
  87. package/android/src/main/res/drawable/bg_shutter_ring.xml +8 -0
  88. package/android/src/main/res/drawable/bg_shutter_video_idle.xml +5 -0
  89. package/android/src/main/res/drawable/bg_thumbnail.xml +9 -0
  90. package/android/src/main/res/drawable/ic_aspect_ratio.xml +17 -0
  91. package/android/src/main/res/drawable/ic_audio.xml +10 -0
  92. package/android/src/main/res/drawable/ic_back.xml +10 -0
  93. package/android/src/main/res/drawable/ic_brush_medium.xml +12 -0
  94. package/android/src/main/res/drawable/ic_brush_thick.xml +12 -0
  95. package/android/src/main/res/drawable/ic_brush_thin.xml +12 -0
  96. package/android/src/main/res/drawable/ic_check.xml +17 -0
  97. package/android/src/main/res/drawable/ic_chevron_down.xml +10 -0
  98. package/android/src/main/res/drawable/ic_chevron_up.xml +13 -0
  99. package/android/src/main/res/drawable/ic_clear_drawing.xml +10 -0
  100. package/android/src/main/res/drawable/ic_close.xml +10 -0
  101. package/android/src/main/res/drawable/ic_cover.xml +9 -0
  102. package/android/src/main/res/drawable/ic_crop.xml +10 -0
  103. package/android/src/main/res/drawable/ic_delete.xml +9 -0
  104. package/android/src/main/res/drawable/ic_document.xml +10 -0
  105. package/android/src/main/res/drawable/ic_done.xml +10 -0
  106. package/android/src/main/res/drawable/ic_download.xml +10 -0
  107. package/android/src/main/res/drawable/ic_emoji.xml +10 -0
  108. package/android/src/main/res/drawable/ic_filter.xml +10 -0
  109. package/android/src/main/res/drawable/ic_flash_auto.xml +7 -0
  110. package/android/src/main/res/drawable/ic_flash_off.xml +23 -0
  111. package/android/src/main/res/drawable/ic_flash_on.xml +16 -0
  112. package/android/src/main/res/drawable/ic_flip.xml +15 -0
  113. package/android/src/main/res/drawable/ic_gallery.xml +10 -0
  114. package/android/src/main/res/drawable/ic_gif.xml +24 -0
  115. package/android/src/main/res/drawable/ic_lock.xml +19 -0
  116. package/android/src/main/res/drawable/ic_lock_open.xml +22 -0
  117. package/android/src/main/res/drawable/ic_marker.xml +10 -0
  118. package/android/src/main/res/drawable/ic_more_vert.xml +18 -0
  119. package/android/src/main/res/drawable/ic_overlay_close.xml +19 -0
  120. package/android/src/main/res/drawable/ic_overlay_resize.xml +18 -0
  121. package/android/src/main/res/drawable/ic_pause.xml +10 -0
  122. package/android/src/main/res/drawable/ic_photo_mode.xml +10 -0
  123. package/android/src/main/res/drawable/ic_play.xml +10 -0
  124. package/android/src/main/res/drawable/ic_redo.xml +10 -0
  125. package/android/src/main/res/drawable/ic_rotate.xml +9 -0
  126. package/android/src/main/res/drawable/ic_send.xml +10 -0
  127. package/android/src/main/res/drawable/ic_share.xml +10 -0
  128. package/android/src/main/res/drawable/ic_stat_upload.xml +10 -0
  129. package/android/src/main/res/drawable/ic_sticker.xml +24 -0
  130. package/android/src/main/res/drawable/ic_text.xml +10 -0
  131. package/android/src/main/res/drawable/ic_text_align_center.xml +11 -0
  132. package/android/src/main/res/drawable/ic_text_align_left.xml +11 -0
  133. package/android/src/main/res/drawable/ic_text_align_right.xml +11 -0
  134. package/android/src/main/res/drawable/ic_text_bg.xml +11 -0
  135. package/android/src/main/res/drawable/ic_trim.xml +23 -0
  136. package/android/src/main/res/drawable/ic_undo.xml +10 -0
  137. package/android/src/main/res/drawable/ic_video_mode.xml +10 -0
  138. package/android/src/main/res/drawable/ic_video_note.xml +13 -0
  139. package/android/src/main/res/drawable/ic_volume_off.xml +9 -0
  140. package/android/src/main/res/drawable/ic_volume_on.xml +9 -0
  141. package/android/src/main/res/drawable/sticker_heart.xml +9 -0
  142. package/android/src/main/res/drawable/sticker_smile.xml +9 -0
  143. package/android/src/main/res/drawable/sticker_star.xml +9 -0
  144. package/android/src/main/res/drawable/sticker_thumbsup.xml +9 -0
  145. package/android/src/main/res/values/colors.xml +34 -0
  146. package/android/src/main/res/values/ids.xml +15 -0
  147. package/android/src/main/res/values/strings.xml +15 -0
  148. package/android/src/main/res/values/styles.xml +20 -0
  149. package/android/src/main/res/xml/file_paths.xml +34 -0
  150. package/ios/CustomCamera.h +5 -0
  151. package/ios/CustomCamera.mm +214 -0
  152. package/lib/module/AudioPlayerContext.js +233 -0
  153. package/lib/module/AudioPlayerContext.js.map +1 -0
  154. package/lib/module/CameraPreview.js +304 -0
  155. package/lib/module/CameraPreview.js.map +1 -0
  156. package/lib/module/NativeAnimatedImageView.js +41 -0
  157. package/lib/module/NativeAnimatedImageView.js.map +1 -0
  158. package/lib/module/NativeAudioPlayerView.js +33 -0
  159. package/lib/module/NativeAudioPlayerView.js.map +1 -0
  160. package/lib/module/NativeBlurView.js +35 -0
  161. package/lib/module/NativeBlurView.js.map +1 -0
  162. package/lib/module/NativeCustomCamera.js +128 -0
  163. package/lib/module/NativeCustomCamera.js.map +1 -0
  164. package/lib/module/NativeCustomCamera.web.js +143 -0
  165. package/lib/module/NativeCustomCamera.web.js.map +1 -0
  166. package/lib/module/NativeCustomVideoView.js +5 -0
  167. package/lib/module/NativeCustomVideoView.js.map +1 -0
  168. package/lib/module/NativeDocumentPreviewView.js +156 -0
  169. package/lib/module/NativeDocumentPreviewView.js.map +1 -0
  170. package/lib/module/NativeMediaThumbnailView.js +110 -0
  171. package/lib/module/NativeMediaThumbnailView.js.map +1 -0
  172. package/lib/module/NativeSvgIcon.js +32 -0
  173. package/lib/module/NativeSvgIcon.js.map +1 -0
  174. package/lib/module/ResponsivePreviewContainer.js +171 -0
  175. package/lib/module/ResponsivePreviewContainer.js.map +1 -0
  176. package/lib/module/accessibility.js +61 -0
  177. package/lib/module/accessibility.js.map +1 -0
  178. package/lib/module/config.js +352 -0
  179. package/lib/module/config.js.map +1 -0
  180. package/lib/module/cpuOptimization.js +296 -0
  181. package/lib/module/cpuOptimization.js.map +1 -0
  182. package/lib/module/db/DatabaseManager.js +191 -0
  183. package/lib/module/db/DatabaseManager.js.map +1 -0
  184. package/lib/module/db/MediaMapper.js +284 -0
  185. package/lib/module/db/MediaMapper.js.map +1 -0
  186. package/lib/module/db/MediaRepository.js +242 -0
  187. package/lib/module/db/MediaRepository.js.map +1 -0
  188. package/lib/module/db/index.js +41 -0
  189. package/lib/module/db/index.js.map +1 -0
  190. package/lib/module/db/migrations.js +180 -0
  191. package/lib/module/db/migrations.js.map +1 -0
  192. package/lib/module/db/react-native-sqlcipher.d.js +2 -0
  193. package/lib/module/db/react-native-sqlcipher.d.js.map +1 -0
  194. package/lib/module/db/secureKey.js +87 -0
  195. package/lib/module/db/secureKey.js.map +1 -0
  196. package/lib/module/db/types.js +57 -0
  197. package/lib/module/db/types.js.map +1 -0
  198. package/lib/module/db/useMediaDatabase.js +123 -0
  199. package/lib/module/db/useMediaDatabase.js.map +1 -0
  200. package/lib/module/defaultIcons.js +2259 -0
  201. package/lib/module/defaultIcons.js.map +1 -0
  202. package/lib/module/deviceCapabilities.js +408 -0
  203. package/lib/module/deviceCapabilities.js.map +1 -0
  204. package/lib/module/errors.js +267 -0
  205. package/lib/module/errors.js.map +1 -0
  206. package/lib/module/iconConfig.js +796 -0
  207. package/lib/module/iconConfig.js.map +1 -0
  208. package/lib/module/icons.js +514 -0
  209. package/lib/module/icons.js.map +1 -0
  210. package/lib/module/index.js +251 -0
  211. package/lib/module/index.js.map +1 -0
  212. package/lib/module/jest-globals.d.js +2 -0
  213. package/lib/module/jest-globals.d.js.map +1 -0
  214. package/lib/module/library/MediaLibrary.js +107 -0
  215. package/lib/module/library/MediaLibrary.js.map +1 -0
  216. package/lib/module/library/MediaLibraryScreen.js +2597 -0
  217. package/lib/module/library/MediaLibraryScreen.js.map +1 -0
  218. package/lib/module/library/components/AudioPreview.js +74 -0
  219. package/lib/module/library/components/AudioPreview.js.map +1 -0
  220. package/lib/module/library/components/DocumentPreview.js +331 -0
  221. package/lib/module/library/components/DocumentPreview.js.map +1 -0
  222. package/lib/module/library/components/ExpandableFab.js +343 -0
  223. package/lib/module/library/components/ExpandableFab.js.map +1 -0
  224. package/lib/module/library/components/FileTiles.js +251 -0
  225. package/lib/module/library/components/FileTiles.js.map +1 -0
  226. package/lib/module/library/components/ImagePreview.js +70 -0
  227. package/lib/module/library/components/ImagePreview.js.map +1 -0
  228. package/lib/module/library/components/MediaMetadataHeader.js +175 -0
  229. package/lib/module/library/components/MediaMetadataHeader.js.map +1 -0
  230. package/lib/module/library/components/RecordAudioScreen.js +816 -0
  231. package/lib/module/library/components/RecordAudioScreen.js.map +1 -0
  232. package/lib/module/library/components/VideoPreview.js +453 -0
  233. package/lib/module/library/components/VideoPreview.js.map +1 -0
  234. package/lib/module/library/components/ViewerCounter.js +55 -0
  235. package/lib/module/library/components/ViewerCounter.js.map +1 -0
  236. package/lib/module/library/compressionEstimate.js +507 -0
  237. package/lib/module/library/compressionEstimate.js.map +1 -0
  238. package/lib/module/library/fileMetadata.js +196 -0
  239. package/lib/module/library/fileMetadata.js.map +1 -0
  240. package/lib/module/library/index.js +42 -0
  241. package/lib/module/library/index.js.map +1 -0
  242. package/lib/module/library/libraryIconRegistry.js +69 -0
  243. package/lib/module/library/libraryIconRegistry.js.map +1 -0
  244. package/lib/module/library/libraryIcons.js +858 -0
  245. package/lib/module/library/libraryIcons.js.map +1 -0
  246. package/lib/module/library/localizedFormat.js +181 -0
  247. package/lib/module/library/localizedFormat.js.map +1 -0
  248. package/lib/module/library/palette.js +225 -0
  249. package/lib/module/library/palette.js.map +1 -0
  250. package/lib/module/library/responsive.js +53 -0
  251. package/lib/module/library/responsive.js.map +1 -0
  252. package/lib/module/locales.js +416 -0
  253. package/lib/module/locales.js.map +1 -0
  254. package/lib/module/localization.js +1064 -0
  255. package/lib/module/localization.js.map +1 -0
  256. package/lib/module/logger.js +20 -0
  257. package/lib/module/logger.js.map +1 -0
  258. package/lib/module/lowMemoryCache.js +206 -0
  259. package/lib/module/lowMemoryCache.js.map +1 -0
  260. package/lib/module/mediaHistory.js +33 -0
  261. package/lib/module/mediaHistory.js.map +1 -0
  262. package/lib/module/mediaStorageService.js +402 -0
  263. package/lib/module/mediaStorageService.js.map +1 -0
  264. package/lib/module/memory.js +79 -0
  265. package/lib/module/memory.js.map +1 -0
  266. package/lib/module/nativeActions.js +307 -0
  267. package/lib/module/nativeActions.js.map +1 -0
  268. package/lib/module/nativeComponentSupport.js +61 -0
  269. package/lib/module/nativeComponentSupport.js.map +1 -0
  270. package/lib/module/networkPerformance.js +24 -0
  271. package/lib/module/networkPerformance.js.map +1 -0
  272. package/lib/module/package.json +1 -0
  273. package/lib/module/performance.js +104 -0
  274. package/lib/module/performance.js.map +1 -0
  275. package/lib/module/performanceMonitor.js +155 -0
  276. package/lib/module/performanceMonitor.js.map +1 -0
  277. package/lib/module/permissions.js +370 -0
  278. package/lib/module/permissions.js.map +1 -0
  279. package/lib/module/rendering.js +40 -0
  280. package/lib/module/rendering.js.map +1 -0
  281. package/lib/module/security.js +18 -0
  282. package/lib/module/security.js.map +1 -0
  283. package/lib/module/state.js +266 -0
  284. package/lib/module/state.js.map +1 -0
  285. package/lib/module/storage.js +400 -0
  286. package/lib/module/storage.js.map +1 -0
  287. package/lib/module/theme.js +390 -0
  288. package/lib/module/theme.js.map +1 -0
  289. package/lib/module/types.js +4 -0
  290. package/lib/module/types.js.map +1 -0
  291. package/lib/module/utils.js +115 -0
  292. package/lib/module/utils.js.map +1 -0
  293. package/lib/module/validation.js +288 -0
  294. package/lib/module/validation.js.map +1 -0
  295. package/lib/typescript/package.json +1 -0
  296. package/lib/typescript/src/AudioPlayerContext.d.ts +27 -0
  297. package/lib/typescript/src/AudioPlayerContext.d.ts.map +1 -0
  298. package/lib/typescript/src/CameraPreview.d.ts +13 -0
  299. package/lib/typescript/src/CameraPreview.d.ts.map +1 -0
  300. package/lib/typescript/src/NativeAnimatedImageView.d.ts +33 -0
  301. package/lib/typescript/src/NativeAnimatedImageView.d.ts.map +1 -0
  302. package/lib/typescript/src/NativeAudioPlayerView.d.ts +12 -0
  303. package/lib/typescript/src/NativeAudioPlayerView.d.ts.map +1 -0
  304. package/lib/typescript/src/NativeBlurView.d.ts +12 -0
  305. package/lib/typescript/src/NativeBlurView.d.ts.map +1 -0
  306. package/lib/typescript/src/NativeCustomCamera.d.ts +167 -0
  307. package/lib/typescript/src/NativeCustomCamera.d.ts.map +1 -0
  308. package/lib/typescript/src/NativeCustomCamera.web.d.ts +47 -0
  309. package/lib/typescript/src/NativeCustomCamera.web.d.ts.map +1 -0
  310. package/lib/typescript/src/NativeCustomVideoView.d.ts +30 -0
  311. package/lib/typescript/src/NativeCustomVideoView.d.ts.map +1 -0
  312. package/lib/typescript/src/NativeDocumentPreviewView.d.ts +48 -0
  313. package/lib/typescript/src/NativeDocumentPreviewView.d.ts.map +1 -0
  314. package/lib/typescript/src/NativeMediaThumbnailView.d.ts +54 -0
  315. package/lib/typescript/src/NativeMediaThumbnailView.d.ts.map +1 -0
  316. package/lib/typescript/src/NativeSvgIcon.d.ts +25 -0
  317. package/lib/typescript/src/NativeSvgIcon.d.ts.map +1 -0
  318. package/lib/typescript/src/ResponsivePreviewContainer.d.ts +92 -0
  319. package/lib/typescript/src/ResponsivePreviewContainer.d.ts.map +1 -0
  320. package/lib/typescript/src/accessibility.d.ts +20 -0
  321. package/lib/typescript/src/accessibility.d.ts.map +1 -0
  322. package/lib/typescript/src/config.d.ts +145 -0
  323. package/lib/typescript/src/config.d.ts.map +1 -0
  324. package/lib/typescript/src/cpuOptimization.d.ts +63 -0
  325. package/lib/typescript/src/cpuOptimization.d.ts.map +1 -0
  326. package/lib/typescript/src/db/DatabaseManager.d.ts +48 -0
  327. package/lib/typescript/src/db/DatabaseManager.d.ts.map +1 -0
  328. package/lib/typescript/src/db/MediaMapper.d.ts +77 -0
  329. package/lib/typescript/src/db/MediaMapper.d.ts.map +1 -0
  330. package/lib/typescript/src/db/MediaRepository.d.ts +66 -0
  331. package/lib/typescript/src/db/MediaRepository.d.ts.map +1 -0
  332. package/lib/typescript/src/db/index.d.ts +23 -0
  333. package/lib/typescript/src/db/index.d.ts.map +1 -0
  334. package/lib/typescript/src/db/migrations.d.ts +31 -0
  335. package/lib/typescript/src/db/migrations.d.ts.map +1 -0
  336. package/lib/typescript/src/db/secureKey.d.ts +10 -0
  337. package/lib/typescript/src/db/secureKey.d.ts.map +1 -0
  338. package/lib/typescript/src/db/types.d.ts +115 -0
  339. package/lib/typescript/src/db/types.d.ts.map +1 -0
  340. package/lib/typescript/src/db/useMediaDatabase.d.ts +41 -0
  341. package/lib/typescript/src/db/useMediaDatabase.d.ts.map +1 -0
  342. package/lib/typescript/src/defaultIcons.d.ts +139 -0
  343. package/lib/typescript/src/defaultIcons.d.ts.map +1 -0
  344. package/lib/typescript/src/deviceCapabilities.d.ts +92 -0
  345. package/lib/typescript/src/deviceCapabilities.d.ts.map +1 -0
  346. package/lib/typescript/src/errors.d.ts +95 -0
  347. package/lib/typescript/src/errors.d.ts.map +1 -0
  348. package/lib/typescript/src/iconConfig.d.ts +176 -0
  349. package/lib/typescript/src/iconConfig.d.ts.map +1 -0
  350. package/lib/typescript/src/icons.d.ts +217 -0
  351. package/lib/typescript/src/icons.d.ts.map +1 -0
  352. package/lib/typescript/src/index.d.ts +104 -0
  353. package/lib/typescript/src/index.d.ts.map +1 -0
  354. package/lib/typescript/src/library/MediaLibrary.d.ts +57 -0
  355. package/lib/typescript/src/library/MediaLibrary.d.ts.map +1 -0
  356. package/lib/typescript/src/library/MediaLibraryScreen.d.ts +51 -0
  357. package/lib/typescript/src/library/MediaLibraryScreen.d.ts.map +1 -0
  358. package/lib/typescript/src/library/components/AudioPreview.d.ts +6 -0
  359. package/lib/typescript/src/library/components/AudioPreview.d.ts.map +1 -0
  360. package/lib/typescript/src/library/components/DocumentPreview.d.ts +10 -0
  361. package/lib/typescript/src/library/components/DocumentPreview.d.ts.map +1 -0
  362. package/lib/typescript/src/library/components/ExpandableFab.d.ts +39 -0
  363. package/lib/typescript/src/library/components/ExpandableFab.d.ts.map +1 -0
  364. package/lib/typescript/src/library/components/FileTiles.d.ts +8 -0
  365. package/lib/typescript/src/library/components/FileTiles.d.ts.map +1 -0
  366. package/lib/typescript/src/library/components/ImagePreview.d.ts +5 -0
  367. package/lib/typescript/src/library/components/ImagePreview.d.ts.map +1 -0
  368. package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts +16 -0
  369. package/lib/typescript/src/library/components/MediaMetadataHeader.d.ts.map +1 -0
  370. package/lib/typescript/src/library/components/RecordAudioScreen.d.ts +8 -0
  371. package/lib/typescript/src/library/components/RecordAudioScreen.d.ts.map +1 -0
  372. package/lib/typescript/src/library/components/VideoPreview.d.ts +20 -0
  373. package/lib/typescript/src/library/components/VideoPreview.d.ts.map +1 -0
  374. package/lib/typescript/src/library/components/ViewerCounter.d.ts +13 -0
  375. package/lib/typescript/src/library/components/ViewerCounter.d.ts.map +1 -0
  376. package/lib/typescript/src/library/compressionEstimate.d.ts +313 -0
  377. package/lib/typescript/src/library/compressionEstimate.d.ts.map +1 -0
  378. package/lib/typescript/src/library/fileMetadata.d.ts +33 -0
  379. package/lib/typescript/src/library/fileMetadata.d.ts.map +1 -0
  380. package/lib/typescript/src/library/index.d.ts +40 -0
  381. package/lib/typescript/src/library/index.d.ts.map +1 -0
  382. package/lib/typescript/src/library/libraryIconRegistry.d.ts +35 -0
  383. package/lib/typescript/src/library/libraryIconRegistry.d.ts.map +1 -0
  384. package/lib/typescript/src/library/libraryIcons.d.ts +85 -0
  385. package/lib/typescript/src/library/libraryIcons.d.ts.map +1 -0
  386. package/lib/typescript/src/library/localizedFormat.d.ts +49 -0
  387. package/lib/typescript/src/library/localizedFormat.d.ts.map +1 -0
  388. package/lib/typescript/src/library/palette.d.ts +104 -0
  389. package/lib/typescript/src/library/palette.d.ts.map +1 -0
  390. package/lib/typescript/src/library/responsive.d.ts +15 -0
  391. package/lib/typescript/src/library/responsive.d.ts.map +1 -0
  392. package/lib/typescript/src/locales.d.ts +103 -0
  393. package/lib/typescript/src/locales.d.ts.map +1 -0
  394. package/lib/typescript/src/localization.d.ts +1051 -0
  395. package/lib/typescript/src/localization.d.ts.map +1 -0
  396. package/lib/typescript/src/logger.d.ts +4 -0
  397. package/lib/typescript/src/logger.d.ts.map +1 -0
  398. package/lib/typescript/src/lowMemoryCache.d.ts +64 -0
  399. package/lib/typescript/src/lowMemoryCache.d.ts.map +1 -0
  400. package/lib/typescript/src/mediaHistory.d.ts +3 -0
  401. package/lib/typescript/src/mediaHistory.d.ts.map +1 -0
  402. package/lib/typescript/src/mediaStorageService.d.ts +155 -0
  403. package/lib/typescript/src/mediaStorageService.d.ts.map +1 -0
  404. package/lib/typescript/src/memory.d.ts +21 -0
  405. package/lib/typescript/src/memory.d.ts.map +1 -0
  406. package/lib/typescript/src/nativeActions.d.ts +174 -0
  407. package/lib/typescript/src/nativeActions.d.ts.map +1 -0
  408. package/lib/typescript/src/nativeComponentSupport.d.ts +30 -0
  409. package/lib/typescript/src/nativeComponentSupport.d.ts.map +1 -0
  410. package/lib/typescript/src/networkPerformance.d.ts +12 -0
  411. package/lib/typescript/src/networkPerformance.d.ts.map +1 -0
  412. package/lib/typescript/src/performance.d.ts +32 -0
  413. package/lib/typescript/src/performance.d.ts.map +1 -0
  414. package/lib/typescript/src/performanceMonitor.d.ts +45 -0
  415. package/lib/typescript/src/performanceMonitor.d.ts.map +1 -0
  416. package/lib/typescript/src/permissions.d.ts +132 -0
  417. package/lib/typescript/src/permissions.d.ts.map +1 -0
  418. package/lib/typescript/src/rendering.d.ts +9 -0
  419. package/lib/typescript/src/rendering.d.ts.map +1 -0
  420. package/lib/typescript/src/security.d.ts +6 -0
  421. package/lib/typescript/src/security.d.ts.map +1 -0
  422. package/lib/typescript/src/state.d.ts +102 -0
  423. package/lib/typescript/src/state.d.ts.map +1 -0
  424. package/lib/typescript/src/storage.d.ts +117 -0
  425. package/lib/typescript/src/storage.d.ts.map +1 -0
  426. package/lib/typescript/src/theme.d.ts +15 -0
  427. package/lib/typescript/src/theme.d.ts.map +1 -0
  428. package/lib/typescript/src/types.d.ts +802 -0
  429. package/lib/typescript/src/types.d.ts.map +1 -0
  430. package/lib/typescript/src/utils.d.ts +50 -0
  431. package/lib/typescript/src/utils.d.ts.map +1 -0
  432. package/lib/typescript/src/validation.d.ts +52 -0
  433. package/lib/typescript/src/validation.d.ts.map +1 -0
  434. package/package.json +204 -0
  435. package/react-native.config.js +17 -0
  436. package/src/AudioPlayerContext.tsx +220 -0
  437. package/src/CameraPreview.tsx +352 -0
  438. package/src/NativeAnimatedImageView.tsx +71 -0
  439. package/src/NativeAudioPlayerView.tsx +39 -0
  440. package/src/NativeBlurView.tsx +40 -0
  441. package/src/NativeCustomCamera.ts +305 -0
  442. package/src/NativeCustomCamera.web.ts +192 -0
  443. package/src/NativeCustomVideoView.ts +30 -0
  444. package/src/NativeDocumentPreviewView.tsx +196 -0
  445. package/src/NativeMediaThumbnailView.tsx +167 -0
  446. package/src/NativeSvgIcon.tsx +46 -0
  447. package/src/ResponsivePreviewContainer.tsx +227 -0
  448. package/src/accessibility.ts +80 -0
  449. package/src/config.ts +406 -0
  450. package/src/cpuOptimization.ts +365 -0
  451. package/src/db/DatabaseManager.ts +212 -0
  452. package/src/db/MediaMapper.ts +377 -0
  453. package/src/db/MediaRepository.ts +313 -0
  454. package/src/db/index.ts +73 -0
  455. package/src/db/migrations.ts +222 -0
  456. package/src/db/react-native-sqlcipher.d.ts +76 -0
  457. package/src/db/secureKey.ts +100 -0
  458. package/src/db/types.ts +123 -0
  459. package/src/db/useMediaDatabase.ts +191 -0
  460. package/src/defaultIcons.tsx +2390 -0
  461. package/src/deviceCapabilities.ts +438 -0
  462. package/src/errors.ts +350 -0
  463. package/src/iconConfig.tsx +962 -0
  464. package/src/icons.tsx +788 -0
  465. package/src/index.tsx +763 -0
  466. package/src/jest-globals.d.ts +9 -0
  467. package/src/library/MediaLibrary.tsx +141 -0
  468. package/src/library/MediaLibraryScreen.tsx +3003 -0
  469. package/src/library/components/AudioPreview.tsx +73 -0
  470. package/src/library/components/DocumentPreview.tsx +361 -0
  471. package/src/library/components/ExpandableFab.tsx +342 -0
  472. package/src/library/components/FileTiles.tsx +252 -0
  473. package/src/library/components/ImagePreview.tsx +72 -0
  474. package/src/library/components/MediaMetadataHeader.tsx +208 -0
  475. package/src/library/components/RecordAudioScreen.tsx +845 -0
  476. package/src/library/components/VideoPreview.tsx +478 -0
  477. package/src/library/components/ViewerCounter.tsx +71 -0
  478. package/src/library/compressionEstimate.ts +662 -0
  479. package/src/library/fileMetadata.ts +212 -0
  480. package/src/library/index.ts +66 -0
  481. package/src/library/libraryIconRegistry.tsx +86 -0
  482. package/src/library/libraryIcons.tsx +928 -0
  483. package/src/library/localizedFormat.ts +207 -0
  484. package/src/library/palette.ts +281 -0
  485. package/src/library/responsive.ts +49 -0
  486. package/src/locales.ts +381 -0
  487. package/src/localization.ts +1947 -0
  488. package/src/logger.ts +20 -0
  489. package/src/lowMemoryCache.ts +218 -0
  490. package/src/mediaHistory.ts +42 -0
  491. package/src/mediaStorageService.ts +546 -0
  492. package/src/memory.ts +102 -0
  493. package/src/nativeActions.ts +422 -0
  494. package/src/nativeComponentSupport.ts +60 -0
  495. package/src/networkPerformance.ts +30 -0
  496. package/src/performance.ts +137 -0
  497. package/src/performanceMonitor.ts +219 -0
  498. package/src/permissions.ts +403 -0
  499. package/src/rendering.ts +47 -0
  500. package/src/security.ts +19 -0
  501. package/src/state.ts +333 -0
  502. package/src/storage.ts +453 -0
  503. package/src/theme.tsx +467 -0
  504. package/src/types.ts +946 -0
  505. package/src/utils.ts +177 -0
  506. package/src/validation.ts +372 -0
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Schema versioning & migrations for the encrypted media database.
5
+ *
6
+ * Versioning uses SQLite's built-in `PRAGMA user_version`. On every open,
7
+ * `runMigrations` reads the current version and applies — inside a single
8
+ * transaction — every migration whose target version is greater than it, in
9
+ * ascending order. Adding a new schema change is a matter of appending one more
10
+ * entry to `MIGRATIONS`; never edit or reorder existing entries.
11
+ */
12
+ import { MEDIA_TABLE, MediaColumns } from "./types.js";
13
+
14
+ /** A single forward migration step. */
15
+
16
+ /**
17
+ * Ordered list of migrations. `LATEST_SCHEMA_VERSION` is derived from the last
18
+ * entry, so bumping the schema only requires appending a new `Migration`.
19
+ */
20
+ export const MIGRATIONS = [{
21
+ version: 1,
22
+ description: 'Initial media table with type/source indexes',
23
+ statements: [`CREATE TABLE IF NOT EXISTS ${MEDIA_TABLE} (
24
+ ${MediaColumns.id} TEXT PRIMARY KEY NOT NULL,
25
+ ${MediaColumns.mediaType} TEXT NOT NULL CHECK (${MediaColumns.mediaType} IN ('image','video')),
26
+ ${MediaColumns.source} TEXT NOT NULL CHECK (${MediaColumns.source} IN ('camera','gallery')),
27
+ ${MediaColumns.filePath} TEXT NOT NULL,
28
+ ${MediaColumns.fileName} TEXT NOT NULL,
29
+ ${MediaColumns.fileSize} INTEGER,
30
+ ${MediaColumns.width} INTEGER,
31
+ ${MediaColumns.height} INTEGER,
32
+ ${MediaColumns.duration} INTEGER,
33
+ ${MediaColumns.mimeType} TEXT,
34
+ ${MediaColumns.createdAt} INTEGER NOT NULL,
35
+ ${MediaColumns.updatedAt} INTEGER NOT NULL
36
+ );`, `CREATE INDEX IF NOT EXISTS idx_media_type
37
+ ON ${MEDIA_TABLE} (${MediaColumns.mediaType});`, `CREATE INDEX IF NOT EXISTS idx_media_created_at
38
+ ON ${MEDIA_TABLE} (${MediaColumns.createdAt} DESC);`,
39
+ // Non-unique: speeds up delete-by-path without rejecting a re-selected
40
+ // file that arrives under a new id (dedup is keyed on the primary id).
41
+ `CREATE INDEX IF NOT EXISTS idx_media_file_path
42
+ ON ${MEDIA_TABLE} (${MediaColumns.filePath});`]
43
+ }, {
44
+ version: 2,
45
+ description: 'Composite (media_type, created_at DESC) index for the filtered+ordered list query',
46
+ statements: [
47
+ // The Photos/Videos filters run `WHERE media_type = ? ORDER BY created_at DESC`
48
+ // (see MediaRepository.getAll). The single-column idx_media_type filters but then
49
+ // forces a sort of the matching rows on every query; the single-column
50
+ // idx_media_created_at orders but can't also filter. A composite index lets SQLite
51
+ // satisfy BOTH the equality filter and the ordering from one index — no separate
52
+ // sort step — which keeps the filtered list fast as the library grows into the
53
+ // thousands. Purely additive (CREATE INDEX IF NOT EXISTS): no data change, and the
54
+ // unfiltered "All" query keeps using idx_media_created_at.
55
+ `CREATE INDEX IF NOT EXISTS idx_media_type_created_at
56
+ ON ${MEDIA_TABLE} (${MediaColumns.mediaType}, ${MediaColumns.createdAt} DESC);`]
57
+ }, {
58
+ version: 3,
59
+ description: 'Widen media_type to include document + audio, and reclassify legacy rows by MIME/extension',
60
+ // SQLite cannot ALTER a CHECK constraint in place, so the table is rebuilt.
61
+ // The copy step reclassifies rows the old two-kind schema was forced to store
62
+ // as `image`: a picked PDF/track kept its real MIME (e.g. application/pdf,
63
+ // audio/mpeg) even though media_type was clamped to 'image', so we recover the
64
+ // correct kind here from mime_type (then the file extension as a fallback).
65
+ statements: [
66
+ // 1. Park the current table out of the way (its indexes move with it).
67
+ `ALTER TABLE ${MEDIA_TABLE} RENAME TO ${MEDIA_TABLE}_legacy_v2;`,
68
+ // 2. Recreate the table with the widened media_type CHECK constraint.
69
+ `CREATE TABLE ${MEDIA_TABLE} (
70
+ ${MediaColumns.id} TEXT PRIMARY KEY NOT NULL,
71
+ ${MediaColumns.mediaType} TEXT NOT NULL CHECK (${MediaColumns.mediaType} IN ('image','video','document','audio')),
72
+ ${MediaColumns.source} TEXT NOT NULL CHECK (${MediaColumns.source} IN ('camera','gallery')),
73
+ ${MediaColumns.filePath} TEXT NOT NULL,
74
+ ${MediaColumns.fileName} TEXT NOT NULL,
75
+ ${MediaColumns.fileSize} INTEGER,
76
+ ${MediaColumns.width} INTEGER,
77
+ ${MediaColumns.height} INTEGER,
78
+ ${MediaColumns.duration} INTEGER,
79
+ ${MediaColumns.mimeType} TEXT,
80
+ ${MediaColumns.createdAt} INTEGER NOT NULL,
81
+ ${MediaColumns.updatedAt} INTEGER NOT NULL
82
+ );`,
83
+ // 3. Copy rows over, reclassifying media_type from mime_type / file extension.
84
+ `INSERT INTO ${MEDIA_TABLE} (
85
+ ${MediaColumns.id}, ${MediaColumns.mediaType}, ${MediaColumns.source},
86
+ ${MediaColumns.filePath}, ${MediaColumns.fileName}, ${MediaColumns.fileSize},
87
+ ${MediaColumns.width}, ${MediaColumns.height}, ${MediaColumns.duration},
88
+ ${MediaColumns.mimeType}, ${MediaColumns.createdAt}, ${MediaColumns.updatedAt}
89
+ )
90
+ SELECT
91
+ ${MediaColumns.id},
92
+ CASE
93
+ WHEN ${MediaColumns.mediaType} = 'video' THEN 'video'
94
+ WHEN ${MediaColumns.mimeType} LIKE 'video/%' THEN 'video'
95
+ WHEN ${MediaColumns.mimeType} LIKE 'audio/%' THEN 'audio'
96
+ WHEN ${MediaColumns.mimeType} LIKE 'image/%' THEN 'image'
97
+ WHEN ${MediaColumns.mimeType} = 'application/pdf'
98
+ OR ${MediaColumns.mimeType} LIKE 'application/vnd.%'
99
+ OR ${MediaColumns.mimeType} LIKE 'application/msword%'
100
+ OR ${MediaColumns.mimeType} LIKE 'application/rtf%'
101
+ OR ${MediaColumns.mimeType} = 'application/epub+zip'
102
+ OR ${MediaColumns.mimeType} LIKE 'text/%' THEN 'document'
103
+ WHEN lower(${MediaColumns.fileName}) LIKE '%.mp4'
104
+ OR lower(${MediaColumns.fileName}) LIKE '%.mov'
105
+ OR lower(${MediaColumns.fileName}) LIKE '%.mkv'
106
+ OR lower(${MediaColumns.fileName}) LIKE '%.webm'
107
+ OR lower(${MediaColumns.fileName}) LIKE '%.3gp'
108
+ OR lower(${MediaColumns.fileName}) LIKE '%.m4v' THEN 'video'
109
+ WHEN lower(${MediaColumns.fileName}) LIKE '%.mp3'
110
+ OR lower(${MediaColumns.fileName}) LIKE '%.wav'
111
+ OR lower(${MediaColumns.fileName}) LIKE '%.aac'
112
+ OR lower(${MediaColumns.fileName}) LIKE '%.m4a'
113
+ OR lower(${MediaColumns.fileName}) LIKE '%.ogg'
114
+ OR lower(${MediaColumns.fileName}) LIKE '%.flac'
115
+ OR lower(${MediaColumns.fileName}) LIKE '%.opus'
116
+ OR lower(${MediaColumns.fileName}) LIKE '%.amr' THEN 'audio'
117
+ WHEN lower(${MediaColumns.fileName}) LIKE '%.pdf'
118
+ OR lower(${MediaColumns.fileName}) LIKE '%.doc'
119
+ OR lower(${MediaColumns.fileName}) LIKE '%.docx'
120
+ OR lower(${MediaColumns.fileName}) LIKE '%.xls'
121
+ OR lower(${MediaColumns.fileName}) LIKE '%.xlsx'
122
+ OR lower(${MediaColumns.fileName}) LIKE '%.ppt'
123
+ OR lower(${MediaColumns.fileName}) LIKE '%.pptx'
124
+ OR lower(${MediaColumns.fileName}) LIKE '%.txt'
125
+ OR lower(${MediaColumns.fileName}) LIKE '%.csv'
126
+ OR lower(${MediaColumns.fileName}) LIKE '%.rtf'
127
+ OR lower(${MediaColumns.fileName}) LIKE '%.odt'
128
+ OR lower(${MediaColumns.fileName}) LIKE '%.ods'
129
+ OR lower(${MediaColumns.fileName}) LIKE '%.odp'
130
+ OR lower(${MediaColumns.fileName}) LIKE '%.epub' THEN 'document'
131
+ ELSE 'image'
132
+ END,
133
+ ${MediaColumns.source}, ${MediaColumns.filePath}, ${MediaColumns.fileName},
134
+ ${MediaColumns.fileSize}, ${MediaColumns.width}, ${MediaColumns.height},
135
+ ${MediaColumns.duration}, ${MediaColumns.mimeType}, ${MediaColumns.createdAt},
136
+ ${MediaColumns.updatedAt}
137
+ FROM ${MEDIA_TABLE}_legacy_v2;`,
138
+ // 4. Drop the legacy table (this also drops its now-orphaned indexes,
139
+ // freeing the index names for recreation below).
140
+ `DROP TABLE ${MEDIA_TABLE}_legacy_v2;`,
141
+ // 5. Recreate every index on the rebuilt table.
142
+ `CREATE INDEX IF NOT EXISTS idx_media_type
143
+ ON ${MEDIA_TABLE} (${MediaColumns.mediaType});`, `CREATE INDEX IF NOT EXISTS idx_media_created_at
144
+ ON ${MEDIA_TABLE} (${MediaColumns.createdAt} DESC);`, `CREATE INDEX IF NOT EXISTS idx_media_file_path
145
+ ON ${MEDIA_TABLE} (${MediaColumns.filePath});`, `CREATE INDEX IF NOT EXISTS idx_media_type_created_at
146
+ ON ${MEDIA_TABLE} (${MediaColumns.mediaType}, ${MediaColumns.createdAt} DESC);`]
147
+ }, {
148
+ version: 4,
149
+ description: 'Add size_is_display_estimate flag: true when file_size is a compressed video’s proportional display figure, not the exact bytes on disk',
150
+ // Purely additive. Existing rows get NULL (read back as false), so nothing
151
+ // that was stored before this column re-stats differently. Only compressed
152
+ // videos published from the editor set it to 1 (see CameraAsset.sizeIsDisplayEstimate).
153
+ statements: [`ALTER TABLE ${MEDIA_TABLE} ADD COLUMN ${MediaColumns.sizeIsDisplayEstimate} INTEGER;`]
154
+ }];
155
+
156
+ /** The schema version the app expects after all migrations are applied. */
157
+ export const LATEST_SCHEMA_VERSION = MIGRATIONS.length > 0 ? MIGRATIONS[MIGRATIONS.length - 1].version : 0;
158
+
159
+ /** Minimal executor contract so migrations don't depend on the concrete manager. */
160
+
161
+ /**
162
+ * Applies all pending migrations. Safe to call on every launch — a fully
163
+ * up-to-date database performs only a cheap version read and returns.
164
+ *
165
+ * @returns the schema version after migration.
166
+ */
167
+ export async function runMigrations(executor) {
168
+ const currentVersion = await executor.getVersion();
169
+ if (currentVersion >= LATEST_SCHEMA_VERSION) {
170
+ return currentVersion;
171
+ }
172
+ const pending = MIGRATIONS.filter(m => m.version > currentVersion).sort((a, b) => a.version - b.version);
173
+ for (const migration of pending) {
174
+ // Each migration is atomic: the DDL statements and the version bump land in
175
+ // one transaction, or the whole step rolls back and the next launch retries.
176
+ await executor.runBatch([...migration.statements, `PRAGMA user_version = ${Math.floor(migration.version)};`]);
177
+ }
178
+ return LATEST_SCHEMA_VERSION;
179
+ }
180
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MEDIA_TABLE","MediaColumns","MIGRATIONS","version","description","statements","id","mediaType","source","filePath","fileName","fileSize","width","height","duration","mimeType","createdAt","updatedAt","sizeIsDisplayEstimate","LATEST_SCHEMA_VERSION","length","runMigrations","executor","currentVersion","getVersion","pending","filter","m","sort","a","b","migration","runBatch","Math","floor"],"sourceRoot":"..\\..\\..\\src","sources":["db/migrations.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=react-native-sqlcipher.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"..\\..\\..\\src","sources":["db/react-native-sqlcipher.d.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Encryption-key provisioning for the SQLCipher database.
5
+ *
6
+ * Strategy (most secure first):
7
+ * 1. Native `SecureKeyModule` (Android) — generates a cryptographically random
8
+ * 256-bit key on first launch and persists it in `EncryptedSharedPreferences`,
9
+ * which is sealed by a master key held in the Android Keystore. The raw key
10
+ * material therefore never lives in the JS bundle or in plaintext on disk.
11
+ * 2. Fallback — a locally derived key used only when the native module is
12
+ * unavailable (web, iOS without the native helper, or an older build). This
13
+ * keeps the app functional but is NOT hardware-backed; see the warning below.
14
+ *
15
+ * The resolved key is cached in-memory for the process lifetime so the native
16
+ * bridge is hit at most once.
17
+ */
18
+ import { NativeModules, Platform } from 'react-native';
19
+
20
+ /** Shape of the optional native key module. */
21
+
22
+ const nativeKeyModule = NativeModules.SecureKeyModule;
23
+ let cachedKey = null;
24
+
25
+ /**
26
+ * Deterministic fallback key. Used ONLY when no native Keystore-backed module is
27
+ * present. It is intentionally derived (not a bare literal) but, because it is
28
+ * reconstructable from the bundle, it does not provide hardware-backed secrecy.
29
+ * On Android the native module supersedes this path.
30
+ */
31
+ function deriveFallbackKey() {
32
+ // A stable, app-scoped seed combined into a 64-hex-char (256-bit) string.
33
+ const seed = `rncc.media.${Platform.OS}.v1.9f3ac21e-secure-media-store`;
34
+ let h1 = 0x811c9dc5;
35
+ let h2 = 0xc2b2ae35;
36
+ for (let i = 0; i < seed.length; i++) {
37
+ const c = seed.charCodeAt(i);
38
+ h1 = Math.imul(h1 ^ c, 0x01000193) >>> 0;
39
+ h2 = Math.imul(h2 ^ c, 0x85ebca77) >>> 0;
40
+ }
41
+ // Expand the two 32-bit hashes into 64 hex chars deterministically.
42
+ let out = '';
43
+ let a = h1 >>> 0;
44
+ let b = h2 >>> 0;
45
+ for (let i = 0; i < 8; i++) {
46
+ a = Math.imul(a, 0x9e3779b1) + 0x7f4a7c15 >>> 0;
47
+ b = Math.imul(b, 0x85ebca6b) + 0xc2b2ae35 >>> 0;
48
+ out += a.toString(16).padStart(8, '0');
49
+ out += b.toString(16).padStart(8, '0');
50
+ }
51
+ return out.slice(0, 64);
52
+ }
53
+
54
+ /**
55
+ * Resolve the SQLCipher passphrase, preferring the hardware-backed native key.
56
+ * The result is memoized for the lifetime of the JS runtime.
57
+ */
58
+ export async function getDatabaseKey() {
59
+ if (cachedKey) return cachedKey;
60
+ if (nativeKeyModule?.getOrCreateDatabaseKey) {
61
+ try {
62
+ const key = await nativeKeyModule.getOrCreateDatabaseKey();
63
+ if (key && key.length >= 16) {
64
+ cachedKey = key;
65
+ return cachedKey;
66
+ }
67
+ console.warn('[SecureKey] Native module returned an unusable key; using fallback.');
68
+ } catch (error) {
69
+ console.warn('[SecureKey] Native key retrieval failed; using fallback.', error);
70
+ }
71
+ } else if (Platform.OS === 'android') {
72
+ console.warn('[SecureKey] SecureKeyModule not linked. Rebuild the Android app to enable ' + 'Keystore-backed encryption; using derived fallback key for now.');
73
+ }
74
+ cachedKey = deriveFallbackKey();
75
+ return cachedKey;
76
+ }
77
+
78
+ /** True when the hardware-backed native key module is available. */
79
+ export function isHardwareBackedKeyAvailable() {
80
+ return Boolean(nativeKeyModule?.getOrCreateDatabaseKey);
81
+ }
82
+
83
+ /** Test/hot-reload helper: clears the in-memory key cache. */
84
+ export function __resetDatabaseKeyCache() {
85
+ cachedKey = null;
86
+ }
87
+ //# sourceMappingURL=secureKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","nativeKeyModule","SecureKeyModule","cachedKey","deriveFallbackKey","seed","OS","h1","h2","i","length","c","charCodeAt","Math","imul","out","a","b","toString","padStart","slice","getDatabaseKey","getOrCreateDatabaseKey","key","console","warn","error","isHardwareBackedKeyAvailable","Boolean","__resetDatabaseKeyCache"],"sourceRoot":"..\\..\\..\\src","sources":["db/secureKey.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;;AAEtD;;AAKA,MAAMC,eAAkD,GACtDF,aAAa,CACbG,eAAe;AAEjB,IAAIC,SAAwB,GAAG,IAAI;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,iBAAiBA,CAAA,EAAW;EACnC;EACA,MAAMC,IAAI,GAAG,cAAcL,QAAQ,CAACM,EAAE,iCAAiC;EACvE,IAAIC,EAAE,GAAG,UAAU;EACnB,IAAIC,EAAE,GAAG,UAAU;EACnB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,CAACK,MAAM,EAAED,CAAC,EAAE,EAAE;IACpC,MAAME,CAAC,GAAGN,IAAI,CAACO,UAAU,CAACH,CAAC,CAAC;IAC5BF,EAAE,GAAGM,IAAI,CAACC,IAAI,CAACP,EAAE,GAAGI,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;IACxCH,EAAE,GAAGK,IAAI,CAACC,IAAI,CAACN,EAAE,GAAGG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;EAC1C;EACA;EACA,IAAII,GAAG,GAAG,EAAE;EACZ,IAAIC,CAAC,GAAGT,EAAE,KAAK,CAAC;EAChB,IAAIU,CAAC,GAAGT,EAAE,KAAK,CAAC;EAChB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;IAC1BO,CAAC,GAAIH,IAAI,CAACC,IAAI,CAACE,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,KAAM,CAAC;IACjDC,CAAC,GAAIJ,IAAI,CAACC,IAAI,CAACG,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,KAAM,CAAC;IACjDF,GAAG,IAAIC,CAAC,CAACE,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACtCJ,GAAG,IAAIE,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EACxC;EACA,OAAOJ,GAAG,CAACK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACzB;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeC,cAAcA,CAAA,EAAoB;EACtD,IAAIlB,SAAS,EAAE,OAAOA,SAAS;EAE/B,IAAIF,eAAe,EAAEqB,sBAAsB,EAAE;IAC3C,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMtB,eAAe,CAACqB,sBAAsB,CAAC,CAAC;MAC1D,IAAIC,GAAG,IAAIA,GAAG,CAACb,MAAM,IAAI,EAAE,EAAE;QAC3BP,SAAS,GAAGoB,GAAG;QACf,OAAOpB,SAAS;MAClB;MACAqB,OAAO,CAACC,IAAI,CACV,qEACF,CAAC;IACH,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdF,OAAO,CAACC,IAAI,CACV,0DAA0D,EAC1DC,KACF,CAAC;IACH;EACF,CAAC,MAAM,IAAI1B,QAAQ,CAACM,EAAE,KAAK,SAAS,EAAE;IACpCkB,OAAO,CAACC,IAAI,CACV,4EAA4E,GAC1E,iEACJ,CAAC;EACH;EAEAtB,SAAS,GAAGC,iBAAiB,CAAC,CAAC;EAC/B,OAAOD,SAAS;AAClB;;AAEA;AACA,OAAO,SAASwB,4BAA4BA,CAAA,EAAY;EACtD,OAAOC,OAAO,CAAC3B,eAAe,EAAEqB,sBAAsB,CAAC;AACzD;;AAEA;AACA,OAAO,SAASO,uBAAuBA,CAAA,EAAS;EAC9C1B,SAAS,GAAG,IAAI;AAClB","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Strongly-typed media models for the encrypted SQLCipher database.
5
+ *
6
+ * These types describe the *persistence* shape of a media item — the exact
7
+ * columns stored in the `media` table — independently of the UI-facing
8
+ * `CameraAsset` type. Mapping between the two lives in `MediaMapper.ts`, keeping
9
+ * a clean separation between the database schema and the rest of the app.
10
+ */
11
+
12
+ /**
13
+ * Persisted media kind. Photos are normalized to `image`; documents and audio
14
+ * are first-class kinds so a picked PDF/track is never mis-stored as an image.
15
+ */
16
+
17
+ /** Where a media item originated. */
18
+
19
+ /**
20
+ * A single row of the `media` table — the canonical, strongly-typed record.
21
+ *
22
+ * `null` is used (never `undefined`) for absent optional columns so the shape
23
+ * maps 1:1 onto SQL rows.
24
+ */
25
+
26
+ /**
27
+ * Fields required to insert a new media record. Timestamps are optional on
28
+ * input — the repository fills `createdAt`/`updatedAt` when omitted.
29
+ */
30
+
31
+ /** Filter used when querying the media list. */
32
+
33
+ /**
34
+ * Aggregate counts computed directly from the database via `COUNT(*)`.
35
+ * Backs the filter-card counters (All / Photos / Videos / Documents / Audio).
36
+ */
37
+
38
+ /** Options for ordered/paged queries against the media table. */
39
+
40
+ /** Table + column name constants — single source of truth for SQL strings. */
41
+ export const MEDIA_TABLE = 'media';
42
+ export const MediaColumns = {
43
+ id: 'id',
44
+ mediaType: 'media_type',
45
+ source: 'source',
46
+ filePath: 'file_path',
47
+ fileName: 'file_name',
48
+ fileSize: 'file_size',
49
+ width: 'width',
50
+ height: 'height',
51
+ duration: 'duration',
52
+ mimeType: 'mime_type',
53
+ createdAt: 'created_at',
54
+ updatedAt: 'updated_at',
55
+ sizeIsDisplayEstimate: 'size_is_display_estimate'
56
+ };
57
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MEDIA_TABLE","MediaColumns","id","mediaType","source","filePath","fileName","fileSize","width","height","duration","mimeType","createdAt","updatedAt","sizeIsDisplayEstimate"],"sourceRoot":"..\\..\\..\\src","sources":["db/types.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAmCA;AACA;AACA;AACA;;AAkBA;;AAGA;AACA;AACA;AACA;;AASA;;AAWA;AACA,OAAO,MAAMA,WAAW,GAAG,OAAO;AAElC,OAAO,MAAMC,YAAY,GAAG;EAC1BC,EAAE,EAAE,IAAI;EACRC,SAAS,EAAE,YAAY;EACvBC,MAAM,EAAE,QAAQ;EAChBC,QAAQ,EAAE,WAAW;EACrBC,QAAQ,EAAE,WAAW;EACrBC,QAAQ,EAAE,WAAW;EACrBC,KAAK,EAAE,OAAO;EACdC,MAAM,EAAE,QAAQ;EAChBC,QAAQ,EAAE,UAAU;EACpBC,QAAQ,EAAE,WAAW;EACrBC,SAAS,EAAE,YAAY;EACvBC,SAAS,EAAE,YAAY;EACvBC,qBAAqB,EAAE;AACzB,CAAU","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useMediaDatabase — the clean bridge between the Media Library UI and the
5
+ * encrypted SQLCipher store.
6
+ *
7
+ * The screen renders `CameraAsset`s and never touches SQL: it consumes this
8
+ * hook's state (`assets`, `counts`, `loading`) and calls its actions
9
+ * (`addAssets`, `removeById`, `refresh`). Every mutation writes to SQLCipher
10
+ * first, then refreshes derived state from the database so the list and the
11
+ * filter-card counters always stay in sync with persistence.
12
+ */
13
+ import { useCallback, useEffect, useRef, useState } from 'react';
14
+ // Imported from the TurboModule directly, NOT from '../index': index re-exports this
15
+ // hook, so going through it would close an import cycle.
16
+ import CustomCamera from '../NativeCustomCamera';
17
+ import { initializeMediaDatabase } from "./DatabaseManager.js";
18
+ import { getMediaRepository } from "./MediaRepository.js";
19
+ import { recordToAsset } from "./MediaMapper.js";
20
+ const EMPTY_COUNTS = {
21
+ all: 0,
22
+ image: 0,
23
+ video: 0,
24
+ document: 0,
25
+ audio: 0
26
+ };
27
+ /**
28
+ * @param autoInit when true (default) the hook opens the DB and loads on mount.
29
+ */
30
+ export function useMediaDatabase(autoInit = true) {
31
+ const [assets, setAssets] = useState([]);
32
+ const [counts, setCounts] = useState(EMPTY_COUNTS);
33
+ const [loading, setLoading] = useState(autoInit);
34
+ const [error, setError] = useState(null);
35
+ const mountedRef = useRef(true);
36
+ const repo = getMediaRepository();
37
+
38
+ /** Reloads the full list and counts from SQLCipher. */
39
+ const refresh = useCallback(async () => {
40
+ const [records, freshCounts] = await Promise.all([repo.getAll(), repo.getCounts()]);
41
+ if (!mountedRef.current) return;
42
+ setAssets(records.map(recordToAsset));
43
+ setCounts(freshCounts);
44
+ }, [repo]);
45
+ useEffect(() => {
46
+ mountedRef.current = true;
47
+ if (!autoInit) return;
48
+ (async () => {
49
+ try {
50
+ await initializeMediaDatabase();
51
+ await refresh();
52
+ } catch (err) {
53
+ if (mountedRef.current) {
54
+ setError(err instanceof Error ? err : new Error(String(err)));
55
+ }
56
+ // Keep the app usable even if the encrypted DB can't open (e.g. web).
57
+ console.warn('[useMediaDatabase] initialization failed:', err);
58
+ } finally {
59
+ if (mountedRef.current) setLoading(false);
60
+ }
61
+ })();
62
+ return () => {
63
+ mountedRef.current = false;
64
+ };
65
+ }, [autoInit, refresh]);
66
+ const addAssets = useCallback(async (incoming, source) => {
67
+ if (!incoming || incoming.length === 0) return [];
68
+ // The repository persists ONLY assets confirmed in the Documents directory
69
+ // and auto-detects the origin when `source` is omitted. It returns just the
70
+ // records actually written (cache-only/publish-failed assets are skipped).
71
+ const records = await repo.insertAssets(incoming, source);
72
+ // Re-read from the DB so the list + counters reflect exactly what was
73
+ // persisted — the single source of truth.
74
+ await refresh();
75
+ return records.map(recordToAsset);
76
+ }, [repo, refresh]);
77
+ const removeById = useCallback(async id => {
78
+ await repo.deleteById(id);
79
+ await refresh();
80
+ }, [repo, refresh]);
81
+ const removeMany = useCallback(async ids => {
82
+ await repo.deleteMany(ids);
83
+ await refresh();
84
+ }, [repo, refresh]);
85
+ const secureRemoveById = useCallback(async id => {
86
+ const record = await repo.getById(id);
87
+ if (!record) return null;
88
+
89
+ // The FILE goes first. Deleting the row first would strand the media on disk
90
+ // with nothing left pointing at it — unreachable from the UI, but fully
91
+ // intact and recoverable, which is the opposite of what a delete promises.
92
+ let report = null;
93
+ try {
94
+ report = await CustomCamera.secureDeleteMedia(record.filePath, {
95
+ assetId: record.id,
96
+ fileName: record.fileName
97
+ });
98
+ } catch (err) {
99
+ // Swallowed deliberately: the row is still removed below so the item does
100
+ // not linger in the library, and the null report tells the caller the
101
+ // secure-erase guarantee was NOT met.
102
+ console.warn('[useMediaDatabase] secure erase failed for', id, err);
103
+ }
104
+ if (report && !report.fullySecure) {
105
+ console.warn('[useMediaDatabase] media removed without a verified secure erase:', JSON.stringify(report));
106
+ }
107
+ await repo.deleteById(id);
108
+ await refresh();
109
+ return report;
110
+ }, [repo, refresh]);
111
+ return {
112
+ assets,
113
+ counts,
114
+ loading,
115
+ error,
116
+ addAssets,
117
+ removeById,
118
+ removeMany,
119
+ secureRemoveById,
120
+ refresh
121
+ };
122
+ }
123
+ //# sourceMappingURL=useMediaDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","CustomCamera","initializeMediaDatabase","getMediaRepository","recordToAsset","EMPTY_COUNTS","all","image","video","document","audio","useMediaDatabase","autoInit","assets","setAssets","counts","setCounts","loading","setLoading","error","setError","mountedRef","repo","refresh","records","freshCounts","Promise","getAll","getCounts","current","map","err","Error","String","console","warn","addAssets","incoming","source","length","insertAssets","removeById","id","deleteById","removeMany","ids","deleteMany","secureRemoveById","record","getById","report","secureDeleteMedia","filePath","assetId","fileName","fullySecure","JSON","stringify"],"sourceRoot":"..\\..\\..\\src","sources":["db/useMediaDatabase.ts"],"mappings":"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","ignoreList":[]}