Skip to content

Commit 0ae1fa5

Browse files
committed
refactor: Wrap all extension types in a single struct
1 parent 032a6cf commit 0ae1fa5

File tree

1 file changed

+41
-40
lines changed

1 file changed

+41
-40
lines changed

FileBrowserClient/FileBrowserClient/FileDetailView.swift

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3663
struct 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

Comments
 (0)