Skip to content

Commit

Permalink
event handling #1
Browse files Browse the repository at this point in the history
  • Loading branch information
jonasbark committed Mar 25, 2021
1 parent ffa7c25 commit 156a38a
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.facebook.react.uimanager.events

import com.facebook.react.bridge.WritableMap

open class Event<T>(viewTag: Int) {

open fun getEventName(): String {
TODO("Not yet implemented")
}

open fun serializeEventData(): WritableMap {
TODO("Not yet implemented")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.facebook.react.uimanager.events

interface EventDispatcher {
fun dispatchEvent(event: Event<*>)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ class StripeAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "flutter.stripe/payments")
channel.setMethodCallHandler(this)
flutterPluginBinding.platformViewRegistry.registerViewFactory("flutter.stripe/card_field", StripeSdkCardPlatformViewFactory())
flutterPluginBinding
.platformViewRegistry
.registerViewFactory("flutter.stripe/card_field", StripeSdkCardPlatformViewFactory(channel))
}

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,38 @@ package com.flutter.stripe

import android.content.Context
import android.view.View
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.EventDispatcher
import com.reactnativestripesdk.StripeSdkCardView
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.platform.PlatformView

class StripeSdkCardPlatformView(context: Context, id: Int, creationParams: Map<String?, Any?>?): PlatformView {
class StripeSdkCardPlatformView(context: Context, private val channel: MethodChannel, id: Int, creationParams: Map<String?, Any?>?): PlatformView {

private val cardView: StripeSdkCardView = StripeSdkCardView(context)
private val cardView: StripeSdkCardView by lazy {
val eventHandler = object: EventDispatcher {
override fun dispatchEvent(event: Event<*>) {
channel.invokeMethod(event.getEventName(), event.serializeEventData())
}
}
StripeSdkCardView(context, eventHandler).apply {
if (creationParams?.containsKey("cardStyle") == true) {
setCardStyle(creationParams["cardStyle"] as ReadableMap)
}
if (creationParams?.containsKey("placeholder") == true) {
setPlaceHolders(creationParams["placeholder"] as ReadableMap)
}
if (creationParams?.containsKey("postalCodeEnabled") == true) {
setPostalCodeEnabled(creationParams["postalCodeEnabled"] as Boolean)
}
}
}

override fun getView(): View = cardView

override fun dispose() {

}

}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.flutter.stripe

import android.content.Context
import android.view.View
import com.reactnativestripesdk.StripeSdkCardView
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory

class StripeSdkCardPlatformViewFactory: PlatformViewFactory(StandardMessageCodec.INSTANCE) {
class StripeSdkCardPlatformViewFactory(private val channel: MethodChannel) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {

override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
val creationParams = args as Map<String?, Any?>?
return StripeSdkCardPlatformView(context, viewId, creationParams)
val creationParams = args as? Map<String?, Any?>?
return StripeSdkCardPlatformView(context, channel, viewId, creationParams)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ package com.reactnativestripesdk

import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.Event

internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap<String, Any>, private val postalCodeEnabled: Boolean, private val complete: Boolean) {
internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap<String, Any>, private val postalCodeEnabled: Boolean, private val complete: Boolean): Event<CardChangedEvent>(viewTag) {

override fun getEventName(): String {
return EVENT_NAME
}

private fun getValOr(map: MutableMap<String, Any>, key: String, default: String? = null): String? {
return if ((map[key] as CharSequence).isNotEmpty()) map[key] as String? else default
}

private fun serializeEventData(): WritableMap {
override fun serializeEventData(): WritableMap {
val eventData = Arguments.createMap()
eventData.putString("number", cardDetails["number"].toString())
val expMonth = getValOr(cardDetails, "expiryMonth", null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@
package com.reactnativestripesdk
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.Event

internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?) {
internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?): Event<CardFocusEvent>(viewTag) {

private fun serializeEventData(): WritableMap {
override fun getEventName(): String {
return EVENT_NAME
}

override fun serializeEventData(): WritableMap {
val eventData = Arguments.createMap()
eventData.putString("focusedField", focusField)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,22 @@ import android.content.res.ColorStateList
import android.graphics.Color
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.facebook.react.bridge.ReadableMap
import com.stripe.android.databinding.CardInputWidgetBinding
import com.facebook.react.uimanager.events.EventDispatcher
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
import com.stripe.android.databinding.CardInputWidgetBinding
import com.stripe.android.view.CardInputListener
import com.stripe.android.view.CardInputWidget

class StripeSdkCardView(context: Context) : FrameLayout(context) {
class StripeSdkCardView(context: Context, private val mEventDispatcher: EventDispatcher) : FrameLayout(context) {
private var mCardWidget: CardInputWidget
private val cardDetails: MutableMap<String, Any> = mutableMapOf("number" to "", "cvc" to "", "expiryMonth" to "", "expiryYear" to "", "postalCode" to "")

init {
mCardWidget = CardInputWidget(context);
mCardWidget = CardInputWidget(context)

addView(mCardWidget)
setListeners()
Expand Down Expand Up @@ -129,7 +128,7 @@ class StripeSdkCardView(context: Context) : FrameLayout(context) {

fun onCardChanged() {
val complete = mCardWidget.cardParams != null
//mEventDispatcher?.dispatchEvent(CardChangedEvent(id, cardDetails, mCardWidget.postalCodeEnabled, complete))
mEventDispatcher?.dispatchEvent(CardChangedEvent(id, cardDetails, mCardWidget.postalCodeEnabled, complete))
}

private fun setListeners() {
Expand All @@ -138,7 +137,7 @@ class StripeSdkCardView(context: Context) : FrameLayout(context) {
override fun onExpirationComplete() {}
override fun onCvcComplete() {}
override fun onFocusChange(focusField: CardInputListener.FocusField) {
//mEventDispatcher?.dispatchEvent( CardFocusEvent(id, focusField.name))
mEventDispatcher?.dispatchEvent( CardFocusEvent(id, focusField.name))
}
})

Expand Down

0 comments on commit 156a38a

Please sign in to comment.