react-native-inapp-inspector 2.5.1 → 2.5.2

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 (122) hide show
  1. package/README.ar.md +151 -53
  2. package/README.de.md +150 -52
  3. package/README.es.md +139 -42
  4. package/README.fr.md +151 -53
  5. package/README.hi.md +141 -43
  6. package/README.ja.md +150 -69
  7. package/README.ko.md +153 -55
  8. package/README.md +73 -14
  9. package/README.pt-BR.md +152 -54
  10. package/README.ru.md +153 -55
  11. package/README.zh-CN.md +95 -219
  12. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +154 -9
  13. package/dist/commonjs/capture.d.ts +5 -2
  14. package/dist/commonjs/capture.js +1 -1
  15. package/dist/commonjs/components/Inspector/FabLauncher.js +12 -12
  16. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +17 -17
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +41 -41
  18. package/dist/commonjs/components/Inspector/MainScreen.js +15 -15
  19. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +52 -34
  20. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +20 -18
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +744 -304
  22. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  23. package/dist/commonjs/components/NetworkIcons.js +56 -3
  24. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  25. package/dist/commonjs/constants/telemetryConfig.js +1 -1
  26. package/dist/commonjs/constants/version.d.ts +1 -1
  27. package/dist/commonjs/constants/version.js +1 -1
  28. package/dist/commonjs/i18n/locales/ar.json +1 -1
  29. package/dist/commonjs/i18n/locales/bn.json +1 -1
  30. package/dist/commonjs/i18n/locales/de.json +1 -1
  31. package/dist/commonjs/i18n/locales/en.json +1 -1
  32. package/dist/commonjs/i18n/locales/es.json +1 -1
  33. package/dist/commonjs/i18n/locales/fr.json +1 -1
  34. package/dist/commonjs/i18n/locales/gu.json +1 -1
  35. package/dist/commonjs/i18n/locales/hi.json +1 -1
  36. package/dist/commonjs/i18n/locales/id.json +1 -1
  37. package/dist/commonjs/i18n/locales/it.json +1 -1
  38. package/dist/commonjs/i18n/locales/ja.json +1 -1
  39. package/dist/commonjs/i18n/locales/kn.json +1 -1
  40. package/dist/commonjs/i18n/locales/ko.json +1 -1
  41. package/dist/commonjs/i18n/locales/ml.json +1 -1
  42. package/dist/commonjs/i18n/locales/mr.json +1 -1
  43. package/dist/commonjs/i18n/locales/nl.json +1 -1
  44. package/dist/commonjs/i18n/locales/pa.json +1 -1
  45. package/dist/commonjs/i18n/locales/pl.json +1 -1
  46. package/dist/commonjs/i18n/locales/pt.json +1 -1
  47. package/dist/commonjs/i18n/locales/ru.json +1 -1
  48. package/dist/commonjs/i18n/locales/ta.json +1 -1
  49. package/dist/commonjs/i18n/locales/te.json +1 -1
  50. package/dist/commonjs/i18n/locales/tr.json +1 -1
  51. package/dist/commonjs/i18n/locales/vi.json +1 -1
  52. package/dist/commonjs/i18n/locales/zh.json +1 -1
  53. package/dist/commonjs/index.js +1 -1
  54. package/dist/commonjs/native/NativeInspector.d.ts +4 -0
  55. package/dist/commonjs/native/NativeInspector.js +1 -1
  56. package/dist/commonjs/native/NativeNetworkInspector.d.ts +1 -0
  57. package/dist/commonjs/types/interfaces.d.ts +2 -0
  58. package/dist/esm/capture.d.ts +5 -2
  59. package/dist/esm/capture.js +1 -1
  60. package/dist/esm/components/Inspector/FabLauncher.js +37 -37
  61. package/dist/esm/components/Inspector/FloatingCaptureWidget.js +30 -30
  62. package/dist/esm/components/Inspector/InspectorHeader.js +34 -34
  63. package/dist/esm/components/Inspector/MainScreen.js +51 -51
  64. package/dist/esm/components/Inspector/MediaGalleryTab.js +100 -82
  65. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +20 -18
  66. package/dist/esm/components/Inspector/MediaPreviewModal.js +774 -334
  67. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  68. package/dist/esm/components/NetworkIcons.js +256 -203
  69. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  70. package/dist/esm/constants/telemetryConfig.js +1 -1
  71. package/dist/esm/constants/version.d.ts +1 -1
  72. package/dist/esm/constants/version.js +1 -1
  73. package/dist/esm/i18n/locales/ar.json +1 -1
  74. package/dist/esm/i18n/locales/bn.json +1 -1
  75. package/dist/esm/i18n/locales/de.json +1 -1
  76. package/dist/esm/i18n/locales/en.json +1 -1
  77. package/dist/esm/i18n/locales/es.json +1 -1
  78. package/dist/esm/i18n/locales/fr.json +1 -1
  79. package/dist/esm/i18n/locales/gu.json +1 -1
  80. package/dist/esm/i18n/locales/hi.json +1 -1
  81. package/dist/esm/i18n/locales/id.json +1 -1
  82. package/dist/esm/i18n/locales/it.json +1 -1
  83. package/dist/esm/i18n/locales/ja.json +1 -1
  84. package/dist/esm/i18n/locales/kn.json +1 -1
  85. package/dist/esm/i18n/locales/ko.json +1 -1
  86. package/dist/esm/i18n/locales/ml.json +1 -1
  87. package/dist/esm/i18n/locales/mr.json +1 -1
  88. package/dist/esm/i18n/locales/nl.json +1 -1
  89. package/dist/esm/i18n/locales/pa.json +1 -1
  90. package/dist/esm/i18n/locales/pl.json +1 -1
  91. package/dist/esm/i18n/locales/pt.json +1 -1
  92. package/dist/esm/i18n/locales/ru.json +1 -1
  93. package/dist/esm/i18n/locales/ta.json +1 -1
  94. package/dist/esm/i18n/locales/te.json +1 -1
  95. package/dist/esm/i18n/locales/tr.json +1 -1
  96. package/dist/esm/i18n/locales/vi.json +1 -1
  97. package/dist/esm/i18n/locales/zh.json +1 -1
  98. package/dist/esm/index.js +3 -3
  99. package/dist/esm/native/NativeInspector.d.ts +4 -0
  100. package/dist/esm/native/NativeInspector.js +1 -1
  101. package/dist/esm/native/NativeNetworkInspector.d.ts +1 -0
  102. package/dist/esm/types/interfaces.d.ts +2 -0
  103. package/ios/NetworkInspectorModule.mm +487 -224
  104. package/package.json +1 -1
  105. package/react-native-inapp-inspector.podspec +1 -1
  106. package/src/native/NativeInspector.ts +22 -0
  107. package/src/native/NativeNetworkInspector.ts +1 -1
  108. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  109. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  110. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  111. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  112. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  113. package/android/.gradle/8.9/gc.properties +0 -0
  114. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  115. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  116. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  117. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  118. package/android/.gradle/9.2.0/gc.properties +0 -0
  119. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  120. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  121. package/android/.gradle/vcs-1/gc.properties +0 -0
  122. package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
@@ -1,5 +1,6 @@
1
1
  package com.inappinspector
2
2
 
3
+ import android.app.Activity
3
4
  import android.app.ActivityManager
4
5
  import android.content.Context
5
6
  import android.content.Intent
@@ -23,6 +24,7 @@ import android.view.PixelCopy
23
24
  import android.view.View
24
25
  import android.view.Window
25
26
  import com.facebook.react.bridge.Arguments
27
+ import com.facebook.react.bridge.BaseActivityEventListener
26
28
  import com.facebook.react.bridge.Promise
27
29
  import com.facebook.react.bridge.ReactApplicationContext
28
30
  import com.facebook.react.bridge.ReactContextBaseJavaModule
@@ -35,6 +37,9 @@ import java.io.File
35
37
  import java.io.FileOutputStream
36
38
  import java.io.PrintWriter
37
39
  import java.io.StringWriter
40
+ import java.text.SimpleDateFormat
41
+ import java.util.Date
42
+ import java.util.Locale
38
43
  import java.util.Timer
39
44
  import java.util.TimerTask
40
45
  import java.util.concurrent.Executors
@@ -69,6 +74,91 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
69
74
  private var defaultHandler: Thread.UncaughtExceptionHandler? = null
70
75
  private var isProtectionEnabled = false
71
76
 
