NCCapabilitiesView.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. //
  2. // NCCapabilitiesView.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 19/05/23.
  6. // Copyright © 2023 Marino Faggiana. All rights reserved.
  7. //
  8. import SwiftUI
  9. import NextcloudKit
  10. @objc class NCHostingCapabilitiesView: NSObject {
  11. @objc func makeShipDetailsUI() -> UIViewController {
  12. let capabilitiesStatus = NCCapabilitiesStatus()
  13. let view = NCCapabilitiesView(capabilitiesStatus: capabilitiesStatus)
  14. let vc = UIHostingController(rootView: view)
  15. vc.title = NSLocalizedString("_capabilities_", comment: "")
  16. return vc
  17. }
  18. }
  19. class NCCapabilitiesStatus: ObservableObject {
  20. struct Capability: Identifiable, Hashable {
  21. let id = UUID()
  22. let text: String
  23. let image: UIImage
  24. let available: Bool
  25. }
  26. @Published var capabililies: [Capability] = []
  27. init(preview: Bool = false) {
  28. if preview {
  29. capabililies = [Capability(text: "File sharing", image: UIImage(named: "share")!, available: true),
  30. Capability(text: "Externa site", image: UIImage(systemName: "network")!, available: false)
  31. ]
  32. } else {
  33. guard let account = NCManageDatabase.shared.getActiveAccount()?.account else { return }
  34. getCapabilities(account: account)
  35. updateCapabilities(account: account)
  36. }
  37. }
  38. func getCapabilities(account: String) {
  39. NextcloudKit.shared.getCapabilities { account, data, error in
  40. if error == .success && data != nil {
  41. NCManageDatabase.shared.addCapabilitiesJSon(data!, account: account)
  42. let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
  43. if serverVersionMajor >= NCGlobal.shared.nextcloudVersion18 {
  44. NextcloudKit.shared.NCTextObtainEditorDetails { account, editors, creators, _, error in
  45. if error == .success {
  46. NCManageDatabase.shared.addDirectEditing(account: account, editors: editors, creators: creators)
  47. self.updateCapabilities(account: account)
  48. }
  49. }
  50. } else {
  51. self.updateCapabilities(account: account)
  52. }
  53. } else {
  54. self.updateCapabilities(account: account)
  55. }
  56. }
  57. }
  58. func updateCapabilities(account: String) {
  59. var available: Bool = false
  60. capabililies.removeAll()
  61. // File Sharing
  62. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false)
  63. capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  64. // ExternalSites
  65. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSitesExists, exists: true)
  66. capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: available))
  67. // E2EE
  68. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
  69. capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: available))
  70. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
  71. available = false
  72. } else {
  73. available = true
  74. }
  75. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
  76. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
  77. available = false
  78. } else {
  79. available = true
  80. }
  81. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
  82. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
  83. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
  84. var textEditor = false
  85. var onlyofficeEditors = false
  86. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  87. for editor in editors {
  88. if editor.editor == NCGlobal.shared.editorText {
  89. textEditor = true
  90. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  91. onlyofficeEditors = true
  92. }
  93. }
  94. }
  95. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  96. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  97. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
  98. available = false
  99. } else {
  100. available = true
  101. }
  102. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  103. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
  104. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
  105. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
  106. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
  107. let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
  108. if hasLockCapability {
  109. available = false
  110. } else {
  111. available = true
  112. }
  113. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
  114. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
  115. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
  116. if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  117. // self.capabilitiesText = text
  118. }
  119. }
  120. }
  121. struct NCCapabilitiesView: View {
  122. @ObservedObject var capabilitiesStatus: NCCapabilitiesStatus
  123. init(capabilitiesStatus: NCCapabilitiesStatus) {
  124. self.capabilitiesStatus = capabilitiesStatus
  125. }
  126. var body: some View {
  127. VStack {
  128. List {
  129. ForEach(capabilitiesStatus.capabililies, id: \.id) { capability in
  130. HStack {
  131. Capability(text: capability.text, image: Image(uiImage: capability.image))
  132. CapabilityAvailable(available: capability.available)
  133. }
  134. }
  135. }
  136. }
  137. .frame(maxWidth: .infinity, alignment: .top)
  138. }
  139. }
  140. struct Capability: View {
  141. @State var text: String = ""
  142. @State var image: Image
  143. var body: some View {
  144. Label {
  145. Text(text)
  146. .font(.system(size: 15))
  147. .foregroundColor(Color(UIColor.systemGray))
  148. } icon: {
  149. image
  150. .renderingMode(.template)
  151. .foregroundColor(Color(UIColor.systemGray))
  152. }
  153. .frame(maxWidth: .infinity, alignment: .leading)
  154. }
  155. }
  156. struct CapabilityAvailable: View {
  157. @State var available: Bool
  158. var body: some View {
  159. if available {
  160. Image(systemName: "checkmark.circle.fill")
  161. .foregroundColor(.green)
  162. } else {
  163. Image(systemName: "multiply.circle.fill")
  164. .foregroundColor(.red)
  165. }
  166. }
  167. }
  168. struct NCCapabilitiesView_Previews: PreviewProvider {
  169. static var previews: some View {
  170. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesStatus(preview: true))
  171. }
  172. }