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
package/src/types.ts ADDED
@@ -0,0 +1,946 @@
1
+ import type {
2
+ CameraLanguageProvider,
3
+ CameraTranslationBundles,
4
+ CameraTranslationMap,
5
+ } from './localization';
6
+ // Type-only (fully erased at build time), so this does not create a runtime
7
+ // import cycle with `iconConfig.tsx`, which imports the icon types below.
8
+ import type { CameraIconsConfig } from './iconConfig';
9
+
10
+ export type CameraPickerOptions = {
11
+ mediaTypes?: 'all' | 'photo' | 'video';
12
+ /** Maximum selectable items. 0 or omitted = unlimited. */
13
+ selectionLimit?: number;
14
+ initialCamera?: 'back' | 'front';
15
+ enableVideo?: boolean;
16
+ enableVideoNotes?: boolean;
17
+ enableFilter?: boolean;
18
+ /**
19
+ * Press and hold the shutter to record video, release to stop (WhatsApp-style). Works in both
20
+ * photo and video mode; a plain tap keeps its usual meaning (photo, or start/stop in video
21
+ * mode). Ignored when video is unavailable (`enableVideo: false` or `mediaTypes: 'photo'`).
22
+ *
23
+ * @default true
24
+ */
25
+ enableHoldToRecord?: boolean;
26
+ /**
27
+ * How long (ms) the shutter must be held before recording starts. Omit or pass 0 to use the
28
+ * platform long-press timeout (500 ms on most devices), which matches every other
29
+ * press-and-hold on the phone. Clamped to 120–2000 ms.
30
+ */
31
+ holdToRecordDelayMs?: number;
32
+ /**
33
+ * Hold-recordings shorter than this (ms) are discarded instead of published — releasing a
34
+ * moment after the hold threshold otherwise produces a useless fragment. Pass 0 to keep every
35
+ * clip. Clamped to 0–5000 ms.
36
+ *
37
+ * @default 1000
38
+ */
39
+ minRecordDurationMs?: number;
40
+ /**
41
+ * Allow sliding up from the shutter onto the lock rail to keep recording hands-free after the
42
+ * finger is lifted. Requires {@link enableHoldToRecord}.
43
+ *
44
+ * @default true
45
+ */
46
+ enableRecordLock?: boolean;
47
+ /**
48
+ * Allow sliding sideways from the shutter onto the cancel pill to abort a hold-recording and
49
+ * discard the clip. Requires {@link enableHoldToRecord}.
50
+ *
51
+ * @default true
52
+ */
53
+ enableRecordCancel?: boolean;
54
+ };
55
+
56
+ /**
57
+ * Options for the document and audio pickers (Storage Access Framework on Android).
58
+ */
59
+ export type FilePickerOptions = {
60
+ /** Maximum selectable items. 0 or omitted = unlimited (enables multi-select). */
61
+ selectionLimit?: number;
62
+ /**
63
+ * MIME types to accept, e.g. `['application/pdf']` or `['audio/mpeg']`. Omit to use the
64
+ * picker's sensible defaults (common document formats for the document picker, `audio/*`
65
+ * for the audio picker).
66
+ */
67
+ mimeTypes?: string[];
68
+ };
69
+
70
+ /** One photo/video handed to {@link openMediaEditor}. */
71
+ export type MediaEditorItem = {
72
+ /** content:// or file:// uri of the media to edit. Required. */
73
+ uri: string;
74
+ /**
75
+ * Media kind. Omit to let the native side type the uri from its content provider — pass it
76
+ * explicitly when the caller already knows (e.g. straight from a picker result).
77
+ */
78
+ type?: 'photo' | 'video';
79
+ /** Display name, used when the provider doesn't expose one. */
80
+ fileName?: string;
81
+ /** MIME type, used when the content resolver can't type the uri. */
82
+ mimeType?: string;
83
+ };
84
+
85
+ /**
86
+ * Options for {@link openMediaEditor} — opening EXISTING photos/videos (typically ones the user
87
+ * just picked from the device gallery) on the camera's own preview/editor screens.
88
+ *
89
+ * Pass a single item inline (`uri`, plus the optional hints) or several through {@link items}, in
90
+ * the order they were picked. One item opens the single-asset image/video editor; several open the
91
+ * multi-media Add More + Send preview — the same rule the capture flow follows.
92
+ */
93
+ export type MediaEditorOptions =
94
+ | (MediaEditorItem & {
95
+ items?: never;
96
+ /** Show the filter tool in the editor. @default true */
97
+ enableFilter?: boolean;
98
+ })
99
+ | {
100
+ /** One or more items, in pick order. */
101
+ items: MediaEditorItem[];
102
+ /** Show the filter tool in the editor. @default true */
103
+ enableFilter?: boolean;
104
+ };
105
+
106
+ /**
107
+ * Options for {@link openGalleryEditor} — the device-gallery pick that flows straight into the
108
+ * editor. Everything except the picker itself is forwarded to {@link openMediaEditor}.
109
+ */
110
+ export type GalleryEditorOptions = {
111
+ /** Show the filter tool in the editor. @default true */
112
+ enableFilter?: boolean;
113
+ };
114
+
115
+ export type CameraAsset = {
116
+ id: string;
117
+ uri: string;
118
+ type: 'photo' | 'video' | 'document' | 'audio';
119
+ fileName?: string;
120
+ mimeType?: string;
121
+ caption?: string;
122
+ width?: number;
123
+ height?: number;
124
+ duration?: number;
125
+ size?: number;
126
+ dateTaken?: number;
127
+ location?: {
128
+ latitude?: number;
129
+ longitude?: number;
130
+ };
131
+ // Cache-related metadata (populated when native code caches a media file)
132
+ cachePath?: string;
133
+ documentUri?: string;
134
+ isCached?: boolean;
135
+ cacheCreatedAt?: number;
136
+ cacheLastModified?: number;
137
+ originalUri?: string;
138
+ // Storage workflow metadata (populated by the media storage service)
139
+ storageLocation?: MediaStorageLocation;
140
+ storageStatus?: MediaStorageStatus;
141
+ publishedAt?: number;
142
+ // Edit tracking properties
143
+ filteredFrom?: string;
144
+ croppedFrom?: string;
145
+ rotatedFrom?: string;
146
+ needsThumbnail?: boolean;
147
+ // Aspect ratio for consistent WYSIWYG preview
148
+ // Used to ensure all captures display with the same aspect ratio as the camera preview
149
+ previewAspectRatio?: number;
150
+ // For videos: URI of the user-selected cover/poster frame (chosen in the editor before sending).
151
+ coverUri?: string;
152
+ // Exact container dimensions (in pixels) used for the camera preview at capture time.
153
+ // Used by the editor to reproduce the identical framing without recalculation drift.
154
+ captureContainerWidth?: number;
155
+ captureContainerHeight?: number;
156
+ /**
157
+ * True when {@link size} is a DISPLAY convention rather than the exact bytes on disk. Set by the
158
+ * native editor for a compressed video: `size` then holds the proportional figure the compression
159
+ * dropdown and completion toast quote (`original × (1 − percent/100)`), not the produced file's
160
+ * own bytes. {@link refreshAssetMetadata} keeps `size` as-is for such a clip instead of re-statting
161
+ * the file, so the preview / Info panel reads as the proportion the user picked. Everything else
162
+ * (originals, muted/trimmed clips, stills, gallery imports) leaves this unset and re-stats normally.
163
+ */
164
+ sizeIsDisplayEstimate?: boolean;
165
+ };
166
+
167
+ export type CameraPickerResult = {
168
+ cancelled: boolean;
169
+ assets: CameraAsset[];
170
+ };
171
+
172
+ export type ImageCropOptions = {
173
+ width?: number;
174
+ height?: number;
175
+ x?: number;
176
+ y?: number;
177
+ };
178
+
179
+ export type FilterType = 'none' | 'grayscale' | 'sepia' | 'vintage' | 'blur';
180
+
181
+ export type FlashMode = 'off' | 'on' | 'auto' | 'torch';
182
+
183
+ export type FaceEffect = 'none' | 'dog' | 'cat' | 'glasses' | 'hat';
184
+
185
+ export type CameraTheme = 'default' | 'dark' | 'light' | 'minimal';
186
+
187
+ export type CameraThemePreset = CameraTheme;
188
+
189
+ export type CameraThemePalette = {
190
+ background: string;
191
+ surface: string;
192
+ surfaceMuted: string;
193
+ surfaceElevated: string;
194
+ primary: string;
195
+ primaryMuted: string;
196
+ primaryContrast: string;
197
+ text: string;
198
+ textMuted: string;
199
+ textSecondary: string;
200
+ border: string;
201
+ borderStrong: string;
202
+ overlay: string;
203
+ overlayStrong: string;
204
+ accent: string;
205
+ success: string;
206
+ error: string;
207
+ warning: string;
208
+ };
209
+
210
+ /**
211
+ * Named font weights. Every text style in the plugin reads its `fontWeight`
212
+ * from these tokens — components never hardcode a weight string.
213
+ */
214
+ export type CameraFontWeight =
215
+ | 'normal'
216
+ | 'bold'
217
+ | '100'
218
+ | '200'
219
+ | '300'
220
+ | '400'
221
+ | '500'
222
+ | '600'
223
+ | '700'
224
+ | '800'
225
+ | '900';
226
+
227
+ export type CameraThemeTypography = {
228
+ fontFamily: string;
229
+ headingSize: number;
230
+ bodySize: number;
231
+ captionSize: number;
232
+ buttonSize: number;
233
+ /** Named font weights — the single source of truth for `fontWeight` styles. */
234
+ fontWeights: {
235
+ regular: CameraFontWeight;
236
+ medium: CameraFontWeight;
237
+ semibold: CameraFontWeight;
238
+ bold: CameraFontWeight;
239
+ };
240
+ };
241
+
242
+ export type CameraThemeSpacing = {
243
+ xs: number;
244
+ sm: number;
245
+ md: number;
246
+ lg: number;
247
+ xl: number;
248
+ xxl: number;
249
+ };
250
+
251
+ export type CameraThemeBorderRadius = {
252
+ sm: number;
253
+ md: number;
254
+ lg: number;
255
+ xl: number;
256
+ pill: number;
257
+ circle: number;
258
+ };
259
+
260
+ export type CameraThemeShadow = {
261
+ color: string;
262
+ opacity: number;
263
+ radius: number;
264
+ offset: {
265
+ width: number;
266
+ height: number;
267
+ };
268
+ };
269
+
270
+ export type CameraThemeCameraPreviewStyles = {
271
+ // ── Colors ───────────────────────────────────────────────────────────────
272
+ background: string;
273
+ overlay: string;
274
+ placeholderText: string;
275
+ loadingText: string;
276
+ controlButtonBackground: string;
277
+ controlButtonText: string;
278
+ captureButtonBackground: string;
279
+ captureButtonInnerBorder: string;
280
+ closeButtonBackground: string;
281
+ closeButtonText: string;
282
+ modeIndicatorBackground: string;
283
+ modeIndicatorText: string;
284
+ // ── Layout metrics (dp unless noted) ─────────────────────────────────────
285
+ controlButtonSize: number;
286
+ controlIconSize: number;
287
+ controlButtonTextSize: number;
288
+ captureButtonSize: number;
289
+ captureButtonInnerSize: number;
290
+ captureButtonBorderWidth: number;
291
+ closeButtonSize: number;
292
+ closeIconSize: number;
293
+ closeButtonTextSize: number;
294
+ modeIndicatorRadius: number;
295
+ modeIndicatorPaddingVertical: number;
296
+ modeIndicatorPaddingHorizontal: number;
297
+ modeIndicatorIconSize: number;
298
+ modeIndicatorTextSize: number;
299
+ controlsBottomInset: number;
300
+ controlsPaddingHorizontal: number;
301
+ topInset: number;
302
+ sideInset: number;
303
+ placeholderTextSize: number;
304
+ loadingTextSize: number;
305
+ disabledOpacity: number;
306
+ };
307
+
308
+ export type CameraThemeResponsivePreviewStyles = {
309
+ background: string;
310
+ borderRadius: number;
311
+ /** Fraction of screen width used for the preview container (stock 0.96). */
312
+ widthRatio: number;
313
+ /** Maximum preview width in logical pixels (stock 720). */
314
+ maxWidth: number;
315
+ /** Maximum fraction of screen height the preview may occupy (stock 0.92). */
316
+ maxHeightRatio: number;
317
+ };
318
+
319
+ export type CameraThemeAudioPlayerStyles = {
320
+ // ── Colors ───────────────────────────────────────────────────────────────
321
+ containerBackground: string;
322
+ borderColor: string;
323
+ borderRadius: number;
324
+ shadow: CameraThemeShadow;
325
+ progressTrackBackground: string;
326
+ progressFillBackground: string;
327
+ iconButtonBackground: string;
328
+ iconColor: string;
329
+ titleColor: string;
330
+ textColor: string;
331
+ // ── Layout metrics (dp unless noted) ─────────────────────────────────────
332
+ containerBorderWidth: number;
333
+ containerElevation: number;
334
+ progressTrackHeight: number;
335
+ contentPaddingHorizontal: number;
336
+ contentPaddingVertical: number;
337
+ iconButtonSize: number;
338
+ iconButtonRadius: number;
339
+ playIconSize: number;
340
+ closeIconSize: number;
341
+ titleFontSize: number;
342
+ titleFontWeight: CameraFontWeight;
343
+ titleMarginHorizontal: number;
344
+ iconTextSize: number;
345
+ iconTextWeight: CameraFontWeight;
346
+ /** Pressable opacity when the mini-player is touched. */
347
+ activeOpacity: number;
348
+ };
349
+
350
+ export type CameraThemeComponentStyles = {
351
+ cameraPreview: CameraThemeCameraPreviewStyles;
352
+ responsivePreviewContainer: CameraThemeResponsivePreviewStyles;
353
+ audioPlayer: CameraThemeAudioPlayerStyles;
354
+ };
355
+
356
+ export type CameraThemeComponentStyle =
357
+ | CameraThemeCameraPreviewStyles
358
+ | CameraThemeResponsivePreviewStyles
359
+ | CameraThemeAudioPlayerStyles;
360
+
361
+ export type CameraThemeConfig = {
362
+ name: CameraThemePreset;
363
+ colors: CameraThemePalette;
364
+ typography: CameraThemeTypography;
365
+ spacing: CameraThemeSpacing;
366
+ borderRadius: CameraThemeBorderRadius;
367
+ shadows: {
368
+ small: CameraThemeShadow;
369
+ medium: CameraThemeShadow;
370
+ };
371
+ components: CameraThemeComponentStyles;
372
+ };
373
+
374
+ export type CameraThemeInput = CameraThemePreset | Partial<CameraThemeConfig>;
375
+
376
+ // ===== White-label configuration types =====
377
+
378
+ /**
379
+ * NATIVE icon layer (low-level).
380
+ *
381
+ * The types in this section ({@link CameraIconName} / {@link CameraIconStyle} /
382
+ * {@link CameraIconConfig}) configure the icons rendered by the NATIVE camera
383
+ * Activity, which is Kotlin UI and physically cannot render React components.
384
+ * They describe Android vector drawables or inline SVG (per-icon tint / size,
385
+ * an optional host `resourceName`, and Android resource-merging).
386
+ *
387
+ * This is a SEPARATE, independent layer from the RN React-component icon
388
+ * registry in `src/icons.tsx` (`CameraIconKey` / `IconComponent` /
389
+ * `CameraIconRegistryConfig`), which renders the icons used by the JS/TS UI
390
+ * surface. The two never share state and are intentionally named to avoid
391
+ * collision — do not conflate `CameraIconName` (native drawables) with
392
+ * `CameraIconKey` (RN registry keys).
393
+ *
394
+ * HOST APPS SHOULD NOT NEED EITHER OF THEM: `src/iconConfig.tsx` puts one
395
+ * catalog of unique `CameraIconId` keys in front of both layers, and
396
+ * `CameraPluginConfig.customIcons` / `setCameraIcons()` is the single documented
397
+ * way to replace an icon. The types here remain public for the low-level escape
398
+ * hatch and for backwards compatibility.
399
+ *
400
+ * Canonical names of every native icon the plugin renders. Each maps 1:1 to a
401
+ * vector drawable in the plugin's Android `res/drawable` folder (`ic_close`,
402
+ * `ic_flip`, …) — except `selectionCheck`, which draws `ic_check`. Host apps can
403
+ * replace any of them via Android resource merging (ship a same-named drawable)
404
+ * and/or tint & size them from JS via {@link CameraIconConfig}.
405
+ */
406
+ export type CameraIconName =
407
+ | 'close'
408
+ | 'back'
409
+ | 'done'
410
+ | 'flip'
411
+ | 'flash_on'
412
+ | 'flash_off'
413
+ | 'flash_auto'
414
+ | 'gallery'
415
+ | 'photo_mode'
416
+ | 'video_mode'
417
+ | 'video_note'
418
+ | 'send'
419
+ | 'crop'
420
+ | 'rotate'
421
+ | 'aspect_ratio'
422
+ | 'filter'
423
+ | 'sticker'
424
+ | 'emoji'
425
+ | 'gif'
426
+ | 'text'
427
+ | 'text_bg'
428
+ | 'text_align_left'
429
+ | 'text_align_center'
430
+ | 'text_align_right'
431
+ | 'marker'
432
+ | 'brush_thin'
433
+ | 'brush_medium'
434
+ | 'brush_thick'
435
+ | 'undo'
436
+ | 'redo'
437
+ | 'clear_drawing'
438
+ | 'overlay_close'
439
+ | 'overlay_resize'
440
+ | 'play'
441
+ | 'pause'
442
+ | 'lock'
443
+ | 'lock_open'
444
+ | 'chevron_up'
445
+ | 'chevron_down'
446
+ | 'more_vert'
447
+ | 'delete'
448
+ | 'selectionCheck'
449
+ | 'document'
450
+ | 'audio'
451
+ | 'trim'
452
+ | 'cover'
453
+ | 'volume_on'
454
+ | 'volume_off'
455
+ | 'download'
456
+ | 'share'
457
+ | 'stat_upload';
458
+
459
+ /** Per-icon appearance override. Omitted fields keep the built-in defaults. */
460
+ export type CameraIconStyle = {
461
+ /** Tint color applied to the vector drawable (any CSS color string). */
462
+ tintColor?: string;
463
+ /** Rendered size in dp (icons are square). */
464
+ size?: number;
465
+ /**
466
+ * Name of a drawable resource in the HOST app to render instead of the
467
+ * built-in icon (resolved with `Resources.getIdentifier`; falls back to the
468
+ * built-in drawable when not found). Prefer plain resource-merging (shipping
469
+ * a drawable with the plugin's own name) — this is the escape hatch for apps
470
+ * that cannot shadow resource names.
471
+ */
472
+ resourceName?: string;
473
+ /** Inline SVG markup parsed by the native Android icon renderer. */
474
+ svg?: string;
475
+ };
476
+
477
+ /**
478
+ * Icon configuration: a global tint applied to every icon plus per-icon
479
+ * overrides. Defaults reproduce the current build exactly (white icons at
480
+ * their existing sizes).
481
+ */
482
+ export type CameraIconConfig = {
483
+ /** Tint applied to all icons unless overridden per icon. */
484
+ tintColor?: string;
485
+ /** Per-icon overrides keyed by {@link CameraIconName}. */
486
+ overrides?: Partial<Record<CameraIconName, CameraIconStyle>>;
487
+ };
488
+
489
+ /**
490
+ * Durations (ms) of every animation the native UI runs. Defaults equal the
491
+ * values currently hardcoded in the native views, so leaving this out changes
492
+ * nothing.
493
+ */
494
+ export type CameraAnimationConfig = {
495
+ /** Master switch — `true` sets every duration to 0 (reduced motion). */
496
+ disableAnimations?: boolean;
497
+ /** Shutter press-down/up scale feedback (default 80). */
498
+ shutterPress?: number;
499
+ /** Mode/tab and control fade transitions in the camera screen (default 180). */
500
+ controlsFade?: number;
501
+ /** Gallery strip slide in/out (default 260 in / 220 out). */
502
+ stripSlideIn?: number;
503
+ stripSlideOut?: number;
504
+ /** Selection badge / remove button fades in grids (default 150). */
505
+ selectionFade?: number;
506
+ /** Video poster crossfade when playback starts (default 120). */
507
+ posterFade?: number;
508
+ /** Play/pause glyph flash on tap (default 200 show, 600 fade after 400 delay). */
509
+ playPauseFlash?: number;
510
+ playPauseFadeOut?: number;
511
+ playPauseFadeDelay?: number;
512
+ /** Editor overlay/panel fades (default 250 in / 200 out). */
513
+ overlayFadeIn?: number;
514
+ overlayFadeOut?: number;
515
+ /** Editor sheet/panel slide animations (default 350 / 300). */
516
+ panelSlideIn?: number;
517
+ panelSlideOut?: number;
518
+ /** Toolbar icon state transitions in the editor (default 180). */
519
+ editorIconFade?: number;
520
+ /** Generic small fades (thumb press states etc., default 150). */
521
+ quickFade?: number;
522
+ };
523
+
524
+ /**
525
+ * Structural metrics (dp unless noted) of the native UI. Defaults equal the
526
+ * currently hardcoded layout values.
527
+ */
528
+ export type CameraDimensionConfig = {
529
+ /** Camera-screen circular control button diameter. */
530
+ controlButtonSize?: number;
531
+ /** Icon size inside camera-screen control buttons. */
532
+ controlIconSize?: number;
533
+ /** Shutter button outer diameter. */
534
+ shutterSize?: number;
535
+ /** Bottom mode-tab bar height. */
536
+ modeTabHeight?: number;
537
+ /** Recent-media strip thumbnail edge length. */
538
+ stripThumbnailSize?: number;
539
+ /** Gallery grid column count. */
540
+ galleryColumns?: number;
541
+ /** Gallery grid cell spacing. */
542
+ gridSpacing?: number;
543
+ /** Editor toolbar height. */
544
+ editorToolbarHeight?: number;
545
+ /** Editor toolbar icon size. */
546
+ editorIconSize?: number;
547
+ /** Send button diameter in the editor. */
548
+ sendButtonSize?: number;
549
+ /** Selected-media tray thumbnail edge length in the editor. */
550
+ trayThumbnailSize?: number;
551
+ };
552
+
553
+ /**
554
+ * Upload notification appearance/wording. Defaults equal the current
555
+ * hardcoded channel ids, names, and texts, so omitting this changes nothing.
556
+ * Channel ids are only applied on first creation (Android caches channels).
557
+ */
558
+ export type UploadNotificationConfig = {
559
+ /** Progress channel id (default `UploadServiceChannel`). */
560
+ progressChannelId?: string;
561
+ /** Progress channel user-visible name. */
562
+ progressChannelName?: string;
563
+ /** Result channel id (default `UploadResultChannel`). */
564
+ resultChannelId?: string;
565
+ /** Result channel user-visible name. */
566
+ resultChannelName?: string;
567
+ /** Accent color for the notification (any CSS color string). */
568
+ accentColor?: string;
569
+ /**
570
+ * Host-app drawable name for the small status icon (must be a plain
571
+ * monochrome vector — adaptive/launcher icons are silently dropped by
572
+ * Android). Falls back to the built-in `ic_stat_upload`.
573
+ */
574
+ smallIconResourceName?: string;
575
+ /** Title while uploading; `{0}` = current file index, `{1}` = total. */
576
+ progressTitle?: string;
577
+ /** Title when every file uploaded successfully. */
578
+ successTitle?: string;
579
+ /** Body when every file uploaded successfully; `{0}` = file count. */
580
+ successText?: string;
581
+ /** Title when one or more uploads failed. */
582
+ failureTitle?: string;
583
+ /** Body when one or more uploads failed; `{0}` = failed count. */
584
+ failureText?: string;
585
+ };
586
+
587
+ /**
588
+ * GIF picker configuration for the in-editor "Add GIF" tool.
589
+ *
590
+ * The API key is delivered here (via `setCameraConfig`) rather than as a
591
+ * per-launch option so the secret is set once at app startup and never rides
592
+ * in Intent extras. When `apiKey` is omitted the "Add GIF" button still shows
593
+ * but the picker renders a "not configured" state instead of calling out.
594
+ */
595
+ export type GifPickerConfig = {
596
+ /**
597
+ * Which GIF service to use. `giphy` (default) or `tenor`. GIPHY is the
598
+ * default because Google has announced the Tenor API is being discontinued.
599
+ */
600
+ provider?: 'giphy' | 'tenor';
601
+ /** API key for the selected provider. Required for the picker to fetch GIFs. */
602
+ apiKey?: string;
603
+ };
604
+
605
+ /**
606
+ * The full white-label configuration. Every section is optional and
607
+ * deep-merged over built-in defaults that reproduce the current UI exactly.
608
+ */
609
+ export type CameraPluginConfig = {
610
+ theme?: CameraThemeInput;
611
+ /**
612
+ * THE centralized language setting: the host app's currently active language
613
+ * as a BCP-47 tag — `'en'`, `'fr'`, `'pt-BR'`, `'zh-Hans'`, `'ar'` — or a
614
+ * {@link CameraLanguageProvider} that reports it live.
615
+ *
616
+ * The plugin has no language selector of its own; it displays whatever the
617
+ * host is displaying. Set this to the host's active language and pass the
618
+ * matching text through {@link CameraPluginConfig.translations} (or a
619
+ * translate callback via `setCameraLocalization`). Right-to-left layout is
620
+ * derived from the tag, so Arabic and Persian need no extra flag.
621
+ *
622
+ * Pass a provider — `{ get, subscribe }` — to configure this **once**: the
623
+ * plugin then follows every later host language change on its own, across both
624
+ * the React Native screens and the native camera. Pass a plain tag instead and
625
+ * call `configureCameraPlugin({ language })` again (or the lighter
626
+ * `setCameraLanguage(tag)`) on each switch. Either way open plugin screens and
627
+ * the native camera update immediately, with no restart.
628
+ *
629
+ * ```ts
630
+ * configureCameraPlugin({
631
+ * translations: myBundles,
632
+ * language: {
633
+ * get: () => i18n.language,
634
+ * subscribe: (onChange) => {
635
+ * i18n.on('languageChanged', onChange);
636
+ * return () => i18n.off('languageChanged', onChange);
637
+ * },
638
+ * },
639
+ * });
640
+ * ```
641
+ */
642
+ language?: string | CameraLanguageProvider;
643
+ /**
644
+ * Translations for every language the host supports, keyed by language tag:
645
+ * `{ fr: { send: 'Envoyer' }, ar: { send: 'إرسال' } }`.
646
+ *
647
+ * Register these once; switching {@link CameraPluginConfig.language} then
648
+ * picks the right one. Any key a language is missing falls back to
649
+ * {@link CameraPluginConfig.fallbackLanguage}, and then to English.
650
+ */
651
+ translations?: CameraTranslationBundles;
652
+ /** Language used to fill gaps in the active one. Defaults to `'en'`. */
653
+ fallbackLanguage?: string;
654
+ /**
655
+ * Translation overrides for the active language only. Wins over everything in
656
+ * {@link CameraPluginConfig.translations}.
657
+ */
658
+ strings?: CameraTranslationMap;
659
+ /**
660
+ * Force right-to-left layout for native screens.
661
+ *
662
+ * Normally leave this unset: direction follows
663
+ * {@link CameraPluginConfig.language} automatically.
664
+ */
665
+ rtl?: boolean;
666
+ /**
667
+ * THE centralized icon configuration: icon id → your replacement icon.
668
+ *
669
+ * This is the section to customize icons with — one flat map of unique keys
670
+ * that covers both the React Native components and the native camera screen.
671
+ * Any id you leave out keeps the icon the plugin ships. See
672
+ * `CAMERA_ICON_CATALOG` for every available key.
673
+ */
674
+ customIcons?: CameraIconsConfig;
675
+ /**
676
+ * Low-level native drawable settings (global tint plus per-drawable
677
+ * overrides). Prefer {@link CameraPluginConfig.customIcons}, which covers the
678
+ * same ground with unique keys and also reaches the React Native surface;
679
+ * per-icon values set there win over anything set here.
680
+ */
681
+ icons?: CameraIconConfig;
682
+ animations?: CameraAnimationConfig;
683
+ dimensions?: CameraDimensionConfig;
684
+ notifications?: UploadNotificationConfig;
685
+ /** GIF picker provider + API key for the editor's "Add GIF" tool. */
686
+ gif?: GifPickerConfig;
687
+ };
688
+
689
+ export type MediaMetadata = {
690
+ uri: string;
691
+ type: 'photo' | 'video';
692
+ width?: number;
693
+ height?: number;
694
+ duration?: number;
695
+ size?: number;
696
+ dateTaken?: number;
697
+ fileName?: string;
698
+ mimeType?: string;
699
+ location?: {
700
+ latitude?: number;
701
+ longitude?: number;
702
+ };
703
+ caption?: string;
704
+ };
705
+
706
+ export type PerformanceMetrics = {
707
+ operation: string;
708
+ durationMs: number;
709
+ memoryUsageMb?: number;
710
+ timestamp: number;
711
+ };
712
+
713
+ // ===== Audio Recording Types =====
714
+
715
+ /**
716
+ * Options for starting an audio recording via native MediaRecorder.
717
+ * All fields are optional; sensible defaults are used server-side.
718
+ */
719
+ export type AudioRecordingOptions = {
720
+ /**
721
+ * Output container format.
722
+ * - `'mpeg4'` (default) — AAC in MP4 container (.m4a)
723
+ * - `'aac_adts'` — raw AAC stream (.aac)
724
+ * - `'amr_nb'` — AMR narrow-band (.amr)
725
+ * - `'amr_wb'` — AMR wide-band (.amr)
726
+ * - `'three_gpp'` — AMR/WB in 3GPP container (.3gp)
727
+ */
728
+ outputFormat?: 'mpeg4' | 'aac_adts' | 'amr_nb' | 'amr_wb' | 'three_gpp';
729
+ /**
730
+ * Audio encoder.
731
+ * - `'aac'` (default) — Advanced Audio Coding
732
+ * - `'amr_nb'` — AMR narrow-band
733
+ * - `'amr_wb'` — AMR wide-band
734
+ * - `'he_aac'` — High-Efficiency AAC
735
+ */
736
+ audioEncoder?: 'aac' | 'amr_nb' | 'amr_wb' | 'he_aac';
737
+ /**
738
+ * Audio source for the recording.
739
+ * - `'mic'` (default) — Built-in microphone
740
+ * - `'camcorder'` — Same as camcorder (usually same as mic)
741
+ * - `'voice_recognition'` — Optimised for speech recognition
742
+ * - `'voice_communication'` — Optimised for VoIP
743
+ */
744
+ audioSource?: 'mic' | 'camcorder' | 'voice_recognition' | 'voice_communication';
745
+ /** Encoding bitrate in bits per second (default 128000). */
746
+ bitRate?: number;
747
+ /** Sampling rate in Hz (default 44100). */
748
+ sampleRate?: number;
749
+ /**
750
+ * Custom output file name (without directory). If omitted, a timestamp-based
751
+ * name like `"recording_1234567890.m4a"` is auto-generated.
752
+ */
753
+ fileName?: string;
754
+ /**
755
+ * Interval in milliseconds between amplitude callbacks.
756
+ * 0 (default) = disabled. When >0, the native side emits `onAudioAmplitude`
757
+ * DeviceEvent events at this interval.
758
+ */
759
+ meteringIntervalMs?: number;
760
+ };
761
+
762
+ /**
763
+ * Result returned from [startAudioRecording] on success.
764
+ */
765
+ export type AudioRecordingResult = {
766
+ /** Absolute file path to the recording on disk. */
767
+ filePath: string;
768
+ /** MIME type of the recorded file (e.g. `"audio/mp4"`). */
769
+ mimeType: string;
770
+ };
771
+
772
+ /**
773
+ * Extended result returned from [stopAudioRecording].
774
+ */
775
+ export type AudioRecordingStopResult = AudioRecordingResult & {
776
+ /** Effective recording duration in milliseconds (excluding pauses). */
777
+ durationMs: number;
778
+ /** Size of the final audio file in bytes. */
779
+ fileSizeBytes: number;
780
+ };
781
+
782
+ /**
783
+ * Snapshot of the recorder's state, returned by [getAudioRecordingState].
784
+ */
785
+ export type AudioRecordingState = {
786
+ /** Current state: `'idle'`, `'recording'`, `'paused'`, or `'error'`. */
787
+ state: 'idle' | 'recording' | 'paused' | 'error';
788
+ /** Absolute path to the current output file (empty string when idle). */
789
+ filePath: string;
790
+ /** Elapsed recording time in milliseconds (excluding pauses). */
791
+ durationMs: number;
792
+ /** Whether pause/resume is supported on this device (API 24+). */
793
+ isPauseSupported: boolean;
794
+ };
795
+
796
+ // ===== Media Storage Types =====
797
+
798
+ /**
799
+ * Storage locations for media files
800
+ */
801
+ export type MediaStorageLocation = 'cache' | 'document' | 'gallery';
802
+
803
+ /**
804
+ * Media storage status
805
+ */
806
+ export type MediaStorageStatus =
807
+ | 'cached'
808
+ | 'moved'
809
+ | 'published'
810
+ | 'pending'
811
+ | 'error';
812
+
813
+ /**
814
+ * Extended metadata for stored media
815
+ */
816
+ export type StoredMediaMetadata = MediaMetadata & {
817
+ id: string;
818
+ storageLocation: MediaStorageLocation;
819
+ storageStatus: MediaStorageStatus;
820
+ cacheCreatedAt: number;
821
+ cacheLastModified: number;
822
+ publishedAt?: number;
823
+ documentUri?: string;
824
+ cachePath?: string;
825
+ originalUri?: string;
826
+ fileHash?: string;
827
+ isDuplicate?: boolean;
828
+ duplicateOf?: string;
829
+ isEdited: boolean;
830
+ edits?: {
831
+ cropped?: boolean;
832
+ filtered?: boolean;
833
+ rotated?: boolean;
834
+ degree?: number;
835
+ };
836
+ };
837
+
838
+ /**
839
+ * Media storage configuration
840
+ */
841
+ export type MediaStorageConfig = {
842
+ maxCacheSizeMB: number;
843
+ autoCleanupEnabled: boolean;
844
+ autoCleanupIntervalMs: number;
845
+ duplicateDetection: boolean;
846
+ persistMetadata: boolean;
847
+ compressionQuality: number; // 0-100
848
+ };
849
+
850
+ /**
851
+ * Extra identity hints for {@link secureDeleteMedia}.
852
+ *
853
+ * All optional, but `assetId` should be supplied whenever it is known: derived
854
+ * copies of the same media (compressed / exported / edited variants and video
855
+ * cover frames) are named after the asset id, not after the primary file, so
856
+ * without it those copies are not found and survive the deletion.
857
+ */
858
+ export type SecureDeleteOptions = {
859
+ /** The asset's id — how derived variants of it are named on disk. */
860
+ assetId?: string;
861
+ /** Base file name, used as a secondary match key for derived copies. */
862
+ fileName?: string;
863
+ /** A video's cover-frame URI: a real JPEG of the media, erased alongside it. */
864
+ coverUri?: string;
865
+ /**
866
+ * Additional copies to erase with the same guarantees — typically the asset's
867
+ * `cachePath` when its published document is the primary URI. Both are complete
868
+ * copies of the media, so erasing only one leaves the other recoverable.
869
+ */
870
+ extraUris?: string[];
871
+ };
872
+
873
+ /**
874
+ * Outcome of a native secure deletion.
875
+ *
876
+ * `deleted` and `securelyOverwritten` are deliberately separate: a file can be
877
+ * gone while the overwrite that was supposed to destroy its bytes failed, and
878
+ * the two must never be presented to the user the same way.
879
+ */
880
+ export type SecureDeleteResult = {
881
+ /** The primary file is no longer on the filesystem. */
882
+ deleted: boolean;
883
+ /** Its bytes were overwritten AND flushed to storage before it was unlinked. */
884
+ securelyOverwritten: boolean;
885
+ /**
886
+ * Everything found was overwritten and nothing was left behind — the only
887
+ * flag that justifies reporting a secure deletion to the user.
888
+ */
889
+ fullySecure: boolean;
890
+ /** Exact size of the file before the overwrite, in bytes. */
891
+ originalBytes: number;
892
+ /** Bytes of garbage written over it, including the 2 MB past its end. */
893
+ overwrittenBytes: number;
894
+ /** Cached copies / derived variants also securely erased. */
895
+ derivedFilesErased: number;
896
+ /** Copies that could NOT be erased; non-zero means media may remain. */
897
+ derivedFilesFailed: number;
898
+ /** Present whenever any part of the operation fell short. */
899
+ error?: string;
900
+ };
901
+
902
+ /**
903
+ * Media move/copy result
904
+ */
905
+ export type MediaPublishResult = {
906
+ success: boolean;
907
+ mediaId: string;
908
+ sourceLocation: MediaStorageLocation;
909
+ targetLocation: MediaStorageLocation;
910
+ sourceUri: string;
911
+ targetUri?: string;
912
+ fileHash?: string;
913
+ movedAt: number;
914
+ error?: {
915
+ code: string;
916
+ message: string;
917
+ };
918
+ };
919
+
920
+ /**
921
+ * Cleanup operation result
922
+ */
923
+ export type CleanupResult = {
924
+ success: boolean;
925
+ filesRemoved: number;
926
+ spaceFreedMB: number;
927
+ erroredFiles: Array<{
928
+ path: string;
929
+ error: string;
930
+ }>;
931
+ timestamp: number;
932
+ };
933
+
934
+ /**
935
+ * Storage statistics
936
+ */
937
+ export type StorageStats = {
938
+ cacheUsedMB: number;
939
+ documentUsedMB: number;
940
+ totalAvailableMB: number;
941
+ cachedItemsCount: number;
942
+ publishedItemsCount: number;
943
+ duplicateItemsCount: number;
944
+ oldestCacheItemAge: number;
945
+ newestCacheItemAge: number;
946
+ };