NCCapabilitiesView.swift 9.7 KB

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