NCCapabilitiesView.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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() {
  30. if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
  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, let data = data {
  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. // EXTERNAL SITE
  70. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSites, 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. // ACTIVITY
  76. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
  77. available = false
  78. } else {
  79. available = true
  80. }
  81. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
  82. // NOTIFICATION
  83. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
  84. available = false
  85. } else {
  86. available = true
  87. }
  88. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
  89. // DELETE FILES
  90. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
  91. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
  92. // TEXT - ONLYOFFICE
  93. var textEditor = false
  94. var onlyofficeEditors = false
  95. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  96. for editor in editors {
  97. if editor.editor == NCGlobal.shared.editorText {
  98. textEditor = true
  99. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  100. onlyofficeEditors = true
  101. }
  102. }
  103. }
  104. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  105. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  106. // COLLABORA
  107. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
  108. available = false
  109. } else {
  110. available = true
  111. }
  112. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  113. // USER STATUS
  114. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
  115. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
  116. // COMMENTS
  117. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
  118. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
  119. // LOCK FILE
  120. let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
  121. if hasLockCapability {
  122. available = false
  123. } else {
  124. available = true
  125. }
  126. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
  127. // GROUP FOLDERS
  128. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
  129. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
  130. if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  131. self.json = json
  132. }
  133. }
  134. }
  135. struct NCCapabilitiesView: View {
  136. @ObservedObject var capabilitiesViewOO: NCCapabilitiesViewOO
  137. init(capabilitiesStatus: NCCapabilitiesViewOO) {
  138. self.capabilitiesViewOO = capabilitiesStatus
  139. }
  140. var body: some View {
  141. VStack {
  142. List {
  143. Section {
  144. ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
  145. HStack {
  146. CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
  147. CapabilityStatus(available: capability.available)
  148. }
  149. }
  150. }
  151. Section {
  152. CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
  153. }
  154. Section {
  155. ScrollView(.horizontal) {
  156. Text(capabilitiesViewOO.json)
  157. .font(.system(size: 12))
  158. }
  159. }
  160. }
  161. }
  162. .frame(maxWidth: .infinity, alignment: .top)
  163. }
  164. struct CapabilityName: View {
  165. @State var text: String = ""
  166. @State var image: Image
  167. var body: some View {
  168. Label {
  169. Text(text)
  170. .font(.system(size: 15))
  171. .foregroundColor(Color(UIColor.systemGray))
  172. } icon: {
  173. image
  174. .renderingMode(.template)
  175. .foregroundColor(Color(UIColor.systemGray))
  176. }
  177. .frame(maxWidth: .infinity, alignment: .leading)
  178. }
  179. }
  180. struct CapabilityStatus: View {
  181. @State var available: Bool
  182. var body: some View {
  183. if available {
  184. Image(systemName: "checkmark.circle.fill")
  185. .foregroundColor(.green)
  186. } else {
  187. Image(systemName: "multiply.circle.fill")
  188. .foregroundColor(.red)
  189. }
  190. }
  191. }
  192. }
  193. struct NCCapabilitiesView_Previews: PreviewProvider {
  194. static var previews: some View {
  195. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO())
  196. }
  197. }