@oxyhq/services 22.6.2 → 22.6.4
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/lib/commonjs/ui/components/fileManagement/FileViewer.js +99 -77
- package/lib/commonjs/ui/components/fileManagement/FileViewer.js.map +1 -1
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js +33 -40
- package/lib/commonjs/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js +92 -88
- package/lib/commonjs/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
- package/lib/commonjs/ui/screens/FileManagementScreen.js +175 -360
- package/lib/commonjs/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js +9 -2
- package/lib/commonjs/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/module/ui/components/fileManagement/FileViewer.js +100 -78
- package/lib/module/ui/components/fileManagement/FileViewer.js.map +1 -1
- package/lib/module/ui/components/fileManagement/UploadPreview.js +34 -41
- package/lib/module/ui/components/fileManagement/UploadPreview.js.map +1 -1
- package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js +94 -90
- package/lib/module/ui/components/photogrid/JustifiedPhotoGrid.js.map +1 -1
- package/lib/module/ui/screens/FileManagementScreen.js +177 -363
- package/lib/module/ui/screens/FileManagementScreen.js.map +1 -1
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js +9 -2
- package/lib/module/ui/screens/fileManagement/PhotoPickerSection.js.map +1 -1
- package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts +0 -1
- package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/fileManagement/UploadPreview.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts +0 -1
- package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/FileManagementScreen.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/fileManagement/PhotoPickerSection.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ui/components/fileManagement/FileViewer.tsx +82 -68
- package/src/ui/components/fileManagement/UploadPreview.tsx +34 -29
- package/src/ui/components/photogrid/JustifiedPhotoGrid.tsx +14 -13
- package/src/ui/screens/FileManagementScreen.tsx +135 -354
- package/src/ui/screens/fileManagement/PhotoPickerSection.tsx +6 -2
- package/lib/commonjs/ui/components/fileManagement/styles.js +0 -832
- package/lib/commonjs/ui/components/fileManagement/styles.js.map +0 -1
- package/lib/module/ui/components/fileManagement/styles.js +0 -828
- package/lib/module/ui/components/fileManagement/styles.js.map +0 -1
- package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts +0 -825
- package/lib/typescript/commonjs/ui/components/fileManagement/styles.d.ts.map +0 -1
- package/lib/typescript/module/ui/components/fileManagement/styles.d.ts +0 -825
- package/lib/typescript/module/ui/components/fileManagement/styles.d.ts.map +0 -1
- package/src/ui/components/fileManagement/styles.ts +0 -823
|
@@ -21,7 +21,6 @@ var _useResolvedFileUrls = require("../hooks/useResolvedFileUrls.js");
|
|
|
21
21
|
var _FileViewer = require("../components/fileManagement/FileViewer.js");
|
|
22
22
|
var _FileDetailsModal = require("../components/fileManagement/FileDetailsModal.js");
|
|
23
23
|
var _UploadPreview = require("../components/fileManagement/UploadPreview.js");
|
|
24
|
-
var _styles = require("../components/fileManagement/styles.js");
|
|
25
24
|
var _shared = require("./fileManagement/shared.js");
|
|
26
25
|
var _useFileUploadState = require("./fileManagement/hooks/useFileUploadState.js");
|
|
27
26
|
var _PhotoPickerSection = _interopRequireDefault(require("./fileManagement/PhotoPickerSection.js"));
|
|
@@ -30,6 +29,31 @@ var _UploadBar = _interopRequireDefault(require("./fileManagement/UploadBar.js")
|
|
|
30
29
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
31
30
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
32
31
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
32
|
+
// Genuinely-inline-only styles: `viewModeButton` is spread into an Animated.View
|
|
33
|
+
// style array (interpolated backgroundColor), and the photo tiles are
|
|
34
|
+
// `expo-image` (no className remap). Everything else uses NativeWind classNames.
|
|
35
|
+
const screenStyles = _reactNative.StyleSheet.create({
|
|
36
|
+
viewModeButton: {
|
|
37
|
+
paddingHorizontal: 10,
|
|
38
|
+
paddingVertical: 6,
|
|
39
|
+
borderRadius: 999,
|
|
40
|
+
minWidth: 36,
|
|
41
|
+
alignItems: 'center',
|
|
42
|
+
justifyContent: 'center',
|
|
43
|
+
marginHorizontal: 1
|
|
44
|
+
},
|
|
45
|
+
photoImage: {
|
|
46
|
+
width: '100%',
|
|
47
|
+
height: '100%',
|
|
48
|
+
borderRadius: 8
|
|
49
|
+
},
|
|
50
|
+
justifiedPhotoImage: {
|
|
51
|
+
width: '100%',
|
|
52
|
+
height: '100%',
|
|
53
|
+
borderRadius: 6
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
33
57
|
// Animated button component for smooth transitions
|
|
34
58
|
const AnimatedButton = ({
|
|
35
59
|
isSelected,
|
|
@@ -81,8 +105,7 @@ const FileManagementScreen = ({
|
|
|
81
105
|
goBack,
|
|
82
106
|
navigate,
|
|
83
107
|
userId,
|
|
84
|
-
containerWidth
|
|
85
|
-
// Fallback for when not provided by the router
|
|
108
|
+
containerWidth,
|
|
86
109
|
selectMode = false,
|
|
87
110
|
multiSelect = false,
|
|
88
111
|
onSelect,
|
|
@@ -113,8 +136,12 @@ const FileManagementScreen = ({
|
|
|
113
136
|
const visibilityChangeDialog = (0, _bloom.useDialogControl)();
|
|
114
137
|
const [pendingDeleteFile, setPendingDeleteFile] = (0, _react.useState)(null);
|
|
115
138
|
const files = (0, _fileStore.useFiles)();
|
|
116
|
-
|
|
117
|
-
|
|
139
|
+
const {
|
|
140
|
+
width: windowWidth
|
|
141
|
+
} = (0, _reactNative.useWindowDimensions)();
|
|
142
|
+
// Prefer an explicit sheet width from the router; fall back to the window
|
|
143
|
+
// so photo grids never size against a hardcoded 400px default.
|
|
144
|
+
const safeContainerWidth = typeof containerWidth === 'number' && containerWidth > 0 ? containerWidth : windowWidth;
|
|
118
145
|
const uploading = (0, _fileStore.useUploading)();
|
|
119
146
|
const uploadProgress = (0, _fileStore.useUploadAggregateProgress)();
|
|
120
147
|
const deleting = (0, _fileStore.useDeleting)();
|
|
@@ -743,60 +770,11 @@ const FileManagementScreen = ({
|
|
|
743
770
|
setSelectedFile(file);
|
|
744
771
|
fileDetailsControl.open();
|
|
745
772
|
};
|
|
746
|
-
const renderSimplePhotoItem = (0, _react.useCallback)((photo, index) => {
|
|
747
|
-
const downloadUrl = thumbSourceFor(photo);
|
|
748
|
-
|
|
749
|
-
// Calculate photo item width based on actual container size from bottom sheet
|
|
750
|
-
let itemsPerRow = 3; // Default for mobile
|
|
751
|
-
if (safeContainerWidth > 768) itemsPerRow = 4; // Desktop/tablet
|
|
752
|
-
else if (safeContainerWidth > 480) itemsPerRow = 3; // Large mobile
|
|
753
|
-
|
|
754
|
-
// Account for the photoScrollContainer padding (16px on each side = 32px total)
|
|
755
|
-
const scrollContainerPadding = 32; // Total horizontal padding from photoScrollContainer
|
|
756
|
-
const gaps = (itemsPerRow - 1) * 4; // Gap between items (4px)
|
|
757
|
-
const availableWidth = safeContainerWidth - scrollContainerPadding;
|
|
758
|
-
const itemWidth = (availableWidth - gaps) / itemsPerRow;
|
|
759
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
760
|
-
style: [_styles.fileManagementStyles.simplePhotoItem, {
|
|
761
|
-
width: itemWidth,
|
|
762
|
-
height: itemWidth,
|
|
763
|
-
marginRight: (index + 1) % itemsPerRow === 0 ? 0 : 4,
|
|
764
|
-
...(selectMode && selectedIds.has(photo.id) ? {
|
|
765
|
-
borderWidth: 2,
|
|
766
|
-
borderColor: colors.primary
|
|
767
|
-
} : {})
|
|
768
|
-
}],
|
|
769
|
-
onPress: () => handleFileOpen(photo),
|
|
770
|
-
activeOpacity: 0.8,
|
|
771
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
772
|
-
style: _styles.fileManagementStyles.simplePhotoContainer,
|
|
773
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
|
|
774
|
-
source: {
|
|
775
|
-
uri: downloadUrl
|
|
776
|
-
},
|
|
777
|
-
style: _styles.fileManagementStyles.simplePhotoImage,
|
|
778
|
-
contentFit: "cover",
|
|
779
|
-
transition: 120,
|
|
780
|
-
cachePolicy: "memory-disk",
|
|
781
|
-
onError: () => {
|
|
782
|
-
// Photo failed to load, will show placeholder
|
|
783
|
-
},
|
|
784
|
-
accessibilityLabel: photo.filename
|
|
785
|
-
}), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
786
|
-
style: _styles.fileManagementStyles.selectionBadge,
|
|
787
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
788
|
-
name: selectedIds.has(photo.id) ? 'checkmark-circle' : 'ellipse-outline',
|
|
789
|
-
size: 20,
|
|
790
|
-
color: selectedIds.has(photo.id) ? colors.primary : colors.text
|
|
791
|
-
})
|
|
792
|
-
})]
|
|
793
|
-
})
|
|
794
|
-
}, photo.id);
|
|
795
|
-
}, [thumbSourceFor, safeContainerWidth, selectMode, selectedIds, colors.primary, colors.text]);
|
|
796
773
|
const renderJustifiedPhotoItem = (0, _react.useCallback)((photo, width, height, isLast) => {
|
|
797
774
|
const downloadUrl = thumbSourceFor(photo);
|
|
798
775
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
799
|
-
|
|
776
|
+
className: "rounded-[6px] overflow-hidden relative",
|
|
777
|
+
style: {
|
|
800
778
|
width,
|
|
801
779
|
height,
|
|
802
780
|
...(selectMode && selectedIds.has(photo.id) ? {
|
|
@@ -806,16 +784,16 @@ const FileManagementScreen = ({
|
|
|
806
784
|
...(selectMode && multiSelect && selectedIds.size > 0 && !selectedIds.has(photo.id) ? {
|
|
807
785
|
opacity: 0.4
|
|
808
786
|
} : {})
|
|
809
|
-
}
|
|
787
|
+
},
|
|
810
788
|
onPress: () => handleFileOpen(photo),
|
|
811
789
|
activeOpacity: 0.8,
|
|
812
790
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
813
|
-
|
|
791
|
+
className: "w-full h-full relative rounded-[6px] overflow-hidden",
|
|
814
792
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
|
|
815
793
|
source: {
|
|
816
794
|
uri: downloadUrl
|
|
817
795
|
},
|
|
818
|
-
style:
|
|
796
|
+
style: screenStyles.justifiedPhotoImage,
|
|
819
797
|
contentFit: "cover",
|
|
820
798
|
transition: 120,
|
|
821
799
|
cachePolicy: "memory-disk",
|
|
@@ -824,7 +802,10 @@ const FileManagementScreen = ({
|
|
|
824
802
|
},
|
|
825
803
|
accessibilityLabel: photo.filename
|
|
826
804
|
}), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
827
|
-
|
|
805
|
+
className: "absolute top-[4px] right-[4px] rounded-[12px] p-[2px]",
|
|
806
|
+
style: {
|
|
807
|
+
backgroundColor: 'rgba(0,0,0,0.4)'
|
|
808
|
+
},
|
|
828
809
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
829
810
|
name: selectedIds.has(photo.id) ? 'checkmark-circle' : 'ellipse-outline',
|
|
830
811
|
size: 20,
|
|
@@ -845,160 +826,6 @@ const FileManagementScreen = ({
|
|
|
845
826
|
}
|
|
846
827
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
847
828
|
}, [targetUserId]);
|
|
848
|
-
const renderFileItem = file => {
|
|
849
|
-
const isImage = file.contentType.startsWith('image/');
|
|
850
|
-
const isPDF = file.contentType.includes('pdf');
|
|
851
|
-
const isVideo = file.contentType.startsWith('video/');
|
|
852
|
-
const isAudio = file.contentType.startsWith('audio/');
|
|
853
|
-
const hasPreview = isImage || isPDF || isVideo;
|
|
854
|
-
const borderColor = colors.border;
|
|
855
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
856
|
-
style: [_styles.fileManagementStyles.fileItem, {
|
|
857
|
-
backgroundColor: colors.backgroundSecondary,
|
|
858
|
-
borderColor
|
|
859
|
-
}, selectMode && selectedIds.has(file.id) && {
|
|
860
|
-
borderColor: colors.primary,
|
|
861
|
-
borderWidth: 2
|
|
862
|
-
}],
|
|
863
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
|
|
864
|
-
style: _styles.fileManagementStyles.fileContent,
|
|
865
|
-
onPress: () => handleFileOpen(file),
|
|
866
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
867
|
-
style: _styles.fileManagementStyles.filePreviewContainer,
|
|
868
|
-
children: hasPreview ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
869
|
-
style: _styles.fileManagementStyles.filePreview,
|
|
870
|
-
children: [isImage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
|
|
871
|
-
source: {
|
|
872
|
-
uri: thumbSourceFor(file)
|
|
873
|
-
},
|
|
874
|
-
style: _styles.fileManagementStyles.previewImage,
|
|
875
|
-
contentFit: "cover",
|
|
876
|
-
transition: 120,
|
|
877
|
-
cachePolicy: "memory-disk",
|
|
878
|
-
onError: () => {
|
|
879
|
-
// Image preview failed to load
|
|
880
|
-
},
|
|
881
|
-
accessibilityLabel: file.filename
|
|
882
|
-
}), isPDF && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
883
|
-
style: _styles.fileManagementStyles.pdfPreview,
|
|
884
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
885
|
-
name: "document",
|
|
886
|
-
size: 32,
|
|
887
|
-
color: colors.primary
|
|
888
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
889
|
-
style: [_styles.fileManagementStyles.pdfLabel, {
|
|
890
|
-
color: colors.primary
|
|
891
|
-
}],
|
|
892
|
-
children: "PDF"
|
|
893
|
-
})]
|
|
894
|
-
}), isVideo && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
895
|
-
style: _styles.fileManagementStyles.videoPreviewWrapper,
|
|
896
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
|
|
897
|
-
source: {
|
|
898
|
-
uri: thumbSourceFor(file)
|
|
899
|
-
},
|
|
900
|
-
style: _styles.fileManagementStyles.videoPosterImage,
|
|
901
|
-
contentFit: "cover",
|
|
902
|
-
transition: 120,
|
|
903
|
-
cachePolicy: "memory-disk",
|
|
904
|
-
onError: _ => {
|
|
905
|
-
// If thumbnail not available, we still show icon overlay
|
|
906
|
-
},
|
|
907
|
-
accessibilityLabel: `${file.filename} video thumbnail`
|
|
908
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
909
|
-
style: _styles.fileManagementStyles.videoOverlay,
|
|
910
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
911
|
-
name: "play",
|
|
912
|
-
size: 24,
|
|
913
|
-
color: "#FFFFFF"
|
|
914
|
-
})
|
|
915
|
-
})]
|
|
916
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
917
|
-
style: [_styles.fileManagementStyles.fallbackIcon, {
|
|
918
|
-
display: isImage ? 'none' : 'flex'
|
|
919
|
-
}],
|
|
920
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
921
|
-
name: (0, _fileManagement.getFileIcon)(file.contentType),
|
|
922
|
-
size: 32,
|
|
923
|
-
color: colors.primary
|
|
924
|
-
})
|
|
925
|
-
}), selectMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
926
|
-
style: _styles.fileManagementStyles.selectionBadge,
|
|
927
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
928
|
-
name: selectedIds.has(file.id) ? 'checkmark-circle' : 'ellipse-outline',
|
|
929
|
-
size: 22,
|
|
930
|
-
color: selectedIds.has(file.id) ? colors.primary : colors.text
|
|
931
|
-
})
|
|
932
|
-
})]
|
|
933
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
934
|
-
style: _styles.fileManagementStyles.fileIconContainer,
|
|
935
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
936
|
-
name: (0, _fileManagement.getFileIcon)(file.contentType),
|
|
937
|
-
size: 32,
|
|
938
|
-
color: colors.primary
|
|
939
|
-
})
|
|
940
|
-
})
|
|
941
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
942
|
-
style: _styles.fileManagementStyles.fileInfo,
|
|
943
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
944
|
-
style: [_styles.fileManagementStyles.fileName, {
|
|
945
|
-
color: colors.text
|
|
946
|
-
}],
|
|
947
|
-
numberOfLines: 1,
|
|
948
|
-
children: file.filename
|
|
949
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
950
|
-
style: [_styles.fileManagementStyles.fileDetails, {
|
|
951
|
-
color: colors.textSecondary
|
|
952
|
-
}],
|
|
953
|
-
children: [(0, _fileManagement.formatFileSize)(file.length), " \u2022 ", new Date(file.uploadDate).toLocaleDateString()]
|
|
954
|
-
}), file.metadata?.description && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
955
|
-
style: [_styles.fileManagementStyles.fileDescription, {
|
|
956
|
-
color: colors.textTertiary
|
|
957
|
-
}],
|
|
958
|
-
numberOfLines: 2,
|
|
959
|
-
children: file.metadata.description
|
|
960
|
-
})]
|
|
961
|
-
})]
|
|
962
|
-
}), !selectMode && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
963
|
-
style: _styles.fileManagementStyles.fileActions,
|
|
964
|
-
children: [hasPreview && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
965
|
-
style: [_styles.fileManagementStyles.actionButton, {
|
|
966
|
-
backgroundColor: colors.backgroundSecondary
|
|
967
|
-
}],
|
|
968
|
-
onPress: () => handleFileOpen(file),
|
|
969
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
970
|
-
name: "eye",
|
|
971
|
-
size: 20,
|
|
972
|
-
color: colors.primary
|
|
973
|
-
})
|
|
974
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
975
|
-
style: [_styles.fileManagementStyles.actionButton, {
|
|
976
|
-
backgroundColor: colors.backgroundSecondary
|
|
977
|
-
}],
|
|
978
|
-
onPress: () => handleFileDownload(file.id, file.filename),
|
|
979
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
980
|
-
name: "download",
|
|
981
|
-
size: 20,
|
|
982
|
-
color: colors.primary
|
|
983
|
-
})
|
|
984
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
985
|
-
style: [_styles.fileManagementStyles.actionButton, {
|
|
986
|
-
backgroundColor: colors.negativeSubtle
|
|
987
|
-
}],
|
|
988
|
-
onPress: () => confirmFileDelete(file.id, file.filename),
|
|
989
|
-
disabled: deleting === file.id,
|
|
990
|
-
children: deleting === file.id ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
991
|
-
size: "small",
|
|
992
|
-
color: colors.error
|
|
993
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
994
|
-
name: "trash",
|
|
995
|
-
size: 20,
|
|
996
|
-
color: colors.error
|
|
997
|
-
})
|
|
998
|
-
})]
|
|
999
|
-
})]
|
|
1000
|
-
}, file.id);
|
|
1001
|
-
};
|
|
1002
829
|
|
|
1003
830
|
// SettingsListItem-based file items (for 'all' view)
|
|
1004
831
|
const groupedFileItems = (0, _react.useMemo)(() => {
|
|
@@ -1120,11 +947,12 @@ const FileManagementScreen = ({
|
|
|
1120
947
|
},
|
|
1121
948
|
// Hide action buttons when selecting (in selectMode or bulk operations mode)
|
|
1122
949
|
rightElement: !selectMode && selectedIds.size === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1123
|
-
|
|
950
|
+
className: "flex-row items-center gap-[6px] ml-[12px]",
|
|
1124
951
|
children: [(isImage || isVideo || file.contentType.includes('pdf')) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1125
|
-
|
|
952
|
+
className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
|
|
953
|
+
style: {
|
|
1126
954
|
backgroundColor: colors.backgroundSecondary
|
|
1127
|
-
}
|
|
955
|
+
},
|
|
1128
956
|
onPress: () => handleFileOpen(file),
|
|
1129
957
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1130
958
|
name: "eye",
|
|
@@ -1132,9 +960,10 @@ const FileManagementScreen = ({
|
|
|
1132
960
|
color: colors.primary
|
|
1133
961
|
})
|
|
1134
962
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1135
|
-
|
|
963
|
+
className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
|
|
964
|
+
style: {
|
|
1136
965
|
backgroundColor: colors.backgroundSecondary
|
|
1137
|
-
}
|
|
966
|
+
},
|
|
1138
967
|
onPress: () => handleFileDownload(file.id, file.filename),
|
|
1139
968
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1140
969
|
name: "download",
|
|
@@ -1142,9 +971,10 @@ const FileManagementScreen = ({
|
|
|
1142
971
|
color: colors.primary
|
|
1143
972
|
})
|
|
1144
973
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1145
|
-
|
|
974
|
+
className: "w-[34px] h-[34px] rounded-[8px] items-center justify-center",
|
|
975
|
+
style: {
|
|
1146
976
|
backgroundColor: colors.negativeSubtle
|
|
1147
|
-
}
|
|
977
|
+
},
|
|
1148
978
|
onPress: () => confirmFileDelete(file.id, file.filename),
|
|
1149
979
|
disabled: deleting === file.id,
|
|
1150
980
|
children: deleting === file.id ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
@@ -1204,19 +1034,12 @@ const FileManagementScreen = ({
|
|
|
1204
1034
|
const photos = filteredFiles.filter(file => file.contentType.startsWith('image/'));
|
|
1205
1035
|
const photoIndex = photos.findIndex(p => p.id === lastSelectedFileId);
|
|
1206
1036
|
if (photoIndex >= 0) {
|
|
1207
|
-
//
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
const scrollContainerPadding = 32;
|
|
1212
|
-
const gaps = (itemsPerRow - 1) * 4;
|
|
1213
|
-
const availableWidth = safeContainerWidth - scrollContainerPadding;
|
|
1214
|
-
const itemWidth = (availableWidth - gaps) / itemsPerRow;
|
|
1215
|
-
|
|
1216
|
-
// Calculate row and approximate scroll position
|
|
1037
|
+
// Rough scroll estimate for the justified grid (3 photos/row; variable row heights).
|
|
1038
|
+
const itemsPerRow = 3;
|
|
1039
|
+
const estimatedRowHeight = 150;
|
|
1040
|
+
const rowGap = 4;
|
|
1217
1041
|
const row = Math.floor(photoIndex / itemsPerRow);
|
|
1218
|
-
const
|
|
1219
|
-
const finalScrollPosition = headerHeight + row * (itemWidth + 4) - 150;
|
|
1042
|
+
const finalScrollPosition = row * (estimatedRowHeight + rowGap) - 100;
|
|
1220
1043
|
|
|
1221
1044
|
// Use requestAnimationFrame to ensure DOM is updated before scrolling
|
|
1222
1045
|
requestAnimationFrame(() => {
|
|
@@ -1242,67 +1065,32 @@ const FileManagementScreen = ({
|
|
|
1242
1065
|
return () => clearTimeout(timeoutId);
|
|
1243
1066
|
}
|
|
1244
1067
|
}, [lastSelectedFileId]);
|
|
1245
|
-
const renderPhotoItem = (photo, index) => {
|
|
1246
|
-
const downloadUrl = thumbSourceFor(photo);
|
|
1247
|
-
|
|
1248
|
-
// Calculate photo item width based on actual container size from bottom sheet
|
|
1249
|
-
let itemsPerRow = 3; // Default for mobile
|
|
1250
|
-
if (safeContainerWidth > 768) itemsPerRow = 6; // Tablet/Desktop
|
|
1251
|
-
else if (safeContainerWidth > 480) itemsPerRow = 4; // Large mobile
|
|
1252
|
-
|
|
1253
|
-
// Account for the photoScrollContainer padding (16px on each side = 32px total)
|
|
1254
|
-
const scrollContainerPadding = 32; // Total horizontal padding from photoScrollContainer
|
|
1255
|
-
const gaps = (itemsPerRow - 1) * 4; // Gap between items
|
|
1256
|
-
const availableWidth = safeContainerWidth - scrollContainerPadding;
|
|
1257
|
-
const itemWidth = (availableWidth - gaps) / itemsPerRow;
|
|
1258
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1259
|
-
style: [_styles.fileManagementStyles.photoItem, {
|
|
1260
|
-
width: itemWidth,
|
|
1261
|
-
height: itemWidth
|
|
1262
|
-
}],
|
|
1263
|
-
onPress: () => handleFileOpen(photo),
|
|
1264
|
-
activeOpacity: 0.8,
|
|
1265
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
1266
|
-
style: _styles.fileManagementStyles.photoContainer,
|
|
1267
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_expoImage.Image, {
|
|
1268
|
-
source: {
|
|
1269
|
-
uri: downloadUrl
|
|
1270
|
-
},
|
|
1271
|
-
style: _styles.fileManagementStyles.photoImage,
|
|
1272
|
-
contentFit: "cover",
|
|
1273
|
-
transition: 120,
|
|
1274
|
-
cachePolicy: "memory-disk",
|
|
1275
|
-
onError: () => {
|
|
1276
|
-
// Image preview failed to load
|
|
1277
|
-
},
|
|
1278
|
-
accessibilityLabel: photo.filename
|
|
1279
|
-
})
|
|
1280
|
-
})
|
|
1281
|
-
}, photo.id);
|
|
1282
|
-
};
|
|
1283
1068
|
const renderPhotoGrid = (0, _react.useCallback)(() => {
|
|
1284
1069
|
const photos = filteredFiles.filter(file => file.contentType.startsWith('image/'));
|
|
1285
1070
|
if (photos.length === 0) {
|
|
1286
1071
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1287
|
-
|
|
1072
|
+
className: "items-center py-[40px] px-[24px]",
|
|
1288
1073
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1289
1074
|
name: "images-outline",
|
|
1290
1075
|
size: 64,
|
|
1291
1076
|
color: colors.textTertiary
|
|
1292
1077
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1293
|
-
|
|
1078
|
+
className: "text-[24px] font-bold mt-[16px] mb-[8px]",
|
|
1079
|
+
style: {
|
|
1294
1080
|
color: colors.text
|
|
1295
|
-
}
|
|
1081
|
+
},
|
|
1296
1082
|
children: t('fileManagement.emptyPhotos.title')
|
|
1297
1083
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
1298
|
-
|
|
1084
|
+
className: "text-[16px] text-center leading-[24px] mb-[32px]",
|
|
1085
|
+
style: {
|
|
1299
1086
|
color: colors.textSecondary
|
|
1300
|
-
}
|
|
1087
|
+
},
|
|
1301
1088
|
children: [" ", user?.id === targetUserId ? t('fileManagement.emptyPhotos.ownDescription') : t('fileManagement.emptyPhotos.otherDescription'), " "]
|
|
1302
1089
|
}), user?.id === targetUserId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1303
|
-
|
|
1090
|
+
className: "flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]",
|
|
1091
|
+
style: {
|
|
1304
1092
|
backgroundColor: colors.primary
|
|
1305
|
-
}
|
|
1093
|
+
},
|
|
1306
1094
|
onPress: handleFileUpload,
|
|
1307
1095
|
disabled: uploading || isPickingDocument,
|
|
1308
1096
|
children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
@@ -1317,7 +1105,7 @@ const FileManagementScreen = ({
|
|
|
1317
1105
|
size: 20,
|
|
1318
1106
|
color: "#FFFFFF"
|
|
1319
1107
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1320
|
-
|
|
1108
|
+
className: "text-white text-[16px] font-semibold",
|
|
1321
1109
|
children: t('fileManagement.uploadPhotos')
|
|
1322
1110
|
})]
|
|
1323
1111
|
})
|
|
@@ -1326,8 +1114,8 @@ const FileManagementScreen = ({
|
|
|
1326
1114
|
}
|
|
1327
1115
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
|
|
1328
1116
|
ref: photoScrollViewRef,
|
|
1329
|
-
|
|
1330
|
-
|
|
1117
|
+
className: "flex-1",
|
|
1118
|
+
contentContainerClassName: "p-[10px]",
|
|
1331
1119
|
refreshControl: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.RefreshControl, {
|
|
1332
1120
|
refreshing: refreshing,
|
|
1333
1121
|
onRefresh: () => loadFiles('refresh'),
|
|
@@ -1349,14 +1137,15 @@ const FileManagementScreen = ({
|
|
|
1349
1137
|
},
|
|
1350
1138
|
scrollEventThrottle: 250,
|
|
1351
1139
|
children: [loadingDimensions && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1352
|
-
|
|
1140
|
+
className: "flex-row items-center justify-center py-[16px] gap-[8px]",
|
|
1353
1141
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
1354
1142
|
size: "small",
|
|
1355
1143
|
color: colors.primary
|
|
1356
1144
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1357
|
-
|
|
1145
|
+
className: "text-[14px] italic",
|
|
1146
|
+
style: {
|
|
1358
1147
|
color: colors.textSecondary
|
|
1359
|
-
}
|
|
1148
|
+
},
|
|
1360
1149
|
children: t('fileManagement.loadingPhotoLayout')
|
|
1361
1150
|
})]
|
|
1362
1151
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_JustifiedPhotoGrid.default, {
|
|
@@ -1365,35 +1154,37 @@ const FileManagementScreen = ({
|
|
|
1365
1154
|
loadPhotoDimensions: loadPhotoDimensions,
|
|
1366
1155
|
createJustifiedRows: createJustifiedRows,
|
|
1367
1156
|
renderJustifiedPhotoItem: renderJustifiedPhotoItem,
|
|
1368
|
-
renderSimplePhotoItem: renderPhotoItem,
|
|
1369
1157
|
textColor: colors.text,
|
|
1370
|
-
containerWidth:
|
|
1158
|
+
containerWidth: typeof containerWidth === 'number' && containerWidth > 0 ? containerWidth : undefined
|
|
1371
1159
|
})]
|
|
1372
1160
|
});
|
|
1373
|
-
}, [filteredFiles, colors, user?.id, targetUserId, uploading, handleFileUpload, refreshing, loadFiles, loadingDimensions, photoDimensions, loadPhotoDimensions, createJustifiedRows, renderJustifiedPhotoItem,
|
|
1161
|
+
}, [filteredFiles, colors, user?.id, targetUserId, uploading, handleFileUpload, refreshing, loadFiles, loadingDimensions, photoDimensions, loadPhotoDimensions, createJustifiedRows, renderJustifiedPhotoItem, containerWidth]);
|
|
1374
1162
|
|
|
1375
1163
|
// Inline justified grid removed (moved to components/photogrid/JustifiedPhotoGrid.tsx)
|
|
1376
1164
|
|
|
1377
1165
|
const renderEmptyState = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1378
|
-
|
|
1166
|
+
className: "items-center py-[40px] px-[24px]",
|
|
1379
1167
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1380
1168
|
name: "folder-open-outline",
|
|
1381
1169
|
size: 64,
|
|
1382
1170
|
color: colors.textTertiary
|
|
1383
1171
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1384
|
-
|
|
1172
|
+
className: "text-[24px] font-bold mt-[16px] mb-[8px]",
|
|
1173
|
+
style: {
|
|
1385
1174
|
color: colors.text
|
|
1386
|
-
}
|
|
1175
|
+
},
|
|
1387
1176
|
children: t('fileManagement.emptyFiles.title')
|
|
1388
1177
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1389
|
-
|
|
1178
|
+
className: "text-[16px] text-center leading-[24px] mb-[32px]",
|
|
1179
|
+
style: {
|
|
1390
1180
|
color: colors.textSecondary
|
|
1391
|
-
}
|
|
1181
|
+
},
|
|
1392
1182
|
children: user?.id === targetUserId ? t('fileManagement.emptyFiles.ownDescription') : t('fileManagement.emptyFiles.otherDescription')
|
|
1393
1183
|
}), user?.id === targetUserId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1394
|
-
|
|
1184
|
+
className: "flex-row items-center px-[24px] py-[12px] rounded-[24px] gap-[8px]",
|
|
1185
|
+
style: {
|
|
1395
1186
|
backgroundColor: colors.primary
|
|
1396
|
-
}
|
|
1187
|
+
},
|
|
1397
1188
|
onPress: handleFileUpload,
|
|
1398
1189
|
disabled: uploading || isPickingDocument,
|
|
1399
1190
|
children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
@@ -1408,7 +1199,7 @@ const FileManagementScreen = ({
|
|
|
1408
1199
|
size: 20,
|
|
1409
1200
|
color: "#FFFFFF"
|
|
1410
1201
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1411
|
-
|
|
1202
|
+
className: "text-white text-[16px] font-semibold",
|
|
1412
1203
|
children: t('fileManagement.uploadFiles')
|
|
1413
1204
|
})]
|
|
1414
1205
|
})
|
|
@@ -1424,7 +1215,10 @@ const FileManagementScreen = ({
|
|
|
1424
1215
|
toValue: 1,
|
|
1425
1216
|
duration: 2000,
|
|
1426
1217
|
easing: _reactNative.Easing.linear,
|
|
1427
|
-
|
|
1218
|
+
// Web has no native animated module; forcing the native
|
|
1219
|
+
// driver there warns and falls back to JS. The shimmer only
|
|
1220
|
+
// drives a transform, so JS-driving it on web is fine.
|
|
1221
|
+
useNativeDriver: _reactNative.Platform.OS !== 'web'
|
|
1428
1222
|
}));
|
|
1429
1223
|
shimmer.start();
|
|
1430
1224
|
return () => shimmer.stop();
|
|
@@ -1532,22 +1326,22 @@ const FileManagementScreen = ({
|
|
|
1532
1326
|
})]
|
|
1533
1327
|
});
|
|
1534
1328
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1535
|
-
|
|
1329
|
+
className: "flex-1",
|
|
1330
|
+
style: {
|
|
1536
1331
|
backgroundColor
|
|
1537
|
-
}
|
|
1332
|
+
},
|
|
1538
1333
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1539
|
-
|
|
1334
|
+
className: "flex-row items-center justify-between px-[16px] py-[12px] relative",
|
|
1335
|
+
style: {
|
|
1540
1336
|
borderBottomColor: colors.border,
|
|
1541
1337
|
borderBottomWidth: _reactNative.StyleSheet.hairlineWidth
|
|
1542
|
-
}
|
|
1338
|
+
},
|
|
1543
1339
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
|
|
1544
1340
|
width: 44,
|
|
1545
1341
|
height: 44,
|
|
1546
1342
|
borderRadius: 12
|
|
1547
1343
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1548
|
-
|
|
1549
|
-
flex: 1
|
|
1550
|
-
}],
|
|
1344
|
+
className: "flex-1 items-center justify-center mx-[16px]",
|
|
1551
1345
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
|
|
1552
1346
|
width: 140,
|
|
1553
1347
|
height: 20,
|
|
@@ -1564,7 +1358,7 @@ const FileManagementScreen = ({
|
|
|
1564
1358
|
borderRadius: 12
|
|
1565
1359
|
})]
|
|
1566
1360
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1567
|
-
|
|
1361
|
+
className: "flex-row items-center justify-between px-[12px] py-[12px] gap-[12px]",
|
|
1568
1362
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
|
|
1569
1363
|
width: 100,
|
|
1570
1364
|
height: 36,
|
|
@@ -1575,20 +1369,22 @@ const FileManagementScreen = ({
|
|
|
1575
1369
|
borderRadius: 22
|
|
1576
1370
|
})]
|
|
1577
1371
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
1578
|
-
|
|
1372
|
+
className: "flex-row items-center px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-full gap-[10px]",
|
|
1373
|
+
style: {
|
|
1579
1374
|
backgroundColor: colors.card
|
|
1580
|
-
}
|
|
1375
|
+
},
|
|
1581
1376
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
|
|
1582
1377
|
width: "100%",
|
|
1583
1378
|
height: 44,
|
|
1584
1379
|
borderRadius: 12
|
|
1585
1380
|
})
|
|
1586
1381
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
1587
|
-
|
|
1382
|
+
className: "flex-row px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-[18px]",
|
|
1383
|
+
style: {
|
|
1588
1384
|
backgroundColor: colors.card
|
|
1589
|
-
}
|
|
1385
|
+
},
|
|
1590
1386
|
children: [1, 2, 3].map(i => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1591
|
-
|
|
1387
|
+
className: "flex-1 items-center py-[4px]",
|
|
1592
1388
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(SkeletonBox, {
|
|
1593
1389
|
width: 50,
|
|
1594
1390
|
height: 20,
|
|
@@ -1603,8 +1399,8 @@ const FileManagementScreen = ({
|
|
|
1603
1399
|
})]
|
|
1604
1400
|
}, i))
|
|
1605
1401
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
|
|
1606
|
-
|
|
1607
|
-
|
|
1402
|
+
className: "flex-1",
|
|
1403
|
+
contentContainerClassName: "px-[12px] pt-0 pb-[12px]",
|
|
1608
1404
|
showsVerticalScrollIndicator: false,
|
|
1609
1405
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
1610
1406
|
style: {
|
|
@@ -1695,7 +1491,7 @@ const FileManagementScreen = ({
|
|
|
1695
1491
|
// If upload preview is showing, render it inline instead of the file list
|
|
1696
1492
|
if (showUploadPreview) {
|
|
1697
1493
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1698
|
-
|
|
1494
|
+
className: "flex-1",
|
|
1699
1495
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Header.default, {
|
|
1700
1496
|
title: t('fileManagement.reviewFiles'),
|
|
1701
1497
|
subtitle: t('fileManagement.readyToUpload', {
|
|
@@ -1716,7 +1512,7 @@ const FileManagementScreen = ({
|
|
|
1716
1512
|
});
|
|
1717
1513
|
}
|
|
1718
1514
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1719
|
-
|
|
1515
|
+
className: "flex-1",
|
|
1720
1516
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Header.default, {
|
|
1721
1517
|
title: selectMode ? multiSelect ? maxSelection ? t('fileManagement.selectedWithMax', {
|
|
1722
1518
|
count: selectedIds.size,
|
|
@@ -1766,22 +1562,26 @@ const FileManagementScreen = ({
|
|
|
1766
1562
|
elevation: "none",
|
|
1767
1563
|
titleAlignment: "left"
|
|
1768
1564
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1769
|
-
|
|
1565
|
+
className: "flex-row items-center justify-between px-[12px] py-[12px] gap-[12px]",
|
|
1770
1566
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
|
|
1771
1567
|
horizontal: true,
|
|
1772
1568
|
showsHorizontalScrollIndicator: false,
|
|
1773
|
-
|
|
1569
|
+
className: "flex-1",
|
|
1570
|
+
style: {
|
|
1571
|
+
maxWidth: '80%'
|
|
1572
|
+
},
|
|
1774
1573
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1775
|
-
|
|
1574
|
+
className: "flex-row rounded-full p-[2px] overflow-hidden",
|
|
1575
|
+
style: {
|
|
1776
1576
|
backgroundColor: colors.card
|
|
1777
|
-
}
|
|
1577
|
+
},
|
|
1778
1578
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
|
|
1779
1579
|
isSelected: viewMode === 'all',
|
|
1780
1580
|
onPress: () => setViewMode('all'),
|
|
1781
1581
|
icon: viewMode === 'all' ? 'folder' : 'folder-outline',
|
|
1782
1582
|
primaryColor: colors.primary,
|
|
1783
1583
|
textColor: colors.text,
|
|
1784
|
-
style:
|
|
1584
|
+
style: screenStyles.viewModeButton,
|
|
1785
1585
|
accessibilityLabel: t('fileManagement.a11y.viewAll') || 'Show all files'
|
|
1786
1586
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
|
|
1787
1587
|
isSelected: viewMode === 'photos',
|
|
@@ -1789,7 +1589,7 @@ const FileManagementScreen = ({
|
|
|
1789
1589
|
icon: viewMode === 'photos' ? 'image-multiple' : 'image-multiple-outline',
|
|
1790
1590
|
primaryColor: colors.primary,
|
|
1791
1591
|
textColor: colors.text,
|
|
1792
|
-
style:
|
|
1592
|
+
style: screenStyles.viewModeButton,
|
|
1793
1593
|
accessibilityLabel: t('fileManagement.a11y.viewPhotos') || 'Show photos only'
|
|
1794
1594
|
}), !isImageOnlyPicker && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
1795
1595
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
|
|
@@ -1798,7 +1598,7 @@ const FileManagementScreen = ({
|
|
|
1798
1598
|
icon: viewMode === 'videos' ? 'video' : 'video-outline',
|
|
1799
1599
|
primaryColor: colors.primary,
|
|
1800
1600
|
textColor: colors.text,
|
|
1801
|
-
style:
|
|
1601
|
+
style: screenStyles.viewModeButton,
|
|
1802
1602
|
accessibilityLabel: t('fileManagement.a11y.viewVideos') || 'Show videos only'
|
|
1803
1603
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
|
|
1804
1604
|
isSelected: viewMode === 'documents',
|
|
@@ -1806,7 +1606,7 @@ const FileManagementScreen = ({
|
|
|
1806
1606
|
icon: viewMode === 'documents' ? 'file-document' : 'file-document-outline',
|
|
1807
1607
|
primaryColor: colors.primary,
|
|
1808
1608
|
textColor: colors.text,
|
|
1809
|
-
style:
|
|
1609
|
+
style: screenStyles.viewModeButton,
|
|
1810
1610
|
accessibilityLabel: t('fileManagement.a11y.viewDocuments') || 'Show documents only'
|
|
1811
1611
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(AnimatedButton, {
|
|
1812
1612
|
isSelected: viewMode === 'audio',
|
|
@@ -1814,15 +1614,16 @@ const FileManagementScreen = ({
|
|
|
1814
1614
|
icon: viewMode === 'audio' ? 'music-note' : 'music-note-outline',
|
|
1815
1615
|
primaryColor: colors.primary,
|
|
1816
1616
|
textColor: colors.text,
|
|
1817
|
-
style:
|
|
1617
|
+
style: screenStyles.viewModeButton,
|
|
1818
1618
|
accessibilityLabel: t('fileManagement.a11y.viewAudio') || 'Show audio only'
|
|
1819
1619
|
})]
|
|
1820
1620
|
})]
|
|
1821
1621
|
})
|
|
1822
1622
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
|
|
1823
|
-
|
|
1623
|
+
className: "flex-row items-center justify-center px-[10px] py-[6px] rounded-full min-w-[36px] gap-[4px]",
|
|
1624
|
+
style: {
|
|
1824
1625
|
backgroundColor: colors.card
|
|
1825
|
-
}
|
|
1626
|
+
},
|
|
1826
1627
|
accessibilityRole: "button",
|
|
1827
1628
|
accessibilityLabel: t('fileManagement.a11y.sortBy', {
|
|
1828
1629
|
field: sortBy,
|
|
@@ -1849,9 +1650,10 @@ const FileManagementScreen = ({
|
|
|
1849
1650
|
color: colors.textSecondary
|
|
1850
1651
|
})]
|
|
1851
1652
|
}), user?.id === targetUserId && (!selectMode || selectMode && allowUploadInSelectMode) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1852
|
-
|
|
1653
|
+
className: `h-[44px] rounded-[22px] items-center justify-center ${isImageOnlyPicker ? 'w-auto min-w-[44px] px-[14px]' : 'w-[44px]'}`,
|
|
1654
|
+
style: {
|
|
1853
1655
|
backgroundColor: colors.primary
|
|
1854
|
-
}
|
|
1656
|
+
},
|
|
1855
1657
|
onPress: handleFileUpload,
|
|
1856
1658
|
disabled: uploading || isPickingDocument,
|
|
1857
1659
|
accessibilityRole: "button",
|
|
@@ -1860,25 +1662,25 @@ const FileManagementScreen = ({
|
|
|
1860
1662
|
busy: uploading || isPickingDocument
|
|
1861
1663
|
},
|
|
1862
1664
|
children: uploading ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1863
|
-
|
|
1665
|
+
className: "items-center justify-center",
|
|
1864
1666
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
1865
1667
|
size: "small",
|
|
1866
1668
|
color: "#FFFFFF"
|
|
1867
1669
|
}), uploadProgress && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
|
|
1868
|
-
|
|
1670
|
+
className: "text-white text-[10px] font-semibold mt-[2px]",
|
|
1869
1671
|
children: [uploadProgress.current, "/", uploadProgress.total]
|
|
1870
1672
|
})]
|
|
1871
1673
|
}) : isPickingDocument ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
|
|
1872
1674
|
size: "small",
|
|
1873
1675
|
color: "#FFFFFF"
|
|
1874
1676
|
}) : isImageOnlyPicker ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1875
|
-
|
|
1677
|
+
className: "flex-row items-center gap-[6px]",
|
|
1876
1678
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1877
1679
|
name: "cloud-upload",
|
|
1878
1680
|
size: 18,
|
|
1879
1681
|
color: "#FFFFFF"
|
|
1880
1682
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1881
|
-
|
|
1683
|
+
className: "text-white text-[14px] font-semibold",
|
|
1882
1684
|
numberOfLines: 1,
|
|
1883
1685
|
children: t('fileManagement.upload') || 'Upload'
|
|
1884
1686
|
})]
|
|
@@ -1889,24 +1691,26 @@ const FileManagementScreen = ({
|
|
|
1889
1691
|
})
|
|
1890
1692
|
})]
|
|
1891
1693
|
}), files.length > 0 && (viewMode === 'all' || files.some(f => f.contentType.startsWith('image/'))) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1892
|
-
|
|
1694
|
+
className: "flex-row items-center px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-full gap-[10px]",
|
|
1695
|
+
style: {
|
|
1893
1696
|
backgroundColor: colors.card
|
|
1894
|
-
}
|
|
1697
|
+
},
|
|
1895
1698
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1896
1699
|
name: "search",
|
|
1897
1700
|
size: 22,
|
|
1898
1701
|
color: colors.icon
|
|
1899
1702
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
|
|
1900
|
-
|
|
1703
|
+
className: "flex-1 text-[16px] leading-[20px]",
|
|
1704
|
+
style: {
|
|
1901
1705
|
color: colors.text
|
|
1902
|
-
}
|
|
1706
|
+
},
|
|
1903
1707
|
placeholder: viewMode === 'photos' ? t('fileManagement.searchPhotos') : t('fileManagement.searchFiles'),
|
|
1904
1708
|
placeholderTextColor: colors.textSecondary,
|
|
1905
1709
|
value: searchQuery,
|
|
1906
1710
|
onChangeText: setSearchQuery
|
|
1907
1711
|
}), searchQuery.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
1908
1712
|
onPress: () => setSearchQuery(''),
|
|
1909
|
-
|
|
1713
|
+
className: "p-[4px] rounded-[12px] items-center justify-center",
|
|
1910
1714
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, {
|
|
1911
1715
|
name: "close-circle",
|
|
1912
1716
|
size: 22,
|
|
@@ -1914,46 +1718,59 @@ const FileManagementScreen = ({
|
|
|
1914
1718
|
})
|
|
1915
1719
|
})]
|
|
1916
1720
|
}), files.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1917
|
-
|
|
1721
|
+
className: "flex-row px-[14px] py-[10px] mx-[12px] mb-[12px] rounded-[18px]",
|
|
1722
|
+
style: {
|
|
1918
1723
|
backgroundColor: colors.card
|
|
1919
|
-
}
|
|
1724
|
+
},
|
|
1920
1725
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1921
|
-
|
|
1726
|
+
className: "flex-1 items-center py-[4px]",
|
|
1922
1727
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1728
|
+
className: "text-[20px] font-extrabold leading-[24px]",
|
|
1729
|
+
style: {
|
|
1730
|
+
color: colors.text,
|
|
1731
|
+
letterSpacing: -0.5
|
|
1732
|
+
},
|
|
1926
1733
|
children: filteredFiles.length
|
|
1927
1734
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1735
|
+
className: "text-[12px] font-medium mt-[2px]",
|
|
1736
|
+
style: {
|
|
1737
|
+
color: colors.textSecondary,
|
|
1738
|
+
letterSpacing: 0.2
|
|
1739
|
+
},
|
|
1931
1740
|
children: searchQuery.length > 0 ? t('fileManagement.found') : filteredFiles.length === 1 ? viewMode === 'photos' ? t('fileManagement.photo') : t('fileManagement.file') : viewMode === 'photos' ? t('fileManagement.photos_stat') : t('fileManagement.files')
|
|
1932
1741
|
})]
|
|
1933
1742
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1934
|
-
|
|
1743
|
+
className: "flex-1 items-center py-[4px]",
|
|
1935
1744
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1745
|
+
className: "text-[20px] font-extrabold leading-[24px]",
|
|
1746
|
+
style: {
|
|
1747
|
+
color: colors.text,
|
|
1748
|
+
letterSpacing: -0.5
|
|
1749
|
+
},
|
|
1939
1750
|
children: (0, _fileManagement.formatFileSize)(filteredFiles.reduce((total, file) => total + file.length, 0))
|
|
1940
1751
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1752
|
+
className: "text-[12px] font-medium mt-[2px]",
|
|
1753
|
+
style: {
|
|
1754
|
+
color: colors.textSecondary,
|
|
1755
|
+
letterSpacing: 0.2
|
|
1756
|
+
},
|
|
1944
1757
|
children: searchQuery.length > 0 ? t('fileManagement.size') : t('fileManagement.totalSize')
|
|
1945
1758
|
})]
|
|
1946
1759
|
}), searchQuery.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
1947
|
-
|
|
1760
|
+
className: "flex-1 items-center py-[4px]",
|
|
1948
1761
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1762
|
+
className: "text-[20px] font-extrabold leading-[24px]",
|
|
1763
|
+
style: {
|
|
1764
|
+
color: colors.text,
|
|
1765
|
+
letterSpacing: -0.5
|
|
1766
|
+
},
|
|
1952
1767
|
children: files.length
|
|
1953
1768
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1769
|
+
className: "text-[12px] font-medium mt-[2px]",
|
|
1770
|
+
style: {
|
|
1771
|
+
color: colors.textSecondary,
|
|
1772
|
+
letterSpacing: 0.2
|
|
1773
|
+
},
|
|
1957
1774
|
children: t('fileManagement.total')
|
|
1958
1775
|
})]
|
|
1959
1776
|
})]
|
|
@@ -2031,7 +1848,5 @@ const FileManagementScreen = ({
|
|
|
2031
1848
|
})]
|
|
2032
1849
|
});
|
|
2033
1850
|
};
|
|
2034
|
-
|
|
2035
|
-
// Styles have been moved to components/fileManagement/styles.ts
|
|
2036
1851
|
var _default = exports.default = FileManagementScreen;
|
|
2037
1852
|
//# sourceMappingURL=FileManagementScreen.js.map
|