react-native-inapp-inspector 2.3.17 → 2.3.19
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.
- package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +47 -0
- package/dist/commonjs/capture.d.ts +2 -0
- package/dist/commonjs/capture.js +3 -0
- package/dist/commonjs/components/EmptyState.d.ts +1 -0
- package/dist/commonjs/components/EmptyState.js +2 -2
- package/dist/commonjs/components/Inspector/FabLauncher.js +494 -39
- package/dist/commonjs/components/Inspector/InspectorHeader.js +45 -26
- package/dist/commonjs/components/Inspector/MainScreen.js +4 -3
- package/dist/commonjs/components/Inspector/MediaGalleryTab.js +418 -13
- package/dist/commonjs/components/Inspector/MediaPreviewModal.js +376 -88
- package/dist/commonjs/components/Inspector/NetworkDetail.js +49 -63
- package/dist/commonjs/components/Inspector/SettingsPanel.js +499 -119
- package/dist/commonjs/components/Inspector/TabBar.js +166 -4
- package/dist/commonjs/components/JsonViewer.js +4 -3
- package/dist/commonjs/components/NetworkIcons.d.ts +4 -0
- package/dist/commonjs/components/NetworkIcons.js +26 -1
- package/dist/commonjs/components/SegmentedTabs.js +1 -0
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/i18n/locales/en.json +20 -2
- package/dist/commonjs/index.js +45 -30
- package/dist/commonjs/native/NativeInspector.d.ts +3 -0
- package/dist/commonjs/native/NativeInspector.js +14 -1
- package/dist/commonjs/native/NativeNetworkInspector.d.ts +1 -0
- package/dist/commonjs/styles/AppColors.js +78 -78
- package/dist/commonjs/types/enums.d.ts +2 -0
- package/dist/commonjs/types/enums.js +2 -0
- package/dist/commonjs/types/interfaces.d.ts +5 -0
- package/dist/esm/capture.d.ts +2 -0
- package/dist/esm/capture.js +4 -1
- package/dist/esm/components/EmptyState.d.ts +1 -0
- package/dist/esm/components/EmptyState.js +2 -2
- package/dist/esm/components/Inspector/FabLauncher.js +462 -40
- package/dist/esm/components/Inspector/InspectorHeader.js +46 -27
- package/dist/esm/components/Inspector/MainScreen.js +4 -3
- package/dist/esm/components/Inspector/MediaGalleryTab.js +419 -14
- package/dist/esm/components/Inspector/MediaPreviewModal.js +379 -91
- package/dist/esm/components/Inspector/NetworkDetail.js +49 -63
- package/dist/esm/components/Inspector/SettingsPanel.js +500 -120
- package/dist/esm/components/Inspector/TabBar.js +135 -6
- package/dist/esm/components/JsonViewer.js +4 -3
- package/dist/esm/components/NetworkIcons.d.ts +4 -0
- package/dist/esm/components/NetworkIcons.js +21 -0
- package/dist/esm/components/SegmentedTabs.js +1 -0
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/i18n/locales/en.json +20 -2
- package/dist/esm/index.js +44 -29
- package/dist/esm/native/NativeInspector.d.ts +3 -0
- package/dist/esm/native/NativeInspector.js +12 -0
- package/dist/esm/native/NativeNetworkInspector.d.ts +1 -0
- package/dist/esm/styles/AppColors.js +78 -78
- package/dist/esm/types/enums.d.ts +2 -0
- package/dist/esm/types/enums.js +2 -0
- package/dist/esm/types/interfaces.d.ts +5 -0
- package/ios/NetworkInspectorModule.mm +241 -136
- package/package.json +1 -1
- package/react-native-inapp-inspector.podspec +1 -1
- package/src/capture.ts +8 -0
- package/src/components/EmptyState.tsx +3 -1
- package/src/components/Inspector/FabLauncher.tsx +562 -52
- package/src/components/Inspector/InspectorHeader.tsx +60 -22
- package/src/components/Inspector/MainScreen.tsx +3 -2
- package/src/components/Inspector/MediaGalleryTab.tsx +502 -28
- package/src/components/Inspector/MediaPreviewModal.tsx +465 -117
- package/src/components/Inspector/NetworkDetail.tsx +80 -97
- package/src/components/Inspector/SettingsPanel.tsx +708 -152
- package/src/components/Inspector/TabBar.tsx +174 -6
- package/src/components/JsonViewer.tsx +4 -2
- package/src/components/NetworkIcons.tsx +56 -0
- package/src/components/SegmentedTabs.tsx +1 -0
- package/src/constants/version.ts +1 -1
- package/src/i18n/locales/en.json +20 -4
- package/src/index.tsx +46 -31
- package/src/native/NativeInspector.ts +17 -0
- package/src/native/NativeNetworkInspector.ts +1 -0
- package/src/styles/AppColors.ts +80 -80
- package/src/types/enums.ts +2 -0
- package/src/types/interfaces.ts +5 -0
|
@@ -49,21 +49,26 @@ const capture_1 = require("../../capture");
|
|
|
49
49
|
const helpers_1 = require("../../helpers");
|
|
50
50
|
const toast_1 = require("../../helpers/toast");
|
|
51
51
|
const i18n_1 = require("../../i18n");
|
|
52
|
+
const InspectorContext_1 = require("./InspectorContext");
|
|
52
53
|
const MediaGalleryTab = () => {
|
|
53
54
|
const { t } = (0, i18n_1.useTranslation)();
|
|
55
|
+
const { refreshMediaCount, switchActiveTab } = (0, InspectorContext_1.useInspector)();
|
|
54
56
|
const [mediaList, setMediaList] = (0, react_1.useState)([]);
|
|
55
57
|
const [refreshing, setRefreshing] = (0, react_1.useState)(false);
|
|
56
58
|
const [selectedFilter, setSelectedFilter] = (0, react_1.useState)('all');
|
|
57
59
|
const [selectedItem, setSelectedItem] = (0, react_1.useState)(null);
|
|
60
|
+
const [selectedIds, setSelectedIds] = (0, react_1.useState)(new Set());
|
|
61
|
+
const [viewMode, setViewMode] = (0, react_1.useState)('grid');
|
|
58
62
|
const loadMedia = (0, react_1.useCallback)(async () => {
|
|
59
63
|
try {
|
|
60
64
|
const items = await capture_1.ScreenCapture.getMediaList();
|
|
61
65
|
setMediaList(items);
|
|
66
|
+
refreshMediaCount?.().catch(() => { });
|
|
62
67
|
}
|
|
63
68
|
catch {
|
|
64
69
|
setMediaList([]);
|
|
65
70
|
}
|
|
66
|
-
}, []);
|
|
71
|
+
}, [refreshMediaCount]);
|
|
67
72
|
(0, react_1.useEffect)(() => {
|
|
68
73
|
loadMedia();
|
|
69
74
|
}, [loadMedia]);
|
|
@@ -80,11 +85,57 @@ const MediaGalleryTab = () => {
|
|
|
80
85
|
const totalStorageBytes = (0, react_1.useMemo)(() => {
|
|
81
86
|
return mediaList.reduce((sum, item) => sum + (item.sizeBytes || 0), 0);
|
|
82
87
|
}, [mediaList]);
|
|
88
|
+
const toggleSelect = (0, react_1.useCallback)((id) => {
|
|
89
|
+
setSelectedIds(prev => {
|
|
90
|
+
const next = new Set(prev);
|
|
91
|
+
if (next.has(id)) {
|
|
92
|
+
next.delete(id);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
next.add(id);
|
|
96
|
+
}
|
|
97
|
+
return next;
|
|
98
|
+
});
|
|
99
|
+
}, []);
|
|
83
100
|
const handleDeleteItem = async (item) => {
|
|
84
101
|
await capture_1.ScreenCapture.deleteMedia(item.uri);
|
|
102
|
+
setSelectedIds(prev => {
|
|
103
|
+
const next = new Set(prev);
|
|
104
|
+
next.delete(item.id);
|
|
105
|
+
return next;
|
|
106
|
+
});
|
|
85
107
|
await loadMedia();
|
|
108
|
+
const count = await refreshMediaCount?.();
|
|
109
|
+
if (count === 0) {
|
|
110
|
+
switchActiveTab('apis');
|
|
111
|
+
}
|
|
86
112
|
(0, toast_1.showToast)(t('mediaGallery.deleted'));
|
|
87
113
|
};
|
|
114
|
+
const handleDeleteSelected = () => {
|
|
115
|
+
const count = selectedIds.size;
|
|
116
|
+
if (count === 0)
|
|
117
|
+
return;
|
|
118
|
+
react_native_1.Alert.alert(t('mediaGallery.deleteSelectedTitle'), t('mediaGallery.deleteSelectedMessage', { count }), [
|
|
119
|
+
{ text: t('common.cancel'), style: 'cancel' },
|
|
120
|
+
{
|
|
121
|
+
text: t('mediaGallery.delete'),
|
|
122
|
+
style: 'destructive',
|
|
123
|
+
onPress: async () => {
|
|
124
|
+
const itemsToDelete = mediaList.filter(item => selectedIds.has(item.id));
|
|
125
|
+
for (const item of itemsToDelete) {
|
|
126
|
+
await capture_1.ScreenCapture.deleteMedia(item.uri);
|
|
127
|
+
}
|
|
128
|
+
setSelectedIds(new Set());
|
|
129
|
+
await loadMedia();
|
|
130
|
+
const remainingCount = await refreshMediaCount?.();
|
|
131
|
+
if (remainingCount === 0) {
|
|
132
|
+
switchActiveTab('apis');
|
|
133
|
+
}
|
|
134
|
+
(0, toast_1.showToast)(t('mediaGallery.deletedCount', { count: itemsToDelete.length }));
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
]);
|
|
138
|
+
};
|
|
88
139
|
const handleClearAll = () => {
|
|
89
140
|
react_native_1.Alert.alert(t('mediaGallery.purgeTitle'), t('mediaGallery.purgeMessage', { count: mediaList.length, size: (0, helpers_1.formatBytes)(totalStorageBytes) }), [
|
|
90
141
|
{ text: t('common.cancel'), style: 'cancel' },
|
|
@@ -93,7 +144,10 @@ const MediaGalleryTab = () => {
|
|
|
93
144
|
style: 'destructive',
|
|
94
145
|
onPress: async () => {
|
|
95
146
|
await capture_1.ScreenCapture.clearAllMedia();
|
|
147
|
+
setSelectedIds(new Set());
|
|
96
148
|
await loadMedia();
|
|
149
|
+
await refreshMediaCount?.();
|
|
150
|
+
switchActiveTab('apis');
|
|
97
151
|
(0, toast_1.showToast)(t('mediaGallery.allPurged'));
|
|
98
152
|
},
|
|
99
153
|
},
|
|
@@ -103,14 +157,45 @@ const MediaGalleryTab = () => {
|
|
|
103
157
|
const gifResult = await capture_1.ScreenCapture.convertToGif(item.uri, { fps: 12, width: 480 });
|
|
104
158
|
if (gifResult) {
|
|
105
159
|
await loadMedia();
|
|
160
|
+
refreshMediaCount?.().catch(() => { });
|
|
106
161
|
}
|
|
107
162
|
};
|
|
108
|
-
const
|
|
163
|
+
const renderFilterIcon = (filterKey, isActive) => {
|
|
164
|
+
const iconColor = isActive ? AppColors_1.AppColors.sky400 : AppColors_1.AppColors.slate400;
|
|
165
|
+
const iconSize = 12;
|
|
166
|
+
switch (filterKey) {
|
|
167
|
+
case 'all':
|
|
168
|
+
return <NetworkIcons_1.ScreencastIcon size={iconSize} color={iconColor}/>;
|
|
169
|
+
case 'image':
|
|
170
|
+
return <NetworkIcons_1.ImageIcon size={iconSize} color={iconColor}/>;
|
|
171
|
+
case 'video':
|
|
172
|
+
return <NetworkIcons_1.FilmIcon size={iconSize} color={iconColor}/>;
|
|
173
|
+
case 'gif':
|
|
174
|
+
return <NetworkIcons_1.GifIcon size={iconSize} color={iconColor}/>;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const renderGridItem = ({ item }) => {
|
|
109
178
|
const isVideo = item.type === 'video';
|
|
110
179
|
const isGif = item.type === 'gif';
|
|
111
|
-
|
|
180
|
+
const thumbUri = isVideo ? item.thumbnailUri : item.uri;
|
|
181
|
+
const isSelected = selectedIds.has(item.id);
|
|
182
|
+
return (<TouchableScale_1.default onPress={() => setSelectedItem(item)} style={[galleryStyles.card, isSelected && galleryStyles.cardSelected]}>
|
|
112
183
|
<react_native_1.View style={galleryStyles.thumbnailContainer}>
|
|
113
|
-
<react_native_1.Image source={{ uri:
|
|
184
|
+
{thumbUri ? (<react_native_1.Image source={{ uri: thumbUri }} style={galleryStyles.thumbnail} resizeMode="cover"/>) : (<react_native_1.View style={galleryStyles.thumbnailFallback}>
|
|
185
|
+
{isVideo ? (<NetworkIcons_1.FilmIcon size={26} color={AppColors_1.AppColors.sky400}/>) : (<NetworkIcons_1.ImageIcon size={26} color={AppColors_1.AppColors.slate400}/>)}
|
|
186
|
+
</react_native_1.View>)}
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
<react_native_1.TouchableOpacity onPress={() => toggleSelect(item.id)} style={[
|
|
190
|
+
galleryStyles.checkbox,
|
|
191
|
+
isSelected && galleryStyles.checkboxSelected,
|
|
192
|
+
]} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
193
|
+
{isSelected && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.white}/>}
|
|
194
|
+
</react_native_1.TouchableOpacity>
|
|
195
|
+
|
|
196
|
+
{isVideo && (<react_native_1.View style={galleryStyles.miniPlayCircle}>
|
|
197
|
+
<NetworkIcons_1.PlayIcon size={14} color={AppColors_1.AppColors.white}/>
|
|
198
|
+
</react_native_1.View>)}
|
|
114
199
|
<react_native_1.View style={galleryStyles.typeBadge}>
|
|
115
200
|
{isVideo ? (<NetworkIcons_1.FilmIcon size={11} color={AppColors_1.AppColors.sky400}/>) : isGif ? (<NetworkIcons_1.GifIcon size={11} color={AppColors_1.AppColors.warningAmber}/>) : (<NetworkIcons_1.ImageIcon size={11} color={AppColors_1.AppColors.emerald500}/>)}
|
|
116
201
|
<react_native_1.Text style={galleryStyles.typeBadgeText}>
|
|
@@ -135,6 +220,59 @@ const MediaGalleryTab = () => {
|
|
|
135
220
|
</react_native_1.View>
|
|
136
221
|
</TouchableScale_1.default>);
|
|
137
222
|
};
|
|
223
|
+
const renderListItem = ({ item }) => {
|
|
224
|
+
const isVideo = item.type === 'video';
|
|
225
|
+
const isGif = item.type === 'gif';
|
|
226
|
+
const thumbUri = isVideo ? item.thumbnailUri : item.uri;
|
|
227
|
+
const isSelected = selectedIds.has(item.id);
|
|
228
|
+
return (<TouchableScale_1.default onPress={() => setSelectedItem(item)} style={[galleryStyles.listRow, isSelected && galleryStyles.listRowSelected]}>
|
|
229
|
+
|
|
230
|
+
<react_native_1.TouchableOpacity onPress={() => toggleSelect(item.id)} style={[
|
|
231
|
+
galleryStyles.listCheckbox,
|
|
232
|
+
isSelected && galleryStyles.checkboxSelected,
|
|
233
|
+
]} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
234
|
+
{isSelected && <NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.white}/>}
|
|
235
|
+
</react_native_1.TouchableOpacity>
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
<react_native_1.View style={galleryStyles.listThumbContainer}>
|
|
239
|
+
{thumbUri ? (<react_native_1.Image source={{ uri: thumbUri }} style={galleryStyles.listThumb} resizeMode="cover"/>) : (<react_native_1.View style={galleryStyles.listThumbFallback}>
|
|
240
|
+
{isVideo ? (<NetworkIcons_1.FilmIcon size={18} color={AppColors_1.AppColors.sky400}/>) : (<NetworkIcons_1.ImageIcon size={18} color={AppColors_1.AppColors.slate400}/>)}
|
|
241
|
+
</react_native_1.View>)}
|
|
242
|
+
{isVideo && (<react_native_1.View style={galleryStyles.listMiniPlay}>
|
|
243
|
+
<NetworkIcons_1.PlayIcon size={10} color={AppColors_1.AppColors.white}/>
|
|
244
|
+
</react_native_1.View>)}
|
|
245
|
+
</react_native_1.View>
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
<react_native_1.View style={galleryStyles.listInfo}>
|
|
249
|
+
<react_native_1.Text style={galleryStyles.listTitle} numberOfLines={1}>
|
|
250
|
+
{item.filename}
|
|
251
|
+
</react_native_1.Text>
|
|
252
|
+
<react_native_1.View style={galleryStyles.listMetaRow}>
|
|
253
|
+
<react_native_1.View style={galleryStyles.listBadge}>
|
|
254
|
+
{isVideo ? (<NetworkIcons_1.FilmIcon size={10} color={AppColors_1.AppColors.sky400}/>) : isGif ? (<NetworkIcons_1.GifIcon size={10} color={AppColors_1.AppColors.warningAmber}/>) : (<NetworkIcons_1.ImageIcon size={10} color={AppColors_1.AppColors.emerald500}/>)}
|
|
255
|
+
<react_native_1.Text style={galleryStyles.listBadgeText}>
|
|
256
|
+
{item.format.toUpperCase()}
|
|
257
|
+
</react_native_1.Text>
|
|
258
|
+
</react_native_1.View>
|
|
259
|
+
<react_native_1.Text style={galleryStyles.cardMeta}>
|
|
260
|
+
{(0, helpers_1.formatBytes)(item.sizeBytes)}
|
|
261
|
+
</react_native_1.Text>
|
|
262
|
+
<react_native_1.Text style={galleryStyles.cardMetaDot}>•</react_native_1.Text>
|
|
263
|
+
<react_native_1.Text style={galleryStyles.cardMeta}>
|
|
264
|
+
{new Date(item.timestamp).toLocaleDateString([], { month: 'short', day: 'numeric' })}{' '}
|
|
265
|
+
{new Date(item.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
|
|
266
|
+
</react_native_1.Text>
|
|
267
|
+
</react_native_1.View>
|
|
268
|
+
</react_native_1.View>
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
<react_native_1.TouchableOpacity onPress={() => handleDeleteItem(item)} style={galleryStyles.listDeleteBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
272
|
+
<NetworkIcons_1.TrashIcon size={14} color={AppColors_1.AppColors.red500}/>
|
|
273
|
+
</react_native_1.TouchableOpacity>
|
|
274
|
+
</TouchableScale_1.default>);
|
|
275
|
+
};
|
|
138
276
|
return (<react_native_1.View style={galleryStyles.container}>
|
|
139
277
|
|
|
140
278
|
<react_native_1.View style={galleryStyles.filterBar}>
|
|
@@ -152,6 +290,7 @@ const MediaGalleryTab = () => {
|
|
|
152
290
|
galleryStyles.chip,
|
|
153
291
|
isActive && galleryStyles.chipActive,
|
|
154
292
|
]}>
|
|
293
|
+
{renderFilterIcon(filterKey, isActive)}
|
|
155
294
|
<react_native_1.Text style={[
|
|
156
295
|
galleryStyles.chipText,
|
|
157
296
|
isActive && galleryStyles.chipTextActive,
|
|
@@ -162,15 +301,68 @@ const MediaGalleryTab = () => {
|
|
|
162
301
|
})}
|
|
163
302
|
</react_native_1.View>
|
|
164
303
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
304
|
+
|
|
305
|
+
<react_native_1.View style={galleryStyles.viewToggleContainer}>
|
|
306
|
+
<react_native_1.TouchableOpacity onPress={() => setViewMode('grid')} style={[
|
|
307
|
+
galleryStyles.viewToggleBtn,
|
|
308
|
+
viewMode === 'grid' && galleryStyles.viewToggleBtnActive,
|
|
309
|
+
]}>
|
|
310
|
+
<NetworkIcons_1.GridIcon size={13} color={viewMode === 'grid' ? AppColors_1.AppColors.white : AppColors_1.AppColors.slate400}/>
|
|
311
|
+
</react_native_1.TouchableOpacity>
|
|
312
|
+
<react_native_1.TouchableOpacity onPress={() => setViewMode('list')} style={[
|
|
313
|
+
galleryStyles.viewToggleBtn,
|
|
314
|
+
viewMode === 'list' && galleryStyles.viewToggleBtnActive,
|
|
315
|
+
]}>
|
|
316
|
+
<NetworkIcons_1.ListIcon size={13} color={viewMode === 'list' ? AppColors_1.AppColors.white : AppColors_1.AppColors.slate400}/>
|
|
317
|
+
</react_native_1.TouchableOpacity>
|
|
318
|
+
</react_native_1.View>
|
|
169
319
|
</react_native_1.View>
|
|
170
320
|
|
|
171
321
|
|
|
172
|
-
|
|
322
|
+
{mediaList.length > 0 && (<react_native_1.View style={galleryStyles.subBar}>
|
|
323
|
+
<react_native_1.View style={galleryStyles.resultCountWrapper}>
|
|
324
|
+
<react_native_1.Text style={[
|
|
325
|
+
galleryStyles.resultCountText,
|
|
326
|
+
selectedIds.size > 0 && galleryStyles.resultCountTextSelected,
|
|
327
|
+
]}>
|
|
328
|
+
{selectedIds.size > 0
|
|
329
|
+
? t('mediaGallery.selectedOfResults', {
|
|
330
|
+
selected: selectedIds.size,
|
|
331
|
+
total: filteredMedia.length,
|
|
332
|
+
defaultValue: `Selected ${selectedIds.size} of ${filteredMedia.length} results`,
|
|
333
|
+
})
|
|
334
|
+
: filteredMedia.length !== mediaList.length
|
|
335
|
+
? t('mediaGallery.showingFilteredResults', {
|
|
336
|
+
count: filteredMedia.length,
|
|
337
|
+
total: mediaList.length,
|
|
338
|
+
defaultValue: `Showing ${filteredMedia.length} of ${mediaList.length} results`,
|
|
339
|
+
})
|
|
340
|
+
: t('mediaGallery.showingResults', {
|
|
341
|
+
count: filteredMedia.length,
|
|
342
|
+
defaultValue: `Showing ${filteredMedia.length} results`,
|
|
343
|
+
})}
|
|
344
|
+
</react_native_1.Text>
|
|
345
|
+
</react_native_1.View>
|
|
173
346
|
|
|
347
|
+
<react_native_1.View style={galleryStyles.actionsGroup}>
|
|
348
|
+
{selectedIds.size > 0 && (<react_native_1.TouchableOpacity onPress={handleDeleteSelected} style={galleryStyles.deleteBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
349
|
+
<NetworkIcons_1.TrashIcon size={13} color={AppColors_1.AppColors.red500}/>
|
|
350
|
+
<react_native_1.Text style={galleryStyles.deleteBtnText}>
|
|
351
|
+
{t('mediaGallery.deleteSelected', { count: selectedIds.size })}
|
|
352
|
+
</react_native_1.Text>
|
|
353
|
+
</react_native_1.TouchableOpacity>)}
|
|
354
|
+
|
|
355
|
+
<react_native_1.TouchableOpacity onPress={handleClearAll} style={galleryStyles.clearBtn} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
|
|
356
|
+
<NetworkIcons_1.TrashIcon size={13} color={AppColors_1.AppColors.red500}/>
|
|
357
|
+
<react_native_1.Text style={galleryStyles.clearBtnText}>
|
|
358
|
+
{t('mediaGallery.purge', { size: (0, helpers_1.formatBytes)(totalStorageBytes) })}
|
|
359
|
+
</react_native_1.Text>
|
|
360
|
+
</react_native_1.TouchableOpacity>
|
|
361
|
+
</react_native_1.View>
|
|
362
|
+
</react_native_1.View>)}
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
<react_native_1.FlatList key={viewMode} data={filteredMedia} keyExtractor={item => item.id} renderItem={viewMode === 'grid' ? renderGridItem : renderListItem} numColumns={viewMode === 'grid' ? 2 : 1} columnWrapperStyle={viewMode === 'grid' ? galleryStyles.columnWrapper : undefined} contentContainerStyle={galleryStyles.listContent} refreshControl={<react_native_1.RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={AppColors_1.AppColors.sky400}/>} ListEmptyComponent={<EmptyState_1.default customTitle={t('mediaGallery.noMediaTitle')} customSub={t('mediaGallery.noMediaDesc')} showReload={false}/>}/>
|
|
174
366
|
|
|
175
367
|
|
|
176
368
|
<MediaPreviewModal_1.MediaPreviewModal item={selectedItem} visible={!!selectedItem} onClose={() => setSelectedItem(null)} onDelete={handleDeleteItem} onConvertToGif={handleConvertToGif}/>
|
|
@@ -189,19 +381,22 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
189
381
|
alignItems: 'center',
|
|
190
382
|
justifyContent: 'space-between',
|
|
191
383
|
paddingHorizontal: 12,
|
|
192
|
-
paddingVertical:
|
|
384
|
+
paddingVertical: 9,
|
|
193
385
|
borderBottomWidth: 1,
|
|
194
386
|
borderBottomColor: AppColors_1.AppColors.borderGlassLight,
|
|
195
|
-
flexWrap: 'wrap',
|
|
196
387
|
gap: 8,
|
|
197
388
|
},
|
|
198
389
|
chipGroup: {
|
|
199
390
|
flexDirection: 'row',
|
|
200
391
|
alignItems: 'center',
|
|
201
392
|
gap: 6,
|
|
393
|
+
flexShrink: 1,
|
|
202
394
|
},
|
|
203
395
|
chip: {
|
|
204
|
-
|
|
396
|
+
flexDirection: 'row',
|
|
397
|
+
alignItems: 'center',
|
|
398
|
+
gap: 4.5,
|
|
399
|
+
paddingHorizontal: 8,
|
|
205
400
|
paddingVertical: 4.5,
|
|
206
401
|
borderRadius: 6,
|
|
207
402
|
backgroundColor: AppColors_1.AppColors.whiteAlpha06,
|
|
@@ -221,6 +416,71 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
221
416
|
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
222
417
|
color: AppColors_1.AppColors.sky400,
|
|
223
418
|
},
|
|
419
|
+
subBar: {
|
|
420
|
+
flexDirection: 'row',
|
|
421
|
+
alignItems: 'center',
|
|
422
|
+
justifyContent: 'space-between',
|
|
423
|
+
paddingHorizontal: 12,
|
|
424
|
+
paddingVertical: 7,
|
|
425
|
+
backgroundColor: `${AppColors_1.AppColors.slate900}99`,
|
|
426
|
+
borderBottomWidth: 1,
|
|
427
|
+
borderBottomColor: AppColors_1.AppColors.borderGlassLight,
|
|
428
|
+
gap: 8,
|
|
429
|
+
},
|
|
430
|
+
resultCountWrapper: {
|
|
431
|
+
flexDirection: 'row',
|
|
432
|
+
alignItems: 'center',
|
|
433
|
+
flexShrink: 1,
|
|
434
|
+
},
|
|
435
|
+
resultCountText: {
|
|
436
|
+
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
437
|
+
fontSize: 11,
|
|
438
|
+
color: AppColors_1.AppColors.slate400,
|
|
439
|
+
},
|
|
440
|
+
resultCountTextSelected: {
|
|
441
|
+
fontFamily: AppFonts_1.AppFonts.interSemiBold,
|
|
442
|
+
color: AppColors_1.AppColors.sky400,
|
|
443
|
+
},
|
|
444
|
+
actionsGroup: {
|
|
445
|
+
flexDirection: 'row',
|
|
446
|
+
alignItems: 'center',
|
|
447
|
+
gap: 6,
|
|
448
|
+
},
|
|
449
|
+
viewToggleContainer: {
|
|
450
|
+
flexDirection: 'row',
|
|
451
|
+
alignItems: 'center',
|
|
452
|
+
backgroundColor: AppColors_1.AppColors.whiteAlpha06,
|
|
453
|
+
borderRadius: 6,
|
|
454
|
+
padding: 2,
|
|
455
|
+
borderWidth: 1,
|
|
456
|
+
borderColor: AppColors_1.AppColors.whiteAlpha10,
|
|
457
|
+
},
|
|
458
|
+
viewToggleBtn: {
|
|
459
|
+
paddingHorizontal: 7,
|
|
460
|
+
paddingVertical: 4,
|
|
461
|
+
borderRadius: 4,
|
|
462
|
+
alignItems: 'center',
|
|
463
|
+
justifyContent: 'center',
|
|
464
|
+
},
|
|
465
|
+
viewToggleBtnActive: {
|
|
466
|
+
backgroundColor: `${AppColors_1.AppColors.violet600}80`,
|
|
467
|
+
},
|
|
468
|
+
deleteBtn: {
|
|
469
|
+
flexDirection: 'row',
|
|
470
|
+
alignItems: 'center',
|
|
471
|
+
gap: 4,
|
|
472
|
+
paddingHorizontal: 8,
|
|
473
|
+
paddingVertical: 4,
|
|
474
|
+
borderRadius: 6,
|
|
475
|
+
backgroundColor: `${AppColors_1.AppColors.red500}26`,
|
|
476
|
+
borderWidth: 1,
|
|
477
|
+
borderColor: `${AppColors_1.AppColors.red500}80`,
|
|
478
|
+
},
|
|
479
|
+
deleteBtnText: {
|
|
480
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
481
|
+
fontSize: 10.5,
|
|
482
|
+
color: AppColors_1.AppColors.red500,
|
|
483
|
+
},
|
|
224
484
|
clearBtn: {
|
|
225
485
|
flexDirection: 'row',
|
|
226
486
|
alignItems: 'center',
|
|
@@ -239,7 +499,7 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
239
499
|
},
|
|
240
500
|
listContent: {
|
|
241
501
|
padding: 12,
|
|
242
|
-
gap:
|
|
502
|
+
gap: 10,
|
|
243
503
|
},
|
|
244
504
|
columnWrapper: {
|
|
245
505
|
gap: 12,
|
|
@@ -252,6 +512,10 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
252
512
|
borderColor: AppColors_1.AppColors.borderGlassLight,
|
|
253
513
|
overflow: 'hidden',
|
|
254
514
|
},
|
|
515
|
+
cardSelected: {
|
|
516
|
+
borderColor: AppColors_1.AppColors.violet600,
|
|
517
|
+
borderWidth: 1.5,
|
|
518
|
+
},
|
|
255
519
|
thumbnailContainer: {
|
|
256
520
|
width: '100%',
|
|
257
521
|
height: 110,
|
|
@@ -262,6 +526,50 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
262
526
|
width: '100%',
|
|
263
527
|
height: '100%',
|
|
264
528
|
},
|
|
529
|
+
thumbnailFallback: {
|
|
530
|
+
width: '100%',
|
|
531
|
+
height: '100%',
|
|
532
|
+
alignItems: 'center',
|
|
533
|
+
justifyContent: 'center',
|
|
534
|
+
backgroundColor: AppColors_1.AppColors.slate900,
|
|
535
|
+
},
|
|
536
|
+
checkbox: {
|
|
537
|
+
position: 'absolute',
|
|
538
|
+
top: 6,
|
|
539
|
+
left: 6,
|
|
540
|
+
width: 22,
|
|
541
|
+
height: 22,
|
|
542
|
+
borderRadius: 5,
|
|
543
|
+
borderWidth: 1.5,
|
|
544
|
+
borderColor: 'rgba(255, 255, 255, 0.65)',
|
|
545
|
+
backgroundColor: 'rgba(15, 23, 42, 0.65)',
|
|
546
|
+
alignItems: 'center',
|
|
547
|
+
justifyContent: 'center',
|
|
548
|
+
zIndex: 10,
|
|
549
|
+
},
|
|
550
|
+
checkboxSelected: {
|
|
551
|
+
backgroundColor: AppColors_1.AppColors.violet600,
|
|
552
|
+
borderColor: AppColors_1.AppColors.violet600,
|
|
553
|
+
},
|
|
554
|
+
miniPlayCircle: {
|
|
555
|
+
position: 'absolute',
|
|
556
|
+
top: '50%',
|
|
557
|
+
left: '50%',
|
|
558
|
+
width: 32,
|
|
559
|
+
height: 32,
|
|
560
|
+
marginTop: -16,
|
|
561
|
+
marginLeft: -16,
|
|
562
|
+
borderRadius: 16,
|
|
563
|
+
backgroundColor: `${AppColors_1.AppColors.sky400}D9`,
|
|
564
|
+
alignItems: 'center',
|
|
565
|
+
justifyContent: 'center',
|
|
566
|
+
paddingLeft: 2,
|
|
567
|
+
shadowColor: '#000',
|
|
568
|
+
shadowOffset: { width: 0, height: 2 },
|
|
569
|
+
shadowOpacity: 0.4,
|
|
570
|
+
shadowRadius: 4,
|
|
571
|
+
elevation: 4,
|
|
572
|
+
},
|
|
265
573
|
typeBadge: {
|
|
266
574
|
position: 'absolute',
|
|
267
575
|
top: 6,
|
|
@@ -304,4 +612,101 @@ const galleryStyles = react_native_1.StyleSheet.create({
|
|
|
304
612
|
fontSize: 10,
|
|
305
613
|
color: AppColors_1.AppColors.whiteAlpha30,
|
|
306
614
|
},
|
|
615
|
+
listRow: {
|
|
616
|
+
flexDirection: 'row',
|
|
617
|
+
alignItems: 'center',
|
|
618
|
+
backgroundColor: AppColors_1.AppColors.slate800,
|
|
619
|
+
borderRadius: 8,
|
|
620
|
+
borderWidth: 1,
|
|
621
|
+
borderColor: AppColors_1.AppColors.borderGlassLight,
|
|
622
|
+
padding: 8,
|
|
623
|
+
gap: 10,
|
|
624
|
+
},
|
|
625
|
+
listRowSelected: {
|
|
626
|
+
borderColor: AppColors_1.AppColors.violet600,
|
|
627
|
+
borderWidth: 1.5,
|
|
628
|
+
backgroundColor: `${AppColors_1.AppColors.violet600}14`,
|
|
629
|
+
},
|
|
630
|
+
listCheckbox: {
|
|
631
|
+
width: 20,
|
|
632
|
+
height: 20,
|
|
633
|
+
borderRadius: 4,
|
|
634
|
+
borderWidth: 1.5,
|
|
635
|
+
borderColor: 'rgba(255, 255, 255, 0.65)',
|
|
636
|
+
backgroundColor: 'rgba(15, 23, 42, 0.65)',
|
|
637
|
+
alignItems: 'center',
|
|
638
|
+
justifyContent: 'center',
|
|
639
|
+
},
|
|
640
|
+
listThumbContainer: {
|
|
641
|
+
width: 46,
|
|
642
|
+
height: 46,
|
|
643
|
+
borderRadius: 6,
|
|
644
|
+
backgroundColor: AppColors_1.AppColors.slate850,
|
|
645
|
+
overflow: 'hidden',
|
|
646
|
+
position: 'relative',
|
|
647
|
+
},
|
|
648
|
+
listThumb: {
|
|
649
|
+
width: '100%',
|
|
650
|
+
height: '100%',
|
|
651
|
+
},
|
|
652
|
+
listThumbFallback: {
|
|
653
|
+
width: '100%',
|
|
654
|
+
height: '100%',
|
|
655
|
+
alignItems: 'center',
|
|
656
|
+
justifyContent: 'center',
|
|
657
|
+
backgroundColor: AppColors_1.AppColors.slate900,
|
|
658
|
+
},
|
|
659
|
+
listMiniPlay: {
|
|
660
|
+
position: 'absolute',
|
|
661
|
+
top: '50%',
|
|
662
|
+
left: '50%',
|
|
663
|
+
width: 20,
|
|
664
|
+
height: 20,
|
|
665
|
+
marginTop: -10,
|
|
666
|
+
marginLeft: -10,
|
|
667
|
+
borderRadius: 10,
|
|
668
|
+
backgroundColor: `${AppColors_1.AppColors.sky400}D9`,
|
|
669
|
+
alignItems: 'center',
|
|
670
|
+
justifyContent: 'center',
|
|
671
|
+
paddingLeft: 1,
|
|
672
|
+
},
|
|
673
|
+
listInfo: {
|
|
674
|
+
flex: 1,
|
|
675
|
+
gap: 4,
|
|
676
|
+
minWidth: 0,
|
|
677
|
+
},
|
|
678
|
+
listTitle: {
|
|
679
|
+
fontFamily: AppFonts_1.AppFonts.interMedium,
|
|
680
|
+
fontSize: 12,
|
|
681
|
+
color: AppColors_1.AppColors.white,
|
|
682
|
+
},
|
|
683
|
+
listMetaRow: {
|
|
684
|
+
flexDirection: 'row',
|
|
685
|
+
alignItems: 'center',
|
|
686
|
+
gap: 6,
|
|
687
|
+
flexWrap: 'wrap',
|
|
688
|
+
},
|
|
689
|
+
listBadge: {
|
|
690
|
+
flexDirection: 'row',
|
|
691
|
+
alignItems: 'center',
|
|
692
|
+
gap: 3,
|
|
693
|
+
backgroundColor: AppColors_1.AppColors.badgeGlassDark,
|
|
694
|
+
paddingHorizontal: 4,
|
|
695
|
+
paddingVertical: 1.5,
|
|
696
|
+
borderRadius: 4,
|
|
697
|
+
borderWidth: 1,
|
|
698
|
+
borderColor: AppColors_1.AppColors.borderGlassMedium,
|
|
699
|
+
},
|
|
700
|
+
listBadgeText: {
|
|
701
|
+
fontFamily: AppFonts_1.AppFonts.interBold,
|
|
702
|
+
fontSize: 8.5,
|
|
703
|
+
color: AppColors_1.AppColors.slate200,
|
|
704
|
+
},
|
|
705
|
+
listDeleteBtn: {
|
|
706
|
+
padding: 6,
|
|
707
|
+
borderRadius: 6,
|
|
708
|
+
backgroundColor: `${AppColors_1.AppColors.red500}14`,
|
|
709
|
+
borderWidth: 1,
|
|
710
|
+
borderColor: `${AppColors_1.AppColors.red500}33`,
|
|
711
|
+
},
|
|
307
712
|
});
|