From 1ab5963f79046151d75f036b448b6427d67e19f8 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Mon, 15 Aug 2022 21:34:55 +0100
Subject: [PATCH] Add MakeReportDrawer functor

---
 Package.swift                                 |  2 +
 .../ReportingFeature/MakeReportDrawer.swift   | 86 +++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 Sources/ReportingFeature/MakeReportDrawer.swift

diff --git a/Package.swift b/Package.swift
index a59f5922..bf5cff5a 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 00000000..b8b4aa39
--- /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)")
+    )
+}
-- 
GitLab