diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/Notifications/NotificationsService.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/Notifications/NotificationsService.swift index eaa648c908..0e8ef2a6bc 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/Notifications/NotificationsService.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Frameworks/Notifications/NotificationsService.swift @@ -139,6 +139,7 @@ extension NotificationsService { case pushNotificationData case image case fcmOptions = "fcm_options" + case notificationID = "notification_id" } } @@ -177,6 +178,9 @@ extension NotificationsService { } // Set necessary keys to aps dict (see shared PushNotificationData.kt) + if let notificationID = userInfo[PayloadKey.notificationID.rawValue] { + apsDict[PayloadKey.notificationID.rawValue] = notificationID + } if let badgeID = userInfo[PayloadKey.badge.rawValue] { apsDict[PayloadKey.badge.rawValue] = badgeID } diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationClickedHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationClickedHyperskillAnalyticEvent.kt index 58cec55713..4d5377b494 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationClickedHyperskillAnalyticEvent.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationClickedHyperskillAnalyticEvent.kt @@ -20,7 +20,9 @@ import org.hyperskill.app.notification.remote.domain.model.PushNotificationData * "context": * { * "type": "STREAK_THREE" || "SELECT_FIRST_TRACK" || ..., - * "group": "Routine learning" || "Re-engagement" || ... + * "category": "Routine learning" || "Re-engagement" || ..., + * "image": "https://hyperskill.org/image.png", + * "notification_id": "12345" * } * } * ``` @@ -36,10 +38,6 @@ class PushNotificationClickedHyperskillAnalyticEvent( ) { override val params: Map get() = super.params + mapOf( - PARAM_CONTEXT to mapOf( - PushNotificationHyperskillAnalyticParams.PARAM_TYPE to pushNotificationData.typeString, - PushNotificationHyperskillAnalyticParams.PARAM_CATEGORY to pushNotificationData.categoryString, - PushNotificationHyperskillAnalyticParams.PARAM_IMAGE to pushNotificationData.image - ) + PARAM_CONTEXT to PushNotificationDataAnalyticContextMapper.map(pushNotificationData) ) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationDataAnalyticContextMapper.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationDataAnalyticContextMapper.kt new file mode 100644 index 0000000000..c89d40fc2b --- /dev/null +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationDataAnalyticContextMapper.kt @@ -0,0 +1,14 @@ +package org.hyperskill.app.notification.remote.domain.analytic + +import org.hyperskill.app.notification.remote.domain.model.PushNotificationData +import ru.nobird.app.core.model.mapOfNotNull + +internal object PushNotificationDataAnalyticContextMapper { + fun map(pushNotificationData: PushNotificationData): Map = + mapOfNotNull( + PushNotificationHyperskillAnalyticParams.PARAM_TYPE to pushNotificationData.typeString, + PushNotificationHyperskillAnalyticParams.PARAM_CATEGORY to pushNotificationData.categoryString, + PushNotificationHyperskillAnalyticParams.PARAM_IMAGE to pushNotificationData.image, + PushNotificationHyperskillAnalyticParams.PARAM_NOTIFICATION_ID to pushNotificationData.notificationId + ) +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationHyperskillAnalyticParams.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationHyperskillAnalyticParams.kt index 04009a21da..21941da7c9 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationHyperskillAnalyticParams.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationHyperskillAnalyticParams.kt @@ -4,4 +4,5 @@ internal object PushNotificationHyperskillAnalyticParams { const val PARAM_TYPE = "type" const val PARAM_CATEGORY = "category" const val PARAM_IMAGE = "image" + const val PARAM_NOTIFICATION_ID = "notification_id" } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationShownHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationShownHyperskillAnalyticEvent.kt index 9f1111249c..f5b248f3d3 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationShownHyperskillAnalyticEvent.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/analytic/PushNotificationShownHyperskillAnalyticEvent.kt @@ -20,7 +20,9 @@ import org.hyperskill.app.notification.remote.domain.model.PushNotificationData * "context": * { * "type": "STREAK_THREE" || "SELECT_FIRST_TRACK" || ..., - * "group": "Routine learning" || "Re-engagement" || ... + * "category": "Routine learning" || "Re-engagement" || ..., + * "image": "https://hyperskill.org/image.png", + * "notification_id": "12345" * } * } * ``` @@ -36,9 +38,6 @@ class PushNotificationShownHyperskillAnalyticEvent( ) { override val params: Map get() = super.params + mapOf( - PARAM_CONTEXT to mapOf( - PushNotificationHyperskillAnalyticParams.PARAM_TYPE to pushNotificationData.typeString, - PushNotificationHyperskillAnalyticParams.PARAM_CATEGORY to pushNotificationData.categoryString - ) + PARAM_CONTEXT to PushNotificationDataAnalyticContextMapper.map(pushNotificationData) ) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/model/PushNotificationData.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/model/PushNotificationData.kt index 857c508563..0cd041261e 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/model/PushNotificationData.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/notification/remote/domain/model/PushNotificationData.kt @@ -5,6 +5,8 @@ import kotlinx.serialization.Serializable @Serializable data class PushNotificationData( + @SerialName("notification_id") + val notificationId: String? = null, @SerialName("category") val typeString: String, @SerialName("thread-id") diff --git a/shared/src/commonTest/kotlin/org/hyperskill/main/AppFeatureTest.kt b/shared/src/commonTest/kotlin/org/hyperskill/main/AppFeatureTest.kt index 82377b1423..0f73dc97ab 100644 --- a/shared/src/commonTest/kotlin/org/hyperskill/main/AppFeatureTest.kt +++ b/shared/src/commonTest/kotlin/org/hyperskill/main/AppFeatureTest.kt @@ -54,8 +54,8 @@ class AppFeatureTest { AppFeature.Message.UserAccountStatus( Profile.stub(isGuest = true, trackId = 1), PushNotificationData( - PushNotificationType.STREAK_NEW.name, - PushNotificationCategory.CONTINUE_LEARNING.backendName!! + typeString = PushNotificationType.STREAK_NEW.name, + categoryString = PushNotificationCategory.CONTINUE_LEARNING.backendName!! ) ) ) diff --git a/shared/src/commonTest/kotlin/org/hyperskill/notification/NotificationClickHandlingFeatureTest.kt b/shared/src/commonTest/kotlin/org/hyperskill/notification/NotificationClickHandlingFeatureTest.kt index b32766221c..2bb7dbd136 100644 --- a/shared/src/commonTest/kotlin/org/hyperskill/notification/NotificationClickHandlingFeatureTest.kt +++ b/shared/src/commonTest/kotlin/org/hyperskill/notification/NotificationClickHandlingFeatureTest.kt @@ -18,8 +18,8 @@ class NotificationClickHandlingFeatureTest { NotificationClickHandlingFeature.State, NotificationClickHandlingFeature.Message.NotificationClicked( PushNotificationData( - PushNotificationType.STREAK_NEW.name, - PushNotificationCategory.CONTINUE_LEARNING.backendName!! + typeString = PushNotificationType.STREAK_NEW.name, + categoryString = PushNotificationCategory.CONTINUE_LEARNING.backendName!! ), isUserAuthorized = false, notificationLaunchedApp = true @@ -38,8 +38,8 @@ class NotificationClickHandlingFeatureTest { NotificationClickHandlingFeature.State, NotificationClickHandlingFeature.Message.NotificationClicked( PushNotificationData( - PushNotificationType.STREAK_NEW.name, - PushNotificationCategory.CONTINUE_LEARNING.backendName!! + typeString = PushNotificationType.STREAK_NEW.name, + categoryString = PushNotificationCategory.CONTINUE_LEARNING.backendName!! ), isUserAuthorized = true, notificationLaunchedApp = true