NCCapabilitiesView.swift 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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.\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"
  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. updateCapabilities(account: activeAccount.account)
  39. }
  40. }
  41. func updateCapabilities(account: String) {
  42. var available: Bool = false
  43. capabililies.removeAll()
  44. json = ""
  45. // FILE SHARING
  46. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFileSharingApiEnabled, exists: false)
  47. capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  48. // EXTERNAL SITE
  49. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesExternalSites, exists: true)
  50. capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: available))
  51. // E2EE
  52. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEEnabled, exists: false)
  53. capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: available))
  54. // ACTIVITY
  55. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesActivity) == nil {
  56. available = false
  57. } else {
  58. available = true
  59. }
  60. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: available))
  61. // NOTIFICATION
  62. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesNotification) == nil {
  63. available = false
  64. } else {
  65. available = true
  66. }
  67. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: available))
  68. // DELETE FILES
  69. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesUndelete, exists: false)
  70. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: available))
  71. // TEXT - ONLYOFFICE
  72. var textEditor = false
  73. var onlyofficeEditors = false
  74. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  75. for editor in editors {
  76. if editor.editor == NCGlobal.shared.editorText {
  77. textEditor = true
  78. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  79. onlyofficeEditors = true
  80. }
  81. }
  82. }
  83. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  84. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  85. // COLLABORA
  86. if NCManageDatabase.shared.getCapabilitiesServerArray(account: account, elements: NCElementsJSON.shared.capabilitiesRichdocumentsMimetypes) == nil {
  87. available = false
  88. } else {
  89. available = true
  90. }
  91. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: available))
  92. // USER STATUS
  93. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesUserStatusEnabled, exists: false)
  94. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: available))
  95. // COMMENTS
  96. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesFilesComments, exists: false)
  97. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: available))
  98. // LOCK FILE
  99. let hasLockCapability = NCManageDatabase.shared.getCapabilitiesServerInt(account: account, elements: NCElementsJSON.shared.capabilitiesFilesLockVersion) >= 1
  100. if hasLockCapability {
  101. available = false
  102. } else {
  103. available = true
  104. }
  105. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: available))
  106. // GROUP FOLDERS
  107. available = NCManageDatabase.shared.getCapabilitiesServerBool(account: account, elements: NCElementsJSON.shared.capabilitiesGroupfoldersEnabled, exists: false)
  108. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: available))
  109. if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  110. self.json = json
  111. }
  112. }
  113. }
  114. struct NCCapabilitiesView: View {
  115. @ObservedObject var capabilitiesViewOO: NCCapabilitiesViewOO
  116. init(capabilitiesStatus: NCCapabilitiesViewOO) {
  117. self.capabilitiesViewOO = capabilitiesStatus
  118. }
  119. var body: some View {
  120. VStack {
  121. List {
  122. Section {
  123. ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
  124. HStack {
  125. CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
  126. CapabilityStatus(available: capability.available)
  127. }
  128. }
  129. }
  130. Section {
  131. CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
  132. }
  133. Section {
  134. ScrollView(.horizontal) {
  135. Text(capabilitiesViewOO.json)
  136. .font(.system(size: 12))
  137. }
  138. }
  139. }
  140. }
  141. .frame(maxWidth: .infinity, alignment: .top)
  142. }
  143. struct CapabilityName: View {
  144. @State var text: String = ""
  145. @State var image: Image
  146. var body: some View {
  147. Label {
  148. Text(text)
  149. .font(.system(size: 15))
  150. .foregroundColor(Color(UIColor.systemGray))
  151. } icon: {
  152. image
  153. .renderingMode(.template)
  154. .foregroundColor(Color(UIColor.systemGray))
  155. }
  156. .frame(maxWidth: .infinity, alignment: .leading)
  157. }
  158. }
  159. struct CapabilityStatus: View {
  160. @State var available: Bool
  161. var body: some View {
  162. if available {
  163. Image(systemName: "checkmark.circle.fill")
  164. .foregroundColor(.green)
  165. } else {
  166. Image(systemName: "multiply.circle.fill")
  167. .foregroundColor(.red)
  168. }
  169. }
  170. }
  171. }
  172. struct NCCapabilitiesView_Previews: PreviewProvider {
  173. static var previews: some View {
  174. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO())
  175. }
  176. }