@pyrocancode/react-native-vk-auth 0.4.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.
Files changed (35) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +302 -0
  3. package/android/build.gradle +155 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +4 -0
  6. package/android/src/main/java/com/vkauth/VkAuthModule.kt +72 -0
  7. package/android/src/main/java/com/vkauth/VkAuthPackage.kt +23 -0
  8. package/android/src/main/java/com/vkauth/vkid/AuthDelegate.kt +123 -0
  9. package/android/src/main/java/com/vkauth/vkid/InitDelegate.kt +13 -0
  10. package/android/src/main/java/com/vkauth/vkid/JSSilentTokenExchanger.kt +33 -0
  11. package/android/src/main/java/com/vkauth/vkid/SuperAppKitInitUtils.kt +75 -0
  12. package/android/src/main/java/com/vkauth/vkid/dto/AcessToken.kt +19 -0
  13. package/android/src/main/java/com/vkauth/vkid/dto/DtoExt.kt +24 -0
  14. package/android/src/main/java/com/vkauth/vkid/dto/SilentAuthInfo.kt +22 -0
  15. package/android/src/main/java/com/vkauth/vkid/dto/Token.kt +15 -0
  16. package/android/src/main/java/com/vkauth/vkid/dto/UserSession.kt +28 -0
  17. package/android/src/main/java/com/vkauth/vkid/jsinput/App.kt +17 -0
  18. package/android/src/main/java/com/vkauth/vkid/jsinput/Credentials.kt +17 -0
  19. package/android/src/main/java/com/vkauth/vkid/jsinput/Links.kt +19 -0
  20. package/android/src/main/java/com/vkauth/vkid/jsinput/Mode.kt +13 -0
  21. package/android/src/main/java/com/vkauth/vkid/jsinput/VKID.kt +21 -0
  22. package/android/src/main/java/com/vkauth/vkid/jstutils/JsCbSender.kt +16 -0
  23. package/android/src/main/java/com/vkauth/vkid/jstutils/JsOutputParam.kt +7 -0
  24. package/android/src/main/java/com/vkauth/vkid/onetapbutton/OneTapButtonManager.kt +169 -0
  25. package/android/src/main/res/drawable/ic_launcher.xml +2 -0
  26. package/android/src/main/res/values/strings.xml +5 -0
  27. package/ios/Event.swift +70 -0
  28. package/ios/RCTDomain.swift +26 -0
  29. package/ios/VkAuth-Bridging-Header.h +3 -0
  30. package/ios/VkAuth.m +60 -0
  31. package/ios/VkAuth.swift +180 -0
  32. package/ios/VkAuth.xcodeproj/project.pbxproj +315 -0
  33. package/package.json +128 -0
  34. package/react-native-vk-auth.podspec +35 -0
  35. package/src/index.tsx +331 -0
