103 lines
3.4 KiB
Swift
103 lines
3.4 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
public import SignalServiceKit
|
|
|
|
public protocol StickerPickerSheetDelegate: AnyObject {
|
|
func makeManageStickersViewController(for: StickerPickerSheet) -> UIViewController
|
|
}
|
|
|
|
public class StickerPickerSheet: InteractiveSheetViewController {
|
|
|
|
override public var interactiveScrollViews: [UIScrollView] { stickerPickerView.stickerPackCollectionViewPages }
|
|
|
|
override public var sheetBackgroundColor: UIColor { .clear }
|
|
|
|
/// Used for presenting the sticker manager from the toolbar.
|
|
///
|
|
/// This delegate is optional. If it is not set, the picker sheet will
|
|
/// still function, but the manage stickers button will not appear
|
|
/// on the toolbar.
|
|
public weak var sheetDelegate: StickerPickerSheetDelegate? {
|
|
didSet {
|
|
// The picker view only shows the manage button if it has a delegate
|
|
// If the sheet doesn't have a delegate, it can't present the
|
|
// manage stickers view controller, so only set the picker view
|
|
// delegate if there is a sheet delegate.
|
|
stickerPickerView.delegate = sheetDelegate == nil ? nil : self
|
|
}
|
|
}
|
|
|
|
/// Used for handling sticker selection.
|
|
private weak var pickerDelegate: (StickerPickerDelegate & StoryStickerPickerDelegate)?
|
|
|
|
private lazy var stickerPickerView = StickerPickerView(
|
|
delegate: self,
|
|
storyStickerConfiguration: .showWithDelegate(pickerDelegate!),
|
|
)
|
|
|
|
public init(pickerDelegate: StickerPickerDelegate & StoryStickerPickerDelegate) {
|
|
self.pickerDelegate = pickerDelegate
|
|
|
|
let useBlurEffect = !UIAccessibility.isReduceTransparencyEnabled
|
|
super.init(visualEffect: useBlurEffect ? UIBlurEffect(style: .dark) : nil)
|
|
|
|
if !useBlurEffect {
|
|
stickerPickerView.backgroundColor = .Signal.background
|
|
}
|
|
}
|
|
|
|
override public func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
|
|
overrideUserInterfaceStyle = .dark
|
|
|
|
stickerPickerView.directionalLayoutMargins = .init(
|
|
hMargin: OWSTableViewController2.cellHInnerMargin,
|
|
vMargin: 8,
|
|
)
|
|
contentView.addSubview(stickerPickerView)
|
|
stickerPickerView.autoPinEdgesToSuperviewEdges()
|
|
stickerPickerView.stickerPackCollectionViewPages.forEach { $0.alwaysBounceVertical = true }
|
|
}
|
|
|
|
private var viewHasAppeared = false
|
|
|
|
override public func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
|
|
stickerPickerView.willBePresented()
|
|
}
|
|
|
|
override public func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
|
|
viewHasAppeared = true
|
|
}
|
|
|
|
override public func viewDidLayoutSubviews() {
|
|
super.viewDidLayoutSubviews()
|
|
|
|
if !viewHasAppeared {
|
|
stickerPickerView.wasPresented()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: StickerPickerViewDelegate
|
|
|
|
extension StickerPickerSheet: StickerPickerViewDelegate {
|
|
|
|
func presentManageStickersView(for stickerPickerView: StickerPickerView) {
|
|
guard let sheetDelegate else { return }
|
|
let manageStickersViewController = sheetDelegate.makeManageStickersViewController(for: self)
|
|
presentFormSheet(manageStickersViewController, animated: true)
|
|
}
|
|
|
|
public func didSelectSticker(_ stickerInfo: StickerInfo) {
|
|
pickerDelegate?.didSelectSticker(stickerInfo)
|
|
}
|
|
}
|