react-native-purchases-ui 8.0.0-beta.1 → 8.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RNPaywalls.podspec +2 -2
- package/android/build.gradle +2 -2
- package/android/src/main/java/com/revenuecat/purchases/react/ui/BasePaywallViewManager.kt +79 -58
- package/android/src/main/java/com/revenuecat/purchases/react/ui/FontAssetManager.kt +60 -16
- package/android/src/main/java/com/revenuecat/purchases/react/ui/{PaywallEvent.kt → PaywallEventName.kt} +6 -3
- package/android/src/main/java/com/revenuecat/purchases/react/ui/PaywallFooterViewManager.kt +20 -9
- package/android/src/main/java/com/revenuecat/purchases/react/ui/PaywallViewManager.kt +9 -3
- package/android/src/main/java/com/revenuecat/purchases/react/ui/RNPaywallsModule.kt +14 -2
- package/android/src/main/java/com/revenuecat/purchases/react/ui/ViewExtensions.kt +7 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnDismissEvent.kt +13 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnMeasureEvent.kt +17 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseCancelledEvent.kt +13 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseCompletedEvent.kt +18 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseErrorEvent.kt +14 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseStartedEvent.kt +16 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnRestoreCompletedEvent.kt +14 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnRestoreErrorEvent.kt +14 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnRestoreStartedEvent.kt +13 -0
- package/android/src/main/java/com/revenuecat/purchases/react/ui/events/PaywallEvent.kt +34 -0
- package/ios/PaywallViewWrapper.m +24 -1
- package/ios/RNPaywalls.m +21 -18
- package/lib/commonjs/index.js +19 -9
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +18 -8
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/index.d.ts +14 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/index.tsx +39 -7
    
        package/RNPaywalls.podspec
    CHANGED
    
    | @@ -10,13 +10,13 @@ Pod::Spec.new do |spec| | |
| 10 10 | 
             
              spec.authors      = package['author']
         | 
| 11 11 | 
             
              spec.homepage     = "https://github.com/RevenueCat/react-native-purchases"
         | 
| 12 12 | 
             
              spec.license      = package['license']
         | 
| 13 | 
            -
              spec.platform     = :ios, " | 
| 13 | 
            +
              spec.platform     = :ios, "11.0"
         | 
| 14 14 |  | 
| 15 15 | 
             
              spec.source       = { :git => "https://github.com/RevenueCat/react-native-purchases.git" }
         | 
| 16 16 | 
             
              spec.source_files = "ios/**/*.{h,m,swift}"
         | 
| 17 17 | 
             
              spec.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
         | 
| 18 18 |  | 
| 19 19 | 
             
              spec.dependency   "React-Core"
         | 
| 20 | 
            -
              spec.dependency   "PurchasesHybridCommonUI",  | 
| 20 | 
            +
              spec.dependency   "PurchasesHybridCommonUI", '13.0.1'
         | 
| 21 21 | 
             
              spec.swift_version    = '5.7'
         | 
| 22 22 | 
             
            end
         | 
    
        package/android/build.gradle
    CHANGED
    
    | @@ -59,7 +59,7 @@ android { | |
| 59 59 | 
             
                minSdkVersion getExtOrIntegerDefault("minSdkVersion")
         | 
| 60 60 | 
             
                targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
         | 
| 61 61 | 
             
                versionCode 1
         | 
| 62 | 
            -
                versionName '8.0. | 
| 62 | 
            +
                versionName '8.0.1'
         | 
| 63 63 | 
             
              }
         | 
