diff --git a/Package.swift b/Package.swift index a59f5922ac395aba1b42f0480cb92c684b9e6cf4..bf5cff5a69750273b946290eb5053f00a5363664 100644 --- a/Package.swift +++ b/Package.swift @@ -749,6 +749,8 @@ let package = Package( .target( name: "ReportingFeature", dependencies: [ + .target(name: "DrawerFeature"), + .target(name: "Shared"), .product(name: "SwiftCSV", package: "SwiftCSV"), .product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"), ], diff --git a/Sources/ReportingFeature/MakeReportDrawer.swift b/Sources/ReportingFeature/MakeReportDrawer.swift new file mode 100644 index 0000000000000000000000000000000000000000..b8b4aa394481d3e292ef236711b1f31f82704d3e --- /dev/null +++ b/Sources/ReportingFeature/MakeReportDrawer.swift @@ -0,0 +1,86 @@ +import DrawerFeature +import Shared +import UIKit +import XCTestDynamicOverlay + +public struct MakeReportDrawer { + public struct Config { + public init( + onReport: @escaping () -> Void = {}, + onCancel: @escaping () -> Void = {} + ) { + self.onReport = onReport + self.onCancel = onCancel + } + + public var onReport: () -> Void + public var onCancel: () -> Void + } + + public var run: (Config) -> UIViewController + + public func callAsFunction(_ config: Config) -> UIViewController { + run(config) + } +} + +extension MakeReportDrawer { + public static let live = MakeReportDrawer { config in + let cancelButton = CapsuleButton() + cancelButton.setStyle(.seeThrough) + cancelButton.setTitle(Localized.Chat.Report.cancel, for: .normal) + + let reportButton = CapsuleButton() + reportButton.setStyle(.red) + reportButton.setTitle(Localized.Chat.Report.action, for: .normal) + + let drawer = DrawerController(with: [ + DrawerImage( + image: Asset.drawerNegative.image + ), + DrawerText( + font: Fonts.Mulish.semiBold.font(size: 18.0), + text: Localized.Chat.Report.title, + color: Asset.neutralActive.color + ), + DrawerText( + font: Fonts.Mulish.semiBold.font(size: 14.0), + text: Localized.Chat.Report.subtitle, + color: Asset.neutralWeak.color, + lineHeightMultiple: 1.35, + spacingAfter: 25 + ), + DrawerStack( + axis: .vertical, + spacing: 20.0, + views: [reportButton, cancelButton] + ) + ]) + + reportButton.publisher(for: .touchUpInside) + .receive(on: DispatchQueue.main) + .sink { [unowned drawer] in + drawer.dismiss(animated: true) { + config.onReport() + } + } + .store(in: &drawer.cancellables) + + cancelButton.publisher(for: .touchUpInside) + .receive(on: DispatchQueue.main) + .sink { [unowned drawer] in + drawer.dismiss(animated: true) { + config.onCancel() + } + } + .store(in: &drawer.cancellables) + + return drawer + } +} + +extension MakeReportDrawer { + public static let unimplemented = MakeReportDrawer( + run: XCTUnimplemented("\(Self.self)") + ) +}