NCCapabilitiesView.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. // TEST
  11. @objc class NCHostingCapabilitiesView: NSObject {
  12. @objc func makeShipDetailsUI() -> UIViewController {
  13. let capabilitiesStatus = NCCapabilitiesViewOO()
  14. let view = NCCapabilitiesView(capabilitiesStatus: capabilitiesStatus)
  15. let vc = UIHostingController(rootView: view)
  16. vc.title = NSLocalizedString("_capabilities_", comment: "")
  17. return vc
  18. }
  19. }
  20. class NCCapabilitiesViewOO: ObservableObject {
  21. struct Capability: Identifiable, Hashable {
  22. let id = UUID()
  23. let text: String
  24. let image: UIImage
  25. let available: Bool
  26. }
  27. @Published var capabililies: [Capability] = []
  28. @Published var json = "Lorem ipsum dolor sit amet.\nEa voluptas aperiam aut inventore saepe in tenetur modi.\nCum 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"
  29. @Published var homeServer = ""
  30. init() {
  31. if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
  32. capabililies = [Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: true),
  33. Capability(text: "Externa site", image: UIImage(systemName: "network")!, available: false)
  34. ]
  35. homeServer = "https://cloud.nextcloud.com/remote.php.dav/files/marino/"
  36. } else {
  37. guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
  38. homeServer = NCUtilityFileSystem.shared.getHomeServer(urlBase: activeAccount.urlBase, userId: activeAccount.userId) + "/"
  39. getCapabilities(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. updateCapabilities(account: account)
  62. }
  63. func updateCapabilities(account: String) {
  64. var available: Bool = false
  65. capabililies.removeAll()
  66. json = ""
  67. // FILE SHARING
  68. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false)
  69. capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  70. // EXTERNAL SITE
  71. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSites, exists: true)
  72. capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: available))
  73. // E2EE
  74. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
  75. capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: available))
  76. // ACTIVITY
  77. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
  78. available = false
  79. } else {
  80. available = true
  81. }
  82. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
  83. // NOTIFICATION
  84. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
  85. available = false
  86. } else {
  87. available = true
  88. }
  89. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
  90. // DELETE FILES
  91. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
  92. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
  93. // TEXT - ONLYOFFICE
  94. var textEditor = false
  95. var onlyofficeEditors = false
  96. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  97. for editor in editors {
  98. if editor.editor == NCGlobal.shared.editorText {
  99. textEditor = true
  100. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  101. onlyofficeEditors = true
  102. }
  103. }
  104. }
  105. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  106. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  107. // COLLABORA
  108. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
  109. available = false
  110. } else {
  111. available = true
  112. }
  113. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  114. // USER STATUS
  115. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
  116. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
  117. // COMMENTS
  118. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
  119. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
  120. // LOCK FILE
  121. let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
  122. if hasLockCapability {
  123. available = false
  124. } else {
  125. available = true
  126. }
  127. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
  128. // GROUP FOLDERS
  129. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
  130. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
  131. if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  132. self.json = json
  133. }
  134. }
  135. }
  136. struct NCCapabilitiesView: View {
  137. @ObservedObject var capabilitiesViewOO: NCCapabilitiesViewOO
  138. init(capabilitiesStatus: NCCapabilitiesViewOO) {
  139. self.capabilitiesViewOO = capabilitiesStatus
  140. }
  141. var body: some View {
  142. VStack {
  143. List {
  144. Section {
  145. ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
  146. HStack {
  147. CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
  148. CapabilityStatus(available: capability.available)
  149. }
  150. }
  151. }
  152. Section {
  153. CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
  154. }
  155. Section {
  156. ScrollView(.horizontal) {
  157. Text(capabilitiesViewOO.json)
  158. .font(.system(size: 12))
  159. }
  160. }
  161. }
  162. }
  163. .frame(maxWidth: .infinity, alignment: .top)
  164. }
  165. struct CapabilityName: View {
  166. @State var text: String = ""
  167. @State var image: Image
  168. var body: some View {
  169. Label {
  170. Text(text)
  171. .font(.system(size: 15))
  172. .foregroundColor(Color(UIColor.systemGray))
  173. } icon: {
  174. image
  175. .renderingMode(.template)
  176. .foregroundColor(Color(UIColor.systemGray))
  177. }
  178. .frame(maxWidth: .infinity, alignment: .leading)
  179. }
  180. }
  181. struct CapabilityStatus: View {
  182. @State var available: Bool
  183. var body: some View {
  184. if available {
  185. Image(systemName: "checkmark.circle.fill")
  186. .foregroundColor(.green)
  187. } else {
  188. Image(systemName: "multiply.circle.fill")
  189. .foregroundColor(.red)
  190. }
  191. }
  192. }
  193. }
  194. struct NCCapabilitiesView_Previews: PreviewProvider {
  195. static var previews: some View {
  196. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO())
  197. }
  198. }