aboutsummaryrefslogtreecommitdiff
path: root/Hotline/macOS/Files/FilesView.swift
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2025-11-07 10:39:48 -0800
committerDustin Mierau <dustin@mierau.me>2025-11-07 10:39:48 -0800
commit39f51fd902bb34272c78ffdfb872c22095382f70 (patch)
treefee51effb6431aeb5464931052ecdd0df32c6792 /Hotline/macOS/Files/FilesView.swift
parent87f08cf60a5d7c1cf618463916cbac4dab88e0f8 (diff)
Further cleanup of previous refactor. Removing old view model and NetSocket. Added some empty states for newsgroups and message board.
Diffstat (limited to 'Hotline/macOS/Files/FilesView.swift')
-rw-r--r--Hotline/macOS/Files/FilesView.swift272
1 files changed, 136 insertions, 136 deletions
diff --git a/Hotline/macOS/Files/FilesView.swift b/Hotline/macOS/Files/FilesView.swift
index b499fe6..d4ba5c8 100644
--- a/Hotline/macOS/Files/FilesView.swift
+++ b/Hotline/macOS/Files/FilesView.swift
@@ -16,142 +16,6 @@ struct FilesView: View {
@State private var searchText: String = ""
@State private var isSearching: Bool = false
@State private var dragOver: Bool = false
-
- private var isShowingSearchResults: Bool {
- switch model.fileSearchStatus {
- case .idle:
- return !model.fileSearchResults.isEmpty
- case .cancelled(_):
- return !model.fileSearchResults.isEmpty
- default:
- return true
- }
- }
-
- private var displayedFiles: [FileInfo] {
- isShowingSearchResults ? model.fileSearchResults : model.files
- }
-
- private var searchStatusMessage: String? {
- switch model.fileSearchStatus {
- case .searching(let processed, _):
- let scanned = processed == 1 ? "folder" : "folders"
- return "Searched \(processed) \(scanned)..."
- case .completed(let processed):
- let count = model.fileSearchResults.count
- let folderWord = processed == 1 ? "folder" : "folders"
- if count == 0 {
- return "No files found in \(processed) \(folderWord)"
- }
- return "\(count) file\(count == 1 ? "" : "s") found in \(processed) \(folderWord)"
- case .cancelled(_):
- if model.fileSearchResults.isEmpty {
- return nil
- }
- return "Search cancelled"
- case .failed(let message):
- return "Search failed: \(message)"
- case .idle:
- return nil
- }
- }
-
- private var searchStatusPath: String? {
- guard let path = model.fileSearchCurrentPath else {
- return nil
- }
- if path.isEmpty {
- return "/"
- }
- return path.joined(separator: "/")
- }
-
- private func openPreviewWindow(_ previewInfo: PreviewFileInfo) {
- switch previewInfo.previewType {
- case .image:
- openWindow(id: "preview-quicklook", value: previewInfo)
- case .text:
- openWindow(id: "preview-quicklook", value: previewInfo)
- case .unknown:
- openWindow(id: "preview-quicklook", value: previewInfo)
- return
- }
- }
-
- @MainActor private func getFileInfo(_ file: FileInfo) {
- Task {
- if let fileInfo = try? await model.getFileDetails(file.name, path: file.path) {
- Task { @MainActor in
- self.fileDetails = fileInfo
- }
- }
- }
- }
-
- @MainActor private func downloadFile(_ file: FileInfo) {
- if file.isFolder {
- model.downloadFolderNew(file.name, path: file.path)
- }
- else {
- model.downloadFileNew(file.name, path: file.path)
- }
- }
-
- @MainActor private func uploadFile(file fileURL: URL, to path: [String]) {
- model.uploadFile(url: fileURL, path: path) { info in
- Task {
- // Refresh file listing to display newly uploaded file.
- let _ = try? await model.getFileList(path: path)
- }
- }
- }
-
- @MainActor private func upload(file fileURL: URL, to path: [String]) {
- var fileIsDirectory: ObjCBool = false
- guard FileManager.default.fileExists(atPath: fileURL.path(percentEncoded: false), isDirectory: &fileIsDirectory) else {
- return
- }
-
- if fileIsDirectory.boolValue {
- self.model.uploadFolder(url: fileURL, path: path, complete: { info in
- Task {
- // Refresh file listing to display newly uploaded file.
- try? await model.getFileList(path: path)
- }
- })
- }
- else {
- self.model.uploadFile(url: fileURL, path: path) { info in
- Task {
- // Refresh file listing to display newly uploaded file.
- try? await model.getFileList(path: path)
- }
- }
- }
- }
-
- @MainActor private func previewFile(_ file: FileInfo) {
- guard file.isPreviewable else {
- return
- }
-
- model.previewFile(file.name, path: file.path) { info in
- if let info = info {
- openPreviewWindow(info)
- }
- }
- }
-
- private func deleteFile(_ file: FileInfo) async {
- var parentPath: [String] = []
- if file.path.count > 1 {
- parentPath = Array(file.path[0..<file.path.count-1])
- }
-
- if (try? await model.deleteFile(file.name, path: file.path)) == true {
- let _ = try? await model.getFileList(path: parentPath)
- }
- }
var body: some View {
NavigationStack {
@@ -459,6 +323,142 @@ struct FilesView: View {
}
}
}
+
+ private var isShowingSearchResults: Bool {
+ switch model.fileSearchStatus {
+ case .idle:
+ return !model.fileSearchResults.isEmpty
+ case .cancelled(_):
+ return !model.fileSearchResults.isEmpty
+ default:
+ return true
+ }
+ }
+
+ private var displayedFiles: [FileInfo] {
+ isShowingSearchResults ? model.fileSearchResults : model.files
+ }
+
+ private var searchStatusMessage: String? {
+ switch model.fileSearchStatus {
+ case .searching(let processed, _):
+ let scanned = processed == 1 ? "folder" : "folders"
+ return "Searched \(processed) \(scanned)..."
+ case .completed(let processed):
+ let count = model.fileSearchResults.count
+ let folderWord = processed == 1 ? "folder" : "folders"
+ if count == 0 {
+ return "No files found in \(processed) \(folderWord)"
+ }
+ return "\(count) file\(count == 1 ? "" : "s") found in \(processed) \(folderWord)"
+ case .cancelled(_):
+ if model.fileSearchResults.isEmpty {
+ return nil
+ }
+ return "Search cancelled"
+ case .failed(let message):
+ return "Search failed: \(message)"
+ case .idle:
+ return nil
+ }
+ }
+
+ private var searchStatusPath: String? {
+ guard let path = model.fileSearchCurrentPath else {
+ return nil
+ }
+ if path.isEmpty {
+ return "/"
+ }
+ return path.joined(separator: "/")
+ }
+
+ private func openPreviewWindow(_ previewInfo: PreviewFileInfo) {
+ switch previewInfo.previewType {
+ case .image:
+ openWindow(id: "preview-quicklook", value: previewInfo)
+ case .text:
+ openWindow(id: "preview-quicklook", value: previewInfo)
+ case .unknown:
+ openWindow(id: "preview-quicklook", value: previewInfo)
+ return
+ }
+ }
+
+ @MainActor private func getFileInfo(_ file: FileInfo) {
+ Task {
+ if let fileInfo = try? await model.getFileDetails(file.name, path: file.path) {
+ Task { @MainActor in
+ self.fileDetails = fileInfo
+ }
+ }
+ }
+ }
+
+ @MainActor private func downloadFile(_ file: FileInfo) {
+ if file.isFolder {
+ model.downloadFolderNew(file.name, path: file.path)
+ }
+ else {
+ model.downloadFileNew(file.name, path: file.path)
+ }
+ }
+
+ @MainActor private func uploadFile(file fileURL: URL, to path: [String]) {
+ model.uploadFile(url: fileURL, path: path) { info in
+ Task {
+ // Refresh file listing to display newly uploaded file.
+ let _ = try? await model.getFileList(path: path)
+ }
+ }
+ }
+
+ @MainActor private func upload(file fileURL: URL, to path: [String]) {
+ var fileIsDirectory: ObjCBool = false
+ guard FileManager.default.fileExists(atPath: fileURL.path(percentEncoded: false), isDirectory: &fileIsDirectory) else {
+ return
+ }
+
+ if fileIsDirectory.boolValue {
+ self.model.uploadFolder(url: fileURL, path: path, complete: { info in
+ Task {
+ // Refresh file listing to display newly uploaded file.
+ try? await model.getFileList(path: path)
+ }
+ })
+ }
+ else {
+ self.model.uploadFile(url: fileURL, path: path) { info in
+ Task {
+ // Refresh file listing to display newly uploaded file.
+ try? await model.getFileList(path: path)
+ }
+ }
+ }
+ }
+
+ @MainActor private func previewFile(_ file: FileInfo) {
+ guard file.isPreviewable else {
+ return
+ }
+
+ model.previewFile(file.name, path: file.path) { info in
+ if let info = info {
+ openPreviewWindow(info)
+ }
+ }
+ }
+
+ private func deleteFile(_ file: FileInfo) async {
+ var parentPath: [String] = []
+ if file.path.count > 1 {
+ parentPath = Array(file.path[0..<file.path.count-1])
+ }
+
+ if (try? await model.deleteFile(file.name, path: file.path)) == true {
+ let _ = try? await model.getFileList(path: parentPath)
+ }
+ }
}
#Preview {