Skip to content

Commit 081b96b

Browse files
committed
fix the rest of the context menu and live updates
1 parent bae5852 commit 081b96b

File tree

2 files changed

+106
-58
lines changed

2 files changed

+106
-58
lines changed

Django Files/Views/FileList.swift

Lines changed: 78 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ protocol FileListDelegate: AnyObject {
1414
func deleteFiles(fileIDs: [Int], onSuccess: (() -> Void)?) async -> Bool
1515
@MainActor
1616
func renameFile(fileID: Int, newName: String, onSuccess: (() -> Void)?) async -> Bool
17+
@MainActor
18+
func setFilePassword(fileID: Int, password: String, onSuccess: (() -> Void)?) async -> Bool
19+
@MainActor
20+
func setFilePrivate(fileID: Int, isPrivate: Bool, onSuccess: (() -> Void)?) async -> Bool
21+
@MainActor
22+
func setFileExpiration(fileID: Int, expr: String, onSuccess: (() -> Void)?) async -> Bool
1723
}
1824

1925
@MainActor
@@ -89,6 +95,69 @@ class FileListManager: ObservableObject, FileListDelegate {
8995
}
9096
return status
9197
}
98+
99+
func setFilePassword(fileID: Int, password: String, onSuccess: (() -> Void)?) async -> Bool {
100+
guard let serverInstance = server.wrappedValue,
101+
let url = URL(string: serverInstance.url) else {
102+
return false
103+
}
104+
105+
let api = DFAPI(url: url, token: serverInstance.token)
106+
let status = await api.editFiles(fileIDs: [fileID], changes: ["password": password], selectedServer: serverInstance)
107+
if status {
108+
withAnimation {
109+
if let index = files.firstIndex(where: { $0.id == fileID }) {
110+
var updatedFiles = files
111+
updatedFiles[index].password = password
112+
files = updatedFiles
113+
}
114+
onSuccess?()
115+
}
116+
}
117+
return status
118+
}
119+
120+
func setFilePrivate(fileID: Int, isPrivate: Bool, onSuccess: (() -> Void)?) async -> Bool {
121+
guard let serverInstance = server.wrappedValue,
122+
let url = URL(string: serverInstance.url) else {
123+
return false
124+
}
125+
126+
let api = DFAPI(url: url, token: serverInstance.token)
127+
let status = await api.editFiles(fileIDs: [fileID], changes: ["private": isPrivate], selectedServer: serverInstance)
128+
if status {
129+
withAnimation {
130+
if let index = files.firstIndex(where: { $0.id == fileID }) {
131+
var updatedFiles = files
132+
updatedFiles[index].private = isPrivate
133+
files = updatedFiles
134+
}
135+
onSuccess?()
136+
}
137+
}
138+
return status
139+
}
140+
141+
func setFileExpiration(fileID: Int, expr: String, onSuccess: (() -> Void)?) async -> Bool {
142+
guard let serverInstance = server.wrappedValue,
143+
let url = URL(string: serverInstance.url) else {
144+
return false
145+
}
146+
147+
let api = DFAPI(url: url, token: serverInstance.token)
148+
let status = await api.editFiles(fileIDs: [fileID], changes: ["expr": expr], selectedServer: serverInstance)
149+
if status {
150+
withAnimation {
151+
if let index = files.firstIndex(where: { $0.id == fileID }) {
152+
var updatedFiles = files
153+
updatedFiles[index].expr = expr
154+
files = updatedFiles
155+
}
156+
onSuccess?()
157+
}
158+
}
159+
return status
160+
}
92161
}
93162

