From 831d5a677457b74c6970391dbfbe225295010878 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 26 Nov 2022 15:22:23 +0100 Subject: [PATCH 01/94] Add pages and page-controller for better onboarding (#690) --- Mastodon.xcodeproj/project.pbxproj | 21 + .../xcshareddata/swiftpm/Package.resolved | 257 ------- .../View/Pages/WelcomeContentPage.swift | 48 ++ .../View/Pages/WelcomeContentPageView.swift | 53 ++ .../Pages/WelcomeContentViewController.swift | 28 + .../Welcome/WelcomeViewController.swift | 703 ++++++++++-------- 6 files changed, 535 insertions(+), 575 deletions(-) delete mode 100644 Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift create mode 100644 Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift create mode 100644 Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 6955c581d..be3604e70 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -115,6 +115,9 @@ D87BFC8F291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */; }; D8916DC029211BE500124085 /* ContentSizedTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8916DBF29211BE500124085 /* ContentSizedTableView.swift */; }; D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; }; + D8A6FE5B293244B500666A47 /* WelcomeContentPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */; }; + D8A6FE5D293244C300666A47 /* WelcomeContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */; }; + D8A6FE5F29324BBC00666A47 /* WelcomeContentPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */; }; DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; }; DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; }; DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0140CE25C42AEE00F9F3CF /* OSLog.swift */; }; @@ -660,6 +663,9 @@ D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginServerTableViewCell.swift; sourceTree = ""; }; D8916DBF29211BE500124085 /* ContentSizedTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentSizedTableView.swift; sourceTree = ""; }; D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewController.swift; sourceTree = ""; }; + D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPage.swift; sourceTree = ""; }; + D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentViewController.swift; sourceTree = ""; }; + D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPageView.swift; sourceTree = ""; }; DB0009A826AEE5DC009B9D2D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intents.intentdefinition; sourceTree = ""; }; DB0009AD26AEE5E4009B9D2D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Intents.strings; sourceTree = ""; }; DB0140CE25C42AEE00F9F3CF /* OSLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; }; @@ -1575,6 +1581,16 @@ path = Login; sourceTree = ""; }; + D8A6FE5929323DC200666A47 /* Pages */ = { + isa = PBXGroup; + children = ( + D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */, + D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */, + D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */, + ); + path = Pages; + sourceTree = ""; + }; DB01409B25C40BB600F9F3CF /* Onboarding */ = { isa = PBXGroup; children = ( @@ -2498,6 +2514,7 @@ DBABE3F125ECAC4E00879EE5 /* View */ = { isa = PBXGroup; children = ( + D8A6FE5929323DC200666A47 /* Pages */, DBABE3EB25ECAC4B00879EE5 /* WelcomeIllustrationView.swift */, DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */, DB0617EA277EF3820030EE79 /* GradientBorderView.swift */, @@ -3287,6 +3304,8 @@ DB603113279EBEBA00A935FE /* DataSourceFacade+Block.swift in Sources */, DB63F777279A9A2A00455B82 /* NotificationView+Configuration.swift in Sources */, DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */, + DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */, + D8A6FE5F29324BBC00666A47 /* WelcomeContentPageView.swift in Sources */, 5B90C461262599800002E742 /* SettingsLinkTableViewCell.swift in Sources */, DB6180DD263918E30018D199 /* MediaPreviewViewController.swift in Sources */, DBE3CDEC261C6B2900430CC6 /* FavoriteViewController.swift in Sources */, @@ -3499,6 +3518,7 @@ DB1D84382657B275000346B3 /* SegmentedControlNavigateable.swift in Sources */, 0F20220726134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift in Sources */, DB7A9F932818F33C0016AF98 /* MastodonServerRulesViewController+Debug.swift in Sources */, + D8A6FE5D293244C300666A47 /* WelcomeContentViewController.swift in Sources */, 2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */, DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */, DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */, @@ -3574,6 +3594,7 @@ 2D6DE40026141DF600A63F6A /* SearchViewModel.swift in Sources */, DB0617FD27855BFE0030EE79 /* ServerRuleItem.swift in Sources */, 5BB04FD5262E7AFF0043BFF6 /* ReportViewController.swift in Sources */, + D8A6FE5B293244B500666A47 /* WelcomeContentPage.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 75afbc505..000000000 --- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,257 +0,0 @@ -{ - "pins" : [ - { - "identity" : "alamofire", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Alamofire/Alamofire.git", - "state" : { - "revision" : "8dd85aee02e39dd280c75eef88ffdb86eed4b07b", - "version" : "5.6.2" - } - }, - { - "identity" : "alamofireimage", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Alamofire/AlamofireImage.git", - "state" : { - "revision" : "98cbb00ce0ec5fc8e52a5b50a6bfc08d3e5aee10", - "version" : "4.2.0" - } - }, - { - "identity" : "commonoslog", - "kind" : "remoteSourceControl", - "location" : "https://github.com/MainasuK/CommonOSLog", - "state" : { - "revision" : "c121624a30698e9886efe38aebb36ff51c01b6c2", - "version" : "0.1.1" - } - }, - { - "identity" : "faviconfinder", - "kind" : "remoteSourceControl", - "location" : "https://github.com/will-lumley/FaviconFinder.git", - "state" : { - "revision" : "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a", - "version" : "3.3.0" - } - }, - { - "identity" : "flanimatedimage", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Flipboard/FLAnimatedImage.git", - "state" : { - "revision" : "d4f07b6f164d53c1212c3e54d6460738b1981e9f", - "version" : "1.0.17" - } - }, - { - "identity" : "fpsindicator", - "kind" : "remoteSourceControl", - "location" : "https://github.com/MainasuK/FPSIndicator.git", - "state" : { - "revision" : "e4a5067ccd5293b024c767f09e51056afd4a4796", - "version" : "1.1.0" - } - }, - { - "identity" : "fuzi", - "kind" : "remoteSourceControl", - "location" : "https://github.com/cezheng/Fuzi.git", - "state" : { - "revision" : "f08c8323da21e985f3772610753bcfc652c2103f", - "version" : "3.1.3" - } - }, - { - "identity" : "keychainaccess", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", - "state" : { - "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", - "version" : "4.2.2" - } - }, - { - "identity" : "kingfisher", - "kind" : "remoteSourceControl", - "location" : "https://github.com/onevcat/Kingfisher.git", - "state" : { - "revision" : "44e891bdb61426a95e31492a67c7c0dfad1f87c5", - "version" : "7.4.1" - } - }, - { - "identity" : "metatextkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/TwidereProject/MetaTextKit.git", - "state" : { - "revision" : "dcd5255d6930c2fab408dc8562c577547e477624", - "version" : "2.2.5" - } - }, - { - "identity" : "nextlevelsessionexporter", - "kind" : "remoteSourceControl", - "location" : "https://github.com/NextLevel/NextLevelSessionExporter.git", - "state" : { - "revision" : "b6c0cce1aa37fe1547d694f958fac3c3524b74da", - "version" : "0.4.6" - } - }, - { - "identity" : "nuke", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kean/Nuke.git", - "state" : { - "revision" : "a002b7fd786f2df2ed4333fe73a9727499fd9d97", - "version" : "10.11.2" - } - }, - { - "identity" : "nuke-flanimatedimage-plugin", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", - "state" : { - "revision" : "b59c346a7d536336db3b0f12c72c6e53ee709e16", - "version" : "8.0.0" - } - }, - { - "identity" : "pageboy", - "kind" : "remoteSourceControl", - "location" : "https://github.com/uias/Pageboy", - "state" : { - "revision" : "af8fa81788b893205e1ff42ddd88c5b0b315d7c5", - "version" : "3.7.0" - } - }, - { - "identity" : "panmodal", - "kind" : "remoteSourceControl", - "location" : "https://github.com/slackhq/PanModal.git", - "state" : { - "revision" : "b012aecb6b67a8e46369227f893c12544846613f", - "version" : "1.2.7" - } - }, - { - "identity" : "sdwebimage", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SDWebImage/SDWebImage.git", - "state" : { - "revision" : "3312bf5e67b52fbce7c3caf431b0cda721a9f7bb", - "version" : "5.14.2" - } - }, - { - "identity" : "stripes", - "kind" : "remoteSourceControl", - "location" : "https://github.com/eneko/Stripes.git", - "state" : { - "revision" : "d533fd44b8043a3abbf523e733599173d6f98c11", - "version" : "0.2.0" - } - }, - { - "identity" : "swift-collections", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-collections.git", - "state" : { - "revision" : "f504716c27d2e5d4144fa4794b12129301d17729", - "version" : "1.0.3" - } - }, - { - "identity" : "swift-nio", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-nio.git", - "state" : { - "revision" : "546610d52b19be3e19935e0880bb06b9c03f5cef", - "version" : "1.14.4" - } - }, - { - "identity" : "swift-nio-zlib-support", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-nio-zlib-support.git", - "state" : { - "revision" : "37760e9a52030bb9011972c5213c3350fa9d41fd", - "version" : "1.0.0" - } - }, - { - "identity" : "swiftsoup", - "kind" : "remoteSourceControl", - "location" : "https://github.com/scinfu/SwiftSoup.git", - "state" : { - "revision" : "6778575285177365cbad3e5b8a72f2a20583cfec", - "version" : "2.4.3" - } - }, - { - "identity" : "swiftui-introspect", - "kind" : "remoteSourceControl", - "location" : "https://github.com/siteline/SwiftUI-Introspect.git", - "state" : { - "revision" : "f2616860a41f9d9932da412a8978fec79c06fe24", - "version" : "0.1.4" - } - }, - { - "identity" : "tabbarpager", - "kind" : "remoteSourceControl", - "location" : "https://github.com/TwidereProject/TabBarPager.git", - "state" : { - "revision" : "488aa66d157a648901b61721212c0dec23d27ee5", - "version" : "0.1.0" - } - }, - { - "identity" : "tabman", - "kind" : "remoteSourceControl", - "location" : "https://github.com/uias/Tabman", - "state" : { - "revision" : "4a4f7c755b875ffd4f9ef10d67a67883669d2465", - "version" : "2.13.0" - } - }, - { - "identity" : "thirdpartymailer", - "kind" : "remoteSourceControl", - "location" : "https://github.com/vtourraine/ThirdPartyMailer.git", - "state" : { - "revision" : "44c1cfaa6969963f22691aa67f88a69e3b6d651f", - "version" : "2.1.0" - } - }, - { - "identity" : "tocropviewcontroller", - "kind" : "remoteSourceControl", - "location" : "https://github.com/TimOliver/TOCropViewController.git", - "state" : { - "revision" : "d0470491f56e734731bbf77991944c0dfdee3e0e", - "version" : "2.6.1" - } - }, - { - "identity" : "uihostingconfigurationbackport", - "kind" : "remoteSourceControl", - "location" : "https://github.com/woxtu/UIHostingConfigurationBackport.git", - "state" : { - "revision" : "6091f2d38faa4b24fc2ca0389c651e2f666624a3", - "version" : "0.1.0" - } - }, - { - "identity" : "uitextview-placeholder", - "kind" : "remoteSourceControl", - "location" : "https://github.com/MainasuK/UITextView-Placeholder.git", - "state" : { - "revision" : "20f513ded04a040cdf5467f0891849b1763ede3b", - "version" : "1.4.1" - } - } - ], - "version" : 2 -} diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift new file mode 100644 index 000000000..9557e5c46 --- /dev/null +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift @@ -0,0 +1,48 @@ +// +// WelcomeContentPage.swift +// Mastodon +// +// Created by Nathan Mattes on 26.11.22. +// + +import UIKit + +enum WelcomeContentPage: CaseIterable { + case whatIsMastodon + case mastodonIsLikeThat + case howDoIPickAServer + + var backgroundColor: UIColor { + switch self { + case .whatIsMastodon: + return .green + case .mastodonIsLikeThat: + return .red + case .howDoIPickAServer: + return .blue + } + } + + var title: String { + switch self { + case .whatIsMastodon: + return "What is Mastodon?" + case .mastodonIsLikeThat: + return "Mastodon is like that" + case .howDoIPickAServer: + return "How to I pick a server?" + } + } + + var content: String { + switch self { + case .whatIsMastodon: + return "Long text\n\nhat is Mastodon?" + case .mastodonIsLikeThat: + return "Long text\n\nwhat Mastodon is like" + case .howDoIPickAServer: + return "Long text\n\nHow to I pick a server?" + } + + } +} diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift new file mode 100644 index 000000000..34ab1ec27 --- /dev/null +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -0,0 +1,53 @@ +// +// WelcomeContentPageView.swift +// Mastodon +// +// Created by Nathan Mattes on 26.11.22. +// + +import UIKit + +class WelcomeContentPageView: UIView { + + //TODO: Put in ScrollView? + private let contentStackView: UIStackView + private let titleView: UILabel + private let label: UILabel + + init(page: WelcomeContentPage) { + + //TODO: @zeitschlag Decide based on page which titleView, first page has mastodon-logo in it + //TODO: @zeitschlag Add styling + titleView = UILabel() + titleView.text = page.title + + //TODO: @zeitschlag Add styling + label = UILabel() + label.text = page.content + label.numberOfLines = 0 + + contentStackView = UIStackView(arrangedSubviews: [titleView, label, UIView()]) + contentStackView.translatesAutoresizingMaskIntoConstraints = false + contentStackView.axis = .vertical + contentStackView.alignment = .leading + + super.init(frame: .zero) + + addSubview(contentStackView) + + setupConstraints() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupConstraints() { + let constraints = [ + contentStackView.topAnchor.constraint(equalTo: topAnchor), + contentStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 16), + bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor) + ] + + NSLayoutConstraint.activate(constraints) + } +} diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift new file mode 100644 index 000000000..7bd20d033 --- /dev/null +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift @@ -0,0 +1,28 @@ +// +// WelcomeContentViewController.swift +// Mastodon +// +// Created by Nathan Mattes on 26.11.22. +// + +import UIKit + +class WelcomeContentViewController: UIViewController { + + let page: WelcomeContentPage + var contentView: WelcomeContentPageView { + view as! WelcomeContentPageView + } + + init(page: WelcomeContentPage) { + self.page = page + super.init(nibName: nil, bundle: nil) + } + + override func loadView() { + let pageView = WelcomeContentPageView(page: page) + self.view = pageView + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } +} diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index b0d2f3c71..b943356c6 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -5,7 +5,6 @@ // Created by BradGao on 2021/2/20. // -import os.log import UIKit import Combine import MastodonAsset @@ -13,318 +12,334 @@ import MastodonCore import MastodonLocalization final class WelcomeViewController: UIViewController, NeedsDependency { - - let logger = Logger(subsystem: "WelcomeViewController", category: "ViewController") - - weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } - weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } - - var disposeBag = Set() - var observations = Set() - private(set) lazy var viewModel = WelcomeViewModel(context: context) - - let welcomeIllustrationView = WelcomeIllustrationView() - var welcomeIllustrationViewBottomAnchorLayoutConstraint: NSLayoutConstraint? - - private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) - - private(set) lazy var logoImageView: UIImageView = { - let image = Asset.Scene.Welcome.mastodonLogo.image - let imageView = UIImageView(image: image) - imageView.translatesAutoresizingMaskIntoConstraints = false - return imageView - }() - - private(set) lazy var sloganLabel: UILabel = { - let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 34, weight: .bold)) - label.textColor = Asset.Colors.Label.primary.color - label.text = L10n.Scene.Welcome.slogan - label.adjustsFontForContentSizeCategory = true - label.translatesAutoresizingMaskIntoConstraints = false - label.numberOfLines = 0 - return label - }() - - let buttonContainer = UIStackView() - - private(set) lazy var signUpButton: PrimaryActionButton = { - let button = PrimaryActionButton() - button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false - button.contentEdgeInsets = WelcomeViewController.actionButtonPadding - button.titleLabel?.adjustsFontForContentSizeCategory = true - button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) - button.setTitle(L10n.Common.Controls.Actions.signUp, for: .normal) - let backgroundImageColor: UIColor = .white - let backgroundImageHighlightedColor: UIColor = UIColor(white: 0.8, alpha: 1.0) - button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) - button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) - button.setTitleColor(.black, for: .normal) - return button - }() - let signUpButtonShadowView = UIView() - - private(set) lazy var signInButton: PrimaryActionButton = { - let button = PrimaryActionButton() - button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false - button.contentEdgeInsets = WelcomeViewController.actionButtonPadding - button.titleLabel?.adjustsFontForContentSizeCategory = true - button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) - button.setTitle(L10n.Scene.Welcome.logIn, for: .normal) - let backgroundImageColor = Asset.Scene.Welcome.signInButtonBackground.color - let backgroundImageHighlightedColor = Asset.Scene.Welcome.signInButtonBackground.color.withAlphaComponent(0.8) - button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) - button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) - let titleColor: UIColor = UIColor.white.withAlphaComponent(0.9) - button.setTitleColor(titleColor, for: .normal) - return button - }() - let signInButtonShadowView = UIView() - - deinit { - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - } - + + weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } + weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } + + var disposeBag = Set() + var observations = Set() + private(set) lazy var viewModel = WelcomeViewModel(context: context) + + let welcomeIllustrationView = WelcomeIllustrationView() + var welcomeIllustrationViewBottomAnchorLayoutConstraint: NSLayoutConstraint? + + private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) + + private(set) lazy var logoImageView: UIImageView = { + let image = Asset.Scene.Welcome.mastodonLogo.image + let imageView = UIImageView(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.isHidden = true + return imageView + }() + + private(set) lazy var sloganLabel: UILabel = { + let label = UILabel() + label.font = UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 34, weight: .bold)) + label.textColor = Asset.Colors.Label.primary.color + label.text = L10n.Scene.Welcome.slogan + label.adjustsFontForContentSizeCategory = true + label.translatesAutoresizingMaskIntoConstraints = false + label.numberOfLines = 0 + return label + }() + + let buttonContainer = UIStackView() + + private(set) lazy var signUpButton: PrimaryActionButton = { + let button = PrimaryActionButton() + button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false + button.contentEdgeInsets = WelcomeViewController.actionButtonPadding + button.titleLabel?.adjustsFontForContentSizeCategory = true + button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) + button.setTitle(L10n.Common.Controls.Actions.signUp, for: .normal) + let backgroundImageColor: UIColor = .white + let backgroundImageHighlightedColor: UIColor = UIColor(white: 0.8, alpha: 1.0) + button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) + button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) + button.setTitleColor(.black, for: .normal) + return button + }() + let signUpButtonShadowView = UIView() + + private(set) lazy var signInButton: PrimaryActionButton = { + let button = PrimaryActionButton() + button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false + button.contentEdgeInsets = WelcomeViewController.actionButtonPadding + button.titleLabel?.adjustsFontForContentSizeCategory = true + button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) + button.setTitle(L10n.Scene.Welcome.logIn, for: .normal) + let backgroundImageColor = Asset.Scene.Welcome.signInButtonBackground.color + let backgroundImageHighlightedColor = Asset.Scene.Welcome.signInButtonBackground.color.withAlphaComponent(0.8) + button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) + button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) + let titleColor: UIColor = UIColor.white.withAlphaComponent(0.9) + button.setTitleColor(titleColor, for: .normal) + return button + }() + let signInButtonShadowView = UIView() + + private(set) lazy var pageViewController: UIPageViewController = { + let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) + pageController.setViewControllers([WelcomeContentViewController(page: .whatIsMastodon)], direction: .forward, animated: false) + return pageController + }() + var currentPage: WelcomeContentPage = .whatIsMastodon } extension WelcomeViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - definesPresentationContext = true - preferredContentSize = CGSize(width: 547, height: 678) - - navigationController?.navigationBar.prefersLargeTitles = true - navigationItem.largeTitleDisplayMode = .never - view.overrideUserInterfaceStyle = .light - - setupOnboardingAppearance() - setupIllustrationLayout() - - buttonContainer.axis = .vertical - buttonContainer.spacing = 12 - buttonContainer.isLayoutMarginsRelativeArrangement = true - - buttonContainer.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(buttonContainer) - NSLayoutConstraint.activate([ - buttonContainer.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), - buttonContainer.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), - view.layoutMarginsGuide.bottomAnchor.constraint(equalTo: buttonContainer.bottomAnchor), - ]) - - signUpButton.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addArrangedSubview(signUpButton) - NSLayoutConstraint.activate([ - signUpButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), - ]) - signInButton.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addArrangedSubview(signInButton) - NSLayoutConstraint.activate([ - signInButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), - ]) - - signUpButtonShadowView.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addSubview(signUpButtonShadowView) - buttonContainer.sendSubviewToBack(signUpButtonShadowView) - signUpButtonShadowView.pinTo(to: signUpButton) - - signInButtonShadowView.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addSubview(signInButtonShadowView) - buttonContainer.sendSubviewToBack(signInButtonShadowView) - signInButtonShadowView.pinTo(to: signInButton) - signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) - signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) - - viewModel.$needsShowDismissEntry - .receive(on: DispatchQueue.main) - .sink { [weak self] needsShowDismissEntry in - guard let self = self else { return } - self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil - } - .store(in: &disposeBag) - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - setupButtonShadowView() - } - - override func viewSafeAreaInsetsDidChange() { - super.viewSafeAreaInsetsDidChange() - - var overlap: CGFloat = 5 - // shift illustration down for non-notch phone - if view.safeAreaInsets.bottom == 0 { - overlap += 56 - } - welcomeIllustrationViewBottomAnchorLayoutConstraint?.constant = overlap - } - - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) + override func viewDidLoad() { + super.viewDidLoad() - view.layoutIfNeeded() + definesPresentationContext = true + preferredContentSize = CGSize(width: 547, height: 678) - setupIllustrationLayout() - setupButtonShadowView() + navigationController?.navigationBar.prefersLargeTitles = true + navigationItem.largeTitleDisplayMode = .never + view.overrideUserInterfaceStyle = .light + + setupOnboardingAppearance() + setupIllustrationLayout() + + buttonContainer.axis = .vertical + buttonContainer.spacing = 12 + buttonContainer.isLayoutMarginsRelativeArrangement = true + + buttonContainer.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(buttonContainer) + NSLayoutConstraint.activate([ + buttonContainer.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), + buttonContainer.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), + view.layoutMarginsGuide.bottomAnchor.constraint(equalTo: buttonContainer.bottomAnchor), + ]) + + signUpButton.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addArrangedSubview(signUpButton) + NSLayoutConstraint.activate([ + signUpButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), + ]) + signInButton.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addArrangedSubview(signInButton) + NSLayoutConstraint.activate([ + signInButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), + ]) + + signUpButtonShadowView.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addSubview(signUpButtonShadowView) + buttonContainer.sendSubviewToBack(signUpButtonShadowView) + signUpButtonShadowView.pinTo(to: signUpButton) + + signInButtonShadowView.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addSubview(signInButtonShadowView) + buttonContainer.sendSubviewToBack(signInButtonShadowView) + signInButtonShadowView.pinTo(to: signInButton) + + signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) + signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) + + pageViewController.delegate = self + pageViewController.dataSource = self + addChild(pageViewController) + pageViewController.view.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(pageViewController.view) + pageViewController.didMove(toParent: self) + + NSLayoutConstraint.activate([ + pageViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), + buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), + ]) + + viewModel.$needsShowDismissEntry + .receive(on: DispatchQueue.main) + .sink { [weak self] needsShowDismissEntry in + guard let self = self else { return } + self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil + } + .store(in: &disposeBag) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + setupButtonShadowView() + } + + override func viewSafeAreaInsetsDidChange() { + super.viewSafeAreaInsetsDidChange() + + var overlap: CGFloat = 5 + // shift illustration down for non-notch phone + if view.safeAreaInsets.bottom == 0 { + overlap += 56 } - + welcomeIllustrationViewBottomAnchorLayoutConstraint?.constant = overlap + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + view.layoutIfNeeded() + + setupIllustrationLayout() + setupButtonShadowView() + } + } extension WelcomeViewController { - - private func setupButtonShadowView() { - signUpButtonShadowView.layer.setupShadow( - color: .black, - alpha: 0.25, - x: 0, - y: 1, - blur: 2, - spread: 0, - roundedRect: signUpButtonShadowView.bounds, - byRoundingCorners: .allCorners, - cornerRadii: CGSize(width: 10, height: 10) + + private func setupButtonShadowView() { + signUpButtonShadowView.layer.setupShadow( + color: .black, + alpha: 0.25, + x: 0, + y: 1, + blur: 2, + spread: 0, + roundedRect: signUpButtonShadowView.bounds, + byRoundingCorners: .allCorners, + cornerRadii: CGSize(width: 10, height: 10) + ) + signInButtonShadowView.layer.setupShadow( + color: .black, + alpha: 0.25, + x: 0, + y: 1, + blur: 2, + spread: 0, + roundedRect: signInButtonShadowView.bounds, + byRoundingCorners: .allCorners, + cornerRadii: CGSize(width: 10, height: 10) + ) + } + + private func updateButtonContainerLayoutMargins(traitCollection: UITraitCollection) { + switch traitCollection.userInterfaceIdiom { + case .phone: + buttonContainer.layoutMargins = UIEdgeInsets( + top: 0, + left: WelcomeViewController.actionButtonMargin, + bottom: WelcomeViewController.viewBottomPaddingHeight, + right: WelcomeViewController.actionButtonMargin ) - signInButtonShadowView.layer.setupShadow( - color: .black, - alpha: 0.25, - x: 0, - y: 1, - blur: 2, - spread: 0, - roundedRect: signInButtonShadowView.bounds, - byRoundingCorners: .allCorners, - cornerRadii: CGSize(width: 10, height: 10) + default: + let margin = traitCollection.horizontalSizeClass == .regular ? WelcomeViewController.actionButtonMarginExtend : WelcomeViewController.actionButtonMargin + buttonContainer.layoutMargins = UIEdgeInsets( + top: 0, + left: margin, + bottom: WelcomeViewController.viewBottomPaddingHeightExtend, + right: margin ) } - - private func updateButtonContainerLayoutMargins(traitCollection: UITraitCollection) { - switch traitCollection.userInterfaceIdiom { + } + + private func setupIllustrationLayout() { + welcomeIllustrationView.layout = { + switch traitCollection.userInterfaceIdiom { case .phone: - buttonContainer.layoutMargins = UIEdgeInsets( - top: 0, - left: WelcomeViewController.actionButtonMargin, - bottom: WelcomeViewController.viewBottomPaddingHeight, - right: WelcomeViewController.actionButtonMargin - ) + return .compact default: - let margin = traitCollection.horizontalSizeClass == .regular ? WelcomeViewController.actionButtonMarginExtend : WelcomeViewController.actionButtonMargin - buttonContainer.layoutMargins = UIEdgeInsets( - top: 0, - left: margin, - bottom: WelcomeViewController.viewBottomPaddingHeightExtend, - right: margin - ) - } + return .regular + } + }() + + // set logo + if logoImageView.superview == nil { + view.addSubview(logoImageView) + NSLayoutConstraint.activate([ + logoImageView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor), + logoImageView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor, constant: 35), + view.readableContentGuide.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor, constant: 35), + logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 75.0/269.0), + ]) + logoImageView.setContentHuggingPriority(.defaultHigh, for: .vertical) } - - private func setupIllustrationLayout() { - welcomeIllustrationView.layout = { - switch traitCollection.userInterfaceIdiom { - case .phone: - return .compact - default: - return .regular - } - }() - - // set logo - if logoImageView.superview == nil { - view.addSubview(logoImageView) - NSLayoutConstraint.activate([ - logoImageView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor), - logoImageView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor, constant: 35), - view.readableContentGuide.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor, constant: 35), - logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 75.0/269.0), - ]) - logoImageView.setContentHuggingPriority(.defaultHigh, for: .vertical) - } - - // set illustration - guard welcomeIllustrationView.superview == nil else { - return - } - welcomeIllustrationView.contentMode = .scaleAspectFit - - welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false - welcomeIllustrationViewBottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 5) - - view.addSubview(welcomeIllustrationView) - NSLayoutConstraint.activate([ - view.leftAnchor.constraint(equalTo: welcomeIllustrationView.leftAnchor, constant: 15), - welcomeIllustrationView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 15), - welcomeIllustrationViewBottomAnchorLayoutConstraint!.priority(.required - 1), - ]) - - welcomeIllustrationView.cloudBaseImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) - ) - welcomeIllustrationView.rightHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) - ) - welcomeIllustrationView.leftHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) - ) - welcomeIllustrationView.centerHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) - ) - - let topPaddingView = UIView() - topPaddingView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(topPaddingView) - NSLayoutConstraint.activate([ - topPaddingView.topAnchor.constraint(equalTo: logoImageView.bottomAnchor), - topPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), - topPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), - ]) - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(welcomeIllustrationView.elephantOnAirplaneWithContrailImageView) - NSLayoutConstraint.activate([ - view.leftAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 12), // add 12pt bleeding - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.topAnchor.constraint(equalTo: topPaddingView.bottomAnchor), - // make a little bit large - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.84), - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.heightAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor, multiplier: 105.0/318.0), - ]) - let bottomPaddingView = UIView() - bottomPaddingView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(bottomPaddingView) - NSLayoutConstraint.activate([ - bottomPaddingView.topAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.bottomAnchor), - bottomPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), - bottomPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), - bottomPaddingView.bottomAnchor.constraint(equalTo: view.centerYAnchor), - bottomPaddingView.heightAnchor.constraint(equalTo: topPaddingView.heightAnchor, multiplier: 4), - ]) - - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) - ) - - view.bringSubviewToFront(logoImageView) - view.bringSubviewToFront(sloganLabel) + + // set illustration + guard welcomeIllustrationView.superview == nil else { + return } + welcomeIllustrationView.contentMode = .scaleAspectFit + + welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false + welcomeIllustrationViewBottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 5) + + view.addSubview(welcomeIllustrationView) + // welcomeIllustrationView.isHidden = true + NSLayoutConstraint.activate([ + view.leftAnchor.constraint(equalTo: welcomeIllustrationView.leftAnchor, constant: 15), + welcomeIllustrationView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 15), + welcomeIllustrationViewBottomAnchorLayoutConstraint!.priority(.required - 1), + ]) + + welcomeIllustrationView.cloudBaseImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) + ) + welcomeIllustrationView.rightHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) + ) + welcomeIllustrationView.leftHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) + ) + welcomeIllustrationView.centerHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) + ) + + let topPaddingView = UIView() + topPaddingView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(topPaddingView) + NSLayoutConstraint.activate([ + topPaddingView.topAnchor.constraint(equalTo: logoImageView.bottomAnchor), + topPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), + topPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), + ]) + welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(welcomeIllustrationView.elephantOnAirplaneWithContrailImageView) + NSLayoutConstraint.activate([ + view.leftAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 12), // add 12pt bleeding + welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.topAnchor.constraint(equalTo: topPaddingView.bottomAnchor), + // make a little bit large + welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.84), + welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.heightAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor, multiplier: 105.0/318.0), + ]) + let bottomPaddingView = UIView() + bottomPaddingView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(bottomPaddingView) + NSLayoutConstraint.activate([ + bottomPaddingView.topAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.bottomAnchor), + bottomPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), + bottomPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), + bottomPaddingView.bottomAnchor.constraint(equalTo: view.centerYAnchor), + bottomPaddingView.heightAnchor.constraint(equalTo: topPaddingView.heightAnchor, multiplier: 4), + ]) + + welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) + ) + + view.bringSubviewToFront(logoImageView) + view.bringSubviewToFront(sloganLabel) + } } extension WelcomeViewController { - @objc - private func signUpButtonDidClicked(_ sender: UIButton) { - _ = coordinator.present(scene: .mastodonPickServer(viewMode: MastodonPickServerViewModel(context: context)), from: self, transition: .show) - } - - @objc - private func signInButtonDidClicked(_ sender: UIButton) { - _ = coordinator.present(scene: .mastodonLogin, from: self, transition: .show) - } - - @objc - private func dismissBarButtonItemDidPressed(_ sender: UIButton) { - dismiss(animated: true, completion: nil) - } + @objc + private func signUpButtonDidClicked(_ sender: UIButton) { + _ = coordinator.present(scene: .mastodonPickServer(viewMode: MastodonPickServerViewModel(context: context)), from: self, transition: .show) + } + + @objc + private func signInButtonDidClicked(_ sender: UIButton) { + _ = coordinator.present(scene: .mastodonLogin, from: self, transition: .show) + } + + @objc + private func dismissBarButtonItemDidPressed(_ sender: UIButton) { + dismiss(animated: true, completion: nil) + } } // MARK: - OnboardingViewControllerAppearance @@ -343,36 +358,88 @@ extension WelcomeViewController: OnboardingViewControllerAppearance { // MARK: - UIAdaptivePresentationControllerDelegate extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { - func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { - logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") + func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { - // update button layout - updateButtonContainerLayoutMargins(traitCollection: traitCollection) - - let navigationController = navigationController as? OnboardingNavigationController - - switch traitCollection.userInterfaceIdiom { - case .phone: + // update button layout + updateButtonContainerLayoutMargins(traitCollection: traitCollection) + + let navigationController = navigationController as? OnboardingNavigationController + + switch traitCollection.userInterfaceIdiom { + case .phone: + navigationController?.gradientBorderView.isHidden = true + // make underneath view controller alive to fix layout issue due to view life cycle + return .fullScreen + default: + switch traitCollection.horizontalSizeClass { + case .compact: navigationController?.gradientBorderView.isHidden = true - // make underneath view controller alive to fix layout issue due to view life cycle return .fullScreen - default: - switch traitCollection.horizontalSizeClass { - case .compact: - navigationController?.gradientBorderView.isHidden = true - return .fullScreen - default: - navigationController?.gradientBorderView.isHidden = false - return .formSheet - } + default: + navigationController?.gradientBorderView.isHidden = false + return .formSheet } } - - func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { + } + + func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { + return nil + } + + func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { + return false + } +} + +//MARK: - UIPageViewControllerDelegate + +extension WelcomeViewController: UIPageViewControllerDelegate { + func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } + + currentPage = currentViewController.page + } +} + +//MARK: - UIPageViewDataSource + +extension WelcomeViewController: UIPageViewControllerDataSource { + + func presentationIndex(for pageViewController: UIPageViewController) -> Int { + WelcomeContentPage.allCases.firstIndex(of: currentPage) ?? 0 + } + + func presentationCount(for pageViewController: UIPageViewController) -> Int { + return WelcomeContentPage.allCases.count + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { + guard let viewController = viewController as? WelcomeContentViewController else { return nil } + + let currentPage = viewController.page + + switch currentPage { + case .whatIsMastodon: + return nil + case .mastodonIsLikeThat: + return WelcomeContentViewController(page: .whatIsMastodon) + case .howDoIPickAServer: + return WelcomeContentViewController(page: .mastodonIsLikeThat) + } + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { + guard let viewController = viewController as? WelcomeContentViewController else { return nil } + + let currentPage = viewController.page + + switch currentPage { + case .whatIsMastodon: + return WelcomeContentViewController(page: .mastodonIsLikeThat) + case .mastodonIsLikeThat: + return WelcomeContentViewController(page: .howDoIPickAServer) + case .howDoIPickAServer: return nil } - - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } + } } From 4dff655b79b7cb20ed3e25779b2b341f74cdbd65 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 26 Nov 2022 15:57:22 +0100 Subject: [PATCH 02/94] Add localization to Xcode-project (#690) This way you can easily open `app.json` in Xcode --- Mastodon.xcodeproj/project.pbxproj | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index be3604e70..6dca1d070 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -666,6 +666,12 @@ D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPage.swift; sourceTree = ""; }; D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentViewController.swift; sourceTree = ""; }; D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPageView.swift; sourceTree = ""; }; + D8A6FE6129325F5900666A47 /* Intents.stringsdict */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; path = Intents.stringsdict; sourceTree = ""; }; + D8A6FE6229325F5900666A47 /* app.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = app.json; sourceTree = ""; }; + D8A6FE6329325F5900666A47 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + D8A6FE6429325F5900666A47 /* StringsConvertor */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = StringsConvertor; sourceTree = ""; }; + D8A6FE6529325F5900666A47 /* ios-infoPlist.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "ios-infoPlist.json"; sourceTree = ""; }; + D8A6FE6629325F5900666A47 /* Localizable.stringsdict */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; path = Localizable.stringsdict; sourceTree = ""; }; DB0009A826AEE5DC009B9D2D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/Intents.intentdefinition; sourceTree = ""; }; DB0009AD26AEE5E4009B9D2D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Intents.strings; sourceTree = ""; }; DB0140CE25C42AEE00F9F3CF /* OSLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; }; @@ -1591,6 +1597,19 @@ path = Pages; sourceTree = ""; }; + D8A6FE6029325F5900666A47 /* Localization */ = { + isa = PBXGroup; + children = ( + D8A6FE6129325F5900666A47 /* Intents.stringsdict */, + D8A6FE6229325F5900666A47 /* app.json */, + D8A6FE6329325F5900666A47 /* README.md */, + D8A6FE6429325F5900666A47 /* StringsConvertor */, + D8A6FE6529325F5900666A47 /* ios-infoPlist.json */, + D8A6FE6629325F5900666A47 /* Localizable.stringsdict */, + ); + path = Localization; + sourceTree = ""; + }; DB01409B25C40BB600F9F3CF /* Onboarding */ = { isa = PBXGroup; children = ( @@ -1797,6 +1816,7 @@ 1EBA4F56E920856A3FC84ACB /* Pods */, 3FE14AD363ED19AE7FF210A6 /* Frameworks */, DB98335F25C93B0400AD9700 /* Recovered References */, + D8A6FE6029325F5900666A47 /* Localization */, ); sourceTree = ""; }; From c925e48385e773c7222f5dd19ea5892c0e8bf668 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 26 Nov 2022 15:57:50 +0100 Subject: [PATCH 03/94] Add styling and localization to education (#690) --- Localization/app.json | 16 ++++++++++++- .../View/Pages/WelcomeContentPage.swift | 13 +++++----- .../View/Pages/WelcomeContentPageView.swift | 10 ++++++-- .../Generated/Strings.swift | 24 +++++++++++++++++++ .../Resources/Base.lproj/Localizable.strings | 10 ++++++++ 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 963b4aed1..998fe00cb 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -241,7 +241,21 @@ "welcome": { "slogan": "Social networking\nback in your hands.", "get_started": "Get Started", - "log_in": "Log In" + "log_in": "Log In", + "education": { + "what_is_mastodon": { + "title": "What is Mastodon?", + "description": "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.", + }, + "mastodon_is_like_that": { + "title": "Mastodon is like that", + "description": "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.", + }, + "how_do_i_pick_a_server": { + "title": "How do I pick a server?", + "description": "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.", + }, + } }, "login": { "title": "Welcome back", diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift index 9557e5c46..e97f82dd2 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift @@ -6,6 +6,7 @@ // import UIKit +import MastodonLocalization enum WelcomeContentPage: CaseIterable { case whatIsMastodon @@ -26,22 +27,22 @@ enum WelcomeContentPage: CaseIterable { var title: String { switch self { case .whatIsMastodon: - return "What is Mastodon?" + return L10n.Scene.Welcome.Education.WhatIsMastodon.title case .mastodonIsLikeThat: - return "Mastodon is like that" + return L10n.Scene.Welcome.Education.MastodonIsLikeThat.title case .howDoIPickAServer: - return "How to I pick a server?" + return L10n.Scene.Welcome.Education.HowDoIPickAServer.title } } var content: String { switch self { case .whatIsMastodon: - return "Long text\n\nhat is Mastodon?" + return L10n.Scene.Welcome.Education.WhatIsMastodon.description case .mastodonIsLikeThat: - return "Long text\n\nwhat Mastodon is like" + return L10n.Scene.Welcome.Education.MastodonIsLikeThat.description case .howDoIPickAServer: - return "Long text\n\nHow to I pick a server?" + return L10n.Scene.Welcome.Education.HowDoIPickAServer.description } } diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index 34ab1ec27..7f7c037b2 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -17,19 +17,25 @@ class WelcomeContentPageView: UIView { init(page: WelcomeContentPage) { //TODO: @zeitschlag Decide based on page which titleView, first page has mastodon-logo in it - //TODO: @zeitschlag Add styling titleView = UILabel() + titleView.font = WelcomeViewController.largeTitleFont + titleView.textColor = WelcomeViewController.largeTitleTextColor titleView.text = page.title + titleView.adjustsFontForContentSizeCategory = true + titleView.numberOfLines = 0 - //TODO: @zeitschlag Add styling label = UILabel() label.text = page.content + label.font = WelcomeViewController.subTitleFont + label.textColor = WelcomeViewController.largeTitleTextColor + label.adjustsFontForContentSizeCategory = true label.numberOfLines = 0 contentStackView = UIStackView(arrangedSubviews: [titleView, label, UIView()]) contentStackView.translatesAutoresizingMaskIntoConstraints = false contentStackView.axis = .vertical contentStackView.alignment = .leading + contentStackView.spacing = 8 super.init(frame: .zero) diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index b974ba7bc..8348ecb35 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1383,6 +1383,30 @@ public enum L10n { /// Social networking /// back in your hands. public static let slogan = L10n.tr("Localizable", "Scene.Welcome.Slogan", fallback: "Social networking\nback in your hands.") + public enum Education { + public enum HowDoIPickAServer { + /// Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. + /// + /// You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere. + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.description", fallback: "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.") + /// How do I pick a server? + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.title", fallback: "How do I pick a server?") + } + public enum MastodonIsLikeThat { + /// Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online. + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.description", fallback: "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.") + /// Mastodon is like that + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.title", fallback: "Mastodon is like that") + } + public enum WhatIsMastodon { + /// Imagine you have an email address that ends with @example.com. + /// + /// You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com. + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.description", fallback: "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.") + /// What is Mastodon? + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.title", fallback: "What is Mastodon?") + } + } } public enum Wizard { /// Double tap to dismiss this wizard diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index fb3e483cf..4ca8319d1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -486,6 +486,16 @@ uploaded to Mastodon."; "Scene.Welcome.LogIn" = "Log In"; "Scene.Welcome.Slogan" = "Social networking back in your hands."; +"Scene.Welcome.Education.WhatIsMastodon.title" = "What is Mastodon?"; +"Scene.Welcome.Education.WhatIsMastodon.description" = "Imagine you have an email address that ends with @example.com. + +You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com."; +"Scene.Welcome.Education.MastodonIsLikeThat.title" = "Mastodon is like that"; +"Scene.Welcome.Education.MastodonIsLikeThat.description" = "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online."; +"Scene.Welcome.Education.HowDoIPickAServer.title" = "How do I pick a server?"; +"Scene.Welcome.Education.HowDoIPickAServer.description" = "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. + +You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; "Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file From fa696a6f36db2dce70ee7293270942c45b7b4225 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 27 Nov 2022 14:16:09 +0100 Subject: [PATCH 04/94] Figure out a way to attach to scrolling in pages (#690) --- .../View/WelcomeIllustrationView.swift | 34 ++++--------------- .../Welcome/WelcomeViewController.swift | 17 ++++++++++ 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 1fca1afef..7c153ea9a 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -205,32 +205,10 @@ extension WelcomeIllustrationView { } } } - + + func update(currentPage: WelcomeContentPage, contentOffset: CGFloat) { + // why does it jump back??? + print("\(contentOffset) — \(currentPage)") + //TODO: @zeitschlag update frames + } } - -#if canImport(SwiftUI) && DEBUG -import SwiftUI - -struct WelcomeIllustrationView_Previews: PreviewProvider { - - static var previews: some View { - Group { - UIViewPreview(width: 375) { - let view = WelcomeIllustrationView() - view.layout = .compact - return view - } - .previewLayout(.fixed(width: 375, height: 1500)) - UIViewPreview(width: 547) { - let view = WelcomeIllustrationView() - view.layout = .regular - return view - } - .previewLayout(.fixed(width: 547, height: 1500)) - } - } - -} - -#endif - diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index b943356c6..1aeaa1770 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -145,6 +145,13 @@ extension WelcomeViewController { view.addSubview(pageViewController.view) pageViewController.didMove(toParent: self) + + let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } + + for scrollView in scrollviews { + scrollView.delegate = self + } + NSLayoutConstraint.activate([ pageViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), @@ -398,6 +405,8 @@ extension WelcomeViewController: UIPageViewControllerDelegate { guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } currentPage = currentViewController.page + //FIXME: @zeitschlag fix +// welcomeIllustrationView.update(for: currentPage, contentOffset: 1000) } } @@ -443,3 +452,11 @@ extension WelcomeViewController: UIPageViewControllerDataSource { } } } + +extension WelcomeViewController: UIScrollViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + print(scrollView.contentOffset.x) + //TODO: @zeitschlag sync view + welcomeIllustrationView.update(currentPage: currentPage, contentOffset: scrollView.contentOffset.x) + } +} From 32bc94322dc654cf0e89a2ed9f060717f096fb04 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 27 Nov 2022 22:05:20 +0100 Subject: [PATCH 05/94] Fix scrollview-offset-calculation (#690) --- .../Welcome/View/WelcomeIllustrationView.swift | 5 ++--- .../Welcome/WelcomeViewController.swift | 15 ++++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 7c153ea9a..317fead61 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -206,9 +206,8 @@ extension WelcomeIllustrationView { } } - func update(currentPage: WelcomeContentPage, contentOffset: CGFloat) { - // why does it jump back??? - print("\(contentOffset) — \(currentPage)") + func update(contentOffset: CGFloat) { //TODO: @zeitschlag update frames + print(Int(contentOffset)) } } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 1aeaa1770..3b5fa8f57 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -85,6 +85,7 @@ final class WelcomeViewController: UIViewController, NeedsDependency { return pageController }() var currentPage: WelcomeContentPage = .whatIsMastodon + var currentPageOffset = 0 } extension WelcomeViewController { @@ -405,8 +406,11 @@ extension WelcomeViewController: UIPageViewControllerDelegate { guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } currentPage = currentViewController.page - //FIXME: @zeitschlag fix -// welcomeIllustrationView.update(for: currentPage, contentOffset: 1000) + + if let pageIndex = WelcomeContentPage.allCases.firstIndex(of: currentPage) { + let offset = Int(pageIndex) * Int(pageViewController.view.frame.width) + currentPageOffset = offset + } } } @@ -455,8 +459,9 @@ extension WelcomeViewController: UIPageViewControllerDataSource { extension WelcomeViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { - print(scrollView.contentOffset.x) - //TODO: @zeitschlag sync view - welcomeIllustrationView.update(currentPage: currentPage, contentOffset: scrollView.contentOffset.x) + let weirdScrollViewJumpingCorrectionFactor = pageViewController.view.frame.width + let contentOffset = CGFloat(currentPageOffset) + scrollView.contentOffset.x - weirdScrollViewJumpingCorrectionFactor + + welcomeIllustrationView.update(contentOffset: contentOffset) } } From 38cafae28b6da7cc0925517626e31045be17a8d9 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 4 Dec 2022 21:07:11 +0100 Subject: [PATCH 06/94] [WIP] Move layoutcode and move plane (#690) Turns out: Changing the constant of a layoutconstraint does the job, but is' laggy af, so I have to come up with another solution. --- .../View/WelcomeIllustrationView.swift | 419 ++++++++++-------- .../Welcome/WelcomeViewController.swift | 127 +----- 2 files changed, 247 insertions(+), 299 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 317fead61..984c5cd86 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -12,202 +12,239 @@ import MastodonUI import MastodonLocalization final class WelcomeIllustrationView: UIView { - - let cloudBaseImageView = UIImageView() - let rightHillImageView = UIImageView() - let leftHillImageView = UIImageView() - let centerHillImageView = UIImageView() - - private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image - private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image - private let elephantThreeOnGrassWithTreeTwoImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image - private let elephantThreeOnGrassWithTreeThreeImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image - private let elephantThreeOnGrassImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image - private let elephantThreeOnGrassExtendImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassExtend.image - - // layout outside - let elephantOnAirplaneWithContrailImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantOnAirplaneWithContrail.image) - imageView.contentMode = .scaleAspectFill - return imageView - }() - - var layout: Layout = .compact { - didSet { - setNeedsLayout() - } - } - var aspectLayoutConstraint: NSLayoutConstraint! - override init(frame: CGRect) { - super.init(frame: frame) - _init() + let cloudBaseImageView = UIImageView() + let rightHillImageView = UIImageView() + let leftHillImageView = UIImageView() + let centerHillImageView = UIImageView() + + private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image + private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image + private let elephantThreeOnGrassWithTreeTwoImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image + private let elephantThreeOnGrassWithTreeThreeImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image + private let elephantThreeOnGrassImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image + private let elephantThreeOnGrassExtendImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassExtend.image + + var bottomAnchorLayoutConstraint: NSLayoutConstraint? + var elephantOnAirplaneLeftConstraint: NSLayoutConstraint? + + let elephantOnAirplaneWithContrailImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantOnAirplaneWithContrail.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + var layout: Layout = .compact { + didSet { + setNeedsLayout() } - - required init?(coder: NSCoder) { - super.init(coder: coder) - _init() - } - + } + var aspectLayoutConstraint: NSLayoutConstraint! + + override init(frame: CGRect) { + super.init(frame: frame) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + } extension WelcomeIllustrationView { - enum Layout { - case compact - case regular - - var artworkImageSize: CGSize { - switch self { - case .compact: return CGSize(width: 375, height: 1500) - case .regular: return CGSize(width: 547, height: 3000) - } - } + enum Layout { + case compact + case regular + + var artworkImageSize: CGSize { + switch self { + case .compact: return CGSize(width: 375, height: 1500) + case .regular: return CGSize(width: 547, height: 3000) + } } -} - -extension WelcomeIllustrationView { - - private func _init() { - backgroundColor = Asset.Scene.Welcome.Illustration.backgroundCyan.color - - let topPaddingView = UIView() - - topPaddingView.translatesAutoresizingMaskIntoConstraints = false - addSubview(topPaddingView) - NSLayoutConstraint.activate([ - topPaddingView.topAnchor.constraint(equalTo: topAnchor), - topPaddingView.leadingAnchor.constraint(equalTo: leadingAnchor), - topPaddingView.trailingAnchor.constraint(equalTo: trailingAnchor), - ]) - - cloudBaseImageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(cloudBaseImageView) - NSLayoutConstraint.activate([ - cloudBaseImageView.topAnchor.constraint(equalTo: topPaddingView.bottomAnchor), - cloudBaseImageView.leadingAnchor.constraint(equalTo: leadingAnchor), - cloudBaseImageView.trailingAnchor.constraint(equalTo: trailingAnchor), - cloudBaseImageView.bottomAnchor.constraint(equalTo: bottomAnchor), - ]) - - [ - rightHillImageView, - leftHillImageView, - centerHillImageView, - ].forEach { imageView in - imageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(imageView) - imageView.pinTo(to: cloudBaseImageView) - } - - aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) - aspectLayoutConstraint.isActive = true - } - - override func layoutSubviews() { - super.layoutSubviews() - - switch layout { - case .compact: - layoutCompact() - case .regular: - layoutRegular() - } - - aspectLayoutConstraint.isActive = false - aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) - aspectLayoutConstraint.isActive = true - } - - private func layoutCompact() { - let size = layout.artworkImageSize - let width = size.width - let height = size.height - - cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw cloud - cloudBaseImage.draw(at: CGPoint(x: 0, y: height - cloudBaseImage.size.height)) - } - - rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeTwoImage - // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height + 25)) - } - - leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeThree - // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: 0, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 30)) - } - - centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrass - elephantThreeOnGrassImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassImage.size.height)) - } - } - - private func layoutRegular() { - let size = layout.artworkImageSize - let width = size.width - let height = size.height - - cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw cloud - cloudBaseExtendImage.draw(at: CGPoint(x: 0, y: height - cloudBaseExtendImage.size.height)) - - rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeTwoImage - // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height - 20)) - } - - leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeThree - // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: -160, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 80)) - } - - centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrass - elephantThreeOnGrassExtendImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassExtendImage.size.height)) - } - } - } - - func update(contentOffset: CGFloat) { - //TODO: @zeitschlag update frames - print(Int(contentOffset)) + } +} + +extension WelcomeIllustrationView { + + private func _init() { + backgroundColor = Asset.Scene.Welcome.Illustration.backgroundCyan.color + + cloudBaseImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(cloudBaseImageView) + NSLayoutConstraint.activate([ + cloudBaseImageView.leadingAnchor.constraint(equalTo: leadingAnchor), + cloudBaseImageView.trailingAnchor.constraint(equalTo: trailingAnchor), + cloudBaseImageView.bottomAnchor.constraint(equalTo: bottomAnchor), + ]) + + addSubview(elephantOnAirplaneWithContrailImageView) + + let elephantOnAirplaneLeftConstraint = leftAnchor.constraint(equalTo: elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 178) // add 12pt bleeding + NSLayoutConstraint.activate([ + elephantOnAirplaneLeftConstraint, + elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: centerYAnchor), + // make a little bit large + elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.84), + ]) + + self.elephantOnAirplaneLeftConstraint = elephantOnAirplaneLeftConstraint + [ + rightHillImageView, + leftHillImageView, + centerHillImageView, + ].forEach { imageView in + imageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(imageView) + imageView.pinTo(to: cloudBaseImageView) + } + + aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) + aspectLayoutConstraint.isActive = true + } + + override func layoutSubviews() { + super.layoutSubviews() + + switch layout { + case .compact: + layoutCompact() + case .regular: + layoutRegular() + } + + aspectLayoutConstraint.isActive = false + aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) + aspectLayoutConstraint.isActive = true + } + + private func layoutCompact() { + let size = layout.artworkImageSize + let width = size.width + let height = size.height + + cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw cloud + cloudBaseImage.draw(at: CGPoint(x: 0, y: height - cloudBaseImage.size.height)) + } + + rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrassWithTreeTwoImage + // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY + elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height + 25)) + } + + leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrassWithTreeThree + // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY + elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: 0, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 30)) + } + + centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrass + elephantThreeOnGrassImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassImage.size.height)) + } + } + + private func layoutRegular() { + let size = layout.artworkImageSize + let width = size.width + let height = size.height + + cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw cloud + cloudBaseExtendImage.draw(at: CGPoint(x: 0, y: height - cloudBaseExtendImage.size.height)) + + rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrassWithTreeTwoImage + // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY + elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height - 20)) + } + + leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrassWithTreeThree + // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY + elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: -160, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 80)) + } + + centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: size)) + + // draw elephantThreeOnGrass + elephantThreeOnGrassExtendImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassExtendImage.size.height)) + } + } + } + + func setup() { + layout = { + switch traitCollection.userInterfaceIdiom { + case .phone: + return .compact + default: + return .regular + } + }() + + // set illustration + guard superview == nil else { + return + } + contentMode = .scaleAspectFit + + cloudBaseImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) + ) + rightHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) + ) + leftHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) + ) + centerHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) + ) + + elephantOnAirplaneWithContrailImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) + ) + } + + func update(contentOffset: CGFloat) { + // updating the constraints doesn't work smoothly. + elephantOnAirplaneLeftConstraint?.constant = -(contentOffset / 50) + 111 } } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 3b5fa8f57..eaf2faf5b 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -21,29 +21,9 @@ final class WelcomeViewController: UIViewController, NeedsDependency { private(set) lazy var viewModel = WelcomeViewModel(context: context) let welcomeIllustrationView = WelcomeIllustrationView() - var welcomeIllustrationViewBottomAnchorLayoutConstraint: NSLayoutConstraint? private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) - private(set) lazy var logoImageView: UIImageView = { - let image = Asset.Scene.Welcome.mastodonLogo.image - let imageView = UIImageView(image: image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.isHidden = true - return imageView - }() - - private(set) lazy var sloganLabel: UILabel = { - let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 34, weight: .bold)) - label.textColor = Asset.Colors.Label.primary.color - label.text = L10n.Scene.Welcome.slogan - label.adjustsFontForContentSizeCategory = true - label.translatesAutoresizingMaskIntoConstraints = false - label.numberOfLines = 0 - return label - }() - let buttonContainer = UIStackView() private(set) lazy var signUpButton: PrimaryActionButton = { @@ -101,7 +81,20 @@ extension WelcomeViewController { view.overrideUserInterfaceStyle = .light setupOnboardingAppearance() - setupIllustrationLayout() + + view.addSubview(welcomeIllustrationView) + welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false + + let bottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + + NSLayoutConstraint.activate([ + welcomeIllustrationView.topAnchor.constraint(equalTo: view.topAnchor), + welcomeIllustrationView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: welcomeIllustrationView.trailingAnchor), + bottomAnchorLayoutConstraint + ]) + + welcomeIllustrationView.bottomAnchorLayoutConstraint = bottomAnchorLayoutConstraint buttonContainer.axis = .vertical buttonContainer.spacing = 12 @@ -147,6 +140,8 @@ extension WelcomeViewController { pageViewController.didMove(toParent: self) + + let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } for scrollView in scrollviews { @@ -183,7 +178,7 @@ extension WelcomeViewController { if view.safeAreaInsets.bottom == 0 { overlap += 56 } - welcomeIllustrationViewBottomAnchorLayoutConstraint?.constant = overlap + welcomeIllustrationView.bottomAnchorLayoutConstraint?.constant = overlap } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { @@ -194,7 +189,6 @@ extension WelcomeViewController { setupIllustrationLayout() setupButtonShadowView() } - } extension WelcomeViewController { @@ -245,91 +239,7 @@ extension WelcomeViewController { } private func setupIllustrationLayout() { - welcomeIllustrationView.layout = { - switch traitCollection.userInterfaceIdiom { - case .phone: - return .compact - default: - return .regular - } - }() - - // set logo - if logoImageView.superview == nil { - view.addSubview(logoImageView) - NSLayoutConstraint.activate([ - logoImageView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor), - logoImageView.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor, constant: 35), - view.readableContentGuide.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor, constant: 35), - logoImageView.heightAnchor.constraint(equalTo: logoImageView.widthAnchor, multiplier: 75.0/269.0), - ]) - logoImageView.setContentHuggingPriority(.defaultHigh, for: .vertical) - } - - // set illustration - guard welcomeIllustrationView.superview == nil else { - return - } - welcomeIllustrationView.contentMode = .scaleAspectFit - - welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false - welcomeIllustrationViewBottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 5) - - view.addSubview(welcomeIllustrationView) - // welcomeIllustrationView.isHidden = true - NSLayoutConstraint.activate([ - view.leftAnchor.constraint(equalTo: welcomeIllustrationView.leftAnchor, constant: 15), - welcomeIllustrationView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 15), - welcomeIllustrationViewBottomAnchorLayoutConstraint!.priority(.required - 1), - ]) - - welcomeIllustrationView.cloudBaseImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) - ) - welcomeIllustrationView.rightHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) - ) - welcomeIllustrationView.leftHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) - ) - welcomeIllustrationView.centerHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) - ) - - let topPaddingView = UIView() - topPaddingView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(topPaddingView) - NSLayoutConstraint.activate([ - topPaddingView.topAnchor.constraint(equalTo: logoImageView.bottomAnchor), - topPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), - topPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), - ]) - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(welcomeIllustrationView.elephantOnAirplaneWithContrailImageView) - NSLayoutConstraint.activate([ - view.leftAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 12), // add 12pt bleeding - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.topAnchor.constraint(equalTo: topPaddingView.bottomAnchor), - // make a little bit large - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.84), - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.heightAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.widthAnchor, multiplier: 105.0/318.0), - ]) - let bottomPaddingView = UIView() - bottomPaddingView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(bottomPaddingView) - NSLayoutConstraint.activate([ - bottomPaddingView.topAnchor.constraint(equalTo: welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.bottomAnchor), - bottomPaddingView.leadingAnchor.constraint(equalTo: logoImageView.leadingAnchor), - bottomPaddingView.trailingAnchor.constraint(equalTo: logoImageView.trailingAnchor), - bottomPaddingView.bottomAnchor.constraint(equalTo: view.centerYAnchor), - bottomPaddingView.heightAnchor.constraint(equalTo: topPaddingView.heightAnchor, multiplier: 4), - ]) - - welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) - ) - - view.bringSubviewToFront(logoImageView) - view.bringSubviewToFront(sloganLabel) + welcomeIllustrationView.setup() } } @@ -410,6 +320,7 @@ extension WelcomeViewController: UIPageViewControllerDelegate { if let pageIndex = WelcomeContentPage.allCases.firstIndex(of: currentPage) { let offset = Int(pageIndex) * Int(pageViewController.view.frame.width) currentPageOffset = offset + welcomeIllustrationView.update(contentOffset: CGFloat(offset)) } } } From df783b3e5319c416d16c967ad37c29e9855deca3 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 7 Dec 2022 23:04:22 +0100 Subject: [PATCH 07/94] Make images move (#690) They're not moving in the right direction yet, and it's entirely based on autolayout and not on layoutSubviews. We'll see, if that's the way to go. --- .../View/WelcomeIllustrationView.swift | 212 ++++++------------ .../Welcome/WelcomeViewController.swift | 10 +- 2 files changed, 68 insertions(+), 154 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 984c5cd86..15ceed815 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -14,9 +14,6 @@ import MastodonLocalization final class WelcomeIllustrationView: UIView { let cloudBaseImageView = UIImageView() - let rightHillImageView = UIImageView() - let leftHillImageView = UIImageView() - let centerHillImageView = UIImageView() private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image @@ -25,8 +22,10 @@ final class WelcomeIllustrationView: UIView { private let elephantThreeOnGrassImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image private let elephantThreeOnGrassExtendImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassExtend.image - var bottomAnchorLayoutConstraint: NSLayoutConstraint? var elephantOnAirplaneLeftConstraint: NSLayoutConstraint? + var leftHillLeftConstraint: NSLayoutConstraint? + var centerHillLeftConstraint: NSLayoutConstraint? + var rightHillRightConstraint: NSLayoutConstraint? let elephantOnAirplaneWithContrailImageView: UIImageView = { let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantOnAirplaneWithContrail.image) @@ -35,11 +34,28 @@ final class WelcomeIllustrationView: UIView { return imageView }() - var layout: Layout = .compact { - didSet { - setNeedsLayout() - } - } + let rightHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let leftHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let centerHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + var aspectLayoutConstraint: NSLayoutConstraint! override init(frame: CGRect) { @@ -54,20 +70,6 @@ final class WelcomeIllustrationView: UIView { } -extension WelcomeIllustrationView { - enum Layout { - case compact - case regular - - var artworkImageSize: CGSize { - switch self { - case .compact: return CGSize(width: 375, height: 1500) - case .regular: return CGSize(width: 547, height: 3000) - } - } - } -} - extension WelcomeIllustrationView { private func _init() { @@ -79,8 +81,45 @@ extension WelcomeIllustrationView { cloudBaseImageView.leadingAnchor.constraint(equalTo: leadingAnchor), cloudBaseImageView.trailingAnchor.constraint(equalTo: trailingAnchor), cloudBaseImageView.bottomAnchor.constraint(equalTo: bottomAnchor), + cloudBaseImageView.topAnchor.constraint(equalTo: topAnchor) ]) + rightHillImageView.translatesAutoresizingMaskIntoConstraints = false + + let rightHillRightConstraint = rightAnchor.constraint(equalTo: rightHillImageView.rightAnchor) + addSubview(rightHillImageView) + NSLayoutConstraint.activate([ + rightHillImageView.widthAnchor.constraint(equalTo: widthAnchor), + rightHillRightConstraint, + bottomAnchor.constraint(equalTo: rightHillImageView.bottomAnchor), + ]) + self.rightHillRightConstraint = rightHillRightConstraint + + leftHillImageView.translatesAutoresizingMaskIntoConstraints = false + + let leftHillLeftConstraint = leftHillImageView.leftAnchor.constraint(equalTo: leftAnchor) + addSubview(leftHillImageView) + NSLayoutConstraint.activate([ + leftHillImageView.widthAnchor.constraint(equalTo: widthAnchor), + leftHillLeftConstraint, + bottomAnchor.constraint(equalTo: leftHillImageView.bottomAnchor), + ]) + + self.leftHillLeftConstraint = leftHillLeftConstraint + + centerHillImageView.translatesAutoresizingMaskIntoConstraints = false + + let centerHillLeftConstraint = centerHillImageView.leftAnchor.constraint(equalTo: leftAnchor) + + addSubview(centerHillImageView) + NSLayoutConstraint.activate([ + centerHillLeftConstraint, + bottomAnchor.constraint(equalTo: centerHillImageView.bottomAnchor), + trailingAnchor.constraint(equalTo: centerHillImageView.trailingAnchor), + ]) + + self.centerHillLeftConstraint = centerHillLeftConstraint + addSubview(elephantOnAirplaneWithContrailImageView) let elephantOnAirplaneLeftConstraint = leftAnchor.constraint(equalTo: elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 178) // add 12pt bleeding @@ -92,132 +131,12 @@ extension WelcomeIllustrationView { ]) self.elephantOnAirplaneLeftConstraint = elephantOnAirplaneLeftConstraint - [ - rightHillImageView, - leftHillImageView, - centerHillImageView, - ].forEach { imageView in - imageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(imageView) - imageView.pinTo(to: cloudBaseImageView) - } - aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) - aspectLayoutConstraint.isActive = true - } - - override func layoutSubviews() { - super.layoutSubviews() - - switch layout { - case .compact: - layoutCompact() - case .regular: - layoutRegular() - } - - aspectLayoutConstraint.isActive = false - aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) - aspectLayoutConstraint.isActive = true - } - - private func layoutCompact() { - let size = layout.artworkImageSize - let width = size.width - let height = size.height - - cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw cloud - cloudBaseImage.draw(at: CGPoint(x: 0, y: height - cloudBaseImage.size.height)) - } - - rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeTwoImage - // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height + 25)) - } - - leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeThree - // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: 0, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 30)) - } - - centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrass - elephantThreeOnGrassImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassImage.size.height)) - } - } - - private func layoutRegular() { - let size = layout.artworkImageSize - let width = size.width - let height = size.height - - cloudBaseImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw cloud - cloudBaseExtendImage.draw(at: CGPoint(x: 0, y: height - cloudBaseExtendImage.size.height)) - - rightHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeTwoImage - // elephantThreeOnGrassWithTreeTwo.bottomY - 25 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeTwoImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeTwoImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeTwoImage.size.height - 20)) - } - - leftHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrassWithTreeThree - // elephantThreeOnGrassWithTreeThree.bottomY + 30 align to elephantThreeOnGrassImage.centerY - elephantThreeOnGrassWithTreeThreeImage.draw(at: CGPoint(x: -160, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeThreeImage.size.height - 80)) - } - - centerHillImageView.image = UIGraphicsImageRenderer(size: size).image { context in - // clear background - UIColor.clear.setFill() - context.fill(CGRect(origin: .zero, size: size)) - - // draw elephantThreeOnGrass - elephantThreeOnGrassExtendImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassExtendImage.size.height)) - } - } +// aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) +// aspectLayoutConstraint.isActive = true } func setup() { - layout = { - switch traitCollection.userInterfaceIdiom { - case .phone: - return .compact - default: - return .regular - } - }() // set illustration guard superview == nil else { @@ -246,5 +165,8 @@ extension WelcomeIllustrationView { func update(contentOffset: CGFloat) { // updating the constraints doesn't work smoothly. elephantOnAirplaneLeftConstraint?.constant = -(contentOffset / 50) + 111 + leftHillLeftConstraint?.constant = (contentOffset / 50) + 111 + centerHillLeftConstraint?.constant = (contentOffset / 50) + 111 + rightHillRightConstraint?.constant = (contentOffset / 50) + 111 } } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index eaf2faf5b..68e3ffae0 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -85,17 +85,13 @@ extension WelcomeViewController { view.addSubview(welcomeIllustrationView) welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false - let bottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - NSLayoutConstraint.activate([ welcomeIllustrationView.topAnchor.constraint(equalTo: view.topAnchor), welcomeIllustrationView.leadingAnchor.constraint(equalTo: view.leadingAnchor), view.trailingAnchor.constraint(equalTo: welcomeIllustrationView.trailingAnchor), - bottomAnchorLayoutConstraint + view.bottomAnchor.constraint(equalTo: welcomeIllustrationView.bottomAnchor) ]) - welcomeIllustrationView.bottomAnchorLayoutConstraint = bottomAnchorLayoutConstraint - buttonContainer.axis = .vertical buttonContainer.spacing = 12 buttonContainer.isLayoutMarginsRelativeArrangement = true @@ -139,9 +135,6 @@ extension WelcomeViewController { view.addSubview(pageViewController.view) pageViewController.didMove(toParent: self) - - - let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } for scrollView in scrollviews { @@ -178,7 +171,6 @@ extension WelcomeViewController { if view.safeAreaInsets.bottom == 0 { overlap += 56 } - welcomeIllustrationView.bottomAnchorLayoutConstraint?.constant = overlap } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { From c22f1fc66ee9877032886128dfac9c4bd6e5a856 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 8 Dec 2022 00:02:00 +0100 Subject: [PATCH 08/94] [WIP] Fix animations on illustration-view (#690) It's still broken on iPad. --- .../View/WelcomeIllustrationView.swift | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 15ceed815..08e2e43e1 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -11,9 +11,19 @@ import MastodonCore import MastodonUI import MastodonLocalization -final class WelcomeIllustrationView: UIView { +fileprivate extension CGFloat { + static let centerHillStartPosition = 20.0 + static let airplaneStartPosition = -178.0 + static let leftHillStartPosition = 30.0 + static let rightHillStartPosition = -161.0 - let cloudBaseImageView = UIImageView() + static let airplaneSpeed = 50.0 + static let leftHillSpeed = 20.0 + static let centerHillSpeed = 40.0 + static let rightHillSpeed = 20.0 +} + +final class WelcomeIllustrationView: UIView { private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image @@ -42,7 +52,7 @@ final class WelcomeIllustrationView: UIView { }() let leftHillImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image) + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFill return imageView @@ -55,6 +65,12 @@ final class WelcomeIllustrationView: UIView { return imageView }() + let cloudBaseImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.cloudBase.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFit + return imageView + }() var aspectLayoutConstraint: NSLayoutConstraint! @@ -84,56 +100,47 @@ extension WelcomeIllustrationView { cloudBaseImageView.topAnchor.constraint(equalTo: topAnchor) ]) - rightHillImageView.translatesAutoresizingMaskIntoConstraints = false - - let rightHillRightConstraint = rightAnchor.constraint(equalTo: rightHillImageView.rightAnchor) + let rightHillRightConstraint = rightAnchor.constraint(equalTo: rightHillImageView.rightAnchor, constant: .rightHillStartPosition) addSubview(rightHillImageView) NSLayoutConstraint.activate([ - rightHillImageView.widthAnchor.constraint(equalTo: widthAnchor), + rightHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.64), rightHillRightConstraint, - bottomAnchor.constraint(equalTo: rightHillImageView.bottomAnchor), + bottomAnchor.constraint(equalTo: rightHillImageView.bottomAnchor, constant: 149), ]) self.rightHillRightConstraint = rightHillRightConstraint - leftHillImageView.translatesAutoresizingMaskIntoConstraints = false - - let leftHillLeftConstraint = leftHillImageView.leftAnchor.constraint(equalTo: leftAnchor) + let leftHillLeftConstraint = leftAnchor.constraint(equalTo: leftHillImageView.leftAnchor, constant: .leftHillStartPosition) addSubview(leftHillImageView) NSLayoutConstraint.activate([ - leftHillImageView.widthAnchor.constraint(equalTo: widthAnchor), + leftHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.72), leftHillLeftConstraint, - bottomAnchor.constraint(equalTo: leftHillImageView.bottomAnchor), + bottomAnchor.constraint(equalTo: leftHillImageView.bottomAnchor, constant: 187), ]) self.leftHillLeftConstraint = leftHillLeftConstraint - centerHillImageView.translatesAutoresizingMaskIntoConstraints = false - - let centerHillLeftConstraint = centerHillImageView.leftAnchor.constraint(equalTo: leftAnchor) + let centerHillLeftConstraint = leftAnchor.constraint(equalTo: centerHillImageView.leftAnchor, constant: .centerHillStartPosition) addSubview(centerHillImageView) NSLayoutConstraint.activate([ centerHillLeftConstraint, - bottomAnchor.constraint(equalTo: centerHillImageView.bottomAnchor), - trailingAnchor.constraint(equalTo: centerHillImageView.trailingAnchor), + bottomAnchor.constraint(equalTo: centerHillImageView.bottomAnchor, constant: -18), + centerHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.2), ]) self.centerHillLeftConstraint = centerHillLeftConstraint addSubview(elephantOnAirplaneWithContrailImageView) - let elephantOnAirplaneLeftConstraint = leftAnchor.constraint(equalTo: elephantOnAirplaneWithContrailImageView.leftAnchor, constant: 178) // add 12pt bleeding + let elephantOnAirplaneLeftConstraint = elephantOnAirplaneWithContrailImageView.leftAnchor.constraint(equalTo: leftAnchor, constant: .airplaneStartPosition) // add 12pt bleeding NSLayoutConstraint.activate([ elephantOnAirplaneLeftConstraint, - elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: centerYAnchor), + elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: leftHillImageView.topAnchor), // make a little bit large elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.84), ]) self.elephantOnAirplaneLeftConstraint = elephantOnAirplaneLeftConstraint - -// aspectLayoutConstraint = cloudBaseImageView.widthAnchor.constraint(equalTo: cloudBaseImageView.heightAnchor, multiplier: layout.artworkImageSize.width / layout.artworkImageSize.height) -// aspectLayoutConstraint.isActive = true } func setup() { @@ -163,10 +170,9 @@ extension WelcomeIllustrationView { } func update(contentOffset: CGFloat) { - // updating the constraints doesn't work smoothly. - elephantOnAirplaneLeftConstraint?.constant = -(contentOffset / 50) + 111 - leftHillLeftConstraint?.constant = (contentOffset / 50) + 111 - centerHillLeftConstraint?.constant = (contentOffset / 50) + 111 - rightHillRightConstraint?.constant = (contentOffset / 50) + 111 + elephantOnAirplaneLeftConstraint?.constant = contentOffset / .airplaneSpeed + .airplaneStartPosition + leftHillLeftConstraint?.constant = contentOffset / .leftHillSpeed + .leftHillStartPosition + centerHillLeftConstraint?.constant = contentOffset / .centerHillSpeed + .centerHillStartPosition + rightHillRightConstraint?.constant = contentOffset / .rightHillSpeed + .rightHillStartPosition } } From 3a00010d891592b580be98ff87d1762f846ef56e Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 11 Dec 2022 23:57:58 +0100 Subject: [PATCH 09/94] Use native navigationItem instead of bottom-view (#690) --- .../MastodonConfirmEmailViewController.swift | 2 - .../MastodonPickServerViewController.swift | 7 +- .../MastodonRegisterViewController.swift | 66 +++++-------------- .../MastodonServerRulesViewController.swift | 46 ++----------- 4 files changed, 21 insertions(+), 100 deletions(-) diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index ae8a4933e..71a1aeb02 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -67,8 +67,6 @@ extension MastodonConfirmEmailViewController { override func viewDidLoad() { - navigationItem.leftBarButtonItem = UIBarButtonItem() - setupOnboardingAppearance() configureTitleLabel() configureMargin() diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 057c742c1..bcb040757 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -234,7 +234,6 @@ extension MastodonPickServerViewController { } .store(in: &disposeBag) - navigationActionView.backButton.addTarget(self, action: #selector(MastodonPickServerViewController.backButtonDidPressed(_:)), for: .touchUpInside) navigationActionView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) } @@ -260,11 +259,7 @@ extension MastodonPickServerViewController { } extension MastodonPickServerViewController { - - @objc private func backButtonDidPressed(_ sender: UIButton) { - navigationController?.popViewController(animated: true) - } - + @objc private func nextButtonDidPressed(_ sender: UIButton) { os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) guard let server = viewModel.selectedServer.value else { return } diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index f239e59b7..b066827d7 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -54,26 +54,13 @@ final class MastodonRegisterViewController: UIViewController, NeedsDependency, O documentPickerController.delegate = self return documentPickerController }() - - let navigationActionView: NavigationActionView = { - let navigationActionView = NavigationActionView() - navigationActionView.backgroundColor = Asset.Scene.Onboarding.background.color - return navigationActionView - }() - - deinit { - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", (#file as NSString).lastPathComponent, #line, #function) - } - } extension MastodonRegisterViewController { override func viewDidLoad() { super.viewDidLoad() - - navigationItem.leftBarButtonItem = UIBarButtonItem() - + setupOnboardingAppearance() viewModel.backgroundColor = view.backgroundColor ?? .clear defer { @@ -86,34 +73,14 @@ extension MastodonRegisterViewController { hostingViewController.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(hostingViewController.view) hostingViewController.view.pinToParent() - - navigationActionView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(navigationActionView) - defer { - view.bringSubviewToFront(navigationActionView) - } - NSLayoutConstraint.activate([ - navigationActionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - navigationActionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - view.bottomAnchor.constraint(equalTo: navigationActionView.bottomAnchor), - ]) - - navigationActionView - .observe(\.bounds, options: [.initial, .new]) { [weak self] navigationActionView, _ in - guard let self = self else { return } - let inset = navigationActionView.frame.height - self.viewModel.bottomPaddingHeight = inset - } - .store(in: &observations) - - navigationActionView.backButton.addTarget(self, action: #selector(MastodonRegisterViewController.backButtonPressed(_:)), for: .touchUpInside) - navigationActionView.nextButton.addTarget(self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:)), for: .touchUpInside) - + + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) + viewModel.$isAllValid .receive(on: DispatchQueue.main) .sink { [weak self] isAllValid in guard let self = self else { return } - self.navigationActionView.nextButton.isEnabled = isAllValid + self.navigationItem.rightBarButtonItem?.isEnabled = isAllValid } .store(in: &disposeBag) @@ -165,13 +132,15 @@ extension MastodonRegisterViewController { } .store(in: &disposeBag) - viewModel.$isRegistering - .receive(on: DispatchQueue.main) - .sink { [weak self] isRegistering in - guard let self = self else { return } - isRegistering ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() - } - .store(in: &disposeBag) +// viewModel.$isRegistering +// .receive(on: DispatchQueue.main) +// .sink { [weak self] isRegistering in +// guard let self = self else { return } +// isRegistering ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() +// } +// .store(in: &disposeBag) + + title = L10n.Scene.Register.title(viewModel.domain) } override func viewDidAppear(_ animated: Bool) { @@ -183,12 +152,7 @@ extension MastodonRegisterViewController { } extension MastodonRegisterViewController { - - @objc private func backButtonPressed(_ sender: UIButton) { - logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") - navigationController?.popViewController(animated: true) - } - + @objc private func nextButtonPressed(_ sender: UIButton) { logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index f850991f2..35be5c2d9 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -26,9 +26,7 @@ final class MastodonServerRulesViewController: UIViewController, NeedsDependency weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } var viewModel: MastodonServerRulesViewModel! - - let stackView = UIStackView() - + let tableView: UITableView = { let tableView = UITableView() tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: String(describing: OnboardingHeadlineTableViewCell.self)) @@ -40,17 +38,6 @@ final class MastodonServerRulesViewController: UIViewController, NeedsDependency tableView.sectionHeaderTopPadding = 0 return tableView }() - - let navigationActionView: NavigationActionView = { - let navigationActionView = NavigationActionView() - navigationActionView.backgroundColor = Asset.Scene.Onboarding.background.color - return navigationActionView - }() - - deinit { - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - } - } extension MastodonServerRulesViewController { @@ -58,39 +45,19 @@ extension MastodonServerRulesViewController { override func viewDidLoad() { super.viewDidLoad() - navigationItem.leftBarButtonItem = UIBarButtonItem() - setupOnboardingAppearance() defer { setupNavigationBarBackgroundView() } tableView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tableView) tableView.pinToParent() - - navigationActionView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(navigationActionView) - defer { - view.bringSubviewToFront(navigationActionView) - } - NSLayoutConstraint.activate([ - navigationActionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - navigationActionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - view.bottomAnchor.constraint(equalTo: navigationActionView.bottomAnchor), - ]) - - navigationActionView - .observe(\.bounds, options: [.initial, .new]) { [weak self] navigationActionView, _ in - guard let self = self else { return } - let inset = navigationActionView.frame.height - self.tableView.contentInset.bottom = inset - } - .store(in: &observations) - + tableView.delegate = self viewModel.setupDiffableDataSource(tableView: tableView) - navigationActionView.backButton.addTarget(self, action: #selector(MastodonServerRulesViewController.backButtonPressed(_:)), for: .touchUpInside) - navigationActionView.nextButton.addTarget(self, action: #selector(MastodonServerRulesViewController.nextButtonPressed(_:)), for: .touchUpInside) + + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "I agree", style: .done, target: self, action: #selector(MastodonServerRulesViewController.nextButtonPressed(_:))) + title = L10n.Scene.ServerRules.title } override func viewDidAppear(_ animated: Bool) { @@ -104,13 +71,10 @@ extension MastodonServerRulesViewController { extension MastodonServerRulesViewController { @objc private func backButtonPressed(_ sender: UIButton) { - logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") navigationController?.popViewController(animated: true) } @objc private func nextButtonPressed(_ sender: UIButton) { - logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") - let viewModel = MastodonRegisterViewModel( context: context, domain: viewModel.domain, From dc91ebcd0a8578929043de8de509d8db91b9d1f9 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 11 Dec 2022 23:59:30 +0100 Subject: [PATCH 10/94] Apply new style to server-rules (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 +-- .../Cell/ServerRulesTableViewCell.swift | 26 +++++++++---------- .../MastodonServerRulesViewModel.swift | 4 +-- .../ServerRules}/ServerRuleItem.swift | 0 .../ServerRules}/ServerRuleSection.swift | 4 +-- 5 files changed, 19 insertions(+), 19 deletions(-) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/ServerRules}/ServerRuleItem.swift (100%) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/ServerRules}/ServerRuleSection.swift (88%) diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 6dca1d070..6a047bf60 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -1906,8 +1906,6 @@ DB1E347725F519300079D7DF /* PickServerItem.swift */, DB1E346725F518E20079D7DF /* CategoryPickerSection.swift */, DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */, - DB0617F427855AB90030EE79 /* ServerRuleSection.swift */, - DB0617FC27855BFE0030EE79 /* ServerRuleItem.swift */, DB0618022785A7100030EE79 /* RegisterSection.swift */, DB0618042785A73D0030EE79 /* RegisterItem.swift */, ); @@ -2203,6 +2201,8 @@ DB7A9F922818F33C0016AF98 /* MastodonServerRulesViewController+Debug.swift */, DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */, DB0617FE27855D6C0030EE79 /* MastodonServerRulesViewModel+Diffable.swift */, + DB0617F427855AB90030EE79 /* ServerRuleSection.swift */, + DB0617FC27855BFE0030EE79 /* ServerRuleItem.swift */, ); path = ServerRules; sourceTree = ""; diff --git a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift index a6fc25a40..bb51cdfcf 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift @@ -21,13 +21,13 @@ final class ServerRulesTableViewCell: UITableViewCell { let ruleLabel: UILabel = { let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) + label.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .regular)) label.textColor = Asset.Colors.Label.primary.color label.numberOfLines = 0 return label }() - let separalerLine: UIView = { + let separatorLine: UIView = { let view = UIView() view.backgroundColor = Asset.Theme.System.separator.color return view @@ -54,7 +54,7 @@ extension ServerRulesTableViewCell { indexImageView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(indexImageView) NSLayoutConstraint.activate([ - indexImageView.topAnchor.constraint(greaterThanOrEqualTo: contentView.topAnchor, constant: ServerRulesTableViewCell.margin), + indexImageView.topAnchor.constraint(greaterThanOrEqualTo: contentView.topAnchor, constant: 11), indexImageView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), contentView.bottomAnchor.constraint(greaterThanOrEqualTo: indexImageView.bottomAnchor, constant: ServerRulesTableViewCell.margin), indexImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), @@ -65,20 +65,20 @@ extension ServerRulesTableViewCell { ruleLabel.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(ruleLabel) NSLayoutConstraint.activate([ - ruleLabel.topAnchor.constraint(greaterThanOrEqualTo: contentView.topAnchor, constant: ServerRulesTableViewCell.margin), - ruleLabel.leadingAnchor.constraint(equalTo: indexImageView.trailingAnchor, constant: 16), - ruleLabel.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), - contentView.bottomAnchor.constraint(greaterThanOrEqualTo: ruleLabel.bottomAnchor, constant: ServerRulesTableViewCell.margin), + ruleLabel.topAnchor.constraint(greaterThanOrEqualTo: contentView.topAnchor, constant: 11), + ruleLabel.leadingAnchor.constraint(equalTo: indexImageView.trailingAnchor, constant: 14), + ruleLabel.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor, constant: 16), + contentView.bottomAnchor.constraint(greaterThanOrEqualTo: ruleLabel.bottomAnchor, constant: 11), ruleLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), ]) - separalerLine.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(separalerLine) + separatorLine.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview(separatorLine) NSLayoutConstraint.activate([ - separalerLine.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), - separalerLine.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), - separalerLine.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), - separalerLine.heightAnchor.constraint(equalToConstant: UIView.separatorLineHeight(of: contentView)).priority(.required - 1), + separatorLine.leadingAnchor.constraint(equalTo: ruleLabel.leadingAnchor), + separatorLine.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + separatorLine.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + separatorLine.heightAnchor.constraint(equalToConstant: UIView.separatorLineHeight(of: contentView)).priority(.required - 1), ]) } diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift index 29869be09..945c92522 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift @@ -45,10 +45,10 @@ final class MastodonServerRulesViewModel { guard i < 50 else { return NSAttributedString(string: "\(i)" + separatorString + rule.text.trimmingCharacters(in: .whitespacesAndNewlines) + "\n\n") } - let imageName = String(i + 1) + ".circle.fill" + let imageName = String(i + 1) + ".circle" let image = UIImage(systemName: imageName, withConfiguration: configuration)! let attachment = NSTextAttachment() - attachment.image = image.withTintColor(Asset.Colors.Label.primary.color) + attachment.image = image.withTintColor(Asset.Colors.brand.color) let imageAttribute = NSMutableAttributedString(attachment: attachment) imageAttribute.addAttributes([NSAttributedString.Key.baselineOffset : -1.5], range: NSRange(location: 0, length: imageAttribute.length)) diff --git a/Mastodon/Diffable/Onboarding/ServerRuleItem.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift similarity index 100% rename from Mastodon/Diffable/Onboarding/ServerRuleItem.swift rename to Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift diff --git a/Mastodon/Diffable/Onboarding/ServerRuleSection.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift similarity index 88% rename from Mastodon/Diffable/Onboarding/ServerRuleSection.swift rename to Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift index c13e4ab2c..3ec8bb2dc 100644 --- a/Mastodon/Diffable/Onboarding/ServerRuleSection.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift @@ -22,12 +22,12 @@ extension ServerRuleSection { switch item { case .header(let domain): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: OnboardingHeadlineTableViewCell.self), for: indexPath) as! OnboardingHeadlineTableViewCell - cell.titleLabel.text = L10n.Scene.ServerRules.title cell.subTitleLabel.text = L10n.Scene.ServerRules.subtitle(domain) return cell case .rule(let ruleContext): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ServerRulesTableViewCell.self), for: indexPath) as! ServerRulesTableViewCell - cell.indexImageView.image = UIImage(systemName: "\(ruleContext.index + 1).circle.fill") ?? UIImage(systemName: "questionmark.circle.fill") + cell.indexImageView.image = UIImage(systemName: "\(ruleContext.index + 1).circle") ?? UIImage(systemName: "questionmark.circle") + cell.indexImageView.tintColor = Asset.Colors.brand.color cell.ruleLabel.text = ruleContext.rule.text return cell } From 3a176edb91eb28c366fad0af5a50247e772fb630 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 13 Dec 2022 22:57:35 +0100 Subject: [PATCH 11/94] Move files (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 ++-- .../Onboarding/PickServer}/PickServerItem.swift | 5 ----- .../Onboarding/PickServer}/PickServerSection.swift | 4 ---- 3 files changed, 2 insertions(+), 11 deletions(-) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/PickServer}/PickServerItem.swift (92%) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/PickServer}/PickServerSection.swift (94%) diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 6a047bf60..8313d2e5e 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -1199,6 +1199,8 @@ 0FB3D2F625E4C24D00AAD544 /* MastodonPickServerViewModel.swift */, DB1FD44F25F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift */, DB1FD43525F26899004CFCFC /* MastodonPickServerViewModel+LoadIndexedServerState.swift */, + DB1FD44325F26CCC004CFCFC /* PickServerSection.swift */, + DB1E347725F519300079D7DF /* PickServerItem.swift */, ); path = PickServer; sourceTree = ""; @@ -1902,8 +1904,6 @@ DB4F097826A039B400D62E92 /* Onboarding */ = { isa = PBXGroup; children = ( - DB1FD44325F26CCC004CFCFC /* PickServerSection.swift */, - DB1E347725F519300079D7DF /* PickServerItem.swift */, DB1E346725F518E20079D7DF /* CategoryPickerSection.swift */, DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */, DB0618022785A7100030EE79 /* RegisterSection.swift */, diff --git a/Mastodon/Diffable/Onboarding/PickServerItem.swift b/Mastodon/Scene/Onboarding/PickServer/PickServerItem.swift similarity index 92% rename from Mastodon/Diffable/Onboarding/PickServerItem.swift rename to Mastodon/Scene/Onboarding/PickServer/PickServerItem.swift index ba693ad78..8b4396965 100644 --- a/Mastodon/Diffable/Onboarding/PickServerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/PickServerItem.swift @@ -11,7 +11,6 @@ import MastodonSDK /// Note: update Equatable when change case enum PickServerItem { - case header case server(server: Mastodon.Entity.Server, attribute: ServerItemAttribute) case loader(attribute: LoaderItemAttribute) } @@ -59,8 +58,6 @@ extension PickServerItem { extension PickServerItem: Equatable { static func == (lhs: PickServerItem, rhs: PickServerItem) -> Bool { switch (lhs, rhs) { - case (.header, .header): - return true case (.server(let serverLeft, _), .server(let serverRight, _)): return serverLeft.domain == serverRight.domain case (.loader(let attributeLeft), loader(let attributeRight)): @@ -74,8 +71,6 @@ extension PickServerItem: Equatable { extension PickServerItem: Hashable { func hash(into hasher: inout Hasher) { switch self { - case .header: - hasher.combine(String(describing: PickServerItem.header.self)) case .server(let server, _): hasher.combine(server.domain) case .loader(let attribute): diff --git a/Mastodon/Diffable/Onboarding/PickServerSection.swift b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift similarity index 94% rename from Mastodon/Diffable/Onboarding/PickServerSection.swift rename to Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift index 1af5b23c6..587f512b6 100644 --- a/Mastodon/Diffable/Onboarding/PickServerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift @@ -20,7 +20,6 @@ extension PickServerSection { for tableView: UITableView, dependency: NeedsDependency ) -> UITableViewDiffableDataSource { - tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: String(describing: OnboardingHeadlineTableViewCell.self)) tableView.register(PickServerCell.self, forCellReuseIdentifier: String(describing: PickServerCell.self)) tableView.register(PickServerLoaderTableViewCell.self, forCellReuseIdentifier: String(describing: PickServerLoaderTableViewCell.self)) @@ -29,9 +28,6 @@ extension PickServerSection { ] tableView, indexPath, item -> UITableViewCell? in guard let _ = dependency else { return nil } switch item { - case .header: - let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: OnboardingHeadlineTableViewCell.self), for: indexPath) as! OnboardingHeadlineTableViewCell - return cell case .server(let server, let attribute): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: PickServerCell.self), for: indexPath) as! PickServerCell PickServerSection.configure(cell: cell, server: server, attribute: attribute) From d3ebd51d44e1f50e0db4e23a977c05f497b80c0b Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 13 Dec 2022 23:23:20 +0100 Subject: [PATCH 12/94] Replace NavigationActionView with a view with a simple button (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 + .../MastodonPickServerViewController.swift | 86 ++++--------------- .../PickServer/View/OnboardingNextView.swift | 79 +++++++++++++++++ 3 files changed, 100 insertions(+), 69 deletions(-) create mode 100644 Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 8313d2e5e..39fced246 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -110,6 +110,7 @@ 9E44C7202967AD17004B2A72 /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; }; 9E44C7222967AD17004B2A72 /* MastodonSDKDynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; C24C97032922F30500BAE8CB /* RefreshControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24C97022922F30500BAE8CB /* RefreshControl.swift */; }; + D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8363B1529469CE200A74079 /* OnboardingNextView.swift */; }; D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; }; D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; }; D87BFC8F291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */; }; @@ -658,6 +659,7 @@ C3789232A52F43529CA67E95 /* Pods-MastodonIntent.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonIntent.asdk - debug.xcconfig"; path = "Target Support Files/Pods-MastodonIntent/Pods-MastodonIntent.asdk - debug.xcconfig"; sourceTree = ""; }; CD92E0F10BDE4FE7C4B999F2 /* Pods_MastodonTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MastodonTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D7D7CF93E262178800077512 /* Pods-Mastodon-AppShared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-AppShared.debug.xcconfig"; path = "Target Support Files/Pods-Mastodon-AppShared/Pods-Mastodon-AppShared.debug.xcconfig"; sourceTree = ""; }; + D8363B1529469CE200A74079 /* OnboardingNextView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingNextView.swift; sourceTree = ""; tabWidth = 4; }; D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = ""; }; D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = ""; }; D87BFC8E291EC26A00FEE264 /* MastodonLoginServerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginServerTableViewCell.swift; sourceTree = ""; }; @@ -1217,6 +1219,7 @@ 0FB3D30D25E525C000AAD544 /* View */ = { isa = PBXGroup; children = ( + D8363B1529469CE200A74079 /* OnboardingNextView.swift */, 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */, DB9282B125F3222800823B15 /* PickServerEmptyStateView.swift */, DB0617F0278413D00030EE79 /* PickServerServerSectionTableHeaderView.swift */, @@ -3604,6 +3607,7 @@ 2A3F6FE5292F6E44002E6DA7 /* FollowedTagsTableViewCell.swift in Sources */, C24C97032922F30500BAE8CB /* RefreshControl.swift in Sources */, DB023D2A27A0FE5C005AC798 /* DataSourceProvider+NotificationTableViewCellDelegate.swift in Sources */, + D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */, DB98EB6027B10E150082E365 /* ReportCommentTableViewCell.swift in Sources */, DB0FCB962797E6C2006C02E2 /* SearchResultViewController+DataSourceProvider.swift in Sources */, DB6180E326391A4C0018D199 /* ViewControllerAnimatedTransitioning.swift in Sources */, diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index bcb040757..7f88cc2f9 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -46,20 +46,15 @@ final class MastodonPickServerViewController: UIViewController, NeedsDependency tableView.sectionHeaderTopPadding = .leastNonzeroMagnitude return tableView }() - - let navigationActionView: NavigationActionView = { - let navigationActionView = NavigationActionView() - navigationActionView.backgroundColor = Asset.Scene.Onboarding.background.color - return navigationActionView + + let onboardingNextView: OnboardingNextView = { + let onboardingNextView = OnboardingNextView() + onboardingNextView.translatesAutoresizingMaskIntoConstraints = false + onboardingNextView.backgroundColor = UIColor.secondarySystemBackground + return onboardingNextView }() var mastodonAuthenticationController: MastodonAuthenticationController? - - deinit { - tableViewObservation = nil - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - } - } extension MastodonPickServerViewController { @@ -72,17 +67,6 @@ extension MastodonPickServerViewController { setupOnboardingAppearance() defer { setupNavigationBarBackgroundView() } - #if DEBUG - navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "ellipsis.circle"), style: .plain, target: nil, action: nil) - let children: [UIMenuElement] = [ - UIAction(title: "Dismiss", image: nil, identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off, handler: { [weak self] _ in - guard let self = self else { return } - self.dismiss(animated: true, completion: nil) - }) - ] - navigationItem.rightBarButtonItem?.menu = UIMenu(title: "Debug Tool", image: nil, identifier: nil, options: [], children: children) - #endif - tableView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tableView) NSLayoutConstraint.activate([ @@ -92,37 +76,22 @@ extension MastodonPickServerViewController { tableView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor), ]) - navigationActionView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(navigationActionView) - defer { - view.bringSubviewToFront(navigationActionView) - } + view.addSubview(onboardingNextView) + NSLayoutConstraint.activate([ - navigationActionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - navigationActionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - view.bottomAnchor.constraint(equalTo: navigationActionView.bottomAnchor), + onboardingNextView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + onboardingNextView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + view.bottomAnchor.constraint(equalTo: onboardingNextView.bottomAnchor), ]) - navigationActionView + onboardingNextView .observe(\.bounds, options: [.initial, .new]) { [weak self] _, _ in guard let self = self else { return } - let inset = self.navigationActionView.frame.height + let inset = self.onboardingNextView.frame.height self.viewModel.additionalTableViewInsets.bottom = inset } .store(in: &observations) - // fix AutoLayout warning when observe before view appear - viewModel.viewWillAppear - .receive(on: DispatchQueue.main) - .sink { [weak self] in - guard let self = self else { return } - self.tableViewObservation = self.tableView.observe(\.contentSize, options: [.initial, .new]) { [weak self] tableView, _ in - guard let self = self else { return } - self.updateEmptyStateViewLayout() - } - } - .store(in: &disposeBag) - emptyStateView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(emptyStateView) emptyStateViewLeadingLayoutConstraint = emptyStateView.leadingAnchor.constraint(equalTo: tableView.leadingAnchor) @@ -131,7 +100,7 @@ extension MastodonPickServerViewController { emptyStateView.topAnchor.constraint(equalTo: view.topAnchor), emptyStateViewLeadingLayoutConstraint, emptyStateViewTrailingLayoutConstraint, - navigationActionView.topAnchor.constraint(equalTo: emptyStateView.bottomAnchor, constant: 21), + onboardingNextView.topAnchor.constraint(equalTo: emptyStateView.bottomAnchor, constant: 21), ]) view.sendSubviewToBack(emptyStateView) @@ -153,7 +122,7 @@ extension MastodonPickServerViewController { viewModel .selectedServer .map { $0 != nil } - .assign(to: \.isEnabled, on: navigationActionView.nextButton) + .assign(to: \.isEnabled, on: onboardingNextView.nextButton) .store(in: &disposeBag) Publishers.Merge( @@ -203,7 +172,7 @@ extension MastodonPickServerViewController { .receive(on: DispatchQueue.main) .sink { [weak self] isAuthenticating in guard let self = self else { return } - isAuthenticating ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() +// isAuthenticating ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() } .store(in: &disposeBag) @@ -234,7 +203,7 @@ extension MastodonPickServerViewController { } .store(in: &disposeBag) - navigationActionView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) + onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) } override func viewWillAppear(_ animated: Bool) { @@ -253,7 +222,6 @@ extension MastodonPickServerViewController { super.traitCollectionDidChange(previousTraitCollection) setupNavigationBarAppearance() - updateEmptyStateViewLayout() } } @@ -407,26 +375,6 @@ extension MastodonPickServerViewController: UITableViewDelegate { } -extension MastodonPickServerViewController { - private func updateEmptyStateViewLayout() { -// guard let diffableDataSource = self.viewModel.diffableDataSource else { return } -// guard let indexPath = diffableDataSource.indexPath(for: .search) else { return } -// let rectInTableView = tableView.rectForRow(at: indexPath) -// -// emptyStateView.topPaddingViewTopLayoutConstraint.constant = rectInTableView.maxY -// -// switch traitCollection.horizontalSizeClass { -// case .regular: -// emptyStateViewLeadingLayoutConstraint.constant = MastodonPickServerViewController.viewEdgeMargin -// emptyStateViewTrailingLayoutConstraint.constant = MastodonPickServerViewController.viewEdgeMargin -// default: -// let margin = tableView.layoutMarginsGuide.layoutFrame.origin.x -// emptyStateViewLeadingLayoutConstraint.constant = margin -// emptyStateViewTrailingLayoutConstraint.constant = margin -// } - } -} - // MARK: - PickServerServerSectionTableHeaderViewDelegate extension MastodonPickServerViewController: PickServerServerSectionTableHeaderViewDelegate { func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { diff --git a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift new file mode 100644 index 000000000..e629c3466 --- /dev/null +++ b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift @@ -0,0 +1,79 @@ +// +// OnboardingNextView.swift +// Mastodon +// +// Created by Nathan Mattes on 2022-12-12. +// + +import UIKit +import MastodonUI +import MastodonAsset +import MastodonLocalization + +final class OnboardingNextView: UIView { + + static let buttonHeight: CGFloat = 50 + static let minimumBackButtonWidth: CGFloat = 100 + + private var observations = Set() + + private let container: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 8 + stackView.alignment = .center + return stackView + }() + + //TODO: Show loading + let nextButton: UIButton = { + let button = UIButton() + button.translatesAutoresizingMaskIntoConstraints = false + button.layer.cornerRadius = 14 + button.backgroundColor = Asset.Colors.brand.color + button.setTitle(L10n.Common.Controls.Actions.next, for: .normal) + return button + }() + + let explanationLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 0 + label.textColor = .secondaryLabel + label.font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)) + label.text = "We’ll pick a server based on your language if you continue without making a selection." //TODO: @zeitschlag localize + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + + private func _init() { + container.translatesAutoresizingMaskIntoConstraints = false + container.addArrangedSubview(nextButton) + container.addArrangedSubview(explanationLabel) + + addSubview(container) + + NSLayoutConstraint.activate([ + container.topAnchor.constraint(equalTo: topAnchor, constant: 16), + container.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 16), + safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 16), + + nextButton.widthAnchor.constraint(equalTo: container.widthAnchor), + explanationLabel.widthAnchor.constraint(equalTo: container.widthAnchor), + ]) + + NSLayoutConstraint.activate([ + nextButton.heightAnchor.constraint(greaterThanOrEqualToConstant: NavigationActionView.buttonHeight) + ]) + } +} + From 4f304f39fc573fdec537eabeb6758a6f6b1a603d Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 13 Dec 2022 23:37:30 +0100 Subject: [PATCH 13/94] Get rid of title (#690) --- .../StringsConvertor/input/Base.lproj/app.json | 3 +-- Localization/app.json | 3 +-- .../MastodonPickServerViewController.swift | 2 ++ .../MastodonPickServerViewModel+Diffable.swift | 2 -- .../Register/MastodonRegisterView.swift | 9 --------- .../Share/OnboardingHeadlineTableViewCell.swift | 16 ++-------------- .../MastodonLocalization/Generated/Strings.swift | 6 ++---- .../Resources/Base.lproj/Localizable.strings | 3 +-- .../Resources/en.lproj/Localizable.strings | 3 +-- 9 files changed, 10 insertions(+), 37 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index 963b4aed1..073108aad 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -251,8 +251,7 @@ } }, "server_picker": { - "title": "Mastodon is made of users in different servers.", - "subtitle": "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers.", + "title": "Pick server", "button": { "category": { "all": "All", diff --git a/Localization/app.json b/Localization/app.json index 998fe00cb..744435f3a 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -265,8 +265,7 @@ } }, "server_picker": { - "title": "Mastodon is made of users in different servers.", - "subtitle": "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers.", + "title": "Pick Server", "button": { "category": { "all": "All", diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 7f88cc2f9..728290832 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -204,6 +204,8 @@ extension MastodonPickServerViewController { .store(in: &disposeBag) onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) + + title = L10n.Scene.ServerPicker.title } override func viewWillAppear(_ animated: Bool) { diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift index 5db98c218..4bc31d1d6 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift @@ -38,7 +38,6 @@ extension MastodonPickServerViewModel { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.header, .servers]) - snapshot.appendItems([.header], toSection: .header) diffableDataSource?.apply(snapshot, animatingDifferences: false, completion: nil) loadIndexedServerStateMachine.enter(LoadIndexedServerState.Loading.self) @@ -61,7 +60,6 @@ extension MastodonPickServerViewModel { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.header, .servers]) - snapshot.appendItems([.header], toSection: .header) // TODO: handle filter var serverItems: [PickServerItem] = [] diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index e5ca2798a..632194d6b 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -21,15 +21,6 @@ struct MastodonRegisterView: View { ScrollView(.vertical) { let margin: CGFloat = 16 - // header - HStack { - Text(L10n.Scene.Register.title(viewModel.domain)) - .font(Font(MastodonPickServerViewController.largeTitleFont as CTFont)) - .foregroundColor(Color(Asset.Colors.Label.primary.color)) - Spacer() - } - .padding(.horizontal, margin) - // Avatar selector Menu { // Photo Library diff --git a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift b/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift index 01070fbe9..ec9cd97e2 100644 --- a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift @@ -11,21 +11,10 @@ import MastodonLocalization final class OnboardingHeadlineTableViewCell: UITableViewCell { - let titleLabel: UILabel = { - let label = UILabel() - label.font = MastodonPickServerViewController.largeTitleFont - label.textColor = MastodonPickServerViewController.largeTitleTextColor - label.text = L10n.Scene.ServerPicker.title - label.adjustsFontForContentSizeCategory = true - label.numberOfLines = 0 - return label - }() - let subTitleLabel: UILabel = { let label = UILabel() label.font = MastodonPickServerViewController.subTitleFont - label.textColor = MastodonPickServerViewController.subTitleTextColor - label.text = L10n.Scene.ServerPicker.subtitle + label.textColor = Asset.Colors.Label.primary.color label.adjustsFontForContentSizeCategory = true label.numberOfLines = 0 return label @@ -57,10 +46,9 @@ extension OnboardingHeadlineTableViewCell { container.topAnchor.constraint(equalTo: contentView.topAnchor), container.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), container.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 11), + contentView.bottomAnchor.constraint(equalTo: container.bottomAnchor), ]) - container.addArrangedSubview(titleLabel) container.addArrangedSubview(subTitleLabel) } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 8348ecb35..c0ad70bb6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1186,10 +1186,8 @@ public enum L10n { } } public enum ServerPicker { - /// Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers. - public static let subtitle = L10n.tr("Localizable", "Scene.ServerPicker.Subtitle", fallback: "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers.") - /// Mastodon is made of users in different servers. - public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Mastodon is made of users in different servers.") + /// Pick server + public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick server") public enum Button { /// See Less public static let seeLess = L10n.tr("Localizable", "Scene.ServerPicker.Button.SeeLess", fallback: "See Less") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 4ca8319d1..8791aeee4 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -435,8 +435,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Subtitle" = "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers."; -"Scene.ServerPicker.Title" = "Mastodon is made of users in different servers."; +"Scene.ServerPicker.Title" = "Pick server"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 3ba305a4b..5a07ceaea 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -426,8 +426,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Subtitle" = "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers."; -"Scene.ServerPicker.Title" = "Mastodon is made of users in different servers."; +"Scene.ServerPicker.Title" = "Pick server"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; From b08d2437d8df7aac8e12286bd62e3c924ee9ff57 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 06:54:36 +0100 Subject: [PATCH 14/94] Remove meta-information (#690) --- .../xcshareddata/swiftpm/Package.resolved | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..b13fa6d4a --- /dev/null +++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,259 @@ +{ + "object": { + "pins": [ + { + "package": "Alamofire", + "repositoryURL": "https://github.com/Alamofire/Alamofire.git", + "state": { + "branch": null, + "revision": "8dd85aee02e39dd280c75eef88ffdb86eed4b07b", + "version": "5.6.2" + } + }, + { + "package": "AlamofireImage", + "repositoryURL": "https://github.com/Alamofire/AlamofireImage.git", + "state": { + "branch": null, + "revision": "98cbb00ce0ec5fc8e52a5b50a6bfc08d3e5aee10", + "version": "4.2.0" + } + }, + { + "package": "CommonOSLog", + "repositoryURL": "https://github.com/MainasuK/CommonOSLog", + "state": { + "branch": null, + "revision": "c121624a30698e9886efe38aebb36ff51c01b6c2", + "version": "0.1.1" + } + }, + { + "package": "FaviconFinder", + "repositoryURL": "https://github.com/will-lumley/FaviconFinder.git", + "state": { + "branch": null, + "revision": "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a", + "version": "3.3.0" + } + }, + { + "package": "FLAnimatedImage", + "repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git", + "state": { + "branch": null, + "revision": "d4f07b6f164d53c1212c3e54d6460738b1981e9f", + "version": "1.0.17" + } + }, + { + "package": "FPSIndicator", + "repositoryURL": "https://github.com/MainasuK/FPSIndicator.git", + "state": { + "branch": null, + "revision": "e4a5067ccd5293b024c767f09e51056afd4a4796", + "version": "1.1.0" + } + }, + { + "package": "Fuzi", + "repositoryURL": "https://github.com/cezheng/Fuzi.git", + "state": { + "branch": null, + "revision": "f08c8323da21e985f3772610753bcfc652c2103f", + "version": "3.1.3" + } + }, + { + "package": "KeychainAccess", + "repositoryURL": "https://github.com/kishikawakatsumi/KeychainAccess.git", + "state": { + "branch": null, + "revision": "84e546727d66f1adc5439debad16270d0fdd04e7", + "version": "4.2.2" + } + }, + { + "package": "Kingfisher", + "repositoryURL": "https://github.com/onevcat/Kingfisher.git", + "state": { + "branch": null, + "revision": "44e891bdb61426a95e31492a67c7c0dfad1f87c5", + "version": "7.4.1" + } + }, + { + "package": "MetaTextKit", + "repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git", + "state": { + "branch": null, + "revision": "dcd5255d6930c2fab408dc8562c577547e477624", + "version": "2.2.5" + } + }, + { + "package": "NextLevelSessionExporter", + "repositoryURL": "https://github.com/NextLevel/NextLevelSessionExporter.git", + "state": { + "branch": null, + "revision": "b6c0cce1aa37fe1547d694f958fac3c3524b74da", + "version": "0.4.6" + } + }, + { + "package": "Nuke", + "repositoryURL": "https://github.com/kean/Nuke.git", + "state": { + "branch": null, + "revision": "a002b7fd786f2df2ed4333fe73a9727499fd9d97", + "version": "10.11.2" + } + }, + { + "package": "NukeFLAnimatedImagePlugin", + "repositoryURL": "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", + "state": { + "branch": null, + "revision": "b59c346a7d536336db3b0f12c72c6e53ee709e16", + "version": "8.0.0" + } + }, + { + "package": "Pageboy", + "repositoryURL": "https://github.com/uias/Pageboy", + "state": { + "branch": null, + "revision": "af8fa81788b893205e1ff42ddd88c5b0b315d7c5", + "version": "3.7.0" + } + }, + { + "package": "PanModal", + "repositoryURL": "https://github.com/slackhq/PanModal.git", + "state": { + "branch": null, + "revision": "b012aecb6b67a8e46369227f893c12544846613f", + "version": "1.2.7" + } + }, + { + "package": "SDWebImage", + "repositoryURL": "https://github.com/SDWebImage/SDWebImage.git", + "state": { + "branch": null, + "revision": "3312bf5e67b52fbce7c3caf431b0cda721a9f7bb", + "version": "5.14.2" + } + }, + { + "package": "Stripes", + "repositoryURL": "https://github.com/eneko/Stripes.git", + "state": { + "branch": null, + "revision": "d533fd44b8043a3abbf523e733599173d6f98c11", + "version": "0.2.0" + } + }, + { + "package": "swift-collections", + "repositoryURL": "https://github.com/apple/swift-collections.git", + "state": { + "branch": null, + "revision": "f504716c27d2e5d4144fa4794b12129301d17729", + "version": "1.0.3" + } + }, + { + "package": "swift-nio", + "repositoryURL": "https://github.com/apple/swift-nio.git", + "state": { + "branch": null, + "revision": "546610d52b19be3e19935e0880bb06b9c03f5cef", + "version": "1.14.4" + } + }, + { + "package": "swift-nio-zlib-support", + "repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git", + "state": { + "branch": null, + "revision": "37760e9a52030bb9011972c5213c3350fa9d41fd", + "version": "1.0.0" + } + }, + { + "package": "SwiftSoup", + "repositoryURL": "https://github.com/scinfu/SwiftSoup.git", + "state": { + "branch": null, + "revision": "6778575285177365cbad3e5b8a72f2a20583cfec", + "version": "2.4.3" + } + }, + { + "package": "Introspect", + "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git", + "state": { + "branch": null, + "revision": "f2616860a41f9d9932da412a8978fec79c06fe24", + "version": "0.1.4" + } + }, + { + "package": "TabBarPager", + "repositoryURL": "https://github.com/TwidereProject/TabBarPager.git", + "state": { + "branch": null, + "revision": "488aa66d157a648901b61721212c0dec23d27ee5", + "version": "0.1.0" + } + }, + { + "package": "Tabman", + "repositoryURL": "https://github.com/uias/Tabman", + "state": { + "branch": null, + "revision": "4a4f7c755b875ffd4f9ef10d67a67883669d2465", + "version": "2.13.0" + } + }, + { + "package": "ThirdPartyMailer", + "repositoryURL": "https://github.com/vtourraine/ThirdPartyMailer.git", + "state": { + "branch": null, + "revision": "44c1cfaa6969963f22691aa67f88a69e3b6d651f", + "version": "2.1.0" + } + }, + { + "package": "TOCropViewController", + "repositoryURL": "https://github.com/TimOliver/TOCropViewController.git", + "state": { + "branch": null, + "revision": "d0470491f56e734731bbf77991944c0dfdee3e0e", + "version": "2.6.1" + } + }, + { + "package": "UIHostingConfigurationBackport", + "repositoryURL": "https://github.com/woxtu/UIHostingConfigurationBackport.git", + "state": { + "branch": null, + "revision": "6091f2d38faa4b24fc2ca0389c651e2f666624a3", + "version": "0.1.0" + } + }, + { + "package": "UITextView+Placeholder", + "repositoryURL": "https://github.com/MainasuK/UITextView-Placeholder.git", + "state": { + "branch": null, + "revision": "20f513ded04a040cdf5467f0891849b1763ede3b", + "version": "1.4.1" + } + } + ] + }, + "version": 1 +} From f2e419412bda0d8935eaf291bd8db17edcf64b03 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 06:54:36 +0100 Subject: [PATCH 15/94] Remove meta-information (#690) --- .../MastodonPickServerViewController.swift | 1 - .../PickServer/PickServerSection.swift | 38 ---------------- .../TableViewCell/PickServerCell.swift | 44 ------------------- 3 files changed, 83 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 728290832..6f0fa4a97 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -40,7 +40,6 @@ final class MastodonPickServerViewController: UIViewController, NeedsDependency let tableView: UITableView = { let tableView = ControlContainableTableView() tableView.rowHeight = UITableView.automaticDimension - tableView.separatorStyle = .none tableView.backgroundColor = .clear tableView.keyboardDismissMode = .onDrag tableView.sectionHeaderTopPadding = .leastNonzeroMagnitude diff --git a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift index 587f512b6..d32b5beb6 100644 --- a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift @@ -63,44 +63,6 @@ extension PickServerSection { ] ) }() - cell.usersValueLabel.attributedText = { - let attributedString = NSMutableAttributedString() - let attachment = NSTextAttachment(image: UIImage(systemName: "person.2.fill")!) - let attachmentAttributedString = NSAttributedString(attachment: attachment) - attributedString.append(attachmentAttributedString) - attributedString.append(NSAttributedString(string: " ")) - - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 1.12 - let valueAttributedString = NSAttributedString( - string: server.totalUsers.asAbbreviatedCountString(), - attributes: [ - .paragraphStyle: paragraphStyle - ] - ) - attributedString.append(valueAttributedString) - - return attributedString - }() - cell.langValueLabel.attributedText = { - let attributedString = NSMutableAttributedString() - let attachment = NSTextAttachment(image: UIImage(systemName: "text.bubble.fill")!) - let attachmentAttributedString = NSAttributedString(attachment: attachment) - attributedString.append(attachmentAttributedString) - attributedString.append(NSAttributedString(string: " ")) - - let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.lineHeightMultiple = 1.12 - let valueAttributedString = NSAttributedString( - string: server.language.uppercased(), - attributes: [ - .paragraphStyle: paragraphStyle - ] - ) - attributedString.append(valueAttributedString) - - return attributedString - }() attribute.isLast .receive(on: DispatchQueue.main) diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift index 4cbe77b9c..2d8af7b80 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift @@ -53,36 +53,6 @@ class PickServerCell: UITableViewCell { return label }() - let infoStackView: UIStackView = { - let stackView = UIStackView() - stackView.axis = .horizontal - stackView.spacing = 16 - return stackView - }() - - let separator: UIView = { - let view = UIView() - view.backgroundColor = Asset.Theme.System.separator.color - return view - }() - - let langValueLabel: UILabel = { - let label = UILabel() - label.textColor = Asset.Colors.Label.primary.color - label.font = UIFontMetrics(forTextStyle: .caption1).scaledFont(for: .systemFont(ofSize: 12, weight: .regular)) - label.textAlignment = .center - label.adjustsFontForContentSizeCategory = true - return label - }() - - let usersValueLabel: UILabel = { - let label = UILabel() - label.textColor = Asset.Colors.Label.primary.color - label.font = UIFontMetrics(forTextStyle: .caption1).scaledFont(for: .systemFont(ofSize: 12, weight: .regular)) - label.adjustsFontForContentSizeCategory = true - return label - }() - private var collapseConstraints: [NSLayoutConstraint] = [] private var expandConstraints: [NSLayoutConstraint] = [] @@ -131,20 +101,6 @@ extension PickServerCell { containerView.addArrangedSubview(domainLabel) containerView.addArrangedSubview(descriptionLabel) containerView.setCustomSpacing(6, after: descriptionLabel) - containerView.addArrangedSubview(infoStackView) - - infoStackView.addArrangedSubview(usersValueLabel) - infoStackView.addArrangedSubview(langValueLabel) - infoStackView.addArrangedSubview(UIView()) - - separator.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(separator) - NSLayoutConstraint.activate([ - separator.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), - contentView.readableContentGuide.trailingAnchor.constraint(equalTo: separator.trailingAnchor), - separator.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), - separator.heightAnchor.constraint(equalToConstant: UIView.separatorLineHeight(of: contentView)).priority(.required - 1), - ]) } override func setSelected(_ selected: Bool, animated: Bool) { From ffe3b10f3c49fb51ba3ac868e2fbbf0d9a374e73 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 22:09:57 +0100 Subject: [PATCH 16/94] Update checkmark to match the new design (#690) --- .../TableViewCell/PickServerCell.swift | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift index 2d8af7b80..9ef3df48e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift @@ -37,7 +37,6 @@ class PickServerCell: UITableViewCell { let checkbox: UIImageView = { let imageView = UIImageView() imageView.preferredSymbolConfiguration = UIImage.SymbolConfiguration(textStyle: .body) - imageView.tintColor = Asset.Colors.Label.secondary.color imageView.contentMode = .scaleAspectFill imageView.translatesAutoresizingMaskIntoConstraints = false return imageView @@ -83,17 +82,17 @@ extension PickServerCell { checkbox.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(checkbox) NSLayoutConstraint.activate([ - checkbox.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor, constant: 1), - checkbox.heightAnchor.constraint(equalToConstant: 32).priority(.required - 1), - checkbox.widthAnchor.constraint(equalToConstant: 32).priority(.required - 1), + contentView.readableContentGuide.trailingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: 16), + checkbox.heightAnchor.constraint(equalToConstant: 20), + checkbox.widthAnchor.constraint(equalTo: checkbox.heightAnchor), ]) containerView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(containerView) NSLayoutConstraint.activate([ containerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 11), - containerView.leadingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: 22), - containerView.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), + containerView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor, constant: 16), + checkbox.leadingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: 16), contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: 11), checkbox.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), ]) @@ -106,11 +105,10 @@ extension PickServerCell { override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { - checkbox.image = UIImage(systemName: "checkmark.circle.fill") - checkbox.tintColor = Asset.Colors.Label.primary.color + checkbox.image = UIImage(systemName: "checkmark") + checkbox.tintColor = Asset.Colors.brand.color } else { - checkbox.image = UIImage(systemName: "circle") - checkbox.tintColor = Asset.Colors.Label.secondary.color + checkbox.image = nil } } From 3f3a8c1a5b44b5931a90381ebc72a179542a81d8 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 22:34:12 +0100 Subject: [PATCH 17/94] (Temporarily) Remove search field from header (#690) --- ...ckServerServerSectionTableHeaderView.swift | 99 +++---------------- 1 file changed, 11 insertions(+), 88 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift index ae8c16bb8..973a55abe 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift @@ -14,16 +14,14 @@ import MastodonLocalization protocol PickServerServerSectionTableHeaderViewDelegate: AnyObject { func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) - func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, searchTextDidChange searchText: String?) } final class PickServerServerSectionTableHeaderView: UIView { static let collectionViewHeight: CGFloat = 30 - static let searchTextFieldHeight: CGFloat = 38 - static let spacing: CGFloat = 11 + static let spacing: CGFloat = 16 - static let height: CGFloat = collectionViewHeight + spacing + searchTextFieldHeight + spacing + static let height: CGFloat = collectionViewHeight + spacing weak var delegate: PickServerServerSectionTableHeaderViewDelegate? @@ -58,66 +56,7 @@ final class PickServerServerSectionTableHeaderView: UIView { view.layer.masksToBounds = false return view }() - - let searchTextField: UITextField = { - let textField = UITextField() - textField.backgroundColor = Asset.Scene.Onboarding.searchBarBackground.color - textField.leftView = { - let imageView = UIImageView( - image: UIImage( - systemName: "magnifyingglass", - withConfiguration: UIImage.SymbolConfiguration(pointSize: 15, weight: .regular) - ) - ) - imageView.tintColor = Asset.Colors.Label.secondary.color.withAlphaComponent(0.6) - - let containerView = UIView() - imageView.translatesAutoresizingMaskIntoConstraints = false - containerView.addSubview(imageView) - NSLayoutConstraint.activate([ - imageView.topAnchor.constraint(equalTo: containerView.topAnchor), - imageView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 8), - imageView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - ]) - - let paddingView = UIView() - paddingView.translatesAutoresizingMaskIntoConstraints = false - containerView.addSubview(paddingView) - NSLayoutConstraint.activate([ - paddingView.topAnchor.constraint(equalTo: containerView.topAnchor), - paddingView.leadingAnchor.constraint(equalTo: imageView.trailingAnchor), - paddingView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), - paddingView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - paddingView.widthAnchor.constraint(equalToConstant: 4).priority(.defaultHigh), - ]) - return containerView - }() - textField.leftViewMode = .always - textField.font = .systemFont(ofSize: 15, weight: .regular) - textField.tintColor = Asset.Colors.Label.primary.color - textField.textColor = Asset.Colors.Label.primary.color - textField.adjustsFontForContentSizeCategory = true - textField.attributedPlaceholder = NSAttributedString( - string: L10n.Scene.ServerPicker.Input.searchServersOrEnterUrl, - attributes: [ - .font: UIFont.systemFont(ofSize: 15, weight: .regular), - .foregroundColor: Asset.Colors.Label.secondary.color.withAlphaComponent(0.6) - ] - ) - textField.clearButtonMode = .whileEditing - textField.autocapitalizationType = .none - textField.autocorrectionType = .no - textField.returnKeyType = .done - textField.keyboardType = .URL - textField.borderStyle = .none - - textField.layer.masksToBounds = true - textField.layer.cornerRadius = 10 - textField.layer.cornerCurve = .continuous - - return textField - }() - + override init(frame: CGRect) { super.init(frame: frame) _init() @@ -133,7 +72,6 @@ final class PickServerServerSectionTableHeaderView: UIView { collectionView.invalidateIntrinsicContentSize() } - } extension PickServerServerSectionTableHeaderView { @@ -148,28 +86,11 @@ extension PickServerServerSectionTableHeaderView { collectionView.topAnchor.constraint(equalTo: topAnchor), collectionView.leadingAnchor.constraint(equalTo: leadingAnchor), collectionView.trailingAnchor.constraint(equalTo: trailingAnchor), - collectionView.heightAnchor.constraint(equalToConstant: PickServerServerSectionTableHeaderView.collectionViewHeight).priority(.required - 1), + collectionView.heightAnchor.constraint(equalToConstant: PickServerServerSectionTableHeaderView.collectionViewHeight), + bottomAnchor.constraint(equalTo: collectionView.bottomAnchor, constant: PickServerServerSectionTableHeaderView.spacing), ]) - - searchTextField.translatesAutoresizingMaskIntoConstraints = false - addSubview(searchTextField) - NSLayoutConstraint.activate([ - searchTextField.topAnchor.constraint(equalTo: collectionView.bottomAnchor, constant: PickServerServerSectionTableHeaderView.spacing), - searchTextField.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor), - searchTextField.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor), - bottomAnchor.constraint(equalTo: searchTextField.bottomAnchor, constant: PickServerServerSectionTableHeaderView.spacing), - searchTextField.heightAnchor.constraint(equalToConstant: PickServerServerSectionTableHeaderView.searchTextFieldHeight).priority(.required - 1), - ]) - - collectionView.delegate = self - searchTextField.delegate = self - searchTextField.addTarget(self, action: #selector(PickServerServerSectionTableHeaderView.textFieldDidChange(_:)), for: .editingChanged) - } -} -extension PickServerServerSectionTableHeaderView { - @objc private func textFieldDidChange(_ textField: UITextField) { - delegate?.pickServerServerSectionTableHeaderView(self, searchTextDidChange: textField.text) + collectionView.delegate = self } } @@ -180,7 +101,6 @@ extension PickServerServerSectionTableHeaderView: UICollectionViewDelegate { collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally) delegate?.pickServerServerSectionTableHeaderView(self, collectionView: collectionView, didSelectItemAt: indexPath) } - } extension PickServerServerSectionTableHeaderView { @@ -191,8 +111,11 @@ extension PickServerServerSectionTableHeaderView { } override func accessibilityElement(at index: Int) -> Any? { - if let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) { return item } - return searchTextField + if let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) { + return item + } else { + return nil + } } } From fc25e12e05bf63b3f7b699f1a0cfbd90513f1682 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 23:18:13 +0100 Subject: [PATCH 18/94] Add thumbnail image (#690) thumbnail-download is still missing, it's just the UI-element --- .../TableViewCell/PickServerCell.swift | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift index 9ef3df48e..554fc6070 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift @@ -20,10 +20,19 @@ class PickServerCell: UITableViewCell { let containerView: UIStackView = { let view = UIStackView() + view.translatesAutoresizingMaskIntoConstraints = false view.axis = .vertical view.spacing = 4 return view }() + + let thumbnailImageView: UIImageView = { + let thumbnail = UIImageView() + thumbnail.translatesAutoresizingMaskIntoConstraints = false + thumbnail.backgroundColor = Asset.Colors.brand.color + thumbnail.layer.cornerRadius = 8 + return thumbnail + }() let domainLabel: UILabel = { let label = UILabel() @@ -78,28 +87,36 @@ extension PickServerCell { private func _init() { selectionStyle = .none backgroundColor = Asset.Scene.Onboarding.background.color - - checkbox.translatesAutoresizingMaskIntoConstraints = false + + contentView.addSubview(containerView) + contentView.addSubview(thumbnailImageView) contentView.addSubview(checkbox) + + NSLayoutConstraint.activate([ + thumbnailImageView.heightAnchor.constraint(equalToConstant: 32), + thumbnailImageView.widthAnchor.constraint(equalTo: thumbnailImageView.heightAnchor), + + thumbnailImageView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor, constant: 16), + thumbnailImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), + ]) + + NSLayoutConstraint.activate([ + containerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 11), + containerView.leadingAnchor.constraint(equalTo: thumbnailImageView.trailingAnchor, constant: 16), + checkbox.leadingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: 16), + contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: 11), + checkbox.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), + ]) + + containerView.addArrangedSubview(domainLabel) + containerView.addArrangedSubview(descriptionLabel) + containerView.setCustomSpacing(6, after: descriptionLabel) + NSLayoutConstraint.activate([ contentView.readableContentGuide.trailingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: 16), checkbox.heightAnchor.constraint(equalToConstant: 20), checkbox.widthAnchor.constraint(equalTo: checkbox.heightAnchor), ]) - - containerView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(containerView) - NSLayoutConstraint.activate([ - containerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 11), - containerView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor, constant: 16), - checkbox.leadingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: 16), - contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: 11), - checkbox.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), - ]) - - containerView.addArrangedSubview(domainLabel) - containerView.addArrangedSubview(descriptionLabel) - containerView.setCustomSpacing(6, after: descriptionLabel) } override func setSelected(_ selected: Bool, animated: Bool) { From 185a3f5aa479b0b8d657d259ba27db645ae41b6f Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 14 Dec 2022 23:18:47 +0100 Subject: [PATCH 19/94] Get rid of highlight-indicator (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 +- .../PickServer}/CategoryPickerItem.swift | 35 ---------------- .../PickServer}/CategoryPickerSection.swift | 2 +- .../View/PickServerCategoryView.swift | 42 +++++++++---------- 4 files changed, 23 insertions(+), 60 deletions(-) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/PickServer}/CategoryPickerItem.swift (81%) rename Mastodon/{Diffable/Onboarding => Scene/Onboarding/PickServer}/CategoryPickerSection.swift (93%) diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 39fced246..f9b05362f 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -1203,6 +1203,8 @@ DB1FD43525F26899004CFCFC /* MastodonPickServerViewModel+LoadIndexedServerState.swift */, DB1FD44325F26CCC004CFCFC /* PickServerSection.swift */, DB1E347725F519300079D7DF /* PickServerItem.swift */, + DB1E346725F518E20079D7DF /* CategoryPickerSection.swift */, + DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */, ); path = PickServer; sourceTree = ""; @@ -1907,8 +1909,6 @@ DB4F097826A039B400D62E92 /* Onboarding */ = { isa = PBXGroup; children = ( - DB1E346725F518E20079D7DF /* CategoryPickerSection.swift */, - DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */, DB0618022785A7100030EE79 /* RegisterSection.swift */, DB0618042785A73D0030EE79 /* RegisterItem.swift */, ); diff --git a/Mastodon/Diffable/Onboarding/CategoryPickerItem.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift similarity index 81% rename from Mastodon/Diffable/Onboarding/CategoryPickerItem.swift rename to Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift index f6f364108..a860e2e15 100644 --- a/Mastodon/Diffable/Onboarding/CategoryPickerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift @@ -18,41 +18,6 @@ enum CategoryPickerItem { extension CategoryPickerItem { - var emoji: String { - switch self { - case .all: - return "💬" - case .category(let category): - switch category.category { - case .academia: - return "📚" - case .activism: - return "✊" - case .food: - return "🍕" - case .furry: - return "🦁" - case .games: - return "🕹" - case .general: - return "🐘" - case .journalism: - return "📰" - case .lgbt: - return "🏳️‍🌈" - case .regional: - return "📍" - case .art: - return "🎨" - case .music: - return "🎼" - case .tech: - return "📱" - case ._other: - return "❓" - } - } - } var title: String { switch self { case .all: diff --git a/Mastodon/Diffable/Onboarding/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift similarity index 93% rename from Mastodon/Diffable/Onboarding/CategoryPickerSection.swift rename to Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 191d4d166..d43c676b7 100644 --- a/Mastodon/Diffable/Onboarding/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -23,7 +23,7 @@ extension CategoryPickerSection { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: PickServerCategoryCollectionViewCell.self), for: indexPath) as! PickServerCategoryCollectionViewCell cell.categoryView.titleLabel.text = item.title cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in - cell.categoryView.highlightedIndicatorView.alpha = cell.isSelected ? 1 : 0 +// cell.categoryView.highlightedIndicatorView.alpha = cell.isSelected ? 1 : 0 cell.categoryView.titleLabel.textColor = cell.isSelected ? Asset.Colors.Label.primary.color : Asset.Colors.Label.secondary.color } .store(in: &cell.observations) diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift index aba5a87dc..6c10ad48d 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift @@ -12,51 +12,49 @@ import MastodonUI import MastodonLocalization class PickServerCategoryView: UIView { - - let highlightedIndicatorView: UIView = { - let view = UIView() - view.backgroundColor = Asset.Colors.Label.primary.color - return view - }() let titleLabel: UILabel = { let label = UILabel() label.textAlignment = .center - label.font = .systemFont(ofSize: 17, weight: .semibold) + label.font = .systemFont(ofSize: 15, weight: .semibold) label.textColor = Asset.Colors.Label.secondary.color return label }() + + //TODO: @zeitschlag add chevron init() { super.init(frame: .zero) - configure() + _init() } required init?(coder: NSCoder) { super.init(coder: coder) - configure() + _init() } -} -extension PickServerCategoryView { - - private func configure() { + private func _init() { let container = UIStackView() - container.axis = .vertical - container.spacing = 2 + container.axis = .horizontal + container.spacing = 4 container.distribution = .fillProportionally container.translatesAutoresizingMaskIntoConstraints = false addSubview(container) - container.pinToParent() + let constraints = [ + container.topAnchor.constraint(equalTo: topAnchor, constant: 6), + container.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), + trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 12), + bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 6), + ] + + NSLayoutConstraint.activate(constraints) container.addArrangedSubview(titleLabel) - highlightedIndicatorView.translatesAutoresizingMaskIntoConstraints = false - container.addArrangedSubview(highlightedIndicatorView) - NSLayoutConstraint.activate([ - highlightedIndicatorView.heightAnchor.constraint(equalToConstant: 3)//.priority(.required - 1), - ]) - titleLabel.setContentHuggingPriority(.required - 1, for: .vertical) + + layer.borderColor = UIColor.black.cgColor + layer.borderWidth = 1.0 + applyCornerRadius(radius: 15) } } From c93902ff86b833a6252a51a1704f6fd28b098b69 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 08:02:48 +0100 Subject: [PATCH 20/94] Show back-button on server-list (#690) --- .../PickServer/MastodonPickServerViewController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 6f0fa4a97..a3d870697 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -61,8 +61,6 @@ extension MastodonPickServerViewController { override func viewDidLoad() { super.viewDidLoad() - navigationItem.leftBarButtonItem = UIBarButtonItem() - setupOnboardingAppearance() defer { setupNavigationBarBackgroundView() } From 29cd795718a3ce8f9be7f0f30f24fffb0a5822ab Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Thu, 15 Dec 2022 12:27:24 +0100 Subject: [PATCH 21/94] Adjust onboarding cloud alpha --- .../Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 08e2e43e1..ee375b0c6 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -69,6 +69,7 @@ final class WelcomeIllustrationView: UIView { let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.cloudBase.image) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit + imageView.alpha = 0.3 return imageView }() From d102e090ead366e836759eef6b5d4eabcc2d7321 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 21:11:14 +0100 Subject: [PATCH 22/94] Download thumbnails (#690) --- .../Scene/Onboarding/PickServer/PickServerSection.swift | 8 +++++++- .../PickServer/TableViewCell/PickServerCell.swift | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift index d32b5beb6..4cce243f0 100644 --- a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift @@ -63,7 +63,13 @@ extension PickServerSection { ] ) }() - + if let proxiedThumbnail = server.proxiedThumbnail, let thumbnailUrl = URL(string: proxiedThumbnail) { + cell.thumbnailImageView.af.setImage(withURL: thumbnailUrl) { _ in + OperationQueue.main.addOperation { + cell.thumbnailImageView.isHidden = false + } + } + } attribute.isLast .receive(on: DispatchQueue.main) .sink { [weak cell] isLast in diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift index 554fc6070..882f8c44f 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift @@ -31,6 +31,8 @@ class PickServerCell: UITableViewCell { thumbnail.translatesAutoresizingMaskIntoConstraints = false thumbnail.backgroundColor = Asset.Colors.brand.color thumbnail.layer.cornerRadius = 8 + thumbnail.contentMode = .scaleAspectFill + thumbnail.layer.masksToBounds = true return thumbnail }() @@ -66,7 +68,8 @@ class PickServerCell: UITableViewCell { override func prepareForReuse() { super.prepareForReuse() - + thumbnailImageView.isHidden = true + thumbnailImageView.image = nil disposeBag.removeAll() } From 00a05514a99500b377821f333f5ba4d4f9e1532c Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 21:20:54 +0100 Subject: [PATCH 23/94] Minor styling (#690) --- .../PickServer/TableViewCell/PickServerCell.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift index 882f8c44f..b5e4d987a 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCell.swift @@ -38,7 +38,7 @@ class PickServerCell: UITableViewCell { let domainLabel: UILabel = { let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 20, weight: .semibold)) + label.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) label.textColor = Asset.Colors.Label.primary.color label.adjustsFontForContentSizeCategory = true label.translatesAutoresizingMaskIntoConstraints = false @@ -55,9 +55,9 @@ class PickServerCell: UITableViewCell { let descriptionLabel: UILabel = { let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .caption1).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)) + label.font = UIFontMetrics(forTextStyle: .caption1).scaledFont(for: .systemFont(ofSize: 15, weight: .regular)) label.numberOfLines = 0 - label.textColor = Asset.Colors.Label.primary.color + label.textColor = Asset.Colors.Label.secondary.color label.adjustsFontForContentSizeCategory = true label.translatesAutoresizingMaskIntoConstraints = false return label @@ -99,7 +99,7 @@ extension PickServerCell { thumbnailImageView.heightAnchor.constraint(equalToConstant: 32), thumbnailImageView.widthAnchor.constraint(equalTo: thumbnailImageView.heightAnchor), - thumbnailImageView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor, constant: 16), + thumbnailImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16), thumbnailImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor), ]) @@ -116,7 +116,7 @@ extension PickServerCell { containerView.setCustomSpacing(6, after: descriptionLabel) NSLayoutConstraint.activate([ - contentView.readableContentGuide.trailingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: 16), + contentView.trailingAnchor.constraint(equalTo: checkbox.trailingAnchor, constant: 16), checkbox.heightAnchor.constraint(equalToConstant: 20), checkbox.widthAnchor.constraint(equalTo: checkbox.heightAnchor), ]) From 4ce111164de0cdf119a218fed4df76fc5ce442cf Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 21:49:01 +0100 Subject: [PATCH 24/94] Some styling in pick-server-header (#690) --- .../PickServer/CategoryPickerSection.swift | 20 +++++++++++++++++-- .../View/PickServerCategoryView.swift | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index d43c676b7..a6077c747 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -23,8 +23,24 @@ extension CategoryPickerSection { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: PickServerCategoryCollectionViewCell.self), for: indexPath) as! PickServerCategoryCollectionViewCell cell.categoryView.titleLabel.text = item.title cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in -// cell.categoryView.highlightedIndicatorView.alpha = cell.isSelected ? 1 : 0 - cell.categoryView.titleLabel.textColor = cell.isSelected ? Asset.Colors.Label.primary.color : Asset.Colors.Label.secondary.color + + let textColor: UIColor + let backgroundColor: UIColor + let borderColor: UIColor + + if cell.isSelected { + textColor = .white + backgroundColor = Asset.Colors.Primary._700.color + borderColor = Asset.Colors.Primary._700.color + } else { + textColor = .label + backgroundColor = .clear + borderColor = .separator + } + + cell.categoryView.backgroundColor = backgroundColor + cell.categoryView.titleLabel.textColor = textColor + cell.categoryView.layer.borderColor = borderColor.cgColor } .store(in: &cell.observations) diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift index 6c10ad48d..097b77822 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift @@ -16,7 +16,7 @@ class PickServerCategoryView: UIView { let titleLabel: UILabel = { let label = UILabel() label.textAlignment = .center - label.font = .systemFont(ofSize: 15, weight: .semibold) + label.font = .systemFont(ofSize: 15, weight: .regular) label.textColor = Asset.Colors.Label.secondary.color return label }() From 18a9cbe556de974954d754e2c02a7e30e3093b5b Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 21:59:38 +0100 Subject: [PATCH 25/94] Re-enable search (#690) --- .../MastodonPickServerViewController.swift | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index a3d870697..83aa2e872 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -54,6 +54,11 @@ final class MastodonPickServerViewController: UIViewController, NeedsDependency }() var mastodonAuthenticationController: MastodonAuthenticationController? + + let searchController: UISearchController = { + let searchController = UISearchController(searchResultsController: nil) + return searchController + }() } extension MastodonPickServerViewController { @@ -203,6 +208,9 @@ extension MastodonPickServerViewController { onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) title = L10n.Scene.ServerPicker.title + + navigationItem.searchController = searchController + searchController.searchResultsUpdater = self } override func viewWillAppear(_ animated: Bool) { @@ -381,11 +389,16 @@ extension MastodonPickServerViewController: PickServerServerSectionTableHeaderVi let item = diffableDataSource.itemIdentifier(for: indexPath) viewModel.selectCategoryItem.value = item ?? .all } - - func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, searchTextDidChange searchText: String?) { - viewModel.searchText.send(searchText ?? "") - } } // MARK: - OnboardingViewControllerAppearance extension MastodonPickServerViewController: OnboardingViewControllerAppearance { } + +// MARK: - UISearchResultsUpdating + +extension MastodonPickServerViewController: UISearchResultsUpdating { + func updateSearchResults(for searchController: UISearchController) { + guard let searchText = searchController.searchBar.text else { return } + viewModel.searchText.send(searchText) + } +} From 63f11fd2a2a66499c9823d37e090fb55eacf4316 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 15 Dec 2022 22:24:43 +0100 Subject: [PATCH 26/94] Style server-rules-tableview (#690) --- .../ServerRules/Cell/ServerRulesTableViewCell.swift | 11 +---------- .../MastodonServerRulesViewController.swift | 5 ++--- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift index bb51cdfcf..1c6705de6 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift @@ -49,7 +49,7 @@ extension ServerRulesTableViewCell { private func _init() { selectionStyle = .none - backgroundColor = .clear +// backgroundColor = .systemBackground indexImageView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(indexImageView) @@ -71,15 +71,6 @@ extension ServerRulesTableViewCell { contentView.bottomAnchor.constraint(greaterThanOrEqualTo: ruleLabel.bottomAnchor, constant: 11), ruleLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), ]) - - separatorLine.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(separatorLine) - NSLayoutConstraint.activate([ - separatorLine.leadingAnchor.constraint(equalTo: ruleLabel.leadingAnchor), - separatorLine.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), - separatorLine.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), - separatorLine.heightAnchor.constraint(equalToConstant: UIView.separatorLineHeight(of: contentView)).priority(.required - 1), - ]) } } diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index 35be5c2d9..f1287227d 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -28,12 +28,11 @@ final class MastodonServerRulesViewController: UIViewController, NeedsDependency var viewModel: MastodonServerRulesViewModel! let tableView: UITableView = { - let tableView = UITableView() + let tableView = UITableView(frame: .zero, style: .insetGrouped) tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: String(describing: OnboardingHeadlineTableViewCell.self)) tableView.register(ServerRulesTableViewCell.self, forCellReuseIdentifier: String(describing: ServerRulesTableViewCell.self)) tableView.rowHeight = UITableView.automaticDimension - tableView.separatorStyle = .none - tableView.backgroundColor = .clear + tableView.backgroundColor = .secondarySystemGroupedBackground tableView.keyboardDismissMode = .onDrag tableView.sectionHeaderTopPadding = 0 return tableView From ca41cf10d062cf9dfaf5abb4404f685efe3439ed Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Fri, 16 Dec 2022 21:30:05 +0100 Subject: [PATCH 27/94] Remove sign-in button shadow --- .../Welcome/WelcomeViewController.swift | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 68e3ffae0..a26090a2d 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -42,22 +42,17 @@ final class WelcomeViewController: UIViewController, NeedsDependency { }() let signUpButtonShadowView = UIView() - private(set) lazy var signInButton: PrimaryActionButton = { - let button = PrimaryActionButton() - button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false + private(set) lazy var signInButton: UIButton = { + let button = UIButton() button.contentEdgeInsets = WelcomeViewController.actionButtonPadding button.titleLabel?.adjustsFontForContentSizeCategory = true button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) button.setTitle(L10n.Scene.Welcome.logIn, for: .normal) - let backgroundImageColor = Asset.Scene.Welcome.signInButtonBackground.color - let backgroundImageHighlightedColor = Asset.Scene.Welcome.signInButtonBackground.color.withAlphaComponent(0.8) - button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) - button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) let titleColor: UIColor = UIColor.white.withAlphaComponent(0.9) button.setTitleColor(titleColor, for: .normal) + button.setTitleColor(titleColor.withAlphaComponent(0.3), for: .highlighted) return button }() - let signInButtonShadowView = UIView() private(set) lazy var pageViewController: UIPageViewController = { let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) @@ -120,11 +115,6 @@ extension WelcomeViewController { buttonContainer.sendSubviewToBack(signUpButtonShadowView) signUpButtonShadowView.pinTo(to: signUpButton) - signInButtonShadowView.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addSubview(signInButtonShadowView) - buttonContainer.sendSubviewToBack(signInButtonShadowView) - signInButtonShadowView.pinTo(to: signInButton) - signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) @@ -197,17 +187,6 @@ extension WelcomeViewController { byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 10, height: 10) ) - signInButtonShadowView.layer.setupShadow( - color: .black, - alpha: 0.25, - x: 0, - y: 1, - blur: 2, - spread: 0, - roundedRect: signInButtonShadowView.bounds, - byRoundingCorners: .allCorners, - cornerRadii: CGSize(width: 10, height: 10) - ) } private func updateButtonContainerLayoutMargins(traitCollection: UITraitCollection) { From 96f51f039d3e0fc8f6de0ec27df3b691880c8fa3 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Fri, 16 Dec 2022 22:13:15 +0100 Subject: [PATCH 28/94] Implement mastodon wordmark on WelcomeContentPage --- Localization/app.json | 2 +- .../View/Pages/WelcomeContentPage.swift | 80 ++- .../View/Pages/WelcomeContentPageView.swift | 96 +-- .../mastodon.logo.imageset/Contents.json | 15 +- .../mastodon.logo.imageset/logo.small.pdf | 648 ------------------ .../wordmark-white-text.01e9f493 1.png | Bin 0 -> 3554 bytes .../wordmark-white-text.01e9f493 1@2x.png | Bin 0 -> 8451 bytes .../wordmark-white-text.01e9f493 1@3x.png | Bin 0 -> 14369 bytes .../Generated/Strings.swift | 4 +- .../Resources/Base.lproj/Localizable.strings | 2 +- 10 files changed, 112 insertions(+), 735 deletions(-) delete mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/logo.small.pdf create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1.png create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@2x.png create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@3x.png diff --git a/Localization/app.json b/Localization/app.json index 744435f3a..af7c05a90 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -244,7 +244,7 @@ "log_in": "Log In", "education": { "what_is_mastodon": { - "title": "What is Mastodon?", + "title": "What is", "description": "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.", }, "mastodon_is_like_that": { diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift index e97f82dd2..d50086ef0 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPage.swift @@ -7,43 +7,57 @@ import UIKit import MastodonLocalization +import MastodonAsset enum WelcomeContentPage: CaseIterable { - case whatIsMastodon - case mastodonIsLikeThat - case howDoIPickAServer - - var backgroundColor: UIColor { - switch self { - case .whatIsMastodon: - return .green - case .mastodonIsLikeThat: - return .red - case .howDoIPickAServer: - return .blue + case whatIsMastodon + case mastodonIsLikeThat + case howDoIPickAServer + + var backgroundColor: UIColor { + switch self { + case .whatIsMastodon: + return .green + case .mastodonIsLikeThat: + return .red + case .howDoIPickAServer: + return .blue + } } - } + + var title: NSAttributedString { + switch self { + case .whatIsMastodon: + let image = Asset.Scene.Welcome.mastodonLogo.image + let attachment = NSTextAttachment(image: image) + let attributedString = NSMutableAttributedString(string: "\(L10n.Scene.Welcome.Education.WhatIsMastodon.title) ") - var title: String { - switch self { - case .whatIsMastodon: - return L10n.Scene.Welcome.Education.WhatIsMastodon.title - case .mastodonIsLikeThat: - return L10n.Scene.Welcome.Education.MastodonIsLikeThat.title - case .howDoIPickAServer: - return L10n.Scene.Welcome.Education.HowDoIPickAServer.title + attachment.bounds = CGRect( + x: 0, + y: WelcomeViewController.largeTitleFont.descender - 5, + width: image.size.width, + height: image.size.height + ) + + attributedString.append(NSAttributedString(attachment: attachment)) + attributedString.append(NSAttributedString(string: " ?")) + return attributedString + case .mastodonIsLikeThat: + return NSAttributedString(string: L10n.Scene.Welcome.Education.MastodonIsLikeThat.title) + case .howDoIPickAServer: + return NSAttributedString(string: L10n.Scene.Welcome.Education.HowDoIPickAServer.title) + } } - } - - var content: String { - switch self { - case .whatIsMastodon: - return L10n.Scene.Welcome.Education.WhatIsMastodon.description - case .mastodonIsLikeThat: - return L10n.Scene.Welcome.Education.MastodonIsLikeThat.description - case .howDoIPickAServer: - return L10n.Scene.Welcome.Education.HowDoIPickAServer.description + + var content: String { + switch self { + case .whatIsMastodon: + return L10n.Scene.Welcome.Education.WhatIsMastodon.description + case .mastodonIsLikeThat: + return L10n.Scene.Welcome.Education.MastodonIsLikeThat.description + case .howDoIPickAServer: + return L10n.Scene.Welcome.Education.HowDoIPickAServer.description + } + } - - } } diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index 7f7c037b2..7cfb605df 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -8,52 +8,52 @@ import UIKit class WelcomeContentPageView: UIView { - - //TODO: Put in ScrollView? - private let contentStackView: UIStackView - private let titleView: UILabel - private let label: UILabel - - init(page: WelcomeContentPage) { - - //TODO: @zeitschlag Decide based on page which titleView, first page has mastodon-logo in it - titleView = UILabel() - titleView.font = WelcomeViewController.largeTitleFont - titleView.textColor = WelcomeViewController.largeTitleTextColor - titleView.text = page.title - titleView.adjustsFontForContentSizeCategory = true - titleView.numberOfLines = 0 - - label = UILabel() - label.text = page.content - label.font = WelcomeViewController.subTitleFont - label.textColor = WelcomeViewController.largeTitleTextColor - label.adjustsFontForContentSizeCategory = true - label.numberOfLines = 0 - - contentStackView = UIStackView(arrangedSubviews: [titleView, label, UIView()]) - contentStackView.translatesAutoresizingMaskIntoConstraints = false - contentStackView.axis = .vertical - contentStackView.alignment = .leading - contentStackView.spacing = 8 - - super.init(frame: .zero) - - addSubview(contentStackView) - - setupConstraints() - } - - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - private func setupConstraints() { - let constraints = [ - contentStackView.topAnchor.constraint(equalTo: topAnchor), - contentStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), - trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 16), - bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor) - ] - - NSLayoutConstraint.activate(constraints) - } + + //TODO: Put in ScrollView? + private let contentStackView: UIStackView + private let titleView: UILabel + private let label: UILabel + + init(page: WelcomeContentPage) { + + //TODO: @zeitschlag Decide based on page which titleView, first page has mastodon-logo in it + titleView = UILabel() + titleView.font = WelcomeViewController.largeTitleFont + titleView.textColor = WelcomeViewController.largeTitleTextColor + titleView.attributedText = page.title + titleView.adjustsFontForContentSizeCategory = true + titleView.numberOfLines = 0 + + label = UILabel() + label.text = page.content + label.font = WelcomeViewController.subTitleFont + label.textColor = WelcomeViewController.largeTitleTextColor + label.adjustsFontForContentSizeCategory = true + label.numberOfLines = 0 + + contentStackView = UIStackView(arrangedSubviews: [titleView, label, UIView()]) + contentStackView.translatesAutoresizingMaskIntoConstraints = false + contentStackView.axis = .vertical + contentStackView.alignment = .leading + contentStackView.spacing = 8 + + super.init(frame: .zero) + + addSubview(contentStackView) + + setupConstraints() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupConstraints() { + let constraints = [ + contentStackView.topAnchor.constraint(equalTo: topAnchor), + contentStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 16), + bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor) + ] + + NSLayoutConstraint.activate(constraints) + } } diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/Contents.json index 76d42c15e..087aec8bf 100644 --- a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/Contents.json +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/Contents.json @@ -1,8 +1,19 @@ { "images" : [ { - "filename" : "logo.small.pdf", - "idiom" : "universal" + "filename" : "wordmark-white-text.01e9f493 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "wordmark-white-text.01e9f493 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "wordmark-white-text.01e9f493 1@3x.png", + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/logo.small.pdf b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/logo.small.pdf deleted file mode 100644 index 581801f38..000000000 --- a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/logo.small.pdf +++ /dev/null @@ -1,648 +0,0 @@ -%PDF-1.7 - -1 0 obj - << /Type /XObject - /Length 2 0 R - /Group << /Type /Group - /S /Transparency - >> - /Subtype /Form - /Resources << >> - /BBox [ 0.000000 0.000000 269.000000 75.000000 ] - >> -stream -/DeviceRGB CS -/DeviceRGB cs -q -1.000000 0.000000 -0.000000 1.000000 4.000000 4.000000 cm -0.000000 0.000000 0.000000 scn -0.000000 67.000000 m -261.000000 67.000000 l -261.000000 0.000000 l -0.000000 0.000000 l -0.000000 67.000000 l -h -f -n -Q - -endstream -endobj - -2 0 obj - 234 -endobj - -3 0 obj - << /Length 4 0 R - /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] - /Domain [ 0.000000 1.000000 ] - /FunctionType 4 - >> -stream -{ 0.388235 exch 0.392157 exch 1.000000 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.050980 mul 0.388235 add exch dup 0.000000 sub -0.164706 mul 0.392157 add exch dup 0.000000 sub -0.200000 mul 1.000000 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.337255 exch 0.227451 exch 0.800000 exch } if pop } -endstream -endobj - -4 0 obj - 339 -endobj - -5 0 obj - << /Type /XObject - /Length 6 0 R - /Group << /Type /Group - /S /Transparency - >> - /Subtype /Form - /Resources << /Pattern << /P1 << /Matrix [ 0.000000 -65.993195 65.993195 0.000000 -61.993195 70.224548 ] - /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] - /ColorSpace /DeviceRGB - /Function 3 0 R - /Domain [ 0.000000 1.000000 ] - /ShadingType 2 - /Extend [ true true ] - >> - /PatternType 2 - /Type /Pattern - >> >> >> - /BBox [ 0.000000 0.000000 269.000000 75.000000 ] - >> -stream -/DeviceRGB CS -/DeviceRGB cs -q -1.000000 0.000000 -0.000000 1.000000 4.000000 3.632446 cm -/Pattern cs -/P1 scn -60.826767 51.982300 m -59.885666 59.068882 53.787518 64.663071 46.568073 65.739265 c -45.346546 65.922020 40.730431 66.592102 30.036348 66.592102 c -29.956215 66.592102 l -19.252211 66.592102 16.959164 65.922020 15.737550 65.739265 c -8.708311 64.683380 2.299911 59.667900 0.737860 52.489872 c --0.003115 48.956699 -0.083220 45.037697 0.056964 41.443653 c -0.257227 36.286026 0.297280 31.148746 0.757885 26.011383 c -1.078305 22.600037 1.629032 19.219128 2.420071 15.889084 c -3.902017 9.736488 9.889900 4.619389 15.757648 2.538147 c -22.035824 0.365425 28.794806 0.000015 35.263187 1.492470 c -35.974140 1.665001 36.675091 1.857872 37.376038 2.081261 c -38.948124 2.588921 40.790466 3.157455 42.152252 4.152424 c -42.172348 4.162594 42.182354 4.182858 42.192364 4.203201 c -42.202370 4.223465 42.212376 4.243816 42.212376 4.274334 c -42.212376 9.249176 l -42.212376 9.249176 42.212376 9.289791 42.192364 9.310051 c -42.192364 9.330315 42.172348 9.350658 42.152252 9.360832 c -42.132240 9.370922 42.112228 9.381180 42.092300 9.391270 c -42.072121 9.391270 42.052189 9.391270 42.032177 9.391270 c -37.886612 8.386127 33.631145 7.878468 29.375511 7.888641 c -22.035824 7.888641 20.063231 11.421898 19.502539 12.883831 c -19.051918 14.152893 18.761566 15.482990 18.641405 16.823097 c -18.641405 16.843441 18.641405 16.863705 18.651411 16.884052 c -18.651411 16.904316 18.671425 16.924664 18.691521 16.934837 c -18.711451 16.944927 18.731462 16.955097 18.751476 16.965271 c -18.821604 16.965271 l -22.896957 15.970303 27.082464 15.462643 31.277977 15.462643 c -32.289371 15.462643 33.290596 15.462646 34.301991 15.493084 c -38.517517 15.614994 42.963440 15.828209 47.118843 16.650486 c -47.218906 16.670830 47.329144 16.691097 47.419201 16.711441 c -53.967884 17.990677 60.196030 21.990898 60.826767 32.123367 c -60.846947 32.519287 60.906982 36.306290 60.906982 36.712379 c -60.906982 38.123699 61.357521 46.692589 60.836857 51.961868 c -60.826767 51.982300 l -h -f -n -Q -q -1.000000 0.000000 -0.000000 1.000000 16.353134 47.918640 cm -1.000000 1.000000 1.000000 scn -0.000000 3.736245 m -0.000000 5.807401 1.632209 7.472382 3.654834 7.472382 c -5.677542 7.472382 7.309585 5.797228 7.309585 3.736245 c -7.309585 1.675262 5.677542 0.000028 3.654834 0.000028 c -1.632209 0.000028 0.000000 1.675262 0.000000 3.736245 c -h -f -n -Q -q -1.000000 0.000000 -0.000000 1.000000 32.524460 30.973694 cm -1.000000 1.000000 1.000000 scn -38.200230 17.462723 m -38.200230 0.284256 l -31.541471 0.284256 l -31.541471 16.955149 l -31.541471 20.467976 30.099640 22.244776 27.205791 22.244776 c -24.011585 22.244776 22.399469 20.122755 22.399469 15.950090 c -22.399469 6.822678 l -15.790834 6.822678 l -15.790834 15.950090 l -15.790834 20.143185 14.198734 22.244776 10.984432 22.244776 c -8.100758 22.244776 6.648746 20.467976 6.648746 16.955149 c -6.648746 0.294346 l -0.000000 0.294346 l -0.000000 17.462723 l -0.000000 20.965542 0.871139 23.757576 2.623425 25.828648 c -4.435832 27.899887 6.808930 28.945639 9.742804 28.945639 c -13.147311 28.945639 15.730712 27.605450 17.432966 24.925154 c -19.095194 22.082256 l -20.757338 24.925154 l -22.459507 27.595276 25.032986 28.945639 28.447416 28.945639 c -31.381290 28.945639 33.754387 27.889629 35.566792 25.828648 c -37.319077 23.757576 38.190220 20.985806 38.190220 17.462723 c -38.200230 17.462723 l -h -61.110268 8.924355 m -62.491982 10.416807 63.143234 12.264570 63.143234 14.518509 c -63.143234 16.772449 62.481976 18.640476 61.110268 20.061882 c -59.788589 21.554337 58.106689 22.265121 56.073723 22.265121 c -54.041008 22.265121 52.368858 21.554337 51.037174 20.061882 c -49.715416 18.640476 49.054577 16.772449 49.054577 14.518509 c -49.054577 12.264570 49.715416 10.396461 51.037174 8.924355 c -52.358852 7.502947 54.041008 6.781986 56.073723 6.781986 c -58.106689 6.781986 59.778584 7.492773 61.110268 8.924355 c -h -63.143234 28.255198 m -69.701591 28.255198 l -69.701591 0.781738 l -63.143234 0.781738 l -63.143234 4.020473 l -61.160301 1.330006 58.416882 -0.000011 54.852188 -0.000011 c -51.287495 -0.000011 48.543831 1.370613 46.110611 4.172821 c -43.717499 6.974941 42.505974 10.437069 42.505974 14.498163 c -42.505974 18.559340 43.727505 21.970684 46.110611 24.772808 c -48.553837 27.574930 51.457687 28.996338 54.852188 28.996338 c -58.246773 28.996338 61.160301 27.676495 63.143234 24.996117 c -63.143234 28.234852 l -63.143234 28.255198 l -h -91.770676 15.036257 m -93.703575 13.543886 94.665031 11.462475 94.615005 8.832880 c -94.615005 6.030758 93.653549 3.827599 91.670616 2.304710 c -89.688515 0.812176 87.294495 0.050774 84.390968 0.050774 c -79.154297 0.050774 75.599525 2.253845 73.716660 6.579025 c -79.405289 10.041067 l -80.164940 7.685646 81.837677 6.467285 84.390968 6.467285 c -86.734138 6.467285 87.895714 7.228771 87.895714 8.822790 c -87.895714 9.980196 86.373070 11.025948 83.269424 11.838133 c -82.097839 12.163090 81.127220 12.498138 80.375908 12.772230 c -79.303558 13.208757 78.392975 13.706240 77.631653 14.315380 c -75.749619 15.807833 74.789009 17.777590 74.789009 20.305622 c -74.789009 22.996006 75.699593 25.138290 77.531593 26.681526 c -79.415298 28.275459 81.706749 29.037029 84.451004 29.037029 c -88.826294 29.037029 92.020851 27.118137 94.113853 23.219398 c -88.526115 19.929964 l -87.715591 21.798073 86.333038 22.732088 84.451004 22.732088 c -82.468071 22.732088 81.506630 21.970686 81.506630 20.478231 c -81.506630 19.320744 83.029274 18.274992 86.132919 17.462723 c -88.526115 16.914539 90.408142 16.092180 91.770676 15.036257 c -91.780693 15.036257 l -91.770676 15.036257 l -h -112.618164 21.452854 m -106.870323 21.452854 l -106.870323 10.020803 l -106.870323 8.650179 107.381485 7.817646 108.352104 7.441906 c -109.063393 7.167816 110.485130 7.117115 112.628166 7.218597 c -112.628166 0.791912 l -108.212013 0.243645 105.008308 0.690430 103.126274 2.162537 c -101.243401 3.583942 100.331985 6.233803 100.331985 10.010632 c -100.331985 21.452854 l -95.915833 21.452854 l -95.915833 28.265369 l -100.331985 28.265369 l -100.331985 33.808784 l -106.890335 35.951027 l -106.890335 28.255198 l -112.638176 28.255198 l -112.638176 21.442680 l -112.628166 21.442680 l -112.618164 21.452854 l -h -133.525681 9.086706 m -134.847351 10.508114 135.507782 12.325527 135.507782 14.528599 c -135.507782 16.731840 134.847351 18.528820 133.525681 19.970573 c -132.193161 21.391897 130.571289 22.112776 128.589188 22.112776 c -126.606262 22.112776 124.984390 21.402071 123.651871 19.970573 c -122.381058 18.478121 121.719803 16.680973 121.719803 14.528599 c -121.719803 12.376308 122.381058 10.579159 123.651871 9.086706 c -124.974380 7.665382 126.606262 6.944508 128.589188 6.944508 c -130.571289 6.944508 132.193161 7.655127 133.525681 9.086706 c -h -119.037262 4.203255 m -116.443100 7.005379 115.171455 10.406551 115.171455 14.528599 c -115.171455 18.650732 116.443100 22.001038 119.037262 24.803242 c -121.629745 27.605450 124.834297 29.026855 128.589188 29.026855 c -132.343262 29.026855 135.558640 27.605450 138.141953 24.803242 c -140.725266 22.001038 142.056961 18.538994 142.056961 14.528599 c -142.056961 10.518290 140.725266 7.005379 138.141953 4.203255 c -135.547806 1.401051 132.394119 0.030510 128.589188 0.030510 c -124.784264 0.030510 121.619743 1.401051 119.037262 4.203255 c -h -163.985123 8.934444 m -165.306808 10.426897 165.968063 12.274660 165.968063 14.528599 c -165.968063 16.782539 165.306808 18.650732 163.985123 20.072056 c -162.664291 21.564592 160.982376 22.275211 158.948578 22.275211 c -156.916458 22.275211 155.233719 21.564592 153.862839 20.072056 c -152.540329 18.650732 151.879898 16.782539 151.879898 14.528599 c -151.879898 12.274660 152.540329 10.406551 153.862839 8.934444 c -155.243713 7.513037 156.966492 6.792244 158.948578 6.792244 c -160.932358 6.792244 162.654282 7.502947 163.985123 8.934444 c -h -165.968063 39.260834 m -172.526413 39.260834 l -172.526413 0.791912 l -165.968063 0.791912 l -165.968063 4.030647 l -164.035995 1.340179 161.291748 0.010162 157.727798 0.010162 c -154.163025 0.010162 151.379578 1.380703 148.925522 4.182991 c -146.532318 6.985115 145.321548 10.447161 145.321548 14.508337 c -145.321548 18.569429 146.542328 21.980774 148.925522 24.782898 c -151.358734 27.585186 154.312286 29.006512 157.727798 29.006512 c -161.141647 29.006512 164.035995 27.686666 165.968063 25.006289 c -165.968063 39.250683 l -165.968063 39.260834 l -h -195.566971 9.117228 m -196.888641 10.538635 197.549896 12.355879 197.549896 14.559118 c -197.549896 16.762192 196.888641 18.559340 195.566971 20.001011 c -194.245285 21.422335 192.623413 22.143211 190.630478 22.143211 c -188.638367 22.143211 187.026520 21.432508 185.694000 20.001011 c -184.422363 18.508474 183.761093 16.711493 183.761093 14.559118 c -183.761093 12.406662 184.422363 10.609680 185.694000 9.117228 c -187.016510 7.695736 188.648376 6.974945 190.630478 6.974945 c -192.613403 6.974945 194.235291 7.685648 195.566971 9.117228 c -h -181.077713 4.233692 m -178.495224 7.035900 177.212753 10.437071 177.212753 14.559118 c -177.212753 18.681084 178.485229 22.031557 181.077713 24.833679 c -183.671036 27.635885 186.875580 29.057293 190.630478 29.057293 c -194.385376 29.057293 197.599915 27.635885 200.183228 24.833679 c -202.775726 22.031557 204.098236 18.569429 204.098236 14.559118 c -204.098236 10.548725 202.775726 7.035900 200.183228 4.233692 c -197.589905 1.431572 194.435410 0.060863 190.630478 0.060863 c -186.825546 0.060863 183.661026 1.431572 181.077713 4.233692 c -h -232.475540 17.696289 m -232.475540 0.822433 l -225.917206 0.822433 l -225.917206 16.812975 l -225.917206 18.630386 225.466064 20.001011 224.535477 21.036505 c -223.674088 21.970686 222.452469 22.457994 220.879807 22.457994 c -217.175766 22.457994 215.292923 20.204056 215.292923 15.645479 c -215.292923 0.812172 l -208.734528 0.812172 l -208.734528 28.265369 l -215.292923 28.265369 l -215.292923 25.178900 l -216.864761 27.757797 219.367996 29.026855 222.862732 29.026855 c -225.656174 29.026855 227.949310 28.041977 229.732117 26.011431 c -231.564957 23.980885 232.475540 21.229462 232.475540 17.665854 c -f -n -Q - -endstream -endobj - -6 0 obj - 9965 -endobj - -7 0 obj - << /Type /XObject - /Subtype /Image - /BitsPerComponent 8 - /Length 8 0 R - /Height 148 - /Width 538 - /ColorSpace /DeviceGray - /Filter [ /FlateDecode ] - >> -stream -xC#[ֆ;ݍ;$$@pwwwwww~wW̽LPU[׻׿ }ӿ>_a?CL]0qoAtUǏ>񣯗QoN|ȥ\ Q;iϢАPCa6OP8u!!\@?Qw 3̡̞ǯIL4DFFDEECQ11(66&6oGEGErN 5?%fSHlDEEBDDd$6vdq.11!!!>..N0 <~ՑqDdt\BfіkΗ` .dNMMK@^×E/zҠTt$; 2)1!.&:2tpP;?G&:4&1͕+J O!1q IvGM3|9yy~*r ?//77';;+3ӗ e6~ }gsz|yy>k-$ŧEL|-gfWVVUT։E7TWUUVVfefx)(A+(iчq6WFnQyUM]mUyqn_PZϖddWU646wtvwYo~0/Mu:bPLf|1$<:˯klb"~).z";pxdtl|brrjjzzzffv2 LOMMMNL tu46TWfz]†ShW"#P@K2"cщɉс<#."XCqI73pdlbjfn~~qiyeuu ZX؄:0?7;=59>:4TWU -6#˜|@sI 9bxbDdZ~ Jp:VV:|΄пMfv.ovAiuckW*@;888<<:<:::X萓{{;;[dianzbd('HD02X0s4xkY>| -Jtg5O.mn.M gѼ`8['odrf~emc{wJtͷ!>\svvzrrr R@(!6/ M0X'B DucKͫ<`F;sla1Ca1Ԍ殁sp}ss'7B X&gLJkKC=exEaEF&$=wпn~ -{ -j'wOnNV&k _CfhB#cS<9EUMKG'gW7@Woo|0Ĺ/ϟ??~6`gcynb8ۓ+@a˲Mz}YDbS 1Hw>ڽ뇗,t{ ˇsb¢bmΌÓ˛ϰ~,?'tpngd@{}Y7%)NRE£ѠiB"6eYH5! }2f6XNW3 E_7awgV6u O-n] b4 O?!.7(pwceA+)6ׯ0nT pgW5( &eO1!cvl}Q=6,/odjXT=5wlnm\FPi?}Ï!_<^͍TZ֠)1n ݙm==y丈пo& q2$332^eԶL.n\ DAHx^lLJ˓Bb|#bəARB!3&&B ذ)!SrRK:Wvϯ%.`%?E rws~4eKx7o|vy}}ea`Bb_@B2a!H O`KD-5cxfuᵼy;h{Y(HID!JQ\DWficp[eaE?G dFQ2mſ UY~Wd -o>c]YhgvO.Ӣ|gh@/J(Jɷ't5q8P(?5&º뛫=:\]D*El\կ*M u_ 3eFQd+ϙ&T -hUP G9c *haNеO~e^Eg`ڐZi(r%M􌾙y9x8h9c,S)2S r#sf4 /o 3yNT˹BGk*VVK_giӧPDY(9x `Ɍt;LM -")H̄Ez3G?,I_*Ц,U%CW!Tmd|{|iWb__G_XJPgj -ҝ&M~52M09%Lےb5 - %<$2/6!fUgJJÖ 4R9D%|E]{wZH2snjUi#RI q{hPѥxu#]Lt\W܀#p6y 2U6жLvmqt \*A-)[D=H0y,$UkK8Og T]4OVBSc#,+/I#[+͛efffx=n90lNY9ʀTxDL!iYY>Оde\%hY?tgq8r$iUsEē{sY8ݓLA s+ l -4]Ѥa&M 2eR=Li;# Ño4ՆhU%1AvmՎe WOz`8]:цE&j{VoP%/ O8C`Vh3p%EY-K3L:2r JJ⢂\R^Eb|6ŕz<$H훈N㓒^_N~QqiTZ\ɚF 0ݾΑ/_?ߞNTfzF^S`KIMX,%)+#Hƫ@S,wek4%E9T+5=ypnӊgo*ob MXWTofnA!iAy)> 0 1dgMKu;S$ť.i'i'  -'cta~?//:\$B{ -|l2/A51 v730N—,dX ,/Mb#5=u%'wЁ!.~15.6{[=)&+SHxtlӓ_ZIJchkH̜ںd+r+=o`hlk(I<Ρ[\/g{ks] 5FTm"9p5E/NZCV o'ɇH6I kH J˞peV5vNk6879P,MM Ԑ!ف)"*Ԑ#]ZY֝řɡlaOvW4v M.`'{k 3(#"&%XX;25KkdZjJrt#1)MrysKjZzҢGK3`odn}d F?mwL-nljTˋ3-WWKe!6?&SHL!MMN2G֎_Yh(p -Cr%Z淰<1 6K,8?^)VR0h< - -0=93kۻrxzrr|:?5630:98;TjT)k[?<>=TX+HusK뻆6/Af`wkmif-5nң]=9;=;==>:^_l,A@(Ϗo\P981.nM&# cge$:-12t| mj*Ԗ#:)&3wtziumei~zbtxhxlrvimꁙũ -$ -*P sly6#3`|'H, xIR61/WexLB7aP+lC:?;Z[չC`O)Z;<]{KC Y9EUS[VLoڷ//OWgk=vSkDo;%c.oon뫋ݍ暢T,wT6wfQUs̊յFsCɳեٹ @̠I+@W`fc{ *սٱڒl--1"šΑٕ}hsmyq~nYspr~Ino)~r푟'e52!hMkr^90 .`Q@[uaFJbWy]#3+׷څſ hώvVz3R" O%՝! j(/-,[Җ_%t -Brmy(#9>ٌJ>9Gmw58;]_2MXXwVQMk=Cѣ㽝u9fAegH2DeeS7?m5-[&dosqj4HB!/EKnoNO8"rgq04ĥJq"5g?Wo7G+-yWM ٓW3:w|s߾@̜fpoG*F8ڜl.tX1S2j4;Fh?PsufdmӰgJ|(jїuUPGm W @o=')xL?<T -2H|˞fD}cm4^ w5 &rȌ2EI)/NOYg֧R4>k+mti7QadN/@&ӏQw'zʲ 4L[&6N̂f -4YW15&+5-kbex&?9_g2^OaѶzU(@Jq7of0xFQჴ4C|`.[mvF@⹓ -]QU3!27q~6VWTs%+>)`%Jb 0G5? u7ItAhDݛW:0{|q𙥮^-Ui,1N #3ƞ27/d)ʛ:an YNEvE.#F3(Bw]a]8VV !)Z;x2 $Y]ߠku˞`ѫ "Co $=sxbi Yx|o d0'Q1*3[Wpi0t+ ޅѮʪV;'ZJU3{k}řRe5 -9T|s@Vz/3V]Spem3iI$ƥXq-P0h4 M(l?QSET*D԰h\~K@loe$3,O#h-+z+do -~E߾]+LwseDm {Qx{(3raFB%3bcHhN! -5%Nv8\Xm./nV&5o,uf8IvXA77؜8bsdWfSE_c2%`u-cP;ɌS 54#2B Ci@4Q>蒢3U܃C +KK˫)1Kڲ1&d$ƒ*oÞ ckeafjbjVAʼnڶ=\1 4Nv)1?ph[Gv}~BCwt`7 MfWf1ɯ,U(#|Ehi ud,Ја8e2Loful]p{Mɐmc N2d`0<;|0r7_.Vzғ"pm@e /X( -&oѫ}E}6@߿]Oel梠Ev"^S彾DcT*~ 2$3ܶ8)3X -gS#== -\3@u(&>D vLIqWnX䋓uSgWuۖtHg º!O -*BT>9>:22J܉8~$c4 dhxïBLMOOw":b/X c]Rv!kh8FICN46-Bhk~B N@Fd3mlqmJ?<3~,/@ƽ5%r.oie7fzmm!޳{t,3*@" r49PWOnmhlznanf '\y}[1B&Hꊨ=!x¬=mNWX!`. }]]ݽ -. )2ьނ2Svm~jx[kKkg7ulSp#7x&*2a` G;]Aj[ #%Ȑ6GfoBzMc 1.h 55yiIVd$r*;V f!2V3t4;8}~A 5N#ºq #F{uTt6WWW^::?2+Sڅ=qxe,~H2RK]qwԖHI{3IAIieÖRd=-@+Fz;jkH,SE;Kݵ^ Q ά2k_Н|T$[+mo(++"?>GLʖ̸o\wEm]GBӔoml UExlwe Qa xvw 3xsmJ;`qCXH՝8Ә~ ҁ'|-ଠ$>30o 0L͎4הeggeW `&S~dH$$&7ɞܫS-5yY*X\Ĥ+nOv{&M!*Caj$|uyQ~v;ّ=AU`kqreYqA^^^aIe=ٝUݍ{.-_KVO,g~uE%Pe %ٙMMS1A|*a eDNF X$;za>mWԶtϬ6R -O{HB#1&* # 3~=?ؘ)*gdU5u -t&\ꓡ2>F%5ieLu0TSco_'x|r2U戏#SӁ~J>QCEAvzr=Z}̰̌ Q8 -|f N6Wfgx}%eD%s{Ǘ$:XS6[JZ*U[ }5eY4ח[TIvfuW;\8k`eNK֖ezSN+ UV>Ht2d01,&DƑiNm)l<9$;&R -)>&yXŀ5ۋcݤ|idg/{L#gM|=^n L$]530$7Dq -:,޺2.!'%sq9;he&$$$S^!HQِЈH쬒nc<|FF",QNyxO~~FyHH v7t1eY =u^%9rb  - sniS"-$!'JFLZ>|Lk=RD|?';8'Y{I*c۬DLQOWf9ke ̔eΰ h*+ 1㢴 IrT"tI/EnHǛ@$HXXgtAuyĈAG ~FgYmuPv3(՗)i mG i>}R9#(#ՈGKW)bǒb:ژhIv7f4{0x=wal%Ȱ2HJ_djUAb}:T=YJMIv7w^h.WYPl鴼vɆQ $k۰:`l.YnZAnV#T,p懀NVy_:ܐţM@4H'f,T V&cFVdz'u"PQ<_z&-xAá0/EhS+bRD0WSmcĐdحz`mN%#/$KvEː*HٷWfg"W[B7!΃Ka,֡$,m[Zn0nX^ h"8u gxQ8{a,U4G;p8Y@} d`fڝ$;!tń}o!h;]Ѵ{kD@S;@3CNAR2ŧ̈֡fYe=e 3n޲30DP&ƐLl:rqA|hoC݀'mB|HYV r~L -juqvb ˺:AYx|J' 36@FGо&/bZxV6x2ZX>RA}iA^~y8n -T><Y0pmB&OUN0+[Lr5˥)h^bƾE\IH {QE0?.W" M -D @42 Tw ݥ\;5 XV7qQ@;y!E18d+IR];q7VIv t5ה s_IJV)?l'dhA] )Gɣ'~bGJ# p%y08 8U|$KR"H#2+oB4*f1@)@()4J[tF1g(0 3\) . sl_~21Ƞٳn!C3zT.@O` X'̣drniukW-U/Gj2Ƒ~}bZ`z@LgaZ:>;&r/*R$CyQAQt|u]PpyS{ -†,zd$6l2,>-Rm[{ aAސf}4v|M@FB4O5F)/=YZq9;0!!0Ila& ruGT)m_Z=DgqV ("w1u?7Ԣg ]1DL#At3 -g` 1F_'i4C ;B 3R[Q6qmYm$F xӑbbOXP]DIؖz -O1I Į gRɷE% -25tH|H@:j~ Xk!?athib]̼1:=[BY|L Lц6I?2^@5y\b&^ʓH3"$JIJ*k@`⏁*AA M@V=)(i#*@ao"LxkB-OU<];5C'Ef[$%.I3kpg1ےU26N.9IJW:?Bg@AF˕5V& " ah PҬML0+' ˘,%ד_VnaqyU}sGuˇ<@) 2uԅF&X r%B)H/pIآi1weAvVNɛ7 % h"2jp6IH<5J+o2@ m`6Lb(ΜJ:*7q攓DFf00 #2g dP8ۺ,d~,zD&g? aLqgbY  -4ګ4WlvXPj:$\,vT)0T$~$B+r-dS,,A|+)$$42:ޖJzӽH-+j]ǘ":!3)6Ǡ%30XD1崤Dw}q*(-^nB +!>IJ)ͽE2>:2lj'X dX2d'dV(R< eɌ7 ׼H'+kA(16zBe2ƺX~D|>P+|dW)2|DGfѢT(i]?@0#qNea FGRģ -2k XȨ0Eㆻ-PIkhLln2yt|9Akh3e1DCm*ՑkHТcdn\g>P.ȈMpx zRek3CmE$WNZ{Pi51};Q3:e< |&[2D ew%Q|&O( 2٩DklK&Aw|9d["HO,3Qt%A;gV766qioAeKnL_6t;pí1:ԋT-䤄X&?Sg ,e.LwQf8:Q˨J0C':,KۛSf]#>6֦SB-mLUgݞ_9<i;kY2 6 8EБ ßQÎpg[Q7ahamzLdy#3FZG.H뤓7qeԘM.&jjڻz:Kuksw?BJ -#FfP"RSvwNY*ZPͦ ozfnQݡm]NR#VKVs2v&_w- {ӀU^jJue=P3kj!Ҵ8.:VxbYuBF%3P|D@fLTdb́ 82H>3`~ՠdJ@ܤ[Hw3?!;}`bqֺmPZUl 7pWSmyIQA~AQie}[٦D1< ; g;, !na خrˌHd2'Ή%YG }e@_b=fњ @gk}MeEyEUmlW] 22z;F -^o \XY[[i,-**M [,|%Et_1OVgG;bnFjÑB`,{B2;PWSSgn&Xs5k՚I$؍D+}MMEeu]KkՍƿ&9Р<*lluvl@m[DJ"I6b;@; #44DȘ6QdHfϐ*wd -M~z~zBL?<5s{$3M*sIIނj=qc`oken|NsǺ5[쑭 - GX aQǾ<% m~D ?78:9fnxw2T$2u/<6v/ɵ1=jh;{f6ca$TWyO(@}CDu9x43ЂgŸW5O/> #OhoBh k,P!2'nӏ$.>Af& #:"`/Bc|i%pgcy~zrltz_!mBNglqhocynbo`dR_=`f‚M`N!%Ndy[k3cؙX.e2_1C=?cvzjrzf*iHDasְd @lLzSНݽSs8 -2n!c<܂Mpc{Q]fEDHH9EQţ>ד6*s=xvWyVN<;9>NN/nSVyvdzfqC_Qc3ݽcpqEӥ&X}&vE`x'19!C=8@O3m qj2ׄωceIguת_f2YV !@oî$>?#sq< "YD ThqЌ z(dw{k=& c&)GT/j?ijkd6pcnPN2:S6WOx_ 6m[M$.?>Vhq|TU-}zGAOt^,X[+kIᗰޙ| 8, Cu3lcv6)LSLhB nweNaN_i39\0ab ;d~}y]# =YKXaō~NyWٷD@}P֙ e #YZwLKI1e"}%J\|$xsirli OLRz3+w&z9b#q`5֦w%5º 9z_Xv%ܣTYT -[^Zճ=ON7G:kCf6W4u,o]GZSvg N^c<-3nb{AzVw.lccv9+d6AF0bS9>:eI}e WzuLra9&M7Wh4.\8g\;ZC*//6\vC:nyT,66ĄcGUy\3}p.z"'".-5H 0|=h'.1N3Ssz[ d_&BCA.mw LUcA]h>h{j;G| xC+[;[ks]ڌ4Œ1S;}FǪ]J+ P3:M -:w6 -m-As4XΌ~=aŇ (=ӼiI!gnJqHz1eOqXIT-L\2CJt'wtj~ymc "F6! kV>ț/ɉbKCؼ`P}MKЙ.lMtϜ#\<𵞤FmH$>Oh 𪊓㣣}^hڎ -\twyyASG`Q!F3t(jf5"hɌ DZ~89kȆ`m*dh[QZ=4>mosy憆Ɩξщq#5>xpB#YazYK4QQlcpo[}y~ۆ:6yȨh-;zEss3#Uv*.M6VkJTf-h\w.K;[[V B%ⰹ3 *zh;hP큮ڒt -ԧPd90:1>:M??+~<}cCeH ٟP"@s-?ǠHo$a^Ġy!I ܢf2biYzb8HtX,ili'uPUQMpd簮>/,HO[CeQי 4i-:/oh.͠V&JÕ[R?2>e*Wa͵eYS1[UT>%+&538*QrzbuEiIIYe]S[gWwW{smy~ރa!>> +=Aӝ7mO ͣb#iڔ*hhhgP66+#;kXAfDaL걏FfBnnqe 6$ #[wb 0-ѫ^{鑺d8?[ -K+kjkʊ!Ӷ𞚑[T4(Zi,m!]M3G5ezaoJB1j|-,R=@7IJ+@FkA _O .NR`ca|8d~BHpA ֖榆:LOu9SzsVۑŭXJUm}cSKsKScAPHzzP2 vg7JJJ 3R 1SkoL-%$+j閖z(O/NE̓#]D -F%e赴02j<5fgx6KPXtN *H`:̠Ɔ:.8 hSB2sJŽE&JaVSbfstOnEzI~澤?RPdNhs'A' -MtJ\|$ [N _70qP`I3rԨ%,$c/򿄽>Oj-^ SakԽ>_zǝbҺRǖ;Y%9{^УOzy=56!ɞty4Q",W.,qM5LhNzPn=L%cgu Ye,%Fn&nvEnMGJ}|d }ŹY43qV!١p8N%Ӽ*t@OxE`2&.>fmIpØ(.l0ѱthf/#< ԞDpW>ʰ,i.!H9Iw`#&>L;m q$}H* -#mu>y5ps1 ':6>1[U -"X zi.mq4MJcpO/5\ħ5C^6gfۀ\ -߿=if,wbObhu$ә`'LhL&6!)iV"bg{RҖD+L!Å'bY|8QL42=_5X@ lI& 7w)&ӣ0ȴX U{"U`A%Lぶ)@?i:"rWB ts~0WD1D2mQ,l^~~Rd=,82]c6caV||D2oPp \Z`V,Wi E\JGWsO ft?OxF2E5(6&&:BL&,͊82(KUcj(or э-|1gtEgS'.gQR|%MSLrtE/trML!""RO{ִi"9S)1fʩZŕ (dQ)?R.A2rnX;龹ӿEL72%E,Q?] UWQVTBہP 7EqZOSDpJ Ϸ1~F͆o$| -?I^G!3eߚ]鿔φ(jN2bj+S\ }DJGɔ=*z.8.9R!5qPR:TcqϛU!?#үR%c5E-=)i@|1g"UΏHx߿E ,%-CWw8ީu!s_z_rJn ]bzMW?R/|"A*6OO%J@mќ38Bn$I˟^ӯG4" hTV ?N - ߱1 ~Γ4/)My/Gf -~BO Ll";1mw'h7x_p"SJq}_Cc?o~AD>~ԖnfI$B]q>[Ok - :$zojy@hwun`yHbբkq[ 3L7Db/<=P%!l%%9'InCKWc߿}f^G, N -`km~bN/[0EƯL8'QCzS,W[?W b0["r!H|B!mV,O҇zSCy5â0[Ve4@~ BVLJ󓣃m,bch#;0~e9{̓sʩihϏwחvހGHABnyq~ -*7W8벑F-yGƯMʩ929xDR;ã o,'puuyyOOOv6֖f&GJ|f_>V%$ ߿j?:>9%|C|<bwg{K,/L t͹y>=Z?sA a&[6ۺHp{uavjbbbjvnaiyuu}}sl80?;=5162XWYR'w@Ry&>{c}=]]=C#cS3ss Ylomj*/.iV]b-H/H( [ -?@@`s~o``phxhhhoU%EYVPoA04bt7Ry -I5dƭ0PYZXPXT\Z^QUSSW񧩩Lss2ۙl0,O w{D4S'a ɾʢ\_7=#3;'7!ҽ EEyy9YYnv8lB[B1<;2.2h:&p&?2zrGNx<ތ ϗwϗy4L1[j]C#ƮGl-"4@Ɨކdxd$%řb~`aw{i=:Phk;.nDuUǮ^N5`}'h 4mzB#&V7=ă~&ZR""lGTXxߐ>v#4<\n/f(nnynz|8@DK;Ntg#4f.gГͽC.:uX$8 w=HԣϏ?65)[zy*.Wo>AJHcs(֣WW qBDcܣ$n8o}L̍y!X"͖2MaUWXx&s\Iq{BdrDXQZ`hP;}IqHNM{.ZsSSi|g#IeKiq ՕFpxw~81^_^=))1Id+tR~)գGߝ>~ -sxr˛&/Hl =ZKon w -R<^⡙YyzLPiiIQ^fZqniFhT|7ory6}];ݭ 5eEH g+#V@8+'nh~_OU-@3s7wxosynbںzҮ v6Us5ϷT  )DB??^m,LOa]wfƭGbeߞah|U} 'hW 4<;:\]Zפw/,.mlln-NuTMO|-ԈzG؜rs/E``w{sc}}U[WV76wv6{`wmO IX=:kxfyԼ†9;;6}58;$&PxGߟH zƤyw̵y)|[ЋIno./u ]-gwww7'+2MޑO ?4R%5-zHt׆}8 ϟ??{<@{Ѯ|]3BwfT4t ϭl굹x#_~E߆,^_ V #]=-5C+z9@ra"gB/*;9^+$?TC CILFl׵ M.od} HB9\EeS] 3qq 4*kYЛO2+ac<;=>X]oo(&'G?1/19Eu͝}k{zӝS}q~~mow"M%zܒ CdSm]}CSsz۶Y0i)qpWkcui~G C#E!a1InoV^qyMCkG,Ps}}sc3p`oGKCMyq~e] }JWZB>sȐT_,}#1<$@܈%<YeMwڻzzD=E荈iwKȍP.sY9z7\Yeِ!(/mY>oq=O- -8bwz3|YٹFxwq;SzQ=2G*7jk+JzGg:(Nl՛"ts\|BRf!͖d -RGqV""*L !>, -|-Bt}i - -*u>w@dHND0;BY -endstream -endobj - -8 0 obj - 25939 -endobj - -9 0 obj - << /Type /XObject - /Subtype /Image - /BitsPerComponent 8 - /Length 10 0 R - /Height 148 - /SMask 7 0 R - /Width 538 - /ColorSpace /DeviceRGB - /Filter [ /FlateDecode ] - >> -stream -xK-IrfiCGHӸ=69Df [4uFWQQQ1}{8~G{v5wt!bč?O 7|=7[a1b.Vu]cA q,q, b4k K8&78V8'ψc=oVp+8?nɆznJ%bW\`uWþ}h߳Ho]3\PILmNjfk8=tM7Z(xutPWյ~.)xخl K֟.ǐc{֫v{?wM81젉ɂ4{cwA -8JA7sН|ͯZwJop [4^/nB7ixm:zA#bC#b~61Td O#}ͦ#[*"C|"`X* a֟S@NE" -K޹}q7E87m¹r{;xu@q~WE79` e#)YM1oG*h7)EڰZ?o~-yIopv=1J4c}Mڠo~n8WoV/X^ggİ7?3[s :>+ϊEMyu}jiX4KzHvЁ?u_q-FZ:/DX;F9}rfdy읿$Պ66MjfFX$k"]Ldͻsey;}S?k{qU™;aqX"ki}fu#(lm<(ckRo~z[yڲ]%7u`1½]dSlpE =^8+fxka+a]6z'?H @ t,H#vrfMtq)[l;䰶͟[qf6ћ -<4/şP{_ 7Ek vDNh~gZy_k|Jlk#9 ``wƓɂ np, >^ -me,\>(,=9m7M9^9YMlD69}h|/Efѝꖱ B!{Gf?/v8ןJ4w]4[tEE" F$O-`o Dq!p!9a\~2i–uΡp\ -oJ"!o~͍qGUښuxf_rςq>%2DdV6FA ,F<] qOO4,,HX%MX4AVRC?#:B6_pqڲ9l~"5nl_"?~H(-4Ʋk pn.4zs&8^F򲃕ၽ=y4j45zUuEƹ^04? 0:j; -@wGym%?k.k6aݙ|R;h>o yzbXXC|A!\8枋c؏d_I]/j,αEKBpdkq”ThA 0)A\ۉg~;+cpAnky6K'\ٟGY uaesq-$ȼccʀ8<bxmv=1,j#Ƶ8V1XS6hZji!qp4@ZId4}l: 9хc{ªP -V64?V soRm؏׎#Y )uxsk ;oXOƿ . .6ԎG[cB* THxRczv6xg׬U&`YN)Q 0]!ʀ$pf),k?x8Ry4MS0)eڞHaFƱ0+  ueCX;#XsӳPUP! Ű @ Q AX"kq}<NJwXHȪmlz8%X.=!9kX7r - MC* ~ -4=^<;Ǩ6ŒHC<2."`ȱ{ϔJZ&2j5~$X%,mȀ볣xZ7G}y%]3{nzqlFnM ;1H k jCc1ߩ౳Sb&]( ̒FB hvyzD]%L7EӁ_B$щlH!Ġ ",bD5wOVa`ZuH6Pǂ[{hs=e -:13( T!?í'ƟȂ@" ? offM  vx@,Ň]д#ŻibΞrtDDO`[sg7 p=u2]+]T kh">sDD[7oF/VWć ? lH;xvV3o~|PWkth;HE0[bnza^Uv<ǧ(Gn͝+Br v9y[u)*ؠ4`ߢ+h$XHdwLj GGPm;!;z -ۉASV*iv5{hqcclDՉ,ٝݓb3Cv젃j©ky'cIA+ p$ؠFňA3LuP1xyX60E [sk8kbLXːU`Ƃ9 CM&;L0Z#v#\mX|_ݭw<*(gɂ]c#p @ yVRD ⺮c{`C !&X$XX @ {sClw{ g6l @ Hgc44vYb/+Gk,٠h  @] Bp;hFMΛH5i1F 7h ,0]a4a7"-La.a]C_ fW &rf#4Q4XoZAS7Hg`wAN#BAD4vq#X7r +6vAȹ#\[ɩ&hT78C$Ћ xkAX5%CB]eѨAAsHgA a`1i$>`,Mѓ_ <;#-N 4oɪ Bs4G IX7r ndAQ!jB(R+L3_I}||XyGPbD72:.f9x}M|J0_R`(gt;yX@"a `"h$_d7 bЌ6"Jfi 4'p;w8֛t㜃'UpJ-F&%,I"ȦW;< RTYY&57ӱHsЕ<өT*!İ!hJŖANRᜀ3Cb! opB)d2Čf/@! MqHk-O{c[b`c7Y$؟m<'w)&@Ð2@$c5q]ױ 9TCI$ HEk t=." Ñ``@j@SZ(Ǭlgʳ FL}ЅڼeugQrcQ6ve/ykNۃf Hɡ+[cc2*!Y$tH2Yܾ}l2jJS@Fa^Xj -HHHCM$eE7JS{c<8^:Z,a%DSf]ff]Qʍu] -~&j}xz0PH\kg-҄HXȳbƿ  @DFEb b#fwC oD6zI&rA?u 8O_u0/ @Hk""7?yqC nR{R52>(+ˁ<`Ԅx ~0kV<2\A~bԦH0FY|z9f4|W.?Y]!RUy  <2B j7r* `Rʙ5K .,l6 M쩌 Fb HQ78uXX4V* C3L"KF9!S<17 Hv*wZ׬Z?,Y4! H{cd}ιҲr *c! A#t#bo"1v53t!xF<."h$X,vCv' @̌Jdk,'< фy%! 'L4p^(މ厳?Q$d+Fd]Ps06hͬ2Gf=5{tOGi GoޠA%\V}r2X2nly"m%JBηE;,IAI]"{"' ]Cuq^ ՄY EfM͢f@ SKbj?Xks`Rc^i, F;E6*.f^V [|cZrgD3 kd5-GP0y`A wxvxɓ ݂xK]H `w ' 0-z,h _hr@_ lseqYwK:!NєJBii,X]He`_UbPYH I!)zj;z_xU!,}M 3s]|Xv±~RYVrEc_xR)bH ž[`#s׃KYf,~=i]!R4Y_@VF(Uv1t1jAS{IDzhf-]ˆIk Pu*޼fFZyAO2] aƆC:ղI oH^D ,Z=;S^t4f';<1g 03 $04F ͂čE`;lE M ~Au?A !1/=aHCS{MޱpCI+FpА Bre[s X88ן b -6D/dt` v-Z^0+y¿cMBf[V/DZHqe44rF,0H5e!b V? S녧VFeKV[s\u?):$Y݂B,Q'z_0.ɁiTej% 9D!RQjⲙ5$rBb?Co;!vxMO?"4c1 5~-foՉ[tE46=bm& yX0y5qO-B^aOeVSC3)!!+355"%_#F˥ ˂0)*m"+$ -QO!t֜s4a,F7W sІE/l{w?C$`j򀐖xehl_NU?'$9 &&ؠop1Nb'1͛"FMEMf?C/&;v9* "VT9aHM ~H(X}a=v]ױ& c! 2CfNO e-U%,il -"i] Dz(ӨW0n cY3S{sUc=%%4/] RΧMbPf]& ",?Q^1!7/#3\YMjg^ -E_0Ih}Mg`Q-OiSyPN.j 8rB[Z-@` `A &p4c_ 7~F,gXæ6J8i9QQu\X -\_VuM4JXf,OHu6Jy_tُFQ` dٞk0dTt\B^Dt? -, -w?o$1)](=5mvBSw -tкBxΝs1x?GѫޛI9iSd!ukrIA56 N/ & "<$jげy],FȟXk`&pL;&vDЄMa;`riO 1 y0@9m$ Y ,ޤa^C t4Zk -:oo] a`CB~HB% c%lf1W0X$!LTr"z)(py@Zx%Y +S~\u0ks_HMWنK2 }PjmEК[1~1hAb"`E4zgyәUSJF^V!*4\Sͬc&cc`C) :x)4 9 ~)(ceyI(FI y`F ň콻IHOCM6ugWCͶvNh7k%$3'!2 @j0VU-a5aBb-?h*_ cCA;xS`䄴jP ٠+hX DNMwA l"eCXi ų<<̓V3klvbPm!-*+) C aP  [ځdarD`Cf†;kǻn"iuAQDz%).A^=i>d"XCcYIXA0#@ ` 1V厙b&dDc+9++;QYL6bHАͲ[pgkٶ꯫c` * BSĠ!$F'BX5f>D6pABkv-!ě +) /+~)Nȏ5u/B|%tPEE :hfoudF"7?b欙SHA4A؂ω G8 ^[F@;^0 -feEI<$T7y|JXׇʏ7$H8!XEHP*Fp BB0;ДE=`ԃI A]4'x@ɂIX -Z yfV`5`odŰ0 d&IB&N@QB)8a ؁4CX@"ne$!vxa"9kL([ּ b.aa`Qs5-0/O^ά}dSZhT=hy vx@@ňDБfA [$ϸ~-F$X[ >#GeS 1vG N q#-:G72ȁؠy5 -& c#"11y MVAp*$O5O z CdÈN1;yIeJ,[y];5V5) +gh o,fbbDߨ(d;hgщ,xK4{#gvn"]q#m;=u֜N)m$_P@  >leTCi:<6*4HH&n"  zۆ wT0bςxАf;,Doщ,xKcMHFx;;ǻyNW͞@@rHd`  n]&;uf{˝/|Yy 60[,v,|&v @P5|M*R z}g#<,ɲ%?XX 2wf^ˑO 00223\#jpK{d G9[I*M#L|`͡f -CM F>tne%;kCT?룿1``ӝ"鎈әTܚSZ>G>=,AÀ<8xnz5FXϿj,t3&$5x<*0ӀtL5hfם0`vP0`vDvSFf` 0xh܋kaG9F>4̡1?`U3TRq<2) ':]ܕM|Ԋ>_ַ4F``IAFa -nU|\8s - P1/k9ӝ0O0(.+>eZ7Wgr. A 0C4 0-COrk.IYad(7 -"O!M)ܔ. 6J81NƧ`DY0{dY΅2Sd<"5 A4x0Ȥ̧&0&2V>)nMؗnߵ>&j`NA#E& Y`:|Ajvr *҇u9S0L>vN8IJLxf -O=aq4Y>>ө>!B幵ΖTt(\ 2Xޓ4M0` `"a<9&4#1~7<<}q(gZQC)NCA$n``dF*ys钞c A=[=0Ԕ Bcib hd,> AO -6zR>fYy}ݵ:X%SK d(2ncƷ\u]obq}.$L1Úh)c x݂#AHŖEU625KtC$24x0Ѝ 5 5̥ԗL$1hRlH*7M!BwVɢaLY@n24?4N])O3u"OM0yP0<(2L~45k&0` -wAωGw|= k"&UNo &4M# 5S0xqUzA0P\9)A$r gov -Gw$'? -|:h(̧J -2~1Ww)Nd3lf -&4pGJ :|JSthg¤A vR 14!==?0`f1/%ʰc. -M0` D#0a4x @9Ͼ#IFkpˡYu-c4(|(wi<<ȏ<41fxD4wD0&acv -Ȍw:D1yw -tЄ;#*%W)wh`=Gw>&aF3tA dsOd<{>G2뵲"N -P %C?e1pVuzp}?2@s׏)7@nK<>L}+е\3쮉jc!B0GM&-,]k+aCM}uaC15)4RA"CC3  -]4JzQњ[[[;]F3 4e,G` Aƍ͠}xHx:'&ŘpN! 03ԍFGTaٓQx|p|ҲuJi2L4 <r-;YII[>A eخeR0Q0 qjfDEC}Ph - -ƅ!dΠ-2=H.n`Ew%lh^^(sEPi@tpHz:EXVK*A3t;K01 .1`&1H3h-ZSCtG^? ʀ Du5q+됧NJGιfa@#"2+ҟˡҦ;rS`YSA3v&d `|&4OGf:7-oX`PfzHze=.z1郂Tix\gϞ&5=3TgSOWϭʓH3ч,mR)7:t44\#F멖f5a=_Tz\`K)w mu׬P.0p!dJ%e,/`݌Cp[g Ky% j:4,؊1a2/8Æ&+6:Z_Zk<]`!Cș3h:D~hV֌!swj&+,=frQ&z;Bõ[mz64CH==ú4;څIJJj]"IG& ~7~Ќ<1Gb3U9&aM4AF;ơz钡<:Zq^`RŹF04 AЇ:gAbU?ͥij0ߠ>a\85K"4xC56ڧ[/}0P5xA7;cf20Ks!, 'pW= ccRuH,MH>fq-s b(^)F聩`~ɀ)JwL#"CѪ=nGω;(9VI-8=f A9P8SsZG=T=TSP As؛I)Fn+`d"aa:NsER2r4K*>;'-fFD0tt&`9 -f"C CI01ȧwb̎`5G̠1h+^{Ad4 &?$`~":7zBD|YS  :Ch@Mxl!"[MZND01g(ZI6)2⵨Szע tԅމAO_k チ7;d/@ %5*}TB |j|O;'I 0CtȰ7tjֶ?_z+߳z]kݾpB`>֟R}^34i#Z%P^(݀  44{-Y3 ht^wG`qJLp 5:N4ﵞ ׏_kL j?h)(kf - TBA:LjȘH1;P0`0f(~C`O18ӪJ|%߆y^]1N|M0?f}yrO߃?hj6g7Q=OJ"0)s40ߠ1C|&24C`%aIam˯{qmxW?3tHbe&[/|(`Q0x#SBL`O)> fScaJEb|YzSnB?QhE% 0`"OD>&xdFMd(9|LwD|} D0`aV{~ybr]p8~M(no=Uj#2tGvi2`A&ᇚ4wL$"C &D Lq1Sbx8wl%/[O% "4x0L| v1mfiZFJڣ[^?Q?n9BfM@ePI - "Ȥ蠉1 4ǼPiȧbaa%PJ赾jᏁ}&P'c_>h{|Q`|&Efסf̮;+xg o%W~ص}5k~8Uo7a@ -#T?_9 -f؛`؛<ƀy0x"CA -f+ಕ0ýp8Hx7~tT1TG4vGAGw1:< -L~8 jY6&Qo%Ԫ[ɽ8$T6%.dhpP?5 ERdR0`b||<dQ3]>#. }Ps4p8+kKPJFMi{̧CM - 2tCd؛@Ȥii zGo%6np8TBaT!JUWL -fI4a||ͤ:LtAO$/w^Iv?0J/*W}7WrS@cipi$)2cg),}oZp8Tt|S!<2t݄!H(  P04#OM=Ԥ-06[1Kga0$ٝIϵ_Pc&`j` f* "MdA31}`5l"~,Gzý/=]ً<S:DGưp{Www?Ԥ}G^@&ba?ϾԲx_,p8jO'B -~.f؛<0L1&LK7iu;x0`ٙȘh4cPĘPshZ?A4m"~d-j}߯ӉmRdAs;m%M+&U}}$2av -z>p(3<΅ 755}5ĂBMr-ziH_Pm|/2xE^WC<F> } )p/F]]CKOFPX]Vchp8﨟 -ؽ,n"d8f1lt0{Iʻx ;;iRpJ'¡x2<~ bAv8TU<#7y004a Bg*Ф2R}Vc,p8|*G~6h8( Mo@X3 ^" ^ˤ<V>x}p}k3Z| ?ߊJ|{MCWF"݄&As4>Pqڮkq"#DC\z%I t}p8 ^O}Ag*꿍 4)2 &}j0~A6~F꺮תx=a^A0"סku-^뺨ь  lnr8?%: 'q:ګᨍ 1ȏ`0>5ˆb3j;/(@aנpww?-:̞Җd5oY-U[*4PE /|i;Ϧ .eIW@2CP  -&x0L| G94GBЁA`j eҰ?@ rP|RUɰ ;{3S$~}'bqg:Xz8A%Z9(.aFGx6DC]ã 3m;}˰(6?"a?xbCn1-` ̧̡1GG)a؛|\~:q.\"p8BꗵAjɃ*@1)LOnnB&nr8j)7+/~ڞФPCA>؃ L#y?w/ïJ6m(~Tg0PSd(f1#퉚e7app8~=W^_~k{ކɚ3260`>C ]1 A|WAQ {CE_~_W)PWCD~̎J(DpOzעzu]k'KJc^RDC~b34x0w&€ 9@$$$̻_s1pbCske} -)JBͨ۱{}ŻDy`I#Ofb❋c.p8?ҷ^、}eOGu2 #<(NMd]$$Vҫu]MS^RS) -8(ã v>m: <"ST%,2:6p8~CB}]%*6n{ -sӊ⫭^I|ދFy8߀j}߯cZګ -SVƩ[x0x8i|0kGDoR>o^p8c, ' -;Txu">75B7 l"mg.AV<(y0p ÆBUiۊ=EݶVl+LxSP|^]``w  -42l"~1̦fIȵ~mkMO mrETa/m - -;"pA ;_3D^ȇp8^׏ۊ -ǿ.o41h"CuΥv:;Ț^;{)(bPCg E,^k(fav0p3Qq}{` -\,{CŒp8`z0qo{."e{Epf:1p z -endstream -endobj - -10 0 obj - 32389 -endobj - -11 0 obj - << /ExtGState << /E1 << /SMask << /Type /Mask - /G 1 0 R - /S /Alpha - >> - /Type /ExtGState - >> >> - /XObject << /X2 5 0 R - /X1 9 0 R - >> - >> -endobj - -12 0 obj - << /Length 13 0 R >> -stream -/DeviceRGB CS -/DeviceRGB cs -q -269.000000 0.000000 -0.000000 74.234528 0.000000 0.000000 cm -/X1 Do -Q -q -/E1 gs -/X2 Do -Q - -endstream -endobj - -13 0 obj - 118 -endobj - -14 0 obj - << /Annots [] - /Type /Page - /MediaBox [ 0.000000 0.000000 269.000000 75.000000 ] - /Resources 11 0 R - /Contents 12 0 R - /Parent 15 0 R - >> -endobj - -15 0 obj - << /Kids [ 14 0 R ] - /Count 1 - /Type /Pages - >> -endobj - -16 0 obj - << /Pages 15 0 R - /Type /Catalog - >> -endobj - -xref -0 17 -0000000000 65535 f -0000000010 00000 n -0000000493 00000 n -0000000515 00000 n -0000001038 00000 n -0000001060 00000 n -0000012016 00000 n -0000012039 00000 n -0000038194 00000 n -0000038218 00000 n -0000070841 00000 n -0000070866 00000 n -0000071206 00000 n -0000071382 00000 n -0000071405 00000 n -0000071583 00000 n -0000071659 00000 n -trailer -<< /ID [ (some) (id) ] - /Root 16 0 R - /Size 17 ->> -startxref -71720 -%%EOF \ No newline at end of file diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f65261a70a965b70211bee094c4deba5856207 GIT binary patch literal 3554 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 literal 0 HcmV?d00001 diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@2x.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3d6dd006f95301b22939fcc090419daa203b4d GIT binary patch literal 8451 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 literal 0 HcmV?d00001 diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@3x.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/mastodon.logo.imageset/wordmark-white-text.01e9f493 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb96361cba5a2c751408c0940fe0b3d7e317e67 GIT binary patch literal 14369 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 Date: Fri, 16 Dec 2022 21:30:21 +0100 Subject: [PATCH 29/94] Add basic classes for privacy-screen during onboarding (#690) --- Mastodon.xcodeproj/project.pbxproj | 16 +++++ Mastodon/Coordinator/SceneCoordinator.swift | 4 ++ .../Privacy/PrivacyTableViewCell.swift | 13 ++++ .../Privacy/PrivacyTableViewController.swift | 66 +++++++++++++++++++ .../MastodonServerRulesViewController.swift | 13 +--- .../OnboardingHeadlineTableViewCell.swift | 2 + 6 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift create mode 100644 Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index f9b05362f..1bf01ec39 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -110,6 +110,8 @@ 9E44C7202967AD17004B2A72 /* MastodonSDKDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; }; 9E44C7222967AD17004B2A72 /* MastodonSDKDynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 9E44C71F2967AD17004B2A72 /* MastodonSDKDynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; C24C97032922F30500BAE8CB /* RefreshControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24C97022922F30500BAE8CB /* RefreshControl.swift */; }; + D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099077294BC8A30050219F /* PrivacyTableViewController.swift */; }; + D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.swift */; }; D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8363B1529469CE200A74079 /* OnboardingNextView.swift */; }; D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; }; D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; }; @@ -659,6 +661,8 @@ C3789232A52F43529CA67E95 /* Pods-MastodonIntent.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonIntent.asdk - debug.xcconfig"; path = "Target Support Files/Pods-MastodonIntent/Pods-MastodonIntent.asdk - debug.xcconfig"; sourceTree = ""; }; CD92E0F10BDE4FE7C4B999F2 /* Pods_MastodonTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MastodonTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D7D7CF93E262178800077512 /* Pods-Mastodon-AppShared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-AppShared.debug.xcconfig"; path = "Target Support Files/Pods-Mastodon-AppShared/Pods-Mastodon-AppShared.debug.xcconfig"; sourceTree = ""; }; + D8099077294BC8A30050219F /* PrivacyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewController.swift; sourceTree = ""; }; + D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = ""; }; D8363B1529469CE200A74079 /* OnboardingNextView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingNextView.swift; sourceTree = ""; tabWidth = 4; }; D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = ""; }; D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = ""; }; @@ -1582,6 +1586,15 @@ path = Bookmark; sourceTree = ""; }; + D8099076294BC2BA0050219F /* Privacy */ = { + isa = PBXGroup; + children = ( + D8099077294BC8A30050219F /* PrivacyTableViewController.swift */, + D8099079294BC9390050219F /* PrivacyTableViewCell.swift */, + ); + path = Privacy; + sourceTree = ""; + }; D8A6AB68291C50F3003AB663 /* Login */ = { isa = PBXGroup; children = ( @@ -1620,6 +1633,7 @@ DB01409B25C40BB600F9F3CF /* Onboarding */ = { isa = PBXGroup; children = ( + D8099076294BC2BA0050219F /* Privacy */, D8A6AB68291C50F3003AB663 /* Login */, DB68A03825E900CC00CFDF14 /* Share */, 0FAA0FDD25E0B5700017CCDE /* Welcome */, @@ -3254,6 +3268,7 @@ DB1FD45A25F27898004CFCFC /* CategoryPickerItem.swift in Sources */, DB6180F626391D580018D199 /* MediaPreviewableViewController.swift in Sources */, 2D571B2F26004EC000540450 /* NavigationBarProgressView.swift in Sources */, + D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */, 0FAA101225E105390017CCDE /* PrimaryActionButton.swift in Sources */, DB443CD42694627B00159B29 /* AppearanceView.swift in Sources */, DBF1D24E269DAF5D00C1C08A /* SearchDetailViewController.swift in Sources */, @@ -3386,6 +3401,7 @@ 2A506CF6292D040100059C37 /* HashtagTimelineHeaderView.swift in Sources */, DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */, DB3E6FF52807C40300B035AE /* DiscoveryForYouViewController.swift in Sources */, + D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */, 2D38F1E525CD46C100561493 /* HomeTimelineViewModel.swift in Sources */, DB0FCB842796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift in Sources */, DB0FCB68279507EF006C02E2 /* DataSourceFacade+Meta.swift in Sources */, diff --git a/Mastodon/Coordinator/SceneCoordinator.swift b/Mastodon/Coordinator/SceneCoordinator.swift index 3dc73c020..224ac4869 100644 --- a/Mastodon/Coordinator/SceneCoordinator.swift +++ b/Mastodon/Coordinator/SceneCoordinator.swift @@ -145,6 +145,7 @@ extension SceneCoordinator { case welcome case mastodonPickServer(viewMode: MastodonPickServerViewModel) case mastodonRegister(viewModel: MastodonRegisterViewModel) + case mastodonPrivacyPolicies case mastodonServerRules(viewModel: MastodonServerRulesViewModel) case mastodonConfirmEmail(viewModel: MastodonConfirmEmailViewModel) case mastodonResendEmail(viewModel: MastodonResendEmailViewModel) @@ -413,6 +414,9 @@ private extension SceneCoordinator { loginViewController.delegate = self viewController = loginViewController + case .mastodonPrivacyPolicies: + let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self) + viewController = privacyViewController case .mastodonResendEmail(let viewModel): let _viewController = MastodonResendEmailViewController() _viewController.viewModel = viewModel diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift new file mode 100644 index 000000000..7acc8fd82 --- /dev/null +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift @@ -0,0 +1,13 @@ +// +// PrivacyTableViewCell.swift +// Mastodon +// +// Created by Nathan Mattes on 15.12.22. +// + +import UIKit + +class PrivacyTableViewCell: UITableViewCell { + static let reuseIdentifier = "PrivacyTableViewCell" + //TODO: @zeitschlag Implement +} diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift new file mode 100644 index 000000000..41ba30b7f --- /dev/null +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift @@ -0,0 +1,66 @@ +// +// PrivacyTableViewController.swift +// Mastodon +// +// Created by Nathan Mattes on 15.12.22. +// + +import UIKit +import MastodonCore +import MastodonSDK + +// https://joinmastodon.org/ios/privacy +// "\(server.domain)/privacy-policy" + +class PrivacyTableViewController: UIViewController, NeedsDependency { + + var context: AppContext! + var coordinator: SceneCoordinator! + + private let tableView: UITableView + + init(context: AppContext, coordinator: SceneCoordinator, server: Mastodon.Entity.Server) { + + self.context = context + self.coordinator = coordinator + + tableView = UITableView(frame: .zero, style: .insetGrouped) + tableView.translatesAutoresizingMaskIntoConstraints = false + + tableView.register(PrivacyTableViewCell.self, forCellReuseIdentifier: PrivacyTableViewCell.reuseIdentifier) + tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: OnboardingHeadlineTableViewCell.reuseIdentifier) + + super.init(nibName: nil, bundle: nil) + + view.addSubview(tableView) + setupConstraints() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) won't been implemented, please don't use Storyboards.") } + + private func setupConstraints() { + let constraints = [ + tableView.topAnchor.constraint(equalTo: view.topAnchor), + tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: tableView.trailingAnchor), + view.bottomAnchor.constraint(equalTo: tableView.bottomAnchor) + ] + NSLayoutConstraint.activate(constraints) + } + + //MARK: - Actions + @objc private func backButtonPressed(_ sender: UIButton) { + navigationController?.popViewController(animated: true) + } + + @objc private func nextButtonPressed(_ sender: UIButton) { +// let viewModel = MastodonRegisterViewModel( +// context: context, +// domain: viewModel.domain, +// authenticateInfo: viewModel.authenticateInfo, +// instance: viewModel.instance, +// applicationToken: viewModel.applicationToken +// ) +// _ = coordinator.present(scene: .mastodonRegister(viewModel: viewModel), from: self, transition: .show) + } +} diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index f1287227d..c0f603c25 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -68,22 +68,13 @@ extension MastodonServerRulesViewController { } extension MastodonServerRulesViewController { - @objc private func backButtonPressed(_ sender: UIButton) { navigationController?.popViewController(animated: true) } - + @objc private func nextButtonPressed(_ sender: UIButton) { - let viewModel = MastodonRegisterViewModel( - context: context, - domain: viewModel.domain, - authenticateInfo: viewModel.authenticateInfo, - instance: viewModel.instance, - applicationToken: viewModel.applicationToken - ) - _ = coordinator.present(scene: .mastodonRegister(viewModel: viewModel), from: self, transition: .show) + _ = coordinator.present(scene: .mastodonPrivacyPolicies, from: self, transition: .show) } - } // MARK: - OnboardingViewControllerAppearance diff --git a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift b/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift index ec9cd97e2..a1e2894dc 100644 --- a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift @@ -10,6 +10,8 @@ import MastodonAsset import MastodonLocalization final class OnboardingHeadlineTableViewCell: UITableViewCell { + + static let reuseIdentifier = "OnboardingHeadlineTableViewCell" let subTitleLabel: UILabel = { let label = UILabel() From c595929c542ed53b87436ec016afbf30e74270f8 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Fri, 16 Dec 2022 22:20:47 +0100 Subject: [PATCH 30/94] Remove comment --- .../Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index 7cfb605df..6a5d905c1 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -16,7 +16,6 @@ class WelcomeContentPageView: UIView { init(page: WelcomeContentPage) { - //TODO: @zeitschlag Decide based on page which titleView, first page has mastodon-logo in it titleView = UILabel() titleView.font = WelcomeViewController.largeTitleFont titleView.textColor = WelcomeViewController.largeTitleTextColor From 7d63eeccafb72be3690f4c5954bc24193be8504b Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 16 Dec 2022 23:35:09 +0100 Subject: [PATCH 31/94] Show privacy-policies, connect screens (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 + Mastodon/Coordinator/SceneCoordinator.swift | 6 +- .../Privacy/PrivacyTableViewController.swift | 82 ++++++++++++++++--- .../Onboarding/Privacy/PrivacyViewModel.swift | 33 ++++++++ .../MastodonServerRulesViewController.swift | 5 +- 5 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 Mastodon/Scene/Onboarding/Privacy/PrivacyViewModel.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 1bf01ec39..492f2f38d 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -112,6 +112,7 @@ C24C97032922F30500BAE8CB /* RefreshControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24C97022922F30500BAE8CB /* RefreshControl.swift */; }; D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099077294BC8A30050219F /* PrivacyTableViewController.swift */; }; D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.swift */; }; + D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D809907B294D25510050219F /* PrivacyViewModel.swift */; }; D8363B1629469CE200A74079 /* OnboardingNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8363B1529469CE200A74079 /* OnboardingNextView.swift */; }; D87BFC8B291D5C6B00FEE264 /* MastodonLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */; }; D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */; }; @@ -663,6 +664,7 @@ D7D7CF93E262178800077512 /* Pods-Mastodon-AppShared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-AppShared.debug.xcconfig"; path = "Target Support Files/Pods-Mastodon-AppShared/Pods-Mastodon-AppShared.debug.xcconfig"; sourceTree = ""; }; D8099077294BC8A30050219F /* PrivacyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewController.swift; sourceTree = ""; }; D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = ""; }; + D809907B294D25510050219F /* PrivacyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewModel.swift; sourceTree = ""; }; D8363B1529469CE200A74079 /* OnboardingNextView.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingNextView.swift; sourceTree = ""; tabWidth = 4; }; D87BFC8A291D5C6B00FEE264 /* MastodonLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginView.swift; sourceTree = ""; }; D87BFC8C291EB81200FEE264 /* MastodonLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewModel.swift; sourceTree = ""; }; @@ -1591,6 +1593,7 @@ children = ( D8099077294BC8A30050219F /* PrivacyTableViewController.swift */, D8099079294BC9390050219F /* PrivacyTableViewCell.swift */, + D809907B294D25510050219F /* PrivacyViewModel.swift */, ); path = Privacy; sourceTree = ""; @@ -3537,6 +3540,7 @@ DB1FD45025F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift in Sources */, DB4F097D26A03A5B00D62E92 /* SearchHistoryItem.swift in Sources */, DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */, + D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */, DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */, DB3E6FE22806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift in Sources */, DB427DD625BAA00100D1B89D /* AppDelegate.swift in Sources */, diff --git a/Mastodon/Coordinator/SceneCoordinator.swift b/Mastodon/Coordinator/SceneCoordinator.swift index 224ac4869..64ef05778 100644 --- a/Mastodon/Coordinator/SceneCoordinator.swift +++ b/Mastodon/Coordinator/SceneCoordinator.swift @@ -145,7 +145,7 @@ extension SceneCoordinator { case welcome case mastodonPickServer(viewMode: MastodonPickServerViewModel) case mastodonRegister(viewModel: MastodonRegisterViewModel) - case mastodonPrivacyPolicies + case mastodonPrivacyPolicies(viewModel: PrivacyViewModel) case mastodonServerRules(viewModel: MastodonServerRulesViewModel) case mastodonConfirmEmail(viewModel: MastodonConfirmEmailViewModel) case mastodonResendEmail(viewModel: MastodonResendEmailViewModel) @@ -414,8 +414,8 @@ private extension SceneCoordinator { loginViewController.delegate = self viewController = loginViewController - case .mastodonPrivacyPolicies: - let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self) + case .mastodonPrivacyPolicies(let viewModel): + let privacyViewController = PrivacyTableViewController(context: appContext, coordinator: self, viewModel: viewModel) viewController = privacyViewController case .mastodonResendEmail(let viewModel): let _viewController = MastodonResendEmailViewController() diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift index 41ba30b7f..d9542cd0b 100644 --- a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift @@ -8,9 +8,30 @@ import UIKit import MastodonCore import MastodonSDK +import SafariServices -// https://joinmastodon.org/ios/privacy -// "\(server.domain)/privacy-policy" +enum PrivacyRow { + case iOSApp + case server(domain: String) + + var url: URL? { + switch self { + case .iOSApp: + return URL(string: "https://joinmastodon.org/ios/privacy") + case .server(let domain): + return URL(string: "https://\(domain)/privacy-policy") + } + } + + var title: String { + switch self { + case .iOSApp: + return "Privacy Policy - Mastodon for iOS" + case .server(let domain): + return "Privacy Policy - \(domain)" + } + } +} class PrivacyTableViewController: UIViewController, NeedsDependency { @@ -18,22 +39,29 @@ class PrivacyTableViewController: UIViewController, NeedsDependency { var coordinator: SceneCoordinator! private let tableView: UITableView + let viewModel: PrivacyViewModel - init(context: AppContext, coordinator: SceneCoordinator, server: Mastodon.Entity.Server) { + init(context: AppContext, coordinator: SceneCoordinator, viewModel: PrivacyViewModel) { self.context = context self.coordinator = coordinator + self.viewModel = viewModel + tableView = UITableView(frame: .zero, style: .insetGrouped) tableView.translatesAutoresizingMaskIntoConstraints = false tableView.register(PrivacyTableViewCell.self, forCellReuseIdentifier: PrivacyTableViewCell.reuseIdentifier) - tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: OnboardingHeadlineTableViewCell.reuseIdentifier) super.init(nibName: nil, bundle: nil) + tableView.delegate = self + tableView.dataSource = self + view.addSubview(tableView) setupConstraints() + + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "I agree", style: .done, target: self, action: #selector(PrivacyTableViewController.nextButtonPressed(_:))) } required init?(coder: NSCoder) { fatalError("init(coder:) won't been implemented, please don't use Storyboards.") } @@ -54,13 +82,43 @@ class PrivacyTableViewController: UIViewController, NeedsDependency { } @objc private func nextButtonPressed(_ sender: UIButton) { -// let viewModel = MastodonRegisterViewModel( -// context: context, -// domain: viewModel.domain, -// authenticateInfo: viewModel.authenticateInfo, -// instance: viewModel.instance, -// applicationToken: viewModel.applicationToken -// ) -// _ = coordinator.present(scene: .mastodonRegister(viewModel: viewModel), from: self, transition: .show) + let viewModel = MastodonRegisterViewModel( + context: context, + domain: viewModel.domain, + authenticateInfo: viewModel.authenticateInfo, + instance: viewModel.instance, + applicationToken: viewModel.applicationToken + ) + _ = coordinator.present(scene: .mastodonRegister(viewModel: viewModel), from: self, transition: .show) + } +} + +extension PrivacyTableViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return viewModel.rows.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: PrivacyTableViewCell.reuseIdentifier, for: indexPath) as? PrivacyTableViewCell else { fatalError("Wrong cell?") } + + let row = viewModel.rows[indexPath.row] + + var contentConfiguration = cell.defaultContentConfiguration() + contentConfiguration.text = row.title + + cell.contentConfiguration = contentConfiguration + + return cell + } +} + +extension PrivacyTableViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + let row = viewModel.rows[indexPath.row] + guard let url = row.url else { return } + + _ = coordinator.present(scene: .safari(url: url), from: self, transition: .safariPresent(animated: true)) } } diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyViewModel.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyViewModel.swift new file mode 100644 index 000000000..80215cc6c --- /dev/null +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyViewModel.swift @@ -0,0 +1,33 @@ +// +// PrivacyViewModel.swift +// Mastodon +// +// Created by Nathan Mattes on 16.12.22. +// + +import Foundation +import MastodonSDK + +final class PrivacyViewModel { + + // input + let domain: String + let authenticateInfo: AuthenticationViewModel.AuthenticateInfo + let rows: [PrivacyRow] + let instance: Mastodon.Entity.Instance + let applicationToken: Mastodon.Entity.Token + + init( + domain: String, + authenticateInfo: AuthenticationViewModel.AuthenticateInfo, + rows: [PrivacyRow], + instance: Mastodon.Entity.Instance, + applicationToken: Mastodon.Entity.Token + ) { + self.domain = domain + self.authenticateInfo = authenticateInfo + self.rows = rows + self.instance = instance + self.applicationToken = applicationToken + } +} diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index c0f603c25..b4f19f804 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -73,7 +73,10 @@ extension MastodonServerRulesViewController { } @objc private func nextButtonPressed(_ sender: UIButton) { - _ = coordinator.present(scene: .mastodonPrivacyPolicies, from: self, transition: .show) + let domain = viewModel.domain + let viewModel = PrivacyViewModel(domain: domain, authenticateInfo: viewModel.authenticateInfo, rows: [.iOSApp, .server(domain: domain)], instance: viewModel.instance, applicationToken: viewModel.applicationToken) + + _ = coordinator.present(scene: .mastodonPrivacyPolicies(viewModel: viewModel), from: self, transition: .show) } } From 2e4ff59bc23815b950d843cde49ad9224115f220 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 17 Dec 2022 19:50:40 +0100 Subject: [PATCH 32/94] Add some localization here and there (#690) --- .../input/Base.lproj/app.json | 21 +++++++++++++++++-- Localization/app.json | 11 ++++++++++ .../PickServer/View/OnboardingNextView.swift | 2 +- .../Privacy/PrivacyTableViewController.swift | 11 ++++++---- .../MastodonServerRulesViewController.swift | 2 +- .../Generated/Strings.swift | 20 ++++++++++++++++++ .../Resources/Base.lproj/Localizable.strings | 8 ++++++- .../Resources/en.lproj/Localizable.strings | 8 ++++++- 8 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index 073108aad..9bce07352 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -241,7 +241,21 @@ "welcome": { "slogan": "Social networking\nback in your hands.", "get_started": "Get Started", - "log_in": "Log In" + "log_in": "Log In", + "education": { + "what_is_mastodon": { + "title": "What is", + "description": "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.", + }, + "mastodon_is_like_that": { + "title": "Mastodon is like that", + "description": "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.", + }, + "how_do_i_pick_a_server": { + "title": "How do I pick a server?", + "description": "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.", + }, + } }, "login": { "title": "Welcome back", @@ -251,7 +265,7 @@ } }, "server_picker": { - "title": "Pick server", + "title": "Pick Server", "button": { "category": { "all": "All", @@ -286,6 +300,9 @@ "no_results": "No results" } }, + "privacy": { + "title": "Privacy" + } "register": { "title": "Let’s get you set up on %s", "lets_get_you_set_up_on_domain": "Let’s get you set up on %s", diff --git a/Localization/app.json b/Localization/app.json index af7c05a90..6f260274f 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -300,6 +300,17 @@ "no_results": "No results" } }, + "privacy": { + "title": "Privacy", + "policy": { + "ios": "Privacy Policy - Mastodon for iOS"; + "server" = "Privacy Policy - %s"; + + }, + "button": { + "confirm": "I agree" + } + } "register": { "title": "Let’s get you set up on %s", "lets_get_you_set_up_on_domain": "Let’s get you set up on %s", diff --git a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift index e629c3466..ae124c088 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift @@ -40,7 +40,7 @@ final class OnboardingNextView: UIView { label.numberOfLines = 0 label.textColor = .secondaryLabel label.font = UIFontMetrics(forTextStyle: .footnote).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)) - label.text = "We’ll pick a server based on your language if you continue without making a selection." //TODO: @zeitschlag localize + label.text = L10n.Scene.ServerPicker.noServerSelectedHint return label }() diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift index d9542cd0b..903907b2d 100644 --- a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift @@ -8,7 +8,8 @@ import UIKit import MastodonCore import MastodonSDK -import SafariServices +import MastodonLocalization +import MastodonAsset enum PrivacyRow { case iOSApp @@ -26,9 +27,9 @@ enum PrivacyRow { var title: String { switch self { case .iOSApp: - return "Privacy Policy - Mastodon for iOS" + return L10n.Scene.Privacy.Policy.ios case .server(let domain): - return "Privacy Policy - \(domain)" + return L10n.Scene.Privacy.Policy.server(domain) } } } @@ -61,7 +62,9 @@ class PrivacyTableViewController: UIViewController, NeedsDependency { view.addSubview(tableView) setupConstraints() - navigationItem.rightBarButtonItem = UIBarButtonItem(title: "I agree", style: .done, target: self, action: #selector(PrivacyTableViewController.nextButtonPressed(_:))) + navigationItem.rightBarButtonItem = UIBarButtonItem(title: L10n.Scene.Privacy.Button.confirm, style: .done, target: self, action: #selector(PrivacyTableViewController.nextButtonPressed(_:))) + + title = L10n.Scene.Privacy.title } required init?(coder: NSCoder) { fatalError("init(coder:) won't been implemented, please don't use Storyboards.") } diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index b4f19f804..69e16fcc4 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -55,7 +55,7 @@ extension MastodonServerRulesViewController { viewModel.setupDiffableDataSource(tableView: tableView) - navigationItem.rightBarButtonItem = UIBarButtonItem(title: "I agree", style: .done, target: self, action: #selector(MastodonServerRulesViewController.nextButtonPressed(_:))) + navigationItem.rightBarButtonItem = UIBarButtonItem(title: L10n.Scene.ServerRules.Button.confirm, style: .done, target: self, action: #selector(MastodonServerRulesViewController.nextButtonPressed(_:))) title = L10n.Scene.ServerRules.title } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 6b71dbf16..31903b2c1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -791,6 +791,24 @@ public enum L10n { public static let showPrevious = L10n.tr("Localizable", "Scene.Preview.Keyboard.ShowPrevious", fallback: "Show Previous") } } + public enum Privacy { + /// Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy. + public static let description = L10n.tr("Localizable", "Scene.Privacy.Description", fallback: "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy.") + /// Privacy + public static let title = L10n.tr("Localizable", "Scene.Privacy.Title", fallback: "Privacy") + public enum Button { + /// I agree + public static let confirm = L10n.tr("Localizable", "Scene.Privacy.Button.confirm", fallback: "I agree") + } + public enum Policy { + /// Privacy Policy - Mastodon for iOS + public static let ios = L10n.tr("Localizable", "Scene.Privacy.Policy.Ios", fallback: "Privacy Policy - Mastodon for iOS") + /// Privacy Policy - %@ + public static func server(_ p1: Any) -> String { + return L10n.tr("Localizable", "Scene.Privacy.Policy.Server", String(describing: p1), fallback: "Privacy Policy - %@") + } + } + } public enum Profile { public enum Accessibility { /// Double tap to open the list @@ -1186,6 +1204,8 @@ public enum L10n { } } public enum ServerPicker { + /// We’ll pick a server based on your language if you continue without making a selection. + public static let noServerSelectedHint = L10n.tr("Localizable", "Scene.ServerPicker.NoServerSelectedHint", fallback: "We’ll pick a server based on your language if you continue without making a selection.") /// Pick server public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick server") public enum Button { diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 868dec89e..06ddb4776 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -436,6 +436,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; "Scene.ServerPicker.Title" = "Pick server"; +"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; @@ -497,4 +498,9 @@ You can still send and receive emails from anyone, even if their email ends in @ You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; +"Scene.Privacy.Title" = "Privacy"; +"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; +"Scene.Privacy.Button.confirm" = "I agree"; +"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; +"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 5a07ceaea..349117ec5 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -427,6 +427,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; "Scene.ServerPicker.Title" = "Pick server"; +"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; @@ -478,4 +479,9 @@ uploaded to Mastodon."; back in your hands."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; +"Scene.Privacy.Title" = "Privacy"; +"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; +"Scene.Privacy.Button.confirm" = "I agree"; +"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; +"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; From e6d6fd63fb8c7bfca9889316c03dbb964a3822e9 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 17 Dec 2022 20:14:27 +0100 Subject: [PATCH 33/94] Add explanatory text to privacy screen (#690) This also includes a refactor on the ServerRules-screen. It's built the same way --- Mastodon.xcodeproj/project.pbxproj | 4 -- .../Privacy/PrivacyTableViewController.swift | 30 +++++++++- .../Cell/ServerRulesTableViewCell.swift | 6 -- .../MastodonServerRulesViewController.swift | 37 ++++++------ ...astodonServerRulesViewModel+Diffable.swift | 3 +- .../ServerRules/ServerRuleItem.swift | 1 - .../ServerRules/ServerRuleSection.swift | 5 -- .../OnboardingHeadlineTableViewCell.swift | 57 ------------------- 8 files changed, 49 insertions(+), 94 deletions(-) delete mode 100644 Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 492f2f38d..ebcbe8783 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 0FAA101C25E10E760017CCDE /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA101B25E10E760017CCDE /* UIFont.swift */; }; 0FAA102725E1126A0017CCDE /* MastodonPickServerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA102625E1126A0017CCDE /* MastodonPickServerViewController.swift */; }; 0FB3D2F725E4C24D00AAD544 /* MastodonPickServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D2F625E4C24D00AAD544 /* MastodonPickServerViewModel.swift */; }; - 0FB3D2FE25E4CB6400AAD544 /* OnboardingHeadlineTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D2FD25E4CB6400AAD544 /* OnboardingHeadlineTableViewCell.swift */; }; 0FB3D30F25E525CD00AAD544 /* PickServerCategoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */; }; 0FB3D31E25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D31D25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift */; }; 0FB3D33825E6401400AAD544 /* PickServerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D33725E6401400AAD544 /* PickServerCell.swift */; }; @@ -546,7 +545,6 @@ 0FAA101B25E10E760017CCDE /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = ""; }; 0FAA102625E1126A0017CCDE /* MastodonPickServerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPickServerViewController.swift; sourceTree = ""; }; 0FB3D2F625E4C24D00AAD544 /* MastodonPickServerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPickServerViewModel.swift; sourceTree = ""; }; - 0FB3D2FD25E4CB6400AAD544 /* OnboardingHeadlineTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingHeadlineTableViewCell.swift; sourceTree = ""; }; 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCategoryView.swift; sourceTree = ""; }; 0FB3D31D25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCategoryCollectionViewCell.swift; sourceTree = ""; }; 0FB3D33725E6401400AAD544 /* PickServerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCell.swift; sourceTree = ""; }; @@ -2157,7 +2155,6 @@ DB029E94266A20430062874E /* MastodonAuthenticationController.swift */, 2D82B9FE25E7863200E36F0F /* OnboardingViewControllerAppearance.swift */, DB0617EC277F02C50030EE79 /* OnboardingNavigationController.swift */, - 0FB3D2FD25E4CB6400AAD544 /* OnboardingHeadlineTableViewCell.swift */, DB0617EE277F12720030EE79 /* NavigationActionView.swift */, ); path = Share; @@ -3413,7 +3410,6 @@ 6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */, 5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */, DB4F0968269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift in Sources */, - 0FB3D2FE25E4CB6400AAD544 /* OnboardingHeadlineTableViewCell.swift in Sources */, 5DA732CC2629CEF500A92342 /* UIView+Remove.swift in Sources */, 2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */, DB1D843026566512000346B3 /* KeyboardPreference.swift in Sources */, diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift index 903907b2d..6c10ed23d 100644 --- a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift @@ -71,7 +71,7 @@ class PrivacyTableViewController: UIViewController, NeedsDependency { private func setupConstraints() { let constraints = [ - tableView.topAnchor.constraint(equalTo: view.topAnchor), + tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), view.trailingAnchor.constraint(equalTo: tableView.trailingAnchor), view.bottomAnchor.constraint(equalTo: tableView.bottomAnchor) @@ -79,6 +79,12 @@ class PrivacyTableViewController: UIViewController, NeedsDependency { NSLayoutConstraint.activate(constraints) } + override func viewDidLoad() { + super.viewDidLoad() + + setupOnboardingAppearance() + } + //MARK: - Actions @objc private func backButtonPressed(_ sender: UIButton) { navigationController?.popViewController(animated: true) @@ -124,4 +130,26 @@ extension PrivacyTableViewController: UITableViewDelegate { _ = coordinator.present(scene: .safari(url: url), from: self, transition: .safariPresent(animated: true)) } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let wrapper = UIView() + + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.numberOfLines = 0 + label.text = L10n.Scene.Privacy.description + label.textColor = Asset.Colors.Label.primary.color + wrapper.addSubview(label) + + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: wrapper.topAnchor, constant: 16), + label.leadingAnchor.constraint(equalTo: wrapper.leadingAnchor), + wrapper.trailingAnchor.constraint(equalTo: label.trailingAnchor), + wrapper.bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 16), + ]) + + return wrapper + } } + +extension PrivacyTableViewController: OnboardingViewControllerAppearance { } diff --git a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift index 1c6705de6..94fbeec41 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift @@ -27,12 +27,6 @@ final class ServerRulesTableViewCell: UITableViewCell { return label }() - let separatorLine: UIView = { - let view = UIView() - view.backgroundColor = Asset.Theme.System.separator.color - return view - }() - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) _init() diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift index 69e16fcc4..5ad1b740c 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewController.swift @@ -29,10 +29,8 @@ final class MastodonServerRulesViewController: UIViewController, NeedsDependency let tableView: UITableView = { let tableView = UITableView(frame: .zero, style: .insetGrouped) - tableView.register(OnboardingHeadlineTableViewCell.self, forCellReuseIdentifier: String(describing: OnboardingHeadlineTableViewCell.self)) tableView.register(ServerRulesTableViewCell.self, forCellReuseIdentifier: String(describing: ServerRulesTableViewCell.self)) tableView.rowHeight = UITableView.automaticDimension - tableView.backgroundColor = .secondarySystemGroupedBackground tableView.keyboardDismissMode = .onDrag tableView.sectionHeaderTopPadding = 0 return tableView @@ -54,7 +52,6 @@ extension MastodonServerRulesViewController { tableView.delegate = self viewModel.setupDiffableDataSource(tableView: tableView) - navigationItem.rightBarButtonItem = UIBarButtonItem(title: L10n.Scene.ServerRules.Button.confirm, style: .done, target: self, action: #selector(MastodonServerRulesViewController.nextButtonPressed(_:))) title = L10n.Scene.ServerRules.title } @@ -86,20 +83,24 @@ extension MastodonServerRulesViewController: OnboardingViewControllerAppearance // MARK: - UITableViewDelegate extension MastodonServerRulesViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - return UIView() - } - - func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - guard let diffableDataSource = viewModel.diffableDataSource, - section < diffableDataSource.snapshot().numberOfSections - else { return .leastNonzeroMagnitude } - - let sectionItem = diffableDataSource.snapshot().sectionIdentifiers[section] - switch sectionItem { - case .header: - return .leastNonzeroMagnitude - case .rules: - return 16 - } + let wrapper = UIView() + + let label = UILabel() + label.translatesAutoresizingMaskIntoConstraints = false + label.font = MastodonPickServerViewController.subTitleFont + label.textColor = Asset.Colors.Label.primary.color + label.adjustsFontForContentSizeCategory = true + label.numberOfLines = 0 + label.text = L10n.Scene.ServerRules.subtitle(viewModel.domain) + wrapper.addSubview(label) + + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: wrapper.topAnchor, constant: 16), + label.leadingAnchor.constraint(equalTo: wrapper.leadingAnchor), + wrapper.trailingAnchor.constraint(equalTo: label.trailingAnchor), + wrapper.bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 16), + ]) + + return wrapper } } diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift index ecb868eb0..1f8d55c76 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift @@ -14,8 +14,7 @@ extension MastodonServerRulesViewModel { diffableDataSource = ServerRuleSection.tableViewDiffableDataSource(tableView: tableView) var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections([.header, .rules]) - snapshot.appendItems([.header(domain: domain)], toSection: .header) + snapshot.appendSections([.rules]) let ruleItems: [ServerRuleItem] = rules.enumerated().map { i, rule in let ruleContext = ServerRuleItem.RuleContext(index: i, rule: rule) return ServerRuleItem.rule(ruleContext) diff --git a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift index 37d8b6ee7..f82b1e5e4 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift @@ -9,7 +9,6 @@ import Foundation import MastodonSDK enum ServerRuleItem: Hashable { - case header(domain: String) case rule(RuleContext) } diff --git a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift index 3ec8bb2dc..4c589e041 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift @@ -10,7 +10,6 @@ import MastodonAsset import MastodonLocalization enum ServerRuleSection: Hashable { - case header case rules } @@ -20,10 +19,6 @@ extension ServerRuleSection { ) -> UITableViewDiffableDataSource { return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item in switch item { - case .header(let domain): - let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: OnboardingHeadlineTableViewCell.self), for: indexPath) as! OnboardingHeadlineTableViewCell - cell.subTitleLabel.text = L10n.Scene.ServerRules.subtitle(domain) - return cell case .rule(let ruleContext): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ServerRulesTableViewCell.self), for: indexPath) as! ServerRulesTableViewCell cell.indexImageView.image = UIImage(systemName: "\(ruleContext.index + 1).circle") ?? UIImage(systemName: "questionmark.circle") diff --git a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift b/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift deleted file mode 100644 index a1e2894dc..000000000 --- a/Mastodon/Scene/Onboarding/Share/OnboardingHeadlineTableViewCell.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// OnboardingHeadlineTableViewCell.swift -// Mastodon -// -// Created by BradGao on 2021/2/23. -// - -import UIKit -import MastodonAsset -import MastodonLocalization - -final class OnboardingHeadlineTableViewCell: UITableViewCell { - - static let reuseIdentifier = "OnboardingHeadlineTableViewCell" - - let subTitleLabel: UILabel = { - let label = UILabel() - label.font = MastodonPickServerViewController.subTitleFont - label.textColor = Asset.Colors.Label.primary.color - label.adjustsFontForContentSizeCategory = true - label.numberOfLines = 0 - return label - }() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - _init() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - _init() - } -} - -extension OnboardingHeadlineTableViewCell { - - private func _init() { - selectionStyle = .none - backgroundColor = Asset.Scene.Onboarding.background.color - - let container = UIStackView() - container.axis = .vertical - container.spacing = 16 - container.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(container) - NSLayoutConstraint.activate([ - container.topAnchor.constraint(equalTo: contentView.topAnchor), - container.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), - container.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: container.bottomAnchor), - ]) - - container.addArrangedSubview(subTitleLabel) - } - -} From fe53fc409ee93d4937a6b351f6eae6afcc9a8711 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 01:31:51 +0100 Subject: [PATCH 34/94] Show large titles in onboarding (#690) --- Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index a26090a2d..2af9fb629 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -72,7 +72,6 @@ extension WelcomeViewController { preferredContentSize = CGSize(width: 547, height: 678) navigationController?.navigationBar.prefersLargeTitles = true - navigationItem.largeTitleDisplayMode = .never view.overrideUserInterfaceStyle = .light setupOnboardingAppearance() From 669716208e65ded1d012b33cfe633a0ea6c82d9c Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 01:52:48 +0100 Subject: [PATCH 35/94] Set new title for account-creation (#690) --- Localization/app.json | 3 +-- .../Register/MastodonRegisterViewController.swift | 2 +- .../MastodonLocalization/Generated/Strings.swift | 10 ++-------- .../Resources/Base.lproj/Localizable.strings | 3 +-- .../Resources/en.lproj/Localizable.strings | 3 +-- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 6f260274f..0699234ed 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -312,8 +312,7 @@ } } "register": { - "title": "Let’s get you set up on %s", - "lets_get_you_set_up_on_domain": "Let’s get you set up on %s", + "title": "Create account", "input": { "avatar": { "delete": "Delete" diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index b066827d7..aaa843f26 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -140,7 +140,7 @@ extension MastodonRegisterViewController { // } // .store(in: &disposeBag) - title = L10n.Scene.Register.title(viewModel.domain) + title = L10n.Scene.Register.title } override func viewDidAppear(_ animated: Bool) { diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 31903b2c1..c678010d6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -924,14 +924,8 @@ public enum L10n { public static let title = L10n.tr("Localizable", "Scene.RebloggedBy.Title", fallback: "Reblogged By") } public enum Register { - /// Let’s get you set up on %@ - public static func letsGetYouSetUpOnDomain(_ p1: Any) -> String { - return L10n.tr("Localizable", "Scene.Register.LetsGetYouSetUpOnDomain", String(describing: p1), fallback: "Let’s get you set up on %@") - } - /// Let’s get you set up on %@ - public static func title(_ p1: Any) -> String { - return L10n.tr("Localizable", "Scene.Register.Title", String(describing: p1), fallback: "Let’s get you set up on %@") - } + /// Create account + public static let title = L10n.tr("Localizable", "Scene.Register.Title", fallback: "Create account") public enum Error { public enum Item { /// Agreement diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 06ddb4776..4950f8901 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -350,8 +350,7 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; -"Scene.Register.LetsGetYouSetUpOnDomain" = "Let’s get you set up on %@"; -"Scene.Register.Title" = "Let’s get you set up on %@"; +"Scene.Register.Title" = "Create account"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; "Scene.Report.ReportSentTitle" = "Thanks for reporting, we’ll look into this."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 349117ec5..86b015bee 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -341,8 +341,7 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; -"Scene.Register.LetsGetYouSetUpOnDomain" = "Let’s get you set up on %@"; -"Scene.Register.Title" = "Let’s get you set up on %@"; +"Scene.Register.Title" = "Create account"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; "Scene.Report.ReportSentTitle" = "Thanks for reporting, we’ll look into this."; From 62fe8d58816cd16e361ca620a89facc780296cc7 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 02:08:58 +0100 Subject: [PATCH 36/94] Fix some colors (#690) --- .../PickServer/CategoryPickerSection.swift | 4 ++-- .../PickServer/View/OnboardingNextView.swift | 2 +- .../MastodonServerRulesViewModel.swift | 23 ------------------- .../ServerRules/ServerRuleSection.swift | 2 +- .../OnboardingViewControllerAppearance.swift | 1 + .../Brand/Blurple.colorset/Contents.json | 20 ++++++++++++++++ .../Colors/Brand/Contents.json | 9 ++++++++ .../Light Blurple.colorset/Contents.json | 20 ++++++++++++++++ .../MastodonAsset/Generated/Assets.swift | 4 ++++ 9 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Contents.json create mode 100644 MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Light Blurple.colorset/Contents.json diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index a6077c747..6ed299543 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -30,8 +30,8 @@ extension CategoryPickerSection { if cell.isSelected { textColor = .white - backgroundColor = Asset.Colors.Primary._700.color - borderColor = Asset.Colors.Primary._700.color + backgroundColor = Asset.Colors.Brand.blurple.color + borderColor = Asset.Colors.Brand.blurple.color } else { textColor = .label backgroundColor = .clear diff --git a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift index ae124c088..836c30554 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift @@ -30,7 +30,7 @@ final class OnboardingNextView: UIView { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false button.layer.cornerRadius = 14 - button.backgroundColor = Asset.Colors.brand.color + button.backgroundColor = Asset.Colors.Brand.blurple.color button.setTitle(L10n.Common.Controls.Actions.next, for: .normal) return button }() diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift index 945c92522..a4550e669 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel.swift @@ -36,27 +36,4 @@ final class MastodonServerRulesViewModel { self.instance = instance self.applicationToken = applicationToken } - - var rulesAttributedString: NSAttributedString { - let attributedString = NSMutableAttributedString(string: "\n") - let configuration = UIImage.SymbolConfiguration(font: .preferredFont(forTextStyle: .title3)) - let separatorString = Array(repeating: " ", count: 4).joined() - for (i, rule) in rules.enumerated() { - guard i < 50 else { - return NSAttributedString(string: "\(i)" + separatorString + rule.text.trimmingCharacters(in: .whitespacesAndNewlines) + "\n\n") - } - let imageName = String(i + 1) + ".circle" - let image = UIImage(systemName: imageName, withConfiguration: configuration)! - let attachment = NSTextAttachment() - attachment.image = image.withTintColor(Asset.Colors.brand.color) - let imageAttribute = NSMutableAttributedString(attachment: attachment) - imageAttribute.addAttributes([NSAttributedString.Key.baselineOffset : -1.5], range: NSRange(location: 0, length: imageAttribute.length)) - - let ruleString = NSAttributedString(string: separatorString + rule.text.trimmingCharacters(in: .whitespacesAndNewlines) + "\n\n") - attributedString.append(imageAttribute) - attributedString.append(ruleString) - } - return attributedString - } - } diff --git a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift index 4c589e041..ca4cd9c13 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift @@ -22,7 +22,7 @@ extension ServerRuleSection { case .rule(let ruleContext): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ServerRulesTableViewCell.self), for: indexPath) as! ServerRulesTableViewCell cell.indexImageView.image = UIImage(systemName: "\(ruleContext.index + 1).circle") ?? UIImage(systemName: "questionmark.circle") - cell.indexImageView.tintColor = Asset.Colors.brand.color + cell.indexImageView.tintColor = Asset.Colors.Brand.lightBlurple.color cell.ruleLabel.text = ruleContext.rule.text return cell } diff --git a/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift b/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift index 89d77435d..0ccad9b60 100644 --- a/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift +++ b/Mastodon/Scene/Onboarding/Share/OnboardingViewControllerAppearance.swift @@ -60,6 +60,7 @@ extension OnboardingViewControllerAppearance { func setupNavigationBarAppearance() { // use TransparentBackground so view push / dismiss will be more visual nature // please add opaque background for status bar manually if needs + navigationController?.navigationBar.tintColor = Asset.Colors.Brand.blurple.color let barAppearance = UINavigationBarAppearance() barAppearance.configureWithTransparentBackground() diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json new file mode 100644 index 000000000..a7c6e8e3e --- /dev/null +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFB", + "green" : "0x2C", + "red" : "0x55" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Contents.json new file mode 100644 index 000000000..6e965652d --- /dev/null +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Light Blurple.colorset/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Light Blurple.colorset/Contents.json new file mode 100644 index 000000000..7dbe6e97d --- /dev/null +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Light Blurple.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0x8A", + "red" : "0x85" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MastodonSDK/Sources/MastodonAsset/Generated/Assets.swift b/MastodonSDK/Sources/MastodonAsset/Generated/Assets.swift index 27914629d..f482d0be3 100644 --- a/MastodonSDK/Sources/MastodonAsset/Generated/Assets.swift +++ b/MastodonSDK/Sources/MastodonAsset/Generated/Assets.swift @@ -45,6 +45,10 @@ public enum Asset { public static let searchCard = ColorAsset(name: "Colors/Border/searchCard") public static let status = ColorAsset(name: "Colors/Border/status") } + public enum Brand { + public static let blurple = ColorAsset(name: "Colors/Brand/Blurple") + public static let lightBlurple = ColorAsset(name: "Colors/Brand/Light Blurple") + } public enum Button { public static let actionToolbar = ColorAsset(name: "Colors/Button/action.toolbar") public static let disabled = ColorAsset(name: "Colors/Button/disabled") From bb4706d8267e1cc28379572693f7a396da5a5f75 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 12:20:49 +0100 Subject: [PATCH 37/94] Re-enable loading-indicator for server-picker (#690) --- .../MastodonPickServerViewController.swift | 6 +++- .../PickServer/View/OnboardingNextView.swift | 33 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 83aa2e872..2283a3346 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -174,7 +174,11 @@ extension MastodonPickServerViewController { .receive(on: DispatchQueue.main) .sink { [weak self] isAuthenticating in guard let self = self else { return } -// isAuthenticating ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() + if isAuthenticating { + self.onboardingNextView.showLoading() + } else { + self.onboardingNextView.stopLoading() + } } .store(in: &disposeBag) diff --git a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift index 836c30554..57afdeea0 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift @@ -13,7 +13,6 @@ import MastodonLocalization final class OnboardingNextView: UIView { static let buttonHeight: CGFloat = 50 - static let minimumBackButtonWidth: CGFloat = 100 private var observations = Set() @@ -44,6 +43,14 @@ final class OnboardingNextView: UIView { return label }() + lazy var activityIndicator: UIActivityIndicatorView = { + let indicator = UIActivityIndicatorView(style: .medium) + indicator.color = .white + indicator.translatesAutoresizingMaskIntoConstraints = false + return indicator + }() + private var isLoading: Bool = false + override init(frame: CGRect) { super.init(frame: frame) _init() @@ -75,5 +82,29 @@ final class OnboardingNextView: UIView { nextButton.heightAnchor.constraint(greaterThanOrEqualToConstant: NavigationActionView.buttonHeight) ]) } + + func showLoading() { + guard isLoading == false else { return } + nextButton.isEnabled = false + isLoading = true + nextButton.setTitle("", for: .disabled) + + nextButton.addSubview(activityIndicator) + NSLayoutConstraint.activate([ + activityIndicator.centerXAnchor.constraint(equalTo: nextButton.centerXAnchor), + activityIndicator.centerYAnchor.constraint(equalTo: nextButton.centerYAnchor), + ]) + activityIndicator.startAnimating() + } + + func stopLoading() { + guard isLoading else { return } + isLoading = false + if activityIndicator.superview == nextButton { + activityIndicator.removeFromSuperview() + } + nextButton.isEnabled = true + nextButton.setTitle(L10n.Common.Controls.Actions.next, for: .disabled) + } } From 18e313fbe4297cac672e741056a5148e8179c90b Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 14:53:28 +0100 Subject: [PATCH 38/94] Set color for privacy-cells (#690) Also: Make light blurple the dark-mode-version of blurple --- .../Privacy/PrivacyTableViewController.swift | 1 + .../Brand/Blurple.colorset/Contents.json | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift index 6c10ed23d..e0b6612e6 100644 --- a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController.swift @@ -113,6 +113,7 @@ extension PrivacyTableViewController: UITableViewDataSource { let row = viewModel.rows[indexPath.row] var contentConfiguration = cell.defaultContentConfiguration() + contentConfiguration.textProperties.color = Asset.Colors.Brand.blurple.color contentConfiguration.text = row.title cell.contentConfiguration = contentConfiguration diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json index a7c6e8e3e..b5fa84db1 100644 --- a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/Brand/Blurple.colorset/Contents.json @@ -11,6 +11,24 @@ } }, "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0x8A", + "red" : "0x85" + } + }, + "idiom" : "universal" } ], "info" : { From de0b5776c3ff1cf726b4df399aca542d0ed601d7 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 17:42:11 +0100 Subject: [PATCH 39/94] Remove avatar-selection (#690) --- Mastodon.xcodeproj/project.pbxproj | 4 - .../Register/MastodonRegisterView.swift | 50 +-------- ...astodonRegisterViewController+Avatar.swift | 105 ------------------ .../MastodonRegisterViewController.swift | 51 +-------- .../Register/MastodonRegisterViewModel.swift | 51 --------- 5 files changed, 2 insertions(+), 259 deletions(-) delete mode 100644 Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController+Avatar.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index ebcbe8783..8a6f8d6f8 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -68,7 +68,6 @@ 2D8434FB25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8434FA25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift */; }; 2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D84350425FF858100EECE90 /* UIScrollView.swift */; }; 2D939AB525EDD8A90076FA61 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AB425EDD8A90076FA61 /* String.swift */; }; - 2D939AE825EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AE725EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift */; }; 2DAC9E38262FC2320062E1A6 /* SuggestionAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DAC9E37262FC2320062E1A6 /* SuggestionAccountViewController.swift */; }; 2DAC9E3E262FC2400062E1A6 /* SuggestionAccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DAC9E3D262FC2400062E1A6 /* SuggestionAccountViewModel.swift */; }; 2DAC9E46262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DAC9E45262FC9FD0062E1A6 /* SuggestionAccountTableViewCell.swift */; }; @@ -596,7 +595,6 @@ 2D8434FA25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTimelineNavigationBarTitleView.swift; sourceTree = ""; }; 2D84350425FF858100EECE90 /* UIScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIScrollView.swift; sourceTree = ""; }; 2D939AB425EDD8A90076FA61 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; - 2D939AE725EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewController+Avatar.swift"; sourceTree = ""; }; 2DA7D05025CA545E00804E11 /* LoadMoreConfigurableTableViewContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadMoreConfigurableTableViewContainer.swift; sourceTree = ""; }; 2DAC9E37262FC2320062E1A6 /* SuggestionAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestionAccountViewController.swift; sourceTree = ""; }; 2DAC9E3D262FC2400062E1A6 /* SuggestionAccountViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestionAccountViewModel.swift; sourceTree = ""; }; @@ -2663,7 +2661,6 @@ isa = PBXGroup; children = ( DBE0821425CD382600FD6BBD /* MastodonRegisterViewController.swift */, - 2D939AE725EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift */, DBE0822325CD3F1E00FD6BBD /* MastodonRegisterViewModel.swift */, DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */, DB7A9F902818EAF10016AF98 /* MastodonRegisterView.swift */, @@ -3450,7 +3447,6 @@ DB0617EF277F12720030EE79 /* NavigationActionView.swift in Sources */, D87BFC8D291EB81200FEE264 /* MastodonLoginViewModel.swift in Sources */, DB1FD43625F26899004CFCFC /* MastodonPickServerViewModel+LoadIndexedServerState.swift in Sources */, - 2D939AE825EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift in Sources */, DB1D186C25EF5BA7003F1F23 /* PollTableView.swift in Sources */, DBA94434265CBB5300C537E1 /* ProfileFieldSection.swift in Sources */, DBCA0EBC282BB38A0029E2B0 /* PageboyNavigateable.swift in Sources */, diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index 632194d6b..fc2fea5f1 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -20,55 +20,7 @@ struct MastodonRegisterView: View { var body: some View { ScrollView(.vertical) { let margin: CGFloat = 16 - - // Avatar selector - Menu { - // Photo Library - Button { - viewModel.avatarMediaMenuActionPublisher.send(.photoLibrary) - } label: { - Label(L10n.Scene.Compose.MediaSelection.photoLibrary, systemImage: "photo") - } - // Camera - if UIImagePickerController.isSourceTypeAvailable(.camera) { - Button { - viewModel.avatarMediaMenuActionPublisher.send(.camera) - } label: { - Label(L10n.Scene.Compose.MediaSelection.camera, systemImage: "camera") - } - } - // Browse - Button { - viewModel.avatarMediaMenuActionPublisher.send(.browse) - } label: { - Label(L10n.Scene.Compose.MediaSelection.browse, systemImage: "folder") - } - // Delete - if viewModel.avatarImage != nil { - Divider() - Button(role: .destructive) { - viewModel.avatarMediaMenuActionPublisher.send(.delete) - } label: { - Label(L10n.Scene.Register.Input.Avatar.delete, systemImage: "delete.left") - } - } - } label: { - let avatarImage = viewModel.avatarImage ?? Asset.Scene.Onboarding.avatarPlaceholder.image - Image(uiImage: avatarImage) - .resizable() - .frame(width: 88, height: 88, alignment: .center) - .overlay(ZStack { - Color.black.opacity(0.5) - .frame(height: 22, alignment: .bottom) - Text(L10n.Common.Controls.Actions.edit) - .font(.system(size: 13, weight: .semibold)) - .foregroundColor(.white) - }, alignment: .bottom) - .cornerRadius(22) - } - .padding(EdgeInsets(top: 20, leading: 0, bottom: 20, trailing: 0)) - - // Display Name & Uesrname + // Display Name & Username VStack(alignment: .leading, spacing: 11) { TextField(L10n.Scene.Register.Input.DisplayName.placeholder.localizedCapitalized, text: $viewModel.name) .textContentType(.name) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController+Avatar.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController+Avatar.swift deleted file mode 100644 index 81924d812..000000000 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController+Avatar.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// MastodonRegisterViewController+Avatar.swift -// Mastodon -// -// Created by sxiaojian on 2021/3/2. -// - -import CropViewController -import Foundation -import OSLog -import PhotosUI -import UIKit -import MastodonAsset -import MastodonLocalization - -extension MastodonRegisterViewController { - private func cropImage(image: UIImage, pickerViewController: UIViewController) { - DispatchQueue.main.async { - let cropController = CropViewController(croppingStyle: .default, image: image) - cropController.delegate = self - cropController.setAspectRatioPreset(.presetSquare, animated: true) - cropController.aspectRatioPickerButtonHidden = true - cropController.aspectRatioLockEnabled = true - - // fix iPad compatibility issue - // ref: https://github.com/TimOliver/TOCropViewController/issues/365#issuecomment-550239604 - cropController.modalTransitionStyle = .crossDissolve - cropController.transitioningDelegate = nil - - pickerViewController.dismiss(animated: true, completion: { - self.present(cropController, animated: true, completion: nil) - }) - } - } -} - -// MARK: - PHPickerViewControllerDelegate -extension MastodonRegisterViewController: PHPickerViewControllerDelegate { - func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { - guard let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) else { - picker.dismiss(animated: true, completion: {}) - return - } - itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in - guard let self = self else { return } - guard let image = image as? UIImage else { - DispatchQueue.main.async { - guard let error = error else { return } - let alertController = UIAlertController(for: error, title: "", preferredStyle: .alert) - let okAction = UIAlertAction(title: L10n.Common.Controls.Actions.ok, style: .default, handler: nil) - alertController.addAction(okAction) - _ = self.coordinator.present( - scene: .alertController(alertController: alertController), - from: nil, - transition: .alertController(animated: true, completion: nil) - ) - } - return - } - self.cropImage(image: image, pickerViewController: picker) - } - } -} - -// MARK: - UIImagePickerControllerDelegate -extension MastodonRegisterViewController: UIImagePickerControllerDelegate & UINavigationControllerDelegate { - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { - picker.dismiss(animated: true, completion: nil) - - guard let image = info[.originalImage] as? UIImage else { return } - - cropImage(image: image, pickerViewController: picker) - } - - func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - os_log("%{public}s[%{public}ld], %{public}s", (#file as NSString).lastPathComponent, #line, #function) - picker.dismiss(animated: true, completion: nil) - } -} - -// MARK: - UIDocumentPickerDelegate -extension MastodonRegisterViewController: UIDocumentPickerDelegate { - func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { - guard let url = urls.first else { return } - - do { - guard url.startAccessingSecurityScopedResource() else { return } - defer { url.stopAccessingSecurityScopedResource() } - let imageData = try Data(contentsOf: url) - guard let image = UIImage(data: imageData) else { return } - cropImage(image: image, pickerViewController: controller) - } catch { - os_log("%{public}s[%{public}ld], %{public}s: %s", (#file as NSString).lastPathComponent, #line, #function, error.localizedDescription) - } - } -} - -// MARK: - CropViewControllerDelegate -extension MastodonRegisterViewController: CropViewControllerDelegate { - public func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) { - self.viewModel.avatarImage = image - cropViewController.dismiss(animated: true, completion: nil) - } -} - diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index aaa843f26..8745a2d57 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -31,29 +31,6 @@ final class MastodonRegisterViewController: UIViewController, NeedsDependency, O var viewModel: MastodonRegisterViewModel! private(set) lazy var mastodonRegisterView = MastodonRegisterView(viewModel: viewModel) - - // picker - private(set) lazy var imagePicker: PHPickerViewController = { - var configuration = PHPickerConfiguration() - configuration.filter = .images - configuration.selectionLimit = 1 - - let imagePicker = PHPickerViewController(configuration: configuration) - imagePicker.delegate = self - return imagePicker - }() - private(set) lazy var imagePickerController: UIImagePickerController = { - let imagePickerController = UIImagePickerController() - imagePickerController.sourceType = .camera - imagePickerController.delegate = self - return imagePickerController - }() - - private(set) lazy var documentPickerController: UIDocumentPickerViewController = { - let documentPickerController = UIDocumentPickerViewController(forOpeningContentTypes: [.image]) - documentPickerController.delegate = self - return documentPickerController - }() } extension MastodonRegisterViewController { @@ -115,23 +92,6 @@ extension MastodonRegisterViewController { } .store(in: &disposeBag) - viewModel.avatarMediaMenuActionPublisher - .receive(on: DispatchQueue.main) - .sink { [weak self] action in - guard let self = self else { return } - switch action { - case .photoLibrary: - self.present(self.imagePicker, animated: true, completion: nil) - case .camera: - self.present(self.imagePickerController, animated: true, completion: nil) - case .browse: - self.present(self.documentPickerController, animated: true, completion: nil) - case .delete: - self.viewModel.avatarImage = nil - } - } - .store(in: &disposeBag) - // viewModel.$isRegistering // .receive(on: DispatchQueue.main) // .sink { [weak self] isRegistering in @@ -154,8 +114,6 @@ extension MastodonRegisterViewController { extension MastodonRegisterViewController { @objc private func nextButtonPressed(_ sender: UIButton) { - logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") - guard viewModel.isAllValid else { return } guard !viewModel.isRegistering else { return } @@ -268,16 +226,9 @@ extension MastodonRegisterViewController { let userToken = response.value let updateCredentialQuery: Mastodon.API.Account.UpdateCredentialQuery = { let displayName: String? = self.viewModel.name.isEmpty ? nil : self.viewModel.name - let avatar: Mastodon.Query.MediaAttachment? = { - guard let avatarImage = self.viewModel.avatarImage else { return nil } - guard avatarImage.size.width <= MastodonRegisterViewController.avatarImageMaxSizeInPixel.width else { - return .png(avatarImage.af.imageScaled(to: MastodonRegisterViewController.avatarImageMaxSizeInPixel).pngData()) - } - return .png(avatarImage.pngData()) - }() return Mastodon.API.Account.UpdateCredentialQuery( displayName: displayName, - avatar: avatar + avatar: nil ) }() let viewModel = MastodonConfirmEmailViewModel(context: self.context, email: email, authenticateInfo: self.viewModel.authenticateInfo, userToken: userToken, updateCredentialQuery: updateCredentialQuery) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift index a23d4b975..97006abdf 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift @@ -25,7 +25,6 @@ final class MastodonRegisterViewModel: ObservableObject { let viewDidAppear = CurrentValueSubject(Void()) @Published var backgroundColor: UIColor = Asset.Scene.Onboarding.background.color - @Published var avatarImage: UIImage? = nil @Published var name = "" @Published var username = "" @Published var email = "" @@ -54,7 +53,6 @@ final class MastodonRegisterViewModel: ObservableObject { @Published var isAllValid = false @Published var error: Error? = nil - let avatarMediaMenuActionPublisher = PassthroughSubject() let endEditing = PassthroughSubject() init( @@ -281,52 +279,3 @@ extension MastodonRegisterViewModel { return attributeString } } - -extension MastodonRegisterViewModel { - - enum AvatarMediaMenuAction { - case photoLibrary - case camera - case browse - case delete - } - - private func createAvatarMediaContextMenu() -> UIMenu { - var children: [UIMenuElement] = [] - - // Photo Library - let photoLibraryAction = UIAction(title: L10n.Scene.Compose.MediaSelection.photoLibrary, image: UIImage(systemName: "rectangle.on.rectangle"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak self] _ in - guard let self = self else { return } - self.avatarMediaMenuActionPublisher.send(.photoLibrary) - } - children.append(photoLibraryAction) - - // Camera - if UIImagePickerController.isSourceTypeAvailable(.camera) { - let cameraAction = UIAction(title: L10n.Scene.Compose.MediaSelection.camera, image: UIImage(systemName: "camera"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off, handler: { [weak self] _ in - guard let self = self else { return } - self.avatarMediaMenuActionPublisher.send(.camera) - }) - children.append(cameraAction) - } - - // Browse - let browseAction = UIAction(title: L10n.Scene.Compose.MediaSelection.browse, image: UIImage(systemName: "ellipsis"), identifier: nil, discoverabilityTitle: nil, attributes: [], state: .off) { [weak self] _ in - guard let self = self else { return } - self.avatarMediaMenuActionPublisher.send(.browse) - } - children.append(browseAction) - - // Delete - if avatarImage != nil { - let deleteAction = UIAction(title: L10n.Scene.Register.Input.Avatar.delete, image: UIImage(systemName: "delete.left"), identifier: nil, discoverabilityTitle: nil, attributes: [.destructive], state: .off) { [weak self] _ in - guard let self = self else { return } - self.avatarMediaMenuActionPublisher.send(.delete) - } - children.append(deleteAction) - } - - return UIMenu(title: "", image: nil, identifier: nil, options: .displayInline, children: children) - } - -} From e074ee63b7c1292ca00e38efe532708c6f3e8acb Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 18 Dec 2022 20:30:33 +0100 Subject: [PATCH 40/94] Adjust registration-screen to match updated design (#690) Please note: this doesn't contain any logic, yet. It's solely UI. --- .../input/Base.lproj/app.json | 14 ++++- Localization/app.json | 1 + .../Register/MastodonRegisterView.swift | 56 ++++++------------- .../Register/MastodonRegisterViewModel.swift | 1 + .../Generated/Strings.swift | 6 +- .../Resources/Base.lproj/Localizable.strings | 3 +- .../Resources/en.lproj/Localizable.strings | 1 + 7 files changed, 36 insertions(+), 46 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index 9bce07352..718cb6e81 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -301,11 +301,18 @@ } }, "privacy": { - "title": "Privacy" + "title": "Privacy", + "policy": { + "ios": "Privacy Policy - Mastodon for iOS"; + "server" = "Privacy Policy - %s"; + + }, + "button": { + "confirm": "I agree" + } } "register": { - "title": "Let’s get you set up on %s", - "lets_get_you_set_up_on_domain": "Let’s get you set up on %s", + "title": "Create account", "input": { "avatar": { "delete": "Delete" @@ -322,6 +329,7 @@ }, "password": { "placeholder": "password", + "confirmation_placeholder": "Confirm Password", "require": "Your password needs at least:", "character_limit": "8 characters", "accessibility": { diff --git a/Localization/app.json b/Localization/app.json index 0699234ed..718cb6e81 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -329,6 +329,7 @@ }, "password": { "placeholder": "password", + "confirmation_placeholder": "Confirm Password", "require": "Your password needs at least:", "character_limit": "8 characters", "accessibility": { diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index fc2fea5f1..d8810c3b9 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -20,13 +20,13 @@ struct MastodonRegisterView: View { var body: some View { ScrollView(.vertical) { let margin: CGFloat = 16 - // Display Name & Username VStack(alignment: .leading, spacing: 11) { TextField(L10n.Scene.Register.Input.DisplayName.placeholder.localizedCapitalized, text: $viewModel.name) .textContentType(.name) .disableAutocorrection(true) .modifier(FormTextFieldModifier(validateState: viewModel.displayNameValidateState)) HStack { + Text("@") TextField(L10n.Scene.Register.Input.Username.placeholder.localizedCapitalized, text: $viewModel.username) .textContentType(.username) .autocapitalization(.none) @@ -44,12 +44,6 @@ struct MastodonRegisterView: View { Text(errorPrompt) .modifier(FormFootnoteModifier()) } - } - .padding(.horizontal, margin) - .padding(.bottom, 22) - - // Email & Password & Password hint - VStack(alignment: .leading, spacing: 11) { TextField(L10n.Scene.Register.Input.Email.placeholder.localizedCapitalized, text: $viewModel.email) .textContentType(.emailAddress) .autocapitalization(.none) @@ -60,9 +54,19 @@ struct MastodonRegisterView: View { Text(errorPrompt) .modifier(FormFootnoteModifier()) } + + } + .padding(.horizontal, margin) + .padding(.bottom, 32) + + // Email & Password & Password hint + VStack(alignment: .leading, spacing: margin) { SecureField(L10n.Scene.Register.Input.Password.placeholder.localizedCapitalized, text: $viewModel.password) .textContentType(.newPassword) .modifier(FormTextFieldModifier(validateState: viewModel.passwordValidateState)) + SecureField(L10n.Scene.Register.Input.Password.confirmationPlaceholder.localizedCapitalized, text: $viewModel.passwordConfirmation) + .textContentType(.newPassword) + .modifier(FormTextFieldModifier(validateState: viewModel.passwordValidateState)) Text(L10n.Scene.Register.Input.Password.hint) .modifier(FormFootnoteModifier(foregroundColor: .secondary)) if let errorPrompt = viewModel.passwordErrorPrompt { @@ -112,7 +116,6 @@ struct MastodonRegisterView: View { Color(Asset.Scene.Onboarding.textFieldBackground.color) .cornerRadius(10) - .shadow(color: .black.opacity(0.125), radius: 1, x: 0, y: 2) content .padding() @@ -157,7 +160,7 @@ extension View { #if DEBUG struct MastodonRegisterView_Previews: PreviewProvider { - static var viewMdoel: MastodonRegisterViewModel { + static var viewModel: MastodonRegisterViewModel { let domain = "mstdn.jp" return MastodonRegisterViewModel( context: .shared, @@ -183,55 +186,28 @@ struct MastodonRegisterView_Previews: PreviewProvider { ) ) } - - static var viewMdoel2: MastodonRegisterViewModel { - let domain = "mstdn.jp" - return MastodonRegisterViewModel( - context: .shared, - domain: domain, - authenticateInfo: AuthenticationViewModel.AuthenticateInfo( - domain: domain, - application: Mastodon.Entity.Application( - name: "Preview", - website: nil, - vapidKey: nil, - redirectURI: nil, - clientID: "", - clientSecret: "" - ), - redirectURI: "" - )!, - instance: Mastodon.Entity.Instance(domain: "mstdn.jp", approvalRequired: true), - applicationToken: Mastodon.Entity.Token( - accessToken: "", - tokenType: "", - scope: "", - createdAt: Date() - ) - ) - } static var previews: some View { Group { NavigationView { - MastodonRegisterView(viewModel: viewMdoel) + MastodonRegisterView(viewModel: viewModel) .navigationBarTitle(Text("")) .navigationBarTitleDisplayMode(.inline) } NavigationView { - MastodonRegisterView(viewModel: viewMdoel) + MastodonRegisterView(viewModel: viewModel) .navigationBarTitle(Text("")) .navigationBarTitleDisplayMode(.inline) } .preferredColorScheme(.dark) NavigationView { - MastodonRegisterView(viewModel: viewMdoel) + MastodonRegisterView(viewModel: viewModel) .navigationBarTitle(Text("")) .navigationBarTitleDisplayMode(.inline) } .environment(\.sizeCategory, .accessibilityExtraLarge) NavigationView { - MastodonRegisterView(viewModel: viewMdoel2) + MastodonRegisterView(viewModel: viewModel) .navigationBarTitle(Text("")) .navigationBarTitleDisplayMode(.inline) } diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift index 97006abdf..5d3f5eb0d 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift @@ -29,6 +29,7 @@ final class MastodonRegisterViewModel: ObservableObject { @Published var username = "" @Published var email = "" @Published var password = "" + @Published var passwordConfirmation = "" @Published var reason = "" @Published var usernameErrorPrompt: String? = nil diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index c678010d6..7fcd8e502 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1014,10 +1014,12 @@ public enum L10n { public enum Password { /// 8 characters public static let characterLimit = L10n.tr("Localizable", "Scene.Register.Input.Password.CharacterLimit", fallback: "8 characters") + /// Confirm password + public static let confirmationPlaceholder = L10n.tr("Localizable", "Scene.Register.Input.Password.ConfirmationPlaceholder", fallback: "Confirm password") /// Your password needs at least eight characters public static let hint = L10n.tr("Localizable", "Scene.Register.Input.Password.Hint", fallback: "Your password needs at least eight characters") - /// password - public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "password") + /// Password + public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "Password") /// Your password needs at least: public static let require = L10n.tr("Localizable", "Scene.Register.Input.Password.Require", fallback: "Your password needs at least:") public enum Accessibility { diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 4950f8901..50c657ec1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -346,7 +346,8 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Accessibility.Unchecked" = "unchecked"; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; -"Scene.Register.Input.Password.Placeholder" = "password"; +"Scene.Register.Input.Password.Placeholder" = "Password"; +"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 86b015bee..4cfb15bc0 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -338,6 +338,7 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; "Scene.Register.Input.Password.Placeholder" = "password"; +"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; From ec9bc0c69a1ccfb93b78804cb9be2e6fd9e7df8d Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Mon, 19 Dec 2022 11:29:18 +0100 Subject: [PATCH 41/94] Show spinner when registering (#690) --- .../MastodonRegisterViewController.swift | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index 8745a2d57..62a318d56 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -31,6 +31,16 @@ final class MastodonRegisterViewController: UIViewController, NeedsDependency, O var viewModel: MastodonRegisterViewModel! private(set) lazy var mastodonRegisterView = MastodonRegisterView(viewModel: viewModel) + + var activityIndicator: UIActivityIndicatorView = { + let activityIndicator = UIActivityIndicatorView(style: .medium) + activityIndicator.color = Asset.Colors.Brand.blurple.color + return activityIndicator + }() + + func nextBarButtonItem() -> UIBarButtonItem { + return UIBarButtonItem(title: "Next", style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) + } } extension MastodonRegisterViewController { @@ -51,7 +61,7 @@ extension MastodonRegisterViewController { view.addSubview(hostingViewController.view) hostingViewController.view.pinToParent() - navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) + navigationItem.rightBarButtonItem = nextBarButtonItem() viewModel.$isAllValid .receive(on: DispatchQueue.main) @@ -92,13 +102,25 @@ extension MastodonRegisterViewController { } .store(in: &disposeBag) -// viewModel.$isRegistering -// .receive(on: DispatchQueue.main) -// .sink { [weak self] isRegistering in -// guard let self = self else { return } -// isRegistering ? self.navigationActionView.nextButton.showLoading() : self.navigationActionView.nextButton.stopLoading() -// } -// .store(in: &disposeBag) + viewModel.$isRegistering + .receive(on: DispatchQueue.main) + .sink { [weak self] isRegistering in + guard let self = self else { return } + + let rightBarButtonItem: UIBarButtonItem + if isRegistering { + self.activityIndicator.startAnimating() + + rightBarButtonItem = UIBarButtonItem(customView: self.activityIndicator) + rightBarButtonItem.isEnabled = false + } else { + self.activityIndicator.stopAnimating() + + rightBarButtonItem = self.nextBarButtonItem() + } + self.navigationItem.rightBarButtonItem = rightBarButtonItem + } + .store(in: &disposeBag) title = L10n.Scene.Register.title } @@ -109,10 +131,7 @@ extension MastodonRegisterViewController { viewModel.viewDidAppear.send() } -} - -extension MastodonRegisterViewController { - + //MARK: - Actions @objc private func nextButtonPressed(_ sender: UIButton) { guard viewModel.isAllValid else { return } From baa520e03d7b3906d2428abfe904a1af4a41e2ae Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Mon, 19 Dec 2022 11:47:15 +0100 Subject: [PATCH 42/94] Fix localization (#690) --- .../Onboarding/Register/MastodonRegisterViewController.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index 62a318d56..2f23f3307 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -39,7 +39,7 @@ final class MastodonRegisterViewController: UIViewController, NeedsDependency, O }() func nextBarButtonItem() -> UIBarButtonItem { - return UIBarButtonItem(title: "Next", style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) + return UIBarButtonItem(title: L10n.Common.Controls.Actions.Next, style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) } } @@ -91,7 +91,7 @@ extension MastodonRegisterViewController { .sink { [weak self] error in guard let self = self else { return } guard let error = error as? Mastodon.API.Error else { return } - let alertController = UIAlertController(for: error, title: "Sign Up Failure", preferredStyle: .alert) + let alertController = UIAlertController(for: error, title: L10n.Common.Alerts.SignUpFailure.title, preferredStyle: .alert) let okAction = UIAlertAction(title: L10n.Common.Controls.Actions.ok, style: .default, handler: nil) alertController.addAction(okAction) _ = self.coordinator.present( @@ -255,5 +255,4 @@ extension MastodonRegisterViewController { } .store(in: &disposeBag) } - } From f3c8c3c2a3ba443c9dfc2a91fec076a5cbf2cd16 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Mon, 19 Dec 2022 12:26:31 +0100 Subject: [PATCH 43/94] Fix typo/build (#690) --- .../Onboarding/Register/MastodonRegisterViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift index 2f23f3307..7cae6b645 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewController.swift @@ -39,7 +39,7 @@ final class MastodonRegisterViewController: UIViewController, NeedsDependency, O }() func nextBarButtonItem() -> UIBarButtonItem { - return UIBarButtonItem(title: L10n.Common.Controls.Actions.Next, style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) + return UIBarButtonItem(title: L10n.Common.Controls.Actions.next, style: .done, target: self, action: #selector(MastodonRegisterViewController.nextButtonPressed(_:))) } } From a107b4d9e2f7d0db3db833638e483f269c4226ed Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Mon, 19 Dec 2022 13:05:51 +0100 Subject: [PATCH 44/94] Consider password-confirmation on signup (#690) This is now the logic-part. The passwords must be the same to register. --- .../Register/MastodonRegisterViewModel.swift | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift index 5d3f5eb0d..a165716c2 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterViewModel.swift @@ -150,10 +150,15 @@ final class MastodonRegisterViewModel: ObservableObject { .assign(to: \.emailValidateState, on: self) .store(in: &disposeBag) - $password - .map { password in + Publishers.CombineLatest($password, $passwordConfirmation) + .map { password, confirmation in guard !password.isEmpty else { return .empty } - return password.count >= 8 ? .valid : .invalid + + if password.count >= 8 && password == confirmation { + return .valid + } else { + return .invalid + } } .assign(to: \.passwordValidateState, on: self) .store(in: &disposeBag) From 5e4820739fa63c4e3ad4eda4931b7f47f53a94e8 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 18:00:43 +0100 Subject: [PATCH 45/94] Download languages (#690) --- .../Service/API/APIService+Onboarding.swift | 5 +++- .../API/Mastodon+API+Onboarding.swift | 29 ++++++++++++++++++- .../Entity/Mastodon+Entity+Language.swift | 29 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 MastodonSDK/Sources/MastodonSDK/Entity/Mastodon+Entity+Language.swift diff --git a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift index 84104d838..1a103b610 100644 --- a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift @@ -28,5 +28,8 @@ extension APIService { return Mastodon.Entity.Category(category: kind.rawValue, serversCount: 0) } } - + + public func languages() -> AnyPublisher, Error> { + return Mastodon.API.Onboarding.languages(session: session) + } } diff --git a/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift b/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift index ab99deed6..a41a58039 100644 --- a/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift +++ b/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift @@ -12,6 +12,7 @@ extension Mastodon.API.Onboarding { static let serversEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("servers") static let categoriesEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("categories") + static let languagesEndpointURL = Mastodon.API.joinMastodonEndpointURL.appendingPathComponent("languages") /// Fetch server list /// @@ -68,7 +69,33 @@ extension Mastodon.API.Onboarding { } .eraseToAnyPublisher() } - + + /// Fetch server languages + /// + /// Using this endpoint to fetch booked languages + /// + /// # Last Update + /// 2022/12/19 + /// # Reference + /// undocumented + /// - Parameters: + /// - session: `URLSession` + /// - Returns: `AnyPublisher` contains `Language` nested in the response + public static func languages( + session: URLSession + ) -> AnyPublisher, Error> { + let request = Mastodon.API.get( + url: languagesEndpointURL, + query: nil, + authorization: nil + ) + return session.dataTaskPublisher(for: request) + .tryMap { data, response in + let value = try Mastodon.API.decode(type: [Mastodon.Entity.Language].self, from: data, response: response) + return Mastodon.Response.Content(value: value, response: response) + } + .eraseToAnyPublisher() + } } extension Mastodon.API.Onboarding { diff --git a/MastodonSDK/Sources/MastodonSDK/Entity/Mastodon+Entity+Language.swift b/MastodonSDK/Sources/MastodonSDK/Entity/Mastodon+Entity+Language.swift new file mode 100644 index 000000000..989bea084 --- /dev/null +++ b/MastodonSDK/Sources/MastodonSDK/Entity/Mastodon+Entity+Language.swift @@ -0,0 +1,29 @@ +// +// File.swift +// +// +// Created by Nathan Mattes on 19.12.22. +// + +import Foundation + +extension Mastodon.Entity { + + public struct Language: Codable { + public let locale: String + public let serversCount: Int + public let language: String? + + enum CodingKeys: String, CodingKey { + case locale + case serversCount = "servers_count" + case language + } + + public init(locale: String, serversCount: Int, language: String?) { + self.locale = locale + self.serversCount = serversCount + self.language = language + } + } +} From 6b0547d3d482b8fb79b544faf0bce0f86f97d481 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 18:41:04 +0100 Subject: [PATCH 46/94] Add chevron (#690) spoiler: for selecting a language and registration-status --- .../PickServer/View/PickServerCategoryView.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift index 097b77822..88c76c5f7 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift @@ -21,7 +21,11 @@ class PickServerCategoryView: UIView { return label }() - //TODO: @zeitschlag add chevron + let chevron: UIImageView = { + let chevron = UIImageView(image: UIImage(systemName: "chevron.down")) + chevron.translatesAutoresizingMaskIntoConstraints = false + return chevron + }() init() { super.init(frame: .zero) @@ -34,11 +38,14 @@ class PickServerCategoryView: UIView { } private func _init() { + let container = UIStackView() container.axis = .horizontal container.spacing = 4 container.distribution = .fillProportionally - + container.addArrangedSubview(titleLabel) + container.addArrangedSubview(chevron) + container.translatesAutoresizingMaskIntoConstraints = false addSubview(container) let constraints = [ @@ -50,7 +57,6 @@ class PickServerCategoryView: UIView { NSLayoutConstraint.activate(constraints) - container.addArrangedSubview(titleLabel) layer.borderColor = UIColor.black.cgColor layer.borderWidth = 1.0 From 7c8c5fe21416cad8a4dffe45e9a5aec50d8a8fac Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 18:42:57 +0100 Subject: [PATCH 47/94] Add language-selector (#690) For now, it searches for German servers only because. --- Localization/app.json | 1 + .../PickServer/CategoryPickerItem.swift | 22 +++++++++++++++++++ .../PickServer/CategoryPickerSection.swift | 5 +++++ .../MastodonPickServerViewController.swift | 1 + .../MastodonPickServerViewModel.swift | 19 +++++++++++----- .../Generated/Strings.swift | 2 ++ .../Resources/Base.lproj/Localizable.strings | 1 + .../Resources/en.lproj/Localizable.strings | 1 + 8 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 718cb6e81..afd2a4f34 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -267,6 +267,7 @@ "server_picker": { "title": "Pick Server", "button": { + "language": "Language", "category": { "all": "All", "all_accessiblity_description": "Category: All", diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift index a860e2e15..45e33d6ff 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift @@ -13,6 +13,7 @@ import MastodonLocalization /// Note: update Equatable when change case enum CategoryPickerItem { case all + case language(language: String?) case category(category: Mastodon.Entity.Category) } @@ -22,6 +23,12 @@ extension CategoryPickerItem { switch self { case .all: return L10n.Scene.ServerPicker.Button.Category.all + case .language(let language): + if let language { + return language + } else { + return L10n.Scene.ServerPicker.Button.language + } case .category(let category): switch category.category { case .academia: @@ -58,6 +65,13 @@ extension CategoryPickerItem { switch self { case .all: return L10n.Scene.ServerPicker.Button.Category.allAccessiblityDescription + case .language(let language): + if let language { + return language + } else { + return L10n.Scene.ServerPicker.Button.language + } + case .category(let category): switch category.category { case .academia: @@ -98,6 +112,8 @@ extension CategoryPickerItem: Equatable { return true case (.category(let categoryLeft), .category(let categoryRight)): return categoryLeft.category.rawValue == categoryRight.category.rawValue + case (.language(let languageLeft), .language(let languageRight)): + return languageLeft == languageRight default: return false } @@ -109,6 +125,12 @@ extension CategoryPickerItem: Hashable { switch self { case .all: hasher.combine(String(describing: CategoryPickerItem.all.self)) + case .language(let language): + if let language { + return hasher.combine(language) + } else { + return hasher.combine("no_language_selected") + } case .category(let category): hasher.combine(category.category.rawValue) } diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 6ed299543..8f7480a84 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -22,6 +22,10 @@ extension CategoryPickerSection { guard let _ = dependency else { return nil } let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: PickServerCategoryCollectionViewCell.self), for: indexPath) as! PickServerCategoryCollectionViewCell cell.categoryView.titleLabel.text = item.title + + let isLanguage = (item == .language(language: nil)) + cell.categoryView.chevron.isHidden = (isLanguage == false) + cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in let textColor: UIColor @@ -41,6 +45,7 @@ extension CategoryPickerSection { cell.categoryView.backgroundColor = backgroundColor cell.categoryView.titleLabel.textColor = textColor cell.categoryView.layer.borderColor = borderColor.cgColor + cell.categoryView.chevron.tintColor = textColor } .store(in: &cell.observations) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 2283a3346..ca3aa9d06 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -391,6 +391,7 @@ extension MastodonPickServerViewController: PickServerServerSectionTableHeaderVi func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let diffableDataSource = headerView.diffableDataSource else { return } let item = diffableDataSource.itemIdentifier(for: indexPath) + //TODO: @zeitschlag Consider language etc. also: show menu viewModel.selectCategoryItem.value = item ?? .all } } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index ebbcfe7fd..544bf804f 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -33,6 +33,7 @@ class MastodonPickServerViewModel: NSObject { var categoryPickerItems: [CategoryPickerItem] = { var items: [CategoryPickerItem] = [] items.append(.all) + items.append(.language(language: nil)) items.append(contentsOf: APIService.stubCategories().map { CategoryPickerItem.category(category: $0) }) return items }() @@ -156,6 +157,9 @@ extension MastodonPickServerViewModel { switch selectCategoryItem { case .all: return MastodonPickServerViewModel.filterServers(servers: indexedServers, category: nil, searchText: searchText) + case .language(let language): + //TODO: @zeitschlag Cache selected language + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: "de", category: nil, searchText: searchText) case .category(let category): return MastodonPickServerViewModel.filterServers(servers: indexedServers, category: category.category.rawValue, searchText: searchText) } @@ -210,16 +214,16 @@ extension MastodonPickServerViewModel { } } - + extension MastodonPickServerViewModel { - private static func filterServers(servers: [Mastodon.Entity.Server], category: String?, searchText: String) -> [Mastodon.Entity.Server] { - return servers - // 1. Filter the category + private static func filterServers(servers: [Mastodon.Entity.Server], language: String? = nil, category: String?, searchText: String) -> [Mastodon.Entity.Server] { + let filteredServers = servers + // 1. Filter the category .filter { guard let category = category else { return true } return $0.category.caseInsensitiveCompare(category) == .orderedSame } - // 2. Filter the searchText + // 2. Filter the searchText .filter { let searchText = searchText.trimmingCharacters(in: .whitespacesAndNewlines) guard !searchText.isEmpty else { @@ -227,6 +231,11 @@ extension MastodonPickServerViewModel { } return $0.domain.lowercased().contains(searchText.lowercased()) } + .filter { + guard let language else { return true } + return $0.language.lowercased() == language.lowercased() + } + return filteredServers } } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 7fcd8e502..5a089fbec 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1205,6 +1205,8 @@ public enum L10n { /// Pick server public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick server") public enum Button { + /// Language + public static let language = L10n.tr("Localizable", "Scene.ServerPicker.Button.Language", fallback: "Language") /// See Less public static let seeLess = L10n.tr("Localizable", "Scene.ServerPicker.Button.SeeLess", fallback: "See Less") /// See More diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 50c657ec1..95a87842a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -428,6 +428,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Tech" = "tech"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; +"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 4cfb15bc0..27bae4fbf 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -419,6 +419,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Tech" = "tech"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; +"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; From 515b3d476797362d4fb9c0786166304cc69381ac Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 22:54:36 +0100 Subject: [PATCH 48/94] [WIP] Add language-selection to onboarding (#690) Consider this WIP, for now, languages are hard-coded --- Mastodon.xcodeproj/project.pbxproj | 4 - .../PickServer/CategoryPickerSection.swift | 26 +++-- ...PickServerCategoryCollectionViewCell.swift | 99 ++++++++++++++----- .../MastodonPickServerViewController.swift | 7 +- ...MastodonPickServerViewModel+Diffable.swift | 3 +- .../MastodonPickServerViewModel.swift | 43 ++++++-- .../View/PickServerCategoryView.swift | 78 --------------- 7 files changed, 137 insertions(+), 123 deletions(-) delete mode 100644 Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 8a6f8d6f8..dc8f2f6ae 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 0FAA101C25E10E760017CCDE /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA101B25E10E760017CCDE /* UIFont.swift */; }; 0FAA102725E1126A0017CCDE /* MastodonPickServerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA102625E1126A0017CCDE /* MastodonPickServerViewController.swift */; }; 0FB3D2F725E4C24D00AAD544 /* MastodonPickServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D2F625E4C24D00AAD544 /* MastodonPickServerViewModel.swift */; }; - 0FB3D30F25E525CD00AAD544 /* PickServerCategoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */; }; 0FB3D31E25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D31D25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift */; }; 0FB3D33825E6401400AAD544 /* PickServerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3D33725E6401400AAD544 /* PickServerCell.swift */; }; 164F0EBC267D4FE400249499 /* BoopSound.caf in Resources */ = {isa = PBXBuildFile; fileRef = 164F0EBB267D4FE400249499 /* BoopSound.caf */; }; @@ -544,7 +543,6 @@ 0FAA101B25E10E760017CCDE /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = ""; }; 0FAA102625E1126A0017CCDE /* MastodonPickServerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPickServerViewController.swift; sourceTree = ""; }; 0FB3D2F625E4C24D00AAD544 /* MastodonPickServerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPickServerViewModel.swift; sourceTree = ""; }; - 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCategoryView.swift; sourceTree = ""; }; 0FB3D31D25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCategoryCollectionViewCell.swift; sourceTree = ""; }; 0FB3D33725E6401400AAD544 /* PickServerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickServerCell.swift; sourceTree = ""; }; 164F0EBB267D4FE400249499 /* BoopSound.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = BoopSound.caf; sourceTree = ""; }; @@ -1224,7 +1222,6 @@ isa = PBXGroup; children = ( D8363B1529469CE200A74079 /* OnboardingNextView.swift */, - 0FB3D30E25E525CD00AAD544 /* PickServerCategoryView.swift */, DB9282B125F3222800823B15 /* PickServerEmptyStateView.swift */, DB0617F0278413D00030EE79 /* PickServerServerSectionTableHeaderView.swift */, ); @@ -3487,7 +3484,6 @@ DB3E6FFA2807C47900B035AE /* DiscoveryForYouViewModel+Diffable.swift in Sources */, DB1FD44425F26CCC004CFCFC /* PickServerSection.swift in Sources */, DBB45B6027B50A4F002DC5A7 /* RecommendAccountItem.swift in Sources */, - 0FB3D30F25E525CD00AAD544 /* PickServerCategoryView.swift in Sources */, DB6180E626391B550018D199 /* MediaPreviewTransitionController.swift in Sources */, DB0FCB922796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift in Sources */, DB2F073525E8ECF000957B2D /* AuthenticationViewModel.swift in Sources */, diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 8f7480a84..84e73d98e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -16,15 +16,25 @@ enum CategoryPickerSection: Equatable, Hashable { extension CategoryPickerSection { static func collectionViewDiffableDataSource( for collectionView: UICollectionView, - dependency: NeedsDependency + dependency: NeedsDependency, + buttonDelegate: PickServerCategoryCollectionViewCellDelegate? ) -> UICollectionViewDiffableDataSource { UICollectionViewDiffableDataSource(collectionView: collectionView) { [weak dependency] collectionView, indexPath, item -> UICollectionViewCell? in guard let _ = dependency else { return nil } - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: PickServerCategoryCollectionViewCell.self), for: indexPath) as! PickServerCategoryCollectionViewCell - cell.categoryView.titleLabel.text = item.title + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PickServerCategoryCollectionViewCell.reuseIdentifier, for: indexPath) as! PickServerCategoryCollectionViewCell + + cell.titleLabel.text = item.title + cell.delegate = buttonDelegate let isLanguage = (item == .language(language: nil)) - cell.categoryView.chevron.isHidden = (isLanguage == false) + if isLanguage { + cell.chevron.isHidden = false + cell.menuButton.isUserInteractionEnabled = true + + } else { + cell.chevron.isHidden = true + cell.menuButton.isUserInteractionEnabled = false + } cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in @@ -42,10 +52,10 @@ extension CategoryPickerSection { borderColor = .separator } - cell.categoryView.backgroundColor = backgroundColor - cell.categoryView.titleLabel.textColor = textColor - cell.categoryView.layer.borderColor = borderColor.cgColor - cell.categoryView.chevron.tintColor = textColor + cell.backgroundColor = backgroundColor + cell.titleLabel.textColor = textColor + cell.layer.borderColor = borderColor.cgColor + cell.chevron.tintColor = textColor } .store(in: &cell.observations) diff --git a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift index 89ca8267b..cdbf713bc 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift @@ -6,13 +6,51 @@ // import UIKit +import MastodonSDK +import MastodonAsset +import MastodonUI +import MastodonLocalization + +protocol PickServerCategoryCollectionViewCellDelegate: AnyObject { + func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) //TODO: Add item +} class PickServerCategoryCollectionViewCell: UICollectionViewCell { + + static let reuseIdentifier = "PickServerCategoryCollectionViewCell" + weak var delegate: PickServerCategoryCollectionViewCellDelegate? + + let titleLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.font = .systemFont(ofSize: 15, weight: .regular) + label.textColor = Asset.Colors.Label.secondary.color + return label + }() + + let chevron: UIImageView = { + let chevron = UIImageView(image: UIImage(systemName: "chevron.down")) + chevron.translatesAutoresizingMaskIntoConstraints = false + return chevron + }() + + let menuButton: UIButton = { + let menuButton = UIButton() + menuButton.translatesAutoresizingMaskIntoConstraints = false + return menuButton + }() + + private let container: UIStackView = { + let container = UIStackView() + container.translatesAutoresizingMaskIntoConstraints = false + + container.axis = .horizontal + container.spacing = 4 + container.distribution = .fillProportionally + return container + }() var observations = Set() - - var categoryView = PickServerCategoryView() - override func prepareForReuse() { super.prepareForReuse() observations.removeAll() @@ -20,26 +58,41 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { override init(frame: CGRect) { super.init(frame: .zero) - configure() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - configure() - } -} -extension PickServerCategoryCollectionViewCell { - private func configure() { - backgroundColor = .clear - - categoryView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(categoryView) - NSLayoutConstraint.activate([ - categoryView.topAnchor.constraint(equalTo: contentView.topAnchor), - categoryView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), - categoryView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: categoryView.bottomAnchor), - ]) + container.addArrangedSubview(titleLabel) + container.addArrangedSubview(chevron) + + menuButton.addTarget(self, action: #selector(PickServerCategoryCollectionViewCell.didPressButton(_:)), for: .touchUpInside) + + layer.borderColor = UIColor.black.cgColor + layer.borderWidth = 1.0 + applyCornerRadius(radius: 15) + + contentView.addSubview(container) + contentView.addSubview(menuButton) + + setupConstraints() } + + private func setupConstraints() { + + var constraints = [ + container.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 6), + container.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12), + contentView.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 12), + contentView.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 6), + ] + + constraints.append(contentsOf: menuButton.pinToParent()) + NSLayoutConstraint.activate(constraints) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + //MARK: - Actions + + @objc func didPressButton(_ sender: Any) { + delegate?.didPressMenuButton(in: self) + } + } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index ca3aa9d06..3b7d9d0c7 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -392,7 +392,12 @@ extension MastodonPickServerViewController: PickServerServerSectionTableHeaderVi guard let diffableDataSource = headerView.diffableDataSource else { return } let item = diffableDataSource.itemIdentifier(for: indexPath) //TODO: @zeitschlag Consider language etc. also: show menu - viewModel.selectCategoryItem.value = item ?? .all + + if case let .language(_) = item { + + } else { + viewModel.selectCategoryItem.value = item ?? .all + } } } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift index 4bc31d1d6..2a22ebbbc 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift @@ -18,7 +18,8 @@ extension MastodonPickServerViewModel { // set section header serverSectionHeaderView.diffableDataSource = CategoryPickerSection.collectionViewDiffableDataSource( for: serverSectionHeaderView.collectionView, - dependency: dependency + dependency: dependency, + buttonDelegate: self ) var sectionHeaderSnapshot = NSDiffableDataSourceSnapshot() sectionHeaderSnapshot.appendSections([.main]) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 544bf804f..cec246cdd 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -15,6 +15,7 @@ import OrderedCollections import Tabman import MastodonCore import MastodonUI +import MastodonLocalization class MastodonPickServerViewModel: NSObject { @@ -39,6 +40,7 @@ class MastodonPickServerViewModel: NSObject { }() let selectCategoryItem = CurrentValueSubject(.all) let searchText = CurrentValueSubject("") + let selectedLanguage = CurrentValueSubject(nil) let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([]) let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading let viewWillAppear = PassthroughSubject() @@ -101,12 +103,13 @@ extension MastodonPickServerViewModel { .assign(to: \.value, on: emptyStateViewState) .store(in: &disposeBag) - Publishers.CombineLatest3( + Publishers.CombineLatest4( indexedServers.eraseToAnyPublisher(), selectCategoryItem.eraseToAnyPublisher(), - searchText.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main).removeDuplicates() + searchText.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main).removeDuplicates(), + selectedLanguage.eraseToAnyPublisher() ) - .map { indexedServers, selectCategoryItem, searchText -> [Mastodon.Entity.Server] in + .map { indexedServers, selectCategoryItem, searchText, selectedLanguage -> [Mastodon.Entity.Server] in // ignore approval required servers when sign-up var indexedServers = indexedServers indexedServers = indexedServers.filter { !$0.approvalRequired } @@ -156,12 +159,11 @@ extension MastodonPickServerViewModel { // Filter the indexed servers by category or search text switch selectCategoryItem { case .all: - return MastodonPickServerViewModel.filterServers(servers: indexedServers, category: nil, searchText: searchText) - case .language(let language): - //TODO: @zeitschlag Cache selected language - return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: "de", category: nil, searchText: searchText) + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) + case .language(_): + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) case .category(let category): - return MastodonPickServerViewModel.filterServers(servers: indexedServers, category: category.category.rawValue, searchText: searchText) + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: category.category.rawValue, searchText: searchText) } } .assign(to: \.value, on: filteredIndexedServers) @@ -266,3 +268,28 @@ extension MastodonPickServerViewModel: TMBarDataSource { return barItem } } + +extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDelegate { + func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) { + + let allLanguagesAction = UIAction(title: "All") { _ in + self.selectedLanguage.value = nil + cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language + } + + let languageActions = ["de", "en"].compactMap { language in + UIAction(title: language) { action in + self.selectedLanguage.value = language + cell.titleLabel.text = language + } + } + + var allActions = [allLanguagesAction] + allActions.append(contentsOf: languageActions) + + let languageMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.language, + children: allActions) + + cell.menuButton.menu = languageMenu + } +} diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift deleted file mode 100644 index 88c76c5f7..000000000 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerCategoryView.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// PickServerCategoryView.swift -// Mastodon -// -// Created by BradGao on 2021/2/23. -// - -import UIKit -import MastodonSDK -import MastodonAsset -import MastodonUI -import MastodonLocalization - -class PickServerCategoryView: UIView { - - let titleLabel: UILabel = { - let label = UILabel() - label.textAlignment = .center - label.font = .systemFont(ofSize: 15, weight: .regular) - label.textColor = Asset.Colors.Label.secondary.color - return label - }() - - let chevron: UIImageView = { - let chevron = UIImageView(image: UIImage(systemName: "chevron.down")) - chevron.translatesAutoresizingMaskIntoConstraints = false - return chevron - }() - - init() { - super.init(frame: .zero) - _init() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - _init() - } - - private func _init() { - - let container = UIStackView() - container.axis = .horizontal - container.spacing = 4 - container.distribution = .fillProportionally - container.addArrangedSubview(titleLabel) - container.addArrangedSubview(chevron) - - container.translatesAutoresizingMaskIntoConstraints = false - addSubview(container) - let constraints = [ - container.topAnchor.constraint(equalTo: topAnchor, constant: 6), - container.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12), - trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 12), - bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 6), - ] - - NSLayoutConstraint.activate(constraints) - - - layer.borderColor = UIColor.black.cgColor - layer.borderWidth = 1.0 - applyCornerRadius(radius: 15) - } - -} - -#if DEBUG && canImport(SwiftUI) -import SwiftUI - -struct PickServerCategoryView_Previews: PreviewProvider { - static var previews: some View { - UIViewPreview { - PickServerCategoryView() - } - } -} -#endif From 899a9ef5c1c30d24050e503a93ba8ebb5d11ce05 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 23:06:20 +0100 Subject: [PATCH 49/94] Make chevron smaller (#690) --- .../PickServerCategoryCollectionViewCell.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift index cdbf713bc..c877ac7a2 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift @@ -43,10 +43,10 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { private let container: UIStackView = { let container = UIStackView() container.translatesAutoresizingMaskIntoConstraints = false - container.axis = .horizontal container.spacing = 4 container.distribution = .fillProportionally + container.alignment = .center return container }() @@ -60,6 +60,7 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { super.init(frame: .zero) container.addArrangedSubview(titleLabel) + titleLabel.setContentCompressionResistancePriority(.required, for: .horizontal) container.addArrangedSubview(chevron) menuButton.addTarget(self, action: #selector(PickServerCategoryCollectionViewCell.didPressButton(_:)), for: .touchUpInside) @@ -81,6 +82,9 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { container.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12), contentView.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: 12), contentView.bottomAnchor.constraint(equalTo: container.bottomAnchor, constant: 6), + + chevron.heightAnchor.constraint(equalToConstant: 16), + chevron.widthAnchor.constraint(equalToConstant: 14), ] constraints.append(contentsOf: menuButton.pinToParent()) @@ -93,6 +97,7 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { @objc func didPressButton(_ sender: Any) { delegate?.didPressMenuButton(in: self) + invalidateIntrinsicContentSize() } } From 5237ae93c77d0a563d5da98a0cc394839d42d97d Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Tue, 20 Dec 2022 23:19:36 +0100 Subject: [PATCH 50/94] Use real languages for language-selection (#690) --- .../MastodonPickServerViewModel.swift | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index cec246cdd..7330da252 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -41,6 +41,7 @@ class MastodonPickServerViewModel: NSObject { let selectCategoryItem = CurrentValueSubject(.all) let searchText = CurrentValueSubject("") let selectedLanguage = CurrentValueSubject(nil) + let allLanguages = CurrentValueSubject<[Mastodon.Entity.Language], Never>([]) let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([]) let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading let viewWillAppear = PassthroughSubject() @@ -72,7 +73,7 @@ class MastodonPickServerViewModel: NSObject { init(context: AppContext) { self.context = context super.init() - + configure() } @@ -85,6 +86,14 @@ class MastodonPickServerViewModel: NSObject { extension MastodonPickServerViewModel { private func configure() { + + context.apiService.languages().sink { completion in + + } receiveValue: { response in + self.allLanguages.value = response.value + } + .store(in: &disposeBag) + Publishers.CombineLatest( isLoadingIndexedServers, loadingIndexedServersError @@ -272,15 +281,17 @@ extension MastodonPickServerViewModel: TMBarDataSource { extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDelegate { func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) { + guard allLanguages.value.isNotEmpty else { return } + let allLanguagesAction = UIAction(title: "All") { _ in self.selectedLanguage.value = nil cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language } - let languageActions = ["de", "en"].compactMap { language in - UIAction(title: language) { action in - self.selectedLanguage.value = language - cell.titleLabel.text = language + let languageActions = allLanguages.value.compactMap { language in + UIAction(title: language.language ?? language.locale) { action in + self.selectedLanguage.value = language.locale + cell.titleLabel.text = language.language } } From f211baf9e1b1b22152fcff2f18e97496853903c9 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 21 Dec 2022 23:33:00 +0100 Subject: [PATCH 51/94] Remove obsolete comment (#690) --- Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift index 7acc8fd82..c5e8db6ad 100644 --- a/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewCell.swift @@ -9,5 +9,4 @@ import UIKit class PrivacyTableViewCell: UITableViewCell { static let reuseIdentifier = "PrivacyTableViewCell" - //TODO: @zeitschlag Implement } From 1cbe623bd415e582722bee63e4b5953953892a81 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 21 Dec 2022 23:33:34 +0100 Subject: [PATCH 52/94] Add strings for signup-speed (#690) --- Localization/app.json | 6 ++++++ .../MastodonLocalization/Generated/Strings.swift | 10 ++++++++++ .../Resources/Base.lproj/Localizable.strings | 4 ++++ .../Resources/en.lproj/Localizable.strings | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/Localization/app.json b/Localization/app.json index afd2a4f34..8e9a58e58 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -268,6 +268,7 @@ "title": "Pick Server", "button": { "language": "Language", + "signup_speed": "Sign-up Speed", "category": { "all": "All", "all_accessiblity_description": "Category: All", @@ -299,6 +300,11 @@ "finding_servers": "Finding available servers...", "bad_network": "Something went wrong while loading the data. Check your internet connection.", "no_results": "No results" + }, + "signup_speed": { + "all": "All", + "instant": "Instant Sign-up", + "manually_reviewed" = "Manual Review" } }, "privacy": { diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 5a089fbec..cfa6b5959 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1211,6 +1211,8 @@ public enum L10n { public static let seeLess = L10n.tr("Localizable", "Scene.ServerPicker.Button.SeeLess", fallback: "See Less") /// See More public static let seeMore = L10n.tr("Localizable", "Scene.ServerPicker.Button.SeeMore", fallback: "See More") + /// Sign-up Speed + public static let signupSpeed = L10n.tr("Localizable", "Scene.ServerPicker.Button.SignupSpeed", fallback: "Sign-up Speed") public enum Category { /// academia public static let academia = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Academia", fallback: "academia") @@ -1262,6 +1264,14 @@ public enum L10n { /// USERS public static let users = L10n.tr("Localizable", "Scene.ServerPicker.Label.Users", fallback: "USERS") } + public enum SignupSpeed { + /// All + public static let all = L10n.tr("Localizable", "Scene.ServerPicker.SignupSpeed.All", fallback: "All") + /// Instant Sign-up + public static let instant = L10n.tr("Localizable", "Scene.ServerPicker.SignupSpeed.Instant", fallback: "Instant Sign-up") + /// Manual Review + public static let manuallyReviewed = L10n.tr("Localizable", "Scene.ServerPicker.SignupSpeed.ManuallyReviewed", fallback: "Manual Review") + } } public enum ServerRules { /// privacy policy diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 95a87842a..726ddac7c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -429,6 +429,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; "Scene.ServerPicker.Button.Language" = "Language"; +"Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; @@ -438,6 +439,9 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Users" = "USERS"; "Scene.ServerPicker.Title" = "Pick server"; "Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; +"Scene.ServerPicker.SignupSpeed.All" = "All"; +"Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; +"Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 27bae4fbf..2d3680362 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -420,6 +420,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; "Scene.ServerPicker.Button.Language" = "Language"; +"Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; @@ -429,6 +430,9 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Users" = "USERS"; "Scene.ServerPicker.Title" = "Pick server"; "Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; +"Scene.ServerPicker.SignupSpeed.All" = "All"; +"Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; +"Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; From b8bb0dc8050744099a3a89b7f98dfd78cbbe0c9c Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 21 Dec 2022 23:35:25 +0100 Subject: [PATCH 53/94] Add button for signup-speed-filter (#690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filtering should work, too, but: no menu yet, so: it's a bit useless 😅 --- .../PickServer/CategoryPickerItem.swift | 30 ++++++++++++++++++- .../PickServer/CategoryPickerSection.swift | 6 ++-- .../MastodonPickServerViewController.swift | 6 ++-- .../MastodonPickServerViewModel.swift | 12 ++++++-- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift index 45e33d6ff..9b9e6f6bd 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift @@ -14,6 +14,7 @@ import MastodonLocalization enum CategoryPickerItem { case all case language(language: String?) + case signupSpeed(manuallyReviewed: Bool?) case category(category: Mastodon.Entity.Category) } @@ -29,6 +30,16 @@ extension CategoryPickerItem { } else { return L10n.Scene.ServerPicker.Button.language } + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + if manuallyReviewed { + return L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed + } else { + return L10n.Scene.ServerPicker.SignupSpeed.instant + } + } else { + return L10n.Scene.ServerPicker.Button.signupSpeed + } case .category(let category): switch category.category { case .academia: @@ -71,7 +82,16 @@ extension CategoryPickerItem { } else { return L10n.Scene.ServerPicker.Button.language } - + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + if manuallyReviewed { + return L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed + } else { + return L10n.Scene.ServerPicker.SignupSpeed.instant + } + } else { + return L10n.Scene.ServerPicker.Button.signupSpeed + } case .category(let category): switch category.category { case .academia: @@ -114,6 +134,8 @@ extension CategoryPickerItem: Equatable { return categoryLeft.category.rawValue == categoryRight.category.rawValue case (.language(let languageLeft), .language(let languageRight)): return languageLeft == languageRight + case (.signupSpeed(let leftManualReview), .signupSpeed(let rightManualReview)): + return leftManualReview == rightManualReview default: return false } @@ -133,6 +155,12 @@ extension CategoryPickerItem: Hashable { } case .category(let category): hasher.combine(category.category.rawValue) + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + return hasher.combine(manuallyReviewed) + } else { + return hasher.combine("no_signup_speed_selected") + } } } } diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 84e73d98e..4f9acd08e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -27,13 +27,15 @@ extension CategoryPickerSection { cell.delegate = buttonDelegate let isLanguage = (item == .language(language: nil)) - if isLanguage { + let isSignupSpeed = (item == .signupSpeed(manuallyReviewed: nil)) + if isLanguage || isSignupSpeed { cell.chevron.isHidden = false cell.menuButton.isUserInteractionEnabled = true - + cell.menuButton.isHidden = false } else { cell.chevron.isHidden = true cell.menuButton.isUserInteractionEnabled = false + cell.menuButton.isHidden = true } cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 3b7d9d0c7..e55e01476 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -391,10 +391,10 @@ extension MastodonPickServerViewController: PickServerServerSectionTableHeaderVi func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let diffableDataSource = headerView.diffableDataSource else { return } let item = diffableDataSource.itemIdentifier(for: indexPath) - //TODO: @zeitschlag Consider language etc. also: show menu - if case let .language(_) = item { - + // is handled by the button + } else if case let .signupSpeed(_) = item { + // gets also handled by button } else { viewModel.selectCategoryItem.value = item ?? .all } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 7330da252..915247c98 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -35,12 +35,14 @@ class MastodonPickServerViewModel: NSObject { var items: [CategoryPickerItem] = [] items.append(.all) items.append(.language(language: nil)) + items.append(.signupSpeed(manuallyReviewed: nil)) items.append(contentsOf: APIService.stubCategories().map { CategoryPickerItem.category(category: $0) }) return items }() let selectCategoryItem = CurrentValueSubject(.all) let searchText = CurrentValueSubject("") let selectedLanguage = CurrentValueSubject(nil) + let manualApprovalRequired = CurrentValueSubject(nil) let allLanguages = CurrentValueSubject<[Mastodon.Entity.Language], Never>([]) let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([]) let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading @@ -169,7 +171,7 @@ extension MastodonPickServerViewModel { switch selectCategoryItem { case .all: return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) - case .language(_): + case .language(_), .signupSpeed(_): return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) case .category(let category): return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: category.category.rawValue, searchText: searchText) @@ -227,7 +229,7 @@ extension MastodonPickServerViewModel { } extension MastodonPickServerViewModel { - private static func filterServers(servers: [Mastodon.Entity.Server], language: String? = nil, category: String?, searchText: String) -> [Mastodon.Entity.Server] { + private static func filterServers(servers: [Mastodon.Entity.Server], language: String? = nil, manualApprovalRequired: Bool? = nil, category: String?, searchText: String) -> [Mastodon.Entity.Server] { let filteredServers = servers // 1. Filter the category .filter { @@ -244,8 +246,14 @@ extension MastodonPickServerViewModel { } .filter { guard let language else { return true } + return $0.language.lowercased() == language.lowercased() } + .filter { + guard let manualApprovalRequired else { return true } + + return $0.approvalRequired == manualApprovalRequired + } return filteredServers } } From f974fc9f0594cb92252b95ecdc526f9e0e8952cb Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 21 Dec 2022 23:35:44 +0100 Subject: [PATCH 54/94] Move "all"-categories behind filters (#690) --- .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 915247c98..bb9eaf3ef 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -33,9 +33,9 @@ class MastodonPickServerViewModel: NSObject { let context: AppContext var categoryPickerItems: [CategoryPickerItem] = { var items: [CategoryPickerItem] = [] - items.append(.all) items.append(.language(language: nil)) items.append(.signupSpeed(manuallyReviewed: nil)) + items.append(.all) items.append(contentsOf: APIService.stubCategories().map { CategoryPickerItem.category(category: $0) }) return items }() From 9806c2aa84a3a334643bffc5480b04deb6e49092 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 22 Dec 2022 19:20:29 +0100 Subject: [PATCH 55/94] Show menu for signup-speed-selection (#690) --- .../PickServer/CategoryPickerSection.swift | 1 + ...PickServerCategoryCollectionViewCell.swift | 2 + .../MastodonPickServerViewModel.swift | 64 ++++++++++++++----- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 4f9acd08e..d7f8fc9b3 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -25,6 +25,7 @@ extension CategoryPickerSection { cell.titleLabel.text = item.title cell.delegate = buttonDelegate + cell.item = item let isLanguage = (item == .language(language: nil)) let isSignupSpeed = (item == .signupSpeed(manuallyReviewed: nil)) diff --git a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift index c877ac7a2..d066bbdc1 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift @@ -20,6 +20,8 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { static let reuseIdentifier = "PickServerCategoryCollectionViewCell" weak var delegate: PickServerCategoryCollectionViewCellDelegate? + var item: CategoryPickerItem? + let titleLabel: UILabel = { let label = UILabel() label.textAlignment = .center diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index bb9eaf3ef..199c2400f 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -289,26 +289,56 @@ extension MastodonPickServerViewModel: TMBarDataSource { extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDelegate { func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) { - guard allLanguages.value.isNotEmpty else { return } + guard let item = cell.item else { return } - let allLanguagesAction = UIAction(title: "All") { _ in - self.selectedLanguage.value = nil - cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language - } + switch item { + case .all, .category(_): + return + case .language(_): + guard allLanguages.value.isNotEmpty else { return } - let languageActions = allLanguages.value.compactMap { language in - UIAction(title: language.language ?? language.locale) { action in - self.selectedLanguage.value = language.locale - cell.titleLabel.text = language.language + //FIXME: @zeitschlag localize + let allLanguagesAction = UIAction(title: "All") { _ in + self.selectedLanguage.value = nil + cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language } + + let languageActions = allLanguages.value.compactMap { language in + UIAction(title: language.language ?? language.locale) { action in + self.selectedLanguage.value = language.locale + cell.titleLabel.text = language.language + } + } + + var allActions = [allLanguagesAction] + allActions.append(contentsOf: languageActions) + + let languageMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.language, + children: allActions) + + cell.menuButton.menu = languageMenu + + case .signupSpeed(_): + + let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { action in + self.manualApprovalRequired.value = nil + cell.titleLabel.text = action.title + } + + let manualApprovalAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed) { action in + self.manualApprovalRequired.value = true + cell.titleLabel.text = action.title + } + + let instantSignupAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.instant) { action in + self.manualApprovalRequired.value = false + cell.titleLabel.text = action.title + } + + let signupSpeedMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.signupSpeed, + children: [doesntMatterAction, manualApprovalAction, instantSignupAction]) + + cell.menuButton.menu = signupSpeedMenu } - - var allActions = [allLanguagesAction] - allActions.append(contentsOf: languageActions) - - let languageMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.language, - children: allActions) - - cell.menuButton.menu = languageMenu } } From 4ebd2bded7262187af7509bcc73d6e714d5e3a89 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 22 Dec 2022 19:26:37 +0100 Subject: [PATCH 56/94] Fix button-title (#690) --- .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 199c2400f..7a408f625 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -320,9 +320,9 @@ extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDeleg case .signupSpeed(_): - let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { action in + let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { _ in self.manualApprovalRequired.value = nil - cell.titleLabel.text = action.title + cell.titleLabel.text = L10n.Scene.ServerPicker.Button.signupSpeed } let manualApprovalAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed) { action in From 7f60eb160812e279e563c076c33f857376cc77bf Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 23 Dec 2022 23:33:30 +0100 Subject: [PATCH 57/94] Fix search-bar-placeholder for server-picker (#690) --- Localization/app.json | 3 +++ .../PickServer/MastodonPickServerViewController.swift | 1 + .../Sources/MastodonLocalization/Generated/Strings.swift | 4 ++++ .../Resources/Base.lproj/Localizable.strings | 1 + .../Resources/en.lproj/Localizable.strings | 1 + 5 files changed, 10 insertions(+) diff --git a/Localization/app.json b/Localization/app.json index 8e9a58e58..79cb79f00 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -305,6 +305,9 @@ "all": "All", "instant": "Instant Sign-up", "manually_reviewed" = "Manual Review" + }, + "search": { + "placeholder": "Search name or URL" } }, "privacy": { diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index e55e01476..d56e3caa2 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -57,6 +57,7 @@ final class MastodonPickServerViewController: UIViewController, NeedsDependency let searchController: UISearchController = { let searchController = UISearchController(searchResultsController: nil) + searchController.searchBar.placeholder = L10n.Scene.ServerPicker.Search.placeholder return searchController }() } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index cfa6b5959..db3680e92 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1264,6 +1264,10 @@ public enum L10n { /// USERS public static let users = L10n.tr("Localizable", "Scene.ServerPicker.Label.Users", fallback: "USERS") } + public enum Search { + /// Search name or URL + public static let placeholder = L10n.tr("Localizable", "Scene.ServerPicker.Search.Placeholder", fallback: "Search name or URL") + } public enum SignupSpeed { /// All public static let all = L10n.tr("Localizable", "Scene.ServerPicker.SignupSpeed.All", fallback: "All") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 726ddac7c..5ccc8a4c5 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -442,6 +442,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; +"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 2d3680362..ebbcfa41c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -433,6 +433,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; +"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; From beb95918dae842b1fb1da61f7922000556733bb6 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 24 Dec 2022 00:08:08 +0100 Subject: [PATCH 58/94] Make sign-up-speed-filter work (#690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It took me a while to figure out that indexedServers were already filtered. To some degree it’s just fighting people’s inability to read… --- .../MastodonPickServerViewModel.swift | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 7a408f625..237e3827e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -113,17 +113,20 @@ extension MastodonPickServerViewModel { } .assign(to: \.value, on: emptyStateViewState) .store(in: &disposeBag) - + Publishers.CombineLatest4( indexedServers.eraseToAnyPublisher(), selectCategoryItem.eraseToAnyPublisher(), searchText.debounce(for: .milliseconds(300), scheduler: DispatchQueue.main).removeDuplicates(), - selectedLanguage.eraseToAnyPublisher() + Publishers.CombineLatest( + selectedLanguage.eraseToAnyPublisher(), + manualApprovalRequired.eraseToAnyPublisher() + ).map { selectedLanguage, manualApprovalRequired -> (selectedLanguage: String?, manualApprovalRequired: Bool?) in + (selectedLanguage, manualApprovalRequired) + } ) - .map { indexedServers, selectCategoryItem, searchText, selectedLanguage -> [Mastodon.Entity.Server] in + .map { indexedServers, selectCategoryItem, searchText, filters -> [Mastodon.Entity.Server] in // ignore approval required servers when sign-up - var indexedServers = indexedServers - indexedServers = indexedServers.filter { !$0.approvalRequired } // Note: // sort by calculate last week users count // and make medium size (~800) server to top @@ -170,11 +173,11 @@ extension MastodonPickServerViewModel { // Filter the indexed servers by category or search text switch selectCategoryItem { case .all: - return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: filters.selectedLanguage, manualApprovalRequired: filters.manualApprovalRequired, category: nil, searchText: searchText) case .language(_), .signupSpeed(_): - return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: filters.selectedLanguage, manualApprovalRequired: filters.manualApprovalRequired, category: nil, searchText: searchText) case .category(let category): - return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: category.category.rawValue, searchText: searchText) + return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: filters.selectedLanguage, manualApprovalRequired: filters.manualApprovalRequired, category: category.category.rawValue, searchText: searchText) } } .assign(to: \.value, on: filteredIndexedServers) @@ -252,6 +255,7 @@ extension MastodonPickServerViewModel { .filter { guard let manualApprovalRequired else { return true } + print("\($0.domain) \($0.approvalRequired) < \(manualApprovalRequired)") return $0.approvalRequired == manualApprovalRequired } return filteredServers From 6d241495a230c67ddb2f7e5948277751dfbac1ad Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 24 Dec 2022 00:18:48 +0100 Subject: [PATCH 59/94] Fix build :see_no_evil: this is a bit embarrasing, I guess :D --- .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 237e3827e..c35507613 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -114,6 +114,7 @@ extension MastodonPickServerViewModel { .assign(to: \.value, on: emptyStateViewState) .store(in: &disposeBag) + Publishers.CombineLatest4( indexedServers.eraseToAnyPublisher(), selectCategoryItem.eraseToAnyPublisher(), @@ -127,6 +128,7 @@ extension MastodonPickServerViewModel { ) .map { indexedServers, selectCategoryItem, searchText, filters -> [Mastodon.Entity.Server] in // ignore approval required servers when sign-up + var indexedServers = indexedServers // Note: // sort by calculate last week users count // and make medium size (~800) server to top From 0675bdb7dbd2782134384b5be7beccc2cf2f59c0 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Wed, 28 Dec 2022 14:09:36 +0100 Subject: [PATCH 60/94] chore(onboarding): Improve airplane movement add clouds movement --- .../View/WelcomeIllustrationView.swift | 323 +++++++++--------- 1 file changed, 167 insertions(+), 156 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index ee375b0c6..7c6c0d232 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -12,168 +12,179 @@ import MastodonUI import MastodonLocalization fileprivate extension CGFloat { - static let centerHillStartPosition = 20.0 - static let airplaneStartPosition = -178.0 - static let leftHillStartPosition = 30.0 - static let rightHillStartPosition = -161.0 - - static let airplaneSpeed = 50.0 - static let leftHillSpeed = 20.0 - static let centerHillSpeed = 40.0 - static let rightHillSpeed = 20.0 + static let cloudsStartPosition = 0.0 + static let centerHillStartPosition = 20.0 + static let airplaneStartPosition = -178.0 + static let leftHillStartPosition = 30.0 + static let rightHillStartPosition = -161.0 + static let leftHillSpeed = 20.0 + static let centerHillSpeed = 40.0 + static let rightHillSpeed = 20.0 } final class WelcomeIllustrationView: UIView { - - private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image - private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image - private let elephantThreeOnGrassWithTreeTwoImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image - private let elephantThreeOnGrassWithTreeThreeImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image - private let elephantThreeOnGrassImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image - private let elephantThreeOnGrassExtendImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassExtend.image - - var elephantOnAirplaneLeftConstraint: NSLayoutConstraint? - var leftHillLeftConstraint: NSLayoutConstraint? - var centerHillLeftConstraint: NSLayoutConstraint? - var rightHillRightConstraint: NSLayoutConstraint? - - let elephantOnAirplaneWithContrailImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantOnAirplaneWithContrail.image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = .scaleAspectFill - return imageView - }() - - let rightHillImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = .scaleAspectFill - return imageView - }() - - let leftHillImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = .scaleAspectFill - return imageView - }() - - let centerHillImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = .scaleAspectFill - return imageView - }() - - let cloudBaseImageView: UIImageView = { - let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.cloudBase.image) - imageView.translatesAutoresizingMaskIntoConstraints = false - imageView.contentMode = .scaleAspectFit - imageView.alpha = 0.3 - return imageView - }() - - var aspectLayoutConstraint: NSLayoutConstraint! - - override init(frame: CGRect) { - super.init(frame: frame) - _init() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - _init() - } - + + private let cloudBaseImage = Asset.Scene.Welcome.Illustration.cloudBase.image + private let cloudBaseExtendImage = Asset.Scene.Welcome.Illustration.cloudBaseExtend.image + private let elephantThreeOnGrassWithTreeTwoImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image + private let elephantThreeOnGrassWithTreeThreeImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image + private let elephantThreeOnGrassImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image + private let elephantThreeOnGrassExtendImage = Asset.Scene.Welcome.Illustration.elephantThreeOnGrassExtend.image + + var cloudsLeftAnchor: NSLayoutConstraint? + var elephantOnAirplaneLeftConstraint: NSLayoutConstraint? + var leftHillLeftConstraint: NSLayoutConstraint? + var centerHillLeftConstraint: NSLayoutConstraint? + var rightHillRightConstraint: NSLayoutConstraint? + + let elephantOnAirplaneWithContrailImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantOnAirplaneWithContrail.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let rightHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeTwo.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let leftHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrassWithTreeThree.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let centerHillImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.elephantThreeOnGrass.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + return imageView + }() + + let cloudBaseImageView: UIImageView = { + let imageView = UIImageView(image: Asset.Scene.Welcome.Illustration.cloudBase.image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.contentMode = .scaleAspectFill + imageView.alpha = 0.3 + return imageView + }() + + var aspectLayoutConstraint: NSLayoutConstraint! + + override init(frame: CGRect) { + super.init(frame: frame) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + + // modifiers for animations + private lazy var cloudsDrag: CGFloat = -(bounds.width / 64) + private lazy var airplaneDrag: CGFloat = bounds.width / 64 } extension WelcomeIllustrationView { + + private func _init() { + backgroundColor = Asset.Scene.Welcome.Illustration.backgroundCyan.color + + cloudBaseImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(cloudBaseImageView) + + let cloudsLeftAnchor = cloudBaseImageView.leftAnchor.constraint(equalTo: leftAnchor, constant: .cloudsStartPosition) + NSLayoutConstraint.activate([ + cloudsLeftAnchor, + cloudBaseImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.4), + cloudBaseImageView.bottomAnchor.constraint(equalTo: bottomAnchor), + cloudBaseImageView.topAnchor.constraint(equalTo: topAnchor) + ]) + self.cloudsLeftAnchor = cloudsLeftAnchor - private func _init() { - backgroundColor = Asset.Scene.Welcome.Illustration.backgroundCyan.color - - cloudBaseImageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(cloudBaseImageView) - NSLayoutConstraint.activate([ - cloudBaseImageView.leadingAnchor.constraint(equalTo: leadingAnchor), - cloudBaseImageView.trailingAnchor.constraint(equalTo: trailingAnchor), - cloudBaseImageView.bottomAnchor.constraint(equalTo: bottomAnchor), - cloudBaseImageView.topAnchor.constraint(equalTo: topAnchor) - ]) - - let rightHillRightConstraint = rightAnchor.constraint(equalTo: rightHillImageView.rightAnchor, constant: .rightHillStartPosition) - addSubview(rightHillImageView) - NSLayoutConstraint.activate([ - rightHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.64), - rightHillRightConstraint, - bottomAnchor.constraint(equalTo: rightHillImageView.bottomAnchor, constant: 149), - ]) - self.rightHillRightConstraint = rightHillRightConstraint - - let leftHillLeftConstraint = leftAnchor.constraint(equalTo: leftHillImageView.leftAnchor, constant: .leftHillStartPosition) - addSubview(leftHillImageView) - NSLayoutConstraint.activate([ - leftHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.72), - leftHillLeftConstraint, - bottomAnchor.constraint(equalTo: leftHillImageView.bottomAnchor, constant: 187), - ]) - - self.leftHillLeftConstraint = leftHillLeftConstraint - - let centerHillLeftConstraint = leftAnchor.constraint(equalTo: centerHillImageView.leftAnchor, constant: .centerHillStartPosition) - - addSubview(centerHillImageView) - NSLayoutConstraint.activate([ - centerHillLeftConstraint, - bottomAnchor.constraint(equalTo: centerHillImageView.bottomAnchor, constant: -18), - centerHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.2), - ]) - - self.centerHillLeftConstraint = centerHillLeftConstraint - - addSubview(elephantOnAirplaneWithContrailImageView) - - let elephantOnAirplaneLeftConstraint = elephantOnAirplaneWithContrailImageView.leftAnchor.constraint(equalTo: leftAnchor, constant: .airplaneStartPosition) // add 12pt bleeding - NSLayoutConstraint.activate([ - elephantOnAirplaneLeftConstraint, - elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: leftHillImageView.topAnchor), - // make a little bit large - elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.84), - ]) - - self.elephantOnAirplaneLeftConstraint = elephantOnAirplaneLeftConstraint - } - - func setup() { - - // set illustration - guard superview == nil else { - return + let rightHillRightConstraint = rightAnchor.constraint(equalTo: rightHillImageView.rightAnchor, constant: .rightHillStartPosition) + addSubview(rightHillImageView) + NSLayoutConstraint.activate([ + rightHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.64), + rightHillRightConstraint, + bottomAnchor.constraint(equalTo: rightHillImageView.bottomAnchor, constant: 149), + ]) + self.rightHillRightConstraint = rightHillRightConstraint + + let leftHillLeftConstraint = leftAnchor.constraint(equalTo: leftHillImageView.leftAnchor, constant: .leftHillStartPosition) + addSubview(leftHillImageView) + NSLayoutConstraint.activate([ + leftHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.72), + leftHillLeftConstraint, + bottomAnchor.constraint(equalTo: leftHillImageView.bottomAnchor, constant: 187), + ]) + + self.leftHillLeftConstraint = leftHillLeftConstraint + + let centerHillLeftConstraint = leftAnchor.constraint(equalTo: centerHillImageView.leftAnchor, constant: .centerHillStartPosition) + + addSubview(centerHillImageView) + NSLayoutConstraint.activate([ + centerHillLeftConstraint, + bottomAnchor.constraint(equalTo: centerHillImageView.bottomAnchor, constant: -18), + centerHillImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1.2), + ]) + + self.centerHillLeftConstraint = centerHillLeftConstraint + + addSubview(elephantOnAirplaneWithContrailImageView) + + let elephantOnAirplaneLeftConstraint = elephantOnAirplaneWithContrailImageView.leftAnchor.constraint(equalTo: leftAnchor, constant: .airplaneStartPosition) // add 12pt bleeding + NSLayoutConstraint.activate([ + elephantOnAirplaneLeftConstraint, + elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: leftHillImageView.topAnchor), + // make a little bit large + elephantOnAirplaneWithContrailImageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.84), + ]) + + self.elephantOnAirplaneLeftConstraint = elephantOnAirplaneLeftConstraint + } + + func setup() { + + // set illustration + guard superview == nil else { + return + } + contentMode = .scaleAspectFit + + cloudBaseImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) + ) + rightHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) + ) + leftHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) + ) + centerHillImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) + ) + + elephantOnAirplaneWithContrailImageView.addMotionEffect( + UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) + ) + } + + func update(contentOffset: CGFloat) { + cloudsLeftAnchor?.constant = { + let val = contentOffset / cloudsDrag + .cloudsStartPosition + print(val) + return val + }() + elephantOnAirplaneLeftConstraint?.constant = contentOffset / airplaneDrag + .airplaneStartPosition + leftHillLeftConstraint?.constant = contentOffset / .leftHillSpeed + .leftHillStartPosition + centerHillLeftConstraint?.constant = contentOffset / .centerHillSpeed + .centerHillStartPosition + rightHillRightConstraint?.constant = contentOffset / .rightHillSpeed + .rightHillStartPosition } - contentMode = .scaleAspectFit - - cloudBaseImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -5, maxX: 5, minY: -5, maxY: 5) - ) - rightHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -15, maxX: 25, minY: -10, maxY: 10) - ) - leftHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -25, maxX: 15, minY: -15, maxY: 15) - ) - centerHillImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -14, maxX: 14, minY: -5, maxY: 25) - ) - - elephantOnAirplaneWithContrailImageView.addMotionEffect( - UIInterpolatingMotionEffect.motionEffect(minX: -20, maxX: 12, minY: -20, maxY: 12) // maxX should not larger then the bleeding (12pt) - ) - } - - func update(contentOffset: CGFloat) { - elephantOnAirplaneLeftConstraint?.constant = contentOffset / .airplaneSpeed + .airplaneStartPosition - leftHillLeftConstraint?.constant = contentOffset / .leftHillSpeed + .leftHillStartPosition - centerHillLeftConstraint?.constant = contentOffset / .centerHillSpeed + .centerHillStartPosition - rightHillRightConstraint?.constant = contentOffset / .rightHillSpeed + .rightHillStartPosition - } } From f510cede3352386854d3afad36c596055216fac7 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 28 Dec 2022 13:50:59 +0100 Subject: [PATCH 61/94] Remove all from ServerPicker (#690) --- .../Onboarding/PickServer/CategoryPickerItem.swift | 9 --------- .../MastodonPickServerViewController.swift | 12 ++++++++---- .../MastodonPickServerViewModel+Diffable.swift | 6 ++++-- .../PickServer/MastodonPickServerViewModel.swift | 9 +++------ 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift index 9b9e6f6bd..759b9606e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift @@ -12,7 +12,6 @@ import MastodonLocalization /// Note: update Equatable when change case enum CategoryPickerItem { - case all case language(language: String?) case signupSpeed(manuallyReviewed: Bool?) case category(category: Mastodon.Entity.Category) @@ -22,8 +21,6 @@ extension CategoryPickerItem { var title: String { switch self { - case .all: - return L10n.Scene.ServerPicker.Button.Category.all case .language(let language): if let language { return language @@ -74,8 +71,6 @@ extension CategoryPickerItem { var accessibilityDescription: String { switch self { - case .all: - return L10n.Scene.ServerPicker.Button.Category.allAccessiblityDescription case .language(let language): if let language { return language @@ -128,8 +123,6 @@ extension CategoryPickerItem { extension CategoryPickerItem: Equatable { static func == (lhs: CategoryPickerItem, rhs: CategoryPickerItem) -> Bool { switch (lhs, rhs) { - case (.all, .all): - return true case (.category(let categoryLeft), .category(let categoryRight)): return categoryLeft.category.rawValue == categoryRight.category.rawValue case (.language(let languageLeft), .language(let languageRight)): @@ -145,8 +138,6 @@ extension CategoryPickerItem: Equatable { extension CategoryPickerItem: Hashable { func hash(into hasher: inout Hasher) { switch self { - case .all: - hasher.combine(String(describing: CategoryPickerItem.all.self)) case .language(let language): if let language { return hasher.combine(language) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index d56e3caa2..b2bc62da8 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -14,6 +14,7 @@ import MastodonAsset import MastodonCore import MastodonLocalization import MastodonUI +import MastodonSDK final class MastodonPickServerViewController: UIViewController, NeedsDependency { @@ -390,14 +391,17 @@ extension MastodonPickServerViewController: UITableViewDelegate { // MARK: - PickServerServerSectionTableHeaderViewDelegate extension MastodonPickServerViewController: PickServerServerSectionTableHeaderViewDelegate { func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard let diffableDataSource = headerView.diffableDataSource else { return } - let item = diffableDataSource.itemIdentifier(for: indexPath) + guard let diffableDataSource = headerView.diffableDataSource, + let item = diffableDataSource.itemIdentifier(for: indexPath), + let cell = collectionView.cellForItem(at: indexPath) as? PickServerCategoryCollectionViewCell else { return } + if case let .language(_) = item { - // is handled by the button + viewModel.didPressMenuButton(in: cell) } else if case let .signupSpeed(_) = item { // gets also handled by button + viewModel.didPressMenuButton(in: cell) } else { - viewModel.selectCategoryItem.value = item ?? .all + viewModel.selectCategoryItem.value = item } } } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift index 2a22ebbbc..c54cc2bc7 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift @@ -7,6 +7,7 @@ import UIKit import Combine +import MastodonSDK extension MastodonPickServerViewModel { @@ -27,8 +28,9 @@ extension MastodonPickServerViewModel { serverSectionHeaderView.delegate = pickServerServerSectionTableHeaderViewDelegate serverSectionHeaderView.diffableDataSource?.apply(sectionHeaderSnapshot, animatingDifferences: false) { [weak self] in guard let self = self else { return } - guard let indexPath = self.serverSectionHeaderView.diffableDataSource?.indexPath(for: .all) else { return } - self.serverSectionHeaderView.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .centeredHorizontally) + guard let indexPath = self.serverSectionHeaderView.diffableDataSource?.indexPath(for: .category(category: .init(category: Mastodon.Entity.Category.Kind.general.rawValue, serversCount: 0))) else { return } + + self.serverSectionHeaderView.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .right) } // set tableView diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index c35507613..6e6b27f13 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -20,7 +20,7 @@ import MastodonLocalization class MastodonPickServerViewModel: NSObject { enum EmptyStateViewState { - case none + case none case loading case badNetwork } @@ -35,11 +35,10 @@ class MastodonPickServerViewModel: NSObject { var items: [CategoryPickerItem] = [] items.append(.language(language: nil)) items.append(.signupSpeed(manuallyReviewed: nil)) - items.append(.all) items.append(contentsOf: APIService.stubCategories().map { CategoryPickerItem.category(category: $0) }) return items }() - let selectCategoryItem = CurrentValueSubject(.all) + let selectCategoryItem = CurrentValueSubject(.category(category: Mastodon.Entity.Category(category: Mastodon.Entity.Category.Kind.general.rawValue, serversCount: 0))) let searchText = CurrentValueSubject("") let selectedLanguage = CurrentValueSubject(nil) let manualApprovalRequired = CurrentValueSubject(nil) @@ -174,8 +173,6 @@ extension MastodonPickServerViewModel { // Filter the indexed servers by category or search text switch selectCategoryItem { - case .all: - return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: filters.selectedLanguage, manualApprovalRequired: filters.manualApprovalRequired, category: nil, searchText: searchText) case .language(_), .signupSpeed(_): return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: filters.selectedLanguage, manualApprovalRequired: filters.manualApprovalRequired, category: nil, searchText: searchText) case .category(let category): @@ -298,7 +295,7 @@ extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDeleg guard let item = cell.item else { return } switch item { - case .all, .category(_): + case .category(_): return case .language(_): guard allLanguages.value.isNotEmpty else { return } From 98421802ebecfbf47b8a2d65ea485052b76f15d7 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Wed, 28 Dec 2022 14:33:42 +0100 Subject: [PATCH 62/94] chore(onboarding): Update hill images and animation --- .../View/WelcomeIllustrationView.swift | 14 +++++--------- .../untitled10005Group101.png | Bin 23510 -> 27566 bytes .../untitled10005Group101@2x.png | Bin 65149 -> 76469 bytes .../untitled10005Group101@3x.png | Bin 118241 -> 139238 bytes .../untitled10004Group111.png | Bin 23278 -> 26070 bytes .../untitled10004Group111@2x.png | Bin 65204 -> 72699 bytes .../untitled10004Group111@3x.png | Bin 120859 -> 134651 bytes 7 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift index 7c6c0d232..3f9d73509 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/WelcomeIllustrationView.swift @@ -12,14 +12,14 @@ import MastodonUI import MastodonLocalization fileprivate extension CGFloat { - static let cloudsStartPosition = 0.0 + static let cloudsStartPosition = -20.0 static let centerHillStartPosition = 20.0 static let airplaneStartPosition = -178.0 static let leftHillStartPosition = 30.0 - static let rightHillStartPosition = -161.0 - static let leftHillSpeed = 20.0 + static let rightHillStartPosition = -200.0 + static let leftHillSpeed = 6.0 static let centerHillSpeed = 40.0 - static let rightHillSpeed = 20.0 + static let rightHillSpeed = 6.0 } final class WelcomeIllustrationView: UIView { @@ -177,11 +177,7 @@ extension WelcomeIllustrationView { } func update(contentOffset: CGFloat) { - cloudsLeftAnchor?.constant = { - let val = contentOffset / cloudsDrag + .cloudsStartPosition - print(val) - return val - }() + cloudsLeftAnchor?.constant = contentOffset / cloudsDrag + .cloudsStartPosition elephantOnAirplaneLeftConstraint?.constant = contentOffset / airplaneDrag + .airplaneStartPosition leftHillLeftConstraint?.constant = contentOffset / .leftHillSpeed + .leftHillStartPosition centerHillLeftConstraint?.constant = contentOffset / .centerHillSpeed + .centerHillStartPosition diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.three.imageset/untitled10005Group101.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.three.imageset/untitled10005Group101.png index d0b216570669ed44ed99b637f49eb7f6463ccdb2..cb2128994271e3b22cdc4f68a92dd3c1139f40d3 100644 GIT binary patch literal 27566 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 z z#+=_2LUWnQ%U@GT7^f|)zfZMg*%HXD?}cCXbg`#|Np>I=Go$)>FvD0fs!MdkK0t|# zx%yq=U|{ezl^W;Wx!Wr`1XU=!M7yqI7=|?%&~0?V7A_$8dYK87CKwa;*~{EGITif@ zI-V$|(rel9^L+taxmI^bZ`|C{Hrv*M(ZT{Jyt5G@f{^mLIWbufMQtP++ngaY(-i&Z z-@)!2gVe8qMeL)#WFBz_RD#m#ux|Lt>L<#_%@X*Ze_6(dmnMX2!-Prk`0UdN`}k!w z+#5UBdF4FY;ZHW`vC=ufI3wc2W3fZR z7IKsrO$V{_?oAO~FKGSb8`c&L4}4mIXGrmz5A)=<#&`gv&oTkNHl4@!=qtyBcKQx7 zIAp-?4`SI<(%++&wHh_qCR)i4Lea=JgFE8<8}b4*I&^?b^*y0~8;!JLRCV*!4xO#` zck3a~;*;oa#ML5JL&}A6!5+?2Y^%Qi^~)OnV?am0iOnY4x1>l(j7|=cBSgNxhx-L= zv}pDL{Uhv9Q6bm(a}~jcQukJi0~i=;88B!P$B;0{*Jw#>Mfz5~BovL!#z0rnsv^lS z-JAHohIMaZpVAc(?&Qdt=(n00pwJ)c;P8n0=J1|v<;U9pI0cQy(j*V;=wPt@k$L~0 zP;UnzO1`RCPKa_m%zv^23qFfxW{z1|XhhyL|6}I*BO<(Ba`^W|2Bx%RAi`VG2?dM< znfw{NeDmc0dRSQVssw4NDRSFr2-CzxA-vUdA#RpSnAli<;hQTiq5Q82BL(@PS%7$@ zxaooSuk5kd+n*CI`M{SBYH?YAdG#Yzdw3wF0DGnVgEyih{%WCE#D-neoP+%U94yTI zmsKUS9*cra&4PnkPs2Yl0=at+>W41*7Un~~zq2E^V#UTSGG)h47Sqw|QTeNKlMnRq z($pICJksMlS3mwELR{gVO;2Wa8|f{t~umV%GVK$W!h=x;GF@t*Y2d=Rsy+ zxVNpEmVZ6{Z~8#;Sdmhd$_$EX zX6(N!pb5*uSv>uP*V=aH@xP%BCY1@lH`50y`BDAH#No9VHqqyvO%{{Q*fJk))@<==3h-c>qNs{BI!`dy$txGe2GB% z#PG1c=7kRxtC0Fa`QNN!72dXzPX~Gb9%p0CCc|j%%>J_m_lD+ zcoTp4-Tb69)j#RKQ!xEgUlfOj`a#~h-hX3=^tQ-Ml+=5#FE1e8CQDHk!yp=sTSNP? zp!9rLeQ$R0c)lk?xphLG?MD%{P+m5;=G9$975D4ee?!I;k7&JD`)5VE_CLV8oy3Wru`AsT7^H%iWwv*qdnGJqB z8pthjjyoZM$L|-{aKdh9oN?LFjgC4JtrOF1i}`$;7&7KUw~J2pJ85R6yB&heub&6@ zy9~}cvN04Nd=A`sI`c3S3tbj{G*-RtCLo=P&7RAOcY_Qep4)XqHwy=b#;()1@jBPP z4r1rl65Sdf()3<`5%Q{+HLTKz!yG8fDl$jIfA1C4DBUqM$IytHw&?S#K4pKH;o$2P zl!?14w2Q%~=xT*Z#;%ec5$5H*i<&Iz)A97Ti}4VWS8o8ZU%lXMCsl7RuJH|ep?rwo zus@#hoar+avYuxpzVVvG>*b0oLYX{!4v8FO^V^~|Ke*UKsa%*jr8C%nkk)^Om3%E8 zT4NI&-9v3-NwL@8aE`k3no)DvA)3OD$$52WQRTp5rrf+I_MpUjK(i(3B`nw?4qW(J z#F9GT+jmZ9dGX$%@(Rji4=>6#JrvD>>8=qhleBcZZzrPg>Ols4+ZGqZ`8~k62X@?V l=0Rozmz8b9^!ohz4jz!jHRJ^y^HyH#owT?Ds1#`6|9=Ceye0qu literal 23510 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

gF!@mUZ_oz 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 Xb-&{^eDmQN?q@RZ6(uUbMgji^c{+v4 diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.three.imageset/untitled10005Group101@2x.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.three.imageset/untitled10005Group101@2x.png index a2beeca6db539525e5ef06cd3e7ed9c682fe1c52..975bfd63d53d8c96b79c30409e02e0b9faaf57cd 100644 GIT binary patch literal 76469 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%0D`h|Ao{gawm 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 literal 65149 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 Dcv}{a>r(G!rIPgw?8pdgW^ zOp2*EdE^yDb_^lZ7W{7aKOsS(jC{ruzf3>i7FBHrZw&15)DV74lO3?67iso4^Fxb@iNT)kQ-RhrG_GT}18vZTxjREtaBGf}X| z%h}7zaSQf#=a&}8Xn#hl!ywz-PU7zYi`5b>EH1c6t+5ihHc39NyMh6(t94psp4KOk zeQ6V9#dX7k!K9komr z#Tpy3Mhz#|QZ6hekW#Xu-!GFcOUK;YqR}uqP>IG6){SQ{e#_VkFUICzYt}Jxcn|u9 zx?tDL5wM#XqDeH#%aX3z?7Hee$d6Wkk0>?TUo6>c<&vn^O(nC<`Po=`>hiVB!nKLY z;ng1eXnAP)TFq8}wNx6W#r3>> zbTLKB@dckvlIvvg^7xyERhFu*fL~YL9v2jqOO&iFi)6flo4v3tcW>F)x>?@*i64Gk z7fnWL>y|oc@l^y)m%cVRjo(tIuuX-+ITj*Rg$#1e;1}gtv>(}zEu~WRTs%>)6pQ>i zPc6O9(=fbwmf5*ZnMu`@f=z5ntR|aqZ@+I)?B~C627=weUHj}jN77WWJOYSxu5bUMXPUz-~PC#m^wx z=KIuqSrc0iEu-H?iwwSIxmc=}DPGIdm*!{VwV8>jTR?8KZiRmq&5fUB-(bLqaBxlSeEzmwvGH+7i?BLQ3Vj@myMh zsXtbQS{BjUQ;`&svUT!DZQNB$({&RcGm`IgZ$T$u7ArvIAV8o_u3?V{f95}hAvJ{pt-P!UEKp1?jBkiFmQ+4 zl?u2raRu|`JerXZT2AN2l|6`t{$-S7M6RU_x^@lW$d{hOV1Jt#d)=m3>MP0hyDjcd z#XYA>#d0f_NY}1kyqcUmd$Blm?n*N=7n5qW8j}i>3&(2NbG@{*j>90I+vB&Qq!`B3 zC9YfIi^vUwXnSczX!)0Z7NF&YLCpHn?YaM^=)|cx>~_1;?Uyyp!IW&2o_*X3lu0oi zU!2S&lJm5$IFYMx%c?Fd_BI=`U5hx~uFuMfHtKYH5e&CMwcAOpmc%=fOQkS=>HK0c zwm41q^{?rNe*(jpFkxa#VYN@~>88cvC^C;_HKERva(cXb{K8MS5 zlVWmBXQ&M>GQe$1abbFn$mG(PUYN#WHVI3B&X-4Mm-xuwLzX<(a%>*0at>WPhp_*J zr_kTi2H9qk>vqMm3@h1egG)skYYkD?TzkcCL;>O8y z)`=76^m3upLvk=DPBGbz!H7q)jLh;W$8$N0mic>mAi^@16RJ2Nh{@M_%d+8PQf7-( zA%as{jaE-6-2NYjJG)7!gFow?-rix&|n8NO*Rvo9y1to2*`DmY!+FOt-4*e1;a$R!+nmu zPag0d`21(Rfsw(cRk4)|iL_R))&}X%cGKEVYX=NDnB`n1Huf5C_iXv+%VYnR2PE+A zmOai}>w5X;2Wpk_S2Tyi!LFMjR0V4+lPUc7WQdGXB;tC!zD9ZXHlwbv@ur(h5qCrGh`%-$*|2XP#CrHvPs zy-$wk4iMS-TSo5E9Ro|*RJ_S8DPfRv?hf}CCUX4^Ns_)2ZtwE+jP43JNFF8u8r5P6 ziG{h=;XDfLhtsz>YwD!{K)SPyA+sL3VHJ?B^ zxd1D-t+Rwdr^EVth~znIp)j;yNR$P%=n&v%U}bN0sThAFcW{Fd zdx>OWv)>N9NZN=w0~zX|N9k8T%XCDe(l|f^RK=wrRL+iDXPnR@+&YB zqnK=2O6G1yOk^u*A;|GqucE2Cs;Tmwvh2CzSU#VvHtKcuR@1lrnvL&4BG=!dufO1n zv^jcq?20(axMgzX9?|jH>Du_%g>)vB;^)Wm@{gCEn+X$J8Y?};c~>b*ixVPtFRi__ z$#;4GMh0xX2lhy*RMv9ll{ZjI#bDtf=Yc3}s%$G&+|`W|4UD!yUn-M;NFCZm4inWy6qbF>>lv!-qpXi@O$5E z%uFpNFP}UeyY%J>IWaxIqf{)7mUD$K()GtPXqjj^QHsl7nAo`Fg{54UlW!$m-Z11l z%Ov_JHtQWiJ@tAOg zI(g;dd^Vl_sAVKG@gVvfOqkdPxEH}%mVVD0j6GGBf7x3-wnVB?wrX{^ON#V#SO)g( zl)840s-do^HQ;wbRV0dcmT8AIaQY`dLq5JJYR6Sy0FvGL`1DP^1)?!I7uOeZs1;IZ zWYciEUD!vG@PViH!RN7yjzK0&JPHiYR=16e^n`f5^z&cF^vpu~`ngM~v9~@_=B`h6 z6_T0GYNh-fd7n(SoFv7u(+^?D${c%Ty_aLPd(duHHR+UJ#$phs{9_u@} z8zaXKV#kg?IP7K<2@`7rU6U|0(Bb9v*)KhZ`FN^uD=Q*ax~-bnFB2;dfG!nL&u3t%mcX_7k=}On?%jdiNB1J&b5Xq2 zY#?D`eZb06PkYGG)Bc>}sn0!)*;uMFar$EH(%Z+K@wtUyI+ke9B{Bz_wK`|-ax;q@ z?aL51o8S$4r+{s(QA3MMja0dWMyp2HL*)ARBuRQc($($g9o-e;m@EHnK9y?CjbFe}@_EiS{xe!1;qF5ZOqkfRV1f

Vc8oKf>~_Bujm&)9&*G1NLBNn>4t0ht$4n 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

=5 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 S?>rS-yI;@V)%IH9$NvD88&O06 literal 118241 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

fUk~qHxxtFOLK}Nq6l@Pf*FpdbDC8L*RVl`G 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ΜcufoJ$-82yu;vts910sa9&NBC5(WbBI%3 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

DC;Qg2IYczq`kV6(fFB>?!K~At#lb!=K4lkuOvw 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%0A_6ODTVo(ce1&Em=~g9*hOEkjyWy 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 diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.two.imageset/untitled10004Group111@2x.png b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Scene/Welcome/illustration/elephant.three.on.grass.with.tree.two.imageset/untitled10004Group111@2x.png index 6c2b9bb9ce94b06ae1da1cb40ba2ea39e0b9de76..58cc14899ea9d5c5435b35123053aecafdb8a71d 100644 GIT binary patch literal 72699 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

)M5JA&*k6Bb}lt*Vgv1!Xhy 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

5~R+d9Puc!Cp+ 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 literal 120859 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

f5&jIT7%(UuMVs+;rePnR2kC-@& zS*`fsmmiYL3V>B~Xr|o|#Ag58gHwxICs;Tw9+NPu%K=XtRz;c|4dK9o4XYSU;dI_0 znS8&xb2C(2U=?<8mMV*FDzvKP;MhwJpPyJ%ti{Fw%7*VxrX6C*T#+$sgkl}rc6^b(~~H-!dWR5MUkWM-d)-WCe#~`sXG}^$@at!&Nc09vQbi@ zYz$c<9Qph+tcZw+aV8m2qehAIXtDuGGGW(zb~7Q(K1d}B9SO4#P9#|tFMY~m>nh^8y|f@{f!P2 zkS;4iLs~e$M6*k6QGxUz88s4z2Na^i;wCzoqD~86V=qI{D1ZRb29t}KR)adD3Ef@a z6g_1SYt<}z2f8-VzJ7&CHGU5*;3vJ2C>;+%zMo@HUl)~Mjl8`0+RjjP?H!JTtR9bu zXHV}pTRb%6BDI<~Y!ulgsgr%;DE?Ndk;e0k$#b2_mP(Qr98{+DgOEgkYN@Phs-=QZ zf{&A&V%}Ernninq36(rksH|t^n-n%G+GKT3S$+LnMG}sa4_xAimqgGFlBItWO#E7^ zk2S5=v&_Lj*HSbXH9*7ZB-$&g=zOYE#5V)dQo}T$1imBRFxJ>02N^Ab45Wg+Pk1uG z_r`ot8&JfcP^!Au=Y?9AJY5m$A_F)~-r4sczG8KpMoT_jQE(J4!|KOl4p1o5Ms_3k1QW_}2qAq!?KSANo%r-4z|C z1<_!oBdb=%$7NVzUP49W!)`G5jX<+IEh{O|9R(uhreG75Tog+*S-f#Hvs~09;W#~j zx&eFT|Hfl38V=*3KhgN&t6H_XqB6VHR3}edIa$+_xcGTEa|=kR62-ShJKL;e471kE zeDkB;ggW(b`G(R^@MyM839BP16O!ana(`YpXUw*Xh}+ofQ2oL=T7LTtI{WV1)T~tK zsDKE1mnB{_NP+~M=5p{!21s42R--zfmrAup*M9MH+PHR=Ha@;CyyAd8bClKQ4GB-| za%y;P$nTezk@QWoOX{p})b@IWEQl^|Qo2k!kilXcAX^9VOJxvh1fA#Cc^Jld`u(Gi z0i**ND`=!QnDBjW>a^A2O%e;vXzZr)aX^JiqbF`7@@!D1B!`cUiP(umnw0@q-yIOR zhs)=z=ot5V)}XY!oK;Q_K*v!$<>x&9OJ>&J<%|8FOg6W?*!RsOj#O`Mo)iQ`p3nd@ zSUy^TRRO+XjA})&;xzA#BK%R@R9YTcjW+gpAFA@mR9Uot2XP5IdlYPLiJd`lrb+Mq zPyU4JEWg$(Wjad0qCi0}hdoz*2V|GZ!Ztb$!F{5$CUXDZdYfvCOZ2J!Z$)j9TOV8% z>2I&SeVM9=c9+#jp9^%+qFfa_X_U7|Ulr`gMK|J?MC)kR%Cx~M2c-JF-45;Sb*VR* zPytHCQwBGKG>8@oP$Maub7G-zJYJocDi{UZ;Dytms%x>OW3wF`(C)yeJtiM9QU%dW zFYkbzoV%_g8TkR@L#O6n1+~ z$cr96P!)xuPO1;DOdF!9LZMJnwn<_=mnN00xQ+UFqA>*uazQQeS=GSnIOQre&aYB~ zcSfkfdDIKPn)io6Gq!~F8M|C&+tfNWRXlO*1txw9HE3q_EN$PoPUBvOHov$-_nK89 zH>>;zd0WPF951xIi5ISaG%v(RPI!0d!$#3EMR#1pG@y=8kJZo#+PEK}krd8d6eoH7 zMgGOHCf$Ia(m{e0a8<0Smwz_5xMA|V;_6ruV(?`ThKZ7?AvdP zz_fdxj%kBc4yWYNgm>0X!4;FMA+uMG6(UeH@1Q(lOJRU&xpX?3HXasAylJYUH2|N7 z9^dPG{Q(n>@IY;p!U&6BB;q&3awxLno_x;9(slWmJj8<;RPkb-V-+SrP&)!99FuIL zq_Bb#X91-zC*8<^`8SGEo}TtXOhziT+gUkf1QWPH$=iW(MmG$wKPr8 z{f~6V%`A!+sBZ>rlmz`um}m@c-K2nR0LYjZe)3~ldE-?&b7qAs^LV4PE39lZ>vi@g zi=xf^X)70wb0vaA9gkAYpw7L!G-3JLXP;ZCl!W&UVx_)7*U?Ew%-4A^9MkQOzn}zZ zn!MXTyD&%fqI=*@qNfcYxv1Uq;TN}Q%;%!$Iy5)era87+5MS{$*y;`F+S(@l^l#rM zmsPt`vqp<&=f!n@kP4>w`<@L2#-uV^Er^?&&a((?6&om4LXavdY7HqTywT<%1Lr8r ztH!n~p0HF*Ju8SP6^_#hp|%pTSCZtHd@)-|7%s$`b~)}3oPa-BqgWQfm&#)*a-K$@ z*j9vI1ABWSegma_-PsvxpIN4Qt0~g3j<4@hHi?)Ibz?k@_5&uwLa|7-*;(3IT%y6| zx@i2?y=v6f(iaf;&WCpWGvV87wYc1ZCS)VS>>g3`CJD z6ao|3C7Sxg1Q_RQFrLs>r!StPC>APtW|d2y{yb)LSuNAgZ6En~5s3)i6JlBf@j&r3Y!q?sCE+;LNb>QQNf7iBC>@%%688I6 z?E9Kkt7q{X$mf1RDoCOcThQsyWPMHKp}R8;T6pVqS~-7~Jhqd}W3GSkB2D}y-a)GE z85+LzHeLVAf5$uQ0quNom-ZHBL>~wD07aK14hA&VD;6Cp@J@WNwM*mvkmY+{RJ}~} z^rh&3gP>WP&qH&jMfXr46!rxZFVRU_*Pe=S?D6@#wYe?+Z8#>`rGm&@(X@lBMT)Sl zH8G63#@1ITECj@OjQohnM;5;j!wh4_G3|MBzhY^c1)0V#AmKoX08uZ6&o9owlyu;9 z%Wcc)2YRib{qJW?E|&O0cG4)SMB}lF!Z64LL18c;W7%}NfSv-#!SD8HeD|)XA_}sx z{M~QS%G+L=HPy@D%mdA`lpsV>U#KM6Ki z*?9lM&*&Gw`iMe4uX7hyXl7}a+KtNnQtHnNC?yuFQm|PXC5IYihh}(GSV^gR78N}- zUQ0>?iKBdVL520zylT=02H-hX6#QyOL^4T5H<=gip6Gw<}RG0 z=E6Mh1dFmV<{<%R5EfCT-KGhj>%rz44R*TJXA&}8@JTCZU+O<0aWudgM(O{?OpWdo z9Et{G+U6a4e>4$FQ;}W{V3C@ul|&J+?cEM-tZfLT0*f&Shy67fR8yQvYihroZrde&DArjj94`i7tpvRD-(o-B;ya+s7wIZWe)D3j7=?mJ*;071J{5!m zfZP}a6!tn4vW?w3_51PDL()hXRoT$P;G7@-NDwY<_Vq zs|mpqXKA)6c5p946S0#5ldtXdYq!Z~Du%*O_ZW06MOz@NVV30=Q_i#9j5Y39mVT3DIqd7~;Um7{=? zr^{#6O7*N6oCq#8MOtmyGs&|IK6af+NM;R*FgrENp2?IC$^%Yw)%Fw;j;VUos5s(0 zIA*4B$l2q?!XEo)AI4$$FIm1@P2)I8f}rZ}?P*Xu5>^YeJc~p06*-{`bvzz2(dg3n z&TSgqy+={6M;eo*mEZa?U>CE_r9xldgD7 z$p*%3qaZr{V!(QmgyY2n?z)ICOoOjXp9x5;>iT?E20TE#x4;(4!ke$t;-&M{oNZHycQ=NN**H=__U*H8-dkG}&GDRS ziE529*^VviavTGu*Y-VLIQx4&>fG6&nYk9tur07UHzPiSm*x6L(Jo|t1Z*>mnEaw` z{Ae^5-$S330h5uTA5e#%?+!-v#o88q^2IIs^z-X<=k^+Te9mgDY^+{d5yiyJ6A}Y6 z{rHr;Uk*s5X{bUC05P#lP1r_QsMWlzIo`YYoxC;tbPhjBKm#`&>D+wm?V2al9LLbI z_ec^i8jvpQhm*;FPgyB+Uw52uN8_=E7>G2C$naSmV4Fn;$FSJXH1gEW=Uq7&GH4JA zq5;BzN}>)=uH}VUI>YM5Y@;EHYndmk8|#Y(*eW_p*~OU|QS~+C$$iK^_;{4{pdgvB zax4&iMfAMXKO^LOBjWq_Wve** z<$C?zCf&GpLyQ>RRm%mcEzeS|?47uPTP(sD(5{H5;X-O;by%WAbf^`nwon^KS;tzw z1hS5@lwBXwa^fi0eo_Es25IyNq=l-ZtC<2NzDE)-GH`ccb^a$trSb1&>;nFVNe+^V`&5Rio%Q zFP);{^X#(4=LC}^s>ix0*?vp`vZ9s%Phx-b-~BhVbMG#zU?IKo`|r{6g(X^=sguOf zA{M2yL;ACS{-?BYbB!0ynEum$`VZ*re2dP_G`@5VM50r1mU?L9H7Z^-+e<8}JpT0u zpVO~?^9lXizxW#(cLrjIucI=n^PnD%KNzzGtMSn3@*n+><`&zuxH3m|CLE^?)Av0I zVj8iHG@OLA)0@x;|7J3Rbm27XnwA0eFVgIqcpeaH4a&fK7L|EiTBwPdC1$RQN`>Ra z2J|RH3A-rKW*UZ9crrT2*W?T<9tA=HPk(}z&5F)msm6<%W?M`;j7+u@?E%y* zs0q!5)x%%xa6=&*B^nJyV5nQGQh9cU&b<1HXsK?!q>4t!=VY4+7&3EgCWVdmES22j z@t?)+8XkJFM5foJ;pQ5Rha>WNmjzi@J1xP-rxZBHeZ+6{N32T5qGW%;HAR7`hXKoB zkL`qeY`wHA1@c&(Li~sEf(7_O*+KQn7}q5$8eXF&R1S1H#wKN|{8ScZ$Yl%AsTP@N z%u=;l7BK{;6(VJw7j0KDv(!@lT+zn`grmBWTU6W0I=5;HrHU$^YiO#L9!;!AJQ<5Bq97a&Pp-A41v>NED`J6tSu-Qp7NZ>| z94acRRx0FGYg7OsJO+hB5Ds+2EtSc1_h@f4p$Q5vVPfYAY=4lR#Nh*q#eglW2@?+1 z*QvoIyu|mUV;EmK?;sqAUHJI!rkLE5VwO_+A`uQzvs3K!LrQo)aw=D0}M$v_Ech3m-I&8Y>f_T6?R`^0k(<4+YwQ4Mn@yNb@NS6+71bEYXU5c6X z*!3D+{NeX$?(8bniZ4sWfv+M?c~S{{>Thh&cyEt)YgKX@Ej}luW0lKGb917B*xmQv zr@>~2IxQaU2GvT17o~vhiA2DQ$;M8XA44*D$Jk`W57l5FrS`!uNBQ$xU)-dh|MlO~ znKO%YW_5{vaB)=xAKIsMv7MsJ7Rh?APq%hD^soQ)-;mF9hFvey#dlw!Mx#uvT8S6n z=ziJvX+ZglN{FE@Iv7koY6V+ZX=swx9iq`6Y!@aX{fP*)jre=xNt%}vQ|^}?N3D-% zRX(QYSY*y9sR(w3lC(Ng6zRYi4}S)daJ+oLRfZ66n0$ZBe(xqATtG153zk+FbS4~Ir{iFpYZJ*Q>W9TIxCg4WgfgBpJvkW%P(%x=hyGh^_zES6b4MZ zYt*=~LiHLiY>t&TRC}Q2yljmIRbjbk!ot9UUoFH`@l0W}1Uzr-4RoGQ5}}%fEQ25e z4VRWsDf8D5ck{lfW%~3h*P9>^>HYiyR8R#8woO%3R4p>e5LOBw&!cQtNjP3k1o;?D zc6RRaBWj;7GJ#mOT=xts7~kTn(Mwg;;%UxF!tf#!k}6Mt9?NEmIeNVmuA@w2BTCnYu<$G5&Wiwy$0#hLqyC4WC;gRwJg7G}+rr1m> zT_zp6W3!zSkUyM=VAj)EjObKBd8k(p&bN|2@;*W!G15KfXBzlH>aiLyWX0p!-F3c4 z8)Wh1->ej~jEGaT^Pk!Pw~^+0?IvCS^ctCUCQnSR>I*F@6rB4+>SeACgO3w7tEhKD z*?Gfx@x`Vk5})_P=lO)KH(yjaMcTWFFU=@ynklLo%gC;c>A9a?E7MAxW=VeI=Kj(lICy}g_fEtK!^Rrt>) zTicHK9;)d%j>u}!p?EM+5d8o^Ky;HW7+u&fs%Z(i?Qx7FYv-Qjl*6hqStb;A!U;@Ucx^y41|$Mi%X_i_cvI zRrCD-c^vZjqka}?q4lCio&WG3(WjqWrB8Wr{T-jruKZB{^-58sKMVaouWD_ zxW)orFmJL|bmP-6Xm4$sUisFmw0v=euAG?_J8Kz7^i|-TAl3r|XjD8=MqRXwXX1f4 z7$_gZNi3`=!~g~1gRZU*8!eh3soA3@f>sqlG>W$VpqeTVbzl1H;~)u##KTDGfubg4 zhgenrOo`)kqG`Xwm((KLFUxGR6cT@;#)F}v=-n(b8iA&!DaZ!Mhr#v;YB^+< zOU{-vE$)8H<|NEmIK0Kl-X3+gw#arp5ip8sqE9oa#G*GrmeLvV&4k~Fr>h?@=48tB zk)jyqN(^@WYF@(lsNhe=G#QR4;DI*fnx4IfveF z4KT68E)YSWd_9kuXKkX4dxP%|ojEta!dQ`{?s-a_Tw2yGa`x~GrnPr24_)l0@cs*Q~2nf~k zGVV`8HULRDB)$%~>;ivt^BO<_|$+7*a7d6o+uuRR)#1c|{7iG^R>cyu(t-wSzR5BPmV&_CISSN9cwI&L69*nowG zNy-mdrVS+FIAUNT_iRgCYm;&C=IJ6qXG*>Ahor3SR!%|SP zY>Ot7q{d90Zr!;{I!a_4nv5QLN@#foiT=>6mE=8V;y4u>HKC@ZU$#`x1p|ab69Ktu z9xO@+y7wjFka$wScDX&?-u}-ii}^qek4rpec`Tci%8z&zYVuXvOne_-1541A-7J?u zRK;VJV0s}V2vNz22&@>x&T8$WZ_1sY{fzdme?k3jht6ESOqFW&8|zQtRpTV4t2b`Z zaBGtXt0eq;?fH2z4hk%+*je4WdR26s#Bra!c#({>8m}wA&wwOqFj!gDo(O z|J8r`&*(STZ;SCi{`Y@Q>vuQEU^4Q{g;|cG2M%@l*e)-%sp2|^7ND9{;nZlMS*4qNjJOwqQNSCDfF`Vpda{w=Gh@Gc z!51AJH6-DXI0!_*DUZ)6Q$9Xsmi&uUQ3||5SJ-}8;gz$+ zsWwj{reWxYP(83<#pr6AAbp%vX4xV7BSf3D{`2?$|Lpx&kfd3fC59c>T5Aznr506L zqN}TQ&rZ)^b}>7^0=vWlAZ&>j&3L|`Rpns@(A{Jvb&M@mYom1;34I7$)d5G@l2wZ30Z9A zdixR)RnoeVEh1g2!bRdO1mS6Vsd(*Hl7JYZJ{JP?+U564v?faV0(PZ?YAS==UJ4qLonJO(E}gqtj}uU7kM_B{be$jK(0=` zj$WgtzGtE>WVYE=51FHIFvRwHOgQA)h`KQxDH#@8Tbq{x-7M8HlHdU$?6}tvUzF38oi?_vYfyYboK?`p! z8l)}hR<@21AN?0t_M{4Gi$rKr1g<~mqe0R?oDz|PhJhlfk-ENWIj>SW2P)oRtYv1O zIB0}J!$CsIs0;J>=qukhPsiI5li~Dw^ofl%o2U=coJs}4ai{=A{#_a_bvc2R(pi*l z-$U`UJM?bN@T@Mv>i2O0wnL{TpFVdyT`D3?bUE7es*Ri=-N__;i_4gsOMX6CJ_{sM zm;cF^O33f-V(;B|)c0&2ADmQLtkTouCB;)nj(mZ>dwHKEho4_XoCgAMgu_Zv&>sck zkW@J1G-HA!LxOxIV`6m3H9^iI;!AOr621T79o*xyVCZ)dp<=NSk38;A@lDW8z4!HK z2y3)ZgcOv%{{|jp3fM1}aP#Ipg zasLsm7Ls-k)i$5o4wv=mTleawnN>cg4HxDjSc&*?eIbqv@3q?xw(-yY)nBO0GRZKj z@ZKv{>eGUAqsPB1<*QW<1|y$ehYbTN4?=>aVOpm*NwGX=NC|JrikWrK6|%3gR5ZqM z;-C=@4Tk}_&m`K7%BTDYwFy1>Pxq&u9Wk6)Y54*OGOnKFUp3CL#m*D^>t@;5{6UK zr2j(Y!)LKxCWNDhX1Rnuk3n{J62D;)JB163;VH6pUKWH1&a9@f%22^e@6VuN(i6o= z(h-`EBKz5WR2wa9?`Ke0UshEfCD2pVAbrZ)LInwu@OzCmj7esLv`-{haIaWVbw8w^ zlJr{A^WS<>9=j{);N8hD^Lp!rZAhB5{EXa_R5w&A8!b;slkE==K6|OnV`xtcSjjO; zmWolYDI6ye8sX4z7!apldPAG3Y*>tDlkMB4i%DL$9!^P(#UiNC-xjj5`O$|cY;Gwz+qb-g*xDMx@dR8B z`)^hJlztaY%F9x$ONfRj5pL&%@ECMYA3q|I|4qJsX=@X`MpN~%aVKMNiNe8&{bi^s zPlYcO9g`jmQlfB1IyAgo$Rg_?;W&R~4V%CD1T9(^5AHm`?bRg=`0sw+XI3c?_8iOa z%x=k6Ti7qvRBr_y(WBe!YQqwTV1c zj-b1TgN8Jwt5eC;^Zm?r3(OKYZq}BrlL+mqX*dkbf=Rjl8jKujqx4Of?Vcr`L(~JQ zNg;uYp|~Fxzjp~)NuRy_2xZzV&3r}`8?rcEa7cGqo$lEKMY(_$t2ON2xrK5ng~Hu? zl#K1L)1HZ6yN*ySsz`)hH);DUUbv_s*<2p=N(J?78f_kv_{P%UsW0UN&D;3Xsjt5hXhHHm5h;< zx2~bMlfnMScX9L6JLuHvaNEq75BXq~IxWvYNL9lxUeo(5eFa05UDvhJAzjin)X+$$ zG(*RL#DJ30Fm$7&bPU}!(%miHQqtYsARzT|KkxSsu5+DzcCEG7ZpL4|UndrS-p1yv zE+Vn0z%rs#6`h~D>u1TS=8SQX?U^xTH6G)lNGu?#FE&Vx$fnD3s)yij zjsss#+-(=^$Cr;Rjarqt380>{+u|J6(!P@6Gu74Ip|gBNIcJ6PC=D*kj}}W zXqcerh2Y~PGf@a=1#5-GPi+c%1z@`Ii56*R(++FVL@21SPR6gD{w%$878A?{3y7h_p0QRw?w$E^VKs_!>$_j3+?(n+OcyqqX}927=|*-jdRk>0f3 zYP-(cXy5=xDvy`f$YpEZ8*pQzv6G+z8ATDK8G{<6q&^t2)F-=f#LDou$WfuX5}V2X z6F|mO1WiC9GzwO>;8GV;vS^3R;F?+>jeySg8@jJczu~B$#lg|w{=D-!U(bO~K5v4u z{X5(ejr^jjgyNq{?9n{j_3|6>F#RI!%kk$IvfvZ3nQhjpxS+nh?~}&b5~b;Xq4$is zMIASmSA$}4N?$dwJ!h_1#0-oG<8R`3Yzl8{!=} zFrZ(B!2WgZ$}|ZVOkH+z-|?c{NvbR@eO|Zg*qNd+?!+!Wl6-w%rsJRIaC_ zo#CwCtIp`g&WQD=`MjqqPQQESgaYC1 zXR5!e-Z=1Y)c1}^)y{kOSK>D<@v>L4MVV}!d%N9uo8$L;@#k?lDN*uE1=hrbrPhvv zFF$XHdEr~G`qV2IEXzankK191ApWR zbBwTF&t6;V%0yk7UtN^WGLt^sXo5)!?wW8-*2Eeqz#?%qX8K{^{mD5dNrN`~Yis-W zpvUQ@*7=K8JUZ?lO_T&R4jz6Cd8*o5nXLxQd`rL|Go9~WX_Ho<$_+EA|K$iy*?NrS zIt88Wr_e3_F6E!pss=T4#exckQ9MH*JJ$lctbJYPb|>_bJQUVhYl_t6iOd zLeu&79~c#uLle*T^c3iBPebR|MslRPeLYR}_?%&NMuGPWucEyT$_-!*QX#p;LXHmk zS8jA$7I7!kB=>)boL+EdMq7V^!@xhQpyo1To?Oru%cxnIs9`yHihQzW$sdgK34L9k zBQiQn?y}E%+6>7j8HAns`jF@2?c2Vk6TcTCQLi)Nf6GH4vhu#Iz_Fuj<*dMt@ak9^ zK^77Y82rQgkb$#LVgR2y;Zeq`MvEriLi1ejdK6J^i41#zHn)M~1YAs#;6w!^%v@ZZ z*Hr=d?(XjA&tJ1QJ72P&y?HHb|J>eAI`H8c7>06^Nq#FB0Q5}=0;c68N(+hvrzY{S z6OB!?2Is>I!h{Q2l%;y`Bndlm#<8fg!vx)57#3N*m#mKcJ<^9ilIDxt8W#{1lA#RR zvB39HVe#w2_>MSXAz`;|5i(s0iQRX6zR;|G9#}T_q$-qi+*G$RUrnmLGre2l1(v-v z)sMlEWzdBzJ^++`WI0Z(K&qXRy8r5bL2i3`ns4Or<=~LagcZG4YL%qMl9xj4|H6B1 zkhLF=mS94mGNz2#l3a71rjkKanx;^h5h^HvJkD7u<#T#q_Hb}AtW=jp?a-8NEe`ET zwJ_AEG|)a@x_Ay9)ec=v6ulM9OJr`!tF8x_y3wAp4UU{I=2fUfKVYIQZ|UUA(PnQT zP%|jZjxDTAqDVd~=KuTXobfj-mg3;0rn565J=-tRmjAWbhVwY|{*0}Y1Nri`7XW{9 z1`K`WX4&LEylT;CIa4E|!;(jIRVf%iBl*&~mVe6Lyv7y?5?FI9Rnj&+pRWL)^c7l% z7Fkva?T_o`xO;OEM@UIT&7}~zJYdXu;NPnc&^FLykIgT(VJug`T?Y%C6q^Zj@3XM+ z$&zg`?wtDv*ndkjf`id!JeT?G`Q2({j|*!Dwc@HTYCRDsjP?o=T9Yum^ZsX<-}Us5 z3taA9BojTbSPYEj)p9jTOV-uHzT=wHH}Qls~w@c8+h0%c{WZK2ybB$ z`P6>u;rT~6o@@Hg--AZfeJJW;;Q$AJN=SYv+cpn=^_!%*J#_~+b*6*gM5RD)v(Y0! zQeIIYKH>&csA%eD@(@d-#9ez<(SLE=QZS=$|Kkm7+C?N@M;2swx65+-$(Y;NZv(+j znxuvwv%&u+PSJct#hklN7cZARo(7td&u5~ovypscsc^ed*ZYld_-_9k%t1VSe#f<} z-R*6z!W$@%Tyx^cN_43MBmBr@Par#|3#4R?jx;xmw=Q+&ECh|Mf;KV|G$Q3I@~apK ze~o7=24<|iu>!c;xgtmVpHpw4I&?(6-1^_H?@__Atd1=i=O!S*L`l&6yn1)tV-v| zx9DqTiMWU` z3Gu}zpUy=;s)Z-E=be|wf%7Iquu0o_oZx$vkb!n}K(vfWNr9bYeSh;uucic`W4{z| z$^0ow=|`xqqp{)Q8xOtX%NVJA<+O+b+$`JY70NLbxs=Cz`nNXID5 zowL3+_JmsqzA0Scu{wswMbi(IL7G!i)LM?dwyVCQ2NKko6NciZJ6^^R2$)9>K!v4v zLZ%OE@+ZrN=)hdHNYHR(=1SANDOx?2DLpr+>09Jg>Uhf8JU%-3%R@5)5I_{qArj%9 zcD+YhdfJ1ym`U%qCKo{4ZrX+?f$%nlu0cPya{6tQqov?Gw1s`AsrT4FXLygs$h?-v z2FUd=}qP0d&!!w2b?paYAFYcl1P(*nR%yN7})jl@mnwmP{*9lsz&Jk>^ zLe$q<{k(>Iq~7NC;YluEaF7Xk+_FF8kSZ#+#Ur%MX8CUnl)%0ian6d1=DwyI{%$h&yTvBrNpzOkyqtB5I zTAc0=ne*(YhZpk4V{eJ>mlNt2|G1VbQVjRgoSNFe<4ycyuoPfj+syKwLbF4E_2G#4 zuV(qrw1IkaCJ??Utz^}uJDvF1)|almzT>Ce-P6Navo1) z0s9&lzo$Q1r(W+bIlyT6$=FL|3==Z}+@g6@o&d{~Rs$yYK{vZl?@b!0lG4x*G6y3= ztpz5^#gG%#7wDv5VE79cvrWIEl10*G3Etc^W_dt(NHTINpIM^rdQ&$vlVHeok%@z# zvG=(zhy!Yj9Cj6<3rWovl_(a;^^YEsYuhnt2s#l-XSVyf9xk`83W(L!RWJU@Da{be zhIR34q*VmyW;$V~m6)O>204zmyG%Gakj){EX8=YTP8kbn%%x*3N&&DR7xT#g<%c4V z&V|#m5hA@PFOa=k8vv=cJ_X!|DtN^(;e!=es36s_6)csnp7QUMekSPXW5DV5)wye0 zycdhgP0{H-3mnJNG|Kad4S-27^n4`IYSxf&#BQeLS>VPq|9ngv-f9K@TT_=?gsN&GI{FblD998Sz!j?^>M3n=%J0_JElNK8)@ z6@(rhI&aN(|s!0cn)p65O}%z zoVRvJ=XC=#`Bbqn+%IgzZ@<fLXZO2rP+@B2l{Ai3s`ll)!`N4>tv(9i#a5q3} zH)jjVYdPWgI;o9~g&LMxLTk1~6n#V?sn3i}ABH>>0=>8_5pQ|FSF!py`aM@oDt*^rYiA39OJRVzn=c(u6qLCjVIe5LbUf z0DrJAt1$h&*TW+Z%#^A(l8?iL*3W>$qhql&G;A#}A)0$MxZlQ)0wX$)cDvh~Yop{v zlREzi_|w%db06O%xcjL$1jQCZc`+buNQjAqwCGPdrkXlgiZBolAsfuZn1^uVeKh!A zWv}0RJAf$%C!LLr;}wN|rm8lQ3fW;j`~x#l2|oHxu6yl9_PRk73As{_s1DEMEw zi(ivB98NP85F2#{Qx8($ci~T#7I@hu+M;7m_^~~sCL&ISw6X6}&_aif3JM)NqTAr2 zB-=oX#f@yv5oi?y|8no_e4E^A$5Q> z1)%~c4xIFSR|>2rxAH`3iqSoN(1Z<3a^~T|3_g@W1@A6UpQT6<2@iow1*Es2>81xqOW@G&>6ayr1a|;U8M2SgvN?t>{Fk z9Faw^)~M#syHr>&4g0GRm|btkp>Z;p*HDcVGp^F7P&$w!*#ipxudhPrLlHqy>GYW0 zG}vSY7-uIpsm%Bw^I7Pt&q+NdF!3_y$mCDcgTsU{Zg9`;ZBM_f?j{yCVvRzG75d$M zN5vOhJ&wzrG5NbbiF=0&TKCfziRkRd=e0f)!GIeX{5|trxG+t@`ci-%!{7%6SDF6W zk7*;IttNL5wi0z1?l(jolpvWwp`?wc)g{0uJEHVBrh~&-n|)}V4WIUolbi=wjTlCn zb&nk6LDeSeppkuM^Vyw`RNfVeCxo9Y=Y`WJl`3(jmC8!SYblsIffgD<(pRQ79DLyM z+FzbAu65ksU2QS>Q4Y9?lhNhl^(K|fXxB-edieOXVCh=KvmC0|DaDI;50T`^3JFF| zw9EU~pdM_gU2=CV&?%D^WF~^&mtT)%?(YE#e^gDzc%PU>U=(UPCEs`c$PY97tq{Av z@+2nebN!~(-Jy6MJ3p4ZBLlpJ?CYu7MQ2&WaXtnERD^_6Ja;$Xt06jA)-sBNc= z#K~kkSETsTwa3a%eXhl0!mQtrEZnVP$Hxf<7*X#^Ng}Nn-C44*^=`gyu&;vRCH?6l z<(@ubY*+TfEWzI{_@3dDs95S+yt-(;v0~8Zm~LizwrZz)zc^Jk^6QHGz?UcMCpFcw zYpkjE&Z6PExn$VoZ5Y9tQCF^^WrO@-*ZlqXBLFj)ckuk_x{z7hri5nh)cY(?G9o{Ih~~wS zAX{-3C3M05J1ef{0>fmYD}WA9=20@J_|1<^<3#(0_}|uP^PDwR;|Ox70Gx6^oH11c z>i;B(O;Tp|48J8luWcA`1pJ|9(;6}&$9wUnQX+14&E zUR4FCp$Lfvv62_OzLo#3L=U52hu3pJ)FA?v#QtFeeE{0)-{&)BOJQS^J%v$3C#nS|eM!Ly^0D$dgwU9K~{=zT&2R)6ZcIfQXfln6NEu zK|PuUl_o!Y5{z^bE)Nel(E(canK+^bpvlq$lXe9YR9}EWjzuNKJ3y}};xhY(KNjCL zt=nUaQzSRxLU!g#>onS4fi_%y#Y59%og3P0%(sa z!i}6vo?|R9H{0vy2mdWH(8Iis3;D{k44^7k4UMqGZ18z&haXdc)UrFeulY7^k)U1^ zuii`e;2cBWPv48xjHMFHkuvLLa%5iGZ zQ8<(9QnXHyL3Yr3!O*n>P}=)Dds^c_FdAO4V;zbHawGsDbh zDfs>WPSR`pBkGcWKw=$D>(Y&hv+Vt5ou*EaJ;Vsq;X*D;6A_ODa%;vsb@zhh$i!o{ zOA6~!WgAw-eovjj$3psZOK7})(Wt<$4`vPr3j#`|(G*%WbzIp|R({vv>L@)$hZDuU zQD@1thvVb_WsNt!Ma6}iY|vHXVeUpmT*QX|NC(P$^UCc`t4$VbYtZ1uZ6|IoQ~11n z$u++gWe;NOmzD(Ew*@S#zG)t}&uvQ&UfOyMbpdNT-}(h!y_V;HXDAF_X3ev03kEqP zWGh5rg^r(`2R-!%Q@2@1PRfCTd^u<2?&$zKwMyps6X(UNcy&XCALuO~B*3ref$_h1X_V}Rc!oJ!;XWn_yW z^0h0$b5@~75sWiA8@>PG$yq2ott0%p4SOcJ3j7#$gb@Q9?&RI2&LMaA42FVa6Zg%S zVr9twf(6}^)Ibs0L$Up9nCxSLt$(mfQ5t|kO_Q`2fmHQ_==F5J&bVfalHZhlt(x#a zMMd1NYw%gT7Z9!q7OB$*c%#@0T*s%4%t;(FT9w?Q#Ek7+b1xiYb6%Qy)FQYF%uWXA?Z$KX-EY4o7-sOM)`FmLiG+JW)4o7BT-H{Vw_<^y~ zZhy}IIs__&r};gtL~@!|((TzqUYYQF?&6KoNl2v%y;!b##2F@srI#$-yC#nd1PEB9 z20(uMa;>J`=1<+{4aN!gMADhX%jv_N5pbI_WAPmZRLZc z`PBJ$`?O^D6pBkC`}}D|CuhZnSzR9ZZiS|r9j{{a*OZTC7V;eFvKIcI>r322L>-$l z9fiv{PsES37>?W?m}AYhKY0F$;3IVZV0rNbM~$3^v~_&}R40w*j`q{}#J!1ELifnv zkI&yC`Bo~~0}c4kJEGV0CBB&iFq&-vnWoJndaQ3`5c<#i<7rzOa&VBEaUBQT384gA z3-8rBx^q<$d_&sbw zYKGqd-`1X!!idwW90i!l%X52bvbQom!5kYqUxs#l-h;avc%kB#)2tSmD$pRsSt^3WwyD>{MZa>7N)<$Kk2B(AXIR9 zkt)H{E-6;}^vKfq6HVaCrepV)>XPU-6nxbfUCzha0|SgO&?FBCxq^SmvQdBEMYv=r z{aPswYyrBbj0%DLF<_otEj~WcvOA#nvU;T&3I<44(lw&0u0M#=ck= zEe!q&1iJ`la(HECg$Extdc#JUi|sz-XbVxXplfXAxs)JQ6&Zq4+2piSew#IRThuc@ zjO{h3Ol|N@!8g$V^8%bw41A73=RzC0{7ZHmg===$4s3^}d&D=nu{a#9CmzadwWC-o ze;%mEBa>k0amR3UgVF_X_Q3F!EuVpr;`a)@W|zP%6#%^Jb>#E)r3?G| zq7_5hqS?%*zNiLBYtz=b=)0!Yw;ZE!_HST%{ONX!-TSCnvg1*pZ&R%<$)_b#Ihz-c z_iMQue^;SfhnQqz8|oXU5O$KV$Bi*biS=)PGMv;As&g+EYzeBNiW~pFieZ z7A(~fz(1tZNYD3KP@kZidtWucY~b*N3Pw4L33E^&@!_^t>X!{MQ}_7^8kUn#UjVHZ z9bJ!Lao>k@CSGLCz}H9agO~SdK+rD|q*19oq;N41fLl}j?BKiBRP$a-r3L!~`A&My zUw&kFOa%Bytmf^vjqZQ4;k=$~`=27pHQdklAOhu{c$c0Vw@q<5Gx6*R z>c1_jZo3{7{Cx=Q@PncgEY`+TtBnW`)n$j6xyVf?ygBShUb*> zBSY}VgtMLeaM~3I*?Q*5MN5(hN6iJEi+@Uv_Q{Ih*fb3_UPU+$On9}8U1C0;D^-eV zMx-cQ1B7(w%fKKy0MX^vrJCl~9`-Gcjz?h3br9XFybRnHZVLlFz#@TRJvuQ=#ZBv03|KbXri-@qW|^3FSkc*sdfbi zpuw;%pdDf3^d5gGKe0=7y{E64c!jfw-8Ax<$4AO0Kg}PY^CtK`dWa^4pfUN+3xp^L z@ytgB_=7OKIDP1GikN?;t|$=+VZ?+!YAYZD^Zk{#v_8(9 z=o)Mrava$S;3U2NyiVmcLoUm0;3ux{Qste2Hmc;A95)rCYb zKiHVp{LC>S7y>3^b|!3?22`8-trGVKaua=ED&rSH08cDS9_Su#@ulKo-ygfVzAlR` zX$F@j;@=;-T6t<)G1Xgj@fxs$EvxxheW;UB;dEijorR~NuR@Oe?CHWoknDk-o7Rb2 zZ!W-hUIPyYkUvcz@ey?Pzp$7`+A7#Fa^c|IY$C^Jg1`HQT&tsPZ z5;C*3_qz$O@;PCc`(=>W2&?wsUeilkxVkqe)~C(?g{r1lEZWz$ zfte3WMaMf;*Z&MWZZ;X%`irfR0u_`b>EaRff<}sUSaRz!rNlo41P(_|+Y9lU zh-+Q*;78D2FpGw?$DHP=bknwfMJcB$1Jgjd(2O411*+di(aJE;lVMEd@ra$4Jkrg5 z^iwlwVY49cb2%XkN#@W%C;hTF&>85v7~ma@K-KXg0DR+l`?SQoywta zCODd8ghVXTNwGLl7q!LHQ~GRW1UbG;k(>WMuJUY;`^MsCu0n12V;`Y9=eK>P85M=n zxa;Drw2#YuZG1!F_xvq_)ozHjp&*3gZWA5s-Y~g`UBdyTe6-${qCM;}_UTv%pqujM zCfw}SkYd-8st51TnFfvf^3Et^qdKY874=`Y`oe$DTOl@iM2p!shU3KrYx-Fvc|8=U z0VG&wUxDkvZxY}*jPg{3VS9W@4F?ZZ#)C!9vy30EbXMgmpgrHZ80*{s&7VK?8;URz zQrX<}HI>eh5zkQrb@dFT2Ty_r4uS@ZB_;$hX29xGWuSn8=_ZmEaMfjdTb&gJqCQ(6 z{^dOzdlJI9c38NQ0W!Y3DXj-0)m_iC)dlZUwIxl_#?HrAiz2v`86oz>g7IIiZ4}@^ zy&xg$nwp*erUg_YUTgIXL6rfIJ?;ab@IeL;wyNtn7pSEXBh6@p$#6b+2%Hj-U|1N; zjRTb?XcqrFfC@V5#%4N-Qb=(Ng^mVt07VQ2UnLE6BXNnahxCQeaixH>0lg7F>P?;1 zXB!ud_x1=x@@9^TvthwnEM985vD#yJq2EQWBle@@m_-+5qKTstLUs{OVQv>9&;;>+X&RoSDnRVy~kO)T<%1YZgd zyu@v_beSpNqU{j)D1|&DDuW=uD{026S`IbV6$;c<~qAFU^BwS`+ym zOdUD>I;tss^J}ZZ>Bo)M`tO#c;o^h|o&4{<9Da?B4d>5=)LXEn#;WY0U&?uV0H_E4 zLRK;2TOhsLGsKR!Ko&;FQkFA1H;e28jPA4M_BExg`x;!(kmM2LFg4q9UmA099=J5` z8EO`IX7e)-PtRar{CR(^huonfxY404I_lmN$urWVlX9mXPf7Ln3=dK66~O8_SXR*L zj8IebD>x)P-Ft8{sl?5zsIiqxk16PcYk1#A5Mmj$b^OI5Ux9zPG==cSYs8H2p^Pfj z?s*0?gh8L>B2mcq2Y#XGITPGuy=R;%SEYM0Z%ieOm$ zN01%iMyi!BOoO(#$Ps#0X8>WIc67Q01`TgGm0tJtq{V(co3`iIs01sVS_9F*)*L|r z;;XD71aYo3b3Y9oicCIhA{NY9<^R4iQ2q)&OA<#<%#JXgKYE(wsB*FkHCa1wWu88b z5756{l*7j=rl*r_FuNd3mwQ3jRu3?QFMCJ#(v2evKRHr2%S-*!2lfdjL1dhu=&Uw2 zf}K!o+U%Ia0)qwnfiCPB6;^}@YqNM41FGb}@gmg(1@V08)%|isZ5Ei=qT%7*7-M~U zte3=^nS+&}-UQmf!gq*`Rli%@)>jIN&A>KGR}uDAOLg~~wHL#Y#XfUi9x6?O6KHY$ zgrZF@ai0Q03R8_NoBPyX+@1jX3k z2b?0upoE#ta}R9aJzzvKZZSW}ukNSNc-#`eBN_u#+xRktFwh%+8`4an<8n`mfQaD?_j2YmaI-6^%K%Y z3|QuwzZx{5=`K?>QMyqunlYsp0y-P-(O!2zlT^}@@VCxf-g#uB;>S(dG{&{NeFl6P4eKyhN8!3AtjNP{GH| zz;DZqQjxo$l;7oLbS*94zcb6#VMnBk6zwV&%^h-iEDxtm1%T90>vATiu~L1vSrRKM zhov@}EV;;@h?7@%UUtp5re<7yZC{n}GP4hm;-WYMvd!rXul%3nq9U9zSFGNw8%rTq zC?43C;PsWuzX!cxoq2Ox*POa~=R@$bfMT&}>x1s-`Rt+1Q_u}ZOlC_$rB{7kcs3h#f$xGkGfZp)TG7MpR z{=<@nATU9F+SuAZFCHmT>b*}oxa-{xd(F(67qJ?vV=PDc8fBB0rN788yFeyqm)?J% zKd{WTzQ@C^_+t?)+vM=6>4R(kD(EW~BWN}Xc(xHEfr56ElAx*9A#Gn{d$mr>VRy@9 z_Y2yHlJPUnrL0`!F7s<^JxtWTgIF?gC0b;yQi9j46BlhlWx`P|8IG@h%SAd%bwQCq zr~>*JOK-dmvv(GD3H!v65^v*Nl9$hB%|v8zS_Y3xNci@?jtp|%oPK-@omZE%uL)*2 zC@Rz{K?JH;x>#N9yN)|lDvTlN?cY!+YR7VuZRn-D|0#~=O;>qESj1JLd~~{VeLRMG z&mR=LS|Bo*C5L8}0)iUFgH9PbwID3*LDqE*h-R6k@stz5us;~SS|I8WXsh`YH8sKc!k}YM}M{bDN6gwYPtYAl4!LV^0bcZ(fBh_ zPioZ6rByB2JRr~N|y2(u}{;#ClaLyOVCY%5r>2p@iC zM=vw-`_!qZZUL5c>NlH<7d?$hORo7<`cKpg<^Y{LY6NzteB<-9!03?8UZlWk+q>dg zsHVQP1iEA;ra7m()Z-$v&PLhnWTu+|5rxGU`0Fe|mfP=VdFoe8JIV*!e)weL%Nyh2 zlW}R`QAi|XL_`?Iz(=ewJkQydByH90VAR{@H#*$ir9Y4!&jmBa6F}S|$)~*;nsL^} zzS@>0Th7q$*rGQGz8N18qSblA9~%Horj5yaK`JMjqye<0ME$T`44rt0&Bjgjh(nc!=wdQNh-ycjIR5Mh1U-Xkl}@dx{dw41|;gTfoy ztfvp4pS|CJ@}&@+f$hy|MF(QgTVI{Q02V#ql(Y=^yEsU_QUb8?D=hH12Cf!6W+&ge zDpRVdv#m@>s}Y}7=pUP5gFYRb`KtP#*aVrsy;o;kuu=G_RvsYPS!&y8UmteLOCWu+ z&Y;@A8)V87q`(~Tkt-;;o-e4ND{agxN47PZd|Mywtx;-vXvLazw2X>o3Z^${ll0>w zm`65BY|zCND-`wBb&HRtRikgruisG(1bnX&&ivO~@4VYI&pcFBLg-1x$bk;5U1U~+ zIsW<32U5eKrG&77b7-(}i0gl(uhVb5cWWs+Dg3i}>L@%JEtg&TWlq8MFar-;^frJV z^J{j5Ut$5}b)C{qrGbI74x&_G zv)7u8iGXZF&=9w|TY~ZhnbCZNQ$N#f`q73&rF5;`zU3mH9GL#gE5MY$0|S-eQ{x)u ziwS=7lEFUI9cZWnf7gTrr?j9>SqN}EIMlYiYI;Y}tmcsS*6+co#57o7IvSWyya*7O;{Ca|@*p?jLR(V^zTh0^@{4nbKMq33Qwn~RS zxAyG*^7eV=6`5D(*o*tOPepgZRSu#)`G~W)46a)=jPJp|tjh)r>R6Zl7#2EKDVHyC zklMUvL>$FVUrf-w<0HhP`-rI%uyevxpm}Qb?KL4M0lYYU-x3`_A&HHRt~God4q<`X zgQyK6Ss%JQhUwb1{W`VV>>D)^QC6^9GLTxII%?iUBh)xHJ-$UMb|E}l(fVFi?}E{1 zOPn)`&0*3|DA)jci2>>-Y%(DBv$1sYbQJskgGGlGbf4z3sf2Yf&Pd4~#6GhPZ37I} zNlzp6L|lSFx11T*V~qo68hQW=4yiFsJo6Gf*(`V3H{r3A=cwS|n*whRlDSC|j6RU^ z43x8l2?=EVdpXIzznOyPmB$q&Sd0lo@Wzz^v8{Q~eETT+{dZNUeQmkd0N9Q=aYc&` z-9d+}XqT0FM+tapK5_Co)*fdh#M2)bw-_??Dj;dXn6B41#{1W)NDk5QVfn|X?3cY; z*;G-MK5R80@2iX?my-XE;!hKPzh9`&qSPF)1$zOG4(JeXCx6WSPLL*|DtW@Y5!o)H z)P#hjG@=tHbjs5bVHyItA=)CR?g%$z@=V=fuT19{nF~QR$qeh z35r!#p#-ukK7ui|@G`@a0))Je;u3(!!tqlwMxI@6+{rHsrN(kt&`NUYQk3sL(mb5O z=Wd9Jx!|wH;)>kmrnyH3>RhdC7HxIGu8xkC1K<6zs7&Br7_MQn>Ona#8JORiC4Se5 zl0F`D2tQq11J;yowcZ5&0H+F=<$Wx+rMZs@UVrDs&9#q<{ck;glXf;L3Hj<7l8fPYRM`BZ(`Tg zUq*I|)9=d0=Wpe+E}hs08Zy_w!_<)@l_iOO*US}(Fh?Z zkfE46sZy(E7C;fs-iuz7qM8r#hdg2kh}m_n6)KEgNxe$?iC=J5o{OF4=&|Kp@8j7{ zl_{Gj6@+3loinL49?lDT3Me68>toFn&vkEcD=l|{D$!}HiB(17S)B*hyn?(cWNL2T z7_c6-`IntHQ!tgJ?MX^kwEl6tcX1}Tby({^4W%x5&meJj*2nrO?j1@|j`&OaJz(CW zbMXW_MGymr3W!`g{&hJ!BXo{hCMd|$)e4=Xl7znyMx1D9{_{ZFTrW^l#={@qt8s( zZ)Pxc@l{RM1zo=Y9zgWFie%>c%~L$Mt1Nc}q(J0YLlKn-AQ?KlD*lJ@ z^xcJMMXR{DT~1m@ur9z=8@LPzZu)tUT%t$9p7P4Z1G>its*=mazx~9E!Ndd}!So?E z&pf|{`+C}WCj&$4_{MXH!-~9cIH*FkRc2wrI9r^ABw8Y}B^-gd1x`Ai5XwX{o21h$ z;;XQ63iaxb0K#0|Hx;oY<<^vZVQTAnfOZ?5rmEr2t#`!PnldmmY3oYc%dF)c=9ANI z6*${3S)co5PkUPks_^*esaW$`Z#Tiz1e=aFu$piNQ^PfUY|PZ$6_I=>NE0)=|8Kna z{N6>b0F{Z1QYkR%fk#&MFmvNun!JU!2cPWGm)srVOvqq8tf=SA`7ved?7}z(g=DLt z7p^@W)%o&4+KIa&Vk(B8qDM{@6-&E%!tCSES*gNBnZ%BYp<%=DV>bxZscNPmaB!1- zh5M1-lRZIzIERmHu$AdznwO z=ZE9ZZzLWzVxYk?Us=dBfP>RUB($>epbyy@J^0z>yk}2xS;Q*9d=n{Kae-?KSc$Dy znoSl3^6Q&+qU9#PqIeM>AQC4W`7Se`(bQnCxZGr^E74g5+xKFLcP6GvS?E=_ce9jC z&}OmZ=4D%U)myeVmmT#x9gN0Nk8g{DWu}J*#BFye-t;KXNTp@7uu8k>>Iu7Ka zIo&4dewL4IRd`9TrRe>t&L>o0C(LwcQJur1>^1hYWSZ7|!$1?IeOflS0Zf}Nec0t| z*1#WEm|?WJ4_0)H9S!--X>8?+&7qIS)GYe^uJ*x_Ozp*GrYu8N!i@eeni?q`?Q2HL<=JH9>>7|8{gYpV5JY=Sd$^g}nVOnuRTx6-v>RbmVG z4rX%Ac^e`r{%hf4fb|svUC6|6hPazOXb-v&V;*ssj3ohgw2C(0D3~ngo2Zzb$g8Jw zDg#_nz^eg@u$XOm#vvWScl6pJ7R3dJA=lP*--^6kgf61w#B}dT%MyGItC3|@AtrDN z^##Y3y0m-|+}_wjC0aas&=ypo5=Zr%o`ZwGQog;jVDoPp7Q6wC7SFqI&9>{yZ0YQE zMHP-tspk~tc7iU}C8;RbmM#pp?E<&Py-}T&u;|z}zdN(dOig!Omn~G6#hhc%AcpF~ zv!v(u1N}#GdeX2s+dJ*iSDA}HQT%81DkWCIE@Wc*kw)SlO7}SFNF%gnesokhv5tTH z)2sK{sQ>wtzb2LU@7anhR06YhC14+7Hl?ekC4~Jhts7cHr9sNQ%U>-4c zcoFo}LjJOkQ@&>;R{1#|&T&&$ha$A` z^GpT@N&CeihkyW)TK#I4iN<{Z{i2A>SKkHQ&k+HWQHr%v;MHkkc=XGVP4 z-a7%}xQ<5_Wsk}M*{w5_Ir1iP&&RoG2`Cv=%g$GaYs$M@Z|#iHCRI?x(a>T%o~<+K>(p(#db1;aOC? z7mFi1RmqDzD9#(qoYbZl1zqWKz!KhDunmDpkHa1Uhhr!@~E73s0U5tN(lZ}~q z!=v)(ueBz{;4wQX3yIJ(rMM%BD~hjZQvz2%XJxuhr}Io*6UCg6ZIU$mj_)!J=C6<8 z&+5BszJD#JC?X>A5}nHGsFQ7RmUu_Dnod+zGX9JL$WiKJ5407t!;95*ln65UPl!1- z1G{1|e%xPhoXLVhi^MImNLs_)FN(TNu;X#kr;!UKet`s#{6$qU8FLn=mhR3>X$eH- zK$7-z29{3px|RI2<)YpRYqI#+W-jah4_`r`zJ-tRs31f_D)V-wGcP}Dc`v7~!9da{ zrLY^%7pCWL_W4em;vv_uLq+R1@B9W2Z{1S$U>2@k#?tx*F0QS^LuKq`5U$;P9$AjP ztxYVRzkrq1H7xNSl=?F-BjZkDqa;{*$m=RqQ$ltHpHrkA7-jdF7mOwDyl4A(vKn>i6EGuZIMW#!`+tD9;i^#@6bo@NEcJ?DqT*; zq-65}5KK`c#Du^dR6};jc~jeG{SNGA=gOi1%C&V&aZ#O zhc4ocg)J-Jy>7k!)7SNh`6#?@C#{0BO*Uqj#cCMrR_;tWX>x~F+s~rk>7d_iz#Iyz z4xtk0sMj6eg-|9}2~PA-Rq)c%&~w6-3ZD|RDe1Jm(WEYdk&2DcXgsjkj&Fh@bkdW> zYJ<<~L4>_Cq#p3XBlVE(w@mI58>J}A5sfDvmMMr%++DgtyP&K_gt0~b31&weV zZ^)f3%0`&uZA^-Ly=wEg%#qckaq-m)#??!!aB(s}P2FE#6uPOeuA}83WJB7f7q?R? z?m$u$-pVYt zK?3Qd0GU)MHE>8=hmpr1nJkhJ)a&+C=gxr?3*!h-nx1@~lQ&^c`o$Pj)30)&tnQ(9 zwT>4@S&-mpsfa6Tq*$PaL$HZw_jZ@_g0)4w)eNRRaE+nIihF78k>!bbV7ro}_}|OfEgnJ8%`? z$;I5_528^jDz&3it@7`Fm4PG0w~oRlnw>W}K2=qfNQmlJ$*NSL z&1SQB=U0EN>e&RNF>Ji@3N9`#sZ`R_I`0U%98p~E8;r>9Zlg`rZZzn_n~1<*=KXCw zyZv-t6dK_;o|x6!kXG~3lJjrAYAVhn}-I%y`Qk&SPL>{Mi;ADSli zgDlYXTvAH+RsFA948f3%#DkL*ccTqaMGitQ!T?Di7I=;YO@|` z+OO)>LKQ>OY}>t_N}X+!5XnUC^ihp-+Td|cr1+CKX{#!u{492d4MUPU$rO?pj~?wK zS(Kzie3L3dlb^dz#bZdq(dG9B{3@hY`gn*np+5Ul*c#7+4po*W-}BG@&7X0>+(D7* zM!(lp$05bEs=Qy?J*g(!QeBi)Q9P1Vb#FoU_?U!nl=-u_Zr|pi4iTP9V*SEp%!NYg zI;&nMr!YH5rwGSbWxH)Ze1KM~q51{|mgiKFJEzk=v1~Qc@yyT&$MJ*&WJu|9$w>Jj z$5pG#ZuT$54VV7tC)V@p3pxqHGa9u*vEPQ- zfzUbKk7Eq<)33*IN|8lQ{PVWn$c3bb>dp>KHv6R8tKIR`E#_YqW+kItexD+Ck|tZ_ zj^F5Y!@%nh4R}s;ilLBFS)4;8P!VZozrFx-G(<9GSN~Stl@6piI#pil1`yO zGLkLiQD}8gBM}#i#H=hYgL)2x7_~^0vfU2s0S6YB7I9_mq9W*0>Rd8dW>(~B+xUp( zB!Q|sv@Rw7rL?mTC+7|m35VP3)G}6{6WWS({2;Y9q({n6IsTSTuV2&~4Z8Ec`?fW{ zF>g43epz+&G-!cK&jgteg`|m`Z~VJI#)FUUB7J`cd+&aR%xAYyeDH`9@eaak=im+o z;g3dDgC~*D&8FiSkUKY*fT7n$jSEM!m`By)fzjw$y2Yn#c4(@>REGIoqM1Fme$qq`7AmtG2{Q2qNzD!!K1|`E0*vYPGXS(67`+{JS0W`*Z=*0fr!tm?&W)1 zoA|3+pW)8dBiwuU*Qn>S*!u7t+zf``iznf5dEoH*Cf$Lla)?SJ*4S=3jpCpG8HQ9# zq~yH}1Fx}OQi9DE1Y&Wee$4ZAq#)QyCY1)2iDkvL8*k9Uw4<=Sjm(`#;#Vo9&LZ(S zCc~iwvz{hsgyZ-?o=n*$L@}wiah(rq!0NO+J+YuMvKZ4x=3_di!>Y)J#;%_oD!YOc zg+J)U+}a#ve>3{cHX4O8`rPH!(^;NZ1KO1e2AouTBpwcj6Aq_iQfEQ0J6375R+S}U zhsEnv&D2EB7n|s~K*c;*tZI>!%#I-!W3e8jaM|dT1m1n#l+UEB6^qS`xHLASlH;e6 zW1_;-s5VhAR?)82(X7zUsMo2gbzmbAv2hn&sHT~klW88;GvRex5B2S$vzV_dUkvucdbOzUBjeo`QO$X3?YZ#V_ALcs`=b^uIOVV z93F>Fi`#es=v40nGhE!I_+mi}-3}E8(eHLqPvy}mme48{xKpL?E|oMnxf)cR3&XUG z_3=6PGU0dRxJ9PVrC}yHvbep7hQl~6=#M5xwD;MHOGOCE5@svgT&#V?V zpHaWxgIFRAH$SU05`d8ll+-8b)EZQyDyU_1sH9RT?rbBwvqjrw7rUu_?9+O&(iW3S zvL31(&!ZCbc|S{d#b5vHKjG^bRG7t&zxNXa-7a{k+KB?TL{f8UaT&?^C5)-KG-%x{U^M5AUN*Wu?w% zW|az#*e&K0Zu=_Y#*M~awTj&R2b?E*D&5!@537t7tNHk*)gMP_3diw*==N(If0sA! zC5~`xWzG~nx2Qk&J8$YadFdoNULzX^1FK5WbmEQc=TKTopiHU%-Y0jFqSewW(gXkG zGnDQ>g4N@OHyMX-afuRm7+$I#vU@Y?k4K|2X=^V;Lw21~#$6`=CqV`IeFZOjqMTGh z{XG3rYN1GM!02m^U1 z>iRl~$0Djf{wXrKe~3+zjWT!gC8_tqdrA~NJJk?7l`0#*N>x>#)1{gZda0I(5+m1A z;yM2F|JVNmO)ktS+BI7jFC$LXMvmhoFUAsZo(M*csgi=<9I->gOlSb$2=Kz%xE$je9H-AXeq7_27S6o_JKw=4hl0VT%yjs zoIK28uTU-Eeug{GJW6{xw5tu3VIj@Bx|Et*qJB_@?$W2WNPwozp)y0{x)`RVtq=Wk zOuve6FLsI)-YW5!Rplw}Kp&Hgu@H`t>dhhxgfxk>bKx<+cVs%vFLjC{= z#*#{x-6uIL?Phpwb#PE2HB#-cT1*oaREw?qMrefNctETaFURk2oYU#`A&b+di(FhW zBrdHQB0=}0ExAUc4;-pj2EABmdgtLH;E#n+%$2bD$ph?ve3z4T8O29CsO_auqOxHR z`cPh5ht120TY}@F5!fXiRTj~sSV)CXa8VyhMOBiGHhuVg%JrjZP~Vt4&l%~E?==f~ z73<-fTR=1(gO>}?%Oo7LN|yp58%FD->D*bHnC0_IHDFZ{Sn|(EHsrcU3GD_IjZ(FV z{fE1F|9|>(MHIWOma5<3m3WC~#7yG9aP<{c3O~L12%mlQ0WK!z5#>D_|(2deN&_(a7woAk9fB_u=ff z6fu$bfqtilLg*ec;V|qzKb*9QB%RhuiQM7wka#)OJ$DfPy9D5tH#fPnH^T05!0B_r zWt{|Ao^`17VS|nqhfUot5@5Qsx_|-6W49}{JlaYjdR|;xT|uu_L4DB2=KJs9uShyd zym#gTL8U&}pF=(QCK#vcm1=1(^+v?z8=ZXXY)0T-r~MS=dGo|#`0&sE80|t0_y6^8 z(BTFpac&V2TC>TBUlFX6PO@GWw4l+WgKRK_Nkll_;JC`0`noq3viRqthL!JJF~;Yj zI=9QAd_+y%c=?$1QjjblqsagxccV6kopPy}3o_+nE(|8ATB-^jjk&;grkNKl)y}%# z?MxQ^&SasGYL8t>Ddhj8xYF$PUj#krhe64^UaKR$O;34`1Sqx7*By}n*hVFDPKN|WRgf5_AYm*9r+BZAI(%L zkz!TfqU6ZW$ud)|*OA}fM{#!t<9-L>r6l~(ARm>s@-PC z!s420koLT3*|O+$l$~Y3{`RJtaisIGhl{3ErIpt;9YE8++4cU@58uQ6hj+2Rzk`)4 zuOjUAA|R>S2S_fZimC)k*Z9260w)e@aW_u0aU}Dqp=?VXzg84M6k^}!b(3dM6%m}q zE@}8OG=<~nAa|o!DGMC0aJuXj=W%@U5fzIPT2wmxOED@fE|LkmQePypUKVvd?;nXBFi1sAk@NZXl9f~5O4D8` zqf;xRnNE>_n4p(<4h#Kx+AMPHHmV;Mr%M%#GE=qjI2>vxZj-cZ{gWHTiEl3>mCGYf zGF0B#hBqF7%j<;4>(pu&d;@eU<$dz!@e2ml$^tnbOTg#x;o}eAMR{86>mT#=|M2Y} z;q~*Eu$D-u0MZwUvzWzj{Q1WpAeYPXSum(zQc=l_2W*{5_1bcyiEOEa`AAs3&tawB z8m8^*Lwvr4gx~w@QovEPf{vp?4Ojf*YG81Ta2TFACq1w|7VVC zMw2laoR8s^|LE`7ljj!=YjfdA)jw?)cx*6R0HiE*z1c>w(m-Y>jcT?)t0j%%!#(ur z>yCN@wYVFkgDQt-VF6a|^lZKWEexN^EYYhV!bvIVNhXJ3`W}<_k_mh~8mgUBmn1_1 zT6>K;s=M3h(57gUWQbd1r~M-(m#=*P6@-JdL#S{(&4MlpjI@q#P|euM6cmAyQQpa* zU8<^V7wHiqpF=Ojok&EiZqI~7Nw6vZET!P3L#&a~ysA#g&m>BYq)5ux`SmaPIvrIg z>gwPB8P=DRYBE0Qsgf@X*;F2X{?Gp!Lt0+JU<5z>;qPN55m$@qi{kF?9)AAke~LS@ zNYaLLM&L`*8kW3b{@#z&+Q5sUEBJS+&;{WiU{Uh3nVKx54|L7m7 z^xL54V2jXw^xz?Geflwe^XGqt3qSr_SX)}ct7~g;lMo-~Tq(~_wb??3#OIIy>|bK{ z&K;C?c42Yb5xuyA*ripx{_6Qj;Xv(ve+=zR96sc!kQG75#(9nEmsnX_swczH91?=!OtX>aEOjK1-6*Wu+$R03M(L=E-n@v=v~!EF^} z+Nt&w;n1nnS;Hj0!ZaZqqJGGtEq~UjrfieNMU;hEmWj$fk;Y)XNsSGeRBc{2cab5? zT|b8)6@vr`gWd9M9V}H!qBMw?>Zd0<+ z<-OjfYSrv^@PIZ=C7)BNur@BfJ`#@D!jd8!FJlgq`Zs*wR7O@=2nRn`gDT6I%Hd%` zu8-KHG8|X0k!(@9Bw0&8xQ9lrj0V-hz4J?IZjj<=8sV5g+e9Beq_dV}r2Hd}AMnPV zUwZX|A$e)l@ZG=vGhEt5?ryoW+jvuoS2@(NTFu&o`%UPQsO@j2@UQ>LpTHMi zL^82}AHDT9B7Wb2o;%eag`^={Dw9}N@b0}kC~iMe6-BGrtOWQd;%nsnr#BfM2luML z&{=x*Xgsn0h9uu4&8}b&L6Vif{ez#v<8;95e0g20GsO}VqPFa|*{dhw7V8NFU#HO1<-dx~&~ zVlbSguS%gI`5nuo^|{41&5q%{ArbIy2@JJ-E_ELk~NRlBIyp4V%?;s?@q>XOgwkRo8GZS!kxIpNjlVI}NM29Q`EaRkAcpM#DEg z+hr2B9En?(Bu*?hvjkn54}LzFWlBlRgWN-}uC1dqfE=M(P=93)1@^wP>bkf zA=T-o-IJ%~$}O~Ir0lnk3WJjhiDz1Y*ZPvXsM>|#NKke>fpqy6TD2PTR9RZ*&Z(kg zN422OKJ&Txd7x2O*<{&=cTvj}m4aDbh^oeXk_2#;=Xi~994=($m5QQ5IOchiy6i5; z*fST?`B&!j4w2inN_D3K#%UK(DJUkHE;Fc9R3RCh%-g+5DxEYlQ#A`z%BfCuqLlaw zS)|k=f5a2itPX)3i)|(i2Rt~7XmzA_O$U`)6K#^m(X`fy%9NhQ;uxmaPBr{9ObD7R zgx_=-D^$Spl;S1!MF@vfvb8FLckuIp9E&V|GGYNgW&a`CB#u&{Hd869K+q!XvsRl5 z9Epc~J_!oe8H}{aOsdC=#CZ6fE+lE~Ni|gGb2gfLR>*s~g>WR2*#G1vnj{>BOj^|} zaoHV5RDCxyDnA0TZP|;#u@UGB|vR2>pE*93dav(Evhzx9Yv&bJ(YCW*|?mM`B`I?+~ zEKn6P9igHog#4BDbzELvMlF{`?%@OEA3enFUw(|i)pd;KqpG*gS%tR39UkHw7dhVG zj@9B%M9hKZgfY1~2cJapYt=+GXgD?yBGHnHtRxouw>MGEm5`A>C$+Y+7c34p>@kn3 zUt-`QqpG_0d&*YoQc{l}Y_$r(vMsuMMqN~fu?(CvTD`<<0x&+2b)`)b(JxZvu@g$0Gy?O&T zsaUq_H4@1b3M8CniD`1#&TQd3jc~kt=%!gd!4rjsmJaD;Oir8pz{l5*d zCITcEk@ec^_}WEdB;cNu7uE`VY0z+NP^vYN z+DhY-fALo&3Kf{G4lG`O9Y6a1j}Q$6RP2NC3D2#lBh5}nHD9~AxrKB(g}v=f?A`nX zwNwfHHg~)CwpA?^D|ft-=~3CAq)sQVUd9DV@=J-imr}>#G(g2ialHPW@4;cUqnz4D z`u1(yB~jBk-3WQSDp2>RgO#QB$=u2sN;(7n>K{)UK~|}9)#jpb*{rab&t5QxMmSzB z8u-xCh+Qw z*Hw&z!)ALdn|~cdE|*kRS@6y;E?_YnLValwx%CZX@_CeNHI52K!#*vTF3Cm;{Z1El zmlshkP(G?BcH6-=Ry&PIhQp{YERv*M#rAt2(DK^E$e_bgG^U!yDkL%-fet5id$*N0uTtT=niuSPgtE`(wW;aKBXq`G0YIUTyl`9*Ue8dUAjwL(Z5 zG#nqyYE9IORn$0o%`V*j5F&H)*jQenl<$42W@NI^$&kWO@Jl904CQzdyZIdQl`>M9 z3~KyywOHUHR8@6YELIx=u>_n>Cu~~Xl5d5N=P618m|R`Q{>@vcmCNYezlWXuJ&dDK zb?)6$mE))sWXYrM3flBIU?yXZa-w7`Lvi!jGeIsQG4bG~R$8nfxH z{=pASk+2soyH%^Zp+Unjf=XK+4)N(W?3MCpR;nm( z?;@SuM|aSN&SpoD1X1E(j%s74)Gl7jU;N^)__vYjG96i4P&In2XRtA+rf|F*$a$4J z{JR`iIhKuPQ{T6gFeh$YF!|h*mggGT(4gUXK?3?(+=+H-62#eu&F5AP%^U|~~89@Xtw>@M>mc9=CwyLyumV+=7IOzQ4Plf$zJjc^=1WL6RbR&ukx!?D4M zD&$Lqbm7&cKDxeWbULi6Fpw4~szJl?f+*c>sU|8->$-h7!$B3ZVL#yV;?+hIx&3|Q zHaAr^id%Y_Q2B7vCOGQ2gOdbNE~IPm%F+r7*(}nz49X-N>CPr{dpl@yfe%C?h{j`x zN8+k7s+|PI?Q|*9AvJLY_B2xxHyIC3{+3F!TbT?} z4>wWT-htU_K{%O2Vqx)d$#D(O1_=-qV&R`#MCQ(2bm~pC%2ho0#V@h%b>U&i2XAZ+ zcE2AEDjl)p0_K7tguGrPfsIM18bYWKVJ{`r_L5Dn?vl5?*W_|l-^*g{g&ja&>=AwKHt(x6TH zi42DaXT$n9Zbai7iTTN9Iti^?1 z8qi7XM6+5^qupwu+G?OwF45X*pu=-MxmE!U2#A6n8EY~?xEMRwk z7h4bS%fGn1V}?xLDWBlqAQ_5xHllJi)55)hqTL&yvY$h`ScHS}`+OwIO~Z@H?RoC7 zAEi=gLIUfi6o|+Nnz{m z9V#n*RY`W`2d`q0>p&#xS7bwfM!SM*gyUc!caLPHNTBGtPOl3Z^af*aZQdA2gmpfj zM+*egpy32S7AOfGbOn8IR=88$PN7mNpjh;)1w~r3KX06c%1)`*sc_^l?Da@uJa7j? zTmU^PkX)N1ULIz>OY9bl8eZBal6~a%`j97C*rO1V8`18nRFK-69ZN0 zIxU(B;n1tE0=b?;5|Lu5gc6BMwN}GDT4nWoj)XEt1*;Cb*TvySY&nTQz&o+c&M4Us zXoTZnAUShFHoga`xnVNuELO{4?t8B|!;t_2o}=wvs6m59&7H5V z*T?eQ0+q^yN~JVDhqphV+@4MCA+@!szUNIO5nEeBSkw)(MN>cz8A3Wd4hQC<5!|Pm zap(R$y!(s4q{Z?8rJWs=NhGdczX1cU&4axixri{67}};aS$ZUmEt1gU_9p6uJX$0x zb=qaBTPOcLet8X%)j34g=CLv#ejFEamZ1@j7lYhevMt%*c!T42$zJu5)dgex+>&W7 z5rW5QKeK+F1`Q__A?{2;&prFf1!V7RVvnTbFaP|{(0lv)h|uqs=55cSbVw+Hc>Cpa z2F0CiH7EF}Zp7x7;G}9|)`H281akf4I?hMJ@bNm#MQacsXH6URyW%JWg1oIolbQ&@^Z`iLjVW@CDqMKfkD2)7Nul zY~Q_&P&k6_TpM=!@=}3R7OSVpEE!U+uhbi;a@X9c)?l((;GweN^>|^E#YnSLjtp}B zoU~VLR5GL}SiV?Lgz!!_iyX%6vPLHHx#GR&|(zXT85bYU~5}VV8 zz+9A8nb;_9M1vD6U3%|mWMcx2aJ(4AN|9pyZ*pAZP2~;E$8@2Ud41&ElF@0^WKs

x(T`log_tfG@oNRX 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 z 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 B;bH&) From 3e76f436370e6e536e4ea0f46fe69579f50bedcd Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 28 Dec 2022 14:58:57 +0100 Subject: [PATCH 63/94] Add username-suggestion (#690) --- .../Register/MastodonRegisterView.swift | 38 +++++++++++++------ .../TextField/invalid.colorset/Contents.json | 6 +-- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index d8810c3b9..1f5e449d0 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -20,7 +20,7 @@ struct MastodonRegisterView: View { var body: some View { ScrollView(.vertical) { let margin: CGFloat = 16 - VStack(alignment: .leading, spacing: 11) { + VStack(alignment: .leading, spacing: 16) { TextField(L10n.Scene.Register.Input.DisplayName.placeholder.localizedCapitalized, text: $viewModel.name) .textContentType(.name) .disableAutocorrection(true) @@ -41,8 +41,23 @@ struct MastodonRegisterView: View { .modifier(FormTextFieldModifier(validateState: viewModel.usernameValidateState)) .environment(\.layoutDirection, .leftToRight) // force LTR if let errorPrompt = viewModel.usernameErrorPrompt { - Text(errorPrompt) - .modifier(FormFootnoteModifier()) + VStack(alignment: .leading, spacing: 8) { + Text(errorPrompt) + .font(Font(UIFontMetrics(forTextStyle: .caption1).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)))) + //FIXME: Better way than comparing strings + if errorPrompt == L10n.Scene.Register.Error.Reason.taken(L10n.Scene.Register.Error.Item.username) { + Button { + viewModel.usernameErrorPrompt = nil + viewModel.usernameValidateState = .empty + viewModel.username = "amazing_\(viewModel.username)" + } label: { + Text("amazing_\(viewModel.username)") + .foregroundColor(Asset.Colors.Brand.blurple.swiftUIColor) + .font(Font(UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 17, weight: .bold)))) + + } + } + } } TextField(L10n.Scene.Register.Input.Email.placeholder.localizedCapitalized, text: $viewModel.email) .textContentType(.emailAddress) @@ -109,23 +124,23 @@ struct MastodonRegisterView: View { let borderColor: Color = { switch validateState { case .empty: return Color(Asset.Scene.Onboarding.textFieldBackground.color) - case .invalid: return Color(Asset.Colors.TextField.invalid.color) + case .invalid: return Color(Asset.Colors.TextField.invalid.color.withAlphaComponent(0.25)) case .valid: return Color(Asset.Scene.Onboarding.textFieldBackground.color) } }() - Color(Asset.Scene.Onboarding.textFieldBackground.color) + borderColor .cornerRadius(10) content .padding() - .background(Color(Asset.Scene.Onboarding.textFieldBackground.color)) + .background(borderColor) .cornerRadius(10) - .overlay( - RoundedRectangle(cornerRadius: 10) - .stroke(borderColor, lineWidth: 1) - .animation(.easeInOut, value: validateState) - ) +// .overlay( +// RoundedRectangle(cornerRadius: 10) +// .stroke(borderColor, lineWidth: 1) +// .animation(.easeInOut, value: validateState) +// ) } } } @@ -136,7 +151,6 @@ struct MastodonRegisterView: View { content .font(.footnote) .foregroundColor(foregroundColor) - .padding(.horizontal) } } diff --git a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/TextField/invalid.colorset/Contents.json b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/TextField/invalid.colorset/Contents.json index dabccc33e..622f9df33 100644 --- a/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/TextField/invalid.colorset/Contents.json +++ b/MastodonSDK/Sources/MastodonAsset/Assets.xcassets/Colors/TextField/invalid.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.353", - "green" : "0.251", - "red" : "0.875" + "blue" : "0x30", + "green" : "0x3B", + "red" : "0xFF" } }, "idiom" : "universal" From 18e25aea305c1c3f70c4091ad5feb436a5023b47 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 28 Dec 2022 15:03:50 +0100 Subject: [PATCH 64/94] Localize username-suggestion (#690) Please be aware of the username-requirements, when changing the localized versions. --- Localization/app.json | 3 ++- Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift | 4 ++-- .../Sources/MastodonLocalization/Generated/Strings.swift | 4 ++++ .../Resources/Base.lproj/Localizable.strings | 1 + .../Resources/en.lproj/Localizable.strings | 1 + 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 79cb79f00..100562a0a 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -329,7 +329,8 @@ }, "username": { "placeholder": "username", - "duplicate_prompt": "This username is taken." + "duplicate_prompt": "This username is taken.", + "suggestion": "amazing_%@" }, "display_name": { "placeholder": "display name" diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index 1f5e449d0..9c9c2ad1d 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -49,9 +49,9 @@ struct MastodonRegisterView: View { Button { viewModel.usernameErrorPrompt = nil viewModel.usernameValidateState = .empty - viewModel.username = "amazing_\(viewModel.username)" + viewModel.username = L10n.Scene.Register.Input.Username.suggestion(viewModel.username) } label: { - Text("amazing_\(viewModel.username)") + Text(L10n.Scene.Register.Input.Username.suggestion(viewModel.username)) .foregroundColor(Asset.Colors.Brand.blurple.swiftUIColor) .font(Font(UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 17, weight: .bold)))) diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index db3680e92..d9323db45 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1034,6 +1034,10 @@ public enum L10n { public static let duplicatePrompt = L10n.tr("Localizable", "Scene.Register.Input.Username.DuplicatePrompt", fallback: "This username is taken.") /// username public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Username.Placeholder", fallback: "username") + /// amazing_%@ + public static func suggestion(_ p1: Any) -> String { + return L10n.tr("Localizable", "Scene.Register.Input.Username.Suggestion", String(describing: p1), fallback: "amazing_%@") + } } } } diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 5ccc8a4c5..9ba832e19 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -351,6 +351,7 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; +"Scene.Register.Input.Username.Suggestion" = "amazing_%@"; "Scene.Register.Title" = "Create account"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index ebbcfa41c..57113f6e3 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -342,6 +342,7 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; +"Scene.Register.Input.Username.Suggestion" = "amazing_%@"; "Scene.Register.Title" = "Create account"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; From 9e1dbe1dff25a5d6e9a3e504042bd16ba3a409a4 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 28 Dec 2022 15:25:54 +0100 Subject: [PATCH 65/94] Fix email-confirmation-screen-title (#690) what a word. --- .../input/Base.lproj/app.json | 3 +- Localization/app.json | 5 +-- .../MastodonConfirmEmailViewController.swift | 37 +++---------------- .../Generated/Strings.swift | 12 +++--- .../Resources/Base.lproj/Localizable.strings | 5 +-- .../Resources/en.lproj/Localizable.strings | 4 +- 6 files changed, 19 insertions(+), 47 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index 718cb6e81..23180ac89 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -383,8 +383,7 @@ }, "confirm_email": { "title": "One last thing.", - "subtitle": "Tap the link we emailed to you to verify your account.", - "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we emailed to you to verify your account", + "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. We’ll wait right here.", "button": { "open_email_app": "Open Email App", "resend": "Resend" diff --git a/Localization/app.json b/Localization/app.json index 100562a0a..8d4f1b592 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -393,9 +393,8 @@ } }, "confirm_email": { - "title": "One last thing.", - "subtitle": "Tap the link we emailed to you to verify your account.", - "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we emailed to you to verify your account", + "title": "Check Your Inbox", + "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. We’ll wait right here.", "button": { "open_email_app": "Open Email App", "resend": "Resend" diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index 71a1aeb02..561d98310 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -26,19 +26,10 @@ final class MastodonConfirmEmailViewController: UIViewController, NeedsDependenc let stackView = UIStackView() - let largeTitleLabel: UILabel = { - let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: UIFont.systemFont(ofSize: 34, weight: .bold)) - label.textColor = .label - label.text = L10n.Scene.ConfirmEmail.title - return label - }() - private(set) lazy var subtitleLabel: UILabel = { let label = UILabel() - label.font = UIFontMetrics(forTextStyle: .title1).scaledFont(for: UIFont.systemFont(ofSize: 20)) - label.textColor = .secondaryLabel - label.text = L10n.Scene.ConfirmEmail.tapTheLinkWeEmailedToYouToVerifyYourAccount + label.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: UIFont.systemFont(ofSize: 17)) + label.textColor = .label label.numberOfLines = 0 return label }() @@ -57,10 +48,6 @@ final class MastodonConfirmEmailViewController: UIViewController, NeedsDependenc return navigationActionView }() - deinit { - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - } - } extension MastodonConfirmEmailViewController { @@ -68,16 +55,16 @@ extension MastodonConfirmEmailViewController { override func viewDidLoad() { setupOnboardingAppearance() - configureTitleLabel() configureMargin() + subtitleLabel.text = L10n.Scene.ConfirmEmail.tapTheLinkWeEmailedToYouToVerifyYourAccount(viewModel.email) + // stackView stackView.axis = .vertical stackView.distribution = .fill stackView.spacing = 10 stackView.layoutMargins = UIEdgeInsets(top: 10, left: 0, bottom: 23, right: 0) stackView.isLayoutMarginsRelativeArrangement = true - stackView.addArrangedSubview(largeTitleLabel) stackView.addArrangedSubview(subtitleLabel) stackView.addArrangedSubview(emailImageView) emailImageView.setContentHuggingPriority(.defaultLow, for: .vertical) @@ -140,31 +127,19 @@ extension MastodonConfirmEmailViewController { navigationActionView.nextButton.setTitle(L10n.Scene.ConfirmEmail.Button.openEmailApp, for: .normal) navigationActionView.nextButton.addTarget(self, action: #selector(MastodonConfirmEmailViewController.openEmailButtonPressed(_:)), for: .touchUpInside) + + title = L10n.Scene.ConfirmEmail.title } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) - configureTitleLabel() configureMargin() } } extension MastodonConfirmEmailViewController { - private func configureTitleLabel() { - switch traitCollection.horizontalSizeClass { - case .regular: - navigationItem.largeTitleDisplayMode = .always - navigationItem.title = L10n.Scene.ConfirmEmail.title.replacingOccurrences(of: "\n", with: " ") - largeTitleLabel.isHidden = true - default: - navigationItem.largeTitleDisplayMode = .never - navigationItem.title = nil - largeTitleLabel.isHidden = false - } - } - private func configureMargin() { switch traitCollection.horizontalSizeClass { case .regular: diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index d9323db45..54169e31b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -620,12 +620,12 @@ public enum L10n { } } public enum ConfirmEmail { - /// Tap the link we emailed to you to verify your account. - public static let subtitle = L10n.tr("Localizable", "Scene.ConfirmEmail.Subtitle", fallback: "Tap the link we emailed to you to verify your account.") - /// Tap the link we emailed to you to verify your account - public static let tapTheLinkWeEmailedToYouToVerifyYourAccount = L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", fallback: "Tap the link we emailed to you to verify your account") - /// One last thing. - public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.Title", fallback: "One last thing.") + /// Tap the link we sent you to verify %@. We'll wait right here. + public static func tapTheLinkWeEmailedToYouToVerifyYourAccount(_ p1: Any) -> String { + return L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", String(describing: p1), fallback: "Tap the link we sent you to verify %@. We'll wait right here.") + } + /// Check Your Inbox + public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.Title", fallback: "Check Your Inbox") public enum Button { /// Open Email App public static let openEmailApp = L10n.tr("Localizable", "Scene.ConfirmEmail.Button.OpenEmailApp", fallback: "Open Email App") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 9ba832e19..220de5807 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -233,9 +233,8 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.Mail" = "Mail"; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; -"Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we emailed to you to verify your account"; -"Scene.ConfirmEmail.Title" = "One last thing."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; +"Scene.ConfirmEmail.Title" = "Check Your Inbox"; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 57113f6e3..42186cb5b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -228,8 +228,8 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; "Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we emailed to you to verify your account"; -"Scene.ConfirmEmail.Title" = "One last thing."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; +"Scene.ConfirmEmail.Title" = "Check Your Inbox"; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; From a935cd83bbe9f219204b14e76c5916dc62c43208 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Wed, 28 Dec 2022 15:28:09 +0100 Subject: [PATCH 66/94] chore(onboarding): Decrease spacing between title and top of WelcomeViewController --- .../Pages/WelcomeContentViewController.swift | 34 +- .../Welcome/WelcomeViewController.swift | 580 +++++++++--------- 2 files changed, 311 insertions(+), 303 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift index 7bd20d033..a6910a281 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift @@ -8,21 +8,21 @@ import UIKit class WelcomeContentViewController: UIViewController { - - let page: WelcomeContentPage - var contentView: WelcomeContentPageView { - view as! WelcomeContentPageView - } - - init(page: WelcomeContentPage) { - self.page = page - super.init(nibName: nil, bundle: nil) - } - - override func loadView() { - let pageView = WelcomeContentPageView(page: page) - self.view = pageView - } - - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + let page: WelcomeContentPage + var contentView: WelcomeContentPageView { + view as! WelcomeContentPageView + } + + init(page: WelcomeContentPage) { + self.page = page + super.init(nibName: nil, bundle: nil) + } + + override func loadView() { + let pageView = WelcomeContentPageView(page: page) + self.view = pageView + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 2af9fb629..12324ec9c 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -12,222 +12,230 @@ import MastodonCore import MastodonLocalization final class WelcomeViewController: UIViewController, NeedsDependency { - - weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } - weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } - - var disposeBag = Set() - var observations = Set() - private(set) lazy var viewModel = WelcomeViewModel(context: context) - - let welcomeIllustrationView = WelcomeIllustrationView() - - private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) - - let buttonContainer = UIStackView() - - private(set) lazy var signUpButton: PrimaryActionButton = { - let button = PrimaryActionButton() - button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false - button.contentEdgeInsets = WelcomeViewController.actionButtonPadding - button.titleLabel?.adjustsFontForContentSizeCategory = true - button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) - button.setTitle(L10n.Common.Controls.Actions.signUp, for: .normal) - let backgroundImageColor: UIColor = .white - let backgroundImageHighlightedColor: UIColor = UIColor(white: 0.8, alpha: 1.0) - button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) - button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) - button.setTitleColor(.black, for: .normal) - return button - }() - let signUpButtonShadowView = UIView() - - private(set) lazy var signInButton: UIButton = { - let button = UIButton() - button.contentEdgeInsets = WelcomeViewController.actionButtonPadding - button.titleLabel?.adjustsFontForContentSizeCategory = true - button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) - button.setTitle(L10n.Scene.Welcome.logIn, for: .normal) - let titleColor: UIColor = UIColor.white.withAlphaComponent(0.9) - button.setTitleColor(titleColor, for: .normal) - button.setTitleColor(titleColor.withAlphaComponent(0.3), for: .highlighted) - return button - }() - - private(set) lazy var pageViewController: UIPageViewController = { - let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) - pageController.setViewControllers([WelcomeContentViewController(page: .whatIsMastodon)], direction: .forward, animated: false) - return pageController - }() - var currentPage: WelcomeContentPage = .whatIsMastodon - var currentPageOffset = 0 -} - -extension WelcomeViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - definesPresentationContext = true - preferredContentSize = CGSize(width: 547, height: 678) - - navigationController?.navigationBar.prefersLargeTitles = true - view.overrideUserInterfaceStyle = .light - - setupOnboardingAppearance() - - view.addSubview(welcomeIllustrationView) - welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false - - NSLayoutConstraint.activate([ - welcomeIllustrationView.topAnchor.constraint(equalTo: view.topAnchor), - welcomeIllustrationView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - view.trailingAnchor.constraint(equalTo: welcomeIllustrationView.trailingAnchor), - view.bottomAnchor.constraint(equalTo: welcomeIllustrationView.bottomAnchor) - ]) - - buttonContainer.axis = .vertical - buttonContainer.spacing = 12 - buttonContainer.isLayoutMarginsRelativeArrangement = true - - buttonContainer.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(buttonContainer) - NSLayoutConstraint.activate([ - buttonContainer.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), - buttonContainer.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), - view.layoutMarginsGuide.bottomAnchor.constraint(equalTo: buttonContainer.bottomAnchor), - ]) - - signUpButton.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addArrangedSubview(signUpButton) - NSLayoutConstraint.activate([ - signUpButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), - ]) - signInButton.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addArrangedSubview(signInButton) - NSLayoutConstraint.activate([ - signInButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), - ]) - - signUpButtonShadowView.translatesAutoresizingMaskIntoConstraints = false - buttonContainer.addSubview(signUpButtonShadowView) - buttonContainer.sendSubviewToBack(signUpButtonShadowView) - signUpButtonShadowView.pinTo(to: signUpButton) - - signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) - signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) - - pageViewController.delegate = self - pageViewController.dataSource = self - addChild(pageViewController) - pageViewController.view.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(pageViewController.view) - pageViewController.didMove(toParent: self) - - let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } - - for scrollView in scrollviews { - scrollView.delegate = self - } - - NSLayoutConstraint.activate([ - pageViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), - view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), - buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), - ]) - - viewModel.$needsShowDismissEntry - .receive(on: DispatchQueue.main) - .sink { [weak self] needsShowDismissEntry in - guard let self = self else { return } - self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil - } - .store(in: &disposeBag) - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - setupButtonShadowView() - } - - override func viewSafeAreaInsetsDidChange() { - super.viewSafeAreaInsetsDidChange() - - var overlap: CGFloat = 5 - // shift illustration down for non-notch phone - if view.safeAreaInsets.bottom == 0 { - overlap += 56 + private enum Constants { + static let topAnchorInset: CGFloat = 20 } - } - - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) - - view.layoutIfNeeded() - - setupIllustrationLayout() - setupButtonShadowView() - } + + weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } + weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } + + var disposeBag = Set() + var observations = Set() + private(set) lazy var viewModel = WelcomeViewModel(context: context) + + let welcomeIllustrationView = WelcomeIllustrationView() + + private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) + + let buttonContainer = UIStackView() + + private(set) lazy var signUpButton: PrimaryActionButton = { + let button = PrimaryActionButton() + button.adjustsBackgroundImageWhenUserInterfaceStyleChanges = false + button.contentEdgeInsets = WelcomeViewController.actionButtonPadding + button.titleLabel?.adjustsFontForContentSizeCategory = true + button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) + button.setTitle(L10n.Common.Controls.Actions.signUp, for: .normal) + let backgroundImageColor: UIColor = .white + let backgroundImageHighlightedColor: UIColor = UIColor(white: 0.8, alpha: 1.0) + button.setBackgroundImage(.placeholder(color: backgroundImageColor), for: .normal) + button.setBackgroundImage(.placeholder(color: backgroundImageHighlightedColor), for: .highlighted) + button.setTitleColor(.black, for: .normal) + return button + }() + let signUpButtonShadowView = UIView() + + private(set) lazy var signInButton: UIButton = { + let button = UIButton() + button.contentEdgeInsets = WelcomeViewController.actionButtonPadding + button.titleLabel?.adjustsFontForContentSizeCategory = true + button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)) + button.setTitle(L10n.Scene.Welcome.logIn, for: .normal) + let titleColor: UIColor = UIColor.white.withAlphaComponent(0.9) + button.setTitleColor(titleColor, for: .normal) + button.setTitleColor(titleColor.withAlphaComponent(0.3), for: .highlighted) + return button + }() + + private(set) lazy var pageViewController: UIPageViewController = { + let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) + pageController.setViewControllers([WelcomeContentViewController(page: .whatIsMastodon)], direction: .forward, animated: false) + return pageController + }() + var currentPage: WelcomeContentPage = .whatIsMastodon + var currentPageOffset = 0 } extension WelcomeViewController { - - private func setupButtonShadowView() { - signUpButtonShadowView.layer.setupShadow( - color: .black, - alpha: 0.25, - x: 0, - y: 1, - blur: 2, - spread: 0, - roundedRect: signUpButtonShadowView.bounds, - byRoundingCorners: .allCorners, - cornerRadii: CGSize(width: 10, height: 10) - ) - } - - private func updateButtonContainerLayoutMargins(traitCollection: UITraitCollection) { - switch traitCollection.userInterfaceIdiom { - case .phone: - buttonContainer.layoutMargins = UIEdgeInsets( - top: 0, - left: WelcomeViewController.actionButtonMargin, - bottom: WelcomeViewController.viewBottomPaddingHeight, - right: WelcomeViewController.actionButtonMargin - ) - default: - let margin = traitCollection.horizontalSizeClass == .regular ? WelcomeViewController.actionButtonMarginExtend : WelcomeViewController.actionButtonMargin - buttonContainer.layoutMargins = UIEdgeInsets( - top: 0, - left: margin, - bottom: WelcomeViewController.viewBottomPaddingHeightExtend, - right: margin - ) + + override func viewDidLoad() { + super.viewDidLoad() + + definesPresentationContext = true + preferredContentSize = CGSize(width: 547, height: 678) + + navigationController?.navigationBar.prefersLargeTitles = true + view.overrideUserInterfaceStyle = .light + + setupOnboardingAppearance() + + view.addSubview(welcomeIllustrationView) + welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + welcomeIllustrationView.topAnchor.constraint(equalTo: view.topAnchor), + welcomeIllustrationView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: welcomeIllustrationView.trailingAnchor), + view.bottomAnchor.constraint(equalTo: welcomeIllustrationView.bottomAnchor) + ]) + + buttonContainer.axis = .vertical + buttonContainer.spacing = 12 + buttonContainer.isLayoutMarginsRelativeArrangement = true + + buttonContainer.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(buttonContainer) + NSLayoutConstraint.activate([ + buttonContainer.leadingAnchor.constraint(equalTo: view.readableContentGuide.leadingAnchor), + buttonContainer.trailingAnchor.constraint(equalTo: view.readableContentGuide.trailingAnchor), + view.layoutMarginsGuide.bottomAnchor.constraint(equalTo: buttonContainer.bottomAnchor), + ]) + + signUpButton.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addArrangedSubview(signUpButton) + NSLayoutConstraint.activate([ + signUpButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), + ]) + signInButton.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addArrangedSubview(signInButton) + NSLayoutConstraint.activate([ + signInButton.heightAnchor.constraint(greaterThanOrEqualToConstant: WelcomeViewController.actionButtonHeight).priority(.required - 1), + ]) + + signUpButtonShadowView.translatesAutoresizingMaskIntoConstraints = false + buttonContainer.addSubview(signUpButtonShadowView) + buttonContainer.sendSubviewToBack(signUpButtonShadowView) + signUpButtonShadowView.pinTo(to: signUpButton) + + signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) + signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) + + pageViewController.delegate = self + pageViewController.dataSource = self + addChild(pageViewController) + pageViewController.view.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(pageViewController.view) + pageViewController.didMove(toParent: self) + + let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } + + for scrollView in scrollviews { + scrollView.delegate = self + } + + NSLayoutConstraint.activate([ + pageViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), + pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), + buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), + ]) + + viewModel.$needsShowDismissEntry + .receive(on: DispatchQueue.main) + .sink { [weak self] needsShowDismissEntry in + guard let self = self else { return } + self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil + } + .store(in: &disposeBag) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + setupButtonShadowView() + } + + override func viewSafeAreaInsetsDidChange() { + super.viewSafeAreaInsetsDidChange() + + var overlap: CGFloat = 5 + // shift illustration down for non-notch phone + if view.safeAreaInsets.bottom == 0 { + overlap += 56 + } + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + view.layoutIfNeeded() + + setupIllustrationLayout() + setupButtonShadowView() + } + + private var computedTopAnchorInset: CGFloat { + (navigationController?.navigationBar.bounds.height ?? UINavigationBar().bounds.height) + Constants.topAnchorInset } - } - - private func setupIllustrationLayout() { - welcomeIllustrationView.setup() - } } extension WelcomeViewController { - @objc - private func signUpButtonDidClicked(_ sender: UIButton) { - _ = coordinator.present(scene: .mastodonPickServer(viewMode: MastodonPickServerViewModel(context: context)), from: self, transition: .show) - } + + private func setupButtonShadowView() { + signUpButtonShadowView.layer.setupShadow( + color: .black, + alpha: 0.25, + x: 0, + y: 1, + blur: 2, + spread: 0, + roundedRect: signUpButtonShadowView.bounds, + byRoundingCorners: .allCorners, + cornerRadii: CGSize(width: 10, height: 10) + ) + } + + private func updateButtonContainerLayoutMargins(traitCollection: UITraitCollection) { + switch traitCollection.userInterfaceIdiom { + case .phone: + buttonContainer.layoutMargins = UIEdgeInsets( + top: 0, + left: WelcomeViewController.actionButtonMargin, + bottom: WelcomeViewController.viewBottomPaddingHeight, + right: WelcomeViewController.actionButtonMargin + ) + default: + let margin = traitCollection.horizontalSizeClass == .regular ? WelcomeViewController.actionButtonMarginExtend : WelcomeViewController.actionButtonMargin + buttonContainer.layoutMargins = UIEdgeInsets( + top: 0, + left: margin, + bottom: WelcomeViewController.viewBottomPaddingHeightExtend, + right: margin + ) + } + } + + private func setupIllustrationLayout() { + welcomeIllustrationView.setup() + } +} - @objc - private func signInButtonDidClicked(_ sender: UIButton) { - _ = coordinator.present(scene: .mastodonLogin, from: self, transition: .show) - } - - @objc - private func dismissBarButtonItemDidPressed(_ sender: UIButton) { - dismiss(animated: true, completion: nil) - } +extension WelcomeViewController { + @objc + private func signUpButtonDidClicked(_ sender: UIButton) { + _ = coordinator.present(scene: .mastodonPickServer(viewMode: MastodonPickServerViewModel(context: context)), from: self, transition: .show) + } + + @objc + private func signInButtonDidClicked(_ sender: UIButton) { + _ = coordinator.present(scene: .mastodonLogin, from: self, transition: .show) + } + + @objc + private func dismissBarButtonItemDidPressed(_ sender: UIButton) { + dismiss(animated: true, completion: nil) + } } // MARK: - OnboardingViewControllerAppearance @@ -245,104 +253,104 @@ extension WelcomeViewController: OnboardingViewControllerAppearance { // MARK: - UIAdaptivePresentationControllerDelegate extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { - - func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { - - // update button layout - updateButtonContainerLayoutMargins(traitCollection: traitCollection) - - let navigationController = navigationController as? OnboardingNavigationController - - switch traitCollection.userInterfaceIdiom { - case .phone: - navigationController?.gradientBorderView.isHidden = true - // make underneath view controller alive to fix layout issue due to view life cycle - return .fullScreen - default: - switch traitCollection.horizontalSizeClass { - case .compact: + + func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { + + // update button layout + updateButtonContainerLayoutMargins(traitCollection: traitCollection) + + let navigationController = navigationController as? OnboardingNavigationController + + switch traitCollection.userInterfaceIdiom { + case .phone: navigationController?.gradientBorderView.isHidden = true + // make underneath view controller alive to fix layout issue due to view life cycle return .fullScreen - default: - navigationController?.gradientBorderView.isHidden = false - return .formSheet + default: + switch traitCollection.horizontalSizeClass { + case .compact: + navigationController?.gradientBorderView.isHidden = true + return .fullScreen + default: + navigationController?.gradientBorderView.isHidden = false + return .formSheet + } } } - } - - func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { - return nil - } - - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } + + func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { + return nil + } + + func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { + return false + } } //MARK: - UIPageViewControllerDelegate extension WelcomeViewController: UIPageViewControllerDelegate { - func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { - guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } - - currentPage = currentViewController.page - - if let pageIndex = WelcomeContentPage.allCases.firstIndex(of: currentPage) { - let offset = Int(pageIndex) * Int(pageViewController.view.frame.width) - currentPageOffset = offset - welcomeIllustrationView.update(contentOffset: CGFloat(offset)) + func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } + + currentPage = currentViewController.page + + if let pageIndex = WelcomeContentPage.allCases.firstIndex(of: currentPage) { + let offset = Int(pageIndex) * Int(pageViewController.view.frame.width) + currentPageOffset = offset + welcomeIllustrationView.update(contentOffset: CGFloat(offset)) + } } - } } //MARK: - UIPageViewDataSource extension WelcomeViewController: UIPageViewControllerDataSource { - - func presentationIndex(for pageViewController: UIPageViewController) -> Int { - WelcomeContentPage.allCases.firstIndex(of: currentPage) ?? 0 - } - - func presentationCount(for pageViewController: UIPageViewController) -> Int { - return WelcomeContentPage.allCases.count - } - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { - guard let viewController = viewController as? WelcomeContentViewController else { return nil } - - let currentPage = viewController.page - - switch currentPage { - case .whatIsMastodon: - return nil - case .mastodonIsLikeThat: - return WelcomeContentViewController(page: .whatIsMastodon) - case .howDoIPickAServer: - return WelcomeContentViewController(page: .mastodonIsLikeThat) + + func presentationIndex(for pageViewController: UIPageViewController) -> Int { + WelcomeContentPage.allCases.firstIndex(of: currentPage) ?? 0 } - } - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { - guard let viewController = viewController as? WelcomeContentViewController else { return nil } - - let currentPage = viewController.page - - switch currentPage { - case .whatIsMastodon: - return WelcomeContentViewController(page: .mastodonIsLikeThat) - case .mastodonIsLikeThat: - return WelcomeContentViewController(page: .howDoIPickAServer) - case .howDoIPickAServer: - return nil + + func presentationCount(for pageViewController: UIPageViewController) -> Int { + return WelcomeContentPage.allCases.count + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { + guard let viewController = viewController as? WelcomeContentViewController else { return nil } + + let currentPage = viewController.page + + switch currentPage { + case .whatIsMastodon: + return nil + case .mastodonIsLikeThat: + return WelcomeContentViewController(page: .whatIsMastodon) + case .howDoIPickAServer: + return WelcomeContentViewController(page: .mastodonIsLikeThat) + } + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { + guard let viewController = viewController as? WelcomeContentViewController else { return nil } + + let currentPage = viewController.page + + switch currentPage { + case .whatIsMastodon: + return WelcomeContentViewController(page: .mastodonIsLikeThat) + case .mastodonIsLikeThat: + return WelcomeContentViewController(page: .howDoIPickAServer) + case .howDoIPickAServer: + return nil + } } - } } extension WelcomeViewController: UIScrollViewDelegate { - func scrollViewDidScroll(_ scrollView: UIScrollView) { - let weirdScrollViewJumpingCorrectionFactor = pageViewController.view.frame.width - let contentOffset = CGFloat(currentPageOffset) + scrollView.contentOffset.x - weirdScrollViewJumpingCorrectionFactor - - welcomeIllustrationView.update(contentOffset: contentOffset) - } + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let weirdScrollViewJumpingCorrectionFactor = pageViewController.view.frame.width + let contentOffset = CGFloat(currentPageOffset) + scrollView.contentOffset.x - weirdScrollViewJumpingCorrectionFactor + + welcomeIllustrationView.update(contentOffset: contentOffset) + } } From 2be1cabca7fd521542ec71348e1c51f9db5820ca Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 28 Dec 2022 15:53:06 +0100 Subject: [PATCH 67/94] Remove navigation-view on email-confirmation (#690) --- Localization/app.json | 1 - .../MastodonConfirmEmailViewController.swift | 51 ------------------- .../Resources/Base.lproj/Localizable.strings | 1 - 3 files changed, 53 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 8d4f1b592..5ebc02a8e 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -396,7 +396,6 @@ "title": "Check Your Inbox", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. We’ll wait right here.", "button": { - "open_email_app": "Open Email App", "resend": "Resend" }, "dont_receive_email": { diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index 561d98310..40d8bd04e 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -41,13 +41,6 @@ final class MastodonConfirmEmailViewController: UIViewController, NeedsDependenc imageView.contentMode = .scaleAspectFit return imageView }() - - let navigationActionView: NavigationActionView = { - let navigationActionView = NavigationActionView() - navigationActionView.backgroundColor = Asset.Scene.Onboarding.background.color - return navigationActionView - }() - } extension MastodonConfirmEmailViewController { @@ -69,7 +62,6 @@ extension MastodonConfirmEmailViewController { stackView.addArrangedSubview(emailImageView) emailImageView.setContentHuggingPriority(.defaultLow, for: .vertical) emailImageView.setContentCompressionResistancePriority(.defaultLow, for: .vertical) - stackView.addArrangedSubview(navigationActionView) view.addSubview(stackView) stackView.translatesAutoresizingMaskIntoConstraints = false @@ -121,13 +113,6 @@ extension MastodonConfirmEmailViewController { } .store(in: &self.disposeBag) - - navigationActionView.backButton.setTitle(L10n.Scene.ConfirmEmail.Button.resend, for: .normal) - navigationActionView.backButton.addTarget(self, action: #selector(MastodonConfirmEmailViewController.resendButtonPressed(_:)), for: .touchUpInside) - - navigationActionView.nextButton.setTitle(L10n.Scene.ConfirmEmail.Button.openEmailApp, for: .normal) - navigationActionView.nextButton.addTarget(self, action: #selector(MastodonConfirmEmailViewController.openEmailButtonPressed(_:)), for: .touchUpInside) - title = L10n.Scene.ConfirmEmail.title } @@ -152,19 +137,6 @@ extension MastodonConfirmEmailViewController { } extension MastodonConfirmEmailViewController { - @objc private func openEmailButtonPressed(_ sender: UIButton) { - let alertController = UIAlertController(title: L10n.Scene.ConfirmEmail.OpenEmailApp.title, message: L10n.Scene.ConfirmEmail.OpenEmailApp.description, preferredStyle: .alert) - let openEmailAction = UIAlertAction(title: L10n.Scene.ConfirmEmail.Button.openEmailApp, style: .default) { [weak self] _ in - guard let self = self else { return } - self.showEmailAppAlert() - } - let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .cancel, handler: nil) - alertController.addAction(openEmailAction) - alertController.addAction(cancelAction) - alertController.preferredAction = openEmailAction - _ = self.coordinator.present(scene: .alertController(alertController: alertController), from: self, transition: .alertController(animated: true, completion: nil)) - } - @objc private func resendButtonPressed(_ sender: UIButton) { let alertController = UIAlertController(title: L10n.Scene.ConfirmEmail.DontReceiveEmail.title, message: L10n.Scene.ConfirmEmail.DontReceiveEmail.description, preferredStyle: .alert) let resendAction = UIAlertAction(title: L10n.Scene.ConfirmEmail.DontReceiveEmail.resendEmail, style: .default) { _ in @@ -178,29 +150,6 @@ extension MastodonConfirmEmailViewController { alertController.addAction(okAction) _ = self.coordinator.present(scene: .alertController(alertController: alertController), from: self, transition: .alertController(animated: true, completion: nil)) } - - func showEmailAppAlert() { - let clients = ThirdPartyMailClient.clients - let availableClients = clients.filter { client -> Bool in - ThirdPartyMailer.isMailClientAvailable(client) - } - let alertController = UIAlertController(title: L10n.Scene.ConfirmEmail.OpenEmailApp.openEmailClient, message: nil, preferredStyle: .alert) - - let alertAction = UIAlertAction(title: L10n.Scene.ConfirmEmail.OpenEmailApp.mail, style: .default) { _ in - UIApplication.shared.open(URL(string: "message://")!, options: [:], completionHandler: nil) - } - alertController.addAction(alertAction) - _ = availableClients.compactMap { client -> UIAlertAction in - let alertAction = UIAlertAction(title: client.name, style: .default) { _ in - ThirdPartyMailer.open(client, completionHandler: nil) - } - alertController.addAction(alertAction) - return alertAction - } - let cancelAction = UIAlertAction(title: L10n.Common.Controls.Actions.cancel, style: .cancel, handler: nil) - alertController.addAction(cancelAction) - _ = self.coordinator.present(scene: .alertController(alertController: alertController), from: self, transition: .alertController(animated: true, completion: nil)) - } } // MARK: - PanPopableViewController diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 220de5807..a858ac7d4 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -224,7 +224,6 @@ uploaded to Mastodon."; "Scene.Compose.Visibility.Private" = "Followers only"; "Scene.Compose.Visibility.Public" = "Public"; "Scene.Compose.Visibility.Unlisted" = "Unlisted"; -"Scene.ConfirmEmail.Button.OpenEmailApp" = "Open Email App"; "Scene.ConfirmEmail.Button.Resend" = "Resend"; "Scene.ConfirmEmail.DontReceiveEmail.Description" = "Check if your email address is correct as well as your junk folder if you haven’t."; "Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Resend Email"; From 1f7298c6b9ed7561d01e4a0bad114d1624f3a378 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 29 Dec 2022 12:55:12 +0100 Subject: [PATCH 68/94] Fix eh wrong eh translation? --- .../MastodonLocalization/Resources/en.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 42186cb5b..53922ac0b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -285,7 +285,7 @@ uploaded to Mastodon."; "Scene.Profile.Dashboard.Following" = "following"; "Scene.Profile.Dashboard.Posts" = "posts"; "Scene.Profile.Fields.AddRow" = "Add Row"; -"Scene.Profile.Fields.Joined" = "Liitytty"; +"Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Content"; "Scene.Profile.Fields.Placeholder.Label" = "Label"; "Scene.Profile.Fields.Verified.Long" = "Ownership of this link was checked on %@"; From de87424f53daea13f086f7d37137ec41261859c8 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 29 Dec 2022 12:56:06 +0100 Subject: [PATCH 69/94] Add button to resend email (#690) Make it work (<- we're here) Make it right Make it fast --- .../MastodonConfirmEmailViewController.swift | 53 ++++++++++++++++++- .../Generated/Strings.swift | 2 - 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index 40d8bd04e..bf8f222fb 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -41,6 +41,19 @@ final class MastodonConfirmEmailViewController: UIViewController, NeedsDependenc imageView.contentMode = .scaleAspectFit return imageView }() + + let resendEmailButton: UIButton = { + var buttonConfiguration = UIButton.Configuration.plain() + buttonConfiguration.attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend (10)**") + + let button = UIButton(configuration: buttonConfiguration) + button.translatesAutoresizingMaskIntoConstraints = false + button.isEnabled = false + + return button + }() + + var resendButtonTimer: Timer? } extension MastodonConfirmEmailViewController { @@ -52,6 +65,8 @@ extension MastodonConfirmEmailViewController { subtitleLabel.text = L10n.Scene.ConfirmEmail.tapTheLinkWeEmailedToYouToVerifyYourAccount(viewModel.email) + resendEmailButton.addTarget(self, action: #selector(MastodonConfirmEmailViewController.resendButtonPressed(_:)), for: .touchUpInside) + // stackView stackView.axis = .vertical stackView.distribution = .fill @@ -60,6 +75,7 @@ extension MastodonConfirmEmailViewController { stackView.isLayoutMarginsRelativeArrangement = true stackView.addArrangedSubview(subtitleLabel) stackView.addArrangedSubview(emailImageView) + stackView.addArrangedSubview(resendEmailButton) emailImageView.setContentHuggingPriority(.defaultLow, for: .vertical) emailImageView.setContentCompressionResistancePriority(.defaultLow, for: .vertical) @@ -121,7 +137,42 @@ extension MastodonConfirmEmailViewController { configureMargin() } - + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + // start timer + let nowIn60Seconds = Date().addingTimeInterval(10) + + let timer = Timer(timeInterval: 1.0, repeats: true) { [weak self] in + guard Date() < nowIn60Seconds else { + // enable button + self?.resendEmailButton.isEnabled = true + + var configuration = self?.resendEmailButton.configuration + let attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend**") + + configuration?.attributedTitle = attributedTitle + self?.resendEmailButton.configuration = configuration + self?.resendEmailButton.setNeedsUpdateConfiguration() + + $0.invalidate() + return + } + + //TODO: @zeitschlag Add localization + //TODO: @zeitschlag Add styling + var configuration = self?.resendEmailButton.configuration + let attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend (\(Int(nowIn60Seconds.timeIntervalSinceNow) + 1))**") + + configuration?.attributedTitle = attributedTitle + self?.resendEmailButton.configuration = configuration + self?.resendEmailButton.setNeedsUpdateConfiguration() + } + + RunLoop.main.add(timer, forMode: .default) +// self.resendButtonTimer = timer + } } extension MastodonConfirmEmailViewController { diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 54169e31b..71deccbc3 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -627,8 +627,6 @@ public enum L10n { /// Check Your Inbox public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.Title", fallback: "Check Your Inbox") public enum Button { - /// Open Email App - public static let openEmailApp = L10n.tr("Localizable", "Scene.ConfirmEmail.Button.OpenEmailApp", fallback: "Open Email App") /// Resend public static let resend = L10n.tr("Localizable", "Scene.ConfirmEmail.Button.Resend", fallback: "Resend") } From ade95302ca1111e335fc5d095d2ef2d32876ccde Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 29 Dec 2022 22:35:21 +0100 Subject: [PATCH 70/94] Localize and style resend-button (#690) --- Localization/app.json | 5 +++ .../MastodonConfirmEmailViewController.swift | 35 ++++++++++++++----- .../Generated/Strings.swift | 10 ++++++ .../Resources/Base.lproj/Localizable.strings | 3 ++ .../Resources/en.lproj/Localizable.strings | 3 ++ 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 5ebc02a8e..c277a3127 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -408,6 +408,11 @@ "description": "We just sent you an email. Check your junk folder if you haven’t.", "mail": "Mail", "open_email_client": "Open Email Client" + }, + "didnt_get_link": { + "prefix": "Didn't get a Link?", + "resend_in": "Resend (%@)", + "resend_now": "Resend now." } }, "home_timeline": { diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index bf8f222fb..411c0eddb 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -43,8 +43,18 @@ final class MastodonConfirmEmailViewController: UIViewController, NeedsDependenc }() let resendEmailButton: UIButton = { + + let boldFont = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 15, weight: .bold)) + let regularFont = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 15, weight: .regular)) + var buttonConfiguration = UIButton.Configuration.plain() - buttonConfiguration.attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend (10)**") + var boldResendString = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.resendIn(60), attributes: .init([.font: boldFont])) + var attributedTitle = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.prefix, attributes: .init([.font: regularFont])) + + attributedTitle.append(AttributedString(" ")) + attributedTitle.append(boldResendString) + + buttonConfiguration.attributedTitle = attributedTitle let button = UIButton(configuration: buttonConfiguration) button.translatesAutoresizingMaskIntoConstraints = false @@ -141,16 +151,21 @@ extension MastodonConfirmEmailViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - // start timer - let nowIn60Seconds = Date().addingTimeInterval(10) + let nowIn60Seconds = Date().addingTimeInterval(60) + let boldFont = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 15, weight: .bold)) + let regularFont = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 15, weight: .regular)) let timer = Timer(timeInterval: 1.0, repeats: true) { [weak self] in guard Date() < nowIn60Seconds else { - // enable button self?.resendEmailButton.isEnabled = true var configuration = self?.resendEmailButton.configuration - let attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend**") + + let boldResendString = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.resendNow, attributes: .init([.font: boldFont])) + var attributedTitle = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.prefix, attributes: .init([.font: regularFont])) + + attributedTitle.append(AttributedString(" ")) + attributedTitle.append(boldResendString) configuration?.attributedTitle = attributedTitle self?.resendEmailButton.configuration = configuration @@ -160,10 +175,13 @@ extension MastodonConfirmEmailViewController { return } - //TODO: @zeitschlag Add localization - //TODO: @zeitschlag Add styling var configuration = self?.resendEmailButton.configuration - let attributedTitle = try! AttributedString(markdown: "Didn't get a link? **Resend (\(Int(nowIn60Seconds.timeIntervalSinceNow) + 1))**") + + let boldResendString = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.resendIn(Int(nowIn60Seconds.timeIntervalSinceNow) + 1), attributes: .init([.font: boldFont])) + var attributedTitle = AttributedString(L10n.Scene.ConfirmEmail.DidntGetLink.prefix, attributes: .init([.font: regularFont])) + + attributedTitle.append(AttributedString(" ")) + attributedTitle.append(boldResendString) configuration?.attributedTitle = attributedTitle self?.resendEmailButton.configuration = configuration @@ -171,7 +189,6 @@ extension MastodonConfirmEmailViewController { } RunLoop.main.add(timer, forMode: .default) -// self.resendButtonTimer = timer } } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 71deccbc3..cd143b57e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -630,6 +630,16 @@ public enum L10n { /// Resend public static let resend = L10n.tr("Localizable", "Scene.ConfirmEmail.Button.Resend", fallback: "Resend") } + public enum DidntGetLink { + /// Didn't get a Link? + public static let `prefix` = L10n.tr("Localizable", "Scene.ConfirmEmail.DidntGetLink.Prefix", fallback: "Didn't get a Link?") + /// Resend (%@) + public static func resendIn(_ p1: Any) -> String { + return L10n.tr("Localizable", "Scene.ConfirmEmail.DidntGetLink.ResendIn", String(describing: p1), fallback: "Resend (%@)") + } + /// Resend now. + public static let resendNow = L10n.tr("Localizable", "Scene.ConfirmEmail.DidntGetLink.ResendNow", fallback: "Resend now.") + } public enum DontReceiveEmail { /// Check if your email address is correct as well as your junk folder if you haven’t. public static let description = L10n.tr("Localizable", "Scene.ConfirmEmail.DontReceiveEmail.Description", fallback: "Check if your email address is correct as well as your junk folder if you haven’t.") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index a858ac7d4..1f1035550 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -234,6 +234,9 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; "Scene.ConfirmEmail.Title" = "Check Your Inbox"; +"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; +"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; +"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 53922ac0b..05ece71bc 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -230,6 +230,9 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; "Scene.ConfirmEmail.Title" = "Check Your Inbox"; +"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; +"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; +"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; From efafefac48455e21ee11050a231524b436f41eed Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 30 Dec 2022 17:02:20 +0100 Subject: [PATCH 71/94] Add missing localization (#690) --- Localization/app.json | 3 +++ .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 3 +-- .../Sources/MastodonLocalization/Generated/Strings.swift | 4 ++++ .../Resources/Base.lproj/Localizable.strings | 1 + .../Resources/en.lproj/Localizable.strings | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index c277a3127..0cd771307 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -306,6 +306,9 @@ "instant": "Instant Sign-up", "manually_reviewed" = "Manual Review" }, + "language": { + "all": "All" + }, "search": { "placeholder": "Search name or URL" } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 6e6b27f13..8909285cc 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -300,8 +300,7 @@ extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDeleg case .language(_): guard allLanguages.value.isNotEmpty else { return } - //FIXME: @zeitschlag localize - let allLanguagesAction = UIAction(title: "All") { _ in + let allLanguagesAction = UIAction(title: L10n.Scene.ServerPicker.Language.all) { _ in self.selectedLanguage.value = nil cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language } diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index cd143b57e..9034cf0c5 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -1276,6 +1276,10 @@ public enum L10n { /// USERS public static let users = L10n.tr("Localizable", "Scene.ServerPicker.Label.Users", fallback: "USERS") } + public enum Language { + /// All + public static let all = L10n.tr("Localizable", "Scene.ServerPicker.Language.All", fallback: "All") + } public enum Search { /// Search name or URL public static let placeholder = L10n.tr("Localizable", "Scene.ServerPicker.Search.Placeholder", fallback: "Search name or URL") diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 1f1035550..acafb44ab 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -444,6 +444,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; +"Scene.ServerPicker.Language.All" = "All"; "Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 05ece71bc..f45ef2c0b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -437,6 +437,7 @@ uploaded to Mastodon."; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; +"Scene.ServerPicker.Language.All" = "All"; "Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; From 600e91eb4d4f45f1c02e3f522e7b6c7b5d88fe26 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 30 Dec 2022 17:59:09 +0100 Subject: [PATCH 72/94] Randomly select a server for user (#690) --- .../MastodonPickServerViewController.swift | 23 +++++++++++-------- .../MastodonPickServerViewModel.swift | 13 +++++++++++ .../PickServer/View/OnboardingNextView.swift | 5 +--- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index b2bc62da8..2ed541c5c 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -123,12 +123,6 @@ extension MastodonPickServerViewController { ) .store(in: &disposeBag) - viewModel - .selectedServer - .map { $0 != nil } - .assign(to: \.isEnabled, on: onboardingNextView.nextButton) - .store(in: &disposeBag) - Publishers.Merge( viewModel.error, authenticationViewModel.error @@ -211,7 +205,7 @@ extension MastodonPickServerViewController { } .store(in: &disposeBag) - onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.nextButtonDidPressed(_:)), for: .touchUpInside) + onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.next(_:)), for: .touchUpInside) title = L10n.Scene.ServerPicker.title @@ -241,9 +235,18 @@ extension MastodonPickServerViewController { extension MastodonPickServerViewController { - @objc private func nextButtonDidPressed(_ sender: UIButton) { - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - guard let server = viewModel.selectedServer.value else { return } + @objc private func next(_ sender: UIButton) { + + let server: Mastodon.Entity.Server + + if let selectedServer = viewModel.selectedServer.value { + server = selectedServer + } else if let randomServer = viewModel.chooseRandomServer() { + server = randomServer + } else { + return + } + authenticationViewModel.isAuthenticating.send(true) context.apiService.instance(domain: server.domain) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 8909285cc..c3db6a761 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -228,6 +228,19 @@ extension MastodonPickServerViewModel { .store(in: &disposeBag) } + func chooseRandomServer() -> Mastodon.Entity.Server? { + + guard let language = Locale.preferredLanguages.first?.lowercased() else { return nil } + + let servers = indexedServers.value + guard servers.isNotEmpty else { return nil } + + let randomServer = servers.filter { + $0.language == language + }.randomElement() + + return randomServer + } } extension MastodonPickServerViewModel { diff --git a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift index 57afdeea0..0bd7dfc35 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/OnboardingNextView.swift @@ -13,9 +13,7 @@ import MastodonLocalization final class OnboardingNextView: UIView { static let buttonHeight: CGFloat = 50 - - private var observations = Set() - + private let container: UIStackView = { let stackView = UIStackView() stackView.axis = .vertical @@ -24,7 +22,6 @@ final class OnboardingNextView: UIView { return stackView }() - //TODO: Show loading let nextButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false From a73b7bb3482bf5fecf406bcd56e717af7aaeb152 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Thu, 5 Jan 2023 18:52:38 +0100 Subject: [PATCH 73/94] Fix scrolling-issue (#690) --- .../PickServer/MastodonPickServerViewModel+Diffable.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift index c54cc2bc7..4630083fa 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift @@ -31,6 +31,9 @@ extension MastodonPickServerViewModel { guard let indexPath = self.serverSectionHeaderView.diffableDataSource?.indexPath(for: .category(category: .init(category: Mastodon.Entity.Category.Kind.general.rawValue, serversCount: 0))) else { return } self.serverSectionHeaderView.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .right) + + let firstIndex = IndexPath(item: 0, section: 0) + self.serverSectionHeaderView.collectionView.scrollToItem(at: firstIndex, at: .left, animated: false) } // set tableView From cfb7061d4c1d710f354201366a7ff38728ee78c2 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 11:30:23 +0100 Subject: [PATCH 74/94] Some polish here and there in regards (#690) Mostly navigationbar-related. --- .../Login/MastodonLoginViewController.swift | 2 + .../MastodonPickServerViewController.swift | 5 ++- .../Welcome/WelcomeViewController.swift | 37 +++++++++---------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift index 9f9ce5d75..b45c102f3 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift @@ -102,6 +102,8 @@ class MastodonLoginViewController: UIViewController, NeedsDependency { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + navigationController?.setNavigationBarHidden(true, animated: false) + viewModel.updateServers() } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 2ed541c5c..defc0e31c 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -67,7 +67,10 @@ extension MastodonPickServerViewController { override func viewDidLoad() { super.viewDidLoad() - + + navigationController?.navigationBar.prefersLargeTitles = true + navigationController?.setNavigationBarHidden(false, animated: false) + setupOnboardingAppearance() defer { setupNavigationBarBackgroundView() } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 12324ec9c..d78e9a4fd 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -14,7 +14,7 @@ import MastodonLocalization final class WelcomeViewController: UIViewController, NeedsDependency { private enum Constants { - static let topAnchorInset: CGFloat = 20 + static let topAnchorInset: CGFloat = 24 } weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } @@ -75,7 +75,7 @@ extension WelcomeViewController { definesPresentationContext = true preferredContentSize = CGSize(width: 547, height: 678) - navigationController?.navigationBar.prefersLargeTitles = true + navigationController?.navigationBar.prefersLargeTitles = false view.overrideUserInterfaceStyle = .light setupOnboardingAppearance() @@ -135,7 +135,7 @@ extension WelcomeViewController { } NSLayoutConstraint.activate([ - pageViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), + pageViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: Constants.topAnchorInset), pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), @@ -145,10 +145,23 @@ extension WelcomeViewController { .receive(on: DispatchQueue.main) .sink { [weak self] needsShowDismissEntry in guard let self = self else { return } - self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil + + if needsShowDismissEntry { + self.navigationItem.leftBarButtonItem = self.dismissBarButtonItem + self.navigationController?.setNavigationBarHidden(false, animated: false) + } else { + self.navigationController?.setNavigationBarHidden(true, animated: false) + } } .store(in: &disposeBag) } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationController?.navigationBar.prefersLargeTitles = false + navigationController?.setNavigationBarHidden(true, animated: false) + } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() @@ -174,10 +187,6 @@ extension WelcomeViewController { setupIllustrationLayout() setupButtonShadowView() } - - private var computedTopAnchorInset: CGFloat { - (navigationController?.navigationBar.bounds.height ?? UINavigationBar().bounds.height) + Constants.topAnchorInset - } } extension WelcomeViewController { @@ -239,17 +248,7 @@ extension WelcomeViewController { } // MARK: - OnboardingViewControllerAppearance -extension WelcomeViewController: OnboardingViewControllerAppearance { - func setupNavigationBarAppearance() { - // always transparent - let barAppearance = UINavigationBarAppearance() - barAppearance.configureWithTransparentBackground() - navigationItem.standardAppearance = barAppearance - navigationItem.compactAppearance = barAppearance - navigationItem.scrollEdgeAppearance = barAppearance - navigationItem.compactScrollEdgeAppearance = barAppearance - } -} +extension WelcomeViewController: OnboardingViewControllerAppearance {} // MARK: - UIAdaptivePresentationControllerDelegate extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { From 77826956e8d627c93be3b387c16335ca7992ca7d Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 12:48:28 +0100 Subject: [PATCH 75/94] Fetch all servers for login-auto-complete (#690) so far, only those with an open registration were available. Server needs to be adjusted as well. --- .../Scene/Onboarding/Login/MastodonLoginViewModel.swift | 2 +- .../MastodonCore/Service/API/APIService+Onboarding.swift | 5 +++-- .../Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift | 6 +++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift index 61311a1b9..52adcad4a 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift @@ -29,7 +29,7 @@ class MastodonLoginViewModel { } func updateServers() { - appContext?.apiService.servers().sink(receiveCompletion: { [weak self] completion in + appContext?.apiService.servers(registrations: "all").sink(receiveCompletion: { [weak self] completion in switch completion { case .finished: guard let self = self else { return } diff --git a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift index 1a103b610..3af6a030e 100644 --- a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift @@ -13,9 +13,10 @@ extension APIService { public func servers( language: String? = nil, - category: String? = nil + category: String? = nil, + registrations: String? = nil ) -> AnyPublisher, Error> { - let query = Mastodon.API.Onboarding.ServersQuery(language: language, category: category) + let query = Mastodon.API.Onboarding.ServersQuery(language: language, category: category, registrations: registrations) return Mastodon.API.Onboarding.servers(session: session, query: query) } diff --git a/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift b/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift index a41a58039..0c816b142 100644 --- a/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift +++ b/MastodonSDK/Sources/MastodonSDK/API/Mastodon+API+Onboarding.swift @@ -103,16 +103,20 @@ extension Mastodon.API.Onboarding { public struct ServersQuery: GetQuery { public let language: String? public let category: String? + /// Check if registrations need to be manually approved or not (or it doesn't matter) + public let registrations: String? - public init(language: String?, category: String?) { + public init(language: String?, category: String?, registrations: String?) { self.language = language self.category = category + self.registrations = registrations } var queryItems: [URLQueryItem]? { var items: [URLQueryItem] = [] language.flatMap { items.append(URLQueryItem(name: "language", value: $0)) } category.flatMap { items.append(URLQueryItem(name: "category", value: $0)) } + registrations.flatMap { items.append(URLQueryItem(name: "registrations", value: $0)) } guard !items.isEmpty else { return nil } return items } From 93d3472ba3ec76bc37edfa40fd161c09e231d28b Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 12:48:36 +0100 Subject: [PATCH 76/94] Fix warning --- Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift index 4cce243f0..6dfd81c59 100644 --- a/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/PickServerSection.swift @@ -64,11 +64,11 @@ extension PickServerSection { ) }() if let proxiedThumbnail = server.proxiedThumbnail, let thumbnailUrl = URL(string: proxiedThumbnail) { - cell.thumbnailImageView.af.setImage(withURL: thumbnailUrl) { _ in + cell.thumbnailImageView.af.setImage(withURL: thumbnailUrl, completion: { _ in OperationQueue.main.addOperation { cell.thumbnailImageView.isHidden = false } - } + }) } attribute.isLast .receive(on: DispatchQueue.main) From c8e0419dec1e9128fa7cd923ecc8d5af5fb0d2a1 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 13:44:11 +0100 Subject: [PATCH 77/94] Revert "Some polish here and there in regards (#690)" This reverts commit a84910f2aba114a6600337dd9d50d3d5e5c749c6. --- .../Login/MastodonLoginViewController.swift | 2 - .../MastodonPickServerViewController.swift | 5 +-- .../Welcome/WelcomeViewController.swift | 37 ++++++++++--------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift index b45c102f3..9f9ce5d75 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift @@ -102,8 +102,6 @@ class MastodonLoginViewController: UIViewController, NeedsDependency { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - navigationController?.setNavigationBarHidden(true, animated: false) - viewModel.updateServers() } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index defc0e31c..2ed541c5c 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -67,10 +67,7 @@ extension MastodonPickServerViewController { override func viewDidLoad() { super.viewDidLoad() - - navigationController?.navigationBar.prefersLargeTitles = true - navigationController?.setNavigationBarHidden(false, animated: false) - + setupOnboardingAppearance() defer { setupNavigationBarBackgroundView() } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index d78e9a4fd..12324ec9c 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -14,7 +14,7 @@ import MastodonLocalization final class WelcomeViewController: UIViewController, NeedsDependency { private enum Constants { - static let topAnchorInset: CGFloat = 24 + static let topAnchorInset: CGFloat = 20 } weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } @@ -75,7 +75,7 @@ extension WelcomeViewController { definesPresentationContext = true preferredContentSize = CGSize(width: 547, height: 678) - navigationController?.navigationBar.prefersLargeTitles = false + navigationController?.navigationBar.prefersLargeTitles = true view.overrideUserInterfaceStyle = .light setupOnboardingAppearance() @@ -135,7 +135,7 @@ extension WelcomeViewController { } NSLayoutConstraint.activate([ - pageViewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: Constants.topAnchorInset), + pageViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), @@ -145,23 +145,10 @@ extension WelcomeViewController { .receive(on: DispatchQueue.main) .sink { [weak self] needsShowDismissEntry in guard let self = self else { return } - - if needsShowDismissEntry { - self.navigationItem.leftBarButtonItem = self.dismissBarButtonItem - self.navigationController?.setNavigationBarHidden(false, animated: false) - } else { - self.navigationController?.setNavigationBarHidden(true, animated: false) - } + self.navigationItem.leftBarButtonItem = needsShowDismissEntry ? self.dismissBarButtonItem : nil } .store(in: &disposeBag) } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - navigationController?.navigationBar.prefersLargeTitles = false - navigationController?.setNavigationBarHidden(true, animated: false) - } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() @@ -187,6 +174,10 @@ extension WelcomeViewController { setupIllustrationLayout() setupButtonShadowView() } + + private var computedTopAnchorInset: CGFloat { + (navigationController?.navigationBar.bounds.height ?? UINavigationBar().bounds.height) + Constants.topAnchorInset + } } extension WelcomeViewController { @@ -248,7 +239,17 @@ extension WelcomeViewController { } // MARK: - OnboardingViewControllerAppearance -extension WelcomeViewController: OnboardingViewControllerAppearance {} +extension WelcomeViewController: OnboardingViewControllerAppearance { + func setupNavigationBarAppearance() { + // always transparent + let barAppearance = UINavigationBarAppearance() + barAppearance.configureWithTransparentBackground() + navigationItem.standardAppearance = barAppearance + navigationItem.compactAppearance = barAppearance + navigationItem.scrollEdgeAppearance = barAppearance + navigationItem.compactScrollEdgeAppearance = barAppearance + } +} // MARK: - UIAdaptivePresentationControllerDelegate extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { From 0cfe0041df58329781efa696ccbda3bb6827ee40 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 14:36:14 +0100 Subject: [PATCH 78/94] Show menu right away (#690) This was a nice bug: The menu for signup-speed/language was attached too late. The entire button-delegate-stuff was obsolete in the end --- .../PickServer/CategoryPickerSection.swift | 65 +++++++++++++++---- ...PickServerCategoryCollectionViewCell.swift | 8 --- .../MastodonPickServerViewController.swift | 31 ++++++--- ...MastodonPickServerViewModel+Diffable.swift | 2 +- .../MastodonPickServerViewModel.swift | 56 ---------------- 5 files changed, 78 insertions(+), 84 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index d7f8fc9b3..710fe84af 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -17,26 +17,69 @@ extension CategoryPickerSection { static func collectionViewDiffableDataSource( for collectionView: UICollectionView, dependency: NeedsDependency, - buttonDelegate: PickServerCategoryCollectionViewCellDelegate? + viewModel: MastodonPickServerViewModel ) -> UICollectionViewDiffableDataSource { UICollectionViewDiffableDataSource(collectionView: collectionView) { [weak dependency] collectionView, indexPath, item -> UICollectionViewCell? in guard let _ = dependency else { return nil } let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PickServerCategoryCollectionViewCell.reuseIdentifier, for: indexPath) as! PickServerCategoryCollectionViewCell cell.titleLabel.text = item.title - cell.delegate = buttonDelegate - cell.item = item - - let isLanguage = (item == .language(language: nil)) - let isSignupSpeed = (item == .signupSpeed(manuallyReviewed: nil)) - if isLanguage || isSignupSpeed { - cell.chevron.isHidden = false - cell.menuButton.isUserInteractionEnabled = true - cell.menuButton.isHidden = false - } else { + + switch item { + case .category(_): cell.chevron.isHidden = true cell.menuButton.isUserInteractionEnabled = false cell.menuButton.isHidden = true + cell.menuButton.menu = nil + case .language(_): + guard viewModel.allLanguages.value.isNotEmpty else { break } + + let allLanguagesAction = UIAction(title: L10n.Scene.ServerPicker.Language.all) { _ in + viewModel.selectedLanguage.value = nil + cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language + } + + let languageActions = viewModel.allLanguages.value.compactMap { language in + UIAction(title: language.language ?? language.locale) { action in + viewModel.selectedLanguage.value = language.locale + cell.titleLabel.text = language.language + } + } + + var allActions = [allLanguagesAction] + allActions.append(contentsOf: languageActions) + + let languageMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.language, + children: allActions) + + cell.chevron.isHidden = false + cell.menuButton.isUserInteractionEnabled = true + cell.menuButton.isHidden = false + cell.menuButton.menu = languageMenu + + case .signupSpeed(_): + let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { _ in + viewModel.manualApprovalRequired.value = nil + cell.titleLabel.text = L10n.Scene.ServerPicker.Button.signupSpeed + } + + let manualApprovalAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed) { action in + viewModel.manualApprovalRequired.value = true + cell.titleLabel.text = action.title + } + + let instantSignupAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.instant) { action in + viewModel.manualApprovalRequired.value = false + cell.titleLabel.text = action.title + } + + let signupSpeedMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.signupSpeed, + children: [doesntMatterAction, manualApprovalAction, instantSignupAction]) + + cell.chevron.isHidden = false + cell.menuButton.isUserInteractionEnabled = true + cell.menuButton.isHidden = false + cell.menuButton.menu = signupSpeedMenu } cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in diff --git a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift index d066bbdc1..533487ccb 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CollectionViewCell/PickServerCategoryCollectionViewCell.swift @@ -11,16 +11,9 @@ import MastodonAsset import MastodonUI import MastodonLocalization -protocol PickServerCategoryCollectionViewCellDelegate: AnyObject { - func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) //TODO: Add item -} - class PickServerCategoryCollectionViewCell: UICollectionViewCell { static let reuseIdentifier = "PickServerCategoryCollectionViewCell" - weak var delegate: PickServerCategoryCollectionViewCellDelegate? - - var item: CategoryPickerItem? let titleLabel: UILabel = { let label = UILabel() @@ -98,7 +91,6 @@ class PickServerCategoryCollectionViewCell: UICollectionViewCell { //MARK: - Actions @objc func didPressButton(_ sender: Any) { - delegate?.didPressMenuButton(in: self) invalidateIntrinsicContentSize() } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 2ed541c5c..3f32e9672 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -207,6 +207,23 @@ extension MastodonPickServerViewController { onboardingNextView.nextButton.addTarget(self, action: #selector(MastodonPickServerViewController.next(_:)), for: .touchUpInside) + viewModel.allLanguages + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in + guard let snapshot = self?.viewModel.serverSectionHeaderView.diffableDataSource?.snapshot() else { return } + + self?.viewModel.serverSectionHeaderView.diffableDataSource?.applySnapshotUsingReloadData(snapshot) { + guard let self = self, let viewModel = self.viewModel else { return } + guard let indexPath = viewModel.serverSectionHeaderView.diffableDataSource?.indexPath(for: .category(category: .init(category: Mastodon.Entity.Category.Kind.general.rawValue, serversCount: 0))) else { return } + + viewModel.serverSectionHeaderView.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: .right) + + let firstIndex = IndexPath(item: 0, section: 0) + viewModel.serverSectionHeaderView.collectionView.scrollToItem(at: firstIndex, at: .left, animated: false) + } + } + .store(in: &disposeBag) + title = L10n.Scene.ServerPicker.title navigationItem.searchController = searchController @@ -395,16 +412,14 @@ extension MastodonPickServerViewController: UITableViewDelegate { extension MastodonPickServerViewController: PickServerServerSectionTableHeaderViewDelegate { func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let diffableDataSource = headerView.diffableDataSource, - let item = diffableDataSource.itemIdentifier(for: indexPath), - let cell = collectionView.cellForItem(at: indexPath) as? PickServerCategoryCollectionViewCell else { return } + let item = diffableDataSource.itemIdentifier(for: indexPath) else { return } - if case let .language(_) = item { - viewModel.didPressMenuButton(in: cell) - } else if case let .signupSpeed(_) = item { - // gets also handled by button - viewModel.didPressMenuButton(in: cell) - } else { + switch item { + case .category(_): viewModel.selectCategoryItem.value = item + case .language(_), .signupSpeed(_): + break + // gets handled by button } } } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift index 4630083fa..f8a2937fb 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel+Diffable.swift @@ -20,7 +20,7 @@ extension MastodonPickServerViewModel { serverSectionHeaderView.diffableDataSource = CategoryPickerSection.collectionViewDiffableDataSource( for: serverSectionHeaderView.collectionView, dependency: dependency, - buttonDelegate: self + viewModel: self ) var sectionHeaderSnapshot = NSDiffableDataSourceSnapshot() sectionHeaderSnapshot.appendSections([.main]) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index c3db6a761..5e83418f8 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -301,59 +301,3 @@ extension MastodonPickServerViewModel: TMBarDataSource { return barItem } } - -extension MastodonPickServerViewModel: PickServerCategoryCollectionViewCellDelegate { - func didPressMenuButton(in cell: PickServerCategoryCollectionViewCell) { - - guard let item = cell.item else { return } - - switch item { - case .category(_): - return - case .language(_): - guard allLanguages.value.isNotEmpty else { return } - - let allLanguagesAction = UIAction(title: L10n.Scene.ServerPicker.Language.all) { _ in - self.selectedLanguage.value = nil - cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language - } - - let languageActions = allLanguages.value.compactMap { language in - UIAction(title: language.language ?? language.locale) { action in - self.selectedLanguage.value = language.locale - cell.titleLabel.text = language.language - } - } - - var allActions = [allLanguagesAction] - allActions.append(contentsOf: languageActions) - - let languageMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.language, - children: allActions) - - cell.menuButton.menu = languageMenu - - case .signupSpeed(_): - - let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { _ in - self.manualApprovalRequired.value = nil - cell.titleLabel.text = L10n.Scene.ServerPicker.Button.signupSpeed - } - - let manualApprovalAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed) { action in - self.manualApprovalRequired.value = true - cell.titleLabel.text = action.title - } - - let instantSignupAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.instant) { action in - self.manualApprovalRequired.value = false - cell.titleLabel.text = action.title - } - - let signupSpeedMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.signupSpeed, - children: [doesntMatterAction, manualApprovalAction, instantSignupAction]) - - cell.menuButton.menu = signupSpeedMenu - } - } -} From eda79e6beb040d132bab2735f0ccaf9dd8c32f34 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 16:07:39 +0100 Subject: [PATCH 79/94] Fix language-based random server-selection (#690) During testing on device I noticed, that "next" didn't work. The reason was that I used the wrong language code. In case there's no server in my language, the server gets totally randomly selected. --- .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 5e83418f8..0b874497d 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -230,16 +230,16 @@ extension MastodonPickServerViewModel { func chooseRandomServer() -> Mastodon.Entity.Server? { - guard let language = Locale.preferredLanguages.first?.lowercased() else { return nil } + let language = Locale.autoupdatingCurrent.languageCode?.lowercased() ?? "en" let servers = indexedServers.value guard servers.isNotEmpty else { return nil } let randomServer = servers.filter { - $0.language == language + $0.language.lowercased() == language }.randomElement() - return randomServer + return randomServer ?? servers.randomElement() ?? servers.first } } From bd3c5ef58a60b7fdeabbf01c66bdb6b2ad5d11d2 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 16:39:36 +0100 Subject: [PATCH 80/94] UX-improvements for server-picker (#690) Sprinkle in some haptic feedback and show menu immediately --- .../Onboarding/PickServer/CategoryPickerSection.swift | 7 +++++++ .../View/PickServerServerSectionTableHeaderView.swift | 2 ++ 2 files changed, 9 insertions(+) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 710fe84af..9a0ff6b85 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -36,11 +36,13 @@ extension CategoryPickerSection { let allLanguagesAction = UIAction(title: L10n.Scene.ServerPicker.Language.all) { _ in viewModel.selectedLanguage.value = nil + UISelectionFeedbackGenerator().selectionChanged() cell.titleLabel.text = L10n.Scene.ServerPicker.Button.language } let languageActions = viewModel.allLanguages.value.compactMap { language in UIAction(title: language.language ?? language.locale) { action in + UISelectionFeedbackGenerator().selectionChanged() viewModel.selectedLanguage.value = language.locale cell.titleLabel.text = language.language } @@ -56,21 +58,25 @@ extension CategoryPickerSection { cell.menuButton.isUserInteractionEnabled = true cell.menuButton.isHidden = false cell.menuButton.menu = languageMenu + cell.menuButton.showsMenuAsPrimaryAction = true case .signupSpeed(_): let doesntMatterAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.all) { _ in viewModel.manualApprovalRequired.value = nil cell.titleLabel.text = L10n.Scene.ServerPicker.Button.signupSpeed + UISelectionFeedbackGenerator().selectionChanged() } let manualApprovalAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed) { action in viewModel.manualApprovalRequired.value = true cell.titleLabel.text = action.title + UISelectionFeedbackGenerator().selectionChanged() } let instantSignupAction = UIAction(title: L10n.Scene.ServerPicker.SignupSpeed.instant) { action in viewModel.manualApprovalRequired.value = false cell.titleLabel.text = action.title + UISelectionFeedbackGenerator().selectionChanged() } let signupSpeedMenu = UIMenu(title: L10n.Scene.ServerPicker.Button.signupSpeed, @@ -80,6 +86,7 @@ extension CategoryPickerSection { cell.menuButton.isUserInteractionEnabled = true cell.menuButton.isHidden = false cell.menuButton.menu = signupSpeedMenu + cell.menuButton.showsMenuAsPrimaryAction = true } cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in diff --git a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift index 973a55abe..3d84381dd 100644 --- a/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift +++ b/Mastodon/Scene/Onboarding/PickServer/View/PickServerServerSectionTableHeaderView.swift @@ -98,6 +98,8 @@ extension PickServerServerSectionTableHeaderView { extension PickServerServerSectionTableHeaderView: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + UISelectionFeedbackGenerator().selectionChanged() + collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .centeredHorizontally) delegate?.pickServerServerSectionTableHeaderView(self, collectionView: collectionView, didSelectItemAt: indexPath) } From 77beff55d5196911bd511caa67b23c216ffbb393 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 16:54:29 +0100 Subject: [PATCH 81/94] Fix text-color for education-screens (#690) In dark mode, the text was white and so unreadable --- .../Welcome/View/Pages/WelcomeContentPageView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index 6a5d905c1..4ceb8fa07 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -18,7 +18,7 @@ class WelcomeContentPageView: UIView { titleView = UILabel() titleView.font = WelcomeViewController.largeTitleFont - titleView.textColor = WelcomeViewController.largeTitleTextColor + titleView.textColor = WelcomeViewController.largeTitleTextColor.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)) titleView.attributedText = page.title titleView.adjustsFontForContentSizeCategory = true titleView.numberOfLines = 0 @@ -26,7 +26,7 @@ class WelcomeContentPageView: UIView { label = UILabel() label.text = page.content label.font = WelcomeViewController.subTitleFont - label.textColor = WelcomeViewController.largeTitleTextColor + label.textColor = WelcomeViewController.largeTitleTextColor.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)) label.adjustsFontForContentSizeCategory = true label.numberOfLines = 0 From 1aa3a209973b2dc0c0754023d6bee9348e8fd173 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Fri, 6 Jan 2023 17:27:17 +0100 Subject: [PATCH 82/94] Add a blurry background (#690) --- .../View/Pages/WelcomeContentPageView.swift | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index 4ceb8fa07..cea0c56b9 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -13,6 +13,7 @@ class WelcomeContentPageView: UIView { private let contentStackView: UIStackView private let titleView: UILabel private let label: UILabel + private let blurryBackgroundView: UIVisualEffectView init(page: WelcomeContentPage) { @@ -35,10 +36,16 @@ class WelcomeContentPageView: UIView { contentStackView.axis = .vertical contentStackView.alignment = .leading contentStackView.spacing = 8 + + blurryBackgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) + blurryBackgroundView.translatesAutoresizingMaskIntoConstraints = false + blurryBackgroundView.applyCornerRadius(radius: 8) + + blurryBackgroundView.contentView.addSubview(contentStackView) super.init(frame: .zero) - - addSubview(contentStackView) + + addSubview(blurryBackgroundView) setupConstraints() } @@ -47,10 +54,15 @@ class WelcomeContentPageView: UIView { private func setupConstraints() { let constraints = [ - contentStackView.topAnchor.constraint(equalTo: topAnchor), - contentStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), - trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 16), - bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor) + blurryBackgroundView.topAnchor.constraint(equalTo: topAnchor), + blurryBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + trailingAnchor.constraint(equalTo: blurryBackgroundView.trailingAnchor, constant: 16), + bottomAnchor.constraint(greaterThanOrEqualTo: blurryBackgroundView.bottomAnchor), + + contentStackView.topAnchor.constraint(equalTo: blurryBackgroundView.contentView.topAnchor, constant: 8), + contentStackView.leadingAnchor.constraint(equalTo: blurryBackgroundView.contentView.leadingAnchor, constant: 8), + blurryBackgroundView.contentView.trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 8), + blurryBackgroundView.contentView.bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor, constant: 8), ] NSLayoutConstraint.activate(constraints) From 8ff47a72d0a0546febdc46fad9cb5fbb84693222 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 7 Jan 2023 13:15:25 +0100 Subject: [PATCH 83/94] Make blurry-view lighter (#690) --- .../Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift index cea0c56b9..843a9ddab 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift @@ -37,7 +37,7 @@ class WelcomeContentPageView: UIView { contentStackView.alignment = .leading contentStackView.spacing = 8 - blurryBackgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) + blurryBackgroundView = UIVisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterialLight)) blurryBackgroundView.translatesAutoresizingMaskIntoConstraints = false blurryBackgroundView.applyCornerRadius(radius: 8) From 44d85e0263d99b515465f15b4ef5e87a44f0e0e9 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 7 Jan 2023 16:02:46 +0100 Subject: [PATCH 84/94] Replace the pagecontrol with a collection view (#690) Scrolling wasn't smooth with pageviews, as they do some black magic with scrollviews (like resetting contentOffset). If you depend on contentOffset, this breaks things and makes them hard. --- Mastodon.xcodeproj/project.pbxproj | 13 +- ...=> WelcomeContentCollectionViewCell.swift} | 26 ++-- .../Pages/WelcomeContentViewController.swift | 28 ---- .../Welcome/WelcomeViewController.swift | 133 +++++++----------- 4 files changed, 68 insertions(+), 132 deletions(-) rename Mastodon/Scene/Onboarding/Welcome/View/Pages/{WelcomeContentPageView.swift => WelcomeContentCollectionViewCell.swift} (87%) delete mode 100644 Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index dc8f2f6ae..8272d8427 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -117,8 +117,7 @@ D8916DC029211BE500124085 /* ContentSizedTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8916DBF29211BE500124085 /* ContentSizedTableView.swift */; }; D8A6AB6C291C5136003AB663 /* MastodonLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */; }; D8A6FE5B293244B500666A47 /* WelcomeContentPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */; }; - D8A6FE5D293244C300666A47 /* WelcomeContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */; }; - D8A6FE5F29324BBC00666A47 /* WelcomeContentPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */; }; + D8A6FE5F29324BBC00666A47 /* WelcomeContentCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8A6FE5E29324BBC00666A47 /* WelcomeContentCollectionViewCell.swift */; }; DB0009A626AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; }; DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DB0009A926AEE5DC009B9D2D /* Intents.intentdefinition */; }; DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0140CE25C42AEE00F9F3CF /* OSLog.swift */; }; @@ -666,8 +665,7 @@ D8916DBF29211BE500124085 /* ContentSizedTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentSizedTableView.swift; sourceTree = ""; }; D8A6AB6B291C5136003AB663 /* MastodonLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonLoginViewController.swift; sourceTree = ""; }; D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPage.swift; sourceTree = ""; }; - D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentViewController.swift; sourceTree = ""; }; - D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentPageView.swift; sourceTree = ""; }; + D8A6FE5E29324BBC00666A47 /* WelcomeContentCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeContentCollectionViewCell.swift; sourceTree = ""; }; D8A6FE6129325F5900666A47 /* Intents.stringsdict */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; path = Intents.stringsdict; sourceTree = ""; }; D8A6FE6229325F5900666A47 /* app.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = app.json; sourceTree = ""; }; D8A6FE6329325F5900666A47 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -1607,8 +1605,7 @@ isa = PBXGroup; children = ( D8A6FE5A293244B500666A47 /* WelcomeContentPage.swift */, - D8A6FE5C293244C300666A47 /* WelcomeContentViewController.swift */, - D8A6FE5E29324BBC00666A47 /* WelcomeContentPageView.swift */, + D8A6FE5E29324BBC00666A47 /* WelcomeContentCollectionViewCell.swift */, ); path = Pages; sourceTree = ""; @@ -3336,8 +3333,7 @@ DB603113279EBEBA00A935FE /* DataSourceFacade+Block.swift in Sources */, DB63F777279A9A2A00455B82 /* NotificationView+Configuration.swift in Sources */, DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */, - DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */, - D8A6FE5F29324BBC00666A47 /* WelcomeContentPageView.swift in Sources */, + D8A6FE5F29324BBC00666A47 /* WelcomeContentCollectionViewCell.swift in Sources */, 5B90C461262599800002E742 /* SettingsLinkTableViewCell.swift in Sources */, DB6180DD263918E30018D199 /* MediaPreviewViewController.swift in Sources */, DBE3CDEC261C6B2900430CC6 /* FavoriteViewController.swift in Sources */, @@ -3549,7 +3545,6 @@ DB1D84382657B275000346B3 /* SegmentedControlNavigateable.swift in Sources */, 0F20220726134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift in Sources */, DB7A9F932818F33C0016AF98 /* MastodonServerRulesViewController+Debug.swift in Sources */, - D8A6FE5D293244C300666A47 /* WelcomeContentViewController.swift in Sources */, 2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */, DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */, DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */, diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift similarity index 87% rename from Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift rename to Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift index 843a9ddab..05627a02d 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentPageView.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift @@ -7,25 +7,24 @@ import UIKit -class WelcomeContentPageView: UIView { +class WelcomeContentCollectionViewCell: UICollectionViewCell { + + static let identifier = "WelcomeContentCollectionViewCell" //TODO: Put in ScrollView? private let contentStackView: UIStackView private let titleView: UILabel private let label: UILabel private let blurryBackgroundView: UIVisualEffectView - - init(page: WelcomeContentPage) { - + + override init(frame: CGRect) { titleView = UILabel() titleView.font = WelcomeViewController.largeTitleFont titleView.textColor = WelcomeViewController.largeTitleTextColor.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)) - titleView.attributedText = page.title titleView.adjustsFontForContentSizeCategory = true titleView.numberOfLines = 0 label = UILabel() - label.text = page.content label.font = WelcomeViewController.subTitleFont label.textColor = WelcomeViewController.largeTitleTextColor.resolvedColor(with: UITraitCollection(userInterfaceStyle: .light)) label.adjustsFontForContentSizeCategory = true @@ -43,7 +42,7 @@ class WelcomeContentPageView: UIView { blurryBackgroundView.contentView.addSubview(contentStackView) - super.init(frame: .zero) + super.init(frame: frame) addSubview(blurryBackgroundView) @@ -55,16 +54,21 @@ class WelcomeContentPageView: UIView { private func setupConstraints() { let constraints = [ blurryBackgroundView.topAnchor.constraint(equalTo: topAnchor), - blurryBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), - trailingAnchor.constraint(equalTo: blurryBackgroundView.trailingAnchor, constant: 16), + blurryBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor), + trailingAnchor.constraint(equalTo: blurryBackgroundView.trailingAnchor), bottomAnchor.constraint(greaterThanOrEqualTo: blurryBackgroundView.bottomAnchor), contentStackView.topAnchor.constraint(equalTo: blurryBackgroundView.contentView.topAnchor, constant: 8), contentStackView.leadingAnchor.constraint(equalTo: blurryBackgroundView.contentView.leadingAnchor, constant: 8), - blurryBackgroundView.contentView.trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor, constant: 8), - blurryBackgroundView.contentView.bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor, constant: 8), + blurryBackgroundView.contentView.trailingAnchor.constraint(equalTo: contentStackView.trailingAnchor), + blurryBackgroundView.contentView.bottomAnchor.constraint(equalTo: contentStackView.bottomAnchor), ] NSLayoutConstraint.activate(constraints) } + + func update(with page: WelcomeContentPage) { + titleView.attributedText = page.title + label.text = page.content + } } diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift deleted file mode 100644 index a6910a281..000000000 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentViewController.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// WelcomeContentViewController.swift -// Mastodon -// -// Created by Nathan Mattes on 26.11.22. -// - -import UIKit - -class WelcomeContentViewController: UIViewController { - - let page: WelcomeContentPage - var contentView: WelcomeContentPageView { - view as! WelcomeContentPageView - } - - init(page: WelcomeContentPage) { - self.page = page - super.init(nibName: nil, bundle: nil) - } - - override func loadView() { - let pageView = WelcomeContentPageView(page: page) - self.view = pageView - } - - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } -} diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 12324ec9c..8c3854565 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -29,6 +29,7 @@ final class WelcomeViewController: UIViewController, NeedsDependency { private(set) lazy var dismissBarButtonItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(WelcomeViewController.dismissBarButtonItemDidPressed(_:))) let buttonContainer = UIStackView() + let educationPages: [WelcomeContentPage] = [.whatIsMastodon, .mastodonIsLikeThat, .howDoIPickAServer] private(set) lazy var signUpButton: PrimaryActionButton = { let button = PrimaryActionButton() @@ -58,13 +59,24 @@ final class WelcomeViewController: UIViewController, NeedsDependency { return button }() - private(set) lazy var pageViewController: UIPageViewController = { - let pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) - pageController.setViewControllers([WelcomeContentViewController(page: .whatIsMastodon)], direction: .forward, animated: false) - return pageController + private(set) lazy var pageCollectionView: UICollectionView = { + let flowLayout = UICollectionViewFlowLayout() + flowLayout.scrollDirection = .horizontal + flowLayout.minimumInteritemSpacing = 0 + flowLayout.minimumLineSpacing = 0 + //FIXME: cell-size. + flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 300) + + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + collectionView.translatesAutoresizingMaskIntoConstraints = false + collectionView.isPagingEnabled = true + collectionView.backgroundColor = nil + collectionView.showsHorizontalScrollIndicator = false + collectionView.bounces = false + collectionView.register(WelcomeContentCollectionViewCell.self, forCellWithReuseIdentifier: WelcomeContentCollectionViewCell.identifier) + + return collectionView }() - var currentPage: WelcomeContentPage = .whatIsMastodon - var currentPageOffset = 0 } extension WelcomeViewController { @@ -121,24 +133,18 @@ extension WelcomeViewController { signUpButton.addTarget(self, action: #selector(signUpButtonDidClicked(_:)), for: .touchUpInside) signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) - pageViewController.delegate = self - pageViewController.dataSource = self - addChild(pageViewController) - pageViewController.view.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(pageViewController.view) - pageViewController.didMove(toParent: self) - - let scrollviews = pageViewController.view.subviews.filter { type(of: $0).isSubclass(of: UIScrollView.self) }.compactMap { $0 as? UIScrollView } - - for scrollView in scrollviews { - scrollView.delegate = self - } + pageCollectionView.delegate = self + pageCollectionView.dataSource = self + view.addSubview(pageCollectionView) + + let scrollView = pageCollectionView as UIScrollView + scrollView.delegate = self NSLayoutConstraint.activate([ - pageViewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), - pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), - view.trailingAnchor.constraint(equalTo: pageViewController.view.trailingAnchor), - buttonContainer.topAnchor.constraint(equalTo: pageViewController.view.bottomAnchor, constant: 16), + pageCollectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), + pageCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: pageCollectionView.trailingAnchor), + buttonContainer.topAnchor.constraint(equalTo: pageCollectionView.bottomAnchor, constant: 16), ]) viewModel.$needsShowDismissEntry @@ -287,70 +293,29 @@ extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { } } -//MARK: - UIPageViewControllerDelegate - -extension WelcomeViewController: UIPageViewControllerDelegate { - func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { - guard let currentViewController = pageViewController.viewControllers?.first as? WelcomeContentViewController else { return } - - currentPage = currentViewController.page - - if let pageIndex = WelcomeContentPage.allCases.firstIndex(of: currentPage) { - let offset = Int(pageIndex) * Int(pageViewController.view.frame.width) - currentPageOffset = offset - welcomeIllustrationView.update(contentOffset: CGFloat(offset)) - } - } -} - -//MARK: - UIPageViewDataSource - -extension WelcomeViewController: UIPageViewControllerDataSource { - - func presentationIndex(for pageViewController: UIPageViewController) -> Int { - WelcomeContentPage.allCases.firstIndex(of: currentPage) ?? 0 - } - - func presentationCount(for pageViewController: UIPageViewController) -> Int { - return WelcomeContentPage.allCases.count - } - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { - guard let viewController = viewController as? WelcomeContentViewController else { return nil } - - let currentPage = viewController.page - - switch currentPage { - case .whatIsMastodon: - return nil - case .mastodonIsLikeThat: - return WelcomeContentViewController(page: .whatIsMastodon) - case .howDoIPickAServer: - return WelcomeContentViewController(page: .mastodonIsLikeThat) - } - } - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { - guard let viewController = viewController as? WelcomeContentViewController else { return nil } - - let currentPage = viewController.page - - switch currentPage { - case .whatIsMastodon: - return WelcomeContentViewController(page: .mastodonIsLikeThat) - case .mastodonIsLikeThat: - return WelcomeContentViewController(page: .howDoIPickAServer) - case .howDoIPickAServer: - return nil - } - } -} - +//MARK: - UIScrollViewDelegate extension WelcomeViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { - let weirdScrollViewJumpingCorrectionFactor = pageViewController.view.frame.width - let contentOffset = CGFloat(currentPageOffset) + scrollView.contentOffset.x - weirdScrollViewJumpingCorrectionFactor - + let contentOffset = scrollView.contentOffset.x welcomeIllustrationView.update(contentOffset: contentOffset) } } + +//MARK: - UICollectionViewDelegate +extension WelcomeViewController: UICollectionViewDelegate { } + +//MARK: - UICollectionViewDataSource +extension WelcomeViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + educationPages.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WelcomeContentCollectionViewCell.identifier, for: indexPath) as? WelcomeContentCollectionViewCell else { fatalError("WTF? Wrong cell?") } + + let page = educationPages[indexPath.item] + cell.update(with: page) + + return cell + } +} From 04f19b6b9d458a7465b90165c2f10131148bbbe1 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 13:35:08 +0100 Subject: [PATCH 85/94] Fix content-page-size (#690) --- .../View/Pages/WelcomeContentCollectionViewCell.swift | 4 ++-- .../Onboarding/Welcome/WelcomeViewController.swift | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift index 05627a02d..413c7644a 100644 --- a/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift +++ b/Mastodon/Scene/Onboarding/Welcome/View/Pages/WelcomeContentCollectionViewCell.swift @@ -54,8 +54,8 @@ class WelcomeContentCollectionViewCell: UICollectionViewCell { private func setupConstraints() { let constraints = [ blurryBackgroundView.topAnchor.constraint(equalTo: topAnchor), - blurryBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor), - trailingAnchor.constraint(equalTo: blurryBackgroundView.trailingAnchor), + blurryBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + trailingAnchor.constraint(equalTo: blurryBackgroundView.trailingAnchor, constant: 16), bottomAnchor.constraint(greaterThanOrEqualTo: blurryBackgroundView.bottomAnchor), contentStackView.topAnchor.constraint(equalTo: blurryBackgroundView.contentView.topAnchor, constant: 8), diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index 8c3854565..ad3318940 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -62,10 +62,8 @@ final class WelcomeViewController: UIViewController, NeedsDependency { private(set) lazy var pageCollectionView: UICollectionView = { let flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .horizontal - flowLayout.minimumInteritemSpacing = 0 flowLayout.minimumLineSpacing = 0 - //FIXME: cell-size. - flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 300) + flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 400) let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) collectionView.translatesAutoresizingMaskIntoConstraints = false @@ -179,6 +177,13 @@ extension WelcomeViewController { setupIllustrationLayout() setupButtonShadowView() + + let flowLayout = UICollectionViewFlowLayout() + flowLayout.scrollDirection = .horizontal + flowLayout.minimumLineSpacing = 0 + flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 400) + + pageCollectionView.setCollectionViewLayout(flowLayout, animated: true) } private var computedTopAnchorInset: CGFloat { From 023e70ebcb3519c3d03b637f4d7110c8eafa1d36 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 14:25:22 +0100 Subject: [PATCH 86/94] Add page control (#690) --- .../Welcome/WelcomeViewController.swift | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index ad3318940..d6f8cda7d 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -75,6 +75,12 @@ final class WelcomeViewController: UIViewController, NeedsDependency { return collectionView }() + + private(set) var pageControl: UIPageControl = { + let pageControl = UIPageControl(frame: .zero) + pageControl.translatesAutoresizingMaskIntoConstraints = false + return pageControl + }() } extension WelcomeViewController { @@ -135,6 +141,10 @@ extension WelcomeViewController { pageCollectionView.dataSource = self view.addSubview(pageCollectionView) + pageControl.numberOfPages = self.educationPages.count + pageControl.addTarget(self, action: #selector(WelcomeViewController.pageControlDidChange(_:)), for: .valueChanged) + view.addSubview(pageControl) + let scrollView = pageCollectionView as UIScrollView scrollView.delegate = self @@ -142,8 +152,13 @@ extension WelcomeViewController { pageCollectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: computedTopAnchorInset), pageCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), view.trailingAnchor.constraint(equalTo: pageCollectionView.trailingAnchor), - buttonContainer.topAnchor.constraint(equalTo: pageCollectionView.bottomAnchor, constant: 16), + pageControl.topAnchor.constraint(equalTo: pageCollectionView.bottomAnchor, constant: 16), + + pageControl.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: pageControl.trailingAnchor), + buttonContainer.topAnchor.constraint(equalTo: pageControl.bottomAnchor, constant: 16), ]) + viewModel.$needsShowDismissEntry .receive(on: DispatchQueue.main) @@ -233,6 +248,8 @@ extension WelcomeViewController { } extension WelcomeViewController { + + //MARK: - Actions @objc private func signUpButtonDidClicked(_ sender: UIButton) { _ = coordinator.present(scene: .mastodonPickServer(viewMode: MastodonPickServerViewModel(context: context)), from: self, transition: .show) @@ -247,6 +264,14 @@ extension WelcomeViewController { private func dismissBarButtonItemDidPressed(_ sender: UIButton) { dismiss(animated: true, completion: nil) } + + @objc + private func pageControlDidChange(_ sender: UIPageControl) { + let item = sender.currentPage + let indexPath = IndexPath(item: item, section: 0) + + pageCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: false) + } } // MARK: - OnboardingViewControllerAppearance @@ -304,6 +329,14 @@ extension WelcomeViewController: UIScrollViewDelegate { let contentOffset = scrollView.contentOffset.x welcomeIllustrationView.update(contentOffset: contentOffset) } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width) + } + + func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { + pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width) + } } //MARK: - UICollectionViewDelegate From 485ecc8e570b37e968e04bbe004d22e54965c49a Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 14:53:15 +0100 Subject: [PATCH 87/94] Fix title for login-screen (#690) Was a norma label, is the _real_ title now --- .../Onboarding/Login/MastodonLoginView.swift | 37 ++++++------------- .../Login/MastodonLoginViewController.swift | 4 ++ 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginView.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginView.swift index d5f8b51d4..4b96679f2 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginView.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginView.swift @@ -13,9 +13,7 @@ class MastodonLoginView: UIView { // List with (filtered) domains - let titleLabel: UILabel - let subtitleLabel: UILabel - private let headerStackView: UIStackView + let explanationTextLabel: UILabel let searchTextField: UITextField private let searchTextFieldLeftView: UIView @@ -28,22 +26,12 @@ class MastodonLoginView: UIView { override init(frame: CGRect) { - titleLabel = UILabel() - titleLabel.font = MastodonLoginViewController.largeTitleFont - titleLabel.textColor = MastodonLoginViewController.largeTitleTextColor - titleLabel.text = L10n.Scene.Login.title - titleLabel.numberOfLines = 0 - - subtitleLabel = UILabel() - subtitleLabel.font = MastodonLoginViewController.subTitleFont - subtitleLabel.textColor = MastodonLoginViewController.subTitleTextColor - subtitleLabel.text = L10n.Scene.Login.subtitle - subtitleLabel.numberOfLines = 0 - - headerStackView = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel]) - headerStackView.axis = .vertical - headerStackView.spacing = 16 - headerStackView.translatesAutoresizingMaskIntoConstraints = false + explanationTextLabel = UILabel() + explanationTextLabel.translatesAutoresizingMaskIntoConstraints = false + explanationTextLabel.font = MastodonLoginViewController.subTitleFont + explanationTextLabel.textColor = MastodonLoginViewController.subTitleTextColor + explanationTextLabel.text = L10n.Scene.Login.subtitle + explanationTextLabel.numberOfLines = 0 searchTextFieldMagnifyingGlass = UIImageView(image: UIImage( systemName: "magnifyingglass", @@ -81,7 +69,7 @@ class MastodonLoginView: UIView { super.init(frame: frame) - addSubview(headerStackView) + addSubview(explanationTextLabel) addSubview(searchTextField) addSubview(tableView) addSubview(navigationActionView) @@ -99,12 +87,11 @@ class MastodonLoginView: UIView { let bottomConstraint = safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: navigationActionView.bottomAnchor) let constraints = [ + explanationTextLabel.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), + explanationTextLabel.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor), + explanationTextLabel.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor), - headerStackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor), - headerStackView.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor), - headerStackView.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor), - - searchTextField.topAnchor.constraint(equalTo: headerStackView.bottomAnchor, constant: 32), + searchTextField.topAnchor.constraint(equalTo: explanationTextLabel.bottomAnchor, constant: 32), searchTextField.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), searchTextField.heightAnchor.constraint(equalToConstant: 55), trailingAnchor.constraint(equalTo: searchTextField.trailingAnchor, constant: 16), diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift index 9f9ce5d75..c9609ebc3 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift @@ -11,6 +11,7 @@ import MastodonCore import MastodonAsset import Combine import AuthenticationServices +import MastodonLocalization protocol MastodonLoginViewControllerDelegate: AnyObject { func backButtonPressed(_ viewController: MastodonLoginViewController) @@ -97,6 +98,9 @@ class MastodonLoginViewController: UIViewController, NeedsDependency { defer { setupNavigationBarBackgroundView() } setupOnboardingAppearance() + + title = L10n.Scene.Login.title + navigationItem.hidesBackButton = true } override func viewWillAppear(_ animated: Bool) { From f9661db0df07e5b452598d4e632068b52af5dffc Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 15:15:31 +0100 Subject: [PATCH 88/94] Remove duplicated code (#690) --- .../Onboarding/Welcome/WelcomeViewController.swift | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index d6f8cda7d..20d34b053 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -275,17 +275,7 @@ extension WelcomeViewController { } // MARK: - OnboardingViewControllerAppearance -extension WelcomeViewController: OnboardingViewControllerAppearance { - func setupNavigationBarAppearance() { - // always transparent - let barAppearance = UINavigationBarAppearance() - barAppearance.configureWithTransparentBackground() - navigationItem.standardAppearance = barAppearance - navigationItem.compactAppearance = barAppearance - navigationItem.scrollEdgeAppearance = barAppearance - navigationItem.compactScrollEdgeAppearance = barAppearance - } -} +extension WelcomeViewController: OnboardingViewControllerAppearance {} // MARK: - UIAdaptivePresentationControllerDelegate extension WelcomeViewController: UIAdaptivePresentationControllerDelegate { From 769355b4c24cbcd6040e548a5131fe2ee07b2f0e Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 15:21:33 +0100 Subject: [PATCH 89/94] Fix localization-json-issues (#690) --- Localization/app.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index 0cd771307..d048eeadb 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -304,7 +304,7 @@ "signup_speed": { "all": "All", "instant": "Instant Sign-up", - "manually_reviewed" = "Manual Review" + "manually_reviewed": "Manual Review" }, "language": { "all": "All" @@ -316,9 +316,8 @@ "privacy": { "title": "Privacy", "policy": { - "ios": "Privacy Policy - Mastodon for iOS"; - "server" = "Privacy Policy - %s"; - + "ios": "Privacy Policy - Mastodon for iOS", + "server": "Privacy Policy - %s" }, "button": { "confirm": "I agree" @@ -392,7 +391,7 @@ "terms_of_service": "terms of service", "privacy_policy": "privacy policy", "button": { - "confirm": "I Agree" + "confirm": "I agree" } }, "confirm_email": { From d220949514181321c75f09676296c49a9e16ff52 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 15:25:52 +0100 Subject: [PATCH 90/94] Remove obsolete dependency (#690) --- .../xcshareddata/swiftpm/Package.resolved | 9 --------- .../MastodonConfirmEmailViewController.swift | 1 - MastodonSDK/Package.swift | 2 -- 3 files changed, 12 deletions(-) diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved index b13fa6d4a..e029f5bed 100644 --- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -217,15 +217,6 @@ "version": "2.13.0" } }, - { - "package": "ThirdPartyMailer", - "repositoryURL": "https://github.com/vtourraine/ThirdPartyMailer.git", - "state": { - "branch": null, - "revision": "44c1cfaa6969963f22691aa67f88a69e3b6d651f", - "version": "2.1.0" - } - }, { "package": "TOCropViewController", "repositoryURL": "https://github.com/TimOliver/TOCropViewController.git", diff --git a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift index 411c0eddb..3b1712f54 100644 --- a/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift +++ b/Mastodon/Scene/Onboarding/ConfirmEmail/MastodonConfirmEmailViewController.swift @@ -8,7 +8,6 @@ import Combine import MastodonSDK import os.log -import ThirdPartyMailer import UIKit import MastodonAsset import MastodonCore diff --git a/MastodonSDK/Package.swift b/MastodonSDK/Package.swift index 32dbfb2c8..6d87f3d1b 100644 --- a/MastodonSDK/Package.swift +++ b/MastodonSDK/Package.swift @@ -53,7 +53,6 @@ let package = Package( .package(url: "https://github.com/TwidereProject/MetaTextKit.git", exact: "2.2.5"), .package(url: "https://github.com/TwidereProject/TabBarPager.git", from: "0.1.0"), .package(url: "https://github.com/uias/Tabman", from: "2.13.0"), - .package(url: "https://github.com/vtourraine/ThirdPartyMailer.git", from: "2.1.0"), .package(url: "https://github.com/woxtu/UIHostingConfigurationBackport.git", from: "0.1.0"), .package(url: "https://github.com/SDWebImage/SDWebImage.git", from: "5.12.0"), .package(url: "https://github.com/eneko/Stripes.git", from: "0.2.0"), @@ -126,7 +125,6 @@ let package = Package( .product(name: "UITextView+Placeholder", package: "UITextView-Placeholder"), .product(name: "UIHostingConfigurationBackport", package: "UIHostingConfigurationBackport"), .product(name: "TabBarPager", package: "TabBarPager"), - .product(name: "ThirdPartyMailer", package: "ThirdPartyMailer"), .product(name: "OrderedCollections", package: "swift-collections"), .product(name: "Tabman", package: "Tabman"), .product(name: "MetaTextKit", package: "MetaTextKit"), From 35d9caabbe9fa7dbf2d6aa8bd1f7116bbf7e15cc Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sun, 8 Jan 2023 15:34:16 +0100 Subject: [PATCH 91/94] Minor cleanup here and there (#690) --- .../Onboarding/PickServer/MastodonPickServerViewModel.swift | 2 +- .../Scene/Onboarding/Register/MastodonRegisterView.swift | 5 ----- .../ServerRules/Cell/ServerRulesTableViewCell.swift | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 0b874497d..785c49f34 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -20,7 +20,7 @@ import MastodonLocalization class MastodonPickServerViewModel: NSObject { enum EmptyStateViewState { - case none + case none case loading case badNetwork } diff --git a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift index 9c9c2ad1d..84942fe90 100644 --- a/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift +++ b/Mastodon/Scene/Onboarding/Register/MastodonRegisterView.swift @@ -136,11 +136,6 @@ struct MastodonRegisterView: View { .padding() .background(borderColor) .cornerRadius(10) -// .overlay( -// RoundedRectangle(cornerRadius: 10) -// .stroke(borderColor, lineWidth: 1) -// .animation(.easeInOut, value: validateState) -// ) } } } diff --git a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift index 94fbeec41..7eeec22e5 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift @@ -43,7 +43,6 @@ extension ServerRulesTableViewCell { private func _init() { selectionStyle = .none -// backgroundColor = .systemBackground indexImageView.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(indexImageView) From 06de4745282dc100842079615eb389d67633f6a0 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Mon, 9 Jan 2023 10:16:20 +0100 Subject: [PATCH 92/94] chore(i18n): fix broken json --- Localization/app.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Localization/app.json b/Localization/app.json index d048eeadb..dc758bb7b 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -322,7 +322,7 @@ "button": { "confirm": "I agree" } - } + }, "register": { "title": "Create account", "input": { From be3b91e334c940d41d39aefa266dbe4a15bc1e89 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Mon, 9 Jan 2023 10:18:23 +0100 Subject: [PATCH 93/94] chore(i18n): Update strings --- .../input/Base.lproj/app.json | 33 +++++++++--- .../Generated/Strings.swift | 38 ++++++------- .../Resources/Base.lproj/Localizable.strings | 54 +++++++++---------- .../Resources/ar.lproj/Localizable.strings | 23 ++++---- .../Resources/ca.lproj/Localizable.strings | 13 +++-- .../Resources/ckb.lproj/Localizable.strings | 9 ++-- .../Resources/cs.lproj/Localizable.strings | 39 +++++++------- .../cs.lproj/Localizable.stringsdict | 2 +- .../Resources/de.lproj/Localizable.strings | 13 +++-- .../Resources/en.lproj/Localizable.strings | 41 ++++++-------- .../Resources/es.lproj/Localizable.strings | 15 +++--- .../Resources/eu.lproj/Localizable.strings | 9 ++-- .../Resources/fi.lproj/Localizable.strings | 13 +++-- .../Resources/fr.lproj/Localizable.strings | 13 +++-- .../Resources/gd.lproj/Localizable.strings | 9 ++-- .../Resources/gl.lproj/Localizable.strings | 13 +++-- .../Resources/it.lproj/Localizable.strings | 13 +++-- .../Resources/ja.lproj/Localizable.strings | 9 ++-- .../Resources/kab.lproj/Localizable.strings | 9 ++-- .../Resources/ku.lproj/Localizable.strings | 21 ++++---- .../Resources/nl.lproj/Localizable.strings | 9 ++-- .../Resources/ru.lproj/Localizable.strings | 9 ++-- .../Resources/sl.lproj/Localizable.strings | 15 +++--- .../Resources/sv.lproj/Localizable.strings | 13 +++-- .../Resources/th.lproj/Localizable.strings | 15 +++--- .../Resources/tr.lproj/Localizable.strings | 9 ++-- .../Resources/vi.lproj/Localizable.strings | 13 +++-- .../zh-Hans.lproj/Localizable.strings | 9 ++-- .../zh-Hant.lproj/Localizable.strings | 13 +++-- 29 files changed, 283 insertions(+), 211 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index 23180ac89..dc758bb7b 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -267,6 +267,8 @@ "server_picker": { "title": "Pick Server", "button": { + "language": "Language", + "signup_speed": "Sign-up Speed", "category": { "all": "All", "all_accessiblity_description": "Category: All", @@ -298,19 +300,29 @@ "finding_servers": "Finding available servers...", "bad_network": "Something went wrong while loading the data. Check your internet connection.", "no_results": "No results" + }, + "signup_speed": { + "all": "All", + "instant": "Instant Sign-up", + "manually_reviewed": "Manual Review" + }, + "language": { + "all": "All" + }, + "search": { + "placeholder": "Search name or URL" } }, "privacy": { "title": "Privacy", "policy": { - "ios": "Privacy Policy - Mastodon for iOS"; - "server" = "Privacy Policy - %s"; - + "ios": "Privacy Policy - Mastodon for iOS", + "server": "Privacy Policy - %s" }, "button": { "confirm": "I agree" } - } + }, "register": { "title": "Create account", "input": { @@ -319,7 +331,8 @@ }, "username": { "placeholder": "username", - "duplicate_prompt": "This username is taken." + "duplicate_prompt": "This username is taken.", + "suggestion": "amazing_%@" }, "display_name": { "placeholder": "display name" @@ -378,14 +391,13 @@ "terms_of_service": "terms of service", "privacy_policy": "privacy policy", "button": { - "confirm": "I Agree" + "confirm": "I agree" } }, "confirm_email": { - "title": "One last thing.", + "title": "Check Your Inbox", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. We’ll wait right here.", "button": { - "open_email_app": "Open Email App", "resend": "Resend" }, "dont_receive_email": { @@ -398,6 +410,11 @@ "description": "We just sent you an email. Check your junk folder if you haven’t.", "mail": "Mail", "open_email_client": "Open Email Client" + }, + "didnt_get_link": { + "prefix": "Didn't get a Link?", + "resend_in": "Resend (%@)", + "resend_now": "Resend now." } }, "home_timeline": { diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 9034cf0c5..8cca23a3b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -620,9 +620,9 @@ public enum L10n { } } public enum ConfirmEmail { - /// Tap the link we sent you to verify %@. We'll wait right here. + /// Tap the link we sent you to verify %@. We’ll wait right here. public static func tapTheLinkWeEmailedToYouToVerifyYourAccount(_ p1: Any) -> String { - return L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", String(describing: p1), fallback: "Tap the link we sent you to verify %@. We'll wait right here.") + return L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", String(describing: p1), fallback: "Tap the link we sent you to verify %@. We’ll wait right here.") } /// Check Your Inbox public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.Title", fallback: "Check Your Inbox") @@ -800,13 +800,11 @@ public enum L10n { } } public enum Privacy { - /// Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy. - public static let description = L10n.tr("Localizable", "Scene.Privacy.Description", fallback: "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy.") /// Privacy public static let title = L10n.tr("Localizable", "Scene.Privacy.Title", fallback: "Privacy") public enum Button { /// I agree - public static let confirm = L10n.tr("Localizable", "Scene.Privacy.Button.confirm", fallback: "I agree") + public static let confirm = L10n.tr("Localizable", "Scene.Privacy.Button.Confirm", fallback: "I agree") } public enum Policy { /// Privacy Policy - Mastodon for iOS @@ -1022,12 +1020,12 @@ public enum L10n { public enum Password { /// 8 characters public static let characterLimit = L10n.tr("Localizable", "Scene.Register.Input.Password.CharacterLimit", fallback: "8 characters") - /// Confirm password - public static let confirmationPlaceholder = L10n.tr("Localizable", "Scene.Register.Input.Password.ConfirmationPlaceholder", fallback: "Confirm password") + /// Confirm Password + public static let confirmationPlaceholder = L10n.tr("Localizable", "Scene.Register.Input.Password.ConfirmationPlaceholder", fallback: "Confirm Password") /// Your password needs at least eight characters public static let hint = L10n.tr("Localizable", "Scene.Register.Input.Password.Hint", fallback: "Your password needs at least eight characters") - /// Password - public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "Password") + /// password + public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "password") /// Your password needs at least: public static let require = L10n.tr("Localizable", "Scene.Register.Input.Password.Require", fallback: "Your password needs at least:") public enum Accessibility { @@ -1212,10 +1210,8 @@ public enum L10n { } } public enum ServerPicker { - /// We’ll pick a server based on your language if you continue without making a selection. - public static let noServerSelectedHint = L10n.tr("Localizable", "Scene.ServerPicker.NoServerSelectedHint", fallback: "We’ll pick a server based on your language if you continue without making a selection.") - /// Pick server - public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick server") + /// Pick Server + public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick Server") public enum Button { /// Language public static let language = L10n.tr("Localizable", "Scene.ServerPicker.Button.Language", fallback: "Language") @@ -1309,8 +1305,8 @@ public enum L10n { /// Some ground rules. public static let title = L10n.tr("Localizable", "Scene.ServerRules.Title", fallback: "Some ground rules.") public enum Button { - /// I Agree - public static let confirm = L10n.tr("Localizable", "Scene.ServerRules.Button.Confirm", fallback: "I Agree") + /// I agree + public static let confirm = L10n.tr("Localizable", "Scene.ServerRules.Button.Confirm", fallback: "I agree") } } public enum Settings { @@ -1434,23 +1430,23 @@ public enum L10n { /// Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. /// /// You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.description", fallback: "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.Description", fallback: "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.") /// How do I pick a server? - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.title", fallback: "How do I pick a server?") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.Title", fallback: "How do I pick a server?") } public enum MastodonIsLikeThat { /// Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.description", fallback: "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.Description", fallback: "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.") /// Mastodon is like that - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.title", fallback: "Mastodon is like that") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.Title", fallback: "Mastodon is like that") } public enum WhatIsMastodon { /// Imagine you have an email address that ends with @example.com. /// /// You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.description", fallback: "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.Description", fallback: "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.") /// What is - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.title", fallback: "What is") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.Title", fallback: "What is") } } } diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index acafb44ab..56eb2aa28 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -225,6 +225,9 @@ uploaded to Mastodon."; "Scene.Compose.Visibility.Public" = "Public"; "Scene.Compose.Visibility.Unlisted" = "Unlisted"; "Scene.ConfirmEmail.Button.Resend" = "Resend"; +"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; +"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; +"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.ConfirmEmail.DontReceiveEmail.Description" = "Check if your email address is correct as well as your junk folder if you haven’t."; "Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Resend Email"; "Scene.ConfirmEmail.DontReceiveEmail.Title" = "Check your email"; @@ -232,11 +235,8 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.Mail" = "Mail"; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We’ll wait right here."; "Scene.ConfirmEmail.Title" = "Check Your Inbox"; -"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; -"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; -"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; @@ -284,6 +284,10 @@ uploaded to Mastodon."; "Scene.Preview.Keyboard.ClosePreview" = "Close Preview"; "Scene.Preview.Keyboard.ShowNext" = "Show Next"; "Scene.Preview.Keyboard.ShowPrevious" = "Show Previous"; +"Scene.Privacy.Button.Confirm" = "I agree"; +"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; +"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; +"Scene.Privacy.Title" = "Privacy"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; @@ -346,9 +350,9 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Accessibility.Checked" = "checked"; "Scene.Register.Input.Password.Accessibility.Unchecked" = "unchecked"; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; +"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm Password"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; -"Scene.Register.Input.Password.Placeholder" = "Password"; -"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; +"Scene.Register.Input.Password.Placeholder" = "password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; @@ -428,9 +432,9 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Music" = "music"; "Scene.ServerPicker.Button.Category.Regional" = "regional"; "Scene.ServerPicker.Button.Category.Tech" = "tech"; +"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; -"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; @@ -439,14 +443,13 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Title" = "Pick server"; -"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; +"Scene.ServerPicker.Language.All" = "All"; +"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; -"Scene.ServerPicker.Language.All" = "All"; -"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; -"Scene.ServerRules.Button.Confirm" = "I Agree"; +"Scene.ServerPicker.Title" = "Pick Server"; +"Scene.ServerRules.Button.Confirm" = "I agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; "Scene.ServerRules.Subtitle" = "These are set and enforced by the %@ moderators."; @@ -491,25 +494,20 @@ uploaded to Mastodon."; "Scene.SuggestionAccount.Title" = "Find People to Follow"; "Scene.Thread.BackTitle" = "Post"; "Scene.Thread.Title" = "Post from %@"; +"Scene.Welcome.Education.HowDoIPickAServer.Description" = "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. + +You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; +"Scene.Welcome.Education.HowDoIPickAServer.Title" = "How do I pick a server?"; +"Scene.Welcome.Education.MastodonIsLikeThat.Description" = "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online."; +"Scene.Welcome.Education.MastodonIsLikeThat.Title" = "Mastodon is like that"; +"Scene.Welcome.Education.WhatIsMastodon.Description" = "Imagine you have an email address that ends with @example.com. + +You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com."; +"Scene.Welcome.Education.WhatIsMastodon.Title" = "What is"; "Scene.Welcome.GetStarted" = "Get Started"; "Scene.Welcome.LogIn" = "Log In"; "Scene.Welcome.Slogan" = "Social networking back in your hands."; -"Scene.Welcome.Education.WhatIsMastodon.title" = "What is"; -"Scene.Welcome.Education.WhatIsMastodon.description" = "Imagine you have an email address that ends with @example.com. - -You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com."; -"Scene.Welcome.Education.MastodonIsLikeThat.title" = "Mastodon is like that"; -"Scene.Welcome.Education.MastodonIsLikeThat.description" = "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online."; -"Scene.Welcome.Education.HowDoIPickAServer.title" = "How do I pick a server?"; -"Scene.Welcome.Education.HowDoIPickAServer.description" = "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. - -You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; -"Scene.Privacy.Title" = "Privacy"; -"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; -"Scene.Privacy.Button.confirm" = "I agree"; -"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; -"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings index 8ecefd32e..e308e7738 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings @@ -63,8 +63,8 @@ "Common.Controls.Actions.SignUp" = "إنشاءُ حِساب"; "Common.Controls.Actions.Skip" = "تخطي"; "Common.Controls.Actions.TakePhoto" = "اِلتِقاطُ صُورَة"; -"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; -"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; +"Common.Controls.Actions.TranslatePost.Title" = "الترجَمَة مِن %@"; +"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "غير مَعرُوفة"; "Common.Controls.Actions.TryAgain" = "المُحاولة مرة أُخرى"; "Common.Controls.Actions.UnblockDomain" = "رفع الحظر عن %@"; "Common.Controls.Friendship.Block" = "حظر"; @@ -106,7 +106,7 @@ "Common.Controls.Status.Actions.Menu" = "القائمة"; "Common.Controls.Status.Actions.Reblog" = "إعادة النشر"; "Common.Controls.Status.Actions.Reply" = "الرَّد"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "مُشارَكَة الرابِط فِي مَنشور"; "Common.Controls.Status.Actions.ShowGif" = "أظْهِر GIF"; "Common.Controls.Status.Actions.ShowImage" = "أظْهِرِ الصُّورَة"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "أظْهِر مُشَغِّلَ المَقاطِعِ المَرئِيَّة"; @@ -115,7 +115,7 @@ "Common.Controls.Status.Actions.Unreblog" = "التراجُع عن إعادة النشر"; "Common.Controls.Status.ContentWarning" = "تحذير المُحتوى"; "Common.Controls.Status.LinkViaUser" = "%@ via %@"; -"Common.Controls.Status.LoadEmbed" = "Load Embed"; +"Common.Controls.Status.LoadEmbed" = "تحميل المُضمَن"; "Common.Controls.Status.MediaContentWarning" = "اُنقُر لِلكَشف"; "Common.Controls.Status.MetaEntity.Email" = "عُنوان البريد الإلكتُروني: %@"; "Common.Controls.Status.MetaEntity.Hashtag" = "وَسْم: %@"; @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "عنوان URL"; "Common.Controls.Status.TapToReveal" = "اُنقُر لِلكَشف"; "Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; -"Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.TranslatedFrom" = "الترجَمَة مِن %@ بِاستِخدَام %@"; +"Common.Controls.Status.Translation.UnknownLanguage" = "غير مَعرُوفة"; +"Common.Controls.Status.Translation.UnknownProvider" = "غير مَعرُوف"; "Common.Controls.Status.UserReblogged" = "أعادَ %@ تَدوينَها"; "Common.Controls.Status.UserRepliedTo" = "رَدًا على %@"; "Common.Controls.Status.Visibility.Direct" = "المُستخدمِونَ المُشارِ إليهم فَقَطْ مَن يُمكِنُهُم رُؤيَةُ هَذَا المَنشُور."; @@ -283,9 +283,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "تَحريرُ الصُّورَةِ الرَّمزِيَّة"; "Scene.Profile.Accessibility.ShowAvatarImage" = "أظْهِر الصُّورَةَ الرَّمزِيَّة"; "Scene.Profile.Accessibility.ShowBannerImage" = "أظْهِر صُورَةَ الرَّايَة"; -"Scene.Profile.Dashboard.Followers" = "مُتابِع"; -"Scene.Profile.Dashboard.Following" = "مُتابَع"; -"Scene.Profile.Dashboard.Posts" = "مَنشورات"; +"Scene.Profile.Dashboard.MyFollowers" = "مُتابِعُون"; +"Scene.Profile.Dashboard.MyFollowing" = "مُتابَعُون"; +"Scene.Profile.Dashboard.MyPosts" = "مَنشورات"; +"Scene.Profile.Dashboard.OtherFollowers" = "مُتابِعُون"; +"Scene.Profile.Dashboard.OtherFollowing" = "مُتابَعُون"; +"Scene.Profile.Dashboard.OtherPosts" = "مَنشورات"; "Scene.Profile.Fields.AddRow" = "إضافة صف"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "المُحتَوى"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings index acd53cc03..2283d02fa 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings @@ -134,9 +134,9 @@ Comprova la connexió a Internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Toca per a mostrar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostra l'original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Traduït del %@ fent servir %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Desconegut"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Desconegut"; "Common.Controls.Status.UserReblogged" = "%@ ha impulsat"; "Common.Controls.Status.UserRepliedTo" = "Ha respòs a %@"; "Common.Controls.Status.Visibility.Direct" = "Només l'usuari mencionat pot veure aquesta publicació."; @@ -283,9 +283,12 @@ carregat a Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edita l'imatge del avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostra l'imatge del avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostra l'imatge del bàner"; -"Scene.Profile.Dashboard.Followers" = "seguidors"; -"Scene.Profile.Dashboard.Following" = "seguint"; -"Scene.Profile.Dashboard.Posts" = "tuts"; +"Scene.Profile.Dashboard.MyFollowers" = "seguidors"; +"Scene.Profile.Dashboard.MyFollowing" = "seguint"; +"Scene.Profile.Dashboard.MyPosts" = "tuts"; +"Scene.Profile.Dashboard.OtherFollowers" = "seguidors"; +"Scene.Profile.Dashboard.OtherFollowing" = "seguint"; +"Scene.Profile.Dashboard.OtherPosts" = "tuts"; "Scene.Profile.Fields.AddRow" = "Afegeix fila"; "Scene.Profile.Fields.Joined" = "S'hi va unir"; "Scene.Profile.Fields.Placeholder.Content" = "Contingut"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings index 5f6f124a1..3a8b3c1ae 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings @@ -282,9 +282,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "دەستکاریی وێنەکە بکە"; "Scene.Profile.Accessibility.ShowAvatarImage" = "وێنەکە نیشان بدە"; "Scene.Profile.Accessibility.ShowBannerImage" = "وێنەکەی پشتەوە نیشان بدە"; -"Scene.Profile.Dashboard.Followers" = "شوێنکەوتوو"; -"Scene.Profile.Dashboard.Following" = "شوێنکەوتن"; -"Scene.Profile.Dashboard.Posts" = "پۆستەکان"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "ڕیز زیاد بکە"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "ناوەڕۆک"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings index 8a8a977b7..3f2a25942 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings @@ -23,8 +23,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Alerts.SignOut.Title" = "Odhlásit se"; "Common.Alerts.SignUpFailure.Title" = "Registrace selhala"; "Common.Alerts.TranslationFailed.Button" = "OK"; -"Common.Alerts.TranslationFailed.Message" = "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported."; -"Common.Alerts.TranslationFailed.Title" = "Note"; +"Common.Alerts.TranslationFailed.Message" = "Překlad se nezdařil. Správce možná nepovolil překlad na tomto serveru nebo tento server používá starší verzi Mastodonu, kde překlady ještě nejsou podporovány."; +"Common.Alerts.TranslationFailed.Title" = "Poznámka"; "Common.Alerts.VoteFailure.PollEnded" = "Anketa skončila"; "Common.Alerts.VoteFailure.Title" = "Selhání hlasování"; "Common.Controls.Actions.Add" = "Přidat"; @@ -34,7 +34,7 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Actions.Compose" = "Napsat"; "Common.Controls.Actions.Confirm" = "Potvrdit"; "Common.Controls.Actions.Continue" = "Pokračovat"; -"Common.Controls.Actions.Copy" = "Copy"; +"Common.Controls.Actions.Copy" = "Kopírovat"; "Common.Controls.Actions.CopyPhoto" = "Kopírovat fotografii"; "Common.Controls.Actions.Delete" = "Smazat"; "Common.Controls.Actions.Discard" = "Zahodit"; @@ -63,8 +63,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Actions.SignUp" = "Vytvořit účet"; "Common.Controls.Actions.Skip" = "Přeskočit"; "Common.Controls.Actions.TakePhoto" = "Vyfotit"; -"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; -"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; +"Common.Controls.Actions.TranslatePost.Title" = "Přeložit z %@"; +"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Neznámý"; "Common.Controls.Actions.TryAgain" = "Zkusit znovu"; "Common.Controls.Actions.UnblockDomain" = "Odblokovat %@"; "Common.Controls.Friendship.Block" = "Blokovat"; @@ -99,14 +99,14 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Keyboard.Timeline.PreviousStatus" = "Předchozí příspěvek"; "Common.Controls.Keyboard.Timeline.ReplyStatus" = "Odpovědět na příspěvek"; "Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "Přepnout varování obsahu"; -"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Toggle Favorite on Post"; +"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Přepnout Oblíbené na příspěvku"; "Common.Controls.Keyboard.Timeline.ToggleReblog" = "Přepnout Reblog na příspěvku"; "Common.Controls.Status.Actions.Favorite" = "Oblíbit"; "Common.Controls.Status.Actions.Hide" = "Skrýt"; "Common.Controls.Status.Actions.Menu" = "Nabídka"; "Common.Controls.Status.Actions.Reblog" = "Boostnout"; "Common.Controls.Status.Actions.Reply" = "Odpovědět"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "Sdílet odkaz v příspěvku"; "Common.Controls.Status.Actions.ShowGif" = "Zobrazit GIF"; "Common.Controls.Status.Actions.ShowImage" = "Zobrazit obrázek"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Zobrazit video přehrávač"; @@ -114,8 +114,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Status.Actions.Unfavorite" = "Odebrat z oblízených"; "Common.Controls.Status.Actions.Unreblog" = "Undo reblog"; "Common.Controls.Status.ContentWarning" = "Varování o obsahu"; -"Common.Controls.Status.LinkViaUser" = "%@ via %@"; -"Common.Controls.Status.LoadEmbed" = "Load Embed"; +"Common.Controls.Status.LinkViaUser" = "%@ přes %@"; +"Common.Controls.Status.LoadEmbed" = "Načíst vložené"; "Common.Controls.Status.MediaContentWarning" = "Klepnutím kdekoli zobrazíte"; "Common.Controls.Status.MetaEntity.Email" = "E-mailová adresa: %@"; "Common.Controls.Status.MetaEntity.Hashtag" = "Hashtag: %@"; @@ -133,10 +133,10 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Status.Tag.Mention" = "Zmínka"; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Klepnutím zobrazit"; -"Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; -"Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.ShowOriginal" = "Zobrazit originál"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Přeloženo z %@ pomocí %@"; +"Common.Controls.Status.Translation.UnknownLanguage" = "Neznámý"; +"Common.Controls.Status.Translation.UnknownProvider" = "Neznámý"; "Common.Controls.Status.UserReblogged" = "%@ reblogged"; "Common.Controls.Status.UserRepliedTo" = "Odpověděl %@"; "Common.Controls.Status.Visibility.Direct" = "Pouze zmíněný uživatel může vidět tento příspěvek."; @@ -146,7 +146,7 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Tabs.Home" = "Domů"; "Common.Controls.Tabs.Notifications" = "Oznámení"; "Common.Controls.Tabs.Profile" = "Profil"; -"Common.Controls.Tabs.SearchAndExplore" = "Search and Explore"; +"Common.Controls.Tabs.SearchAndExplore" = "Hledat a zkoumat"; "Common.Controls.Timeline.Filtered" = "Filtrováno"; "Common.Controls.Timeline.Header.BlockedWarning" = "Nemůžeš zobrazit profil tohoto uživatele, dokud tě neodblokují."; "Common.Controls.Timeline.Header.BlockingWarning" = "Nemůžete zobrazit profil tohoto uživatele, dokud ho neodblokujete. @@ -279,11 +279,14 @@ nahrán do Mastodonu."; "Scene.Profile.Accessibility.EditAvatarImage" = "Upravit obrázek avataru"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Zobrazit obrázek avataru"; "Scene.Profile.Accessibility.ShowBannerImage" = "Zobrazit obrázek banneru"; -"Scene.Profile.Dashboard.Followers" = "sledující"; -"Scene.Profile.Dashboard.Following" = "sledování"; -"Scene.Profile.Dashboard.Posts" = "příspěvky"; +"Scene.Profile.Dashboard.MyFollowers" = "sledující"; +"Scene.Profile.Dashboard.MyFollowing" = "sledování"; +"Scene.Profile.Dashboard.MyPosts" = "příspěvky"; +"Scene.Profile.Dashboard.OtherFollowers" = "sledující"; +"Scene.Profile.Dashboard.OtherFollowing" = "sledování"; +"Scene.Profile.Dashboard.OtherPosts" = "příspěvky"; "Scene.Profile.Fields.AddRow" = "Přidat řádek"; -"Scene.Profile.Fields.Joined" = "Joined"; +"Scene.Profile.Fields.Joined" = "Připojen/a"; "Scene.Profile.Fields.Placeholder.Content" = "Obsah"; "Scene.Profile.Fields.Placeholder.Label" = "Označení"; "Scene.Profile.Fields.Verified.Long" = "Vlastnictví tohoto odkazu bylo zkontrolováno na %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict index 6e44e9f0a..63e324a1b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict @@ -65,7 +65,7 @@ a11y.plural.count.characters_left NSStringLocalizedFormatKey - %#@character_count@ left + %#@character_count@ zbývá character_count NSStringFormatSpecTypeKey diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings index 74dbaeea6..7d75af18c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings @@ -134,9 +134,9 @@ Bitte überprüfe deine Internetverbindung."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Zum Anzeigen tippen"; "Common.Controls.Status.Translation.ShowOriginal" = "Original anzeigen"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Übersetzt von %@ mit %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Unbekannt"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unbekannt"; "Common.Controls.Status.UserReblogged" = "%@ teilte"; "Common.Controls.Status.UserRepliedTo" = "Antwortet auf %@"; "Common.Controls.Status.Visibility.Direct" = "Nur erwähnte Benutzer können diesen Beitrag sehen."; @@ -283,9 +283,12 @@ kann nicht auf Mastodon hochgeladen werden."; "Scene.Profile.Accessibility.EditAvatarImage" = "Profilbild bearbeiten"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Profilbild anzeigen"; "Scene.Profile.Accessibility.ShowBannerImage" = "Bannerbild anzeigen"; -"Scene.Profile.Dashboard.Followers" = "Folgende"; -"Scene.Profile.Dashboard.Following" = "Gefolgte"; -"Scene.Profile.Dashboard.Posts" = "Beiträge"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "folge ich"; +"Scene.Profile.Dashboard.MyPosts" = "Beiträge"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "folge ich"; +"Scene.Profile.Dashboard.OtherPosts" = "Beiträge"; "Scene.Profile.Fields.AddRow" = "Zeile hinzufügen"; "Scene.Profile.Fields.Joined" = "Beigetreten"; "Scene.Profile.Fields.Placeholder.Content" = "Inhalt"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index f45ef2c0b..4acaaf657 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -63,6 +63,8 @@ Please check your internet connection."; "Common.Controls.Actions.SignUp" = "Create account"; "Common.Controls.Actions.Skip" = "Skip"; "Common.Controls.Actions.TakePhoto" = "Take Photo"; +"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; +"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; "Common.Controls.Actions.TryAgain" = "Try Again"; "Common.Controls.Actions.UnblockDomain" = "Unblock %@"; "Common.Controls.Friendship.Block" = "Block"; @@ -228,11 +230,8 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; "Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; -"Scene.ConfirmEmail.Title" = "Check Your Inbox"; -"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; -"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; -"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we emailed to you to verify your account"; +"Scene.ConfirmEmail.Title" = "One last thing."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; @@ -284,9 +283,12 @@ uploaded to Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.Followers" = "followers"; -"Scene.Profile.Dashboard.Following" = "following"; -"Scene.Profile.Dashboard.Posts" = "posts"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Add Row"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Content"; @@ -341,12 +343,11 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; "Scene.Register.Input.Password.Placeholder" = "password"; -"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; -"Scene.Register.Input.Username.Suggestion" = "amazing_%@"; -"Scene.Register.Title" = "Create account"; +"Scene.Register.LetsGetYouSetUpOnDomain" = "Let’s get you set up on %@"; +"Scene.Register.Title" = "Let’s get you set up on %@"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; "Scene.Report.ReportSentTitle" = "Thanks for reporting, we’ll look into this."; @@ -423,8 +424,6 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Tech" = "tech"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; -"Scene.ServerPicker.Button.Language" = "Language"; -"Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; @@ -432,13 +431,8 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Title" = "Pick server"; -"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; -"Scene.ServerPicker.SignupSpeed.All" = "All"; -"Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; -"Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; -"Scene.ServerPicker.Language.All" = "All"; -"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; +"Scene.ServerPicker.Subtitle" = "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers."; +"Scene.ServerPicker.Title" = "Mastodon is made of users in different servers."; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; @@ -490,9 +484,4 @@ uploaded to Mastodon."; back in your hands."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; -"Scene.Privacy.Title" = "Privacy"; -"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; -"Scene.Privacy.Button.confirm" = "I agree"; -"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; -"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings index d9d6a6ff6..90cce63dd 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings @@ -134,9 +134,9 @@ Por favor, revise su conexión a internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tocar para revelar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostrar Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Traducido desde %@ usando %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Desconocido"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Desconocido"; "Common.Controls.Status.UserReblogged" = "%@ lo reblogueó"; "Common.Controls.Status.UserRepliedTo" = "En respuesta a %@"; "Common.Controls.Status.Visibility.Direct" = "Sólo el usuario mencionado puede ver este mensaje."; @@ -284,11 +284,14 @@ pulsa en el enlace para confirmar tu cuenta."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editar imagen del avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostrar imagen del avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostrar imagen de banner"; -"Scene.Profile.Dashboard.Followers" = "seguidores"; -"Scene.Profile.Dashboard.Following" = "siguiendo"; -"Scene.Profile.Dashboard.Posts" = "publicaciones"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Añadir Fila"; -"Scene.Profile.Fields.Joined" = "Joined"; +"Scene.Profile.Fields.Joined" = "Se unió"; "Scene.Profile.Fields.Placeholder.Content" = "Contenido"; "Scene.Profile.Fields.Placeholder.Label" = "Nombre para el campo"; "Scene.Profile.Fields.Verified.Long" = "La propiedad de este enlace fue verificada el %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings index 882e05ec6..e070f70e6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings @@ -283,9 +283,12 @@ Mastodonera igo."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editatu abatarra"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Erakutsi abatarra"; "Scene.Profile.Accessibility.ShowBannerImage" = "Erakutsi banner irudia"; -"Scene.Profile.Dashboard.Followers" = "jarraitzaile"; -"Scene.Profile.Dashboard.Following" = "jarraitzen"; -"Scene.Profile.Dashboard.Posts" = "bidalketa"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Gehitu errenkada"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Edukia"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings index de4bf3101..f7edb3ec1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings @@ -134,9 +134,9 @@ Tarkista internet-yhteytesi."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Käännetty kielestä %@ palvelulla %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Tuntematon"; "Common.Controls.Status.UserReblogged" = "%@ jakoi edelleen"; "Common.Controls.Status.UserRepliedTo" = "Vastasi %@:lle"; "Common.Controls.Status.Visibility.Direct" = "Only mentioned user can see this post."; @@ -283,9 +283,12 @@ uploaded to Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.Followers" = "seuraajat"; -"Scene.Profile.Dashboard.Following" = "seurataan"; -"Scene.Profile.Dashboard.Posts" = "julkaisut"; +"Scene.Profile.Dashboard.MyFollowers" = "seuraajat"; +"Scene.Profile.Dashboard.MyFollowing" = "seurattavat"; +"Scene.Profile.Dashboard.MyPosts" = "julkaisut"; +"Scene.Profile.Dashboard.OtherFollowers" = "seuraajat"; +"Scene.Profile.Dashboard.OtherFollowing" = "seurattavat"; +"Scene.Profile.Dashboard.OtherPosts" = "julkaisut"; "Scene.Profile.Fields.AddRow" = "Lisää rivi"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Sisältö"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings index 0bc619b34..b1ef9611c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings @@ -134,9 +134,9 @@ Veuillez vérifier votre accès à Internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Appuyer pour afficher"; "Common.Controls.Status.Translation.ShowOriginal" = "Afficher l’original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Traduit de %@ en utilisant %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Inconnu"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Inconnu"; "Common.Controls.Status.UserReblogged" = "%@ a reblogué"; "Common.Controls.Status.UserRepliedTo" = "À répondu à %@"; "Common.Controls.Status.Visibility.Direct" = "Seul·e l’utilisateur·rice mentionnée peut voir ce message."; @@ -283,9 +283,12 @@ téléversé sur Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Modifier l’avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Afficher l’avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Afficher l’image de la bannière"; -"Scene.Profile.Dashboard.Followers" = "abonnés"; -"Scene.Profile.Dashboard.Following" = "abonnements"; -"Scene.Profile.Dashboard.Posts" = "publications"; +"Scene.Profile.Dashboard.MyFollowers" = "abonnés"; +"Scene.Profile.Dashboard.MyFollowing" = "abonnement"; +"Scene.Profile.Dashboard.MyPosts" = "messages"; +"Scene.Profile.Dashboard.OtherFollowers" = "abonnés"; +"Scene.Profile.Dashboard.OtherFollowing" = "abonnement"; +"Scene.Profile.Dashboard.OtherPosts" = "publications"; "Scene.Profile.Fields.AddRow" = "Ajouter une rangée"; "Scene.Profile.Fields.Joined" = "Ici depuis"; "Scene.Profile.Fields.Placeholder.Content" = "Contenu"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings index e37be3344..79f4ab413 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings @@ -283,9 +283,12 @@ a luchdadh suas gu Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Deasaich dealbh an avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Seall dealbh an avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Seall dealbh brataich"; -"Scene.Profile.Dashboard.Followers" = "luchd-leantainn"; -"Scene.Profile.Dashboard.Following" = "a’ leantainn"; -"Scene.Profile.Dashboard.Posts" = "postaichean"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Cuir ràgh ris"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Susbaint"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings index 35a465661..84af4e3e8 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings @@ -134,9 +134,9 @@ Comproba a conexión a internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Toca para mostrar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostrar o orixinal"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Traducido do %@ usando %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Descoñecido"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Descoñecido"; "Common.Controls.Status.UserReblogged" = "%@ promoveu"; "Common.Controls.Status.UserRepliedTo" = "Respondeu a %@"; "Common.Controls.Status.Visibility.Direct" = "Só a usuaria mencionada pode ver a publicación."; @@ -283,9 +283,12 @@ ser subido a Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editar imaxe de avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostrar imaxe de avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostrar imaxe de cabeceira"; -"Scene.Profile.Dashboard.Followers" = "seguidoras"; -"Scene.Profile.Dashboard.Following" = "seguindo"; -"Scene.Profile.Dashboard.Posts" = "publicacións"; +"Scene.Profile.Dashboard.MyFollowers" = "seguidoras"; +"Scene.Profile.Dashboard.MyFollowing" = "seguindo"; +"Scene.Profile.Dashboard.MyPosts" = "publicacións"; +"Scene.Profile.Dashboard.OtherFollowers" = "seguidoras"; +"Scene.Profile.Dashboard.OtherFollowing" = "seguindo"; +"Scene.Profile.Dashboard.OtherPosts" = "publicacións"; "Scene.Profile.Fields.AddRow" = "Engadir fila"; "Scene.Profile.Fields.Joined" = "Uniuse"; "Scene.Profile.Fields.Placeholder.Content" = "Contido"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings index 96af84e22..7efd61097 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings @@ -134,9 +134,9 @@ Per favore verifica la tua connessione internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tocca per rivelare"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostra l'originale"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Tradotto da %@ utilizzando %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Sconosciuto"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Sconosciuto"; "Common.Controls.Status.UserReblogged" = "%@ ha condiviso"; "Common.Controls.Status.UserRepliedTo" = "Risposta a %@"; "Common.Controls.Status.Visibility.Direct" = "Solo l'utente menzionato può vedere questo post."; @@ -283,9 +283,12 @@ caricato su Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Modifica immagine avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostra immagine avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostra immagine banner"; -"Scene.Profile.Dashboard.Followers" = "seguaci"; -"Scene.Profile.Dashboard.Following" = "seguendo"; -"Scene.Profile.Dashboard.Posts" = "post"; +"Scene.Profile.Dashboard.MyFollowers" = "seguaci"; +"Scene.Profile.Dashboard.MyFollowing" = "seguendo"; +"Scene.Profile.Dashboard.MyPosts" = "post"; +"Scene.Profile.Dashboard.OtherFollowers" = "seguaci"; +"Scene.Profile.Dashboard.OtherFollowing" = "seguendo"; +"Scene.Profile.Dashboard.OtherPosts" = "post"; "Scene.Profile.Fields.AddRow" = "Aggiungi riga"; "Scene.Profile.Fields.Joined" = "Profilo iscritto"; "Scene.Profile.Fields.Placeholder.Content" = "Contenuto"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings index 3d32c96d1..6898d5d1e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings @@ -278,9 +278,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.Followers" = "フォロワー"; -"Scene.Profile.Dashboard.Following" = "フォロー"; -"Scene.Profile.Dashboard.Posts" = "投稿"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "行追加"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "コンテンツ"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings index 43a1d385a..d58ca034d 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings @@ -283,9 +283,12 @@ Ad d-yettwasali ɣef Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Ẓreg tugna n avaṭar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Sken tugna n avaṭar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Sken tugna n uɣerrac"; -"Scene.Profile.Dashboard.Followers" = "imeḍfaren"; -"Scene.Profile.Dashboard.Following" = "iṭafaṛ"; -"Scene.Profile.Dashboard.Posts" = "tisuffaɣ"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Rnu izirig"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Agbur"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings index 6eaa474f0..a99cd890a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings @@ -34,7 +34,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Actions.Compose" = "Binivîsîne"; "Common.Controls.Actions.Confirm" = "Bipejirîne"; "Common.Controls.Actions.Continue" = "Bidomîne"; -"Common.Controls.Actions.Copy" = "Copy"; +"Common.Controls.Actions.Copy" = "Jê bigire"; "Common.Controls.Actions.CopyPhoto" = "Wêneyê jê bigire"; "Common.Controls.Actions.Delete" = "Jê bibe"; "Common.Controls.Actions.Discard" = "Biavêje"; @@ -63,7 +63,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Actions.SignUp" = "Ajimêr biafirîne"; "Common.Controls.Actions.Skip" = "Derbas bike"; "Common.Controls.Actions.TakePhoto" = "Wêne bikişîne"; -"Common.Controls.Actions.TranslatePost.Title" = "Ji %@ hate wergerandin"; +"Common.Controls.Actions.TranslatePost.Title" = "Ji %@ wergerîne"; "Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Nenas"; "Common.Controls.Actions.TryAgain" = "Dîsa biceribîne"; "Common.Controls.Actions.UnblockDomain" = "%@ asteng neke"; @@ -106,7 +106,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Actions.Menu" = "Kulîn"; "Common.Controls.Status.Actions.Reblog" = "Ji nû ve nivîsandin"; "Common.Controls.Status.Actions.Reply" = "Bersivê bide"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "Girêdanê di şandiyê de parve bike"; "Common.Controls.Status.Actions.ShowGif" = "GIF nîşan bide"; "Common.Controls.Status.Actions.ShowImage" = "Wêneyê nîşan bide"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Lêdera vîdyoyê nîşan bide"; @@ -114,7 +114,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Actions.Unfavorite" = "Nebijarte"; "Common.Controls.Status.Actions.Unreblog" = "Ji nû ve nivîsandinê vegere"; "Common.Controls.Status.ContentWarning" = "Hişyariya naverokê"; -"Common.Controls.Status.LinkViaUser" = "%@ via %@"; +"Common.Controls.Status.LinkViaUser" = "%@ bi riya %@"; "Common.Controls.Status.LoadEmbed" = "Load Embed"; "Common.Controls.Status.MediaContentWarning" = "Ji bo eşkerekirinê li derekî bitikîne"; "Common.Controls.Status.MetaEntity.Email" = "Navnîşanên e-nameyê: %@"; @@ -134,9 +134,9 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Ji bo dîtinê bitikîne"; "Common.Controls.Status.Translation.ShowOriginal" = "A resen nîşan bide"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Hate wergerandin ji %@ bi riya %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Nenas"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Nenas"; "Common.Controls.Status.UserReblogged" = "%@ ji nû ve nivîsand"; "Common.Controls.Status.UserRepliedTo" = "Bersiv da %@"; "Common.Controls.Status.Visibility.Direct" = "Tenê bikarhênerê qalkirî dikare vê şandiyê bibîne."; @@ -284,9 +284,12 @@ girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin."; "Scene.Profile.Accessibility.EditAvatarImage" = "Wêneya avatar serrast bike"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Wêneya avatar nîşan bide"; "Scene.Profile.Accessibility.ShowBannerImage" = "Wêneya paşrûyê nîşan bide"; -"Scene.Profile.Dashboard.Followers" = "şopîner"; -"Scene.Profile.Dashboard.Following" = "dişopîne"; -"Scene.Profile.Dashboard.Posts" = "şandî"; +"Scene.Profile.Dashboard.MyFollowers" = "şopîner"; +"Scene.Profile.Dashboard.MyFollowing" = "dişopîne"; +"Scene.Profile.Dashboard.MyPosts" = "şandî"; +"Scene.Profile.Dashboard.OtherFollowers" = "şopîner"; +"Scene.Profile.Dashboard.OtherFollowing" = "dişopîne"; +"Scene.Profile.Dashboard.OtherPosts" = "şandî"; "Scene.Profile.Fields.AddRow" = "Rêzê tevlî bike"; "Scene.Profile.Fields.Joined" = "Dîroka tevlîbûnê"; "Scene.Profile.Fields.Placeholder.Content" = "Naverok"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings index 6e7839852..6c6bb2bc3 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings @@ -278,9 +278,12 @@ klik op de link om uw account te bevestigen."; "Scene.Profile.Accessibility.EditAvatarImage" = "Bewerk avatar-afbeelding"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Toon avatar-afbeelding"; "Scene.Profile.Accessibility.ShowBannerImage" = "Toon banner-afbeelding"; -"Scene.Profile.Dashboard.Followers" = "volgers"; -"Scene.Profile.Dashboard.Following" = "volgend"; -"Scene.Profile.Dashboard.Posts" = "berichten"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Rij Toevoegen"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Inhoud"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings index 8275902d4..2238fc347 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings @@ -294,9 +294,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.Followers" = "подписчики"; -"Scene.Profile.Dashboard.Following" = "подписки"; -"Scene.Profile.Dashboard.Posts" = "посты"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Добавить строку"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Содержимое"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings index 1aa2aab73..c7f371bfc 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings @@ -134,9 +134,9 @@ Preverite svojo internetno povezavo."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tapnite za razkritje"; "Common.Controls.Status.Translation.ShowOriginal" = "Pokaži izvirnik"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Prevedeno iz %@ s pomočjo %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Neznano"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Neznano"; "Common.Controls.Status.UserReblogged" = "%@ je poobjavil_a"; "Common.Controls.Status.UserRepliedTo" = "Odgovarja %@"; "Common.Controls.Status.Visibility.Direct" = "Samo omenjeni uporabnik lahko vidi to objavo."; @@ -283,11 +283,14 @@ možno naložiti v Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Uredi sliko avatarja"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Pokaži sliko avatarja"; "Scene.Profile.Accessibility.ShowBannerImage" = "Pokaži sliko pasice"; -"Scene.Profile.Dashboard.Followers" = "sledilcev"; -"Scene.Profile.Dashboard.Following" = "sledi"; -"Scene.Profile.Dashboard.Posts" = "Objave"; +"Scene.Profile.Dashboard.MyFollowers" = "sledilcev"; +"Scene.Profile.Dashboard.MyFollowing" = "sledi"; +"Scene.Profile.Dashboard.MyPosts" = "objav"; +"Scene.Profile.Dashboard.OtherFollowers" = "sledilcev"; +"Scene.Profile.Dashboard.OtherFollowing" = "sledi"; +"Scene.Profile.Dashboard.OtherPosts" = "objav"; "Scene.Profile.Fields.AddRow" = "Dodaj vrstico"; -"Scene.Profile.Fields.Joined" = "Joined"; +"Scene.Profile.Fields.Joined" = "Pridružen_a"; "Scene.Profile.Fields.Placeholder.Content" = "Vsebina"; "Scene.Profile.Fields.Placeholder.Label" = "Oznaka"; "Scene.Profile.Fields.Verified.Long" = "Lastništvo te povezave je bilo preverjeno %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings index 4da00cad1..562942280 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings @@ -134,9 +134,9 @@ Kontrollera din internetanslutning."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tryck för att visa"; "Common.Controls.Status.Translation.ShowOriginal" = "Visa original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Översatt från %@ med %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Okänt"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Okänd"; "Common.Controls.Status.UserReblogged" = "%@ boostade"; "Common.Controls.Status.UserRepliedTo" = "Svarade på %@"; "Common.Controls.Status.Visibility.Direct" = "Endast omnämnda användare kan se detta inlägg."; @@ -283,9 +283,12 @@ laddas upp till Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Redigera profilbild"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Visa profilbild"; "Scene.Profile.Accessibility.ShowBannerImage" = "Visa banner"; -"Scene.Profile.Dashboard.Followers" = "följare"; -"Scene.Profile.Dashboard.Following" = "följer"; -"Scene.Profile.Dashboard.Posts" = "inlägg"; +"Scene.Profile.Dashboard.MyFollowers" = "följare"; +"Scene.Profile.Dashboard.MyFollowing" = "följer"; +"Scene.Profile.Dashboard.MyPosts" = "inlägg"; +"Scene.Profile.Dashboard.OtherFollowers" = "följare"; +"Scene.Profile.Dashboard.OtherFollowing" = "följer"; +"Scene.Profile.Dashboard.OtherPosts" = "inlägg"; "Scene.Profile.Fields.AddRow" = "Lägg till rad"; "Scene.Profile.Fields.Joined" = "Gick med"; "Scene.Profile.Fields.Placeholder.Content" = "Innehåll"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings index 6aeeb2a74..5733ae5f2 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "แตะเพื่อเปิดเผย"; "Common.Controls.Status.Translation.ShowOriginal" = "แสดงดั้งเดิมอยู่"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "แปลจาก %@ โดยใช้ %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "ไม่รู้จัก"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "ไม่รู้จัก"; "Common.Controls.Status.UserReblogged" = "%@ ได้ดัน"; "Common.Controls.Status.UserRepliedTo" = "ตอบกลับ %@"; "Common.Controls.Status.Visibility.Direct" = "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้"; @@ -283,11 +283,14 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "แก้ไขภาพประจำตัว"; "Scene.Profile.Accessibility.ShowAvatarImage" = "แสดงภาพประจำตัว"; "Scene.Profile.Accessibility.ShowBannerImage" = "แสดงภาพแบนเนอร์"; -"Scene.Profile.Dashboard.Followers" = "ผู้ติดตาม"; -"Scene.Profile.Dashboard.Following" = "กำลังติดตาม"; -"Scene.Profile.Dashboard.Posts" = "โพสต์"; +"Scene.Profile.Dashboard.MyFollowers" = "ผู้ติดตาม"; +"Scene.Profile.Dashboard.MyFollowing" = "กำลังติดตาม"; +"Scene.Profile.Dashboard.MyPosts" = "โพสต์"; +"Scene.Profile.Dashboard.OtherFollowers" = "ผู้ติดตาม"; +"Scene.Profile.Dashboard.OtherFollowing" = "กำลังติดตาม"; +"Scene.Profile.Dashboard.OtherPosts" = "โพสต์"; "Scene.Profile.Fields.AddRow" = "เพิ่มแถว"; -"Scene.Profile.Fields.Joined" = "Joined"; +"Scene.Profile.Fields.Joined" = "เข้าร่วมเมื่อ"; "Scene.Profile.Fields.Placeholder.Content" = "เนื้อหา"; "Scene.Profile.Fields.Placeholder.Label" = "ป้ายชื่อ"; "Scene.Profile.Fields.Verified.Long" = "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings index c71fb332e..fe784e21c 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings @@ -282,9 +282,12 @@ yüklenemiyor."; "Scene.Profile.Accessibility.EditAvatarImage" = "Profil fotoğrafını düzenle"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Profil resmini göster"; "Scene.Profile.Accessibility.ShowBannerImage" = "Kapak fotoğrafını göster"; -"Scene.Profile.Dashboard.Followers" = "takipçi"; -"Scene.Profile.Dashboard.Following" = "takip ediliyor"; -"Scene.Profile.Dashboard.Posts" = "gönderiler"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Satır Ekle"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "İçerik"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings index dc66003cc..a7ff66a53 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings @@ -134,9 +134,9 @@ Vui lòng kiểm tra kết nối mạng."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Nhấn để xem"; "Common.Controls.Status.Translation.ShowOriginal" = "Bản gốc"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Dịch từ %@ bằng %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Không xác định"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Không biết"; "Common.Controls.Status.UserReblogged" = "%@ đăng lại"; "Common.Controls.Status.UserRepliedTo" = "Trả lời đến %@"; "Common.Controls.Status.Visibility.Direct" = "Chỉ người được nhắc đến có thể thấy tút."; @@ -283,9 +283,12 @@ tải lên Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Sửa ảnh đại diện"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Hiển thị ảnh đại diện"; "Scene.Profile.Accessibility.ShowBannerImage" = "Hiển thị ảnh bìa"; -"Scene.Profile.Dashboard.Followers" = "người theo dõi"; -"Scene.Profile.Dashboard.Following" = "theo dõi"; -"Scene.Profile.Dashboard.Posts" = "tút"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "Thêm hàng"; "Scene.Profile.Fields.Joined" = "Đã tham gia"; "Scene.Profile.Fields.Placeholder.Content" = "Nội dung"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings index 7d164f80e..f58d2fcbc 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings @@ -283,9 +283,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "编辑头像"; "Scene.Profile.Accessibility.ShowAvatarImage" = "显示头像"; "Scene.Profile.Accessibility.ShowBannerImage" = "显示顶部横幅图片"; -"Scene.Profile.Dashboard.Followers" = "关注者"; -"Scene.Profile.Dashboard.Following" = "正在关注"; -"Scene.Profile.Dashboard.Posts" = "帖子"; +"Scene.Profile.Dashboard.MyFollowers" = "followers"; +"Scene.Profile.Dashboard.MyFollowing" = "following"; +"Scene.Profile.Dashboard.MyPosts" = "posts"; +"Scene.Profile.Dashboard.OtherFollowers" = "followers"; +"Scene.Profile.Dashboard.OtherFollowing" = "following"; +"Scene.Profile.Dashboard.OtherPosts" = "posts"; "Scene.Profile.Fields.AddRow" = "添加"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "内容"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings index eba0703c7..610aebbf6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "網址"; "Common.Controls.Status.TapToReveal" = "輕觸以顯示"; "Common.Controls.Status.Translation.ShowOriginal" = "顯示原文"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "透過 %@ 翻譯 %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "未知"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "未知"; "Common.Controls.Status.UserReblogged" = "%@ 已轉嘟"; "Common.Controls.Status.UserRepliedTo" = "回覆給 %@"; "Common.Controls.Status.Visibility.Direct" = "只有被提及的使用者能看到此嘟文。"; @@ -278,9 +278,12 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "編輯大頭貼"; "Scene.Profile.Accessibility.ShowAvatarImage" = "顯示大頭貼"; "Scene.Profile.Accessibility.ShowBannerImage" = "顯示橫幅圖片"; -"Scene.Profile.Dashboard.Followers" = "跟隨者"; -"Scene.Profile.Dashboard.Following" = "跟隨中"; -"Scene.Profile.Dashboard.Posts" = "嘟文"; +"Scene.Profile.Dashboard.MyFollowers" = "跟隨者"; +"Scene.Profile.Dashboard.MyFollowing" = "正在跟隨"; +"Scene.Profile.Dashboard.MyPosts" = "嘟文"; +"Scene.Profile.Dashboard.OtherFollowers" = "跟隨者"; +"Scene.Profile.Dashboard.OtherFollowing" = "正在跟隨"; +"Scene.Profile.Dashboard.OtherPosts" = "嘟文"; "Scene.Profile.Fields.AddRow" = "新增列"; "Scene.Profile.Fields.Joined" = "加入時間"; "Scene.Profile.Fields.Placeholder.Content" = "內容"; From 042166a2823a1db97ff200323ac03892660a3594 Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Mon, 9 Jan 2023 10:33:40 +0100 Subject: [PATCH 94/94] Revert "chore(i18n): Update strings" This reverts commit be3b91e334c940d41d39aefa266dbe4a15bc1e89. --- .../input/Base.lproj/app.json | 33 +++--------- .../Generated/Strings.swift | 38 +++++++------ .../Resources/Base.lproj/Localizable.strings | 54 ++++++++++--------- .../Resources/ar.lproj/Localizable.strings | 23 ++++---- .../Resources/ca.lproj/Localizable.strings | 13 ++--- .../Resources/ckb.lproj/Localizable.strings | 9 ++-- .../Resources/cs.lproj/Localizable.strings | 39 +++++++------- .../cs.lproj/Localizable.stringsdict | 2 +- .../Resources/de.lproj/Localizable.strings | 13 ++--- .../Resources/en.lproj/Localizable.strings | 41 ++++++++------ .../Resources/es.lproj/Localizable.strings | 15 +++--- .../Resources/eu.lproj/Localizable.strings | 9 ++-- .../Resources/fi.lproj/Localizable.strings | 13 ++--- .../Resources/fr.lproj/Localizable.strings | 13 ++--- .../Resources/gd.lproj/Localizable.strings | 9 ++-- .../Resources/gl.lproj/Localizable.strings | 13 ++--- .../Resources/it.lproj/Localizable.strings | 13 ++--- .../Resources/ja.lproj/Localizable.strings | 9 ++-- .../Resources/kab.lproj/Localizable.strings | 9 ++-- .../Resources/ku.lproj/Localizable.strings | 21 ++++---- .../Resources/nl.lproj/Localizable.strings | 9 ++-- .../Resources/ru.lproj/Localizable.strings | 9 ++-- .../Resources/sl.lproj/Localizable.strings | 15 +++--- .../Resources/sv.lproj/Localizable.strings | 13 ++--- .../Resources/th.lproj/Localizable.strings | 15 +++--- .../Resources/tr.lproj/Localizable.strings | 9 ++-- .../Resources/vi.lproj/Localizable.strings | 13 ++--- .../zh-Hans.lproj/Localizable.strings | 9 ++-- .../zh-Hant.lproj/Localizable.strings | 13 ++--- 29 files changed, 211 insertions(+), 283 deletions(-) diff --git a/Localization/StringsConvertor/input/Base.lproj/app.json b/Localization/StringsConvertor/input/Base.lproj/app.json index dc758bb7b..23180ac89 100644 --- a/Localization/StringsConvertor/input/Base.lproj/app.json +++ b/Localization/StringsConvertor/input/Base.lproj/app.json @@ -267,8 +267,6 @@ "server_picker": { "title": "Pick Server", "button": { - "language": "Language", - "signup_speed": "Sign-up Speed", "category": { "all": "All", "all_accessiblity_description": "Category: All", @@ -300,29 +298,19 @@ "finding_servers": "Finding available servers...", "bad_network": "Something went wrong while loading the data. Check your internet connection.", "no_results": "No results" - }, - "signup_speed": { - "all": "All", - "instant": "Instant Sign-up", - "manually_reviewed": "Manual Review" - }, - "language": { - "all": "All" - }, - "search": { - "placeholder": "Search name or URL" } }, "privacy": { "title": "Privacy", "policy": { - "ios": "Privacy Policy - Mastodon for iOS", - "server": "Privacy Policy - %s" + "ios": "Privacy Policy - Mastodon for iOS"; + "server" = "Privacy Policy - %s"; + }, "button": { "confirm": "I agree" } - }, + } "register": { "title": "Create account", "input": { @@ -331,8 +319,7 @@ }, "username": { "placeholder": "username", - "duplicate_prompt": "This username is taken.", - "suggestion": "amazing_%@" + "duplicate_prompt": "This username is taken." }, "display_name": { "placeholder": "display name" @@ -391,13 +378,14 @@ "terms_of_service": "terms of service", "privacy_policy": "privacy policy", "button": { - "confirm": "I agree" + "confirm": "I Agree" } }, "confirm_email": { - "title": "Check Your Inbox", + "title": "One last thing.", "tap_the_link_we_emailed_to_you_to_verify_your_account": "Tap the link we sent you to verify %@. We’ll wait right here.", "button": { + "open_email_app": "Open Email App", "resend": "Resend" }, "dont_receive_email": { @@ -410,11 +398,6 @@ "description": "We just sent you an email. Check your junk folder if you haven’t.", "mail": "Mail", "open_email_client": "Open Email Client" - }, - "didnt_get_link": { - "prefix": "Didn't get a Link?", - "resend_in": "Resend (%@)", - "resend_now": "Resend now." } }, "home_timeline": { diff --git a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift index 8cca23a3b..9034cf0c5 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift +++ b/MastodonSDK/Sources/MastodonLocalization/Generated/Strings.swift @@ -620,9 +620,9 @@ public enum L10n { } } public enum ConfirmEmail { - /// Tap the link we sent you to verify %@. We’ll wait right here. + /// Tap the link we sent you to verify %@. We'll wait right here. public static func tapTheLinkWeEmailedToYouToVerifyYourAccount(_ p1: Any) -> String { - return L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", String(describing: p1), fallback: "Tap the link we sent you to verify %@. We’ll wait right here.") + return L10n.tr("Localizable", "Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount", String(describing: p1), fallback: "Tap the link we sent you to verify %@. We'll wait right here.") } /// Check Your Inbox public static let title = L10n.tr("Localizable", "Scene.ConfirmEmail.Title", fallback: "Check Your Inbox") @@ -800,11 +800,13 @@ public enum L10n { } } public enum Privacy { + /// Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy. + public static let description = L10n.tr("Localizable", "Scene.Privacy.Description", fallback: "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy.") /// Privacy public static let title = L10n.tr("Localizable", "Scene.Privacy.Title", fallback: "Privacy") public enum Button { /// I agree - public static let confirm = L10n.tr("Localizable", "Scene.Privacy.Button.Confirm", fallback: "I agree") + public static let confirm = L10n.tr("Localizable", "Scene.Privacy.Button.confirm", fallback: "I agree") } public enum Policy { /// Privacy Policy - Mastodon for iOS @@ -1020,12 +1022,12 @@ public enum L10n { public enum Password { /// 8 characters public static let characterLimit = L10n.tr("Localizable", "Scene.Register.Input.Password.CharacterLimit", fallback: "8 characters") - /// Confirm Password - public static let confirmationPlaceholder = L10n.tr("Localizable", "Scene.Register.Input.Password.ConfirmationPlaceholder", fallback: "Confirm Password") + /// Confirm password + public static let confirmationPlaceholder = L10n.tr("Localizable", "Scene.Register.Input.Password.ConfirmationPlaceholder", fallback: "Confirm password") /// Your password needs at least eight characters public static let hint = L10n.tr("Localizable", "Scene.Register.Input.Password.Hint", fallback: "Your password needs at least eight characters") - /// password - public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "password") + /// Password + public static let placeholder = L10n.tr("Localizable", "Scene.Register.Input.Password.Placeholder", fallback: "Password") /// Your password needs at least: public static let require = L10n.tr("Localizable", "Scene.Register.Input.Password.Require", fallback: "Your password needs at least:") public enum Accessibility { @@ -1210,8 +1212,10 @@ public enum L10n { } } public enum ServerPicker { - /// Pick Server - public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick Server") + /// We’ll pick a server based on your language if you continue without making a selection. + public static let noServerSelectedHint = L10n.tr("Localizable", "Scene.ServerPicker.NoServerSelectedHint", fallback: "We’ll pick a server based on your language if you continue without making a selection.") + /// Pick server + public static let title = L10n.tr("Localizable", "Scene.ServerPicker.Title", fallback: "Pick server") public enum Button { /// Language public static let language = L10n.tr("Localizable", "Scene.ServerPicker.Button.Language", fallback: "Language") @@ -1305,8 +1309,8 @@ public enum L10n { /// Some ground rules. public static let title = L10n.tr("Localizable", "Scene.ServerRules.Title", fallback: "Some ground rules.") public enum Button { - /// I agree - public static let confirm = L10n.tr("Localizable", "Scene.ServerRules.Button.Confirm", fallback: "I agree") + /// I Agree + public static let confirm = L10n.tr("Localizable", "Scene.ServerRules.Button.Confirm", fallback: "I Agree") } } public enum Settings { @@ -1430,23 +1434,23 @@ public enum L10n { /// Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. /// /// You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.Description", fallback: "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.description", fallback: "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots.\n\nYou can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere.") /// How do I pick a server? - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.Title", fallback: "How do I pick a server?") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.HowDoIPickAServer.title", fallback: "How do I pick a server?") } public enum MastodonIsLikeThat { /// Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.Description", fallback: "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.description", fallback: "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online.") /// Mastodon is like that - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.Title", fallback: "Mastodon is like that") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.MastodonIsLikeThat.title", fallback: "Mastodon is like that") } public enum WhatIsMastodon { /// Imagine you have an email address that ends with @example.com. /// /// You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com. - public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.Description", fallback: "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.") + public static let description = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.description", fallback: "Imagine you have an email address that ends with @example.com.\n\nYou can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com.") /// What is - public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.Title", fallback: "What is") + public static let title = L10n.tr("Localizable", "Scene.Welcome.Education.WhatIsMastodon.title", fallback: "What is") } } } diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings index 56eb2aa28..acafb44ab 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/Base.lproj/Localizable.strings @@ -225,9 +225,6 @@ uploaded to Mastodon."; "Scene.Compose.Visibility.Public" = "Public"; "Scene.Compose.Visibility.Unlisted" = "Unlisted"; "Scene.ConfirmEmail.Button.Resend" = "Resend"; -"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; -"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; -"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.ConfirmEmail.DontReceiveEmail.Description" = "Check if your email address is correct as well as your junk folder if you haven’t."; "Scene.ConfirmEmail.DontReceiveEmail.ResendEmail" = "Resend Email"; "Scene.ConfirmEmail.DontReceiveEmail.Title" = "Check your email"; @@ -235,8 +232,11 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.Mail" = "Mail"; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We’ll wait right here."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; "Scene.ConfirmEmail.Title" = "Check Your Inbox"; +"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; +"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; +"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; @@ -284,10 +284,6 @@ uploaded to Mastodon."; "Scene.Preview.Keyboard.ClosePreview" = "Close Preview"; "Scene.Preview.Keyboard.ShowNext" = "Show Next"; "Scene.Preview.Keyboard.ShowPrevious" = "Show Previous"; -"Scene.Privacy.Button.Confirm" = "I agree"; -"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; -"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; -"Scene.Privacy.Title" = "Privacy"; "Scene.Profile.Accessibility.DoubleTapToOpenTheList" = "Double tap to open the list"; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; @@ -350,9 +346,9 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.Accessibility.Checked" = "checked"; "Scene.Register.Input.Password.Accessibility.Unchecked" = "unchecked"; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; -"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm Password"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; -"Scene.Register.Input.Password.Placeholder" = "password"; +"Scene.Register.Input.Password.Placeholder" = "Password"; +"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; @@ -432,9 +428,9 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Music" = "music"; "Scene.ServerPicker.Button.Category.Regional" = "regional"; "Scene.ServerPicker.Button.Category.Tech" = "tech"; -"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; +"Scene.ServerPicker.Button.Language" = "Language"; "Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; @@ -443,13 +439,14 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Language.All" = "All"; -"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; +"Scene.ServerPicker.Title" = "Pick server"; +"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; "Scene.ServerPicker.SignupSpeed.All" = "All"; "Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; "Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; -"Scene.ServerPicker.Title" = "Pick Server"; -"Scene.ServerRules.Button.Confirm" = "I agree"; +"Scene.ServerPicker.Language.All" = "All"; +"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; +"Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; "Scene.ServerRules.Subtitle" = "These are set and enforced by the %@ moderators."; @@ -494,20 +491,25 @@ uploaded to Mastodon."; "Scene.SuggestionAccount.Title" = "Find People to Follow"; "Scene.Thread.BackTitle" = "Post"; "Scene.Thread.Title" = "Post from %@"; -"Scene.Welcome.Education.HowDoIPickAServer.Description" = "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. - -You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; -"Scene.Welcome.Education.HowDoIPickAServer.Title" = "How do I pick a server?"; -"Scene.Welcome.Education.MastodonIsLikeThat.Description" = "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online."; -"Scene.Welcome.Education.MastodonIsLikeThat.Title" = "Mastodon is like that"; -"Scene.Welcome.Education.WhatIsMastodon.Description" = "Imagine you have an email address that ends with @example.com. - -You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com."; -"Scene.Welcome.Education.WhatIsMastodon.Title" = "What is"; "Scene.Welcome.GetStarted" = "Get Started"; "Scene.Welcome.LogIn" = "Log In"; "Scene.Welcome.Slogan" = "Social networking back in your hands."; +"Scene.Welcome.Education.WhatIsMastodon.title" = "What is"; +"Scene.Welcome.Education.WhatIsMastodon.description" = "Imagine you have an email address that ends with @example.com. + +You can still send and receive emails from anyone, even if their email ends in @gmail.com or @icloud.com or @example.com."; +"Scene.Welcome.Education.MastodonIsLikeThat.title" = "Mastodon is like that"; +"Scene.Welcome.Education.MastodonIsLikeThat.description" = "Your handle might be @gothgirl654@example.social, but you can still follow, reblog, and chat with @fallout5ever@example.online."; +"Scene.Welcome.Education.HowDoIPickAServer.title" = "How do I pick a server?"; +"Scene.Welcome.Education.HowDoIPickAServer.description" = "Different people choose different servers for any number of reasons. art.example is a great place for artists, while glasgow.example might be a good pick for Scots. + +You can’t go wrong with any of our recommend servers, so regardless of which one you pick (or if you enter your own in the server search bar), you’ll never miss a beat anywhere."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; +"Scene.Privacy.Title" = "Privacy"; +"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; +"Scene.Privacy.Button.confirm" = "I agree"; +"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; +"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings index e308e7738..8ecefd32e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ar.lproj/Localizable.strings @@ -63,8 +63,8 @@ "Common.Controls.Actions.SignUp" = "إنشاءُ حِساب"; "Common.Controls.Actions.Skip" = "تخطي"; "Common.Controls.Actions.TakePhoto" = "اِلتِقاطُ صُورَة"; -"Common.Controls.Actions.TranslatePost.Title" = "الترجَمَة مِن %@"; -"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "غير مَعرُوفة"; +"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; +"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; "Common.Controls.Actions.TryAgain" = "المُحاولة مرة أُخرى"; "Common.Controls.Actions.UnblockDomain" = "رفع الحظر عن %@"; "Common.Controls.Friendship.Block" = "حظر"; @@ -106,7 +106,7 @@ "Common.Controls.Status.Actions.Menu" = "القائمة"; "Common.Controls.Status.Actions.Reblog" = "إعادة النشر"; "Common.Controls.Status.Actions.Reply" = "الرَّد"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "مُشارَكَة الرابِط فِي مَنشور"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; "Common.Controls.Status.Actions.ShowGif" = "أظْهِر GIF"; "Common.Controls.Status.Actions.ShowImage" = "أظْهِرِ الصُّورَة"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "أظْهِر مُشَغِّلَ المَقاطِعِ المَرئِيَّة"; @@ -115,7 +115,7 @@ "Common.Controls.Status.Actions.Unreblog" = "التراجُع عن إعادة النشر"; "Common.Controls.Status.ContentWarning" = "تحذير المُحتوى"; "Common.Controls.Status.LinkViaUser" = "%@ via %@"; -"Common.Controls.Status.LoadEmbed" = "تحميل المُضمَن"; +"Common.Controls.Status.LoadEmbed" = "Load Embed"; "Common.Controls.Status.MediaContentWarning" = "اُنقُر لِلكَشف"; "Common.Controls.Status.MetaEntity.Email" = "عُنوان البريد الإلكتُروني: %@"; "Common.Controls.Status.MetaEntity.Hashtag" = "وَسْم: %@"; @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "عنوان URL"; "Common.Controls.Status.TapToReveal" = "اُنقُر لِلكَشف"; "Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "الترجَمَة مِن %@ بِاستِخدَام %@"; -"Common.Controls.Status.Translation.UnknownLanguage" = "غير مَعرُوفة"; -"Common.Controls.Status.Translation.UnknownProvider" = "غير مَعرُوف"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "أعادَ %@ تَدوينَها"; "Common.Controls.Status.UserRepliedTo" = "رَدًا على %@"; "Common.Controls.Status.Visibility.Direct" = "المُستخدمِونَ المُشارِ إليهم فَقَطْ مَن يُمكِنُهُم رُؤيَةُ هَذَا المَنشُور."; @@ -283,12 +283,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "تَحريرُ الصُّورَةِ الرَّمزِيَّة"; "Scene.Profile.Accessibility.ShowAvatarImage" = "أظْهِر الصُّورَةَ الرَّمزِيَّة"; "Scene.Profile.Accessibility.ShowBannerImage" = "أظْهِر صُورَةَ الرَّايَة"; -"Scene.Profile.Dashboard.MyFollowers" = "مُتابِعُون"; -"Scene.Profile.Dashboard.MyFollowing" = "مُتابَعُون"; -"Scene.Profile.Dashboard.MyPosts" = "مَنشورات"; -"Scene.Profile.Dashboard.OtherFollowers" = "مُتابِعُون"; -"Scene.Profile.Dashboard.OtherFollowing" = "مُتابَعُون"; -"Scene.Profile.Dashboard.OtherPosts" = "مَنشورات"; +"Scene.Profile.Dashboard.Followers" = "مُتابِع"; +"Scene.Profile.Dashboard.Following" = "مُتابَع"; +"Scene.Profile.Dashboard.Posts" = "مَنشورات"; "Scene.Profile.Fields.AddRow" = "إضافة صف"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "المُحتَوى"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings index 2283d02fa..acd53cc03 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ca.lproj/Localizable.strings @@ -134,9 +134,9 @@ Comprova la connexió a Internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Toca per a mostrar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostra l'original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Traduït del %@ fent servir %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Desconegut"; -"Common.Controls.Status.Translation.UnknownProvider" = "Desconegut"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ ha impulsat"; "Common.Controls.Status.UserRepliedTo" = "Ha respòs a %@"; "Common.Controls.Status.Visibility.Direct" = "Només l'usuari mencionat pot veure aquesta publicació."; @@ -283,12 +283,9 @@ carregat a Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edita l'imatge del avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostra l'imatge del avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostra l'imatge del bàner"; -"Scene.Profile.Dashboard.MyFollowers" = "seguidors"; -"Scene.Profile.Dashboard.MyFollowing" = "seguint"; -"Scene.Profile.Dashboard.MyPosts" = "tuts"; -"Scene.Profile.Dashboard.OtherFollowers" = "seguidors"; -"Scene.Profile.Dashboard.OtherFollowing" = "seguint"; -"Scene.Profile.Dashboard.OtherPosts" = "tuts"; +"Scene.Profile.Dashboard.Followers" = "seguidors"; +"Scene.Profile.Dashboard.Following" = "seguint"; +"Scene.Profile.Dashboard.Posts" = "tuts"; "Scene.Profile.Fields.AddRow" = "Afegeix fila"; "Scene.Profile.Fields.Joined" = "S'hi va unir"; "Scene.Profile.Fields.Placeholder.Content" = "Contingut"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings index 3a8b3c1ae..5f6f124a1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ckb.lproj/Localizable.strings @@ -282,12 +282,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "دەستکاریی وێنەکە بکە"; "Scene.Profile.Accessibility.ShowAvatarImage" = "وێنەکە نیشان بدە"; "Scene.Profile.Accessibility.ShowBannerImage" = "وێنەکەی پشتەوە نیشان بدە"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "شوێنکەوتوو"; +"Scene.Profile.Dashboard.Following" = "شوێنکەوتن"; +"Scene.Profile.Dashboard.Posts" = "پۆستەکان"; "Scene.Profile.Fields.AddRow" = "ڕیز زیاد بکە"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "ناوەڕۆک"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings index 3f2a25942..8a8a977b7 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.strings @@ -23,8 +23,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Alerts.SignOut.Title" = "Odhlásit se"; "Common.Alerts.SignUpFailure.Title" = "Registrace selhala"; "Common.Alerts.TranslationFailed.Button" = "OK"; -"Common.Alerts.TranslationFailed.Message" = "Překlad se nezdařil. Správce možná nepovolil překlad na tomto serveru nebo tento server používá starší verzi Mastodonu, kde překlady ještě nejsou podporovány."; -"Common.Alerts.TranslationFailed.Title" = "Poznámka"; +"Common.Alerts.TranslationFailed.Message" = "Translation failed. Maybe the administrator has not enabled translations on this server or this server is running an older version of Mastodon where translations are not yet supported."; +"Common.Alerts.TranslationFailed.Title" = "Note"; "Common.Alerts.VoteFailure.PollEnded" = "Anketa skončila"; "Common.Alerts.VoteFailure.Title" = "Selhání hlasování"; "Common.Controls.Actions.Add" = "Přidat"; @@ -34,7 +34,7 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Actions.Compose" = "Napsat"; "Common.Controls.Actions.Confirm" = "Potvrdit"; "Common.Controls.Actions.Continue" = "Pokračovat"; -"Common.Controls.Actions.Copy" = "Kopírovat"; +"Common.Controls.Actions.Copy" = "Copy"; "Common.Controls.Actions.CopyPhoto" = "Kopírovat fotografii"; "Common.Controls.Actions.Delete" = "Smazat"; "Common.Controls.Actions.Discard" = "Zahodit"; @@ -63,8 +63,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Actions.SignUp" = "Vytvořit účet"; "Common.Controls.Actions.Skip" = "Přeskočit"; "Common.Controls.Actions.TakePhoto" = "Vyfotit"; -"Common.Controls.Actions.TranslatePost.Title" = "Přeložit z %@"; -"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Neznámý"; +"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; +"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; "Common.Controls.Actions.TryAgain" = "Zkusit znovu"; "Common.Controls.Actions.UnblockDomain" = "Odblokovat %@"; "Common.Controls.Friendship.Block" = "Blokovat"; @@ -99,14 +99,14 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Keyboard.Timeline.PreviousStatus" = "Předchozí příspěvek"; "Common.Controls.Keyboard.Timeline.ReplyStatus" = "Odpovědět na příspěvek"; "Common.Controls.Keyboard.Timeline.ToggleContentWarning" = "Přepnout varování obsahu"; -"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Přepnout Oblíbené na příspěvku"; +"Common.Controls.Keyboard.Timeline.ToggleFavorite" = "Toggle Favorite on Post"; "Common.Controls.Keyboard.Timeline.ToggleReblog" = "Přepnout Reblog na příspěvku"; "Common.Controls.Status.Actions.Favorite" = "Oblíbit"; "Common.Controls.Status.Actions.Hide" = "Skrýt"; "Common.Controls.Status.Actions.Menu" = "Nabídka"; "Common.Controls.Status.Actions.Reblog" = "Boostnout"; "Common.Controls.Status.Actions.Reply" = "Odpovědět"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "Sdílet odkaz v příspěvku"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; "Common.Controls.Status.Actions.ShowGif" = "Zobrazit GIF"; "Common.Controls.Status.Actions.ShowImage" = "Zobrazit obrázek"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Zobrazit video přehrávač"; @@ -114,8 +114,8 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Status.Actions.Unfavorite" = "Odebrat z oblízených"; "Common.Controls.Status.Actions.Unreblog" = "Undo reblog"; "Common.Controls.Status.ContentWarning" = "Varování o obsahu"; -"Common.Controls.Status.LinkViaUser" = "%@ přes %@"; -"Common.Controls.Status.LoadEmbed" = "Načíst vložené"; +"Common.Controls.Status.LinkViaUser" = "%@ via %@"; +"Common.Controls.Status.LoadEmbed" = "Load Embed"; "Common.Controls.Status.MediaContentWarning" = "Klepnutím kdekoli zobrazíte"; "Common.Controls.Status.MetaEntity.Email" = "E-mailová adresa: %@"; "Common.Controls.Status.MetaEntity.Hashtag" = "Hashtag: %@"; @@ -133,10 +133,10 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Status.Tag.Mention" = "Zmínka"; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Klepnutím zobrazit"; -"Common.Controls.Status.Translation.ShowOriginal" = "Zobrazit originál"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Přeloženo z %@ pomocí %@"; -"Common.Controls.Status.Translation.UnknownLanguage" = "Neznámý"; -"Common.Controls.Status.Translation.UnknownProvider" = "Neznámý"; +"Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; +"Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ reblogged"; "Common.Controls.Status.UserRepliedTo" = "Odpověděl %@"; "Common.Controls.Status.Visibility.Direct" = "Pouze zmíněný uživatel může vidět tento příspěvek."; @@ -146,7 +146,7 @@ Zkontrolujte prosím připojení k internetu."; "Common.Controls.Tabs.Home" = "Domů"; "Common.Controls.Tabs.Notifications" = "Oznámení"; "Common.Controls.Tabs.Profile" = "Profil"; -"Common.Controls.Tabs.SearchAndExplore" = "Hledat a zkoumat"; +"Common.Controls.Tabs.SearchAndExplore" = "Search and Explore"; "Common.Controls.Timeline.Filtered" = "Filtrováno"; "Common.Controls.Timeline.Header.BlockedWarning" = "Nemůžeš zobrazit profil tohoto uživatele, dokud tě neodblokují."; "Common.Controls.Timeline.Header.BlockingWarning" = "Nemůžete zobrazit profil tohoto uživatele, dokud ho neodblokujete. @@ -279,14 +279,11 @@ nahrán do Mastodonu."; "Scene.Profile.Accessibility.EditAvatarImage" = "Upravit obrázek avataru"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Zobrazit obrázek avataru"; "Scene.Profile.Accessibility.ShowBannerImage" = "Zobrazit obrázek banneru"; -"Scene.Profile.Dashboard.MyFollowers" = "sledující"; -"Scene.Profile.Dashboard.MyFollowing" = "sledování"; -"Scene.Profile.Dashboard.MyPosts" = "příspěvky"; -"Scene.Profile.Dashboard.OtherFollowers" = "sledující"; -"Scene.Profile.Dashboard.OtherFollowing" = "sledování"; -"Scene.Profile.Dashboard.OtherPosts" = "příspěvky"; +"Scene.Profile.Dashboard.Followers" = "sledující"; +"Scene.Profile.Dashboard.Following" = "sledování"; +"Scene.Profile.Dashboard.Posts" = "příspěvky"; "Scene.Profile.Fields.AddRow" = "Přidat řádek"; -"Scene.Profile.Fields.Joined" = "Připojen/a"; +"Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Obsah"; "Scene.Profile.Fields.Placeholder.Label" = "Označení"; "Scene.Profile.Fields.Verified.Long" = "Vlastnictví tohoto odkazu bylo zkontrolováno na %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict index 63e324a1b..6e44e9f0a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/cs.lproj/Localizable.stringsdict @@ -65,7 +65,7 @@ a11y.plural.count.characters_left NSStringLocalizedFormatKey - %#@character_count@ zbývá + %#@character_count@ left character_count NSStringFormatSpecTypeKey diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings index 7d75af18c..74dbaeea6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/de.lproj/Localizable.strings @@ -134,9 +134,9 @@ Bitte überprüfe deine Internetverbindung."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Zum Anzeigen tippen"; "Common.Controls.Status.Translation.ShowOriginal" = "Original anzeigen"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Übersetzt von %@ mit %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Unbekannt"; -"Common.Controls.Status.Translation.UnknownProvider" = "Unbekannt"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ teilte"; "Common.Controls.Status.UserRepliedTo" = "Antwortet auf %@"; "Common.Controls.Status.Visibility.Direct" = "Nur erwähnte Benutzer können diesen Beitrag sehen."; @@ -283,12 +283,9 @@ kann nicht auf Mastodon hochgeladen werden."; "Scene.Profile.Accessibility.EditAvatarImage" = "Profilbild bearbeiten"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Profilbild anzeigen"; "Scene.Profile.Accessibility.ShowBannerImage" = "Bannerbild anzeigen"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "folge ich"; -"Scene.Profile.Dashboard.MyPosts" = "Beiträge"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "folge ich"; -"Scene.Profile.Dashboard.OtherPosts" = "Beiträge"; +"Scene.Profile.Dashboard.Followers" = "Folgende"; +"Scene.Profile.Dashboard.Following" = "Gefolgte"; +"Scene.Profile.Dashboard.Posts" = "Beiträge"; "Scene.Profile.Fields.AddRow" = "Zeile hinzufügen"; "Scene.Profile.Fields.Joined" = "Beigetreten"; "Scene.Profile.Fields.Placeholder.Content" = "Inhalt"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings index 4acaaf657..f45ef2c0b 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/en.lproj/Localizable.strings @@ -63,8 +63,6 @@ Please check your internet connection."; "Common.Controls.Actions.SignUp" = "Create account"; "Common.Controls.Actions.Skip" = "Skip"; "Common.Controls.Actions.TakePhoto" = "Take Photo"; -"Common.Controls.Actions.TranslatePost.Title" = "Translate from %@"; -"Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Unknown"; "Common.Controls.Actions.TryAgain" = "Try Again"; "Common.Controls.Actions.UnblockDomain" = "Unblock %@"; "Common.Controls.Friendship.Block" = "Block"; @@ -230,8 +228,11 @@ uploaded to Mastodon."; "Scene.ConfirmEmail.OpenEmailApp.OpenEmailClient" = "Open Email Client"; "Scene.ConfirmEmail.OpenEmailApp.Title" = "Check your inbox."; "Scene.ConfirmEmail.Subtitle" = "Tap the link we emailed to you to verify your account."; -"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we emailed to you to verify your account"; -"Scene.ConfirmEmail.Title" = "One last thing."; +"Scene.ConfirmEmail.TapTheLinkWeEmailedToYouToVerifyYourAccount" = "Tap the link we sent you to verify %@. We'll wait right here."; +"Scene.ConfirmEmail.Title" = "Check Your Inbox"; +"Scene.ConfirmEmail.DidntGetLink.Prefix" = "Didn't get a Link?"; +"Scene.ConfirmEmail.DidntGetLink.ResendIn" = "Resend (%@)"; +"Scene.ConfirmEmail.DidntGetLink.ResendNow" = "Resend now."; "Scene.Discovery.Intro" = "These are the posts gaining traction in your corner of Mastodon."; "Scene.Discovery.Tabs.Community" = "Community"; "Scene.Discovery.Tabs.ForYou" = "For You"; @@ -283,12 +284,9 @@ uploaded to Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "followers"; +"Scene.Profile.Dashboard.Following" = "following"; +"Scene.Profile.Dashboard.Posts" = "posts"; "Scene.Profile.Fields.AddRow" = "Add Row"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Content"; @@ -343,11 +341,12 @@ uploaded to Mastodon."; "Scene.Register.Input.Password.CharacterLimit" = "8 characters"; "Scene.Register.Input.Password.Hint" = "Your password needs at least eight characters"; "Scene.Register.Input.Password.Placeholder" = "password"; +"Scene.Register.Input.Password.ConfirmationPlaceholder" = "Confirm password"; "Scene.Register.Input.Password.Require" = "Your password needs at least:"; "Scene.Register.Input.Username.DuplicatePrompt" = "This username is taken."; "Scene.Register.Input.Username.Placeholder" = "username"; -"Scene.Register.LetsGetYouSetUpOnDomain" = "Let’s get you set up on %@"; -"Scene.Register.Title" = "Let’s get you set up on %@"; +"Scene.Register.Input.Username.Suggestion" = "amazing_%@"; +"Scene.Register.Title" = "Create account"; "Scene.Report.Content1" = "Are there any other posts you’d like to add to the report?"; "Scene.Report.Content2" = "Is there anything the moderators should know about this report?"; "Scene.Report.ReportSentTitle" = "Thanks for reporting, we’ll look into this."; @@ -424,6 +423,8 @@ uploaded to Mastodon."; "Scene.ServerPicker.Button.Category.Tech" = "tech"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; +"Scene.ServerPicker.Button.Language" = "Language"; +"Scene.ServerPicker.Button.SignupSpeed" = "Sign-up Speed"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading the data. Check your internet connection."; "Scene.ServerPicker.EmptyState.FindingServers" = "Finding available servers..."; "Scene.ServerPicker.EmptyState.NoResults" = "No results"; @@ -431,8 +432,13 @@ uploaded to Mastodon."; "Scene.ServerPicker.Label.Category" = "CATEGORY"; "Scene.ServerPicker.Label.Language" = "LANGUAGE"; "Scene.ServerPicker.Label.Users" = "USERS"; -"Scene.ServerPicker.Subtitle" = "Pick a server based on your region, interests, or a general purpose one. You can still chat with anyone on Mastodon, regardless of your servers."; -"Scene.ServerPicker.Title" = "Mastodon is made of users in different servers."; +"Scene.ServerPicker.Title" = "Pick server"; +"Scene.ServerPicker.NoServerSelectedHint" = "We’ll pick a server based on your language if you continue without making a selection."; +"Scene.ServerPicker.SignupSpeed.All" = "All"; +"Scene.ServerPicker.SignupSpeed.Instant" = "Instant Sign-up"; +"Scene.ServerPicker.SignupSpeed.ManuallyReviewed" = "Manual Review"; +"Scene.ServerPicker.Language.All" = "All"; +"Scene.ServerPicker.Search.Placeholder" = "Search name or URL"; "Scene.ServerRules.Button.Confirm" = "I Agree"; "Scene.ServerRules.PrivacyPolicy" = "privacy policy"; "Scene.ServerRules.Prompt" = "By continuing, you’re subject to the terms of service and privacy policy for %@."; @@ -484,4 +490,9 @@ uploaded to Mastodon."; back in your hands."; "Scene.Wizard.AccessibilityHint" = "Double tap to dismiss this wizard"; "Scene.Wizard.MultipleAccountSwitchIntroDescription" = "Switch between multiple accounts by holding the profile button."; -"Scene.Wizard.NewInMastodon" = "New in Mastodon"; \ No newline at end of file +"Scene.Wizard.NewInMastodon" = "New in Mastodon"; +"Scene.Privacy.Title" = "Privacy"; +"Scene.Privacy.Description" = "Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server’s privacy policy."; +"Scene.Privacy.Button.confirm" = "I agree"; +"Scene.Privacy.Policy.Ios" = "Privacy Policy - Mastodon for iOS"; +"Scene.Privacy.Policy.Server" = "Privacy Policy - %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings index 90cce63dd..d9d6a6ff6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/es.lproj/Localizable.strings @@ -134,9 +134,9 @@ Por favor, revise su conexión a internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tocar para revelar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostrar Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Traducido desde %@ usando %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Desconocido"; -"Common.Controls.Status.Translation.UnknownProvider" = "Desconocido"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ lo reblogueó"; "Common.Controls.Status.UserRepliedTo" = "En respuesta a %@"; "Common.Controls.Status.Visibility.Direct" = "Sólo el usuario mencionado puede ver este mensaje."; @@ -284,14 +284,11 @@ pulsa en el enlace para confirmar tu cuenta."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editar imagen del avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostrar imagen del avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostrar imagen de banner"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "seguidores"; +"Scene.Profile.Dashboard.Following" = "siguiendo"; +"Scene.Profile.Dashboard.Posts" = "publicaciones"; "Scene.Profile.Fields.AddRow" = "Añadir Fila"; -"Scene.Profile.Fields.Joined" = "Se unió"; +"Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Contenido"; "Scene.Profile.Fields.Placeholder.Label" = "Nombre para el campo"; "Scene.Profile.Fields.Verified.Long" = "La propiedad de este enlace fue verificada el %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings index e070f70e6..882e05ec6 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/eu.lproj/Localizable.strings @@ -283,12 +283,9 @@ Mastodonera igo."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editatu abatarra"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Erakutsi abatarra"; "Scene.Profile.Accessibility.ShowBannerImage" = "Erakutsi banner irudia"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "jarraitzaile"; +"Scene.Profile.Dashboard.Following" = "jarraitzen"; +"Scene.Profile.Dashboard.Posts" = "bidalketa"; "Scene.Profile.Fields.AddRow" = "Gehitu errenkada"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Edukia"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings index f7edb3ec1..de4bf3101 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fi.lproj/Localizable.strings @@ -134,9 +134,9 @@ Tarkista internet-yhteytesi."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tap to reveal"; "Common.Controls.Status.Translation.ShowOriginal" = "Shown Original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Käännetty kielestä %@ palvelulla %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Unknown"; -"Common.Controls.Status.Translation.UnknownProvider" = "Tuntematon"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ jakoi edelleen"; "Common.Controls.Status.UserRepliedTo" = "Vastasi %@:lle"; "Common.Controls.Status.Visibility.Direct" = "Only mentioned user can see this post."; @@ -283,12 +283,9 @@ uploaded to Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.MyFollowers" = "seuraajat"; -"Scene.Profile.Dashboard.MyFollowing" = "seurattavat"; -"Scene.Profile.Dashboard.MyPosts" = "julkaisut"; -"Scene.Profile.Dashboard.OtherFollowers" = "seuraajat"; -"Scene.Profile.Dashboard.OtherFollowing" = "seurattavat"; -"Scene.Profile.Dashboard.OtherPosts" = "julkaisut"; +"Scene.Profile.Dashboard.Followers" = "seuraajat"; +"Scene.Profile.Dashboard.Following" = "seurataan"; +"Scene.Profile.Dashboard.Posts" = "julkaisut"; "Scene.Profile.Fields.AddRow" = "Lisää rivi"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Sisältö"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings index b1ef9611c..0bc619b34 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/fr.lproj/Localizable.strings @@ -134,9 +134,9 @@ Veuillez vérifier votre accès à Internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Appuyer pour afficher"; "Common.Controls.Status.Translation.ShowOriginal" = "Afficher l’original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Traduit de %@ en utilisant %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Inconnu"; -"Common.Controls.Status.Translation.UnknownProvider" = "Inconnu"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ a reblogué"; "Common.Controls.Status.UserRepliedTo" = "À répondu à %@"; "Common.Controls.Status.Visibility.Direct" = "Seul·e l’utilisateur·rice mentionnée peut voir ce message."; @@ -283,12 +283,9 @@ téléversé sur Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Modifier l’avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Afficher l’avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Afficher l’image de la bannière"; -"Scene.Profile.Dashboard.MyFollowers" = "abonnés"; -"Scene.Profile.Dashboard.MyFollowing" = "abonnement"; -"Scene.Profile.Dashboard.MyPosts" = "messages"; -"Scene.Profile.Dashboard.OtherFollowers" = "abonnés"; -"Scene.Profile.Dashboard.OtherFollowing" = "abonnement"; -"Scene.Profile.Dashboard.OtherPosts" = "publications"; +"Scene.Profile.Dashboard.Followers" = "abonnés"; +"Scene.Profile.Dashboard.Following" = "abonnements"; +"Scene.Profile.Dashboard.Posts" = "publications"; "Scene.Profile.Fields.AddRow" = "Ajouter une rangée"; "Scene.Profile.Fields.Joined" = "Ici depuis"; "Scene.Profile.Fields.Placeholder.Content" = "Contenu"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings index 79f4ab413..e37be3344 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/gd.lproj/Localizable.strings @@ -283,12 +283,9 @@ a luchdadh suas gu Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Deasaich dealbh an avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Seall dealbh an avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Seall dealbh brataich"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "luchd-leantainn"; +"Scene.Profile.Dashboard.Following" = "a’ leantainn"; +"Scene.Profile.Dashboard.Posts" = "postaichean"; "Scene.Profile.Fields.AddRow" = "Cuir ràgh ris"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Susbaint"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings index 84af4e3e8..35a465661 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/gl.lproj/Localizable.strings @@ -134,9 +134,9 @@ Comproba a conexión a internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Toca para mostrar"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostrar o orixinal"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Traducido do %@ usando %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Descoñecido"; -"Common.Controls.Status.Translation.UnknownProvider" = "Descoñecido"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ promoveu"; "Common.Controls.Status.UserRepliedTo" = "Respondeu a %@"; "Common.Controls.Status.Visibility.Direct" = "Só a usuaria mencionada pode ver a publicación."; @@ -283,12 +283,9 @@ ser subido a Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Editar imaxe de avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostrar imaxe de avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostrar imaxe de cabeceira"; -"Scene.Profile.Dashboard.MyFollowers" = "seguidoras"; -"Scene.Profile.Dashboard.MyFollowing" = "seguindo"; -"Scene.Profile.Dashboard.MyPosts" = "publicacións"; -"Scene.Profile.Dashboard.OtherFollowers" = "seguidoras"; -"Scene.Profile.Dashboard.OtherFollowing" = "seguindo"; -"Scene.Profile.Dashboard.OtherPosts" = "publicacións"; +"Scene.Profile.Dashboard.Followers" = "seguidoras"; +"Scene.Profile.Dashboard.Following" = "seguindo"; +"Scene.Profile.Dashboard.Posts" = "publicacións"; "Scene.Profile.Fields.AddRow" = "Engadir fila"; "Scene.Profile.Fields.Joined" = "Uniuse"; "Scene.Profile.Fields.Placeholder.Content" = "Contido"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings index 7efd61097..96af84e22 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/it.lproj/Localizable.strings @@ -134,9 +134,9 @@ Per favore verifica la tua connessione internet."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tocca per rivelare"; "Common.Controls.Status.Translation.ShowOriginal" = "Mostra l'originale"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Tradotto da %@ utilizzando %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Sconosciuto"; -"Common.Controls.Status.Translation.UnknownProvider" = "Sconosciuto"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ ha condiviso"; "Common.Controls.Status.UserRepliedTo" = "Risposta a %@"; "Common.Controls.Status.Visibility.Direct" = "Solo l'utente menzionato può vedere questo post."; @@ -283,12 +283,9 @@ caricato su Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Modifica immagine avatar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Mostra immagine avatar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Mostra immagine banner"; -"Scene.Profile.Dashboard.MyFollowers" = "seguaci"; -"Scene.Profile.Dashboard.MyFollowing" = "seguendo"; -"Scene.Profile.Dashboard.MyPosts" = "post"; -"Scene.Profile.Dashboard.OtherFollowers" = "seguaci"; -"Scene.Profile.Dashboard.OtherFollowing" = "seguendo"; -"Scene.Profile.Dashboard.OtherPosts" = "post"; +"Scene.Profile.Dashboard.Followers" = "seguaci"; +"Scene.Profile.Dashboard.Following" = "seguendo"; +"Scene.Profile.Dashboard.Posts" = "post"; "Scene.Profile.Fields.AddRow" = "Aggiungi riga"; "Scene.Profile.Fields.Joined" = "Profilo iscritto"; "Scene.Profile.Fields.Placeholder.Content" = "Contenuto"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings index 6898d5d1e..3d32c96d1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ja.lproj/Localizable.strings @@ -278,12 +278,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "フォロワー"; +"Scene.Profile.Dashboard.Following" = "フォロー"; +"Scene.Profile.Dashboard.Posts" = "投稿"; "Scene.Profile.Fields.AddRow" = "行追加"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "コンテンツ"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings index d58ca034d..43a1d385a 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/kab.lproj/Localizable.strings @@ -283,12 +283,9 @@ Ad d-yettwasali ɣef Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Ẓreg tugna n avaṭar"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Sken tugna n avaṭar"; "Scene.Profile.Accessibility.ShowBannerImage" = "Sken tugna n uɣerrac"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "imeḍfaren"; +"Scene.Profile.Dashboard.Following" = "iṭafaṛ"; +"Scene.Profile.Dashboard.Posts" = "tisuffaɣ"; "Scene.Profile.Fields.AddRow" = "Rnu izirig"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Agbur"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings index a99cd890a..6eaa474f0 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ku.lproj/Localizable.strings @@ -34,7 +34,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Actions.Compose" = "Binivîsîne"; "Common.Controls.Actions.Confirm" = "Bipejirîne"; "Common.Controls.Actions.Continue" = "Bidomîne"; -"Common.Controls.Actions.Copy" = "Jê bigire"; +"Common.Controls.Actions.Copy" = "Copy"; "Common.Controls.Actions.CopyPhoto" = "Wêneyê jê bigire"; "Common.Controls.Actions.Delete" = "Jê bibe"; "Common.Controls.Actions.Discard" = "Biavêje"; @@ -63,7 +63,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Actions.SignUp" = "Ajimêr biafirîne"; "Common.Controls.Actions.Skip" = "Derbas bike"; "Common.Controls.Actions.TakePhoto" = "Wêne bikişîne"; -"Common.Controls.Actions.TranslatePost.Title" = "Ji %@ wergerîne"; +"Common.Controls.Actions.TranslatePost.Title" = "Ji %@ hate wergerandin"; "Common.Controls.Actions.TranslatePost.UnknownLanguage" = "Nenas"; "Common.Controls.Actions.TryAgain" = "Dîsa biceribîne"; "Common.Controls.Actions.UnblockDomain" = "%@ asteng neke"; @@ -106,7 +106,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Actions.Menu" = "Kulîn"; "Common.Controls.Status.Actions.Reblog" = "Ji nû ve nivîsandin"; "Common.Controls.Status.Actions.Reply" = "Bersivê bide"; -"Common.Controls.Status.Actions.ShareLinkInPost" = "Girêdanê di şandiyê de parve bike"; +"Common.Controls.Status.Actions.ShareLinkInPost" = "Share Link in Post"; "Common.Controls.Status.Actions.ShowGif" = "GIF nîşan bide"; "Common.Controls.Status.Actions.ShowImage" = "Wêneyê nîşan bide"; "Common.Controls.Status.Actions.ShowVideoPlayer" = "Lêdera vîdyoyê nîşan bide"; @@ -114,7 +114,7 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Actions.Unfavorite" = "Nebijarte"; "Common.Controls.Status.Actions.Unreblog" = "Ji nû ve nivîsandinê vegere"; "Common.Controls.Status.ContentWarning" = "Hişyariya naverokê"; -"Common.Controls.Status.LinkViaUser" = "%@ bi riya %@"; +"Common.Controls.Status.LinkViaUser" = "%@ via %@"; "Common.Controls.Status.LoadEmbed" = "Load Embed"; "Common.Controls.Status.MediaContentWarning" = "Ji bo eşkerekirinê li derekî bitikîne"; "Common.Controls.Status.MetaEntity.Email" = "Navnîşanên e-nameyê: %@"; @@ -134,9 +134,9 @@ Jkx girêdana înternetê xwe kontrol bike."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Ji bo dîtinê bitikîne"; "Common.Controls.Status.Translation.ShowOriginal" = "A resen nîşan bide"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Hate wergerandin ji %@ bi riya %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Nenas"; -"Common.Controls.Status.Translation.UnknownProvider" = "Nenas"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ ji nû ve nivîsand"; "Common.Controls.Status.UserRepliedTo" = "Bersiv da %@"; "Common.Controls.Status.Visibility.Direct" = "Tenê bikarhênerê qalkirî dikare vê şandiyê bibîne."; @@ -284,12 +284,9 @@ girêdanê bitikne da ku ajimêra xwe bidî piştrastkirin."; "Scene.Profile.Accessibility.EditAvatarImage" = "Wêneya avatar serrast bike"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Wêneya avatar nîşan bide"; "Scene.Profile.Accessibility.ShowBannerImage" = "Wêneya paşrûyê nîşan bide"; -"Scene.Profile.Dashboard.MyFollowers" = "şopîner"; -"Scene.Profile.Dashboard.MyFollowing" = "dişopîne"; -"Scene.Profile.Dashboard.MyPosts" = "şandî"; -"Scene.Profile.Dashboard.OtherFollowers" = "şopîner"; -"Scene.Profile.Dashboard.OtherFollowing" = "dişopîne"; -"Scene.Profile.Dashboard.OtherPosts" = "şandî"; +"Scene.Profile.Dashboard.Followers" = "şopîner"; +"Scene.Profile.Dashboard.Following" = "dişopîne"; +"Scene.Profile.Dashboard.Posts" = "şandî"; "Scene.Profile.Fields.AddRow" = "Rêzê tevlî bike"; "Scene.Profile.Fields.Joined" = "Dîroka tevlîbûnê"; "Scene.Profile.Fields.Placeholder.Content" = "Naverok"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings index 6c6bb2bc3..6e7839852 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/nl.lproj/Localizable.strings @@ -278,12 +278,9 @@ klik op de link om uw account te bevestigen."; "Scene.Profile.Accessibility.EditAvatarImage" = "Bewerk avatar-afbeelding"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Toon avatar-afbeelding"; "Scene.Profile.Accessibility.ShowBannerImage" = "Toon banner-afbeelding"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "volgers"; +"Scene.Profile.Dashboard.Following" = "volgend"; +"Scene.Profile.Dashboard.Posts" = "berichten"; "Scene.Profile.Fields.AddRow" = "Rij Toevoegen"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Inhoud"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings index 2238fc347..8275902d4 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/ru.lproj/Localizable.strings @@ -294,12 +294,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "Edit avatar image"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Show avatar image"; "Scene.Profile.Accessibility.ShowBannerImage" = "Show banner image"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "подписчики"; +"Scene.Profile.Dashboard.Following" = "подписки"; +"Scene.Profile.Dashboard.Posts" = "посты"; "Scene.Profile.Fields.AddRow" = "Добавить строку"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Содержимое"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings index c7f371bfc..1aa2aab73 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/sl.lproj/Localizable.strings @@ -134,9 +134,9 @@ Preverite svojo internetno povezavo."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tapnite za razkritje"; "Common.Controls.Status.Translation.ShowOriginal" = "Pokaži izvirnik"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Prevedeno iz %@ s pomočjo %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Neznano"; -"Common.Controls.Status.Translation.UnknownProvider" = "Neznano"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ je poobjavil_a"; "Common.Controls.Status.UserRepliedTo" = "Odgovarja %@"; "Common.Controls.Status.Visibility.Direct" = "Samo omenjeni uporabnik lahko vidi to objavo."; @@ -283,14 +283,11 @@ možno naložiti v Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Uredi sliko avatarja"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Pokaži sliko avatarja"; "Scene.Profile.Accessibility.ShowBannerImage" = "Pokaži sliko pasice"; -"Scene.Profile.Dashboard.MyFollowers" = "sledilcev"; -"Scene.Profile.Dashboard.MyFollowing" = "sledi"; -"Scene.Profile.Dashboard.MyPosts" = "objav"; -"Scene.Profile.Dashboard.OtherFollowers" = "sledilcev"; -"Scene.Profile.Dashboard.OtherFollowing" = "sledi"; -"Scene.Profile.Dashboard.OtherPosts" = "objav"; +"Scene.Profile.Dashboard.Followers" = "sledilcev"; +"Scene.Profile.Dashboard.Following" = "sledi"; +"Scene.Profile.Dashboard.Posts" = "Objave"; "Scene.Profile.Fields.AddRow" = "Dodaj vrstico"; -"Scene.Profile.Fields.Joined" = "Pridružen_a"; +"Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "Vsebina"; "Scene.Profile.Fields.Placeholder.Label" = "Oznaka"; "Scene.Profile.Fields.Verified.Long" = "Lastništvo te povezave je bilo preverjeno %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings index 562942280..4da00cad1 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/sv.lproj/Localizable.strings @@ -134,9 +134,9 @@ Kontrollera din internetanslutning."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Tryck för att visa"; "Common.Controls.Status.Translation.ShowOriginal" = "Visa original"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Översatt från %@ med %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Okänt"; -"Common.Controls.Status.Translation.UnknownProvider" = "Okänd"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ boostade"; "Common.Controls.Status.UserRepliedTo" = "Svarade på %@"; "Common.Controls.Status.Visibility.Direct" = "Endast omnämnda användare kan se detta inlägg."; @@ -283,12 +283,9 @@ laddas upp till Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Redigera profilbild"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Visa profilbild"; "Scene.Profile.Accessibility.ShowBannerImage" = "Visa banner"; -"Scene.Profile.Dashboard.MyFollowers" = "följare"; -"Scene.Profile.Dashboard.MyFollowing" = "följer"; -"Scene.Profile.Dashboard.MyPosts" = "inlägg"; -"Scene.Profile.Dashboard.OtherFollowers" = "följare"; -"Scene.Profile.Dashboard.OtherFollowing" = "följer"; -"Scene.Profile.Dashboard.OtherPosts" = "inlägg"; +"Scene.Profile.Dashboard.Followers" = "följare"; +"Scene.Profile.Dashboard.Following" = "följer"; +"Scene.Profile.Dashboard.Posts" = "inlägg"; "Scene.Profile.Fields.AddRow" = "Lägg till rad"; "Scene.Profile.Fields.Joined" = "Gick med"; "Scene.Profile.Fields.Placeholder.Content" = "Innehåll"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings index 5733ae5f2..6aeeb2a74 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/th.lproj/Localizable.strings @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "แตะเพื่อเปิดเผย"; "Common.Controls.Status.Translation.ShowOriginal" = "แสดงดั้งเดิมอยู่"; -"Common.Controls.Status.Translation.TranslatedFrom" = "แปลจาก %@ โดยใช้ %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "ไม่รู้จัก"; -"Common.Controls.Status.Translation.UnknownProvider" = "ไม่รู้จัก"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ ได้ดัน"; "Common.Controls.Status.UserRepliedTo" = "ตอบกลับ %@"; "Common.Controls.Status.Visibility.Direct" = "เฉพาะผู้ใช้ที่กล่าวถึงเท่านั้นที่สามารถเห็นโพสต์นี้"; @@ -283,14 +283,11 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "แก้ไขภาพประจำตัว"; "Scene.Profile.Accessibility.ShowAvatarImage" = "แสดงภาพประจำตัว"; "Scene.Profile.Accessibility.ShowBannerImage" = "แสดงภาพแบนเนอร์"; -"Scene.Profile.Dashboard.MyFollowers" = "ผู้ติดตาม"; -"Scene.Profile.Dashboard.MyFollowing" = "กำลังติดตาม"; -"Scene.Profile.Dashboard.MyPosts" = "โพสต์"; -"Scene.Profile.Dashboard.OtherFollowers" = "ผู้ติดตาม"; -"Scene.Profile.Dashboard.OtherFollowing" = "กำลังติดตาม"; -"Scene.Profile.Dashboard.OtherPosts" = "โพสต์"; +"Scene.Profile.Dashboard.Followers" = "ผู้ติดตาม"; +"Scene.Profile.Dashboard.Following" = "กำลังติดตาม"; +"Scene.Profile.Dashboard.Posts" = "โพสต์"; "Scene.Profile.Fields.AddRow" = "เพิ่มแถว"; -"Scene.Profile.Fields.Joined" = "เข้าร่วมเมื่อ"; +"Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "เนื้อหา"; "Scene.Profile.Fields.Placeholder.Label" = "ป้ายชื่อ"; "Scene.Profile.Fields.Verified.Long" = "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %@"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings index fe784e21c..c71fb332e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/tr.lproj/Localizable.strings @@ -282,12 +282,9 @@ yüklenemiyor."; "Scene.Profile.Accessibility.EditAvatarImage" = "Profil fotoğrafını düzenle"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Profil resmini göster"; "Scene.Profile.Accessibility.ShowBannerImage" = "Kapak fotoğrafını göster"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "takipçi"; +"Scene.Profile.Dashboard.Following" = "takip ediliyor"; +"Scene.Profile.Dashboard.Posts" = "gönderiler"; "Scene.Profile.Fields.AddRow" = "Satır Ekle"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "İçerik"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings index a7ff66a53..dc66003cc 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/vi.lproj/Localizable.strings @@ -134,9 +134,9 @@ Vui lòng kiểm tra kết nối mạng."; "Common.Controls.Status.Tag.Url" = "URL"; "Common.Controls.Status.TapToReveal" = "Nhấn để xem"; "Common.Controls.Status.Translation.ShowOriginal" = "Bản gốc"; -"Common.Controls.Status.Translation.TranslatedFrom" = "Dịch từ %@ bằng %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "Không xác định"; -"Common.Controls.Status.Translation.UnknownProvider" = "Không biết"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ đăng lại"; "Common.Controls.Status.UserRepliedTo" = "Trả lời đến %@"; "Common.Controls.Status.Visibility.Direct" = "Chỉ người được nhắc đến có thể thấy tút."; @@ -283,12 +283,9 @@ tải lên Mastodon."; "Scene.Profile.Accessibility.EditAvatarImage" = "Sửa ảnh đại diện"; "Scene.Profile.Accessibility.ShowAvatarImage" = "Hiển thị ảnh đại diện"; "Scene.Profile.Accessibility.ShowBannerImage" = "Hiển thị ảnh bìa"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "người theo dõi"; +"Scene.Profile.Dashboard.Following" = "theo dõi"; +"Scene.Profile.Dashboard.Posts" = "tút"; "Scene.Profile.Fields.AddRow" = "Thêm hàng"; "Scene.Profile.Fields.Joined" = "Đã tham gia"; "Scene.Profile.Fields.Placeholder.Content" = "Nội dung"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings index f58d2fcbc..7d164f80e 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hans.lproj/Localizable.strings @@ -283,12 +283,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "编辑头像"; "Scene.Profile.Accessibility.ShowAvatarImage" = "显示头像"; "Scene.Profile.Accessibility.ShowBannerImage" = "显示顶部横幅图片"; -"Scene.Profile.Dashboard.MyFollowers" = "followers"; -"Scene.Profile.Dashboard.MyFollowing" = "following"; -"Scene.Profile.Dashboard.MyPosts" = "posts"; -"Scene.Profile.Dashboard.OtherFollowers" = "followers"; -"Scene.Profile.Dashboard.OtherFollowing" = "following"; -"Scene.Profile.Dashboard.OtherPosts" = "posts"; +"Scene.Profile.Dashboard.Followers" = "关注者"; +"Scene.Profile.Dashboard.Following" = "正在关注"; +"Scene.Profile.Dashboard.Posts" = "帖子"; "Scene.Profile.Fields.AddRow" = "添加"; "Scene.Profile.Fields.Joined" = "Joined"; "Scene.Profile.Fields.Placeholder.Content" = "内容"; diff --git a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings index 610aebbf6..eba0703c7 100644 --- a/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings +++ b/MastodonSDK/Sources/MastodonLocalization/Resources/zh-Hant.lproj/Localizable.strings @@ -134,9 +134,9 @@ "Common.Controls.Status.Tag.Url" = "網址"; "Common.Controls.Status.TapToReveal" = "輕觸以顯示"; "Common.Controls.Status.Translation.ShowOriginal" = "顯示原文"; -"Common.Controls.Status.Translation.TranslatedFrom" = "透過 %@ 翻譯 %@"; +"Common.Controls.Status.Translation.TranslatedFrom" = "Translated from %@ using %@"; "Common.Controls.Status.Translation.UnknownLanguage" = "未知"; -"Common.Controls.Status.Translation.UnknownProvider" = "未知"; +"Common.Controls.Status.Translation.UnknownProvider" = "Unknown"; "Common.Controls.Status.UserReblogged" = "%@ 已轉嘟"; "Common.Controls.Status.UserRepliedTo" = "回覆給 %@"; "Common.Controls.Status.Visibility.Direct" = "只有被提及的使用者能看到此嘟文。"; @@ -278,12 +278,9 @@ "Scene.Profile.Accessibility.EditAvatarImage" = "編輯大頭貼"; "Scene.Profile.Accessibility.ShowAvatarImage" = "顯示大頭貼"; "Scene.Profile.Accessibility.ShowBannerImage" = "顯示橫幅圖片"; -"Scene.Profile.Dashboard.MyFollowers" = "跟隨者"; -"Scene.Profile.Dashboard.MyFollowing" = "正在跟隨"; -"Scene.Profile.Dashboard.MyPosts" = "嘟文"; -"Scene.Profile.Dashboard.OtherFollowers" = "跟隨者"; -"Scene.Profile.Dashboard.OtherFollowing" = "正在跟隨"; -"Scene.Profile.Dashboard.OtherPosts" = "嘟文"; +"Scene.Profile.Dashboard.Followers" = "跟隨者"; +"Scene.Profile.Dashboard.Following" = "跟隨中"; +"Scene.Profile.Dashboard.Posts" = "嘟文"; "Scene.Profile.Fields.AddRow" = "新增列"; "Scene.Profile.Fields.Joined" = "加入時間"; "Scene.Profile.Fields.Placeholder.Content" = "內容";