Skip to content

Commit 36f693b

Browse files
authored
Merge pull request #159 from xmartlabs/new-arch
[Feat] Support for the new architecture
2 parents 7d81e62 + c7451aa commit 36f693b

33 files changed

+3245
-8695
lines changed

β€ŽREADME.mdβ€Ž

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# ![React Native Line](/assets/github-banner.png)
1+
# ![React Native Line](/assets/banner.png)
22

33
[![npm version](https://img.shields.io/npm/v/@xmartlabs/react-native-line.svg?style=flat-square)](https://www.npmjs.com/package/@xmartlabs/react-native-line)
44
[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
@@ -14,6 +14,11 @@ Line SDK wrapper for React Native πŸš€
1414
- iOS `deploymentTarget` needs to be at least version `15.1`.
1515
- [LINE developer account](https://developers.line.biz/console/) with a channel created.
1616

17+
> [!IMPORTANT]
18+
> @xmartlabs/react-native-line v5 is now a TurboModule and **requires the new architecture to be enabled**.
19+
> - If you want to use @xmartlabs/react-native-line v5, you need to enable the new architecture in your app (see how to [enable the new architecture for apps](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md))
20+
> - If you cannot enable the new architecture yet, downgrade to @xmartlabs/react-native-line v4 for now.
21+
1722
## Installation
1823

1924
### With Expo
@@ -62,28 +67,66 @@ Line SDK wrapper for React Native πŸš€
6267

6368
#### With Swift
6469

65-
```swift
66-
import RNLine
70+
<details>
71+
<summary>@xmartlabs/react-native-line v4</summary>
6772

68-
...
73+
```swift
74+
import RNLine
6975
70-
override func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
71-
return LineLogin.application(application, open: url, options: options)
72-
}
73-
```
76+
...
77+
78+
override func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
79+
return LineLogin.application(application, open: url, options: options)
80+
}
81+
```
82+
</details>
83+
84+
<details>
85+
<summary>@xmartlabs/react-native-line v5</summary>
86+
87+
```swift
88+
import react_native_line
89+
90+
...
91+
92+
override func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
93+
return LineLogin.application(application, open: url, options: options)
94+
}
95+
```
96+
</details>
7497

7598
#### With Objective-C
7699

77-
```objectivec
78-
#import "RNLine-Swift.h"
100+
<details>
101+
<summary>@xmartlabs/react-native-line v4</summary>
79102

80-
...
103+
```objectivec
104+
#import "RNLine-Swift.h"
81105
82-
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
83-
{
84-
return [LineLogin application:application open:url options:options];
85-
}
86-
```
106+
...
107+
108+
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
109+
{
110+
return [LineLogin application:application open:url options:options];
111+
}
112+
```
113+
</details>
114+
115+
<details>
116+
<summary>@xmartlabs/react-native-line v4</summary>
117+
118+
```objectivec
119+
#import "react_native_line-Swift.h"
120+
121+
...
122+
123+
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
124+
{
125+
return [LineLogin application:application open:url options:options];
126+
}
127+
```
128+
</details>
129+
<br>
87130

88131
4. Insert the following snippet in your `Info.plist` to match the [LINE documentation](https://developers.line.biz/en/docs/line-login-sdks/ios-sdk/swift/setting-up-project/#config-infoplist-file):
89132

@@ -124,7 +167,7 @@ Line SDK wrapper for React Native πŸš€
124167
3. Login with the `login` method:
125168

126169
```typescript
127-
LineLogin.login()
170+
LineLogin.login({})
128171
```
129172

130173
## API

β€ŽRNLine.podspecβ€Ž

Lines changed: 0 additions & 27 deletions
This file was deleted.

β€Žandroid/build.gradleβ€Ž

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@ buildscript {
1313
}
1414
}
1515

16+
def isNewArchitectureEnabled() {
17+
return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
18+
}
19+
1620
def safeExtGet(prop, fallback) {
1721
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
1822
}
1923

2024
apply plugin: "com.android.library"
25+
apply plugin: "com.facebook.react"
2126
apply plugin: "kotlin-android"
2227

2328
android {
@@ -29,10 +34,26 @@ android {
2934
versionCode 1
3035
versionName "4.1.0"
3136
}
37+
38+
sourceSets {
39+
main {
40+
java.srcDirs += ["${project.buildDir}/generated/source/codegen/java"]
41+
}
42+
}
3243
}
3344

3445
dependencies {
3546
implementation "com.facebook.react:react-native:+"
3647
implementation "com.linecorp.linesdk:linesdk:5.11.0"
3748
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
3849
}
50+
51+
tasks.register("checkNativeLineLoginSpec") {
52+
doLast {
53+
if (!isNewArchitectureEnabled()) {
54+
throw new GradleException("@xmartlabs/react-native-line v5 requires your project to have New Architecture enabled.")
55+
}
56+
}
57+
}
58+
59+
preBuild.dependsOn checkNativeLineLoginSpec
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.xmartlabs.rnline"></manifest>
2+
package="com.xmartlabs.line"></manifest>

β€Žandroid/src/main/java/com/xmartlabs/rnline/LineLogin.ktβ€Ž renamed to β€Žandroid/src/main/java/com/xmartlabs/line/LineLoginModule.ktβ€Ž

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,50 @@
1-
package com.xmartlabs.rnline
1+
package com.xmartlabs.line
22

33
import android.app.Activity
44
import android.content.Context
55
import android.content.Intent
6+
67
import com.facebook.react.bridge.*
8+
import com.facebook.react.module.annotations.ReactModule
79

10+
import com.linecorp.linesdk.*
811
import com.linecorp.linesdk.api.LineApiClient
912
import com.linecorp.linesdk.api.LineApiClientBuilder
1013
import com.linecorp.linesdk.auth.LineAuthenticationConfig
1114
import com.linecorp.linesdk.auth.LineAuthenticationParams
1215
import com.linecorp.linesdk.auth.LineLoginApi
1316
import com.linecorp.linesdk.auth.LineLoginResult
17+
import com.linecorp.linesdk.LineProfile
1418

1519
import kotlinx.coroutines.CoroutineScope
1620
import kotlinx.coroutines.Dispatchers
1721
import kotlinx.coroutines.launch
1822
import kotlinx.coroutines.withContext
19-
import com.facebook.react.bridge.WritableMap
20-
import com.linecorp.linesdk.*
21-
import com.linecorp.linesdk.LineProfile
23+
24+
private var LOGIN_REQUEST_CODE: Int = 0
2225

2326
enum class LoginArguments(val key: String) {
2427
BOT_PROMPT("botPrompt"),
2528
ONLY_WEB_LOGIN("onlyWebLogin"),
2629
SCOPES("scopes")
2730
}
2831

29-
class LineLogin(private val reactContext: ReactApplicationContext) :
30-
ReactContextBaseJavaModule(reactContext) {
32+
class LineLoginModule(private val reactContext: ReactApplicationContext) :
33+
NativeLineLoginSpec(reactContext) {
34+
3135
companion object {
32-
private const val MODULE_NAME: String = "LineLogin"
36+
const val NAME = NativeLineLoginSpec.NAME
3337
}
3438

39+
private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
40+
3541
private lateinit var channelId: String
3642
private lateinit var lineApiClient: LineApiClient
37-
private var LOGIN_REQUEST_CODE: Int = 0
38-
private val uiCoroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
39-
4043
private var loginResult: Promise? = null
4144

42-
override fun getName() = MODULE_NAME
43-
44-
@ReactMethod
45-
fun setup(args: ReadableMap, promise: Promise) {
46-
val context: Context = reactContext.applicationContext
45+
override fun setup(args: ReadableMap, promise: Promise) {
4746
channelId = args.getString("channelId")!!
48-
lineApiClient = LineApiClientBuilder(context, channelId).build()
47+
lineApiClient = LineApiClientBuilder(reactContext.applicationContext, channelId).build()
4948
reactContext.addActivityEventListener(object : ActivityEventListener {
5049
override fun onNewIntent(intent: Intent?) {}
5150
override fun onActivityResult(
@@ -58,8 +57,7 @@ class LineLogin(private val reactContext: ReactApplicationContext) :
5857
})
5958
}
6059

61-
@ReactMethod
62-
fun login(args: ReadableMap, promise: Promise) {
60+
override fun login(args: ReadableMap, promise: Promise) {
6361
val scopes =
6462
if (args.hasKey(LoginArguments.SCOPES.key)) args.getArray(LoginArguments.SCOPES.key)!!
6563
.toArrayList() as List<String> else listOf("profile")
@@ -113,9 +111,8 @@ class LineLogin(private val reactContext: ReactApplicationContext) :
113111
this.loginResult = promise
114112
}
115113

116-
@ReactMethod
117-
fun getProfile(promise: Promise) {
118-
uiCoroutineScope.launch {
114+
override fun getProfile(promise: Promise) {
115+
coroutineScope.launch {
119116
val lineApiResponse = withContext(Dispatchers.IO) { lineApiClient.getProfile() }
120117
if (!lineApiResponse.isSuccess) {
121118
promise.reject(
@@ -168,9 +165,8 @@ class LineLogin(private val reactContext: ReactApplicationContext) :
168165
loginResult = null
169166
}
170167

171-
@ReactMethod
172-
fun logout(promise: Promise) {
173-
uiCoroutineScope.launch {
168+
override fun logout(promise: Promise) {
169+
coroutineScope.launch {
174170
val lineApiResponse = withContext(Dispatchers.IO) { lineApiClient.logout() }
175171
if (lineApiResponse.isSuccess) {
176172
promise.resolve(null)
@@ -184,29 +180,25 @@ class LineLogin(private val reactContext: ReactApplicationContext) :
184180
}
185181
}
186182

187-
@ReactMethod
188-
fun getCurrentAccessToken(promise: Promise) = invokeLineServiceMethod(
183+
override fun getCurrentAccessToken(promise: Promise) = invokeLineServiceMethod(
189184
promise = promise,
190185
serviceCallable = { lineApiClient.getCurrentAccessToken() },
191186
parser = { parseAccessToken(it, lineIdToken = null) }
192187
)
193188

194-
@ReactMethod
195-
fun getFriendshipStatus(promise: Promise) = invokeLineServiceMethod(
189+
override fun getFriendshipStatus(promise: Promise) = invokeLineServiceMethod(
196190
promise = promise,
197191
serviceCallable = { lineApiClient.getFriendshipStatus() },
198192
parser = { parseFriendshipStatus(it) }
199193
)
200194

201-
@ReactMethod
202-
fun refreshAccessToken(promise: Promise) = invokeLineServiceMethod(
195+
override fun refreshAccessToken(promise: Promise) = invokeLineServiceMethod(
203196
promise = promise,
204197
serviceCallable = { lineApiClient.refreshAccessToken() },
205198
parser = { parseAccessToken(it, lineIdToken = null) }
206199
)
207200

208-
@ReactMethod
209-
fun verifyAccessToken(promise: Promise) = invokeLineServiceMethod(
201+
override fun verifyAccessToken(promise: Promise) = invokeLineServiceMethod(
210202
promise = promise,
211203
serviceCallable = { lineApiClient.verifyToken() },
212204
parser = { parseVerifyAccessToken(it) }
@@ -217,7 +209,7 @@ class LineLogin(private val reactContext: ReactApplicationContext) :
217209
serviceCallable: () -> LineApiResponse<T>,
218210
parser: (T) -> WritableMap
219211
) {
220-
uiCoroutineScope.launch {
212+
coroutineScope.launch {
221213
val lineApiResponse = withContext(Dispatchers.IO) { serviceCallable.invoke() }
222214
if (lineApiResponse.isSuccess) {
223215
promise.resolve(parser.invoke(lineApiResponse.responseData))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.xmartlabs.line
2+
3+
import com.facebook.react.bridge.NativeModule
4+
import com.facebook.react.bridge.ReactApplicationContext
5+
import com.facebook.react.TurboReactPackage
6+
import com.facebook.react.module.model.ReactModuleInfo
7+
import com.facebook.react.module.model.ReactModuleInfoProvider
8+
9+
class LineLoginPackage : TurboReactPackage() {
10+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? =
11+
when (name) {
12+
LineLoginModule.NAME -> LineLoginModule(reactContext)
13+
else -> null
14+
}
15+
16+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
17+
ReactModuleInfoProvider {
18+
mapOf(
19+
LineLoginModule.NAME to ReactModuleInfo(
20+
LineLoginModule.NAME,
21+
LineLoginModule.NAME,
22+
canOverrideExistingModule = false,
23+
needsEagerInit = false,
24+
hasConstants = true,
25+
isCxxModule = false,
26+
isTurboModule = true
27+
)
28+
)
29+
}
30+
}

β€Žandroid/src/main/java/com/xmartlabs/rnline/RNLinePackage.javaβ€Ž

Lines changed: 0 additions & 30 deletions
This file was deleted.

β€Žandroid/src/main/res/values/strings.xmlβ€Ž

Lines changed: 0 additions & 3 deletions
This file was deleted.
File renamed without changes.

β€Žassets/line-button.sketchβ€Ž

-8.84 KB
Binary file not shown.

0 commit comments

Comments
Β (0)