ReferenceView.swift 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //
  2. // SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. class ReferenceView: UIView {
  6. @IBOutlet var contentView: UIView!
  7. @IBOutlet var referenceView: UIView!
  8. @IBOutlet weak var activityIndicatorView: UIView!
  9. var activityIndicator: MDCActivityIndicator = MDCActivityIndicator(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
  10. override init(frame: CGRect) {
  11. super.init(frame: frame)
  12. commonInit()
  13. }
  14. required init?(coder aDecoder: NSCoder) {
  15. super.init(coder: aDecoder)
  16. commonInit()
  17. }
  18. func commonInit() {
  19. Bundle.main.loadNibNamed("ReferenceView", owner: self, options: nil)
  20. contentView.frame = self.bounds
  21. contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  22. activityIndicator.radius = 12.0
  23. activityIndicator.cycleColors = [UIColor.lightGray]
  24. showIndicatorView()
  25. activityIndicatorView.addSubview(activityIndicator)
  26. layer.cornerRadius = 8.0
  27. layer.masksToBounds = true
  28. layer.borderWidth = 1.0
  29. layer.borderColor = NCAppBranding.placeholderColor().cgColor
  30. self.addSubview(contentView)
  31. }
  32. func prepareForReuse() {
  33. referenceView.subviews.forEach({ $0.removeFromSuperview() })
  34. showIndicatorView()
  35. }
  36. func showIndicatorView() {
  37. activityIndicator.isHidden = false
  38. activityIndicator.startAnimating()
  39. }
  40. func hideIndicatorView() {
  41. activityIndicator.stopAnimating()
  42. activityIndicator.isHidden = true
  43. }
  44. func showErrorView(for url: String) {
  45. let defaultView = ReferenceDefaultView(frame: self.frame)
  46. defaultView.update(for: nil, and: url)
  47. defaultView.frame = self.bounds
  48. defaultView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  49. referenceView.addSubview(defaultView)
  50. }
  51. func update(for sharedDeckCard: NCDeckCardParameter) {
  52. let deckView = ReferenceDeckView(frame: self.frame)
  53. deckView.update(for: sharedDeckCard)
  54. deckView.frame = self.bounds
  55. deckView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  56. referenceView.addSubview(deckView)
  57. self.hideIndicatorView()
  58. }
  59. func update(for references: [String: [String: AnyObject]]?, and url: String) {
  60. referenceView.subviews.forEach({ $0.removeFromSuperview() })
  61. guard let references = references,
  62. !references.isEmpty else {
  63. showErrorView(for: url)
  64. hideIndicatorView()
  65. return
  66. }
  67. let referenceArray = Array(references.values)
  68. let firstReference = referenceArray[0]
  69. let richObjectType = firstReference["richObjectType"] as? String
  70. var foundReferenceView = false
  71. if richObjectType == "integration_github" || richObjectType == "integration_github_issue_pr",
  72. let reference = firstReference["richObject"] as? [String: AnyObject] {
  73. let githubView = ReferenceGithubView(frame: self.frame)
  74. githubView.update(for: reference, and: url)
  75. githubView.frame = self.bounds
  76. githubView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  77. referenceView.addSubview(githubView)
  78. foundReferenceView = true
  79. } else if richObjectType == "integration_github_code_permalink",
  80. let reference = firstReference["richObject"] as? [String: AnyObject] {
  81. let githubPermalinkView = ReferenceGithubPermalinkView(frame: self.frame)
  82. githubPermalinkView.update(for: reference, and: url)
  83. githubPermalinkView.frame = self.bounds
  84. githubPermalinkView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  85. referenceView.addSubview(githubPermalinkView)
  86. foundReferenceView = true
  87. } else if richObjectType == "integration_zammad",
  88. let reference = firstReference["richObject"] as? [String: AnyObject] {
  89. let zammadView = ReferenceZammadView(frame: self.frame)
  90. zammadView.update(for: reference, and: url)
  91. zammadView.frame = self.bounds
  92. zammadView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  93. referenceView.addSubview(zammadView)
  94. foundReferenceView = true
  95. } else if richObjectType == "deck-card",
  96. let reference = firstReference["richObject"] as? [String: AnyObject] {
  97. let deckView = ReferenceDeckView(frame: self.frame)
  98. deckView.update(for: reference, and: url)
  99. deckView.frame = self.bounds
  100. deckView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  101. referenceView.addSubview(deckView)
  102. foundReferenceView = true
  103. } else if richObjectType == "call",
  104. let reference = firstReference["richObject"] as? [String: AnyObject],
  105. let openGraph = firstReference["openGraphObject"] as? [String: String?] {
  106. let talkView = ReferenceTalkView(frame: self.frame)
  107. talkView.update(for: reference, and: openGraph, and: url)
  108. talkView.frame = self.bounds
  109. talkView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  110. referenceView.addSubview(talkView)
  111. foundReferenceView = true
  112. } else if richObjectType == "integration_giphy_gif",
  113. let reference = firstReference["richObject"] as? [String: AnyObject] {
  114. let giphyView = ReferenceGiphyView(frame: self.frame)
  115. giphyView.update(for: reference, and: url)
  116. giphyView.frame = self.bounds
  117. giphyView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  118. referenceView.addSubview(giphyView)
  119. foundReferenceView = true
  120. } else if let reference = firstReference["openGraphObject"] as? [String: String?] {
  121. let defaultView = ReferenceDefaultView(frame: self.frame)
  122. defaultView.update(for: reference, and: url)
  123. defaultView.frame = self.bounds
  124. defaultView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  125. referenceView.addSubview(defaultView)
  126. foundReferenceView = true
  127. }
  128. if !foundReferenceView {
  129. showErrorView(for: url)
  130. }
  131. hideIndicatorView()
  132. }
  133. }