77
+ private var pendingPickPromise: Promise? = null
78
+ private val PICK_MEDIA_REQUEST_CODE = 49281
79
+
80
+ private val activityEventListener = object : BaseActivityEventListener() {
81
+ override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
82
+ if (requestCode == PICK_MEDIA_REQUEST_CODE) {
83
+ val promise = pendingPickPromise
84
+ pendingPickPromise = null
85
+ if (promise == null) return
86
+
87
+ if (resultCode != Activity.RESULT_OK || data?.data == null) {
88
+ promise.resolve(null)
89
+ return
90
+ }
91
+
92
+ captureExecutor.execute {
93
+ try {
94
+ val uri = data.data!!
95
+ val dir = getCapturesDirectory()
96
+ val contentResolver = reactContext.contentResolver
97
+ val mimeType = contentResolver.getType(uri) ?: ""
98
+ val isVideo = mimeType.startsWith("video/")
99
+ val isGif = mimeType.contains("gif")
100
+ val ext = when {
101
+ isVideo -> "mp4"
102
+ isGif -> "gif"
103
+ mimeType.contains("png") -> "png"
104
+ else -> "jpg"
105
+ }
106
+ val type = when {
107
+ isVideo -> "video"
108
+ isGif -> "gif"
109
+ else -> "image"
110
+ }
111
+ val timeStamp = System.currentTimeMillis()
112
+ val filename = "rn_iai_${timeStamp}_imported_${(1000..9999).random()}.${ext}"
113
+ val destFile = File(dir, filename)
114
+
115
+ contentResolver.openInputStream(uri)?.use { input ->
116
+ FileOutputStream(destFile).use { output ->
117
+ input.copyTo(output)
118
+ }
119
+ }
120
+
121
+ val map = Arguments.createMap().apply {
122
+ putString("id", filename)
123
+ putString("type", type)
124
+ putString("format", ext)
125
+ putString("uri", Uri.fromFile(destFile).toString())
126
+ putString("filename", filename)
127
+ putDouble("sizeBytes", destFile.length().toDouble())
128
+ putDouble("timestamp", destFile.lastModified().toDouble())
129
+ }
130
+
131
+ if (type == "video") {
132
+ try {
133
+ val thumbBaseName = filename.substringBeforeLast(".")
134
+ val thumbFile = File(dir, "${thumbBaseName}_thumb.jpg")
135
+ val retriever = MediaMetadataRetriever()
136
+ retriever.setDataSource(destFile.absolutePath)
137
+ val bmp = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
138
+ if (bmp != null) {
139
+ FileOutputStream(thumbFile).use { fos ->
140
+ bmp.compress(Bitmap.CompressFormat.JPEG, 80, fos)
141
+ }
142
+ bmp.recycle()
143
+ map.putString("thumbnailUri", Uri.fromFile(thumbFile).toString())
144
+ }
145
+ retriever.release()
146
+ } catch (e: Exception) {}
147
+ }
148
+
149
+ promise.resolve(map)
150
+ } catch (e: Exception) {
151
+ promise.reject("PICK_ERROR", e.message ?: "Failed to import media", e)
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ init {
159
+ reactContext.addActivityEventListener(activityEventListener)
160
+ }
161
+
72
162
 
73
163
  override fun getName(): String {
74
164
  return MODULE_NAME
@@ -737,6 +827,17 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
737
827
  return dir
738
828
  }
739
829
 
830
+ /**
831
+ * Generates a filename in the format: rn_iai_{YYYYMMDD_HHmmss_SSS}_{fileType}_{random6}.{ext}
832
+ */
833
+ private fun generateCaptureFilename(fileType: String, ext: String): String {
834
+ val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss_SSS", Locale.US)
835
+ val dateStamp = dateFormat.format(Date())
836
+ val chars = "abcdefghijklmnopqrstuvwxyz0123456789"
837
+ val random = (1..6).map { chars.random() }.joinToString("")
838
+ return "rn_iai_${dateStamp}_${fileType}_${random}.$ext"
839
+ }
840
+
740
841
  private fun getActiveWindow(): Window? {
741
842
  return reactContext.currentActivity?.window
742
843
  }
@@ -847,7 +948,7 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
847
948
  }
848
949
 
849
950
  val timestamp = System.currentTimeMillis()
850
- val filename = "screenshot_${timestamp}.$ext"
951
+ val filename = generateCaptureFilename("screenshot", ext)
851
952
  val file = File(getCapturesDirectory(), filename)
852
953
 
853
954
  val bos = ByteArrayOutputStream()
@@ -979,7 +1080,7 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
979
1080
  recordedFrames.clear()
980
1081
  }
981
1082
 
982
- val filename = "video_${timestamp}.mp4"
1083
+ val filename = generateCaptureFilename("video", "mp4")
983
1084
  val file = File(getCapturesDirectory(), filename)
984
1085
 
985
1086
  var width = 720
@@ -991,7 +1092,8 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
991
1092
  width = firstFrame.width
992
1093
  height = firstFrame.height
993
1094
 
994
- val thumbFile = File(getCapturesDirectory(), "thumb_${timestamp}.jpg")
1095
+ val thumbBaseName = filename.substringBeforeLast(".").replace("_video_", "_thumb_")
1096
+ val thumbFile = File(getCapturesDirectory(), "${thumbBaseName}.jpg")
995
1097
  FileOutputStream(thumbFile).use { fos ->
996
1098
  firstFrame.compress(Bitmap.CompressFormat.JPEG, 85, fos)
997
1099
  }
@@ -1041,7 +1143,7 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
1041
1143
  captureExecutor.execute {
1042
1144
  try {
1043
1145
  val timestamp = System.currentTimeMillis()
1044
- val gifFile = File(getCapturesDirectory(), "anim_${timestamp}.gif")
1146
+ val gifFile = File(getCapturesDirectory(), generateCaptureFilename("anim", "gif"))
1045
1147
 
1046
1148
  val cleanUri = if (videoUri.startsWith("file://")) videoUri.substring(7) else videoUri
1047
1149
  val sourceFile = File(cleanUri)
@@ -1124,7 +1226,9 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
1124
1226
  val files = dir.listFiles() ?: emptyArray()
1125
1227
  val jsonArr = org.json.JSONArray()
1126
1228
 
1127
- files.sortedByDescending { it.lastModified() }.forEach { file ->
1229
+ files.sortedByDescending { it.lastModified() }
1230
+ .filter { !it.name.contains("_thumb_") && !it.name.startsWith("thumb_") }
1231
+ .forEach { file ->
1128
1232
  val ext = file.extension.lowercase()
1129
1233
  val type = when (ext) {
1130
1234
  "mp4", "mov" -> "video"
@@ -1143,8 +1247,14 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
1143
1247
  }
1144
1248
 
1145
1249
  if (type == "video") {
1146
- val suffix = file.nameWithoutExtension.removePrefix("video_")
1147
- val thumbFile = File(dir, "thumb_${suffix}.jpg")
1250
+ // Try new naming convention: replace _video_ with _thumb_ in base name
1251
+ val thumbBaseName = file.nameWithoutExtension.replace("_video_", "_thumb_")
1252
+ var thumbFile = File(dir, "${thumbBaseName}.jpg")
1253
+ // Fallback: legacy naming convention (thumb_{timestamp}.jpg)
1254
+ if (!thumbFile.exists()) {
1255
+ val suffix = file.nameWithoutExtension.removePrefix("video_")
1256
+ thumbFile = File(dir, "thumb_${suffix}.jpg")
1257
+ }
1148
1258
  if (thumbFile.exists()) {
1149
1259
  obj.put("thumbnailUri", Uri.fromFile(thumbFile).toString())
1150
1260
  } else {
@@ -1204,6 +1314,40 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
1204
1314
  }
1205
1315
  }
1206
1316
 
1317
+ @ReactMethod
1318
+ fun pickMedia(options: ReadableMap?, promise: Promise) {
1319
+ val activity = reactContext.currentActivity
1320
+ if (activity == null) {
1321
+ promise.reject("NO_ACTIVITY", "Current activity is null")
1322
+ return
1323
+ }
1324
+ pendingPickPromise = promise
1325
+ val mediaType = if (options?.hasKey("mediaType") == true) options.getString("mediaType") else "any"
1326
+
1327
+ val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
1328
+ when (mediaType) {
1329
+ "image" -> {
1330
+ type = "image/*"
1331
+ }
1332
+ "video" -> {
1333
+ type = "video/*"
1334
+ }
1335
+ else -> {
1336
+ type = "*/*"
1337
+ putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))
1338
+ }
1339
+ }
1340
+ addCategory(Intent.CATEGORY_OPENABLE)
1341
+ }
1342
+
1343
+ try {
1344
+ activity.startActivityForResult(Intent.createChooser(intent, "Select Media"), PICK_MEDIA_REQUEST_CODE)
1345
+ } catch (e: Exception) {
1346
+ pendingPickPromise = null
1347
+ promise.reject("PICK_LAUNCH_ERROR", e.message ?: "Failed to open media picker", e)
1348
+ }
1349
+ }
1350
+
1207
1351
  @ReactMethod
1208
1352
  fun copyMediaToClipboard(filePath: String, promise: Promise) {
1209
1353
  val activity = reactContext.currentActivity ?: reactContext
@@ -1279,8 +1423,9 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
1279
1423
  }
1280
1424
 
1281
1425
  val sourceBitmap = if (cleanPath.startsWith("content://")) {
1282
- val input = reactContext.contentResolver.openInputStream(Uri.parse(cleanPath))
1283
- android.graphics.BitmapFactory.decodeStream(input)
1426
+ reactContext.contentResolver.openInputStream(Uri.parse(cleanPath))?.use { input ->
1427
+ android.graphics.BitmapFactory.decodeStream(input)
1428
+ }
1284
1429
  } else {
1285
1430
  android.graphics.BitmapFactory.decodeFile(cleanPath)
1286
1431
  }
@@ -1,8 +1,9 @@
1
- import { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem } from './native/NativeInspector';
2
- export type { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem, };
1
+ import { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem, PickMediaOptions } from './native/NativeInspector';
2
+ export type { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem, PickMediaOptions, };
3
3
  export type ImageFormat = 'png' | 'jpeg' | 'webp';
4
4
  export type AudioSource = 'none' | 'app' | 'mic' | 'mixed';
5
5
  export type RecordingFormat = 'mp4' | 'gif';
6
+ export declare const generateCaptureId: (fileType: string, ext: string) => string;
6
7
  export declare const ScreenCapture: {
7
8
  takeScreenshot: (options?: ScreenshotOptions) => Promise<ScreenshotResult | null>;
8
9
  captureScreenshot: (options?: ScreenshotOptions) => Promise<ScreenshotResult | null>;
@@ -14,6 +15,7 @@ export declare const ScreenCapture: {
14
15
  getMediaList: () => Promise<CapturedMediaItem[]>;
15
16
  deleteMedia: (uri: string) => Promise<boolean>;
16
17
  clearAllMedia: () => Promise<boolean>;
18
+ pickMedia: (options?: PickMediaOptions) => Promise<CapturedMediaItem | null>;
17
19
  };
18
20
  export declare const ScreenRecorder: {
19
21
  takeScreenshot: (options?: ScreenshotOptions) => Promise<ScreenshotResult | null>;
@@ -26,5 +28,6 @@ export declare const ScreenRecorder: {
26
28
  getMediaList: () => Promise<CapturedMediaItem[]>;
27
29
  deleteMedia: (uri: string) => Promise<boolean>;
28
30
  clearAllMedia: () => Promise<boolean>;
31
+ pickMedia: (options?: PickMediaOptions) => Promise<CapturedMediaItem | null>;
29
32
  };
30
33
  export default ScreenCapture;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScreenRecorder=exports.ScreenCapture=void 0;const NativeInspector_1=require("./native/NativeInspector");exports.ScreenCapture={takeScreenshot:async e=>(0,NativeInspector_1.takeNativeScreenshot)(e),captureScreenshot:async e=>(0,NativeInspector_1.takeNativeScreenshot)(e),startRecording:async e=>(0,NativeInspector_1.startNativeVideoRecording)(e),stopRecording:async()=>(0,NativeInspector_1.stopNativeVideoRecording)(),isRecording:async()=>(0,NativeInspector_1.isNativeRecordingActive)(),playVideo:async e=>(0,NativeInspector_1.playNativeVideo)(e),convertToGif:async(e,r)=>(0,NativeInspector_1.convertNativeVideoToGif)(e,r),getMediaList:async()=>(0,NativeInspector_1.fetchCapturedMediaList)(),deleteMedia:async e=>(0,NativeInspector_1.deleteCapturedMediaFile)(e),clearAllMedia:async()=>(0,NativeInspector_1.clearAllCapturedMediaFiles)()},exports.ScreenRecorder=exports.ScreenCapture,exports.default=exports.ScreenCapture;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScreenRecorder=exports.ScreenCapture=exports.generateCaptureId=void 0;const NativeInspector_1=require("./native/NativeInspector"),generateCaptureId=(e,n)=>{const t=new Date,r=(a,s=2)=>String(a).padStart(s,"0"),c=`${t.getFullYear()}${r(t.getMonth()+1)}${r(t.getDate())}_${r(t.getHours())}${r(t.getMinutes())}${r(t.getSeconds())}_${r(t.getMilliseconds(),3)}`,o="abcdefghijklmnopqrstuvwxyz0123456789";let i="";for(let a=0;a<6;a++)i+=o[Math.floor(Math.random()*o.length)];return`rn_iai_${c}_${e}_${i}.${n}`};exports.generateCaptureId=generateCaptureId,exports.ScreenCapture={takeScreenshot:async e=>(0,NativeInspector_1.takeNativeScreenshot)(e),captureScreenshot:async e=>(0,NativeInspector_1.takeNativeScreenshot)(e),startRecording:async e=>(0,NativeInspector_1.startNativeVideoRecording)(e),stopRecording:async()=>(0,NativeInspector_1.stopNativeVideoRecording)(),isRecording:async()=>(0,NativeInspector_1.isNativeRecordingActive)(),playVideo:async e=>(0,NativeInspector_1.playNativeVideo)(e),convertToGif:async(e,n)=>(0,NativeInspector_1.convertNativeVideoToGif)(e,n),getMediaList:async()=>(0,NativeInspector_1.fetchCapturedMediaList)(),deleteMedia:async e=>(0,NativeInspector_1.deleteCapturedMediaFile)(e),clearAllMedia:async()=>(0,NativeInspector_1.clearAllCapturedMediaFiles)(),pickMedia:async e=>(0,NativeInspector_1.pickNativeMedia)(e)},exports.ScreenRecorder=exports.ScreenCapture,exports.default=exports.ScreenCapture;
@@ -1,12 +1,12 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(r,i,o,a){a===void 0&&(a=o);var s=Object.getOwnPropertyDescriptor(i,o);(!s||("get"in s?!i.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return i[o]}}),Object.defineProperty(r,a,s)}):(function(r,i,o,a){a===void 0&&(a=o),r[a]=i[o]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(r,i){Object.defineProperty(r,"default",{enumerable:!0,value:i})}):function(r,i){r.default=i}),__importStar=this&&this.__importStar||(function(){var r=function(i){return r=Object.getOwnPropertyNames||function(o){var a=[];for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(a[a.length]=s);return a},r(i)};return function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var a=r(i),s=0;s<a.length;s++)a[s]!=="default"&&__createBinding(o,i,a[s]);return __setModuleDefault(o,i),o}})(),__importDefault=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0});const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_linear_gradient_1=__importDefault(require("react-native-linear-gradient")),InspectorContext_1=require("./InspectorContext"),TouchableScale_1=__importDefault(require("../TouchableScale")),AppHeaderLogo_1=__importDefault(require("../AppHeaderLogo")),NetworkIcons_1=require("../NetworkIcons"),capture_1=require("../../capture"),NativeInspector_1=require("../../native/NativeInspector"),toast_1=require("../../helpers/toast"),helpers_1=require("../../helpers"),constants_1=require("../../constants"),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),styles_1=__importDefault(require("../../styles")),i18n_1=require("../../i18n"),MediaPreviewModal_1=require("./MediaPreviewModal"),FabLauncher=()=>{const{setVisible:r,isMinimized:i,setIsMinimized:o,dismissInspector:a,appIcon:s,fabPan:l,fabPanResponder:ie,fabDraggedRef:T,pulseAnim:k,fabShineAnim:oe,refreshMediaCount:g,captureFps:L,captureScale:E,captureBitrate:O,captureMaxDurationSeconds:q,captureAudioMode:H}=(0,InspectorContext_1.useInspector)(),{width:_,height:b}=(0,react_native_1.useWindowDimensions)(),{t:n}=(0,i18n_1.useTranslation)(),[X]=(0,react_1.useState)(()=>(0,helpers_1.getAppVersionAndBuild)().formatted),[p,I]=(0,react_1.useState)(!1),[Z,D]=(0,react_1.useState)(0),v=(0,react_1.useRef)(null),[$,C]=(0,react_1.useState)(null),[G,B]=(0,react_1.useState)(!1),[z,S]=(0,react_1.useState)(!1),f=(0,react_1.useRef)(!1),x=(0,react_1.useRef)(new react_native_1.Animated.Value(0)).current,P=(0,react_1.useRef)(new react_native_1.Animated.Value(1)).current,y=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=l.x.addListener(c=>y.current.x=c.value),t=l.y.addListener(c=>y.current.y=c.value);return()=>{l.x.removeListener(e),l.y.removeListener(t)}},[l]);const u=68,V=8,U=(0,react_1.useCallback)(()=>{const e=y.current.x,t=y.current.y,c=20,A=180,m=_-c-u/2+e,M=b-A-u/2+t;let N=e,F=t,R=!1;m<V+u/2?(N=e+(V+u/2-m),R=!0):m>_-V-u/2&&(N=e-(m-(_-V-u/2)),R=!0);const j=react_native_1.Platform.OS==="ios"?60:40,Y=react_native_1.Platform.OS==="ios"?40:24;M<j+u/2?(F=t+(j+u/2-M),R=!0):M>b-Y-u/2&&(F=t-(M-(b-Y-u/2)),R=!0),R&&react_native_1.Animated.spring(l,{toValue:{x:N,y:F},useNativeDriver:!1,tension:80,friction:8}).start()},[l,_,b]),K=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{T.current=!0,l.setOffset({x:y.current.x,y:y.current.y}),l.setValue({x:0,y:0}),f.current=!1,S(!1),B(!0),P.setValue(1),react_native_1.Animated.spring(x,{toValue:1,useNativeDriver:!0,tension:80,friction:8}).start()},onPanResponderMove:(e,t)=>{l.setValue({x:t.dx,y:t.dy});const c=t.moveY,A=t.moveX,m=c>b-140&&Math.abs(A-_/2)<85;m&&!f.current?(f.current=!0,S(!0),(0,NativeInspector_1.triggerNativeHaptic)("medium"),react_native_1.Animated.spring(P,{toValue:1.25,useNativeDriver:!0,tension:100,friction:6}).start()):!m&&f.current&&(f.current=!1,S(!1),react_native_1.Animated.spring(P,{toValue:1,useNativeDriver:!0,tension:100,friction:6}).start())},onPanResponderRelease:()=>{const e=f.current;l.flattenOffset(),react_native_1.Animated.timing(x,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{B(!1),S(!1),f.current=!1}),e?((0,NativeInspector_1.triggerNativeHaptic)("heavy"),a(),(0,toast_1.showToast)(n("common.inspectorDismissed","In-App Inspector closed for this session"))):U(),setTimeout(()=>{T.current=!1},100)},onPanResponderTerminate:()=>{l.flattenOffset(),T.current=!1,react_native_1.Animated.timing(x,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{B(!1),S(!1),f.current=!1})}})).current,d=(0,react_1.useRef)(new react_native_1.Animated.ValueXY({x:0,y:0})).current,w=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=d.x.addListener(c=>w.current.x=c.value),t=d.y.addListener(c=>w.current.y=c.value);return()=>{d.x.removeListener(e),d.y.removeListener(t)}},[d]);const h=(0,react_1.useRef)(!1),J=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{h.current=!0,d.setOffset({x:w.current.x,y:w.current.y}),d.setValue({x:0,y:0})},onPanResponderMove:react_native_1.Animated.event([null,{dx:d.x,dy:d.y}],{useNativeDriver:!1}),onPanResponderRelease:()=>{d.flattenOffset();const e=w.current.y,t=-(b-(react_native_1.Platform.OS==="ios"?34:18)-70),c=react_native_1.Platform.OS==="ios"?34:18;if(e<t||e>c){const A=Math.max(t,Math.min(c,e));react_native_1.Animated.spring(d,{toValue:{x:w.current.x,y:A},useNativeDriver:!1,tension:80,friction:8}).start()}setTimeout(()=>{h.current=!1},50)},onPanResponderTerminate:()=>{d.flattenOffset(),h.current=!1}})).current;(0,react_1.useEffect)(()=>{capture_1.ScreenCapture.isRecording().then(e=>{I(!!e)}).catch(()=>{})},[]),(0,react_1.useEffect)(()=>(p?(D(0),v.current=setInterval(()=>{D(e=>e+1)},1e3)):(v.current&&(clearInterval(v.current),v.current=null),D(0)),()=>{v.current&&clearInterval(v.current)}),[p]);const Q=(0,react_1.useCallback)(async()=>{if(!h.current)try{(0,NativeInspector_1.triggerNativeHaptic)("light");const e=await capture_1.ScreenCapture.takeScreenshot({format:"png",quality:.9,hideInspector:!0});if(e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t={id:`screenshot_${e.timestamp}.png`,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`screenshot_${e.timestamp}.png`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};C(t),g?.().catch(()=>{}),(0,toast_1.showToast)(n("header.screenshotCaptured","Screenshot captured"))}else(0,toast_1.showToast)(n("header.screenshotFailed","Failed to capture screenshot"))}catch{(0,toast_1.showToast)(n("header.screenshotError","Error capturing screenshot"))}},[g,n]),ee=(0,react_1.useCallback)(async()=>{if(!h.current)try{if(p){(0,NativeInspector_1.triggerNativeHaptic)("medium");const e=await capture_1.ScreenCapture.stopRecording();if(I(!1),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t={id:`video_${e.timestamp}.${e.format}`,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`video_${e.timestamp}.${e.format}`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};C(t),g?.().catch(()=>{}),(0,toast_1.showToast)(n("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else(0,NativeInspector_1.triggerNativeHaptic)("medium"),await capture_1.ScreenCapture.startRecording({fps:L,scale:E,audioSource:H,bitrate:O>0?O:void 0,maxDurationSeconds:q})?(I(!0),(0,toast_1.showToast)(n("header.recordingStarted","Recording started"))):(0,toast_1.showToast)(n("header.recordingStartFailed","Failed to start recording"))}catch{(0,toast_1.showToast)(n("header.recordingError","Error during screen recording")),I(!1)}},[p,L,E,O,q,H,g,n]),W=(0,react_1.useCallback)(()=>{h.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),o?.(!1),r(!0))},[o,r]),te=(0,react_1.useCallback)(()=>{h.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),o?.(!1),r(!1))},[o,r]),re=e=>{const t=Math.floor(e/60),c=e%60;return`${t}:${c<10?"0":""}${c}`};return<>
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(i,o,n,s){s===void 0&&(s=n);var c=Object.getOwnPropertyDescriptor(o,n);(!c||("get"in c?!o.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return o[n]}}),Object.defineProperty(i,s,c)}):(function(i,o,n,s){s===void 0&&(s=n),i[s]=o[n]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}):function(i,o){i.default=o}),__importStar=this&&this.__importStar||(function(){var i=function(o){return i=Object.getOwnPropertyNames||function(n){var s=[];for(var c in n)Object.prototype.hasOwnProperty.call(n,c)&&(s[s.length]=c);return s},i(o)};return function(o){if(o&&o.__esModule)return o;var n={};if(o!=null)for(var s=i(o),c=0;c<s.length;c++)s[c]!=="default"&&__createBinding(n,o,s[c]);return __setModuleDefault(n,o),n}})(),__importDefault=this&&this.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(exports,"__esModule",{value:!0});const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_linear_gradient_1=__importDefault(require("react-native-linear-gradient")),InspectorContext_1=require("./InspectorContext"),TouchableScale_1=__importDefault(require("../TouchableScale")),AppHeaderLogo_1=__importDefault(require("../AppHeaderLogo")),NetworkIcons_1=require("../NetworkIcons"),capture_1=require("../../capture"),NativeInspector_1=require("../../native/NativeInspector"),toast_1=require("../../helpers/toast"),helpers_1=require("../../helpers"),constants_1=require("../../constants"),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),styles_1=__importDefault(require("../../styles")),i18n_1=require("../../i18n"),MediaPreviewModal_1=require("./MediaPreviewModal"),FabLauncher=()=>{const{setVisible:i,isMinimized:o,setIsMinimized:n,dismissInspector:s,appIcon:c,fabPan:l,fabPanResponder:ie,fabDraggedRef:T,pulseAnim:k,fabShineAnim:oe,refreshMediaCount:m,captureFps:L,captureScale:E,captureBitrate:O,captureMaxDurationSeconds:q,captureAudioMode:H,previewMediaItem:W,setPreviewMediaItem:C}=(0,InspectorContext_1.useInspector)(),{width:S,height:b}=(0,react_native_1.useWindowDimensions)(),{t:a}=(0,i18n_1.useTranslation)(),[X]=(0,react_1.useState)(()=>(0,helpers_1.getAppVersionAndBuild)().formatted),[p,I]=(0,react_1.useState)(!1),[Z,D]=(0,react_1.useState)(0),v=(0,react_1.useRef)(null),[G,B]=(0,react_1.useState)(!1),[z,_]=(0,react_1.useState)(!1),f=(0,react_1.useRef)(!1),x=(0,react_1.useRef)(new react_native_1.Animated.Value(0)).current,P=(0,react_1.useRef)(new react_native_1.Animated.Value(1)).current,y=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=l.x.addListener(r=>y.current.x=r.value),t=l.y.addListener(r=>y.current.y=r.value);return()=>{l.x.removeListener(e),l.y.removeListener(t)}},[l]);const u=68,V=8,U=(0,react_1.useCallback)(()=>{const e=y.current.x,t=y.current.y,r=20,A=180,g=S-r-u/2+e,M=b-A-u/2+t;let N=e,F=t,R=!1;g<V+u/2?(N=e+(V+u/2-g),R=!0):g>S-V-u/2&&(N=e-(g-(S-V-u/2)),R=!0);const Y=react_native_1.Platform.OS==="ios"?60:40,$=react_native_1.Platform.OS==="ios"?40:24;M<Y+u/2?(F=t+(Y+u/2-M),R=!0):M>b-$-u/2&&(F=t-(M-(b-$-u/2)),R=!0),R&&react_native_1.Animated.spring(l,{toValue:{x:N,y:F},useNativeDriver:!1,tension:80,friction:8}).start()},[l,S,b]),K=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{T.current=!0,l.setOffset({x:y.current.x,y:y.current.y}),l.setValue({x:0,y:0}),f.current=!1,_(!1),B(!0),P.setValue(1),react_native_1.Animated.spring(x,{toValue:1,useNativeDriver:!0,tension:80,friction:8}).start()},onPanResponderMove:(e,t)=>{l.setValue({x:t.dx,y:t.dy});const r=t.moveY,A=t.moveX,g=r>b-140&&Math.abs(A-S/2)<85;g&&!f.current?(f.current=!0,_(!0),(0,NativeInspector_1.triggerNativeHaptic)("medium"),react_native_1.Animated.spring(P,{toValue:1.25,useNativeDriver:!0,tension:100,friction:6}).start()):!g&&f.current&&(f.current=!1,_(!1),react_native_1.Animated.spring(P,{toValue:1,useNativeDriver:!0,tension:100,friction:6}).start())},onPanResponderRelease:()=>{const e=f.current;l.flattenOffset(),react_native_1.Animated.timing(x,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{B(!1),_(!1),f.current=!1}),e?((0,NativeInspector_1.triggerNativeHaptic)("heavy"),s(),(0,toast_1.showToast)(a("common.inspectorDismissed","In-App Inspector closed for this session"))):U(),setTimeout(()=>{T.current=!1},100)},onPanResponderTerminate:()=>{l.flattenOffset(),T.current=!1,react_native_1.Animated.timing(x,{toValue:0,duration:180,useNativeDriver:!0}).start(()=>{B(!1),_(!1),f.current=!1})}})).current,d=(0,react_1.useRef)(new react_native_1.Animated.ValueXY({x:0,y:0})).current,w=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=d.x.addListener(r=>w.current.x=r.value),t=d.y.addListener(r=>w.current.y=r.value);return()=>{d.x.removeListener(e),d.y.removeListener(t)}},[d]);const h=(0,react_1.useRef)(!1),J=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{h.current=!0,d.setOffset({x:w.current.x,y:w.current.y}),d.setValue({x:0,y:0})},onPanResponderMove:react_native_1.Animated.event([null,{dx:d.x,dy:d.y}],{useNativeDriver:!1}),onPanResponderRelease:()=>{d.flattenOffset();const e=w.current.y,t=-(b-(react_native_1.Platform.OS==="ios"?34:18)-70),r=react_native_1.Platform.OS==="ios"?34:18;if(e<t||e>r){const A=Math.max(t,Math.min(r,e));react_native_1.Animated.spring(d,{toValue:{x:w.current.x,y:A},useNativeDriver:!1,tension:80,friction:8}).start()}setTimeout(()=>{h.current=!1},50)},onPanResponderTerminate:()=>{d.flattenOffset(),h.current=!1}})).current;(0,react_1.useEffect)(()=>{capture_1.ScreenCapture.isRecording().then(e=>{I(!!e)}).catch(()=>{})},[]),(0,react_1.useEffect)(()=>(p?(D(0),v.current=setInterval(()=>{D(e=>e+1)},1e3)):(v.current&&(clearInterval(v.current),v.current=null),D(0)),()=>{v.current&&clearInterval(v.current)}),[p]);const Q=(0,react_1.useCallback)(async()=>{if(!h.current)try{(0,NativeInspector_1.triggerNativeHaptic)("light");const e=await capture_1.ScreenCapture.takeScreenshot({format:"png",quality:.9,hideInspector:!0});if(e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t=(0,capture_1.generateCaptureId)("screenshot",e.format||"png"),r={id:t,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||t,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};C(r),m?.().catch(()=>{}),(0,toast_1.showToast)(a("header.screenshotCaptured","Screenshot captured"))}else(0,toast_1.showToast)(a("header.screenshotFailed","Failed to capture screenshot"))}catch{(0,toast_1.showToast)(a("header.screenshotError","Error capturing screenshot"))}},[m,a]),ee=(0,react_1.useCallback)(async()=>{if(!h.current)try{if(p){(0,NativeInspector_1.triggerNativeHaptic)("medium");const e=await capture_1.ScreenCapture.stopRecording();if(I(!1),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t=(0,capture_1.generateCaptureId)("video",e.format),r={id:t,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||t,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};C(r),m?.().catch(()=>{}),(0,toast_1.showToast)(a("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else(0,NativeInspector_1.triggerNativeHaptic)("medium"),await capture_1.ScreenCapture.startRecording({fps:L,scale:E,audioSource:H,bitrate:O>0?O:void 0,maxDurationSeconds:q})?(I(!0),(0,toast_1.showToast)(a("header.recordingStarted","Recording started"))):(0,toast_1.showToast)(a("header.recordingStartFailed","Failed to start recording"))}catch{(0,toast_1.showToast)(a("header.recordingError","Error during screen recording")),I(!1)}},[p,L,E,O,q,H,m,a]),j=(0,react_1.useCallback)(()=>{h.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),n?.(!1),i(!0))},[n,i]),te=(0,react_1.useCallback)(()=>{h.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),n?.(!1),i(!1))},[n,i]),re=e=>{const t=Math.floor(e/60),r=e%60;return`${t}:${r<10?"0":""}${r}`};return<>
2
2
 
3
- {i?<react_native_1.Animated.View style={[fabStyles.playerContainer,{transform:d.getTranslateTransform()}]}{...J.panHandlers}>
3
+ {o?<react_native_1.Animated.View style={[fabStyles.playerContainer,{transform:d.getTranslateTransform()}]}{...J.panHandlers}>
4
4
 
5
5
  <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.indigo600,AppColors_1.AppColors.violet600]}start={{x:0,y:0}}end={{x:1,y:1}}style={fabStyles.gradientBg}pointerEvents="none"/>
6
6
 
7
7
 
8
- <react_native_1.TouchableOpacity activeOpacity={.75}onPress={W}style={fabStyles.brandSection}accessibilityRole="button"accessibilityLabel={n("mediaGallery.expand","Expand Inspector")}>
9
- <AppHeaderLogo_1.default size={36}customIcon={s}shape="circle"/>
8
+ <react_native_1.TouchableOpacity activeOpacity={.75}onPress={j}style={fabStyles.brandSection}accessibilityRole="button"accessibilityLabel={a("mediaGallery.expand","Expand Inspector")}>
9
+ <AppHeaderLogo_1.default size={36}customIcon={c}shape="circle"/>
10
10
  <react_native_1.View style={fabStyles.titleWrapper}>
11
11
  <react_native_1.Text style={fabStyles.appTitle}numberOfLines={1}>
12
12
  {(0,helpers_1.getAppName)()}
@@ -37,7 +37,7 @@
37
37
  <TouchableScale_1.default onPress={Q}hitSlop={{top:6,bottom:6,left:4,right:4}}style={fabStyles.actionBtn}>
38
38
  <NetworkIcons_1.ScreenshotCaptureIcon size={12}color={AppColors_1.AppColors.white}/>
39
39
  <react_native_1.Text style={fabStyles.actionText}>
40
- {n("header.photo","Photo")}
40
+ {a("header.photo","Photo")}
41
41
  </react_native_1.Text>
42
42
  </TouchableScale_1.default>
43
43
 
@@ -45,24 +45,24 @@
45
45
  <TouchableScale_1.default onPress={ee}hitSlop={{top:6,bottom:6,left:4,right:4}}style={[fabStyles.actionBtn,p&&fabStyles.recordingBtnActive]}>
46
46
  {p?<react_native_1.View style={fabStyles.recordingDot}/>:<NetworkIcons_1.ScreenRecordIcon size={12}color={AppColors_1.AppColors.white}/>}
47
47
  <react_native_1.Text style={[fabStyles.actionText,p&&{color:AppColors_1.AppColors.red300}]}>
48
- {p?`${n("header.rec","REC")} ${re(Z)}`:n("header.record","Record")}
48
+ {p?`${a("header.rec","REC")} ${re(Z)}`:a("header.record","Record")}
49
49
  </react_native_1.Text>
50
50
  </TouchableScale_1.default>
51
51
 
52
52
 
53
- <TouchableScale_1.default onPress={W}hitSlop={{top:6,bottom:6,left:4,right:4}}accessibilityRole="button"accessibilityLabel={n("common.expand","Expand")}style={fabStyles.actionBtnSquare}>
53
+ <TouchableScale_1.default onPress={j}hitSlop={{top:6,bottom:6,left:4,right:4}}accessibilityRole="button"accessibilityLabel={a("common.expand","Expand")}style={fabStyles.actionBtnSquare}>
54
54
  <NetworkIcons_1.MaximizeIcon size={12}color={AppColors_1.AppColors.white}/>
55
55
  </TouchableScale_1.default>
56
56
 
57
57
 
58
- <TouchableScale_1.default onPress={te}hitSlop={{top:6,bottom:6,left:4,right:6}}accessibilityRole="button"accessibilityLabel={n("common.close","Close")}style={fabStyles.actionBtnSquare}>
58
+ <TouchableScale_1.default onPress={te}hitSlop={{top:6,bottom:6,left:4,right:6}}accessibilityRole="button"accessibilityLabel={a("common.close","Close")}style={fabStyles.actionBtnSquare}>
59
59
  <NetworkIcons_1.CloseWhite size={10}color={AppColors_1.AppColors.white}/>
60
60
  </TouchableScale_1.default>
61
61
  </react_native_1.View>
62
62
  </react_native_1.Animated.View>:<react_native_1.Animated.View style={[styles_1.default.fabWrapper,{transform:l.getTranslateTransform()}]}{...K.panHandlers}>
63
- <TouchableScale_1.default style={{alignItems:"center",justifyContent:"center"}}onPress={()=>{T.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),r(!0))}}hitSlop={10}>
63
+ <TouchableScale_1.default style={{alignItems:"center",justifyContent:"center"}}onPress={()=>{T.current||((0,NativeInspector_1.triggerNativeHaptic)("light"),i(!0))}}hitSlop={10}>
64
64
  <react_native_1.Animated.View style={[styles_1.default.fabPulseRing,{transform:[{scale:k}]}]}/>
65
- <AppHeaderLogo_1.default size={68}customIcon={s}shape="circle"/>
65
+ <AppHeaderLogo_1.default size={68}customIcon={c}shape="circle"/>
66
66
  </TouchableScale_1.default>
67
67
  </react_native_1.Animated.View>}
68
68
 
@@ -72,10 +72,10 @@
72
72
  <NetworkIcons_1.CloseWhite size={18}color={AppColors_1.AppColors.white}/>
73
73
  </react_native_1.View>
74
74
  <react_native_1.Text style={[fabStyles.dismissTargetLabel,z&&fabStyles.dismissTargetLabelActive]}>
75
- {z?n("common.releaseToHide","Release to hide"):n("common.dragToHide","Drag here to hide")}
75
+ {z?a("common.releaseToHide","Release to hide"):a("common.dragToHide","Drag here to hide")}
76
76
  </react_native_1.Text>
77
77
  </react_native_1.Animated.View>}
78
78
 
79
79
 
80
- <MediaPreviewModal_1.MediaPreviewModal item={$}visible={!!$}onClose={()=>C(null)}onDelete={async e=>{await capture_1.ScreenCapture.deleteMedia(e.uri),g?.().catch(()=>{}),C(null)}}onConvertToGif={async e=>{const t=await capture_1.ScreenCapture.convertToGif(e.uri,{fps:12,width:480});t&&(g?.().catch(()=>{}),C({id:`anim_${t.timestamp}.gif`,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||`anim_${t.timestamp}.gif`,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs}))}}/>
80
+ <MediaPreviewModal_1.MediaPreviewModal item={W}visible={!!W}onClose={()=>C(null)}onDelete={async e=>{await capture_1.ScreenCapture.deleteMedia(e.uri),m?.().catch(()=>{}),C(null)}}onConvertToGif={async e=>{const t=await capture_1.ScreenCapture.convertToGif(e.uri,{fps:12,width:480});if(t){m?.().catch(()=>{});const r=(0,capture_1.generateCaptureId)("anim","gif");C({id:r,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||r,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs})}}}/>
81
81
  </>},fabStyles=react_native_1.StyleSheet.create({dismissTargetContainer:{position:"absolute",bottom:react_native_1.Platform.OS==="ios"?42:26,left:0,right:0,alignItems:"center",justifyContent:"center",zIndex:999998},dismissTargetCircle:{width:54,height:54,borderRadius:27,backgroundColor:"rgba(23, 23, 37, 0.82)",borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.28)",alignItems:"center",justifyContent:"center",shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:6},shadowOpacity:.4,shadowRadius:10,elevation:16},dismissTargetCircleActive:{backgroundColor:AppColors_1.AppColors.red600,borderColor:AppColors_1.AppColors.red300,shadowColor:AppColors_1.AppColors.red600,shadowOpacity:.65,shadowRadius:18,transform:[{scale:1.06}]},dismissTargetLabel:{marginTop:6,fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:11,color:"rgba(255, 255, 255, 0.85)",textShadowColor:"rgba(0, 0, 0, 0.6)",textShadowOffset:{width:0,height:1},textShadowRadius:3},dismissTargetLabelActive:{color:AppColors_1.AppColors.red300,fontFamily:AppFonts_1.AppFonts.interBold},playerContainer:{position:"absolute",bottom:react_native_1.Platform.OS==="ios"?34:18,left:12,right:12,minHeight:58,flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderRadius:16,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.28)",paddingHorizontal:12,paddingVertical:7,gap:8,zIndex:99999,elevation:25,shadowColor:AppColors_1.AppColors.indigo600,shadowOffset:{width:0,height:8},shadowOpacity:.45,shadowRadius:14,overflow:"hidden"},gradientBg:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16},playerShineClip:{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:16,overflow:"hidden"},playerShineStreak:{position:"absolute",top:-60,width:75,height:200},brandSection:{flexDirection:"row",alignItems:"center",gap:9,flex:1,minWidth:0,paddingVertical:2,overflow:"hidden"},titleWrapper:{flex:1,minWidth:0,justifyContent:"center",gap:2},appTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13.5,color:AppColors_1.AppColors.white,letterSpacing:-.2},versionRow:{flexDirection:"row",alignItems:"center",gap:4,minWidth:0},versionChip:{flexDirection:"row",alignItems:"center",backgroundColor:`${AppColors_1.AppColors.white}1F`,borderRadius:5,paddingHorizontal:5,paddingVertical:1.5,gap:3,borderWidth:1,borderColor:`${AppColors_1.AppColors.white}2E`,flexShrink:1,minWidth:0},versionChipText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:8.5,color:`${AppColors_1.AppColors.white}EB`,letterSpacing:.1},actionsRow:{flexDirection:"row",alignItems:"center",gap:4.5,flexShrink:0},actionBtn:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:"rgba(255, 255, 255, 0.22)",paddingHorizontal:8,paddingVertical:5.5,borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},actionBtnSquare:{alignItems:"center",justifyContent:"center",width:27,height:27,backgroundColor:"rgba(255, 255, 255, 0.22)",borderRadius:7,borderWidth:1,borderColor:"rgba(255, 255, 255, 0.32)"},recordingBtnActive:{backgroundColor:"rgba(239, 68, 68, 0.32)",borderColor:AppColors_1.AppColors.red500},recordingDot:{width:6,height:6,borderRadius:3,backgroundColor:AppColors_1.AppColors.red500},actionText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:10.5,color:AppColors_1.AppColors.white}});exports.default=FabLauncher;
