Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace yytext, Complete refactor of theme code, Redesign of Profile and Inbox views #1144

Merged
merged 27 commits into from
Dec 19, 2020
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
cbb0f46
Fixed Profile bugs
ccrama Dec 14, 2020
6591922
Start of fixing new SwiftLint errors
ccrama Dec 14, 2020
517709e
LinkParser fixes
ccrama Dec 15, 2020
1c2e5cf
Be gone, YYText
ccrama Dec 15, 2020
39143fa
Got link handling on CommentDepthCell to a usable state, Need to conv…
ccrama Dec 16, 2020
1a6ffca
Moved new preview code to LinkCellView, Added new ProfilePreviewVC
ccrama Dec 16, 2020
103d69e
Fixed text views to support UIContextInteractions
ccrama Dec 16, 2020
8d02c5a
Fixed height constraints in TDSV, Fixed quote views
ccrama Dec 16, 2020
6ed5860
Fixed quote height estimation, Fixed table display
ccrama Dec 16, 2020
e616bd3
Fixed tapping at the top of CommentDepthCell
ccrama Dec 17, 2020
b085fff
Better context menu preview creation and interaction
ccrama Dec 17, 2020
a11e778
Complete refactor of non link/comment cells
ccrama Dec 17, 2020
6c8ac21
Code cleanup
ccrama Dec 17, 2020
8316c54
Fixed crashing on new cells
ccrama Dec 17, 2020
fb1d86d
Fix superscript
colejd Dec 17, 2020
f8a82d7
Replace only relevant attributes when fixing superscript
colejd Dec 17, 2020
c0a1119
Show relevant user actions for profile content preview
ccrama Dec 17, 2020
c5186c9
Complete redesign of CommentCellView
ccrama Dec 18, 2020
9e0c042
Complete redesign of MessageCellView
ccrama Dec 18, 2020
f73a80e
Complete refactor of day/night theming, Breaks iOS 11 and 12 night mode
ccrama Dec 18, 2020
16e69f1
Fixed multi-quotes breaking TDSV
ccrama Dec 18, 2020
1c4c30e
Fixed 'Loading...' on More cells
ccrama Dec 18, 2020
98ad47c
Fix iOS 11 and 12 support
ccrama Dec 18, 2020
6179745
Fixed Swift Lint errors
ccrama Dec 18, 2020
1b19101
Fixed thumbnail images not changing colors with theme
ccrama Dec 18, 2020
f37f9df
Bug fixes, Fixed scrolling tables/code blocks on comments without int…
ccrama Dec 19, 2020
1707cce
Fixed Comments gestures
ccrama Dec 19, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ target 'Slide for Reddit' do
pod 'SwiftLinkPreview', '~> 3.0.1'
pod 'DTCoreText', :git => 'https://github.com/Cocoanetics/DTCoreText'
pod 'RLBAlertsPickers', :git => 'https://github.com/ccrama/Alerts-Pickers'
pod 'YYText'
pod 'Alamofire', '~> 4.3'
pod 'SwiftyJSON', :git => 'https://github.com/ccrama/SwiftyJSON.git', :branch => 'hotfix-xcode12'
pod "YoutubePlayer-in-WKWebView", "~> 0.3.0"
Expand Down Expand Up @@ -55,4 +54,4 @@ target 'Slide for Reddit' do

end

pod 'SwiftLint'
pod 'SwiftLint'
6 changes: 1 addition & 5 deletions Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ PODS:
- SwiftyJSON (5.0.0)
- TGPControls (5.1.0)
- YoutubePlayer-in-WKWebView (0.3.4)
- YYText (1.0.7)

DEPENDENCIES:
- Alamofire (~> 4.3)
Expand All @@ -74,7 +73,6 @@ DEPENDENCIES:
- SwiftyJSON (from `https://github.com/ccrama/SwiftyJSON.git`, branch `hotfix-xcode12`)
- TGPControls
- YoutubePlayer-in-WKWebView (~> 0.3.0)
- YYText

SPEC REPOS:
trunk:
Expand All @@ -95,7 +93,6 @@ SPEC REPOS:
- SwiftLint
- TGPControls
- YoutubePlayer-in-WKWebView
- YYText

