NCCapabilitiesView.swift 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 = NCCapabilitiesViewOO()
  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 NCCapabilitiesViewOO: 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\n.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.\n"
  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 capabilitiesViewOO: NCCapabilitiesViewOO
  128. init(capabilitiesStatus: NCCapabilitiesViewOO) {
  129. self.capabilitiesViewOO = capabilitiesStatus
  130. }
  131. var body: some View {
  132. VStack {
  133. List {
  134. Section {
  135. ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
  136. HStack {
  137. CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
  138. CapabilityStatus(available: capability.available)
  139. }
  140. }
  141. }
  142. Section {
  143. CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
  144. }
  145. Section {
  146. ScrollView(.horizontal) {
  147. Text(capabilitiesViewOO.json)
  148. .font(.system(size: 12))
  149. }
  150. }
  151. }
  152. }
  153. .frame(maxWidth: .infinity, alignment: .top)
  154. }
  155. struct CapabilityName: View {
  156. @State var text: String = ""
  157. @State var image: Image
  158. var body: some View {
  159. Label {
  160. Text(text)
  161. .font(.system(size: 15))
  162. .foregroundColor(Color(UIColor.systemGray))
  163. } icon: {
  164. image
  165. .renderingMode(.template)
  166. .foregroundColor(Color(UIColor.systemGray))
  167. }
  168. .frame(maxWidth: .infinity, alignment: .leading)
  169. }
  170. }
  171. struct CapabilityStatus: View {
  172. @State var available: Bool
  173. var body: some View {
  174. if available {
  175. Image(systemName: "checkmark.circle.fill")
  176. .foregroundColor(.green)
  177. } else {
  178. Image(systemName: "multiply.circle.fill")
  179. .foregroundColor(.red)
  180. }
  181. }
  182. }
  183. }
  184. struct NCCapabilitiesView_Previews: PreviewProvider {
  185. static var previews: some View {
  186. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO(preview: true))
  187. }
  188. }