| 64 64 |  | 
| 65 65 | 
             
              buildTypes {
         | 
| @@ -91,7 +91,7 @@ dependencies { | |
| 91 91 | 
             
              //noinspection GradleDynamicVersion
         | 
| 92 92 | 
             
              implementation "com.facebook.react:react-native:+"
         | 
| 93 93 | 
             
              implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
         | 
| 94 | 
            -
              implementation 'com.revenuecat.purchases:purchases-hybrid-common-ui: | 
| 94 | 
            +
              implementation 'com.revenuecat.purchases:purchases-hybrid-common-ui:13.0.1'
         | 
| 95 95 | 
             
              implementation 'androidx.compose.ui:ui-android:1.5.4'
         | 
| 96 96 | 
             
              implementation "androidx.appcompat:appcompat:1.6.1"
         | 
| 97 97 | 
             
            }
         | 
| @@ -1,14 +1,24 @@ | |
| 1 1 | 
             
            package com.revenuecat.purchases.react.ui
         | 
| 2 2 |  | 
| 3 3 | 
             
            import android.view.View
         | 
| 4 | 
            +
            import com.facebook.react.bridge.ReactContext
         | 
| 4 5 | 
             
            import com.facebook.react.bridge.ReadableMap
         | 
| 5 6 | 
             
            import com.facebook.react.bridge.WritableNativeMap
         | 
| 6 7 | 
             
            import com.facebook.react.common.MapBuilder
         | 
| 7 8 | 
             
            import com.facebook.react.uimanager.SimpleViewManager
         | 
| 8 9 | 
             
            import com.facebook.react.uimanager.ThemedReactContext
         | 
| 10 | 
            +
            import com.facebook.react.uimanager.UIManagerHelper
         | 
| 9 11 | 
             
            import com.facebook.react.uimanager.annotations.ReactProp
         | 
| 10 | 
            -
            import com.facebook.react.uimanager.events. | 
| 12 | 
            +
            import com.facebook.react.uimanager.events.Event
         | 
| 11 13 | 
             
            import com.revenuecat.purchases.hybridcommon.ui.PaywallListenerWrapper
         | 
| 14 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnDismissEvent
         | 
| 15 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnPurchaseCancelledEvent
         | 
| 16 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnPurchaseCompletedEvent
         | 
| 17 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnPurchaseErrorEvent
         | 
| 18 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnPurchaseStartedEvent
         | 
| 19 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnRestoreCompletedEvent
         | 
| 20 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnRestoreErrorEvent
         | 
| 21 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnRestoreStartedEvent
         | 
| 12 22 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.ExperimentalPreviewRevenueCatUIPurchasesAPI
         | 
| 13 23 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.fonts.CustomFontProvider
         | 
| 14 24 |  | 
| @@ -23,16 +33,19 @@ internal abstract class BasePaywallViewManager<T : View> : SimpleViewManager<T>( | |
| 23 33 |  | 
| 24 34 | 
             
                abstract fun setOfferingId(view: T, identifier: String)
         | 
| 25 35 |  | 
| 36 | 
            +
                abstract fun setDisplayDismissButton(view: T, display: Boolean)
         | 
| 37 | 
            +
             | 
| 26 38 | 
             
                override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
         | 
| 27 39 | 
             
                    return MapBuilder.builder<String, Any>()
         | 
| 28 | 
            -
                        .putEvent( | 
| 29 | 
            -
                        .putEvent( | 
| 30 | 
            -
                        .putEvent( | 
| 31 | 
            -
                        .putEvent( | 
| 32 | 
            -
                        .putEvent( | 
| 33 | 
            -
                        .putEvent( | 
| 34 | 
            -
                        .putEvent( | 
| 35 | 
            -
                        .putEvent( | 
| 40 | 
            +
                        .putEvent(PaywallEventName.ON_PURCHASE_STARTED)
         | 
| 41 | 
            +
                        .putEvent(PaywallEventName.ON_PURCHASE_COMPLETED)
         | 
| 42 | 
            +
                        .putEvent(PaywallEventName.ON_PURCHASE_ERROR)
         | 
| 43 | 
            +
                        .putEvent(PaywallEventName.ON_PURCHASE_CANCELLED)
         | 
| 44 | 
            +
                        .putEvent(PaywallEventName.ON_RESTORE_STARTED)
         | 
| 45 | 
            +
                        .putEvent(PaywallEventName.ON_RESTORE_COMPLETED)
         | 
| 46 | 
            +
                        .putEvent(PaywallEventName.ON_RESTORE_ERROR)
         | 
| 47 | 
            +
                        .putEvent(PaywallEventName.ON_DISMISS)
         | 
| 48 | 
            +
                        .putEvent(PaywallEventName.ON_MEASURE)
         | 
| 36 49 | 
             
                        .build()
         | 
| 37 50 | 
             
                }
         | 
| 38 51 |  | 
| @@ -44,11 +57,13 @@ internal abstract class BasePaywallViewManager<T : View> : SimpleViewManager<T>( | |
| 44 57 | 
             
                    options?.let { props ->
         | 
| 45 58 | 
             
                        setOfferingIdProp(view, props)
         | 
| 46 59 | 
             
                        setFontFamilyProp(view, props)
         | 
| 60 | 
            +
                        setDisplayCloseButton(view, props)
         | 
| 47 61 | 
             
                    }
         | 
| 48 62 | 
             
                }
         | 
| 49 63 |  | 
| 50 64 | 
             
                private fun setOfferingIdProp(view: T, props: ReadableMap?) {
         | 
| 51 | 
            -
                    val offeringIdentifier = | 
| 65 | 
            +
                    val offeringIdentifier =
         | 
| 66 | 
            +
                        props?.getDynamic(OPTION_OFFERING)?.asMap()?.getString(OFFERING_IDENTIFIER)
         | 
| 52 67 | 
             
                    offeringIdentifier?.let {
         | 
| 53 68 | 
             
                        setOfferingId(view, it)
         | 
| 54 69 | 
             
                    }
         | 
| @@ -60,71 +75,96 @@ internal abstract class BasePaywallViewManager<T : View> : SimpleViewManager<T>( | |
| 60 75 | 
             
                        FontAssetManager.getFontFamily(fontFamilyName = it, view.resources.assets)?.let {
         | 
| 61 76 | 
             
                            setFontFamily(view, CustomFontProvider(it))
         | 
| 62 77 | 
             
                        }
         | 
| 78 | 
            +
                    }
         | 
| 79 | 
            +
                }
         | 
| 63 80 |  | 
| 81 | 
            +
                private fun setDisplayCloseButton(view: T, options: ReadableMap) {
         | 
| 82 | 
            +
                    options.takeIf { it.hasKey("displayCloseButton") }?.let {
         | 
| 83 | 
            +
                        setDisplayDismissButton(view, it.getBoolean("displayCloseButton"))
         | 
| 64 84 | 
             
                    }
         | 
| 65 85 | 
             
                }
         | 
| 66 86 |  | 
| 67 | 
            -
                // TODO: RCTEventEmitter is deprecated, and RCTModernEventEmitter should be used instead
         | 
| 68 | 
            -
                // but documentation is not clear on how to use it so keeping this for now
         | 
| 69 87 | 
             
                internal fun createPaywallListenerWrapper(
         | 
| 70 88 | 
             
                    themedReactContext: ThemedReactContext,
         | 
| 71 89 | 
             
                    view: View
         | 
| 72 90 | 
             
                ) = object : PaywallListenerWrapper() {
         | 
| 73 | 
            -
             | 
| 74 91 | 
             
                    override fun onPurchaseStarted(rcPackage: Map<String, Any?>) {
         | 
| 75 | 
            -
                        val  | 
| 76 | 
            -
                             | 
| 92 | 
            +
                        val event = OnPurchaseStartedEvent(
         | 
| 93 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 94 | 
            +
                            viewTag = view.id,
         | 
| 95 | 
            +
                            rcPackage
         | 
| 77 96 | 
             
                        )
         | 
| 78 | 
            -
                        emitEvent(themedReactContext, view.id,  | 
| 97 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 79 98 | 
             
                    }
         | 
| 80 99 |  | 
| 81 100 | 
             
                    override fun onPurchaseCompleted(
         | 
| 82 101 | 
             
                        customerInfo: Map<String, Any?>,
         | 
| 83 102 | 
             
                        storeTransaction: Map<String, Any?>
         | 
| 84 103 | 
             
                    ) {
         | 
| 85 | 
            -
                        val  | 
| 86 | 
            -
                             | 
| 87 | 
            -
                             | 
| 104 | 
            +
                        val event = OnPurchaseCompletedEvent(
         | 
| 105 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 106 | 
            +
                            viewTag = view.id,
         | 
| 107 | 
            +
                            customerInfo,
         | 
| 108 | 
            +
                            storeTransaction
         | 
| 88 109 | 
             
                        )
         | 
| 89 | 
            -
                        emitEvent(themedReactContext, view.id,  | 
| 110 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 90 111 | 
             
                    }
         | 
| 91 112 |  | 
| 92 113 | 
             
                    override fun onPurchaseError(error: Map<String, Any?>) {
         | 
| 93 | 
            -
                        val  | 
| 94 | 
            -
             | 
| 114 | 
            +
                        val event = OnPurchaseErrorEvent(
         | 
| 115 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 116 | 
            +
                            viewTag = view.id,
         | 
| 117 | 
            +
                            error
         | 
| 118 | 
            +
                        )
         | 
| 119 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 95 120 | 
             
                    }
         | 
| 96 121 |  | 
| 97 122 | 
             
                    override fun onPurchaseCancelled() {
         | 
| 98 | 
            -
                         | 
| 123 | 
            +
                        val event = OnPurchaseCancelledEvent(
         | 
| 124 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 125 | 
            +
                            viewTag = view.id,
         | 
| 126 | 
            +
                        )
         | 
| 127 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 99 128 | 
             
                    }
         | 
| 100 129 |  | 
| 101 130 | 
             
                    override fun onRestoreStarted() {
         | 
| 102 | 
            -
                         | 
| 131 | 
            +
                        val event = OnRestoreStartedEvent(
         | 
| 132 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 133 | 
            +
                            viewTag = view.id,
         | 
| 134 | 
            +
                        )
         | 
| 135 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 103 136 | 
             
                    }
         | 
| 104 137 |  | 
| 105 138 | 
             
                    override fun onRestoreCompleted(customerInfo: Map<String, Any?>) {
         | 
| 106 | 
            -
                        val  | 
| 107 | 
            -
             | 
| 139 | 
            +
                        val event = OnRestoreCompletedEvent(
         | 
| 140 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 141 | 
            +
                            viewTag = view.id,
         | 
| 142 | 
            +
                            customerInfo,
         | 
| 143 | 
            +
                        )
         | 
| 144 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 108 145 | 
             
                    }
         | 
| 109 146 |  | 
| 110 147 | 
             
                    override fun onRestoreError(error: Map<String, Any?>) {
         | 
| 111 | 
            -
                        val  | 
| 112 | 
            -
             | 
| 148 | 
            +
                        val event = OnRestoreErrorEvent(
         | 
| 149 | 
            +
                            surfaceId = view.surfaceId,
         | 
| 150 | 
            +
                            viewTag = view.id,
         | 
| 151 | 
            +
                            error,
         | 
| 152 | 
            +
                        )
         | 
| 153 | 
            +
                        emitEvent(themedReactContext, view.id, event)
         | 
| 113 154 | 
             
                    }
         | 
| 114 155 |  | 
| 115 156 | 
             
                }
         | 
| 116 157 |  | 
| 117 158 | 
             
                internal fun getDismissHandler(
         | 
| 118 159 | 
             
                    themedReactContext: ThemedReactContext,
         | 
| 119 | 
            -
                    view:  | 
| 120 | 
            -
                ): (() -> Unit) {
         | 
| 121 | 
            -
                     | 
| 122 | 
            -
             | 
| 123 | 
            -
                    }
         | 
| 160 | 
            +
                    view: View,
         | 
| 161 | 
            +
                ): (() -> Unit) = {
         | 
| 162 | 
            +
                    val event = OnDismissEvent(view.surfaceId, view.id)
         | 
| 163 | 
            +
                    emitEvent(themedReactContext, view.id, event)
         | 
| 124 164 | 
             
                }
         | 
| 125 165 |  | 
| 126 166 | 
             
                private fun MapBuilder.Builder<String, Any>.putEvent(
         | 
| 127 | 
            -
                    paywallEvent:  | 
| 167 | 
            +
                    paywallEvent: PaywallEventName
         | 
| 128 168 | 
             
                ): MapBuilder.Builder<String, Any> {
         | 
| 129 169 | 
             
                    val registrationName = MapBuilder.of("registrationName", paywallEvent.eventName)
         | 
| 130 170 | 
             
                    return this.put(paywallEvent.eventName, registrationName)
         | 
| @@ -137,31 +177,12 @@ internal abstract class BasePaywallViewManager<T : View> : SimpleViewManager<T>( | |
| 137 177 | 
             
                    )
         | 
| 138 178 | 
             
                }
         | 
| 139 179 |  | 
| 140 | 
            -
                 | 
| 141 | 
            -
                    context:  | 
| 142 | 
            -
                    viewId: Int,
         | 
| 143 | 
            -
                    event: PaywallEvent,
         | 
| 144 | 
            -
                    payload: Map<PaywallEventKey, Map<String, Any?>>,
         | 
| 145 | 
            -
                ) {
         | 
| 146 | 
            -
                    val convertedPayload = WritableNativeMap().apply {
         | 
| 147 | 
            -
                        payload.forEach { (key, value) ->
         | 
| 148 | 
            -
                            putMap(key.key, RNPurchasesConverters.convertMapToWriteableMap(value))
         | 
| 149 | 
            -
                        }
         | 
| 150 | 
            -
                    }
         | 
| 151 | 
            -
                    emitEvent(context, viewId, event, convertedPayload)
         | 
| 152 | 
            -
                }
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                @Suppress("DEPRECATION")
         | 
| 155 | 
            -
                private fun emitEvent(
         | 
| 156 | 
            -
                    context: ThemedReactContext,
         | 
| 180 | 
            +
                protected fun emitEvent(
         | 
| 181 | 
            +
                    context: ReactContext,
         | 
| 157 182 | 
             
                    viewId: Int,
         | 
| 158 | 
            -
                    event:  | 
| 159 | 
            -
                    payload: WritableNativeMap? = null
         | 
| 183 | 
            +
                    event: Event<*>,
         | 
| 160 184 | 
             
                ) {
         | 
| 161 | 
            -
                     | 
| 162 | 
            -
             | 
| 163 | 
            -
                        event.eventName,
         | 
| 164 | 
            -
                        payload
         | 
| 165 | 
            -
                    )
         | 
| 185 | 
            +
                    val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, viewId)
         | 
| 186 | 
            +
                    eventDispatcher?.dispatchEvent(event)
         | 
| 166 187 | 
             
                }
         | 
| 167 188 | 
             
            }
         | 
| @@ -5,11 +5,16 @@ import androidx.compose.ui.text.font.Font | |
| 5 5 | 
             
            import androidx.compose.ui.text.font.FontFamily
         | 
| 6 6 | 
             
            import androidx.compose.ui.text.font.FontStyle
         | 
| 7 7 | 
             
            import androidx.compose.ui.text.font.FontWeight
         | 
| 8 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.ExperimentalPreviewRevenueCatUIPurchasesAPI
         | 
| 9 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFont
         | 
| 10 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFontFamily
         | 
| 8 11 |  | 
| 9 12 |  | 
| 13 | 
            +
            @OptIn(ExperimentalPreviewRevenueCatUIPurchasesAPI::class)
         | 
| 10 14 | 
             
            internal object FontAssetManager {
         | 
| 11 15 | 
             
                @get:Synchronized
         | 
| 12 16 | 
             
                private var fontFamilyCache = mapOf<String, FontFamily>()
         | 
| 17 | 
            +
                private var paywallFontFamilyCache = mapOf<String, PaywallFontFamily>()
         | 
| 13 18 | 
             
                private val FILE_EXTENSIONS = arrayOf(".ttf", ".otf")
         | 
| 14 19 |  | 
| 15 20 | 
             
                private const val FONT_PATH = "fonts/"
         | 
| @@ -39,23 +44,16 @@ internal object FontAssetManager { | |
| 39 44 | 
             
                    if (cachedFontFamily != null) {
         | 
| 40 45 | 
             
                        return cachedFontFamily
         | 
| 41 46 | 
             
                    }
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                    val fontsInFamily = | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                                 | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
                                        assetManager = assetManager,
         | 
| 52 | 
            -
                                        weight = styleExtension.weight,
         | 
| 53 | 
            -
                                        style = styleExtension.style
         | 
| 54 | 
            -
                                    )
         | 
| 55 | 
            -
                                )
         | 
| 56 | 
            -
                            }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    val fontsInFamily =
         | 
| 49 | 
            +
                        getFontsInFamily(fontFamilyName, assetManager) { fileName, styleExtension ->
         | 
| 50 | 
            +
                            Font(
         | 
| 51 | 
            +
                                path = FONT_PATH + fileName,
         | 
| 52 | 
            +
                                assetManager = assetManager,
         | 
| 53 | 
            +
                                weight = styleExtension.weight,
         | 
| 54 | 
            +
                                style = styleExtension.style
         | 
| 55 | 
            +
                            )
         | 
| 57 56 | 
             
                        }
         | 
| 58 | 
            -
                    }
         | 
| 59 57 |  | 
| 60 58 | 
             
                    return if (fontsInFamily.isNotEmpty()) {
         | 
| 61 59 | 
             
                        val fontFamily = FontFamily(fontsInFamily)
         | 
| @@ -65,4 +63,50 @@ internal object FontAssetManager { | |
| 65 63 | 
             
                        null
         | 
| 66 64 | 
             
                    }
         | 
| 67 65 | 
             
                }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                @Synchronized
         | 
| 68 | 
            +
                fun getPaywallFontFamily(
         | 
| 69 | 
            +
                    fontFamilyName: String,
         | 
| 70 | 
            +
                    assetManager: AssetManager
         | 
| 71 | 
            +
                ): PaywallFontFamily? {
         | 
| 72 | 
            +
                    val cachedPaywallFontFamily = paywallFontFamilyCache[fontFamilyName]
         | 
| 73 | 
            +
                    if (cachedPaywallFontFamily != null) {
         | 
| 74 | 
            +
                        return cachedPaywallFontFamily
         | 
| 75 | 
            +
                    }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    val paywallFontsInFamily =
         | 
| 78 | 
            +
                        getFontsInFamily(fontFamilyName, assetManager) { fileName, styleExtension ->
         | 
| 79 | 
            +
                            PaywallFont.AssetFont(
         | 
| 80 | 
            +
                                path = FONT_PATH + fileName,
         | 
| 81 | 
            +
                                fontWeight = styleExtension.weight,
         | 
| 82 | 
            +
                                fontStyle = styleExtension.style.value
         | 
| 83 | 
            +
                            )
         | 
| 84 | 
            +
                        }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                    return if (paywallFontsInFamily.isNotEmpty()) {
         | 
| 87 | 
            +
                        val fontFamily = PaywallFontFamily(paywallFontsInFamily)
         | 
| 88 | 
            +
                        paywallFontFamilyCache = paywallFontFamilyCache + (fontFamilyName to fontFamily)
         | 
| 89 | 
            +
                        fontFamily
         | 
| 90 | 
            +
                    } else {
         | 
| 91 | 
            +
                        null
         | 
| 92 | 
            +
                    }
         | 
| 93 | 
            +
                }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                private fun <T> getFontsInFamily(
         | 
| 96 | 
            +
                    fontFamilyName: String,
         | 
| 97 | 
            +
                    assetManager: AssetManager,
         | 
| 98 | 
            +
                    createFont: (String, FontStyleExtension) -> T
         | 
| 99 | 
            +
                ): List<T> {
         | 
| 100 | 
            +
                    val existingFontFileNames = assetManager.list(FONT_PATH)?.toList() ?: emptyList()
         | 
| 101 | 
            +
                    val fontsInFamily = mutableListOf<T>()
         | 
| 102 | 
            +
                    FontStyleExtension.values().forEach { styleExtension ->
         | 
| 103 | 
            +
                        FILE_EXTENSIONS.forEach { fileNameExtension ->
         | 
| 104 | 
            +
                            val fileName = "$fontFamilyName${styleExtension.extension}$fileNameExtension"
         | 
| 105 | 
            +
                            if (existingFontFileNames.contains(fileName)) {
         | 
| 106 | 
            +
                                fontsInFamily.add(createFont(fileName, styleExtension))
         | 
| 107 | 
            +
                            }
         | 
| 108 | 
            +
                        }
         | 
| 109 | 
            +
                    }
         | 
| 110 | 
            +
                    return fontsInFamily
         | 
| 111 | 
            +
                }
         | 
| 68 112 | 
             
            }
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            package com.revenuecat.purchases.react.ui
         | 
| 2 2 |  | 
| 3 | 
            -
            internal enum class  | 
| 3 | 
            +
            internal enum class PaywallEventName(val eventName: String) {
         | 
| 4 4 | 
             
                ON_PURCHASE_STARTED("onPurchaseStarted"),
         | 
| 5 5 | 
             
                ON_PURCHASE_COMPLETED("onPurchaseCompleted"),
         | 
| 6 6 | 
             
                ON_PURCHASE_ERROR("onPurchaseError"),
         | 
| @@ -8,12 +8,15 @@ internal enum class PaywallEvent(val eventName: String) { | |
| 8 8 | 
             
                ON_RESTORE_STARTED("onRestoreStarted"),
         | 
| 9 9 | 
             
                ON_RESTORE_COMPLETED("onRestoreCompleted"),
         | 
| 10 10 | 
             
                ON_RESTORE_ERROR("onRestoreError"),
         | 
| 11 | 
            -
                ON_DISMISS("onDismiss") | 
| 11 | 
            +
                ON_DISMISS("onDismiss"),
         | 
| 12 | 
            +
                ON_MEASURE("onMeasure");
         | 
| 12 13 | 
             
            }
         | 
| 13 14 |  | 
| 14 15 | 
             
            internal enum class PaywallEventKey(val key: String) {
         | 
| 15 16 | 
             
                PACKAGE("packageBeingPurchased"),
         | 
| 16 17 | 
             
                CUSTOMER_INFO("customerInfo"),
         | 
| 17 18 | 
             
                STORE_TRANSACTION("storeTransaction"),
         | 
| 18 | 
            -
                ERROR("error")
         | 
| 19 | 
            +
                ERROR("error"),
         | 
| 20 | 
            +
                MEASUREMENTS("measurements"),
         | 
| 21 | 
            +
                HEIGHT("height"),
         | 
| 19 22 | 
             
            }
         | 
| @@ -2,7 +2,7 @@ package com.revenuecat.purchases.react.ui | |
| 2 2 |  | 
| 3 3 | 
             
            import androidx.core.view.children
         | 
| 4 4 | 
             
            import com.facebook.react.uimanager.ThemedReactContext
         | 
| 5 | 
            -
            import com. | 
| 5 | 
            +
            import com.revenuecat.purchases.react.ui.events.OnMeasureEvent
         | 
| 6 6 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.ExperimentalPreviewRevenueCatUIPurchasesAPI
         | 
| 7 7 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.fonts.CustomFontProvider
         | 
| 8 8 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.views.PaywallFooterView
         | 
| @@ -48,16 +48,22 @@ internal class PaywallFooterViewManager : BasePaywallViewManager<PaywallFooterVi | |
| 48 48 | 
             
                            val finalWidth = maxWidth.coerceAtLeast(suggestedMinimumWidth)
         | 
| 49 49 | 
             
                            val finalHeight = maxHeight.coerceAtLeast(suggestedMinimumHeight)
         | 
| 50 50 | 
             
                            setMeasuredDimension(finalWidth, finalHeight)
         | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 51 | 
            +
             | 
| 52 | 
            +
                            val density = context.resources.displayMetrics.density
         | 
| 53 | 
            +
                            val finalHeightInDp = finalHeight / density
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                            val onMeasureEvent = OnMeasureEvent(
         | 
| 56 | 
            +
                                this.surfaceId,
         | 
| 57 | 
            +
                                this.id,
         | 
| 58 | 
            +
                                finalHeightInDp.toInt()
         | 
| 59 | 
            +
                            )
         | 
| 60 | 
            +
                            (context as? ThemedReactContext)?.reactApplicationContext?.let { reactApplicationContext ->
         | 
| 61 | 
            +
                                emitEvent(reactApplicationContext, this.id, onMeasureEvent)
         | 
| 56 62 | 
             
                            }
         | 
| 57 63 | 
             
                        }
         | 
| 58 | 
            -
                    }.also {
         | 
| 59 | 
            -
                         | 
| 60 | 
            -
                         | 
| 64 | 
            +
                    }.also { view ->
         | 
| 65 | 
            +
                        view.setPaywallListener(createPaywallListenerWrapper(themedReactContext, view))
         | 
| 66 | 
            +
                        view.setDismissHandler(getDismissHandler(themedReactContext, view))
         | 
| 61 67 | 
             
                    }
         | 
| 62 68 | 
             
                }
         | 
| 63 69 |  | 
| @@ -68,4 +74,9 @@ internal class PaywallFooterViewManager : BasePaywallViewManager<PaywallFooterVi | |
| 68 74 | 
             
                override fun setFontFamily(view: PaywallFooterView, customFontProvider: CustomFontProvider) {
         | 
| 69 75 | 
             
                    view.setFontProvider(customFontProvider)
         | 
| 70 76 | 
             
                }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                override fun setDisplayDismissButton(view: PaywallFooterView, display: Boolean) {
         | 
| 79 | 
            +
                    // No-op since PaywallFooterView doesn't have a dismiss button
         | 
| 80 | 
            +
                }
         | 
| 81 | 
            +
             | 
| 71 82 | 
             
            }
         | 
| @@ -5,6 +5,7 @@ import com.revenuecat.purchases.ui.revenuecatui.ExperimentalPreviewRevenueCatUIP | |
| 5 5 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.fonts.CustomFontProvider
         | 
| 6 6 | 
             
            import com.revenuecat.purchases.ui.revenuecatui.views.PaywallView
         | 
| 7 7 |  | 
| 8 | 
            +
             | 
| 8 9 | 
             
            @OptIn(ExperimentalPreviewRevenueCatUIPurchasesAPI::class)
         | 
| 9 10 | 
             
            internal class PaywallViewManager : BasePaywallViewManager<PaywallView>() {
         | 
| 10 11 |  | 
| @@ -17,9 +18,9 @@ internal class PaywallViewManager : BasePaywallViewManager<PaywallView>() { | |
| 17 18 | 
             
                }
         | 
| 18 19 |  | 
| 19 20 | 
             
                override fun createViewInstance(themedReactContext: ThemedReactContext): PaywallView {
         | 
| 20 | 
            -
                    return PaywallView(themedReactContext).also {
         | 
| 21 | 
            -
                         | 
| 22 | 
            -
                         | 
| 21 | 
            +
                    return PaywallView(themedReactContext).also { view ->
         | 
| 22 | 
            +
                        view.setPaywallListener(createPaywallListenerWrapper(themedReactContext, view))
         | 
| 23 | 
            +
                        view.setDismissHandler(getDismissHandler(themedReactContext, view))
         | 
| 23 24 | 
             
                    }
         | 
| 24 25 | 
             
                }
         | 
| 25 26 |  | 
| @@ -34,4 +35,9 @@ internal class PaywallViewManager : BasePaywallViewManager<PaywallView>() { | |
| 34 35 | 
             
                override fun setFontFamily(view: PaywallView, customFontProvider: CustomFontProvider) {
         | 
| 35 36 | 
             
                    view.setFontProvider(customFontProvider)
         | 
| 36 37 | 
             
                }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                override fun setDisplayDismissButton(view: PaywallView, display: Boolean) {
         | 
| 40 | 
            +
                    view.setDisplayDismissButton(display)
         | 
| 41 | 
            +
                }
         | 
| 42 | 
            +
             | 
| 37 43 | 
             
            }
         | 
| @@ -10,6 +10,9 @@ import com.revenuecat.purchases.hybridcommon.ui.PaywallResultListener | |
| 10 10 | 
             
            import com.revenuecat.purchases.hybridcommon.ui.PaywallSource
         | 
| 11 11 | 
             
            import com.revenuecat.purchases.hybridcommon.ui.PresentPaywallOptions
         | 
| 12 12 | 
             
            import com.revenuecat.purchases.hybridcommon.ui.presentPaywallFromFragment
         | 
| 13 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.ExperimentalPreviewRevenueCatUIPurchasesAPI
         | 
| 14 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFont
         | 
| 15 | 
            +
            import com.revenuecat.purchases.ui.revenuecatui.fonts.PaywallFontFamily
         | 
| 13 16 |  | 
| 14 17 | 
             
            internal class RNPaywallsModule(reactContext: ReactApplicationContext) :
         | 
| 15 18 | 
             
                ReactContextBaseJavaModule(reactContext) {
         | 
| @@ -36,12 +39,14 @@ internal class RNPaywallsModule(reactContext: ReactApplicationContext) : | |
| 36 39 | 
             
                fun presentPaywall(
         | 
| 37 40 | 
             
                    offeringIdentifier: String?,
         | 
| 38 41 | 
             
                    displayCloseButton: Boolean?,
         | 
| 42 | 
            +
                    fontFamily: String?,
         | 
| 39 43 | 
             
                    promise: Promise
         | 
| 40 44 | 
             
                ) {
         | 
| 41 45 | 
             
                    presentPaywall(
         | 
| 42 46 | 
             
                        null,
         | 
| 43 47 | 
             
                        offeringIdentifier,
         | 
| 44 48 | 
             
                        displayCloseButton,
         | 
| 49 | 
            +
                        fontFamily,
         | 
| 45 50 | 
             
                        promise
         | 
| 46 51 | 
             
                    )
         | 
| 47 52 | 
             
                }
         | 
| @@ -51,12 +56,14 @@ internal class RNPaywallsModule(reactContext: ReactApplicationContext) : | |
| 51 56 | 
             
                    requiredEntitlementIdentifier: String,
         | 
| 52 57 | 
             
                    offeringIdentifier: String?,
         | 
| 53 58 | 
             
                    displayCloseButton: Boolean,
         | 
| 59 | 
            +
                    fontFamily: String?,
         | 
| 54 60 | 
             
                    promise: Promise
         | 
| 55 61 | 
             
                ) {
         | 
| 56 62 | 
             
                    presentPaywall(
         | 
| 57 63 | 
             
                        requiredEntitlementIdentifier,
         | 
| 58 64 | 
             
                        offeringIdentifier,
         | 
| 59 65 | 
             
                        displayCloseButton,
         | 
| 66 | 
            +
                        fontFamily,
         | 
| 60 67 | 
             
                        promise
         | 
| 61 68 | 
             
                    )
         | 
| 62 69 | 
             
                }
         | 
| @@ -71,14 +78,18 @@ internal class RNPaywallsModule(reactContext: ReactApplicationContext) : | |
| 71 78 | 
             
                    // Keep: Required for RN built in Event Emitter Calls.
         | 
| 72 79 | 
             
                }
         | 
| 73 80 |  | 
| 81 | 
            +
                @OptIn(ExperimentalPreviewRevenueCatUIPurchasesAPI::class)
         | 
| 74 82 | 
             
                private fun presentPaywall(
         | 
| 75 83 | 
             
                    requiredEntitlementIdentifier: String?,
         | 
| 76 84 | 
             
                    offeringIdentifier: String?,
         | 
| 77 85 | 
             
                    displayCloseButton: Boolean?,
         | 
| 86 | 
            +
                    fontFamilyName: String?,
         | 
| 78 87 | 
             
                    promise: Promise
         | 
| 79 88 | 
             
                ) {
         | 
| 80 89 | 
             
                    val fragment = currentActivityFragment ?: return
         | 
| 81 | 
            -
             | 
| 90 | 
            +
                    val fontFamily = fontFamilyName?.let {
         | 
| 91 | 
            +
                        FontAssetManager.getPaywallFontFamily(fontFamilyName = it, fragment.resources.assets)
         | 
| 92 | 
            +
                    }
         | 
| 82 93 | 
             
                    presentPaywallFromFragment(
         | 
| 83 94 | 
             
                        fragment = fragment,
         | 
| 84 95 | 
             
                        PresentPaywallOptions(
         | 
| @@ -91,7 +102,8 @@ internal class RNPaywallsModule(reactContext: ReactApplicationContext) : | |
| 91 102 | 
             
                                override fun onPaywallResult(paywallResult: String) {
         | 
| 92 103 | 
             
                                    promise.resolve(paywallResult)
         | 
| 93 104 | 
             
                                }
         | 
| 94 | 
            -
                            }
         | 
| 105 | 
            +
                            },
         | 
| 106 | 
            +
                            fontFamily = fontFamily
         | 
| 95 107 | 
             
                        )
         | 
| 96 108 | 
             
                    )
         | 
| 97 109 | 
             
                }
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnDismissEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
            ) : PaywallEvent<OnDismissEvent>(surfaceId, viewTag) {
         | 
| 10 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_DISMISS
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                override fun getPayload(): Map<PaywallEventKey, Map<String, Any?>> = emptyMap()
         | 
| 13 | 
            +
            }
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnMeasureEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
                private val height: Int
         | 
