mirror of
https://github.com/lux-tel/session-ios.git
synced 2026-10-30 20:38:32 +00:00
# Conflicts: # Scripts/LintLocalizableStrings.swift # Session.xcodeproj/project.pbxproj # Session.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved # Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme # Session/Calls/Call Management/SessionCall.swift # Session/Calls/Call Management/SessionCallManager.swift # Session/Calls/CallVC.swift # Session/Closed Groups/EditClosedGroupVC.swift # Session/Closed Groups/NewClosedGroupVC.swift # Session/Conversations/Context Menu/ContextMenuVC+Action.swift # Session/Conversations/Context Menu/ContextMenuVC+ActionView.swift # Session/Conversations/ConversationVC+Interaction.swift # Session/Conversations/ConversationVC.swift # Session/Conversations/ConversationViewModel.swift # Session/Conversations/Emoji Picker/EmojiPickerCollectionView.swift # Session/Conversations/Message Cells/CallMessageCell.swift # Session/Conversations/Message Cells/Content Views/MediaAlbumView.swift # Session/Conversations/Message Cells/Content Views/MediaView.swift # Session/Conversations/Message Cells/Content Views/QuoteView.swift # Session/Conversations/Message Cells/Content Views/ReactionContainerView.swift # Session/Conversations/Message Cells/Content Views/SwiftUI/QuoteView_SwiftUI.swift # Session/Conversations/Message Cells/InfoMessageCell.swift # Session/Conversations/Message Cells/VisibleMessageCell.swift # Session/Conversations/Settings/ThreadDisappearingMessagesSettingsViewModel.swift # Session/Conversations/Settings/ThreadSettingsViewModel.swift # Session/Conversations/Views & Modals/ConversationTitleView.swift # Session/Conversations/Views & Modals/MessageRequestFooterView.swift # Session/Emoji/Emoji+Available.swift # Session/Home/GlobalSearch/GlobalSearchViewController.swift # Session/Home/HomeVC.swift # Session/Home/HomeViewModel.swift # Session/Home/Message Requests/MessageRequestsViewModel.swift # Session/Home/New Conversation/NewConversationVC.swift # Session/Home/New Conversation/NewConversationViewModel.swift # Session/Home/New Conversation/NewDMVC.swift # Session/Media Viewing & Editing/DocumentTitleViewController.swift # Session/Media Viewing & Editing/GIFs/GifPickerCell.swift # Session/Media Viewing & Editing/GIFs/GifPickerLayout.swift # Session/Media Viewing & Editing/GIFs/GifPickerViewController.swift # Session/Media Viewing & Editing/GIFs/GiphyAPI.swift # Session/Media Viewing & Editing/GIFs/GiphyDownloader.swift # Session/Media Viewing & Editing/ImagePickerController.swift # Session/Media Viewing & Editing/MediaTileViewController.swift # Session/Media Viewing & Editing/MessageInfoScreen.swift # Session/Media Viewing & Editing/PhotoCapture.swift # Session/Media Viewing & Editing/PhotoCaptureViewController.swift # Session/Media Viewing & Editing/PhotoCollectionPickerViewModel.swift # Session/Media Viewing & Editing/PhotoLibrary.swift # Session/Media Viewing & Editing/SendMediaNavigationController.swift # Session/Meta/AppDelegate.swift # Session/Meta/AppEnvironment.swift # Session/Meta/MainAppContext.swift # Session/Meta/SessionApp.swift # Session/Meta/Translations/ar.lproj/Localizable.strings # Session/Meta/Translations/be.lproj/Localizable.strings # Session/Meta/Translations/bg.lproj/Localizable.strings # Session/Meta/Translations/bn.lproj/Localizable.strings # Session/Meta/Translations/cs.lproj/Localizable.strings # Session/Meta/Translations/da.lproj/Localizable.strings # Session/Meta/Translations/de.lproj/Localizable.strings # Session/Meta/Translations/el.lproj/Localizable.strings # Session/Meta/Translations/en.lproj/Localizable.strings # Session/Meta/Translations/eo.lproj/Localizable.strings # Session/Meta/Translations/es-ES.lproj/Localizable.strings # Session/Meta/Translations/fa.lproj/Localizable.strings # Session/Meta/Translations/fi.lproj/Localizable.strings # Session/Meta/Translations/fil.lproj/Localizable.strings # Session/Meta/Translations/fr.lproj/Localizable.strings # Session/Meta/Translations/hi.lproj/Localizable.strings # Session/Meta/Translations/hr.lproj/Localizable.strings # Session/Meta/Translations/hu.lproj/Localizable.strings # Session/Meta/Translations/id.lproj/Localizable.strings # Session/Meta/Translations/it.lproj/Localizable.strings # Session/Meta/Translations/ja.lproj/Localizable.strings # Session/Meta/Translations/ko.lproj/Localizable.strings # Session/Meta/Translations/ku.lproj/Localizable.strings # Session/Meta/Translations/lt.lproj/Localizable.strings # Session/Meta/Translations/lv.lproj/Localizable.strings # Session/Meta/Translations/ne-NP.lproj/Localizable.strings # Session/Meta/Translations/nl.lproj/Localizable.strings # Session/Meta/Translations/no.lproj/Localizable.strings # Session/Meta/Translations/pl.lproj/Localizable.strings # Session/Meta/Translations/pt-BR.lproj/Localizable.strings # Session/Meta/Translations/pt-PT.lproj/Localizable.strings # Session/Meta/Translations/ro.lproj/Localizable.strings # Session/Meta/Translations/ru.lproj/Localizable.strings # Session/Meta/Translations/si-LK.lproj/Localizable.strings # Session/Meta/Translations/sk.lproj/Localizable.strings # Session/Meta/Translations/sl.lproj/Localizable.strings # Session/Meta/Translations/sv-SE.lproj/Localizable.strings # Session/Meta/Translations/th.lproj/Localizable.strings # Session/Meta/Translations/tr.lproj/Localizable.strings # Session/Meta/Translations/uk.lproj/Localizable.strings # Session/Meta/Translations/vi.lproj/Localizable.strings # Session/Meta/Translations/zh-CN.lproj/Localizable.strings # Session/Meta/Translations/zh-TW.lproj/Localizable.strings # Session/Notifications/NotificationPresenter.swift # Session/Notifications/PushRegistrationManager.swift # Session/Notifications/SyncPushTokensJob.swift # Session/Notifications/UserNotificationsAdaptee.swift # Session/Onboarding/DisplayNameVC.swift # Session/Onboarding/FakeChatView.swift # Session/Onboarding/LandingVC.swift # Session/Onboarding/LinkDeviceVC.swift # Session/Onboarding/Onboarding.swift # Session/Onboarding/PNModeVC.swift # Session/Onboarding/RegisterVC.swift # Session/Onboarding/RestoreVC.swift # Session/Onboarding/SeedVC.swift # Session/Open Groups/JoinOpenGroupVC.swift # Session/Path/PathVC.swift # Session/Settings/BlockedContactsViewModel.swift # Session/Settings/ConversationSettingsViewModel.swift # Session/Settings/HelpViewModel.swift # Session/Settings/NotificationSettingsViewModel.swift # Session/Settings/NukeDataModal.swift # Session/Settings/PrivacySettingsViewModel.swift # Session/Settings/QRCodeVC.swift # Session/Settings/SeedModal.swift # Session/Settings/SettingsViewModel.swift # Session/Settings/Views/VersionFooterView.swift # Session/Shared/FullConversationCell.swift # Session/Shared/OWSBezierPathView.m # Session/Shared/ScanQRCodeWrapperVC.swift # Session/Shared/SessionCarouselView+SwiftUI.swift # Session/Shared/SessionTableViewController.swift # Session/Shared/Types/NavigatableState.swift # Session/Shared/Types/ObservableTableSource.swift # Session/Shared/Types/SessionCell+Accessory.swift # Session/Shared/Views/SessionCell+AccessoryView.swift # Session/Utilities/BackgroundPoller.swift # Session/Utilities/IP2Country.swift # Session/Utilities/MentionUtilities.swift # Session/Utilities/MockDataGenerator.swift # Session/Utilities/UIApplication+OWS.swift # Session/Utilities/UIContextualAction+Utilities.swift # SessionMessagingKit/Crypto/Crypto+Attachments.swift # SessionMessagingKit/Crypto/Crypto+SessionMessagingKit.swift # SessionMessagingKit/Database/Migrations/_004_RemoveLegacyYDB.swift # SessionMessagingKit/Database/Migrations/_014_GenerateInitialUserConfigDumps.swift # SessionMessagingKit/Database/Migrations/_015_BlockCommunityMessageRequests.swift # SessionMessagingKit/Database/Migrations/_018_DisappearingMessagesConfiguration.swift # SessionMessagingKit/Database/Models/Attachment.swift # SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift # SessionMessagingKit/Database/Models/Interaction.swift # SessionMessagingKit/Database/Models/LinkPreview.swift # SessionMessagingKit/Database/Models/Profile.swift # SessionMessagingKit/Database/Models/RecipientState.swift # SessionMessagingKit/Database/Models/SessionThread.swift # SessionMessagingKit/Jobs/AttachmentDownloadJob.swift # SessionMessagingKit/Jobs/AttachmentUploadJob.swift # SessionMessagingKit/Jobs/CheckForAppUpdatesJob.swift # SessionMessagingKit/Jobs/ConfigMessageReceiveJob.swift # SessionMessagingKit/Jobs/ConfigurationSyncJob.swift # SessionMessagingKit/Jobs/DisappearingMessagesJob.swift # SessionMessagingKit/Jobs/MessageSendJob.swift # SessionMessagingKit/Jobs/RetrieveDefaultOpenGroupRoomsJob.swift # SessionMessagingKit/Jobs/Types/GroupLeavingJob.swift # SessionMessagingKit/Jobs/UpdateProfilePictureJob.swift # SessionMessagingKit/LibSession/Config Handling/LibSession+Contacts.swift # SessionMessagingKit/LibSession/Config Handling/LibSession+ConvoInfoVolatile.swift # SessionMessagingKit/LibSession/Config Handling/LibSession+Shared.swift # SessionMessagingKit/LibSession/Config Handling/LibSession+UserGroups.swift # SessionMessagingKit/LibSession/Config Handling/LibSession+UserProfile.swift # SessionMessagingKit/LibSession/LibSession+SessionMessagingKit.swift # SessionMessagingKit/Messages/Control Messages/ClosedGroupControlMessage.swift # SessionMessagingKit/Messages/Control Messages/ExpirationTimerUpdate.swift # SessionMessagingKit/Messages/Message.swift # SessionMessagingKit/Open Groups/Crypto/Crypto+OpenGroupAPI.swift # SessionMessagingKit/Open Groups/Models/SOGSMessage.swift # SessionMessagingKit/Open Groups/OpenGroupAPI.swift # SessionMessagingKit/Open Groups/OpenGroupManager.swift # SessionMessagingKit/Sending & Receiving/Attachments/SignalAttachment.swift # SessionMessagingKit/Sending & Receiving/Attachments/ThumbnailService.swift # SessionMessagingKit/Sending & Receiving/Errors/MessageSenderError.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+Calls.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+DataExtractionNotification.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+LegacyClosedGroups.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+MessageRequests.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift # SessionMessagingKit/Sending & Receiving/Message Handling/MessageSender+LegacyClosedGroups.swift # SessionMessagingKit/Sending & Receiving/MessageReceiver.swift # SessionMessagingKit/Sending & Receiving/MessageSender+Convenience.swift # SessionMessagingKit/Sending & Receiving/MessageSender.swift # SessionMessagingKit/Sending & Receiving/Notifications/Models/SubscribeRequest.swift # SessionMessagingKit/Sending & Receiving/Notifications/Models/UnsubscribeRequest.swift # SessionMessagingKit/Sending & Receiving/Notifications/PushNotificationAPI.swift # SessionMessagingKit/Sending & Receiving/Pollers/ClosedGroupPoller.swift # SessionMessagingKit/Sending & Receiving/Pollers/CurrentUserPoller.swift # SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupAPI+Poller.swift # SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift # SessionMessagingKit/Shared Models/MessageViewModel.swift # SessionMessagingKit/Utilities/Preferences.swift # SessionMessagingKit/Utilities/ProfileManager.swift # SessionMessagingKit/Utilities/ProfileManagerError.swift # SessionMessagingKitTests/Jobs/MessageSendJobSpec.swift # SessionMessagingKitTests/LibSession/LibSessionSpec.swift # SessionMessagingKitTests/LibSession/LibSessionUtilSpec.swift # SessionMessagingKitTests/LibSession/Utilities/LibSessionTypeConversionUtilitiesSpec.swift # SessionMessagingKitTests/Open Groups/Models/SOGSMessageSpec.swift # SessionMessagingKitTests/Open Groups/OpenGroupAPISpec.swift # SessionMessagingKitTests/Open Groups/OpenGroupManagerSpec.swift # SessionMessagingKitTests/Utilities/CryptoSMKSpec.swift # SessionNotificationServiceExtension/NSENotificationPresenter.swift # SessionNotificationServiceExtension/NotificationServiceExtension.swift # SessionShareExtension/ShareAppExtensionContext.swift # SessionShareExtension/ShareNavController.swift # SessionShareExtension/ThreadPickerVC.swift # SessionSnodeKit/Crypto/Crypto+SessionSnodeKit.swift # SessionSnodeKit/Database/Models/SnodeReceivedMessageInfo.swift # SessionSnodeKit/LibSession/LibSession+Networking.swift # SessionSnodeKit/Models/DeleteAllBeforeResponse.swift # SessionSnodeKit/Models/DeleteAllMessagesResponse.swift # SessionSnodeKit/Models/DeleteMessagesResponse.swift # SessionSnodeKit/Models/RevokeSubkeyRequest.swift # SessionSnodeKit/Models/RevokeSubkeyResponse.swift # SessionSnodeKit/Models/SendMessageResponse.swift # SessionSnodeKit/Models/SnodeAuthenticatedRequestBody.swift # SessionSnodeKit/Models/UpdateExpiryAllResponse.swift # SessionSnodeKit/Models/UpdateExpiryResponse.swift # SessionSnodeKit/Networking/Network+OnionRequest.swift # SessionSnodeKit/Networking/PreparedRequest+OnionRequest.swift # SessionSnodeKit/Networking/SnodeAPI.swift # SessionSnodeKit/Types/IPv4.swift # SessionSnodeKit/Types/PreparedRequest.swift # SessionSnodeKit/Types/ProxiedContentDownloader.swift # SessionSnodeKit/Types/ValidatableResponse.swift # SessionSnodeKitTests/Types/BencodeResponseSpec.swift # SessionSnodeKitTests/_TestUtilities/SSKMockedExtensions.swift # SessionTests/Conversations/Settings/ThreadDisappearingMessagesViewModelSpec.swift # SessionTests/Conversations/Settings/ThreadSettingsViewModelSpec.swift # SessionTests/Database/DatabaseSpec.swift # SessionTests/Settings/NotificationContentViewModelSpec.swift # SessionUIKit/Components/ConfirmationModal.swift # SessionUIKit/Components/PlaceholderIcon.swift # SessionUIKit/Components/ToastController.swift # SessionUIKit/Components/TopBannerController.swift # SessionUIKit/Style Guide/ThemeManager.swift # SessionUIKit/Style Guide/Values.swift # SessionUtilitiesKit/Crypto/Crypto+SessionUtilitiesKit.swift # SessionUtilitiesKit/Crypto/Crypto.swift # SessionUtilitiesKit/Database/Models/Identity.swift # SessionUtilitiesKit/Database/Storage.swift # SessionUtilitiesKit/Database/Types/Migration.swift # SessionUtilitiesKit/General/AppContext.swift # SessionUtilitiesKit/General/Data+Utilities.swift # SessionUtilitiesKit/General/Features.swift # SessionUtilitiesKit/General/FileSystem.swift # SessionUtilitiesKit/General/General.swift # SessionUtilitiesKit/General/Logging.swift # SessionUtilitiesKit/General/String+Trimming.swift # SessionUtilitiesKit/General/String+Utilities.swift # SessionUtilitiesKit/General/UIEdgeInsets.swift # SessionUtilitiesKit/JobRunner/JobRunner.swift # SessionUtilitiesKit/LibSession/LibSession.swift # SessionUtilitiesKit/Media/Data+Image.swift # SessionUtilitiesKit/Media/DataSource.swift # SessionUtilitiesKit/Media/MediaUtils.swift # SessionUtilitiesKit/Media/MimeTypeUtil.swift # SessionUtilitiesKit/Meta/SessionUtilitiesKit.h # SessionUtilitiesKit/Networking/Network.swift # SessionUtilitiesKit/Types/Threading.swift # SessionUtilitiesKit/Utilities/Bencode.swift # SessionUtilitiesKit/Utilities/UIImage+Utilities.swift # SessionUtilitiesKitTests/Database/Models/IdentitySpec.swift # SessionUtilitiesKitTests/Database/Utilities/PersistableRecordUtilitiesSpec.swift # SessionUtilitiesKitTests/General/SessionIdSpec.swift # SessionUtilitiesKitTests/JobRunner/JobRunnerSpec.swift # SessionUtilitiesKitTests/Utilities/BencodeDecoderSpec.swift # SessionUtilitiesKitTests/Utilities/BencodeResponseSpec.swift # SessionUtilitiesKitTests/Utilities/BencodeSpec.swift # SignalUtilitiesKit/Media Viewing & Editing/Attachment Approval/AttachmentApprovalInputAccessoryView.swift # SignalUtilitiesKit/Media Viewing & Editing/Attachment Approval/AttachmentApprovalViewController.swift # SignalUtilitiesKit/Media Viewing & Editing/Attachment Approval/AttachmentCaptionToolbar.swift # SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorModel.swift # SignalUtilitiesKit/Media Viewing & Editing/MediaMessageView.swift # SignalUtilitiesKit/Meta/SignalUtilitiesKit.h # SignalUtilitiesKit/Screen Lock/ScreenLock.swift # SignalUtilitiesKit/Utilities/AppSetup.swift # SignalUtilitiesKit/Utilities/Bench.swift # SignalUtilitiesKit/Utilities/NoopNotificationsManager.swift # SignalUtilitiesKit/Utilities/SwiftSingletons.swift # _SharedTestUtilities/CommonMockedExtensions.swift # _SharedTestUtilities/GRDBExtensions.swift # _SharedTestUtilities/MockCrypto.swift # _SharedTestUtilities/MockJobRunner.swift # _SharedTestUtilities/Mocked.swift # _SharedTestUtilities/SynchronousStorage.swift
224 lines
7.4 KiB
Swift
224 lines
7.4 KiB
Swift
// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import UIKit
|
|
|
|
public class TopBannerController: UIViewController {
|
|
public enum Warning: String, Codable {
|
|
case invalid
|
|
|
|
var shouldAppearOnResume: Bool {
|
|
switch self {
|
|
case .invalid: return false
|
|
}
|
|
}
|
|
|
|
var text: String {
|
|
switch self {
|
|
case .invalid: return ""
|
|
}
|
|
}
|
|
}
|
|
|
|
private static var lastInstance: TopBannerController?
|
|
private let child: UIViewController
|
|
private var initialCachedWarning: Warning?
|
|
|
|
// MARK: - UI
|
|
|
|
private lazy var bottomConstraint: NSLayoutConstraint = bannerLabel
|
|
.pin(.bottom, to: .bottom, of: bannerContainer, withInset: -Values.verySmallSpacing)
|
|
|
|
private let contentStackView: UIStackView = {
|
|
let result: UIStackView = UIStackView()
|
|
result.translatesAutoresizingMaskIntoConstraints = false
|
|
result.axis = .vertical
|
|
result.distribution = .fill
|
|
result.alignment = .fill
|
|
|
|
return result
|
|
}()
|
|
|
|
private let bannerContainer: UIView = {
|
|
let result: UIView = UIView()
|
|
result.translatesAutoresizingMaskIntoConstraints = false
|
|
result.themeBackgroundColor = .primary
|
|
result.isHidden = true
|
|
|
|
return result
|
|
}()
|
|
|
|
private let bannerLabel: UILabel = {
|
|
let result: UILabel = UILabel()
|
|
result.translatesAutoresizingMaskIntoConstraints = false
|
|
result.setContentHuggingPriority(.required, for: .vertical)
|
|
result.font = .systemFont(ofSize: Values.verySmallFontSize)
|
|
result.textAlignment = .center
|
|
result.themeTextColor = .black
|
|
result.numberOfLines = 0
|
|
|
|
return result
|
|
}()
|
|
|
|
private lazy var closeButton: UIButton = {
|
|
let result: UIButton = UIButton()
|
|
result.translatesAutoresizingMaskIntoConstraints = false
|
|
result.setImage(
|
|
UIImage(systemName: "xmark", withConfiguration: UIImage.SymbolConfiguration(pointSize: 12, weight: .bold))?
|
|
.withRenderingMode(.alwaysTemplate),
|
|
for: .normal
|
|
)
|
|
result.contentMode = .center
|
|
result.themeTintColor = .black
|
|
result.addTarget(self, action: #selector(dismissBannerTapped), for: .touchUpInside)
|
|
|
|
return result
|
|
}()
|
|
|
|
// MARK: - Initialization
|
|
|
|
public init(
|
|
child: UIViewController,
|
|
cachedWarning: Warning? = nil
|
|
) {
|
|
self.child = child
|
|
self.initialCachedWarning = cachedWarning
|
|
|
|
super.init(nibName: nil, bundle: nil)
|
|
|
|
TopBannerController.lastInstance = self
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
// MARK: - Lifecycle
|
|
|
|
public override func loadView() {
|
|
super.loadView()
|
|
|
|
view.addSubview(contentStackView)
|
|
|
|
contentStackView.addArrangedSubview(bannerContainer)
|
|
attachChild()
|
|
|
|
bannerContainer.addSubview(bannerLabel)
|
|
bannerContainer.addSubview(closeButton)
|
|
|
|
setupLayout()
|
|
|
|
// If we had an initial warning then show it
|
|
if let warning: Warning = self.initialCachedWarning {
|
|
UIView.performWithoutAnimation {
|
|
TopBannerController.show(warning: warning)
|
|
}
|
|
|
|
self.initialCachedWarning = nil
|
|
}
|
|
}
|
|
|
|
private func setupLayout() {
|
|
contentStackView.pin(.top, to: .top, of: view.safeAreaLayoutGuide)
|
|
contentStackView.pin(.leading, to: .leading, of: view)
|
|
contentStackView.pin(.trailing, to: .trailing, of: view)
|
|
contentStackView.pin(.bottom, to: .bottom, of: view)
|
|
|
|
bannerLabel.pin(.top, to: .top, of: view.safeAreaLayoutGuide, withInset: Values.verySmallSpacing)
|
|
bannerLabel.pin(.leading, to: .leading, of: bannerContainer, withInset: Values.veryLargeSpacing)
|
|
bannerLabel.pin(.trailing, to: .trailing, of: bannerContainer, withInset: -Values.veryLargeSpacing)
|
|
bottomConstraint.isActive = false
|
|
|
|
let buttonSize: CGFloat = (12 + (Values.smallSpacing * 2))
|
|
closeButton.center(.vertical, in: bannerLabel)
|
|
closeButton.pin(.trailing, to: .trailing, of: bannerContainer, withInset: -Values.smallSpacing)
|
|
closeButton.set(.width, to: buttonSize)
|
|
closeButton.set(.height, to: buttonSize)
|
|
}
|
|
|
|
// MARK: - Actions
|
|
|
|
@objc private func dismissBannerTapped() {
|
|
// Remove the cached warning
|
|
SNUIKit.topBannerChanged(to: nil)
|
|
|
|
UIView.animate(
|
|
withDuration: 0.3,
|
|
animations: { [weak self] in
|
|
self?.bottomConstraint.isActive = false
|
|
self?.contentStackView.setNeedsLayout()
|
|
self?.contentStackView.layoutIfNeeded()
|
|
},
|
|
completion: { [weak self] _ in
|
|
self?.bannerContainer.isHidden = true
|
|
}
|
|
)
|
|
}
|
|
|
|
// MARK: - Functions
|
|
public func wrappedViewController() -> UIViewController? {
|
|
if let navVC = child as? UINavigationController {
|
|
return navVC.topViewController
|
|
}
|
|
return child
|
|
}
|
|
|
|
public func attachChild() {
|
|
child.willMove(toParent: self)
|
|
addChild(child)
|
|
contentStackView.addArrangedSubview(child.view)
|
|
child.didMove(toParent: self)
|
|
}
|
|
|
|
public static func show(
|
|
warning: Warning,
|
|
inWindowFor view: UIView? = nil
|
|
) {
|
|
guard Thread.isMainThread else {
|
|
DispatchQueue.main.async {
|
|
TopBannerController.show(warning: warning, inWindowFor: view)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Not an ideal approach but should allow us to have a single banner
|
|
guard let instance: TopBannerController = ((view?.window?.rootViewController as? TopBannerController) ?? TopBannerController.lastInstance) else {
|
|
return
|
|
}
|
|
|
|
// Cache the banner to show (so we can show it on re-launch)
|
|
if instance.initialCachedWarning != nil && warning != instance.initialCachedWarning {
|
|
SNUIKit.topBannerChanged(to: warning)
|
|
}
|
|
|
|
UIView.performWithoutAnimation {
|
|
instance.bannerLabel.text = warning.text
|
|
instance.bannerLabel.setNeedsLayout()
|
|
instance.bannerLabel.layoutIfNeeded()
|
|
instance.bottomConstraint.isActive = false
|
|
instance.bannerContainer.isHidden = false
|
|
}
|
|
|
|
UIView.animate(withDuration: 0.3) { [weak instance] in
|
|
instance?.bottomConstraint.isActive = true
|
|
instance?.contentStackView.setNeedsLayout()
|
|
instance?.contentStackView.layoutIfNeeded()
|
|
}
|
|
}
|
|
|
|
public static func hide(inWindowFor view: UIView? = nil) {
|
|
guard Thread.isMainThread else {
|
|
DispatchQueue.main.async {
|
|
TopBannerController.hide(inWindowFor: view)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Not an ideal approach but should allow us to have a single banner
|
|
guard let instance: TopBannerController = ((view?.window?.rootViewController as? TopBannerController) ?? TopBannerController.lastInstance) else {
|
|
return
|
|
}
|
|
|
|
UIView.performWithoutAnimation { instance.dismissBannerTapped() }
|
|
}
|
|
}
|