@@ -1,15 +1,15 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(r,a,o,n){n===void 0&&(n=o);var i=Object.getOwnPropertyDescriptor(a,o);(!i||("get"in i?!a.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return a[o]}}),Object.defineProperty(r,n,i)}):(function(r,a,o,n){n===void 0&&(n=o),r[n]=a[o]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(r,a){Object.defineProperty(r,"default",{enumerable:!0,value:a})}):function(r,a){r.default=a}),__importStar=this&&this.__importStar||(function(){var r=function(a){return r=Object.getOwnPropertyNames||function(o){var n=[];for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[n.length]=i);return n},r(a)};return function(a){if(a&&a.__esModule)return a;var o={};if(a!=null)for(var n=r(a),i=0;i<n.length;i++)n[i]!=="default"&&__createBinding(o,a,n[i]);return __setModuleDefault(o,a),o}})(),__importDefault=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FloatingCaptureWidget=void 0;const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_linear_gradient_1=__importDefault(require("react-native-linear-gradient")),InspectorContext_1=require("./InspectorContext"),TouchableScale_1=__importDefault(require("../TouchableScale")),NetworkIcons_1=require("../NetworkIcons"),capture_1=require("../../capture"),NativeInspector_1=require("../../native/NativeInspector"),toast_1=require("../../helpers/toast"),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),i18n_1=require("../../i18n"),MediaPreviewModal_1=require("./MediaPreviewModal"),FloatingCaptureWidget=()=>{const{refreshMediaCount:r,captureFps:a,captureScale:o,captureBitrate:n,captureMaxDurationSeconds:i,captureAudioMode:S,activeTab:M,settingsPage:T,peekMode:E}=(0,InspectorContext_1.useInspector)(),{t:c}=(0,i18n_1.useTranslation)(),[p,m]=(0,react_1.useState)(!1),[V,v]=(0,react_1.useState)(!1),[P,y]=(0,react_1.useState)(0),l=(0,react_1.useRef)(null),[C,f]=(0,react_1.useState)(null),h=(0,react_1.useRef)(new react_native_1.Animated.Value(1)).current,w=(0,react_1.useRef)(new react_native_1.Animated.Value(0)).current,s=(0,react_1.useRef)(new react_native_1.Animated.ValueXY({x:0,y:0})).current,u=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=s.x.addListener(d=>u.current.x=d.value),t=s.y.addListener(d=>u.current.y=d.value);return()=>{s.x.removeListener(e),s.y.removeListener(t)}},[s]);const g=(0,react_1.useRef)(!1),D=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!1,onStartShouldSetPanResponderCapture:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>2||Math.abs(t.dy)>2,onMoveShouldSetPanResponderCapture:(e,t)=>Math.abs(t.dx)>2||Math.abs(t.dy)>2,onPanResponderGrant:()=>{g.current=!0,s.setOffset({x:u.current.x,y:u.current.y}),s.setValue({x:0,y:0})},onPanResponderMove:(e,t)=>{s.setValue({x:t.dx,y:t.dy})},onPanResponderTerminationRequest:()=>!1,onShouldBlockNativeResponder:()=>!0,onPanResponderRelease:()=>{s.flattenOffset(),setTimeout(()=>{g.current=!1},150);const{width:e,height:t}=react_native_1.Dimensions.get("window"),d=e/2-30,R=-d,I=20,A=-(t-120),_=u.current.x,b=u.current.y;if(_<R||_>d||b<A||b>I){const F=Math.min(Math.max(_,R),d),q=Math.min(Math.max(b,A),I);react_native_1.Animated.spring(s,{toValue:{x:F,y:q},friction:7,tension:50,useNativeDriver:!1}).start()}},onPanResponderTerminate:()=>{s.flattenOffset(),g.current=!1}})).current;(0,react_1.useEffect)(()=>{capture_1.ScreenCapture.isRecording().then(e=>{m(e)}).catch(()=>{})},[]),(0,react_1.useEffect)(()=>{let e=null;return p?(y(0),l.current=setInterval(()=>{y(t=>t+1)},1e3),e=react_native_1.Animated.loop(react_native_1.Animated.sequence([react_native_1.Animated.timing(h,{toValue:1.15,duration:500,useNativeDriver:!0}),react_native_1.Animated.timing(h,{toValue:1,duration:500,useNativeDriver:!0})])),e.start()):(l.current&&(clearInterval(l.current),l.current=null),y(0),h.setValue(1)),()=>{l.current&&clearInterval(l.current),e&&e.stop()}},[p,h]);const O=(0,react_1.useCallback)(async()=>{if(!g.current)try{(0,NativeInspector_1.triggerNativeHaptic)("light"),v(!0),await new Promise(t=>setTimeout(t,60));const e=await capture_1.ScreenCapture.takeScreenshot({format:"png",quality:.9,hideInspector:!1});if(v(!1),react_native_1.Animated.sequence([react_native_1.Animated.timing(w,{toValue:.65,duration:70,useNativeDriver:!0}),react_native_1.Animated.timing(w,{toValue:0,duration:200,useNativeDriver:!0})]).start(),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t={id:`screenshot_${e.timestamp}.png`,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`screenshot_${e.timestamp}.png`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};f(t),r?.().catch(()=>{}),(0,toast_1.showToast)(c("header.screenshotCaptured","Screenshot captured"))}else(0,toast_1.showToast)(c("header.screenshotFailed","Failed to capture screenshot"))}catch{v(!1),(0,toast_1.showToast)(c("header.screenshotError","Error capturing screenshot"))}},[r,w,c]),x=(0,react_1.useCallback)(async()=>{if(!g.current)try{if(p){(0,NativeInspector_1.triggerNativeHaptic)("medium");const e=await capture_1.ScreenCapture.stopRecording();if(m(!1),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t={id:`video_${e.timestamp}.${e.format}`,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||`video_${e.timestamp}.${e.format}`,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};f(t),r?.().catch(()=>{}),(0,toast_1.showToast)(c("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else(0,NativeInspector_1.triggerNativeHaptic)("medium"),await capture_1.ScreenCapture.startRecording({fps:a,scale:o,audioSource:S,bitrate:n>0?n:void 0,maxDurationSeconds:i})?(m(!0),(0,toast_1.showToast)(c("header.recordingStarted","Recording started"))):(0,toast_1.showToast)(c("header.recordingStartFailed","Failed to start recording"))}catch{(0,toast_1.showToast)(c("header.recordingError","Error during screen recording")),m(!1)}},[p,a,o,n,i,S,r,c]),B=e=>{const t=Math.floor(e/60),d=e%60;return`${t<10?"0":""}${t}:${d<10?"0":""}${d}`};return M==="media"||T==="media"?null:<>
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(r,a,s,n){n===void 0&&(n=s);var i=Object.getOwnPropertyDescriptor(a,s);(!i||("get"in i?!a.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return a[s]}}),Object.defineProperty(r,n,i)}):(function(r,a,s,n){n===void 0&&(n=s),r[n]=a[s]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(r,a){Object.defineProperty(r,"default",{enumerable:!0,value:a})}):function(r,a){r.default=a}),__importStar=this&&this.__importStar||(function(){var r=function(a){return r=Object.getOwnPropertyNames||function(s){var n=[];for(var i in s)Object.prototype.hasOwnProperty.call(s,i)&&(n[n.length]=i);return n},r(a)};return function(a){if(a&&a.__esModule)return a;var s={};if(a!=null)for(var n=r(a),i=0;i<n.length;i++)n[i]!=="default"&&__createBinding(s,a,n[i]);return __setModuleDefault(s,a),s}})(),__importDefault=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FloatingCaptureWidget=void 0;const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_linear_gradient_1=__importDefault(require("react-native-linear-gradient")),InspectorContext_1=require("./InspectorContext"),TouchableScale_1=__importDefault(require("../TouchableScale")),NetworkIcons_1=require("../NetworkIcons"),capture_1=require("../../capture"),NativeInspector_1=require("../../native/NativeInspector"),toast_1=require("../../helpers/toast"),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),i18n_1=require("../../i18n"),MediaPreviewModal_1=require("./MediaPreviewModal"),FloatingCaptureWidget=()=>{const{refreshMediaCount:r,captureFps:a,captureScale:s,captureBitrate:n,captureMaxDurationSeconds:i,captureAudioMode:C,activeTab:A,settingsPage:M,peekMode:E,previewMediaItem:v,setPreviewMediaItem:p}=(0,InspectorContext_1.useInspector)(),{t:d}=(0,i18n_1.useTranslation)(),[f,h]=(0,react_1.useState)(!1),[V,y]=(0,react_1.useState)(!1),[P,_]=(0,react_1.useState)(0),u=(0,react_1.useRef)(null),g=(0,react_1.useRef)(new react_native_1.Animated.Value(1)).current,w=(0,react_1.useRef)(new react_native_1.Animated.Value(0)).current,c=(0,react_1.useRef)(new react_native_1.Animated.ValueXY({x:0,y:0})).current,l=(0,react_1.useRef)({x:0,y:0});(0,react_1.useEffect)(()=>{const e=c.x.addListener(o=>l.current.x=o.value),t=c.y.addListener(o=>l.current.y=o.value);return()=>{c.x.removeListener(e),c.y.removeListener(t)}},[c]);const m=(0,react_1.useRef)(!1),F=(0,react_1.useRef)(react_native_1.PanResponder.create({onStartShouldSetPanResponder:()=>!0,onStartShouldSetPanResponderCapture:()=>!1,onMoveShouldSetPanResponder:(e,t)=>Math.abs(t.dx)>2||Math.abs(t.dy)>2,onMoveShouldSetPanResponderCapture:(e,t)=>Math.abs(t.dx)>4||Math.abs(t.dy)>4,onPanResponderGrant:()=>{m.current=!0,c.setOffset({x:l.current.x,y:l.current.y}),c.setValue({x:0,y:0})},onPanResponderMove:react_native_1.Animated.event([null,{dx:c.x,dy:c.y}],{useNativeDriver:!1}),onPanResponderTerminationRequest:()=>!1,onShouldBlockNativeResponder:()=>!0,onPanResponderRelease:()=>{c.flattenOffset(),setTimeout(()=>{m.current=!1},100);const{width:e,height:t}=react_native_1.Dimensions.get("window"),o=e/2-20,x=-o,R=20,T=-(t-140),b=l.current.x,S=l.current.y;if(b<x||b>o||S<T||S>R){const B=Math.min(Math.max(b,x),o),q=Math.min(Math.max(S,T),R);react_native_1.Animated.spring(c,{toValue:{x:B,y:q},friction:7,tension:50,useNativeDriver:!1}).start()}},onPanResponderTerminate:()=>{c.flattenOffset(),m.current=!1}})).current;(0,react_1.useEffect)(()=>{capture_1.ScreenCapture.isRecording().then(e=>{h(e)}).catch(()=>{})},[]),(0,react_1.useEffect)(()=>{let e=null;return f?(_(0),u.current=setInterval(()=>{_(t=>t+1)},1e3),e=react_native_1.Animated.loop(react_native_1.Animated.sequence([react_native_1.Animated.timing(g,{toValue:1.15,duration:500,useNativeDriver:!0}),react_native_1.Animated.timing(g,{toValue:1,duration:500,useNativeDriver:!0})])),e.start()):(u.current&&(clearInterval(u.current),u.current=null),_(0),g.setValue(1)),()=>{u.current&&clearInterval(u.current),e&&e.stop()}},[f,g]);const D=(0,react_1.useCallback)(async()=>{if(!m.current)try{(0,NativeInspector_1.triggerNativeHaptic)("light"),y(!0),await new Promise(t=>setTimeout(t,60));const e=await capture_1.ScreenCapture.takeScreenshot({format:"png",quality:.9,hideInspector:!1});if(y(!1),react_native_1.Animated.sequence([react_native_1.Animated.timing(w,{toValue:.65,duration:70,useNativeDriver:!0}),react_native_1.Animated.timing(w,{toValue:0,duration:200,useNativeDriver:!0})]).start(),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t=(0,capture_1.generateCaptureId)("screenshot",e.format||"png"),o={id:t,type:"image",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||t,sizeBytes:e.sizeBytes,timestamp:e.timestamp,width:e.width,height:e.height};p(o),r?.().catch(()=>{}),(0,toast_1.showToast)(d("header.screenshotCaptured","Screenshot captured"))}else(0,toast_1.showToast)(d("header.screenshotFailed","Failed to capture screenshot"))}catch{y(!1),(0,toast_1.showToast)(d("header.screenshotError","Error capturing screenshot"))}},[r,w,d]),I=(0,react_1.useCallback)(async()=>{if(!m.current)try{if(f){(0,NativeInspector_1.triggerNativeHaptic)("medium");const e=await capture_1.ScreenCapture.stopRecording();if(h(!1),e){(0,NativeInspector_1.triggerNativeHaptic)("success");const t=(0,capture_1.generateCaptureId)("video",e.format),o={id:t,type:e.format==="gif"?"gif":"video",format:e.format,uri:e.uri,filename:e.uri.split("/").pop()||t,sizeBytes:e.sizeBytes,timestamp:e.timestamp,durationMs:e.durationMs,width:e.width,height:e.height,hasAudio:e.hasAudio,thumbnailUri:e.thumbnailUri};p(o),r?.().catch(()=>{}),(0,toast_1.showToast)(d("header.recordingSaved",{duration:(e.durationMs/1e3).toFixed(1),defaultValue:`Recording saved (${(e.durationMs/1e3).toFixed(1)}s)`}))}}else(0,NativeInspector_1.triggerNativeHaptic)("medium"),h(!0),await capture_1.ScreenCapture.startRecording({fps:a,scale:s,audioSource:C,bitrate:n>0?n:void 0,maxDurationSeconds:i})?(0,toast_1.showToast)(d("header.recordingStarted","Recording started")):(h(!1),(0,toast_1.showToast)(d("header.recordingStartFailed","Failed to start recording")))}catch{(0,toast_1.showToast)(d("header.recordingError","Error during screen recording")),h(!1)}},[f,a,s,n,i,C,r,d]),O=e=>{const t=Math.floor(e/60),o=e%60;return`${t<10?"0":""}${t}:${o<10?"0":""}${o}`};return A==="media"||M==="media"?null:<>
2
2
 
3
3
  <react_native_1.Animated.View pointerEvents="none"style={[styles.flashOverlay,{opacity:w}]}/>
4
4
 
5
- {!V&&<react_native_1.Animated.View{...D.panHandlers}style={[styles.container,{transform:[{translateX:s.x},{translateY:s.y}]}]}>
5
+ {!V&&!v&&<react_native_1.Animated.View{...F.panHandlers}style={[styles.container,{transform:c.getTranslateTransform()}]}>
6
6
 
7
- {p?<react_native_1.View style={styles.recordingShadowWrapper}>
8
- <TouchableScale_1.default onPress={x}style={styles.recordingPillWrapper}>
7
+ {f?<react_native_1.View style={styles.recordingShadowWrapper}>
8
+ <TouchableScale_1.default onPress={I}style={styles.recordingPillWrapper}>
9
9
  <react_native_linear_gradient_1.default colors={["#E11D48","#BE123C"]}start={{x:0,y:0}}end={{x:1,y:0}}style={styles.recordingPill}>
10
- <react_native_1.Animated.View style={[styles.recordingDot,{transform:[{scale:h}]}]}/>
10
+ <react_native_1.Animated.View style={[styles.recordingDot,{transform:[{scale:g}]}]}/>
11
11
  <react_native_1.Text style={styles.recordingText}>
12
- REC {B(P)}
12
+ REC {O(P)}
13
13
  </react_native_1.Text>
14
14
  <react_native_1.View style={styles.stopIconBadge}>
15
15
  <react_native_1.View style={styles.stopIconSquare}/>
@@ -19,17 +19,12 @@
19
19
  </react_native_1.View>:<react_native_1.View style={styles.dockShadowWrapper}>
20
20
  <react_native_linear_gradient_1.default colors={["#0E1326","#1A1E38","#0E1326"]}start={{x:0,y:0}}end={{x:1,y:0}}style={styles.dockBar}>
21
21
 
22
- <react_native_1.View style={styles.dragGripArea}pointerEvents="none">
23
- <NetworkIcons_1.GripVerticalIcon size={13}color="rgba(255, 255, 255, 0.45)"/>
24
- </react_native_1.View>
25
-
26
-
27
- <TouchableScale_1.default onPress={O}style={styles.menuItemBtn}accessible={!0}accessibilityLabel="Take Screenshot">
22
+ <TouchableScale_1.default onPress={D}style={styles.menuItemBtn}accessible={!0}accessibilityLabel="Take Screenshot">
28
23
  <react_native_1.View style={[styles.menuItemIconCircle,{backgroundColor:"rgba(56, 189, 248, 0.22)"}]}>
29
24
  <NetworkIcons_1.ScreenshotCaptureIcon size={14}color={AppColors_1.AppColors.sky400}/>
30
25
  </react_native_1.View>
31
26
  <react_native_1.Text style={styles.menuItemText}>
32
- {c("header.screenshot","Screenshot")}
27
+ {d("header.screenshot","Screenshot")}
33
28
  </react_native_1.Text>
34
29
  </TouchableScale_1.default>
35
30
 
@@ -37,18 +32,23 @@
37
32
  <react_native_1.View style={styles.dockDivider}/>
38
33
 
39
34
 
40
- <TouchableScale_1.default onPress={x}style={styles.menuItemBtn}accessible={!0}accessibilityLabel={c("header.recordScreen","Record Screen")}>
35
+ <TouchableScale_1.default onPress={I}style={styles.menuItemBtn}accessible={!0}accessibilityLabel={d("header.recordScreen","Record Screen")}>
41
36
  <react_native_1.View style={[styles.menuItemIconCircle,{backgroundColor:"rgba(244, 63, 94, 0.24)"}]}>
42
37
  <NetworkIcons_1.ScreenRecordIcon size={14}color={AppColors_1.AppColors.rose400||"#FB7185"}/>
43
38
  </react_native_1.View>
44
39
  <react_native_1.Text style={styles.menuItemText}>
45
- {c("header.record","Record")}
40
+ {d("header.record","Record")}
46
41
  </react_native_1.Text>
47
42
  </TouchableScale_1.default>
43
+
44
+
45
+ <react_native_1.View style={styles.dragGripArea}>
46
+ <NetworkIcons_1.GripVerticalIcon size={14}color="rgba(255, 255, 255, 0.55)"/>
47
+ </react_native_1.View>
48
48
  </react_native_linear_gradient_1.default>
49
49
  </react_native_1.View>}
50
50
  </react_native_1.Animated.View>}
51
51
 
52
52
 
53
- <MediaPreviewModal_1.MediaPreviewModal item={C}visible={!!C}onClose={()=>f(null)}onDelete={async e=>{await capture_1.ScreenCapture.deleteMedia(e.uri),r?.().catch(()=>{}),f(null)}}onConvertToGif={async e=>{const t=await capture_1.ScreenCapture.convertToGif(e.uri,{fps:12,width:480});t&&(r?.().catch(()=>{}),f({id:`anim_${t.timestamp}.gif`,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||`anim_${t.timestamp}.gif`,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs}))}}/>
54
- </>};exports.FloatingCaptureWidget=FloatingCaptureWidget;const styles=react_native_1.StyleSheet.create({flashOverlay:{...react_native_1.StyleSheet.absoluteFillObject,backgroundColor:AppColors_1.AppColors.white,zIndex:999999},container:{position:"absolute",bottom:react_native_1.Platform.OS==="ios"?22:16,alignSelf:"center",alignItems:"center",justifyContent:"center",zIndex:999999,elevation:999999},dockShadowWrapper:{borderRadius:24,backgroundColor:"#0D1120",...react_native_1.Platform.select({ios:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:6},shadowOpacity:.45,shadowRadius:14},android:{elevation:16}})},dockBar:{flexDirection:"row",alignItems:"center",borderRadius:24,width:272,paddingVertical:0,paddingHorizontal:0,overflow:"hidden"},dragGripArea:{paddingLeft:10,paddingRight:2,paddingVertical:10,alignItems:"center",justifyContent:"center"},dockDivider:{width:1,height:20,backgroundColor:"rgba(255, 255, 255, 0.12)"},menuItemBtn:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",gap:7,paddingVertical:9,paddingHorizontal:10},menuItemIconCircle:{width:24,height:24,borderRadius:12,alignItems:"center",justifyContent:"center"},menuItemText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:12,color:AppColors_1.AppColors.white,letterSpacing:.1},recordingShadowWrapper:{borderRadius:20,...react_native_1.Platform.select({ios:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:4},shadowOpacity:.4,shadowRadius:10},android:{elevation:12}})},recordingPillWrapper:{borderRadius:20,overflow:"hidden"},recordingPill:{flexDirection:"row",alignItems:"center",gap:7,paddingVertical:6.5,paddingHorizontal:12,borderRadius:20,borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.35)"},recordingDot:{width:7,height:7,borderRadius:3.5,backgroundColor:AppColors_1.AppColors.white},recordingText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11,color:AppColors_1.AppColors.white,letterSpacing:.3},stopIconBadge:{width:16,height:16,borderRadius:8,backgroundColor:"rgba(255, 255, 255, 0.28)",alignItems:"center",justifyContent:"center",marginLeft:2},stopIconSquare:{width:5.5,height:5.5,borderRadius:1,backgroundColor:AppColors_1.AppColors.white}});exports.default=exports.FloatingCaptureWidget;
53
+ <MediaPreviewModal_1.MediaPreviewModal item={v}visible={!!v}onClose={()=>p(null)}onDelete={async e=>{await capture_1.ScreenCapture.deleteMedia(e.uri),r?.().catch(()=>{}),p(null)}}onConvertToGif={async e=>{const t=await capture_1.ScreenCapture.convertToGif(e.uri,{fps:12,width:480});if(t){r?.().catch(()=>{});const o=(0,capture_1.generateCaptureId)("anim","gif");p({id:o,type:"gif",format:"gif",uri:t.uri,filename:t.uri.split("/").pop()||o,sizeBytes:t.sizeBytes,timestamp:t.timestamp,durationMs:t.durationMs})}}}/>
54
+ </>};exports.FloatingCaptureWidget=FloatingCaptureWidget;const styles=react_native_1.StyleSheet.create({flashOverlay:{...react_native_1.StyleSheet.absoluteFillObject,backgroundColor:AppColors_1.AppColors.white,zIndex:999999},container:{position:"absolute",bottom:react_native_1.Platform.OS==="ios"?22:16,alignSelf:"center",alignItems:"center",justifyContent:"center",zIndex:999999,elevation:999999},dockShadowWrapper:{borderRadius:24,backgroundColor:"#0D1120",...react_native_1.Platform.select({ios:{shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:6},shadowOpacity:.45,shadowRadius:14},android:{elevation:16}})},dockBar:{flexDirection:"row",alignItems:"center",borderRadius:24,overflow:"hidden"},dragGripArea:{paddingLeft:6,paddingRight:12,paddingVertical:10,alignItems:"center",justifyContent:"center"},dockDivider:{width:1,height:18,backgroundColor:"rgba(255, 255, 255, 0.14)"},menuItemBtn:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:7,paddingVertical:8.5,paddingHorizontal:12},menuItemIconCircle:{width:24,height:24,borderRadius:12,alignItems:"center",justifyContent:"center"},menuItemText:{fontFamily:AppFonts_1.AppFonts.interSemiBold,fontSize:12,color:AppColors_1.AppColors.white,letterSpacing:.1},recordingShadowWrapper:{borderRadius:22,alignItems:"center",justifyContent:"center",...react_native_1.Platform.select({ios:{shadowColor:"#E11D48",shadowOffset:{width:0,height:4},shadowOpacity:.5,shadowRadius:12},android:{elevation:14}})},recordingPillWrapper:{borderRadius:22,overflow:"hidden"},recordingPill:{flexDirection:"row",alignItems:"center",justifyContent:"center",gap:8,height:38,paddingHorizontal:14,borderRadius:22,borderWidth:1.5,borderColor:"rgba(255, 255, 255, 0.45)"},recordingDot:{width:8,height:8,borderRadius:4,backgroundColor:"#FFFFFF"},recordingText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:12,color:AppColors_1.AppColors.white,letterSpacing:.4},stopIconBadge:{width:18,height:18,borderRadius:9,backgroundColor:"rgba(255, 255, 255, 0.28)",alignItems:"center",justifyContent:"center",marginLeft:3},stopIconSquare:{width:6,height:6,borderRadius:1.5,backgroundColor:AppColors_1.AppColors.white}});exports.default=exports.FloatingCaptureWidget;