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)")
+    )
+}