@@ -262,7 +262,8 @@ struct FileListView: View {
262
262
previewStateManager. deepLinkTargetFileID = nil
263
263
}
264
264
foundFile = true
265
- } else if !hasNextPage {
265
+ } else if !hasNextPage || errorMessage != nil {
266
+ // Stop if we hit an error or no more pages
266
267
break
267
268
}
268
269
currentPage += 1
@@ -289,15 +290,39 @@ struct FileListView: View {
289
290
Spacer ( )
290
291
VStack {
291
292
Spacer ( )
292
- Image ( systemName: " document.on.document.fill " )
293
- . font ( . system( size: 50 ) )
294
- . padding ( . bottom)
295
- . shadow ( color: . purple, radius: 15 )
296
- Text ( " No files found " )
297
- . font ( . headline)
298
- . shadow ( color: . purple, radius: 20 )
299
- Text ( " Upload a file to get started " )
300
- . foregroundColor ( . secondary)
293
+ if let errorMessage = errorMessage {
294
+ // Show error message instead of "no files found"
295
+ Image ( systemName: " exclamationmark.triangle.fill " )
296
+ . font ( . system( size: 50 ) )
297
+ . foregroundColor ( . orange)
298
+ . padding ( . bottom)
299
+ . shadow ( color: . orange, radius: 15 )
300
+ Text ( " Error loading files " )
301
+ . font ( . headline)
302
+ . shadow ( color: . orange, radius: 20 )
303
+ Text ( errorMessage)
304
+ . foregroundColor ( . secondary)
305
+ . multilineTextAlignment ( . center)
306
+ . padding ( . horizontal)
307
+ Button ( " Retry " ) {
308
+ Task {
309
+ await refreshFiles ( )
310
+ }
311
+ }
312
+ . padding ( . top)
313
+ . buttonStyle ( . borderedProminent)
314
+ } else {
315
+ // Show "no files found" when there's no error
316
+ Image ( systemName: " document.on.document.fill " )
317
+ . font ( . system( size: 50 ) )
318
+ . padding ( . bottom)
319
+ . shadow ( color: . purple, radius: 15 )
320
+ Text ( " No files found " )
321
+ . font ( . headline)
322
+ . shadow ( color: . purple, radius: 20 )
323
+ Text ( " Upload a file to get started " )
324
+ . foregroundColor ( . secondary)
325
+ }
301
326
}
302
327
. padding ( )
303
328
Spacer ( )
@@ -547,6 +572,7 @@ struct FileListView: View {
547
572
private func uploadClipboard( ) async {
548
573
guard let serverInstance = server. wrappedValue,
549
574
let url = URL ( string: serverInstance. url) else {
575
+ ToastManager . shared. showToast ( message: " Invalid server configuration " )
550
576
return
551
577
}
552
578
@@ -560,11 +586,18 @@ struct FileListView: View {
560
586
do {
561
587
try text. write ( to: tempURL, atomically: true , encoding: . utf8)
562
588
let delegate = UploadProgressDelegate { _ in }
563
- _ = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
589
+ let response = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
564
590
try ? FileManager . default. removeItem ( at: tempURL)
565
- await refreshFiles ( )
591
+ if response != nil {
592
+ await refreshFiles ( )
593
+ ToastManager . shared. showToast ( message: " Text uploaded successfully " )
594
+ } else {
595
+ ToastManager . shared. showToast ( message: " Failed to upload text " )
596
+ }
566
597
} catch {
598
+ try ? FileManager . default. removeItem ( at: tempURL)
567
599
print ( " Error uploading clipboard text: \( error) " )
600
+ ToastManager . shared. showToast ( message: " Error uploading text: \( error. localizedDescription) " )
568
601
}
569
602
return
570
603
}
@@ -577,11 +610,18 @@ struct FileListView: View {
577
610
do {
578
611
try imageData. write ( to: tempURL)
579
612
let delegate = UploadProgressDelegate { _ in }
580
- _ = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
613
+ let response = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
581
614
try ? FileManager . default. removeItem ( at: tempURL)
582
- await refreshFiles ( )
615
+ if response != nil {
616
+ await refreshFiles ( )
617
+ ToastManager . shared. showToast ( message: " Image uploaded successfully " )
618
+ } else {
619
+ ToastManager . shared. showToast ( message: " Failed to upload image " )
620
+ }
583
621
} catch {
622
+ try ? FileManager . default. removeItem ( at: tempURL)
584
623
print ( " Error uploading clipboard image: \( error) " )
624
+ ToastManager . shared. showToast ( message: " Error uploading image: \( error. localizedDescription) " )
585
625
}
586
626
}
587
627
return
@@ -593,14 +633,24 @@ struct FileListView: View {
593
633
do {
594
634
try videoData. write ( to: tempURL)
595
635
let delegate = UploadProgressDelegate { _ in }
596
- _ = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
636
+ let response = await api. uploadFile ( url: tempURL, taskDelegate: delegate)
597
637
try ? FileManager . default. removeItem ( at: tempURL)
598
- await refreshFiles ( )
638
+ if response != nil {
639
+ await refreshFiles ( )
640
+ ToastManager . shared. showToast ( message: " Video uploaded successfully " )
641
+ } else {
642
+ ToastManager . shared. showToast ( message: " Failed to upload video " )
643
+ }
599
644
} catch {
645
+ try ? FileManager . default. removeItem ( at: tempURL)
600
646
print ( " Error uploading clipboard video: \( error) " )
647
+ ToastManager . shared. showToast ( message: " Error uploading video: \( error. localizedDescription) " )
601
648
}
602
649
return
603
650
}
651
+
652
+ // If we get here, no content was found in clipboard
653
+ ToastManager . shared. showToast ( message: " No content found in clipboard " )
604
654
}
605
655
606
656
private func fileContextMenu( for file: DFFile , isPreviewing: Bool , isPrivate: Bool , expirationText: Binding < String > , passwordText: Binding < String > , fileNameText: Binding < String > ) -> FileContextMenuButtons {
@@ -710,33 +760,52 @@ struct FileListView: View {
710
760
private func fetchFiles( page: Int , append: Bool = false ) async {
711
761
guard let serverInstance = server. wrappedValue,
712
762
let url = URL ( string: serverInstance. url) else {
713
- errorMessage = " Invalid server URL "
763
+ let errorMsg = " Invalid server URL "
764
+ errorMessage = errorMsg
714
765
isLoading = false
766
+ // Show toast message for the error
767
+ ToastManager . shared. showToast ( message: errorMsg)
715
768
return
716
769
}
717
770
718
771
let api = DFAPI ( url: url, token: serverInstance. token)
719
772
720
- if let filesResponse = await api. getFiles ( page: page, album: albumID, selectedServer: serverInstance, filterUserID: filterUserID) {
721
- if append {
722
- // Only append new files that aren't already in the list
723
- let newFiles = filesResponse. files. filter { newFile in
724
- !files. contains { $0. id == newFile. id }
773
+ do {
774
+ if let filesResponse = await api. getFiles ( page: page, album: albumID, selectedServer: serverInstance, filterUserID: filterUserID) {
775
+ if append {
776
+ // Only append new files that aren't already in the list
777
+ let newFiles = filesResponse. files. filter { newFile in
778
+ !files. contains { $0. id == newFile. id }
779
+ }
780
+ files. append ( contentsOf: newFiles)
781
+ } else {
782
+ files = filesResponse. files
725
783
}
726
- files. append ( contentsOf: newFiles)
784
+
785
+ hasNextPage = filesResponse. next != nil
786
+ currentPage = page
787
+ isLoading = false
788
+ // Clear any previous error message on success
789
+ errorMessage = nil
727
790
} else {
728
- files = filesResponse. files
791
+ if !append {
792
+ files = [ ]
793
+ }
794
+ let errorMsg = " Failed to load files from server "
795
+ errorMessage = errorMsg
796
+ isLoading = false
797
+ // Show toast message for the error
798
+ ToastManager . shared. showToast ( message: errorMsg)
729
799
}
730
-
731
- hasNextPage = filesResponse. next != nil
732
- currentPage = page
733
- isLoading = false
734
- } else {
800
+ } catch {
735
801
if !append {
736
802
files = [ ]
737
803
}
738
- errorMessage = " Failed to load files from server "
804
+ let errorMsg = " Error loading files: \( error. localizedDescription) "
805
+ errorMessage = errorMsg
739
806
isLoading = false
807
+ // Show toast message for the error
808
+ ToastManager . shared. showToast ( message: errorMsg)
740
809
}
741
810
}
742
811
0 commit comments