Save GIFs Locally

This commit is contained in:
Joshua Higgins
2025-06-03 22:18:23 -04:00
parent a09e08763f
commit 8ce5adc766
8 changed files with 283 additions and 116 deletions

View File

@@ -22,8 +22,6 @@ class AddGIFViewController: UIViewController {
return textField
}()
private let previewGIFPlayer: GIFPlayerView = {
let player = GIFPlayerView()
player.clipsToBounds = true
@@ -56,8 +54,9 @@ class AddGIFViewController: UIViewController {
return button
}()
private var currentTask: URLSessionDataTask?
var onSaveGIF: ((GIF) -> Void)?
private var currentTask: Any?
private var downloadedGIFData: Data?
var onSaveGIF: ((String, Data) -> Void)?
var onCancel: (() -> Void)?
override func viewDidLoad() {
@@ -91,7 +90,7 @@ class AddGIFViewController: UIViewController {
urlTextField.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),
urlTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
urlTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
previewGIFPlayer.topAnchor.constraint(equalTo: urlTextField.bottomAnchor, constant: 16),
previewGIFPlayer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
previewGIFPlayer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
@@ -113,12 +112,12 @@ class AddGIFViewController: UIViewController {
}
private func setupActions() {
urlTextField.delegate = self
urlTextField.addTarget(self, action: #selector(urlTextDidChange), for: .editingChanged)
saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside)
cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
urlTextField.delegate = self
urlTextField.addTarget(self, action: #selector(urlTextDidChange), for: .editingChanged)
saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside)
cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
}
@objc private func urlTextDidChange() {
@@ -132,10 +131,13 @@ class AddGIFViewController: UIViewController {
}
private func loadGIFPreview(from urlString: String) {
// Cancel any existing task
currentTask?.cancel()
// Cancel any existing task if needed
if let task = currentTask as? URLSessionTask {
task.cancel()
}
currentTask = nil
guard let url = URL(string: urlString) else {
guard URL(string: urlString) != nil else {
saveButton.isEnabled = false
return
}
@@ -143,33 +145,34 @@ class AddGIFViewController: UIViewController {
loadingIndicator.startAnimating()
previewGIFPlayer.stopAnimating()
currentTask = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
DownloadService.shared.downloadGIF(from: urlString) { [weak self] data, error in
DispatchQueue.main.async {
guard let self = self else { return }
self.loadingIndicator.stopAnimating()
if let data = data, error == nil {
self.downloadedGIFData = data
self.previewGIFPlayer.loadGIF(from: data)
self.previewGIFPlayer.startAnimating()
self.saveButton.isEnabled = true
} else {
self.downloadedGIFData = nil
self.previewGIFPlayer.stopAnimating()
self.saveButton.isEnabled = false
}
}
}
currentTask?.resume()
}
@objc private func saveButtonTapped() {
guard let urlString = urlTextField.text, !urlString.isEmpty else { return }
let gif = GIF(urlString: urlString)
onSaveGIF?(gif)
dismiss(animated: true)
guard let urlString = urlTextField.text,
!urlString.isEmpty,
let gifData = downloadedGIFData
else { return }
onSaveGIF?(urlString, gifData)
dismiss(animated: true)
}
@objc private func cancelButtonTapped() {
@@ -179,8 +182,8 @@ class AddGIFViewController: UIViewController {
}
extension AddGIFViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}