@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.
- package/LICENSE +22 -0
- package/README.md +302 -0
- package/android/build.gradle +155 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/com/vkauth/VkAuthModule.kt +72 -0
- package/android/src/main/java/com/vkauth/VkAuthPackage.kt +23 -0
- package/android/src/main/java/com/vkauth/vkid/AuthDelegate.kt +123 -0
- package/android/src/main/java/com/vkauth/vkid/InitDelegate.kt +13 -0
- package/android/src/main/java/com/vkauth/vkid/JSSilentTokenExchanger.kt +33 -0
- package/android/src/main/java/com/vkauth/vkid/SuperAppKitInitUtils.kt +75 -0
- package/android/src/main/java/com/vkauth/vkid/dto/AcessToken.kt +19 -0
- package/android/src/main/java/com/vkauth/vkid/dto/DtoExt.kt +24 -0
- package/android/src/main/java/com/vkauth/vkid/dto/SilentAuthInfo.kt +22 -0
- package/android/src/main/java/com/vkauth/vkid/dto/Token.kt +15 -0
- package/android/src/main/java/com/vkauth/vkid/dto/UserSession.kt +28 -0
- package/android/src/main/java/com/vkauth/vkid/jsinput/App.kt +17 -0
- package/android/src/main/java/com/vkauth/vkid/jsinput/Credentials.kt +17 -0
- package/android/src/main/java/com/vkauth/vkid/jsinput/Links.kt +19 -0
- package/android/src/main/java/com/vkauth/vkid/jsinput/Mode.kt +13 -0
- package/android/src/main/java/com/vkauth/vkid/jsinput/VKID.kt +21 -0
- package/android/src/main/java/com/vkauth/vkid/jstutils/JsCbSender.kt +16 -0
- package/android/src/main/java/com/vkauth/vkid/jstutils/JsOutputParam.kt +7 -0
- package/android/src/main/java/com/vkauth/vkid/onetapbutton/OneTapButtonManager.kt +169 -0
- package/android/src/main/res/drawable/ic_launcher.xml +2 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/ios/Event.swift +70 -0
- package/ios/RCTDomain.swift +26 -0
- package/ios/VkAuth-Bridging-Header.h +3 -0
- package/ios/VkAuth.m +60 -0
- package/ios/VkAuth.swift +180 -0
- package/ios/VkAuth.xcodeproj/project.pbxproj +315 -0
- package/package.json +128 -0
- package/react-native-vk-auth.podspec +35 -0
- 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,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,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
|
+
}
|