| 10 | 
            +
            ) : PaywallEvent<OnDismissEvent>(surfaceId, viewTag) {
         | 
| 11 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_MEASURE
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                override fun getPayload() = mapOf(
         | 
| 14 | 
            +
                    PaywallEventKey.MEASUREMENTS to mapOf(PaywallEventKey.HEIGHT.key to height),
         | 
| 15 | 
            +
                )
         | 
| 16 | 
            +
            }
         | 
| 17 | 
            +
             | 
    
        package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseCancelledEvent.kt
    ADDED
    
    | @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnPurchaseCancelledEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
            ) : PaywallEvent<OnPurchaseCancelledEvent>(surfaceId, viewTag) {
         | 
| 10 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_PURCHASE_CANCELLED
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                override fun getPayload(): Map<PaywallEventKey, Map<String, Any?>> = emptyMap()
         | 
| 13 | 
            +
            }
         | 
    
        package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseCompletedEvent.kt
    ADDED
    
    | @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnPurchaseCompletedEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
                private val customerInfo: Map<String, Any?>,
         | 
| 10 | 
            +
                private val storeTransaction: Map<String, Any?>
         | 
| 11 | 
            +
            ) : PaywallEvent<OnPurchaseCompletedEvent>(surfaceId, viewTag) {
         | 
| 12 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_PURCHASE_COMPLETED
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                override fun getPayload() = mapOf(
         | 
| 15 | 
            +
                    PaywallEventKey.CUSTOMER_INFO to customerInfo,
         | 
| 16 | 
            +
                    PaywallEventKey.STORE_TRANSACTION to storeTransaction
         | 
| 17 | 
            +
                )
         | 
| 18 | 
            +
            }
         | 
    
        package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseErrorEvent.kt
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnPurchaseErrorEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
                private val error: Map<String, Any?>
         | 
