Skip to content

Commit 1170a52

Browse files
committed
Do not change view factory method signatures (opt-out from checking)
1 parent 1ab09e2 commit 1170a52

File tree

5 files changed

+75
-78
lines changed

5 files changed

+75
-78
lines changed

DemoAppSwiftUI/ViewFactoryExamples.swift

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class DemoAppFactory: ViewFactory {
2222

2323
func supportedMoreChannelActions(
2424
for channel: ChatChannel,
25-
onDismiss: @escaping @MainActor() -> Void,
26-
onError: @escaping @MainActor(Error) -> Void
25+
onDismiss: @escaping () -> Void,
26+
onError: @escaping (Error) -> Void
2727
) -> [ChannelAction] {
2828
var actions = ChannelAction.defaultActions(
2929
for: channel,
@@ -80,33 +80,31 @@ class DemoAppFactory: ViewFactory {
8080

8181
private func archiveChannelAction(
8282
for channel: ChatChannel,
83-
onDismiss: @escaping @MainActor() -> Void,
84-
onError: @escaping @MainActor(Error) -> Void
83+
onDismiss: @escaping () -> Void,
84+
onError: @escaping (Error) -> Void
8585
) -> ChannelAction {
8686
ChannelAction(
8787
title: channel.isArchived ? "Unarchive Channel" : "Archive Channel",
8888
iconName: "archivebox",
8989
action: { [weak self] in
9090
guard let self else { return }
91+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
92+
nonisolated(unsafe) let unsafeOnError = onError
9193
let channelController = self.chatClient.channelController(for: channel.cid)
9294
if channel.isArchived {
9395
channelController.unarchive { error in
94-
Task { @MainActor in
95-
if let error = error {
96-
onError(error)
97-
} else {
98-
onDismiss()
99-
}
96+
if let error = error {
97+
unsafeOnError(error)
98+
} else {
99+
unsafeOnDismiss()
100100
}
101101
}
102102
} else {
103103
channelController.archive { error in
104-
Task { @MainActor in
105-
if let error = error {
106-
onError(error)
107-
} else {
108-
onDismiss()
109-
}
104+
if let error = error {
105+
unsafeOnError(error)
106+
} else {
107+
unsafeOnDismiss()
110108
}
111109
}
112110
}
@@ -118,33 +116,31 @@ class DemoAppFactory: ViewFactory {
118116

119117
private func pinChannelAction(
120118
for channel: ChatChannel,
121-
onDismiss: @escaping @MainActor() -> Void,
122-
onError: @escaping @MainActor(Error) -> Void
119+
onDismiss: @escaping () -> Void,
120+
onError: @escaping (Error) -> Void
123121
) -> ChannelAction {
124122
let pinChannel = ChannelAction(
125123
title: channel.isPinned ? "Unpin Channel" : "Pin Channel",
126124
iconName: "pin.fill",
127125
action: { [weak self] in
128126
guard let self else { return }
127+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
128+
nonisolated(unsafe) let unsafeOnError = onError
129129
let channelController = self.chatClient.channelController(for: channel.cid)
130130
if channel.isPinned {
131131
channelController.unpin { error in
132-
Task { @MainActor in
133-
if let error = error {
134-
onError(error)
135-
} else {
136-
onDismiss()
137-
}
132+
if let error = error {
133+
unsafeOnError(error)
134+
} else {
135+
unsafeOnDismiss()
138136
}
139137
}
140138
} else {
141139
channelController.pin { error in
142-
Task { @MainActor in
143-
if let error = error {
144-
onError(error)
145-
} else {
146-
onDismiss()
147-
}
140+
if let error = error {
141+
unsafeOnError(error)
142+
} else {
143+
unsafeOnDismiss()
148144
}
149145
}
150146
}
@@ -267,23 +263,24 @@ class CustomFactory: ViewFactory {
267263
// Example for an injected action. Uncomment to see it in action.
268264
func supportedMoreChannelActions(
269265
for channel: ChatChannel,
270-
onDismiss: @escaping @Sendable() -> Void,
271-
onError: @escaping @Sendable(Error) -> Void
266+
onDismiss: @escaping () -> Void,
267+
onError: @escaping (Error) -> Void
272268
) -> [ChannelAction] {
273269
var defaultActions = ChannelAction.defaultActions(
274270
for: channel,
275271
chatClient: chatClient,
276272
onDismiss: onDismiss,
277273
onError: onError
278274
)
279-
275+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
276+
nonisolated(unsafe) let unsafeOnError = onError
280277
let freeze: @MainActor @Sendable() -> Void = {
281278
let controller = self.chatClient.channelController(for: channel.cid)
282279
controller.freezeChannel { error in
283280
if let error = error {
284-
onError(error)
281+
unsafeOnError(error)
285282
} else {
286-
onDismiss()
283+
unsafeOnDismiss()
287284
}
288285
}
289286
}
@@ -308,8 +305,8 @@ class CustomFactory: ViewFactory {
308305

309306
func makeMoreChannelActionsView(
310307
for channel: ChatChannel,
311-
onDismiss: @escaping @MainActor() -> Void,
312-
onError: @escaping @MainActor(Error) -> Void
308+
onDismiss: @escaping () -> Void,
309+
onError: @escaping (Error) -> Void
313310
) -> some View {
314311
VStack {
315312
Text("This is our custom view")

Sources/StreamChatSwiftUI/ChatChannelList/DefaultChannelActions.swift

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ extension ChannelAction {
1616
@preconcurrency @MainActor public static func defaultActions(
1717
for channel: ChatChannel,
1818
chatClient: ChatClient,
19-
onDismiss: @escaping @MainActor() -> Void,
20-
onError: @escaping @MainActor(Error) -> Void
19+
onDismiss: @escaping () -> Void,
20+
onError: @escaping (Error) -> Void
2121
) -> [ChannelAction] {
2222
var actions = [ChannelAction]()
2323

@@ -83,18 +83,18 @@ extension ChannelAction {
8383
@MainActor private static func muteAction(
8484
for channel: ChatChannel,
8585
chatClient: ChatClient,
86-
onDismiss: @escaping @MainActor() -> Void,
87-
onError: @escaping @MainActor(Error) -> Void
86+
onDismiss: @escaping () -> Void,
87+
onError: @escaping (Error) -> Void
8888
) -> ChannelAction {
89+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
90+
nonisolated(unsafe) let unsafeOnError = onError
8991
let muteAction: @MainActor() -> Void = {
9092
let controller = chatClient.channelController(for: channel.cid)
9193
controller.muteChannel { error in
92-
MainActor.ensureIsolated {
93-
if let error = error {
94-
onError(error)
95-
} else {
96-
onDismiss()
97-
}
94+
if let error = error {
95+
unsafeOnError(error)
96+
} else {
97+
unsafeOnDismiss()
9898
}
9999
}
100100
}
@@ -116,18 +116,18 @@ extension ChannelAction {
116116
@MainActor private static func unmuteAction(
117117
for channel: ChatChannel,
118118
chatClient: ChatClient,
119-
onDismiss: @escaping @MainActor() -> Void,
120-
onError: @escaping @MainActor(Error) -> Void
119+
onDismiss: @escaping () -> Void,
120+
onError: @escaping (Error) -> Void
121121
) -> ChannelAction {
122+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
123+
nonisolated(unsafe) let unsafeOnError = onError
122124
let unMuteAction: @MainActor() -> Void = {
123125
let controller = chatClient.channelController(for: channel.cid)
124126
controller.unmuteChannel { error in
125-
MainActor.ensureIsolated {
126-
if let error = error {
127-
onError(error)
128-
} else {
129-
onDismiss()
130-
}
127+
if let error = error {
128+
unsafeOnError(error)
129+
} else {
130+
unsafeOnDismiss()
131131
}
132132
}
133133
}
@@ -150,18 +150,18 @@ extension ChannelAction {
150150
@MainActor private static func deleteAction(
151151
for channel: ChatChannel,
152152
chatClient: ChatClient,
153-
onDismiss: @escaping @MainActor() -> Void,
154-
onError: @escaping @MainActor(Error) -> Void
153+
onDismiss: @escaping () -> Void,
154+
onError: @escaping (Error) -> Void
155155
) -> ChannelAction {
156+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
157+
nonisolated(unsafe) let unsafeOnError = onError
156158
let deleteConversationAction: @MainActor() -> Void = {
157159
let controller = chatClient.channelController(for: channel.cid)
158160
controller.deleteChannel { error in
159-
MainActor.ensureIsolated {
160-
if let error = error {
161-
onError(error)
162-
} else {
163-
onDismiss()
164-
}
161+
if let error = error {
162+
unsafeOnError(error)
163+
} else {
164+
unsafeOnDismiss()
165165
}
166166
}
167167
}
@@ -185,18 +185,18 @@ extension ChannelAction {
185185
for channel: ChatChannel,
186186
chatClient: ChatClient,
187187
userId: String,
188-
onDismiss: @escaping @MainActor() -> Void,
189-
onError: @escaping @MainActor(Error) -> Void
188+
onDismiss: @escaping () -> Void,
189+
onError: @escaping (Error) -> Void
190190
) -> ChannelAction {
191+
nonisolated(unsafe) let unsafeOnDismiss = onDismiss
192+
nonisolated(unsafe) let unsafeOnError = onError
191193
let leaveAction: @MainActor() -> Void = {
192194
let controller = chatClient.channelController(for: channel.cid)
193195
controller.removeMembers(userIds: [userId]) { error in
194-
MainActor.ensureIsolated {
195-
if let error = error {
196-
onError(error)
197-
} else {
198-
onDismiss()
199-
}
196+
if let error = error {
197+
unsafeOnError(error)
198+
} else {
199+
unsafeOnDismiss()
200200
}
201201
}
202202
}

Sources/StreamChatSwiftUI/ChatChannelList/MoreChannelActionsViewModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,22 +93,22 @@ import UIKit
9393
}
9494

9595
/// Model describing a channel action.
96-
public struct ChannelAction: Identifiable, Sendable {
96+
public struct ChannelAction: Identifiable, @unchecked Sendable {
9797
public var id: String {
9898
"\(title)-\(iconName)"
9999
}
100100

101101
public let title: String
102102
public let iconName: String
103-
public let action: @MainActor() -> Void
103+
public let action: () -> Void
104104
public let confirmationPopup: ConfirmationPopup?
105105
public let isDestructive: Bool
106106
nonisolated(unsafe) public var navigationDestination: AnyView?
107107

108108
public init(
109109
title: String,
110110
iconName: String,
111-
action: @escaping @MainActor() -> Void,
111+
action: @escaping () -> Void,
112112
confirmationPopup: ConfirmationPopup?,
113113
isDestructive: Bool
114114
) {

Sources/StreamChatSwiftUI/DefaultViewFactory.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ extension ViewFactory {
3030

3131
public func supportedMoreChannelActions(
3232
for channel: ChatChannel,
33-
onDismiss: @escaping @MainActor() -> Void,
34-
onError: @escaping @MainActor(Error) -> Void
33+
onDismiss: @escaping () -> Void,
34+
onError: @escaping (Error) -> Void
3535
) -> [ChannelAction] {
3636
ChannelAction.defaultActions(
3737
for: channel,

Sources/StreamChatSwiftUI/ViewFactory.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ import SwiftUI
112112
/// - Returns: list of `ChannelAction` items.
113113
func supportedMoreChannelActions(
114114
for channel: ChatChannel,
115-
onDismiss: @escaping @MainActor() -> Void,
116-
onError: @escaping @MainActor(Error) -> Void
115+
onDismiss: @escaping () -> Void,
116+
onError: @escaping (Error) -> Void
117117
) -> [ChannelAction]
118118

119119
associatedtype TrailingSwipeActionsViewType: View

0 commit comments

Comments
 (0)