NCCapabilitiesView.swift 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. Qui 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: $capabilitiesStatus.json)
  141. }
  142. }
  143. }
  144. .frame(maxWidth: .infinity, alignment: .top)
  145. }
  146. }
  147. struct Capability: View {
  148. @State var text: String = ""
  149. @State var image: Image
  150. var body: some View {
  151. Label {
  152. Text(text)
  153. .font(.system(size: 15))
  154. .foregroundColor(Color(UIColor.systemGray))
  155. } icon: {
  156. image
  157. .renderingMode(.template)
  158. .foregroundColor(Color(UIColor.systemGray))
  159. }
  160. .frame(maxWidth: .infinity, alignment: .leading)
  161. }
  162. }
  163. struct CapabilityAvailable: View {
  164. @State var available: Bool
  165. var body: some View {
  166. if available {
  167. Image(systemName: "checkmark.circle.fill")
  168. .foregroundColor(.green)
  169. } else {
  170. Image(systemName: "multiply.circle.fill")
  171. .foregroundColor(.red)
  172. }
  173. }
  174. }
  175. struct NCCapabilitiesView_Previews: PreviewProvider {
  176. static var previews: some View {
  177. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesStatus(preview: true))
  178. }
  179. }