| 10 | 
            +
            ) : PaywallEvent<OnPurchaseErrorEvent>(surfaceId, viewTag) {
         | 
| 11 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_PURCHASE_ERROR
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                override fun getPayload() = mapOf(PaywallEventKey.ERROR to error)
         | 
| 14 | 
            +
            }
         | 
    
        package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnPurchaseStartedEvent.kt
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnPurchaseStartedEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
                private val packageMap: Map<String, Any?>
         | 
| 10 | 
            +
            ) : PaywallEvent<OnPurchaseStartedEvent>(surfaceId, viewTag) {
         | 
| 11 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_PURCHASE_STARTED
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                override fun getPayload() = mapOf(
         | 
| 14 | 
            +
                    PaywallEventKey.PACKAGE to packageMap,
         | 
| 15 | 
            +
                )
         | 
| 16 | 
            +
            }
         | 
    
        package/android/src/main/java/com/revenuecat/purchases/react/ui/events/OnRestoreCompletedEvent.kt
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            package com.revenuecat.purchases.react.ui.events
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventKey
         | 
| 4 | 
            +
            import com.revenuecat.purchases.react.ui.PaywallEventName
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            internal class OnRestoreCompletedEvent(
         | 
| 7 | 
            +
                surfaceId: Int,
         | 
| 8 | 
            +
                viewTag: Int,
         | 
| 9 | 
            +
                private val customerInfo: Map<String, Any?>,
         | 
| 10 | 
            +
            ) : PaywallEvent<OnRestoreCompletedEvent>(surfaceId, viewTag) {
         | 
| 11 | 
            +
                override fun getPaywallEventName() = PaywallEventName.ON_RESTORE_COMPLETED
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                override fun getPayload() = mapOf(PaywallEventKey.CUSTOMER_INFO to customerInfo)
         | 
| 14 | 
            +
            }
         |