@@ -33,6 +33,33 @@ struct Resolution: Codable {
3333 let height : Int
3434}
3535
36+ struct ExtensionTypes {
37+ let imageExtensions : [ String ] = [
38+ " .png " , " .jpg " , " .jpeg " , " .webp " , " .avif " , " .heif " , " .heic "
39+ ]
40+ let textExtensions : [ String ] = [
41+ " .txt " , " .log " , " .json " , " .yaml " , " .xml " , " .yml " , " .csv " , " .tsv " , " .ini " , " .properties " , " .sh " ,
42+ " .bat " , " .ps1 " , " .psd " , " .psb " , " .text " , " .rtf " , " .doc " , " .docx " , " .xls " , " .xlsx " , " .ppt " ,
43+ " .py " , " .scala " , " .rb " , " .swift " , " .go " , " .java " , " .c " , " .cpp " , " .h " , " .hpp " , " .m " , " .mm " ,
44+ " .java " , " .css " , " .rs " , " .ts "
45+ ]
46+ let videoExtensions : [ String ] = [
47+ " .mp4 " , " .mov "
48+ ]
49+ let audioExtensions : [ String ] = [
50+ " .mp3 " , " .wav " , " .aac " , " .ogg "
51+ ]
52+
53+ let mediaExtensions : [ String ]
54+ let previewExtensions : [ String ]
55+
56+ // Custom initializer to safely combine properties
57+ init ( ) {
58+ self . mediaExtensions = self . videoExtensions + self . audioExtensions
59+ self . previewExtensions = self . textExtensions + self . imageExtensions + [ " .pdf " ]
60+ }
61+ }
62+
3663struct FileDetailView : View {
3764 @State var currentIndex : Int
3865 let files : [ FileItem ]
@@ -41,6 +68,7 @@ struct FileDetailView: View {
4168
4269 var file : FileItem { files [ currentIndex] }
4370
71+ let extensionTypes : ExtensionTypes = ExtensionTypes ( )
4472 @State private var content : Data ? = nil
4573 @State private var error : String ? = nil
4674 @State private var metadata : ResourceMetadata ? = nil
@@ -55,23 +83,6 @@ struct FileDetailView: View {
5583
5684 var body : some View {
5785 let fileName = file. name. lowercased ( ) ;
58- let imageExtensions : [ String ] = [
59- " .png " , " .jpg " , " .jpeg " , " .webp " , " .avif " , " .heif " , " .heic "
60- ]
61- let textExtensions : [ String ] = [
62- " .txt " , " .log " , " .json " , " .yaml " , " .xml " , " .yml " , " .csv " , " .tsv " , " .ini " , " .properties " , " .sh " ,
63- " .bat " , " .ps1 " , " .psd " , " .psb " , " .text " , " .rtf " , " .doc " , " .docx " , " .xls " , " .xlsx " , " .ppt " ,
64- " .py " , " .scala " , " .rb " , " .swift " , " .go " , " .java " , " .c " , " .cpp " , " .h " , " .hpp " , " .m " , " .mm " ,
65- " .java " , " .css " , " .rs " , " .ts "
66- ]
67- let videoExtensions : [ String ] = [
68- " .mp4 " , " .mov "
69- ]
70- let audioExtensions : [ String ] = [
71- " .mp3 " , " .wav " , " .aac " , " .ogg "
72- ]
73- let mediaExtensions = videoExtensions + audioExtensions
74- let previewExtensions = textExtensions + imageExtensions + [ " .pdf " ]
7586 Group {
7687 if isDownloading {
7788 VStack {
@@ -85,10 +96,10 @@ struct FileDetailView: View {
8596 } else if let error = error {
8697 Text ( " Error: \( error) " )
8798 . foregroundColor ( . red)
88- } else if mediaExtensions. contains ( where: fileName. hasSuffix) {
99+ } else if extensionTypes . mediaExtensions. contains ( where: fileName. hasSuffix) {
89100 MediaPlayerView ( file: file, serverURL: serverURL, token: token)
90101 } else if let content = content {
91- if imageExtensions. contains ( where: fileName. hasSuffix) {
102+ if extensionTypes . imageExtensions. contains ( where: fileName. hasSuffix) {
92103 if let image = UIImage ( data: content) {
93104 Image ( uiImage: image)
94105 . resizable ( )
@@ -97,7 +108,7 @@ struct FileDetailView: View {
97108 } else {
98109 Text ( " Failed to load image " )
99110 }
100- } else if textExtensions. contains ( where: fileName. hasSuffix) {
111+ } else if extensionTypes . textExtensions. contains ( where: fileName. hasSuffix) {
101112 if let text = String ( data: content, encoding: . utf8) {
102113 ScrollView {
103114 Text ( text)
@@ -118,7 +129,7 @@ struct FileDetailView: View {
118129 Text ( " Error: \( error) " )
119130 . foregroundColor ( . red)
120131 } else {
121- if previewExtensions. contains ( where: fileName. hasSuffix) {
132+ if extensionTypes . previewExtensions. contains ( where: fileName. hasSuffix) {
122133 ProgressView ( " Loading file... " )
123134 } else {
124135 Text ( " File preview not supported for this type. " )
@@ -226,19 +237,13 @@ struct FileDetailView: View {
226237 . onChange ( of: currentIndex) { _ in
227238 reloadFile (
228239 fileName: fileName,
229- imageExtensions: imageExtensions,
230- textExtensions: textExtensions,
231- mediaExtensions: mediaExtensions,
232- previewExtensions: previewExtensions
240+ extensionTypes: extensionTypes
233241 )
234242 }
235243 . onAppear {
236244 reloadFile (
237245 fileName: fileName,
238- imageExtensions: imageExtensions,
239- textExtensions: textExtensions,
240- mediaExtensions: mediaExtensions,
241- previewExtensions: previewExtensions
246+ extensionTypes: extensionTypes,
242247 )
243248 }
244249 . gesture (
@@ -265,22 +270,18 @@ struct FileDetailView: View {
265270
266271 func reloadFile(
267272 fileName: String ,
268- imageExtensions: [ String ] ,
269- textExtensions: [ String ] ,
270- mediaExtensions: [ String ] ,
271- previewExtensions: [ String ]
273+ extensionTypes: ExtensionTypes
272274 ) {
273275 content = nil
274276 error = nil
275277 // todo: Implement a hoverable arrow for navigation
276278 // Wrap all extensions in a class/struct
277- if !mediaExtensions. contains ( where: fileName. hasSuffix)
278- && ( previewExtensions. contains ( where: fileName. hasSuffix) ) {
279+ if !extensionTypes . mediaExtensions. contains ( where: fileName. hasSuffix)
280+ && ( extensionTypes . previewExtensions. contains ( where: fileName. hasSuffix) ) {
279281 // ✅ Only load if preview is supported
280282 downloadFile (
281283 fileName: fileName,
282- imageExtensions: imageExtensions,
283- textExtensions: textExtensions
284+ extensionTypes: extensionTypes
284285 )
285286 } else {
286287 Log . info ( " 🚫 Skipping auto-download — no preview available for \( fileName) " )
@@ -492,11 +493,11 @@ struct FileDetailView: View {
492493 }
493494 }
494495
495- func downloadFile( fileName: String , imageExtensions : [ String ] , textExtensions : [ String ] ) {
496- if imageExtensions. contains ( where: fileName. hasSuffix) {
496+ func downloadFile( fileName: String , extensionTypes : ExtensionTypes ) {
497+ if extensionTypes . imageExtensions. contains ( where: fileName. hasSuffix) {
497498 Log . debug ( " 🖼️ Detected image file. Using preview API " )
498499 downloadPreview ( )
499- } else if textExtensions. contains ( where: fileName. hasSuffix) {
500+ } else if extensionTypes . textExtensions. contains ( where: fileName. hasSuffix) {
500501 Log . debug ( " 📄 Detected text file. Using raw API " )
501502 downloadRaw ( )
502503 } else if fileName. hasSuffix ( " .pdf " ) {
0 commit comments