ReferenceGiphyView.swift 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import Foundation
  6. import SwiftyGif
  7. @objcMembers class ReferenceGiphyView: UIView, SwiftyGifDelegate {
  8. @IBOutlet var contentView: UIView!
  9. @IBOutlet weak var referenceThumbnailView: UIImageView!
  10. @IBOutlet weak var referenceName: UILabel!
  11. @IBOutlet weak var referenceDescription: UITextView!
  12. @IBOutlet weak var referenceLink: UILabel!
  13. var url: String?
  14. override init(frame: CGRect) {
  15. super.init(frame: frame)
  16. commonInit()
  17. }
  18. required init?(coder aDecoder: NSCoder) {
  19. super.init(coder: aDecoder)
  20. commonInit()
  21. }
  22. func commonInit() {
  23. Bundle.main.loadNibNamed("ReferenceDefaultView", owner: self, options: nil)
  24. contentView.frame = self.bounds
  25. contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  26. referenceName.text = ""
  27. referenceDescription.text = ""
  28. referenceLink.text = ""
  29. // Remove padding from textView
  30. referenceDescription.textContainerInset = .zero
  31. referenceDescription.textContainer.lineFragmentPadding = .zero
  32. referenceThumbnailView.layer.cornerRadius = 8.0
  33. referenceThumbnailView.layer.masksToBounds = true
  34. let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
  35. contentView.addGestureRecognizer(tap)
  36. self.addSubview(contentView)
  37. }
  38. func handleTap() {
  39. if let url = url {
  40. NCUtils.openLinkInBrowser(link: url)
  41. }
  42. }
  43. func update(for reference: [String: AnyObject], and url: String) {
  44. self.url = url
  45. referenceName.text = reference["title"] as? String ?? ""
  46. referenceDescription.text = reference["alt_text"] as? String ?? ""
  47. referenceLink.text = url
  48. if referenceDescription.text.isEmpty {
  49. referenceDescription.isHidden = true
  50. }
  51. if let proxiedUrlString = reference["proxied_url"] as? String, let proxiedUrl = URL(string: proxiedUrlString) {
  52. referenceThumbnailView.delegate = self
  53. referenceThumbnailView.setGifFromURL(proxiedUrl, showLoader: false)
  54. } else {
  55. setPlaceholderThumbnail()
  56. }
  57. }
  58. func setPlaceholderThumbnail() {
  59. referenceThumbnailView.image = UIImage(systemName: "safari")?.withTintColor(UIColor.secondarySystemFill, renderingMode: .alwaysOriginal)
  60. }
  61. func gifURLDidFail(sender: UIImageView, url: URL, error: (any Error)?) {
  62. // In case we were unable to load or process the gif, fall back to the normal thumbnail
  63. if let request = NCAPIController.sharedInstance().createReferenceThumbnailRequest(forUrl: url.absoluteString) {
  64. referenceThumbnailView.setImageWith(request, placeholderImage: nil, success: nil) { _, _, _ in
  65. self.setPlaceholderThumbnail()
  66. }
  67. }
  68. }
  69. }