NCCapabilitiesView.swift 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. @Published var json = "Lorem ipsum dolor sit amet. Ea voluptas aperiam aut inventore saepe in tenetur modi. Cum sint tempore sed maiores quos aut quaerat deleniti./nQui beatae quia qui repellat sunt in Quis libero aut quidem porro non explicabo tenetur et natus doloribus non voluptatum consequatur."
  28. init(preview: Bool = false) {
  29. if preview {
  30. capabililies = [Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: true),
  31. Capability(text: "Externa site", image: UIImage(systemName: "network")!, available: false)
  32. ]
  33. } else {
  34. guard let account = NCManageDatabase.shared.getActiveAccount()?.account else { return }
  35. getCapabilities(account: account)
  36. updateCapabilities(account: account)
  37. }
  38. }
  39. func getCapabilities(account: String) {
  40. NextcloudKit.shared.getCapabilities { account, data, error in
  41. if error == .success && data != nil {
  42. NCManageDatabase.shared.addCapabilitiesJSon(data!, account: account)
  43. let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
  44. if serverVersionMajor >= NCGlobal.shared.nextcloudVersion18 {
  45. NextcloudKit.shared.NCTextObtainEditorDetails { account, editors, creators, _, error in
  46. if error == .success {
  47. NCManageDatabase.shared.addDirectEditing(account: account, editors: editors, creators: creators)
  48. self.updateCapabilities(account: account)
  49. }
  50. }
  51. } else {
  52. self.updateCapabilities(account: account)
  53. }
  54. } else {
  55. self.updateCapabilities(account: account)
  56. }
  57. }
  58. }
  59. func updateCapabilities(account: String) {
  60. var available: Bool = false
  61. capabililies.removeAll()
  62. self.json = ""
  63. // File Sharing
  64. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false)
  65. capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  66. // ExternalSites
  67. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSitesExists, exists: true)
  68. capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: available))
  69. // E2EE
  70. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
  71. capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: available))
  72. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
  73. available = false
  74. } else {
  75. available = true
  76. }
  77. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
  78. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
  79. available = false
  80. } else {
  81. available = true
  82. }
  83. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
  84. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
  85. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
  86. var textEditor = false
  87. var onlyofficeEditors = false
  88. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  89. for editor in editors {
  90. if editor.editor == NCGlobal.shared.editorText {
  91. textEditor = true
  92. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  93. onlyofficeEditors = true
  94. }
  95. }
  96. }
  97. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  98. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  99. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
  100. available = false
  101. } else {
  102. available = true
  103. }
  104. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  105. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
  106. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
  107. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
  108. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
  109. let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
  110. if hasLockCapability {
  111. available = false
  112. } else {
  113. available = true
  114. }
  115. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
  116. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
  117. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
  118. if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  119. self.json = json
  120. }
  121. }
  122. }
  123. struct NCCapabilitiesView: View {
  124. @ObservedObject var capabilitiesStatus: NCCapabilitiesStatus
  125. init(capabilitiesStatus: NCCapabilitiesStatus) {
  126. self.capabilitiesStatus = capabilitiesStatus
  127. }
  128. var body: some View {
  129. VStack {
  130. List {
  131. Section {
  132. ForEach(capabilitiesStatus.capabililies, id: \.id) { capability in
  133. HStack {
  134. Capability(text: capability.text, image: Image(uiImage: capability.image))
  135. CapabilityAvailable(available: capability.available)
  136. }
  137. }
  138. }
  139. Section {
  140. TextEditor(text: .constant(capabilitiesStatus.json))
  141. .font(.system(size: 12))
  142. .frame(maxWidth: .infinity, maxHeight: .infinity)
  143. }
  144. }
  145. }
  146. .frame(maxWidth: .infinity, alignment: .top)
  147. }
  148. }
  149. struct Capability: View {
  150. @State var text: String = ""
  151. @State var image: Image
  152. var body: some View {
  153. Label {
  154. Text(text)
  155. .font(.system(size: 15))
  156. .foregroundColor(Color(UIColor.systemGray))
  157. } icon: {
  158. image
  159. .renderingMode(.template)
  160. .foregroundColor(Color(UIColor.systemGray))
  161. }
  162. .frame(maxWidth: .infinity, alignment: .leading)
  163. }
  164. }
  165. struct CapabilityAvailable: View {
  166. @State var available: Bool
  167. var body: some View {
  168. if available {
  169. Image(systemName: "checkmark.circle.fill")
  170. .foregroundColor(.green)
  171. } else {
  172. Image(systemName: "multiply.circle.fill")
  173. .foregroundColor(.red)
  174. }
  175. }
  176. }
  177. struct NCCapabilitiesView_Previews: PreviewProvider {
  178. static var previews: some View {
  179. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesStatus(preview: true))
  180. }
  181. }