Skip to content

Commit

Permalink
Showing 6 changed files with 82 additions and 104 deletions.
Original file line number Diff line number Diff line change
@@ -53,6 +53,7 @@ class DefaultAppIntegrationDelegate: NSObject, AppIntegrationDelegate {
}

#if !os(watchOS)
@MainActor
public func didReceiveRemoteNotification(
userInfo: [AnyHashable: Any],
isForeground: Bool,
@@ -76,6 +77,7 @@ class DefaultAppIntegrationDelegate: NSObject, AppIntegrationDelegate {
}
}
#else
@MainActor
public func didReceiveRemoteNotification(
userInfo: [AnyHashable: Any],
isForeground: Bool,
@@ -100,6 +102,7 @@ class DefaultAppIntegrationDelegate: NSObject, AppIntegrationDelegate {
}
#endif

@MainActor
public func willPresentNotification(
notification: UNNotification,
presentationOptions: UNNotificationPresentationOptions,
@@ -205,6 +208,7 @@ class DefaultAppIntegrationDelegate: NSObject, AppIntegrationDelegate {
}
}

@MainActor
private func processPush(
_ userInfo: [AnyHashable: Any],
isForeground: Bool,
Original file line number Diff line number Diff line change
@@ -43,6 +43,7 @@ class DefaultAppIntegrationdelegateTest: XCTestCase {
XCTAssertEqual("some error", error.localizedDescription)
}

@MainActor
func testDidReceiveRemoteNotification() throws {
let expectedUserInfo = ["neat": "story"]

67 changes: 31 additions & 36 deletions Airship/AirshipMessageCenter/Source/MessageCenter.swift
Original file line number Diff line number Diff line change
@@ -131,6 +131,7 @@ public class MessageCenter: NSObject, ObservableObject {

/// Display the message center.
@objc
@MainActor
public func display() {
guard self.enabled else {
AirshipLogger.warn("Message center disabled. Unable to display.")
@@ -139,10 +140,8 @@ public class MessageCenter: NSObject, ObservableObject {

guard let displayDelegate = self.displayDelegate else {
AirshipLogger.trace("Launching OOTB message center")
self.controller.displayMessageCenter(true)
Task {
await openDefaultMessageCenter()
}
showDefaultMessageCenter()
self.controller.navigate(messageID: nil)
return
}

@@ -154,6 +153,7 @@ public class MessageCenter: NSObject, ObservableObject {
/// - Parameters:
/// - messageID: The messageID of the message.
@objc(displayWithMessageID:)
@MainActor
public func display(messageID: String) {
guard self.enabled else {
AirshipLogger.warn("Message center disabled. Unable to display.")
@@ -162,10 +162,8 @@ public class MessageCenter: NSObject, ObservableObject {

guard let displayDelegate = self.displayDelegate else {
AirshipLogger.trace("Launching OOTB message center")
self.controller.displayMessage(messageID)
Task {
await openDefaultMessageCenter()
}
showDefaultMessageCenter()
self.controller.navigate(messageID: messageID)
return
}

@@ -181,33 +179,15 @@ public class MessageCenter: NSObject, ObservableObject {
if let displayDelegate = self.displayDelegate {
displayDelegate.dismissMessageCenter()
} else {
currentDisplay?.dispose()
Task { @MainActor in
self.dismissDefaultMessageCenter()
}
}
}

private func updateEnableState() {
self.inbox.enabled = self.enabled
}

@MainActor
private func openDefaultMessageCenter() async {
guard let scene = try? AirshipUtils.findWindowScene() else {
AirshipLogger.error(
"Unable to display message center, missing scene."
)
return
}

currentDisplay?.dispose()

AirshipLogger.debug("Opening default message center UI")

self.currentDisplay = showMessageCenter(
scene: scene,
theme: theme
)
}

}

extension MessageCenter: AirshipComponent, PushableComponent {
@@ -226,6 +206,7 @@ extension MessageCenter: AirshipComponent, PushableComponent {
}
}

@MainActor
func deepLink(deepLink: URL) -> Bool {
if !(deepLink.scheme == Airship.deepLinkScheme) {
return false
@@ -254,6 +235,7 @@ extension MessageCenter: AirshipComponent, PushableComponent {

// MARK: PushableComponent

@MainActor
public func receivedRemoteNotification(
_ notification: [AnyHashable: Any],
completionHandler: @escaping (UIBackgroundFetchResult) -> Void
@@ -290,13 +272,21 @@ extension MessageCenter: AirshipComponent, PushableComponent {
extension MessageCenter {

@MainActor
fileprivate func showMessageCenter(
scene: UIWindowScene,
theme: MessageCenterTheme?
) -> Disposable {
fileprivate func showDefaultMessageCenter() {
guard self.currentDisplay == nil else {
return
}

guard let scene = try? AirshipUtils.findWindowScene() else {
AirshipLogger.error(
"Unable to display message center, missing scene."
)
return
}

var window: UIWindow? = UIWindow(windowScene: scene)

let disposable = Disposable {
self.currentDisplay = Disposable {
window?.windowLevel = .normal
window?.isHidden = true
window = nil
@@ -306,14 +296,19 @@ extension MessageCenter {
theme: theme,
controller: self.controller
) {
disposable.dispose()
self.currentDisplay?.dispose()
self.currentDisplay = nil
}

window?.isHidden = false
window?.windowLevel = .alert
window?.makeKeyAndVisible()
window?.rootViewController = viewController
}

return disposable
@MainActor
fileprivate func dismissDefaultMessageCenter() {
self.currentDisplay?.dispose()
self.currentDisplay = nil
}
}
Original file line number Diff line number Diff line change
@@ -18,23 +18,18 @@ public enum MessageCenterState: Equatable {
public class MessageCenterController: NSObject, ObservableObject {

@Published
private(set) var visibleMessageID: String? = nil
var messageID: String? = nil

@Published
var visibleMessageID: String? = nil

@Published
private var isMessageCenterVisible: Bool = false
var isMessageCenterVisible: Bool = false

private var subscriptions: Set<AnyCancellable> = Set()

private let updateSubject = PassthroughSubject<MessageCenterState, Never>()

func displayMessageCenter(_ display: Bool) {
self.isMessageCenterVisible = display
}

func displayMessage(_ messageId: String?) {
self.visibleMessageID = messageId
}


/// Publisher that emits the message center state.
public var statePublisher: AnyPublisher<MessageCenterState, Never> {
self.updateSubject
@@ -47,7 +42,7 @@ public class MessageCenterController: NSObject, ObservableObject {
/// - messageID: The message ID to navigate to.
@objc
public func navigate(messageID: String?) {
self.displayMessage(messageID)
self.messageID = messageID
}

@objc
Original file line number Diff line number Diff line change
@@ -23,8 +23,6 @@ public struct MessageCenterListView: View {
@Environment(\.airshipMessageCenterTheme)
private var theme

@Environment(\.airshipMessageViewStyle)
private var messageStyle

@StateObject
private var viewModel = MessageCenterListViewModel()
@@ -51,23 +49,30 @@ public struct MessageCenterListView: View {
viewModel.delete(messages: messages)
}

@ViewBuilder
private func makeDestination(messageID: String, title: String?) -> some View {
MessageCenterMessageView(
messageID: messageID,
title: title
)
.onAppear {
self.controller.visibleMessageID = messageID
}
.onDisappear {
if (messageID == self.controller.visibleMessageID) {
self.controller.visibleMessageID = nil
}
}
.id(messageID)
}

@ViewBuilder
private func makeCell(
item: MessageCenterListItemViewModel,
messageID: String
) -> some View {
let cell = NavigationLink(
destination:
MessageCenterMessageView(
messageID: messageID,
title: item.message.title
)
.onAppear {
self.controller.displayMessage(messageID)
}
.onDisappear {
self.controller.displayMessage(nil)
}
destination: makeDestination(messageID: messageID, title: item.message.title)
) {
MessageCenterListItemView(viewModel: item)
}
@@ -105,11 +110,8 @@ public struct MessageCenterListView: View {
self.$selection.wrappedValue.removeAll()
}
}
.onAppear{
let _ = self.controller.$visibleMessageID
.sink {
isActive = ($0 != nil)
}
.onReceive(self.controller.$messageID) { messageID in
isActive = (messageID != nil)
}
}

@@ -124,7 +126,6 @@ public struct MessageCenterListView: View {

@ViewBuilder
private func makeContent() -> some View {

let content = ZStack {
makeList()
.opacity(self.listOpacity)
@@ -154,42 +155,24 @@ public struct MessageCenterListView: View {
}
}
}

let destination = self.messageStyle.makeBody(
configuration: MessageViewStyleConfiguration(
messageID: self.controller.visibleMessageID ?? "",
title: self.viewModel.messageItem(
forID: self.controller.visibleMessageID ?? ""
)?.message.title,
dismissAction: nil
)

let selected = self.controller.messageID ?? ""
let destination = makeDestination(
messageID: selected,
title: self.viewModel.messageItem(forID: selected)?.message.title
)
.onAppear {
self.controller.displayMessage(self.controller.visibleMessageID)
}
.onDisappear {
self.controller.displayMessage(nil)
}


if #available(iOS 16.0, *) {
content
.background(
NavigationLink(
"",
value: self.controller.visibleMessageID)
.navigationDestination(isPresented: $isActive) {
destination
}
)
content.background(
NavigationLink("", value: selected)
.navigationDestination(isPresented: $isActive) {
destination
}
)
} else {
content
.background(
NavigationLink(
"",
destination: destination,
isActive: $isActive
)
)
content.background(
NavigationLink("", destination: destination, isActive: $isActive)
)
}
}

Original file line number Diff line number Diff line change
@@ -65,21 +65,21 @@ public struct MessageCenterView: View {
content
}
.onAppear {
self.controller.displayMessageCenter(true)
self.controller.isMessageCenterVisible = true
}
.onDisappear {
self.controller.displayMessageCenter(false)
self.controller.isMessageCenterVisible = false
}
} else {
NavigationView {
content
}
.navigationViewStyle(.stack)
.onAppear {
self.controller.displayMessageCenter(true)
self.controller.isMessageCenterVisible = true
}
.onDisappear {
self.controller.displayMessageCenter(false)
self.controller.isMessageCenterVisible = false
}
}
}

0 comments on commit 0f7d62c

Please sign in to comment.