EXTERNAL SOURCES:
DTCoreText:
Expand Down Expand Up @@ -162,8 +159,7 @@ SPEC CHECKSUMS:
SwiftyJSON: f0574c07d8ca1644050db687067209e3033a89a0
TGPControls: 52c0770bee9c9aee364f1559cc627fc01ea5e8b2
YoutubePlayer-in-WKWebView: af2f5929fc78882d94bfdfeea999b661b78d9717
YYText: 5c461d709e24d55a182d1441c41dc639a18a4849

PODFILE CHECKSUM: f3d5434b3387a84e7106b422142f47f6745fbb1f
PODFILE CHECKSUM: 921cd225b4120efa1cb2e0c32101c3932f6ceb0c

COCOAPODS: 1.10.0
118 changes: 60 additions & 58 deletions Slide for Reddit.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

8 changes: 1 addition & 7 deletions Slide for Reddit/AlbumViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ class AlbumViewController: SwipeDownModalVC, UIPageViewControllerDataSource, UIP
navigationBar.isTranslucent = true
navigationBar.tintColor = .white
navItem = UINavigationItem(title: "Loading album...")
navigationBar.titleTextAttributes = convertToOptionalNSAttributedStringKeyDictionary([NSAttributedString.Key.foregroundColor.rawValue: UIColor.white])
navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

let close = UIButton.init(type: .custom)
close.setImage(UIImage(sfString: SFSymbol.xmark, overrideString: "close")?.navIcon(true), for: UIControl.State.normal)
Expand Down Expand Up @@ -517,9 +517,3 @@ class AlbumViewController: SwipeDownModalVC, UIPageViewControllerDataSource, UIP
}

}

// Helper function inserted by Swift 4.2 migrator.
private func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? {
guard let input = input else { return nil }
return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value) })
}
10 changes: 0 additions & 10 deletions Slide for Reddit/AnyModalViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1032,13 +1032,3 @@ extension AVAsset {
return estimatedSize
}
}

// Helper function inserted by Swift 4.2 migrator.
private func convertFromAVAudioSessionCategory(_ input: AVAudioSession.Category) -> String {
return input.rawValue
}

// Helper function inserted by Swift 4.2 migrator.
private func convertToUIApplicationOpenExternalURLOptionsKeyDictionary(_ input: [String: Any]) -> [UIApplication.OpenExternalURLOptionsKey: Any] {
return Dictionary(uniqueKeysWithValues: input.map { key, value in (UIApplication.OpenExternalURLOptionsKey(rawValue: key), value) })
}
9 changes: 2 additions & 7 deletions Slide for Reddit/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -552,12 +552,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate {

self.backgroundTaskId = UIApplication.shared.beginBackgroundTask(withName: "Download New Messages") {
UIApplication.shared.endBackgroundTask(self.backgroundTaskId!)
self.backgroundTaskId = UIBackgroundTaskIdentifier(rawValue: convertFromUIBackgroundTaskIdentifier(UIBackgroundTaskIdentifier.invalid))
self.backgroundTaskId = UIBackgroundTaskIdentifier.invalid
}

func cleanup() {
UIApplication.shared.endBackgroundTask(self.backgroundTaskId!)
self.backgroundTaskId = UIBackgroundTaskIdentifier(rawValue: convertFromUIBackgroundTaskIdentifier(UIBackgroundTaskIdentifier.invalid))
self.backgroundTaskId = UIBackgroundTaskIdentifier.invalid
}

NSLog("getData running...")
Expand Down Expand Up @@ -1110,11 +1110,6 @@ extension Session {
}
}

// Helper function inserted by Swift 4.2 migrator.
private func convertFromUIBackgroundTaskIdentifier(_ input: UIBackgroundTaskIdentifier) -> Int {
return input.rawValue
}