@@ -0,0 +1,123 @@
1
+ package com.vkauth.vkid
2
+
3
+ import android.util.Log
4
+ import androidx.fragment.app.FragmentActivity
5
+ import com.facebook.react.bridge.Arguments
6
+ import com.facebook.react.bridge.Promise
7
+ import com.facebook.react.bridge.ReactApplicationContext
8
+ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
9
+ import com.vk.api.sdk.VKApiCallback
10
+ import com.vk.auth.api.models.AuthResult
11
+ import com.vk.auth.main.VkClientAuthCallback
12
+ import com.vk.auth.main.VkClientAuthLib
13
+ import com.vk.auth.main.VkSilentTokenExchanger
14
+ import com.vk.auth.ui.fastlogin.VkFastLoginBottomSheetFragment
15
+ import com.vk.dto.common.id.UserId
16
+ import com.vk.superapp.api.dto.account.ProfileShortInfo
17
+ import com.vk.superapp.bridges.LogoutReason
18
+ import com.vkauth.vkid.dto.UserSession
19
+ import com.vkauth.vkid.dto.toMap
20
+ import com.vkauth.vkid.jstutils.JsCbSender
21
+
22
+ class AuthDelegate(
23
+ private val context: ReactApplicationContext
24
+ ) {
25
+ private val jsCallbackSender = JsCbSender()
26
+
27
+ init {
28
+ VkClientAuthLib.addAuthCallback(object : VkClientAuthCallback {
29
+ override fun onLogout(logoutReason: LogoutReason) {
30
+ super.onLogout(logoutReason)
31
+ jsCallbackSender.sendCallback(context, ON_LOGOUT_EVENT, null)
32
+ }
33
+ })
34
+ }
35
+
36
+ fun startAuth() {
37
+ val activity = context.currentActivity as? FragmentActivity ?: return
38
+
39
+ if (isShown()) {
40
+ return
41
+ }
42
+
43
+ VkFastLoginBottomSheetFragment.Builder()
44
+ .setDismissOnComplete(false)
45
+ .show(activity.supportFragmentManager, FAST_LOGIN_TAG)
46
+ }
47
+
48
+ fun closeAuth() {
49
+ val activity = context.currentActivity as? FragmentActivity ?: return
50
+ (activity.supportFragmentManager.findFragmentByTag(FAST_LOGIN_TAG) as? BottomSheetDialogFragment)
51
+ ?.dismissAllowingStateLoss()
52
+ ?: run {
53
+ (activity.supportFragmentManager
54
+ .fragments
55
+ .find { it is VkFastLoginBottomSheetFragment } as? BottomSheetDialogFragment)
56
+ ?.dismissAllowingStateLoss()
57
+ }
58
+ }
59
+
60
+ fun accessTokenChangedSuccess(token: String, userId: Int) {
61
+ val userSessionJson = UserSession.Authorized.toMap()
62
+ jsCallbackSender.sendCallback(context, ON_AUTH_EVENT, userSessionJson)
63
+
64
+ closeAuth()
65
+ }
66
+
67
+ fun accessTokenChangedFailed() {
68
+ closeAuth()
69
+ }
70
+
71
+ fun logout() {
72
+ VkClientAuthLib.logout()
73
+ }
74
+
75
+ fun getUserSessions(promise: Promise) {
76
+ val creds = VkClientAuthLib.getAccessToken() ?: run {
77
+ promise.resolve(Arguments.createArray())
78
+ return
79
+ }
80
+
81
+ val array = Arguments.createArray().apply {
82
+ pushMap(UserSession.Authorized.toMap())
83
+ }
84
+ promise.resolve(array)
85
+ }
86
+
87
+ private fun isShown(): Boolean {
88
+ val activity = context.currentActivity as? FragmentActivity ?: return false
89
+
90
+ val byTag = (activity.supportFragmentManager.findFragmentByTag(FAST_LOGIN_TAG) as? BottomSheetDialogFragment) != null
91
+
92
+ if (byTag) {
93
+ return true
94
+ }
95
+
96
+ return activity.supportFragmentManager
97
+ .fragments
98
+ .any { it is VkFastLoginBottomSheetFragment }
99
+ }
100
+
101
+ fun getUserProfile(promise: Promise) {
102
+ val profile = VkClientAuthLib.getProfileInfo()?.toMap() ?: run {
103
+ VkClientAuthLib.updateUserInfo(
104
+ object : VKApiCallback<ProfileShortInfo> {
105
+ override fun fail(error: Exception) {
106
+ promise.reject(error)
107
+ }
108
+ override fun success(result: ProfileShortInfo) {
109
+ promise.resolve(result.toMap())
110
+ }
111
+ }
112
+ )
113
+ return
114
+ }
115
+ promise.resolve(profile)
116
+ }
117
+
118
+ private companion object {
119
+ private const val FAST_LOGIN_TAG = "vk_fast_login"
120
+ private const val ON_AUTH_EVENT = "onAuth"
121
+ private const val ON_LOGOUT_EVENT = "onLogout"
122
+ }
123
+ }
@@ -0,0 +1,13 @@
1
+ package com.vkauth.vkid
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.vkauth.vkid.jsinput.App
5
+ import com.vkauth.vkid.jsinput.VKID
6
+
7
+ class InitDelegate(
8
+ private val context: ReactApplicationContext
9
+ ) {
10
+ fun initialize(app: App, vkid: VKID) {
11
+ SuperAppKitInitUtils.initSuperappKit(context, app, vkid)
12
+ }
13
+ }
@@ -0,0 +1,33 @@
1
+ package com.vkauth.vkid
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.vk.auth.main.SilentAuthSource
5
+ import com.vk.auth.main.VkFastLoginModifiedUser
6
+ import com.vk.auth.main.VkSilentTokenExchanger
7
+ import com.vkauth.vkid.dto.SilentAuthInfo
8
+ import com.vkauth.vkid.dto.Token
9
+ import com.vkauth.vkid.jstutils.JsCbSender
10
+
11
+ internal class JSSilentTokenExchanger(
12
+ private val context: ReactApplicationContext
13
+ ) : VkSilentTokenExchanger {
14
+ private val jsCallbackSender = JsCbSender()
15
+
16
+ override fun exchangeSilentToken(
17
+ user: com.vk.silentauth.SilentAuthInfo,
18
+ modifiedUser: VkFastLoginModifiedUser?,
19
+ source: SilentAuthSource
20
+ ): VkSilentTokenExchanger.Result {
21
+ jsCallbackSender.sendCallback(context, SILENT_DATA_EVENT, SilentAuthInfo(
22
+ silentToken = Token(user.token),
23
+ uuid = user.uuid,
24
+ firstName = user.firstName,
25
+ lastName = user.lastName,
26
+ ).toMap())
27
+ return VkSilentTokenExchanger.Result.Success(accessToken = "will be exchanged in js part", uid = 1)
28
+ }
29
+
30
+ private companion object {
31
+ private const val SILENT_DATA_EVENT = "onSilentDataReceive"
32
+ }
33
+ }
@@ -0,0 +1,75 @@
1
+ package com.vkauth.vkid
2
+
3
+ import android.app.Application
4
+ import android.content.Context
5
+ import android.content.res.Resources
6
+ import android.graphics.BitmapFactory
7
+ import android.graphics.drawable.BitmapDrawable
8
+ import android.graphics.drawable.Drawable
9
+ import android.net.Uri
10
+ import com.facebook.react.bridge.ReactApplicationContext
11
+ import com.vk.auth.main.VkClientAuthLibConfig
12
+ import com.vk.auth.main.VkClientLibverifyInfo
13
+ import com.vk.auth.main.VkClientUiInfo
14
+ import com.vk.superapp.SuperappKit
15
+ import com.vk.superapp.SuperappKitConfig
16
+ import com.vk.superapp.core.SuperappConfig
17
+ import com.vkauth.vkid.jsinput.App
18
+ import com.vkauth.vkid.jsinput.VKID
19
+ import java.net.URL
20
+
21
+ internal object SuperAppKitInitUtils {
22
+ private const val DRAWABLE_DEF_TYPE = "drawable"
23
+ private val HTTP_SCHEMES = listOf("http", "https")
24
+
25
+ fun initSuperappKit(reactAppContext: ReactApplicationContext, app: App, vkid: VKID) {
26
+ if (SuperappKit.isInitialized()) {
27
+ return
28
+ }
29
+
30
+ val appInfo = SuperappConfig.AppInfo(
31
+ appName = vkid.appName,
32
+ appVersion = vkid.appVersion,
33
+ appId = app.credentials.clientId,
34
+ )
35
+
36
+ val logo = resolveLogoUri(reactAppContext, Uri.parse(vkid.icon.getString("uri")))
37
+
38
+ val builder = SuperappKitConfig.Builder(reactAppContext.applicationContext as Application)
39
+ .setAuthModelData(
40
+ VkClientAuthLibConfig.AuthModelData(
41
+ clientSecret = app.credentials.clientSecret,
42
+ libverifyInfo = VkClientLibverifyInfo.disabled(),
43
+ ignoreSuccessAuth = true
44
+ )
45
+ )
46
+ .setAuthUiManagerData(VkClientUiInfo(icon48 = logo, icon56 = logo, appName = vkid.appName))
47
+ .setLegalInfoLinks(
48
+ serviceUserAgreement = vkid.links.serviceUserAgreement,
49
+ servicePrivacyPolicy = vkid.links.servicePrivacyPolicy,
50
+ serviceSupport = vkid.links.serviceSupport
51
+ )
52
+ .setApplicationInfo(appInfo)
53
+ .setSilentTokenExchanger(JSSilentTokenExchanger(reactAppContext))
54
+ .sslPinningEnabled(false)
55
+ .build()
56
+
57
+ SuperappKit.init(builder)
58
+ }
59
+
60
+ private fun resolveLogoUri(context: Context, uri: Uri): Drawable {
61
+ return if (uri.scheme in HTTP_SCHEMES) {
62
+ URL(uri.toString()).openConnection()
63
+ .apply { connect() }
64
+ .getInputStream()
65
+ .use {
66
+ BitmapDrawable(Resources.getSystem(), BitmapFactory.decodeStream(it))
67
+ }
68
+ } else {
69
+ val fileName = uri.toString()
70
+ val resourceId = context.resources.getIdentifier(fileName, DRAWABLE_DEF_TYPE, context.packageName)
71
+ val bitmap = BitmapFactory.decodeResource(context.resources, resourceId)
72
+ BitmapDrawable(Resources.getSystem(), bitmap)
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,19 @@
1
+ package com.vkauth.vkid.dto
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.vk.dto.common.id.UserId
6
+ import com.vkauth.vkid.jstutils.JsOutputParam
7
+
8
+ internal data class AccessToken(
9
+ val token: Token,
10
+ val userId: UserId
11
+ ) : JsOutputParam {
12
+
13
+ override fun toMap(): WritableMap {
14
+ return Arguments.createMap().apply {
15
+ putMap("token", token.toMap())
16
+ putMap("userId", userId.toMap())
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,24 @@
1
+ package com.vkauth.vkid.dto
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.vk.auth.main.VkClientAuthLib
6
+ import com.vk.dto.common.id.UserId
7
+ import com.vk.superapp.api.dto.account.ProfileShortInfo
8
+
9
+ fun UserId.toMap(): WritableMap {
10
+ return Arguments.createMap().apply {
11
+ putDouble("value", value.toDouble())
12
+ }
13
+ }
14
+
15
+ fun ProfileShortInfo.toMap(): WritableMap {
16
+ return Arguments.createMap().apply {
17
+ putMap("userID", VkClientAuthLib.getUserId().toMap())
18
+ putString("firstName", firstName)
19
+ putString("lastName", lastName)
20
+ putString("phone", phone)
21
+ putString("photo200", photo200)
22
+ putString("userHash", userHash)
23
+ }
24
+ }
@@ -0,0 +1,22 @@
1
+ package com.vkauth.vkid.dto
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.vkauth.vkid.jstutils.JsOutputParam
6
+
7
+
8
+ internal data class SilentAuthInfo(
9
+ val silentToken: Token,
10
+ val uuid: String,
11
+ val firstName: String,
12
+ val lastName: String,
13
+ ) : JsOutputParam {
14
+ override fun toMap(): WritableMap {
15
+ return Arguments.createMap().apply {
16
+ putMap("token", silentToken.toMap())
17
+ putString("uuid", uuid)
18
+ putString("firstName", firstName)
19
+ putString("lastName", lastName)
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,15 @@
1
+ package com.vkauth.vkid.dto
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.vkauth.vkid.jstutils.JsOutputParam
6
+
7
+ internal data class Token(
8
+ val value: String
9
+ ) : JsOutputParam {
10
+ override fun toMap(): WritableMap {
11
+ return Arguments.createMap().apply {
12
+ putString("value", value)
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,28 @@
1
+ package com.vkauth.vkid.dto
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.vkauth.vkid.jstutils.JsOutputParam
6
+
7
+ internal sealed class UserSession(val type: String) : JsOutputParam {
8
+ object Authorized: UserSession(AUTHORIZED) {
9
+ override fun toMap(): WritableMap {
10
+ return Arguments.createMap().apply {
11
+ putString("type", type)
12
+ }
13
+ }
14
+ }
15
+
16
+ object Authenticated : UserSession(AUTHENTICATED) {
17
+ override fun toMap(): WritableMap {
18
+ return Arguments.createMap().apply {
19
+ putString("type", type)
20
+ }
21
+ }
22
+ }
23
+
24
+ private companion object {
25
+ private const val AUTHORIZED = "authorized"
26
+ private const val AUTHENTICATED = "authenticated"
27
+ }
28
+ }
@@ -0,0 +1,17 @@
1
+ package com.vkauth.vkid.jsinput
2
+
3
+ import com.facebook.react.bridge.ReadableMap
4
+
5
+ data class App(
6
+ val credentials: Credentials,
7
+ val mode: Mode
8
+ ) {
9
+ companion object {
10
+ fun fromMap(map: ReadableMap): App {
11
+ return App(
12
+ credentials = Credentials.fromMap(map.getMap("credentials")!!),
13
+ mode = Mode.fromString(map.getString("mode")!!)
14
+ )
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ package com.vkauth.vkid.jsinput
2
+
3
+ import com.facebook.react.bridge.ReadableMap
4
+
5
+ data class Credentials(
6
+ val clientId: String,
7
+ val clientSecret: String
8
+ ) {
9
+ companion object {
10
+ fun fromMap(map: ReadableMap): Credentials {
11
+ return Credentials(
12
+ clientId = map.getString("clientId")!!,
13
+ clientSecret = map.getString("clientSecret")!!
14
+ )
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ package com.vkauth.vkid.jsinput
2
+
3
+ import com.facebook.react.bridge.ReadableMap
4
+
5
+ data class Links(
6
+ val serviceUserAgreement: String,
7
+ val servicePrivacyPolicy: String,
8
+ val serviceSupport: String?
9
+ ) {
10
+ companion object {
11
+ fun fromMap(map: ReadableMap): Links {
12
+ return Links(
13
+ serviceUserAgreement = map.getString("serviceUserAgreement")!!,
14
+ servicePrivacyPolicy = map.getString("servicePrivacyPolicy")!!,
15
+ serviceSupport = map.getString("serviceSupport"),
16
+ )
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,13 @@
1
+ package com.vkauth.vkid.jsinput
2
+
3
+ enum class Mode(val value: String) {
4
+ DEBUG("DEBUG"),
5
+ TEST("TEST"),
6
+ RELEASE("RELEASE");
7
+
8
+ companion object {
9
+ fun fromString(value: String): Mode {
10
+ return values().first { it.value == value }
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,21 @@
1
+ package com.vkauth.vkid.jsinput
2
+
3
+ import com.facebook.react.bridge.ReadableMap
4
+
5
+ data class VKID(
6
+ val appName: String,
7
+ val appVersion: String,
8
+ val icon: ReadableMap,
9
+ val links: Links
10
+ ) {
11
+ companion object {
12
+ fun fromMap(map: ReadableMap): VKID {
13
+ return VKID(
14
+ appName = map.getString("appName")!!,
15
+ appVersion = map.getString("appVersion")!!,
16
+ icon = map.getMap("appIcon")!!,
17
+ links = Links.fromMap(map.getMap("appLinks")!!)
18
+ )
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,16 @@
1
+ package com.vkauth.vkid.jstutils
2
+
3
+ import com.facebook.react.bridge.ReactContext
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.modules.core.DeviceEventManagerModule
6
+
7
+ class JsCbSender {
8
+ fun sendCallback(
9
+ context: ReactContext,
10
+ callbackName: String,
11
+ callbackParams: WritableMap?
12
+ ) {
13
+ context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
14
+ .emit(callbackName, callbackParams)
15
+ }
16
+ }
@@ -0,0 +1,7 @@
1
+ package com.vkauth.vkid.jstutils
2
+
3
+ import com.facebook.react.bridge.WritableMap
4
+
5
+ internal interface JsOutputParam {
6
+ fun toMap(): WritableMap
7
+ }
@@ -0,0 +1,169 @@
1
+ package com.vkauth.vkid.onetapbutton
2
+
3
+ import android.content.Context
4
+ import android.graphics.Color
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.bridge.ReadableMap
7
+ import com.facebook.react.uimanager.LayoutShadowNode
8
+ import com.facebook.react.uimanager.SimpleViewManager
9
+ import com.facebook.react.uimanager.ThemedReactContext
10
+ import com.facebook.react.uimanager.annotations.ReactProp
11
+ import com.facebook.react.views.text.ReactTextShadowNode
12
+ import com.vk.auth.ui.fastloginbutton.VkFastLoginButton
13
+
14
+ class OneTabButtonManager : SimpleViewManager<VkFastLoginButton>() {
15
+ override fun getName(): String = COMPONENT_NAME
16
+
17
+ override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode {
18
+ return ReactTextShadowNode()
19
+ }
20
+
21
+ override fun createViewInstance(context: ThemedReactContext): VkFastLoginButton {
22
+ return VkFastLoginButton(context)
23
+ }
24
+
25
+ @ReactProp(name = "backgroundStyle")
26
+ fun setStyle(view: VkFastLoginButton, style: ReadableMap) {
27
+ android.util.Log.d(TAG, "setStyle($style)")
28
+
29
+ val vkStyle = when (style.getString("style")) {
30
+ "BLUE" -> VkFastLoginButton.ButtonStyle.BLUE
31
+ "WHITE" -> VkFastLoginButton.ButtonStyle.WHITE
32
+ "CUSTOM" -> VkFastLoginButton.ButtonStyle.CUSTOM
33
+ else -> null
34
+ } ?: return
35
+
36
+ if (vkStyle == VkFastLoginButton.ButtonStyle.CUSTOM) {
37
+ val vkIconColor = when (style.getString("customVkIconColor")) {
38
+ "BLUE" -> VkFastLoginButton.VkIconColor.BLUE
39
+ "WHITE" -> VkFastLoginButton.VkIconColor.WHITE
40
+ else -> null
41
+ } ?: return
42
+
43
+ view.setCustomStyle(
44
+ bgColor = Color.parseColor(style.getString("customBackgroundColor")),
45
+ textColor = Color.parseColor(style.getString("customTextColor")),
46
+ vkIconColor = vkIconColor
47
+ )
48
+ } else {
49
+ view.setButtonStyle(vkStyle)
50
+ }
51
+
52
+ }
53
+
54
+ @ReactProp(name = "iconGravity")
55
+ fun setGravity(view: VkFastLoginButton, gravity: String) {
56
+ android.util.Log.d(TAG, "setGravity($gravity)")
57
+
58
+ val vkGravity = when (gravity) {
59
+ "START" -> VkFastLoginButton.VkIconGravity.START
60
+ "TEXT" -> VkFastLoginButton.VkIconGravity.TEXT
61
+ else -> null
62
+ } ?: return
63
+
64
+ view.setVkIconGravity(vkGravity)
65
+ }
66
+
67
+ @ReactProp(name = "firstLineFieldType")
68
+ fun setFirstLineField(view: VkFastLoginButton, type: String) {
69
+ android.util.Log.d(TAG, "setFirstLineField($type)")
70
+
71
+ val vkType = when (type) {
72
+ "ACTION" -> VkFastLoginButton.LineFieldType.ACTION
73
+ "PHONE" -> VkFastLoginButton.LineFieldType.PHONE
74
+ "NONE" -> VkFastLoginButton.LineFieldType.NONE
75
+ else -> null
76
+ } ?: return
77
+
78
+ view.setFirstLineField(vkType)
79
+ }
80
+
81
+ @ReactProp(name = "secondLineFieldType")
82
+ fun setSecondLineField(view: VkFastLoginButton, type: String) {
83
+ android.util.Log.d(TAG, "setSecondLineField($type)")
84
+ val vkType = when (type) {
85
+ "ACTION" -> VkFastLoginButton.LineFieldType.ACTION
86
+ "PHONE" -> VkFastLoginButton.LineFieldType.PHONE
87
+ "NONE" -> VkFastLoginButton.LineFieldType.NONE
88
+ else -> null
89
+ } ?: return
90
+
91
+ view.setSecondLineField(vkType)
92
+ }
93
+
94
+ @ReactProp(name = "oneLineTextSize")
95
+ fun setOneLineTextSize(view: VkFastLoginButton, size: Float) {
96
+ android.util.Log.d(TAG, "setOneLineTextSize($size)")
97
+ view.setOneLineTextSize(size)
98
+ }
99
+
100
+ @ReactProp(name = "firstLineTextSize")
101
+ fun setFirstLineTextSize(view: VkFastLoginButton, size: Float) {
102
+ android.util.Log.d(TAG, "setFirstLineTextSize($size)")
103
+ view.setFirstLineTextSize(size)
104
+ }
105
+
106
+ @ReactProp(name = "secondLineTextSize")
107
+ fun setSecondLineTextSize(view: VkFastLoginButton, size: Float) {
108
+ android.util.Log.d(TAG, "setSecondLineTextSize($size)")
109
+ view.setSecondLineTextSize(size)
110
+ }
111
+
112
+ @ReactProp(name = "avatarSize")
113
+ fun setAvatarSize(view: VkFastLoginButton, size: Float) {
114
+ android.util.Log.d(TAG, "setAvatarSize($size)")
115
+
116
+ view.setAvatarSize(size.toInt())
117
+ }
118
+
119
+ @ReactProp(name = "iconSize")
120
+ fun setVkIconSize(view: VkFastLoginButton, size: Float) {
121
+ android.util.Log.d(TAG, "setVkIconSize($size)")
122
+ view.setVkIconSize(size.toInt())
123
+ }
124
+
125
+ @ReactProp(name = "progressSize")
126
+ fun setProgressSize(view: VkFastLoginButton, size: Float) {
127
+ android.util.Log.d(TAG, "setProgressSize($size)")
128
+ view.setProgressSize(size.toInt())
129
+ }
130
+
131
+ @ReactProp(name = "texts")
132
+ fun setTexts(view: VkFastLoginButton, texts: ReadableMap) {
133
+ android.util.Log.d(TAG, "setTexts($texts)")
134
+
135
+ view.setTextGetter(
136
+ object : VkFastLoginButton.TextGetter() {
137
+ override fun getNoUserText(
138
+ context: Context,
139
+ actionTextSize: VkFastLoginButton.ActionTextSize
140
+ ): String {
141
+ return texts.getString("noUserText") ?: super.getNoUserText(context, VkFastLoginButton.ActionTextSize.BIG)
142
+ }
143
+
144
+ override fun getActionText(
145
+ context: Context,
146
+ firstName: String,
147
+ lastName: String,
148
+ actionTextSize: VkFastLoginButton.ActionTextSize
149
+ ): String {
150
+ val text = texts.getString("actionText")
151
+ ?.replace("{firstName}", firstName)
152
+ ?.replace("{lastName}", lastName)
153
+ return text ?: super.getActionText(context, firstName, lastName, VkFastLoginButton.ActionTextSize.BIG)
154
+ }
155
+
156
+ override fun getPhoneText(context: Context, phone: String): String {
157
+ val text = texts.getString("phoneText")
158
+ ?.replace("{phone}", phone)
159
+ return text ?: super.getPhoneText(context, phone)
160
+ }
161
+ }
162
+ )
163
+ }
164
+
165
+ private companion object {
166
+ private const val COMPONENT_NAME = "RTCVkOneTapButton"
167
+ private const val TAG = "OneTabButtonManager"
168
+ }
169
+ }
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <selector xmlns:android="http://schemas.android.com/apk/res/android" />
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <string name="vk_client_secret"></string>
4
+ <string name="vk_account_manager_id" translatable="false">com.vkauthexample.account</string>
5
+ </resources>