94163
struct CustomLabel: LabelStyle {
@@ -104,9 +173,9 @@ struct CustomLabel: LabelStyle {
104173

105174
struct FileRowView: View {
106175
@Binding var file: DFFile
107-
@State var isPrivate: Bool
108-
@State var hasPassword: Bool
109-
@State var hasExpiration: Bool
176+
var isPrivate: Bool { file.private }
177+
var hasPassword: Bool { file.password != "" }
178+
var hasExpiration: Bool { file.expr != "" }
110179
let serverURL: URL
111180

112181
private func getIcon() -> String {
@@ -303,9 +372,6 @@ struct FileListView: View {
303372
if files[index].mime.starts(with: "image/") {
304373
FileRowView(
305374
file: $fileListManager.files[index],
306-
isPrivate: files[index].private,
307-
hasPassword: (files[index].password != ""),
308-
hasExpiration: (files[index].expr != ""),
309375
serverURL: URL(string: server.wrappedValue!.url)!
310376
)
311377
.contextMenu {
@@ -324,9 +390,6 @@ struct FileListView: View {
324390
} else {
325391
FileRowView(
326392
file: $fileListManager.files[index],
327-
isPrivate: files[index].private,
328-
hasPassword: (files[index].password != ""),
329-
hasExpiration: (files[index].expr != ""),
330393
serverURL: URL(string: server.wrappedValue!.url)!
331394
)
332395
.contextMenu {
@@ -453,7 +516,7 @@ struct FileListView: View {
453516
if let file = fileToExpire {
454517
let expirationValue = expirationText
455518
Task {
456-
await setFileExpr(file: file, expr: expirationValue)
519+
await setFileExpiration(file: file, expr: expirationValue)
457520
await MainActor.run {
458521
expirationText = ""
459522
fileToExpire = nil
@@ -748,37 +811,17 @@ struct FileListView: View {
748811

749812
@MainActor
750813
private func toggleFilePrivacy(file: DFFile) async {
751-
guard let serverInstance = server.wrappedValue,
752-
let url = URL(string: serverInstance.url) else {
753-
return
754-
}
755-
let api = DFAPI(url: url, token: serverInstance.token)
756-
// Toggle the private status (if currently private, make it public and vice versa)
757-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["private": !file.private], selectedServer: serverInstance)
758-
await refreshFiles() // TODO: update local data instead of refresh
814+
let _ = await fileListManager.setFilePrivate(fileID: file.id, isPrivate: !file.private, onSuccess: nil)
759815
}
760816

761817
@MainActor
762-
private func setFileExpr(file: DFFile, expr: String?) async {
763-
guard let serverInstance = server.wrappedValue,
764-
let url = URL(string: serverInstance.url) else {
765-
return
766-
}
767-
768-
let api = DFAPI(url: url, token: serverInstance.token)
769-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["expr": expr ?? ""], selectedServer: serverInstance)
770-
await refreshFiles() // TODO: update local data instead of refresh
818+
private func setFileExpiration(file: DFFile, expr: String) async {
819+
let _ = await fileListManager.setFileExpiration(fileID: file.id, expr: expr, onSuccess: nil)
771820
}
772821

773822
@MainActor
774-
private func setFilePassword(file: DFFile, password: String?) async {
775-
guard let serverInstance = server.wrappedValue,
776-
let url = URL(string: serverInstance.url) else {
777-
return
778-
}
779-
let api = DFAPI(url: url, token: serverInstance.token)
780-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["password": password ?? ""], selectedServer: serverInstance)
781-
await refreshFiles() // TODO: update local data instead of refresh
823+
private func setFilePassword(file: DFFile, password: String) async {
824+
let _ = await fileListManager.setFilePassword(fileID: file.id, password: password, onSuccess: nil)
782825
}
783826

784827
@MainActor

Django Files/Views/Preview.swift

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ struct FilePreviewView: View {
846846
.shadow(color: .black, radius: 3)
847847
Spacer()
848848
Menu {
849-
fileContextMenu(for: file, isPreviewing: true, isPrivate: file.private, expirationText: .constant(""), passwordText: .constant(""), fileNameText: .constant(""))
849+
fileContextMenu(for: file, isPreviewing: true, isPrivate: file.private, expirationText: $expirationText, passwordText: $passwordText, fileNameText: $fileNameText)
850850
.padding()
851851
} label: {
852852
Image(systemName: "ellipsis.circle")
@@ -942,39 +942,44 @@ struct FilePreviewView: View {
942942

943943
@MainActor
944944
private func toggleFilePrivacy(file: DFFile) async {
945-
guard let serverInstance = server.wrappedValue,
946-
let url = URL(string: serverInstance.url) else {
947-
return
945+
if let delegate = fileListDelegate {
946+
let _ = await delegate.setFilePrivate(fileID: file.id, isPrivate: !file.private, onSuccess: nil)
947+
} else {
948+
guard let serverInstance = server.wrappedValue,
949+
let url = URL(string: serverInstance.url) else {
950+
return
951+
}
952+
let api = DFAPI(url: url, token: serverInstance.token)
953+
let _ = await api.editFiles(fileIDs: [file.id], changes: ["private": !file.private], selectedServer: serverInstance)
948954
}
949-
950-
let api = DFAPI(url: url, token: serverInstance.token)
951-
// Toggle the private status (if currently private, make it public and vice versa)
952-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["private": !file.private], selectedServer: serverInstance)
953-
954-
// TODO: update private status
955955
}
956956

957957
@MainActor
958958
private func setFileExpr(file: DFFile, expr: String?) async {
959-
guard let serverInstance = server.wrappedValue,
960-
let url = URL(string: serverInstance.url) else {
961-
return
959+
if let delegate = fileListDelegate {
960+
let _ = await delegate.setFileExpiration(fileID: file.id, expr: expr ?? "", onSuccess: nil)
961+
} else {
962+
guard let serverInstance = server.wrappedValue,
963+
let url = URL(string: serverInstance.url) else {
964+
return
965+
}
966+
let api = DFAPI(url: url, token: serverInstance.token)
967+
let _ = await api.editFiles(fileIDs: [file.id], changes: ["expr": expr ?? ""], selectedServer: serverInstance)
962968
}
963-
964-
let api = DFAPI(url: url, token: serverInstance.token)
965-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["expr": expr ?? ""], selectedServer: serverInstance)
966-
// TODO: update local expr status
967969
}
968970

969971
@MainActor
970972
private func setFilePassword(file: DFFile, password: String?) async {
971-
guard let serverInstance = server.wrappedValue,
972-
let url = URL(string: serverInstance.url) else {
973-
return
973+
if let delegate = fileListDelegate {
974+
let _ = await delegate.setFilePassword(fileID: file.id, password: password ?? "", onSuccess: nil)
975+
} else {
976+
guard let serverInstance = server.wrappedValue,
977+
let url = URL(string: serverInstance.url) else {
978+
return
979+
}
980+
let api = DFAPI(url: url, token: serverInstance.token)
981+
let _ = await api.editFiles(fileIDs: [file.id], changes: ["password": password ?? ""], selectedServer: serverInstance)
974982
}
975-
let api = DFAPI(url: url, token: serverInstance.token)
976-
let _ = await api.editFiles(fileIDs: [file.id], changes: ["password": password ?? ""], selectedServer: serverInstance)
977-
// TODO: update local password status
978983
}
979984

980985

0 commit comments

Comments
 (0)