1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-2427 Membership | Analytics (#1283)

This commit is contained in:
Konstantin Ivanov 2024-06-10 14:14:52 +02:00 committed by konstantiniiv
parent 2d8414912b
commit cbf7edf8fa
3 changed files with 86 additions and 2 deletions

View file

@ -230,6 +230,20 @@ object EventsDictionary {
const val galleryParamNew = "New"
const val galleryParamExisting = "Existing"
//Membership
const val screenMembership = "ScreenMembership"
const val clickMembership = "ClickMembership"
const val changePlan = "ChangePlan"
enum class MembershipTierButton(val value: String) {
INFO("LearnMore"),
MANAGE("ManagePayment"),
PAY("Pay"),
SUBMIT("Submit"),
CHANGE_EMAIL("ChangeEmail"),
CONTACT_US("ContactUs")
}
enum class ScreenOnboardingStep(val value: String) {
VOID("Void"),
PHRASE("Phrase")

View file

@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope
import com.android.billingclient.api.BillingFlowParams
import com.android.billingclient.api.ProductDetails
import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.analytics.base.EventsDictionary
import com.anytypeio.anytype.core_models.membership.EmailVerificationStatus
import com.anytypeio.anytype.core_models.membership.MembershipErrors
import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
@ -30,6 +31,9 @@ import com.anytypeio.anytype.payments.models.Tier
import com.anytypeio.anytype.payments.playbilling.BillingClientLifecycle
import com.anytypeio.anytype.payments.playbilling.BillingClientState
import com.anytypeio.anytype.payments.playbilling.BillingPurchaseState
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipClickEvent
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipPurchaseEvent
import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipScreenEvent
import com.anytypeio.anytype.presentation.membership.models.MembershipStatus
import com.anytypeio.anytype.presentation.membership.models.TierId
import com.anytypeio.anytype.presentation.membership.provider.MembershipProvider
@ -142,6 +146,12 @@ class MembershipViewModel(
val tierView = (tierState.value as? MembershipTierState.Visible)?.tier ?: return
proceedWithHideTier()
welcomeState.value = WelcomeState.Initial(tierView)
viewModelScope.launch {
sendAnalyticsMembershipPurchaseEvent(
analytics = analytics,
tier = tierView.title
)
}
proceedWithNavigation(MembershipNavigation.Welcome)
}
}
@ -166,6 +176,12 @@ class MembershipViewModel(
private fun proceedWithShowingTier(tierId: TierId) {
val visibleTier = getTierById(tierId) ?: return
tierState.value = MembershipTierState.Visible(visibleTier)
viewModelScope.launch {
sendAnalyticsMembershipScreenEvent(
analytics = analytics,
tier = visibleTier.title
)
}
proceedWithNavigation(MembershipNavigation.Tier)
}
@ -178,13 +194,21 @@ class MembershipViewModel(
fun onTierAction(action: TierAction) {
Timber.d("onTierAction: action:$action")
when (action) {
is TierAction.PayClicked -> onPayButtonClicked(action.tierId)
is TierAction.ManagePayment -> onManageTierClicked(action.tierId)
is TierAction.PayClicked -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.PAY)
onPayButtonClicked(action.tierId)
}
is TierAction.ManagePayment -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.MANAGE)
onManageTierClicked(action.tierId)
}
is TierAction.OpenUrl -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.INFO)
proceedWithNavigation(MembershipNavigation.OpenUrl(action.url))
}
TierAction.OpenEmail -> proceedWithSupportEmail()
is TierAction.SubmitClicked -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.SUBMIT)
proceedWithSettingEmail(
email = anyEmailState.text.toString(),
)
@ -198,6 +222,7 @@ class MembershipViewModel(
proceedWithValidatingEmailCode(action.code)
}
TierAction.ChangeEmail -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.CHANGE_EMAIL)
val tierView = (tierState.value as? MembershipTierState.Visible)?.tier ?: return
val updatedTierState = tierView.copy(
email = TierEmail.Visible.Enter,
@ -207,6 +232,7 @@ class MembershipViewModel(
}
is TierAction.ContactUsError -> {
sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.CONTACT_US)
proceedWithSupportErrorEmail(action.error)
}
}
@ -507,6 +533,15 @@ class MembershipViewModel(
errorState.value = MembershipErrorState.Hidden
}
private fun sendAnalyticsClickEvent(buttonType: EventsDictionary.MembershipTierButton) {
viewModelScope.launch {
sendAnalyticsMembershipClickEvent(
analytics = analytics,
buttonType = buttonType
)
}
}
//region Google Play Billing
/**
* Use the Google Play Billing Library to make a purchase.

View file

@ -2016,4 +2016,39 @@ fun CoroutineScope.sendAnalyticsUploadConfigFileEvent(
)
}
//endregion
//region Membership
fun CoroutineScope.sendAnalyticsMembershipScreenEvent(
analytics: Analytics,
tier: String
) {
sendEvent(
analytics = analytics,
eventName = EventsDictionary.screenMembership,
props = Props(mapOf(EventsPropertiesKey.name to tier))
)
}
fun CoroutineScope.sendAnalyticsMembershipClickEvent(
analytics: Analytics,
buttonType: EventsDictionary.MembershipTierButton
) {
sendEvent(
analytics = analytics,
eventName = EventsDictionary.clickMembership,
props = Props(mapOf(EventsPropertiesKey.type to buttonType.value))
)
}
fun CoroutineScope.sendAnalyticsMembershipPurchaseEvent(
analytics: Analytics,
tier: String
) {
sendEvent(
analytics = analytics,
eventName = EventsDictionary.changePlan,
props = Props(mapOf(EventsPropertiesKey.name to tier))
)
}
//endregion