class CustomSplitController: UISplitViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
if ColorUtil.theme.isLight && SettingValues.reduceColor {
Expand Down
17 changes: 3 additions & 14 deletions Slide for Reddit/BannerUtil.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ public class BannerUtil {

let finalText: NSMutableAttributedString!
if textParts.count > 1 {
let firstPart = NSMutableAttributedString.init(string: textParts[0], attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): UIColor.white, convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.boldSystemFont(ofSize: 12)]))
let secondPart = NSMutableAttributedString.init(string: "\n" + textParts[1], attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): UIColor.white, convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.boldSystemFont(ofSize: 14)]))
let firstPart = NSMutableAttributedString.init(string: textParts[0], attributes: [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 12)])
let secondPart = NSMutableAttributedString.init(string: "\n" + textParts[1], attributes: [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 14)])
firstPart.append(secondPart)
finalText = firstPart
} else {
finalText = NSMutableAttributedString.init(string: text, attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): UIColor.white, convertFromNSAttributedStringKey(NSAttributedString.Key.font): UIFont.boldSystemFont(ofSize: 14)]))
finalText = NSMutableAttributedString.init(string: text, attributes: [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 14)])
}
popup.attributedText = finalText
popup.numberOfLines = 0
Expand Down Expand Up @@ -72,14 +72,3 @@ public class BannerUtil {
SwiftEntryKit.display(entry: popup.withPadding(padding: UIEdgeInsets(top: 5, left: 50, bottom: 0, right: 50)), using: attributes)
}
}

// Helper function inserted by Swift 4.2 migrator.
private func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? {
guard let input = input else { return nil }
return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value) })
}

// Helper function inserted by Swift 4.2 migrator.
private func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String {
return input.rawValue
}
18 changes: 11 additions & 7 deletions Slide for Reddit/CachedTitle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import Foundation
import Proton
import SDWebImage
import YYText


