NCCapabilitiesView.swift 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. // FILE SHARING
  45. capabililies.append(Capability(text: "File sharing", image: UIImage(named: "share")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: NCGlobal.shared.capabilityFileSharingApiEnabled))
  46. // EXTERNAL SITE
  47. capabililies.append(Capability(text: "External site", image: UIImage(systemName: "network")!, available: NCGlobal.shared.capabilityExternalSites))
  48. // E2EE
  49. capabililies.append(Capability(text: "End-to-End Encryption", image: UIImage(systemName: "lock")!, available: NCGlobal.shared.capabilityE2EEEnabled))
  50. // ACTIVITY
  51. capabililies.append(Capability(text: "Activity", image: UIImage(systemName: "bolt")!, available: !NCGlobal.shared.capabilityActivity.isEmpty))
  52. // NOTIFICATION
  53. capabililies.append(Capability(text: "Notification", image: UIImage(systemName: "bell")!, available: !NCGlobal.shared.capabilityNotification.isEmpty))
  54. // DELETE FILES
  55. capabililies.append(Capability(text: "Deleted files", image: UIImage(systemName: "trash")!, available: NCGlobal.shared.capabilityFilesUndelete))
  56. // TEXT - ONLYOFFICE
  57. var textEditor = false
  58. var onlyofficeEditors = false
  59. if let editors = NCManageDatabase.shared.getDirectEditingEditors(account: account) {
  60. for editor in editors {
  61. if editor.editor == NCGlobal.shared.editorText {
  62. textEditor = true
  63. } else if editor.editor == NCGlobal.shared.editorOnlyoffice {
  64. onlyofficeEditors = true
  65. }
  66. }
  67. }
  68. capabililies.append(Capability(text: "Text", image: UIImage(named: "text")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: textEditor))
  69. capabililies.append(Capability(text: "ONLYOFFICE", image: UIImage(named: "onlyoffice")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: onlyofficeEditors))
  70. // COLLABORA
  71. capabililies.append(Capability(text: "Collabora", image: UIImage(named: "collabora")!.resizeImage(size: CGSize(width: 25, height: 25))!, available: !NCGlobal.shared.capabilityRichdocumentsMimetypes.isEmpty))
  72. // USER STATUS
  73. capabililies.append(Capability(text: "User Status", image: UIImage(systemName: "moon")!, available: NCGlobal.shared.capabilityUserStatusEnabled))
  74. // COMMENTS
  75. capabililies.append(Capability(text: "Comments", image: UIImage(systemName: "ellipsis.bubble")!, available: NCGlobal.shared.capabilityFilesComments))
  76. // LOCK FILE
  77. capabililies.append(Capability(text: "Lock file", image: UIImage(systemName: "lock")!, available: !NCGlobal.shared.capabilityFilesLockVersion.isEmpty))
  78. // GROUP FOLDERS
  79. capabililies.append(Capability(text: "Group folders", image: UIImage(systemName: "person.2")!, available: NCGlobal.shared.capabilityGroupfoldersEnabled))
  80. // if let json = NCManageDatabase.shared.getCapabilities(account: account) {
  81. // self.json = json
  82. // }
  83. }
  84. }
  85. struct NCCapabilitiesView: View {
  86. @ObservedObject var capabilitiesViewOO: NCCapabilitiesViewOO
  87. init(capabilitiesStatus: NCCapabilitiesViewOO) {
  88. self.capabilitiesViewOO = capabilitiesStatus
  89. }
  90. var body: some View {
  91. VStack {
  92. List {
  93. Section {
  94. ForEach(capabilitiesViewOO.capabililies, id: \.id) { capability in
  95. HStack {
  96. CapabilityName(text: capability.text, image: Image(uiImage: capability.image))
  97. CapabilityStatus(available: capability.available)
  98. }
  99. }
  100. }
  101. Section {
  102. CapabilityName(text: capabilitiesViewOO.homeServer, image: Image(uiImage: UIImage(systemName: "house")!))
  103. }
  104. /*
  105. Section {
  106. ScrollView(.horizontal) {
  107. Text(capabilitiesViewOO.json)
  108. .font(.system(size: 12))
  109. }
  110. }
  111. */
  112. }
  113. }
  114. .frame(maxWidth: .infinity, alignment: .top)
  115. }
  116. struct CapabilityName: View {
  117. @State var text: String = ""
  118. @State var image: Image
  119. var body: some View {
  120. Label {
  121. Text(text)
  122. .font(.system(size: 15))
  123. .foregroundColor(Color(UIColor.systemGray))
  124. } icon: {
  125. image
  126. .renderingMode(.template)
  127. .foregroundColor(Color(UIColor.systemGray))
  128. }
  129. .frame(maxWidth: .infinity, alignment: .leading)
  130. }
  131. }
  132. struct CapabilityStatus: View {
  133. @State var available: Bool
  134. var body: some View {
  135. if available {
  136. Image(systemName: "checkmark.circle.fill")
  137. .foregroundColor(.green)
  138. } else {
  139. Image(systemName: "multiply.circle.fill")
  140. .foregroundColor(.red)
  141. }
  142. }
  143. }
  144. }
  145. struct NCCapabilitiesView_Previews: PreviewProvider {
  146. static var previews: some View {
  147. NCCapabilitiesView(capabilitiesStatus: NCCapabilitiesViewOO())
  148. }
  149. }