Skip to content

Commit 007f4cc

Browse files
authored
Introduce SwiftMessagesHideAction and Environment Key for SwiftUI (#574)
* Introduced SwiftMessagesHide Environment Key * Use Hide Action struct to resemble built-in Dismiss Action * Minor changes post-feedback, use single hide(animated:) function * Used more apt comments and documentation
1 parent b929e04 commit 007f4cc

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

SwiftMessages.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
86BBA9061D5E040C00FE8F16 /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 864495551D4F7C390056EB2A /* Identifiable.swift */; };
8989
86BBA9071D5E040C00FE8F16 /* MarginAdjustable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AAF81D1D5549680031EE32 /* MarginAdjustable.swift */; };
9090
86BBA9081D5E040C00FE8F16 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AAF82A1D580DD70031EE32 /* Error.swift */; };
91+
B0E55A662DD110EA003D97B1 /* SwiftMessagesHideAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0E55A652DD110DB003D97B1 /* SwiftMessagesHideAction.swift */; };
9192
E6E49F911D70A344006CB883 /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 862C0CDA1D5A397F00D06168 /* MessageView.xib */; };
9293
E6E49F921D70A349006CB883 /* StatusLine.xib in Resources */ = {isa = PBXBuildFile; fileRef = 862C0CDB1D5A397F00D06168 /* StatusLine.xib */; };
9394
/* End PBXBuildFile section */
@@ -191,6 +192,7 @@
191192
86B48AFA1D5A41C900063E2B /* SwiftMessagesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMessagesTests.swift; sourceTree = "<group>"; };
192193
86B48AFC1D5A41C900063E2B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
193194
86BBA8F81D5E01FC00FE8F16 /* CardView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CardView.xib; path = Resources/CardView.xib; sourceTree = "<group>"; };
195+
B0E55A652DD110DB003D97B1 /* SwiftMessagesHideAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMessagesHideAction.swift; sourceTree = "<group>"; };
194196
/* End PBXFileReference section */
195197

196198
/* Begin PBXFrameworksBuildPhase section */
@@ -255,6 +257,7 @@
255257
228F7DDA2ACF7029006C9644 /* SwiftUI */ = {
256258
isa = PBXGroup;
257259
children = (
260+
B0E55A652DD110DB003D97B1 /* SwiftMessagesHideAction.swift */,
258261
223DE69C2C29E50B000161E5 /* MessageGeometryProxy.swift */,
259262
228F7DDB2ACF7039006C9644 /* MessageHostingView.swift */,
260263
228F7DDD2ACF703A006C9644 /* MessageViewConvertible.swift */,
@@ -589,6 +592,7 @@
589592
220D386E2597AA5B00BB2B88 /* SwiftMessages.Config+Extensions.swift in Sources */,
590593
2270044B1FAFA6DD0045DDC3 /* PhysicsAnimation.swift in Sources */,
591594
224C3C902C28A2F900B50B18 /* TopBottomPresentable.swift in Sources */,
595+
B0E55A662DD110EA003D97B1 /* SwiftMessagesHideAction.swift in Sources */,
592596
86BBA9041D5E040600FE8F16 /* NSBundle+Extensions.swift in Sources */,
593597
86BBA8FD1D5E03F800FE8F16 /* SwiftMessages.swift in Sources */,
594598
86BBA9021D5E040600FE8F16 /* WindowViewController.swift in Sources */,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// SwiftMessagesHideKey.swift
3+
// SwiftMessages
4+
//
5+
// Created by Mofe Ejegi on 11/05/2025.
6+
// Copyright © 2025 SwiftKick Mobile. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
11+
/// A SwiftUI-style action for dismissing the current SwiftMessage.
12+
public struct SwiftMessagesHideAction {
13+
public init() {}
14+
15+
/// Dismiss with option to disable animation.
16+
@MainActor
17+
public func callAsFunction(animated: Bool) {
18+
SwiftMessages.hide(animated: animated)
19+
}
20+
}
21+
22+
public extension EnvironmentValues {
23+
/// Inject `@Environment(\.swiftMessagesHide)` into your views to
24+
/// access the SwiftUI-style action for dismissing the current SwiftMessage.
25+
///
26+
/// Usage:
27+
/// ```swift
28+
/// @Environment(\.swiftMessagesHide) private var hide
29+
/// ```
30+
///
31+
/// Then you can call it like this:
32+
/// ```swift
33+
/// hide(animated: true)
34+
/// ```
35+
var swiftMessagesHide: SwiftMessagesHideAction {
36+
get { self[SwiftMessagesHideKey.self] }
37+
set { self[SwiftMessagesHideKey.self] = newValue }
38+
}
39+
}
40+
41+
private struct SwiftMessagesHideKey: EnvironmentKey {
42+
/// Default to our action struct, which itself defaults to animated.
43+
static let defaultValue: SwiftMessagesHideAction = SwiftMessagesHideAction()
44+
}

SwiftUIDemo/SwiftUIDemo/DemoView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import SwiftUI
99
import SwiftMessages
1010

1111
struct DemoView: View {
12+
13+
/// Use this to manually hide the swift message
14+
@Environment(\.swiftMessagesHide) private var hide
1215

1316
/// Demonstrates purely data-driven message presentation.
1417
@State var message: DemoMessage?
@@ -51,8 +54,8 @@ struct DemoView: View {
5154
.swiftMessage(message: $message)
5255
.swiftMessage(message: $messageWithButton) { message in
5356
DemoMessageWithButtonView(message: message, style: .card) {
54-
Button("Tap Me") {
55-
print("Tap")
57+
Button("Hide") {
58+
hide(animated: true)
5659
}
5760
.buttonStyle(.bordered)
5861
}

0 commit comments

Comments
 (0)