struct Title {
var mainTitle: NSAttributedString?
Expand Down Expand Up @@ -205,9 +205,7 @@ class CachedTitle {
authorAttributes[.foregroundColor] = UIColor.white
}

if full {
authorAttributes[.urlAction] = URL(string: "https://www.reddit.com/u/\(submission.author)")!
}
authorAttributes[.textHighlight] = TextHighlight(["url": URL(string: "/u/\(submission.author)")])
let authorString = NSMutableAttributedString(string: "\u{00A0}\(AccountController.formatUsername(input: submission.author, small: false) + (submission.isCakeday ? " 🎂" : ""))\u{00A0}", attributes: authorAttributes)

endString.append(authorString)
Expand Down Expand Up @@ -352,10 +350,16 @@ class CachedTitle {
extraLine.append(NSAttributedString.init(string: "\n"))
}

let poll = NSMutableAttributedString.yy_attachmentString(withEmojiImage: UIImage(named: "poll")!.getCopy(withColor: ColorUtil.theme.fontColor), fontSize: titleFont.pointSize * 0.75)!

let finalText = NSMutableAttributedString.init(string: " Poll", attributes: [NSAttributedString.Key.foregroundColor: colorF, NSAttributedString.Key.font: FontGenerator.boldFontOfSize(size: 12, submission: true)])

let size = finalText.boundingRect(with: CGSize(width: CGFloat.infinity, height: CGFloat.infinity), options: [], context: nil)

let image = UIImage(named: "poll")!.getCopy(withColor: ColorUtil.theme.fontColor).getCopy(withSize: CGSize.square(size: size.height * 0.75), withColor: ColorUtil.theme.fontColor)

let pollImage = NSTextAttachment()
pollImage.image = image
pollImage.bounds = CGRect(x: 0, y: (image.size.height * -0.25) / 2, width: image.size.width, height: image.size.height)

let poll = NSMutableAttributedString(attachment: pollImage)
poll.append(finalText)

for option in submission.pollDictionary.keys {
Expand Down
14 changes: 6 additions & 8 deletions Slide for Reddit/CodeDisplayView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import reddift
import SDWebImage
import Then
import UIKit
import YYText


class CodeDisplayView: UIScrollView {

Expand Down Expand Up @@ -75,19 +75,17 @@ class CodeDisplayView: UIScrollView {
index += 1
}
baseLabel.attributedText = finalString

let size = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
let layout = YYTextLayout(containerSize: size, text: finalString)!
let textSizeB = layout.textBoundingSize

let textHeight = finalString.height(containerWidth: .infinity)

addSubview(baseLabel)
contentInset = UIEdgeInsets.init(top: 8, left: 8, bottom: 0, right: 8)
baseLabel.widthAnchor /==/ getWidestCell()
globalHeight = textSizeB.height + 16
baseLabel.heightAnchor /==/ textSizeB.height
globalHeight = textHeight + 16
baseLabel.heightAnchor /==/ textHeight
baseLabel.leftAnchor /==/ leftAnchor
baseLabel.topAnchor /==/ topAnchor
contentSize = CGSize.init(width: getWidestCell() + 16, height: textSizeB.height)
contentSize = CGSize.init(width: getWidestCell() + 16, height: textHeight)
}

func getWidestCell() -> CGFloat {
Expand Down
2 changes: 1 addition & 1 deletion Slide for Reddit/CollectionsContributionLoader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class CollectionsContributionLoader: ContributionLoader {

var paginator: Paginator
var content: [RedditObject]
var delegate: ContentListingViewController?
weak var delegate: ContentListingViewController?
var paging = true
var ids = [Link]()

Expand Down
133 changes: 66 additions & 67 deletions Slide for Reddit/CommentCellView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,62 +10,10 @@ import Anchorage
import AudioToolbox
import reddift
import UIKit
import YYText

class CommentCellView: UICollectionViewCell, UIGestureRecognizerDelegate, TextDisplayStackViewDelegate {

var longBlocking = false
func linkTapped(url: URL, text: String) {
if !text.isEmpty {
self.parentViewController?.showSpoiler(text)
} else {
self.parentViewController?.doShow(url: url, heroView: nil, finalSize: nil, heroVC: nil, link: SubmissionObject())
}
}

func linkLongTapped(url: URL) {
longBlocking = true

let alertController = DragDownAlertMenu(title: "Link options", subtitle: url.absoluteString, icon: url.absoluteString)

alertController.addAction(title: "Share URL", icon: UIImage(sfString: SFSymbol.squareAndArrowUp, overrideString: "share")!.menuIcon()) {
let shareItems: Array = [url]
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.contentView
self.parentViewController?.present(activityViewController, animated: true, completion: nil)
}

alertController.addAction(title: "Copy URL", icon: UIImage(sfString: SFSymbol.docOnDocFill, overrideString: "copy")!.menuIcon()) {
UIPasteboard.general.setValue(url, forPasteboardType: "public.url")
BannerUtil.makeBanner(text: "URL Copied", seconds: 5, context: self.parentViewController)
}

alertController.addAction(title: "Open in default app", icon: UIImage(sfString: SFSymbol.safariFill, overrideString: "nav")!.menuIcon()) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}

let open = OpenInChromeController.init()
if open.isChromeInstalled() {
alertController.addAction(title: "Open in Chrome", icon: UIImage(named: "world")!.menuIcon()) {
open.openInChrome(url, callbackURL: nil, createNewTab: true)
}
}

if #available(iOS 10.0, *) {
HapticUtility.hapticActionStrong()
} else if SettingValues.hapticFeedback {
AudioServicesPlaySystemSound(1519)
}

if parentViewController != nil {
alertController.show(parentViewController!)
}
}

class CommentCellView: UICollectionViewCell, UIGestureRecognizerDelegate {
var longBlocking = false
var text: TextDisplayStackView!
var single = false

Expand Down Expand Up @@ -115,7 +63,7 @@ class CommentCellView: UICollectionViewCell, UIGestureRecognizerDelegate, TextDi
}

public static func getTitle(_ comment: CommentObject) -> NSAttributedString {
let titleText = NSMutableAttributedString.init(string: comment.submissionTitle, attributes: convertToOptionalNSAttributedStringKeyDictionary([convertFromNSAttributedStringKey(NSAttributedString.Key.font): FontGenerator.fontOfSize(size: 18, submission: false), convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): ColorUtil.theme.fontColor]))
let titleText = NSMutableAttributedString.init(string: comment.submissionTitle, attributes: [NSAttributedString.Key.font: FontGenerator.fontOfSize(size: 18, submission: false), NSAttributedString.Key.foregroundColor: ColorUtil.theme.fontColor])

var uC: UIColor
switch ActionStates.getVoteDirection(s: comment) {
Expand All @@ -127,13 +75,13 @@ class CommentCellView: UICollectionViewCell, UIGestureRecognizerDelegate, TextDi
uC = ColorUtil.theme.fontColor
}

let attrs = [convertFromNSAttributedStringKey(NSAttributedString.Key.font): FontGenerator.boldFontOfSize(size: 12, submission: false), convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): uC] as [String: Any]
let attrs = [NSAttributedString.Key.font: FontGenerator.boldFontOfSize(size: 12, submission: false), NSAttributedString.Key.foregroundColor: uC] as [NSAttributedString.Key: Any]

let attrs2 = [convertFromNSAttributedStringKey(NSAttributedString.Key.font): FontGenerator.boldFontOfSize(size: 12, submission: false), convertFromNSAttributedStringKey(NSAttributedString.Key.foregroundColor): ColorUtil.theme.fontColor] as [String: Any]
let attrs2 = [NSAttributedString.Key.font: FontGenerator.boldFontOfSize(size: 12, submission: false), NSAttributedString.Key.foregroundColor: ColorUtil.theme.fontColor] as [NSAttributedString.Key: Any]

let endString = NSMutableAttributedString(string: " • \(DateFormatter().timeSince(from: comment.created as NSDate, numericDates: true)) • ", attributes: convertToOptionalNSAttributedStringKeyDictionary(attrs2))
let endString = NSMutableAttributedString(string: " • \(DateFormatter().timeSince(from: comment.created as NSDate, numericDates: true)) • ", attributes: attrs2)

let boldString = NSMutableAttributedString(string: "\(comment.score)pts", attributes: convertToOptionalNSAttributedStringKeyDictionary(attrs))
let boldString = NSMutableAttributedString(string: "\(comment.score)pts", attributes: attrs)
let subString = NSMutableAttributedString(string: "r/\(comment.subreddit)")
let color = ColorUtil.getColorForSub(sub: comment.subreddit)
if color != ColorUtil.baseColor {
Expand Down Expand Up @@ -169,13 +117,64 @@ class CommentCellView: UICollectionViewCell, UIGestureRecognizerDelegate, TextDi
}
}

// Helper function inserted by Swift 4.2 migrator.
private func convertToOptionalNSAttributedStringKeyDictionary(_ input: [String: Any]?) -> [NSAttributedString.Key: Any]? {
guard let input = input else { return nil }
return Dictionary(uniqueKeysWithValues: input.map { key, value in (NSAttributedString.Key(rawValue: key), value) })
}
extension CommentCellView: TextDisplayStackViewDelegate {
func linkTapped(url: URL, text: String) {
if !text.isEmpty {
self.parentViewController?.showSpoiler(text)
} else {
self.parentViewController?.doShow(url: url, heroView: nil, finalSize: nil, heroVC: nil, link: SubmissionObject())
}
}

// Helper function inserted by Swift 4.2 migrator.
private func convertFromNSAttributedStringKey(_ input: NSAttributedString.Key) -> String {
return input.rawValue
func linkLongTapped(url: URL) {
longBlocking = true

let alertController = DragDownAlertMenu(title: "Link options", subtitle: url.absoluteString, icon: url.absoluteString)

alertController.addAction(title: "Share URL", icon: UIImage(sfString: SFSymbol.squareAndArrowUp, overrideString: "share")!.menuIcon()) {
let shareItems: Array = [url]
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.contentView
self.parentViewController?.present(activityViewController, animated: true, completion: nil)
}

alertController.addAction(title: "Copy URL", icon: UIImage(sfString: SFSymbol.docOnDocFill, overrideString: "copy")!.menuIcon()) {
UIPasteboard.general.setValue(url, forPasteboardType: "public.url")
BannerUtil.makeBanner(text: "URL Copied", seconds: 5, context: self.parentViewController)
}

alertController.addAction(title: "Open in default app", icon: UIImage(sfString: SFSymbol.safariFill, overrideString: "nav")!.menuIcon()) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}

let open = OpenInChromeController.init()
if open.isChromeInstalled() {
alertController.addAction(title: "Open in Chrome", icon: UIImage(named: "world")!.menuIcon()) {
open.openInChrome(url, callbackURL: nil, createNewTab: true)
}
}

if #available(iOS 10.0, *) {
HapticUtility.hapticActionStrong()
} else if SettingValues.hapticFeedback {
AudioServicesPlaySystemSound(1519)
}

if parentViewController != nil {
alertController.show(parentViewController!)
}
}

func previewProfile(profile: String) {
if let parent = self.parentViewController {
let vc = ProfileInfoViewController(accountNamed: profile)
vc.modalPresentationStyle = .custom
vc.transitioningDelegate = ProfileInfoPresentationManager()
parent.present(vc, animated: true)
}
}
}
Loading