Skip to content

feat: kakao login scopes #411

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class RNKakaoLoginsModule(private val reactContext: ReactApplicationContext) : R
}

@ReactMethod
private fun login(promise: Promise) {
if (UserApiClient.instance.isKakaoTalkLoginAvailable(reactContext)) {
private fun login(scopes: Array<String>, promise: Promise) {
if (scopes.isEmpty() && UserApiClient.instance.isKakaoTalkLoginAvailable(reactContext)) {
reactContext.currentActivity?.let {
UserApiClient.instance.loginWithKakaoTalk(it) { token, error: Throwable? ->
if (error != null) {
Expand Down Expand Up @@ -57,10 +57,10 @@ class RNKakaoLoginsModule(private val reactContext: ReactApplicationContext) : R
}
}
} else {
UserApiClient.instance.loginWithKakaoAccount(reactContext) { token, error: Throwable? ->
UserApiClient.instance.loginWithNewScopes(reactContext, scopes.toList()) { token, error: Throwable? ->
if (error != null) {
promise.reject("RNKakaoLogins", error.message, error)
return@loginWithKakaoAccount
return@loginWithNewScopes
}

if (token != null) {
Expand All @@ -79,7 +79,7 @@ class RNKakaoLoginsModule(private val reactContext: ReactApplicationContext) : R
}
map.putArray("scopes", scopeArray)
promise.resolve(map)
return@loginWithKakaoAccount
return@loginWithNewScopes
}

promise.reject("RNKakaoLogins", "Token is null")
Expand All @@ -88,16 +88,16 @@ class RNKakaoLoginsModule(private val reactContext: ReactApplicationContext) : R
}

@ReactMethod
private fun loginWithKakaoAccount(promise: Promise) {
UserApiClient.instance.loginWithKakaoAccount(reactContext) { token, error: Throwable? ->
private fun loginWithKakaoAccount(scopes: Array<String>, promise: Promise) {
UserApiClient.instance.loginWithNewScopes(reactContext, scopes.toList()) { token, error: Throwable? ->
if (error != null) {
promise.reject("RNKakaoLogins", error.message, error)
return@loginWithKakaoAccount
return@loginWithNewScopes
}

if (token == null) {
promise.reject("RNKakaoLogins", "Token is null")
return@loginWithKakaoAccount
return@loginWithNewScopes
}

if (token != null) {
Expand All @@ -116,7 +116,7 @@ class RNKakaoLoginsModule(private val reactContext: ReactApplicationContext) : R
}
map.putArray("scopes", scopeArray)
promise.resolve(map)
return@loginWithKakaoAccount
return@loginWithNewScopes
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions ios/RNKakaoLogins/RNKakaoLogins.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

@interface RCT_EXTERN_MODULE(RNKakaoLogins, NSObject)

RCT_EXTERN_METHOD(login:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(loginWithKakaoAccount:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(login:(NSArray *)scopes resolver:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(loginWithKakaoAccount:(NSArray *)scopes resolver:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(logout:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(unlink:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
RCT_EXTERN_METHOD(getProfile:(RCTPromiseResolveBlock *)resolve rejecter:(RCTPromiseRejectBlock *)reject);
Expand Down
78 changes: 40 additions & 38 deletions ios/RNKakaoLogins/RNKakaoLogins.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import KakaoSDKUser

@objc(RNKakaoLogins)
class RNKakaoLogins: NSObject {

public override init() {
let appKey: String? = Bundle.main.object(forInfoDictionaryKey: "KAKAO_APP_KEY") as? String
let customScheme: String? = Bundle.main.object(forInfoDictionaryKey: "KAKAO_APP_SCHEME") as? String
Expand All @@ -24,36 +24,37 @@ class RNKakaoLogins: NSObject {
KakaoSDK.initSDK(appKey: appKey!)
}
}

@objc
static func requiresMainQueueSetup() -> Bool {
return true
return true
}

@objc(isKakaoTalkLoginUrl:)
public static func isKakaoTalkLoginUrl(url:URL) -> Bool {

let appKey = try? KakaoSDK.shared.appKey();

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불필요한 띄어쓰기를 되돌려 주시면 감사하겠습니다.

if (appKey != nil) {
return AuthApi.isKakaoTalkLoginUrl(url)
}
return false
}

@objc(handleOpenUrl:)
public static func handleOpenUrl(url:URL) -> Bool {
return AuthController.handleOpenUrl(url: url)
}

@objc(login:rejecter:)
func login(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
func login(_ scopes: [String],
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss";

if (UserApi.isKakaoTalkLoginAvailable()) {
if (scopes.isEmpty && UserApi.isKakaoTalkLoginAvailable()) {
UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
if let error = error {
reject("RNKakaoLogins", error.localizedDescription, nil)
Expand All @@ -70,7 +71,7 @@ class RNKakaoLogins: NSObject {
}
}
} else {
UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
UserApi.shared.loginWithKakaoAccount(scopes: scopes) {(oauthToken, error) in
if let error = error {
reject("RNKakaoLogins", error.localizedDescription, nil)
}
Expand All @@ -88,14 +89,15 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(loginWithKakaoAccount:rejecter:)
func loginWithKakaoAccount(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {

@objc(loginWithKakaoAccount:resolver:rejecter:)
func loginWithKakaoAccount(_ scopes: [String],
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss";
UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss";
UserApi.shared.loginWithKakaoAccount(scopes: scopes) {(oauthToken, error) in
if let error = error {
reject("RNKakaoLogins", error.localizedDescription, nil)
}
Expand All @@ -112,10 +114,10 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(logout:rejecter:)
func logout(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도요!

DispatchQueue.main.async {
UserApi.shared.logout {(error) in
if let error = error {
Expand All @@ -127,10 +129,10 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(unlink:rejecter:)
func unlink(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
UserApi.shared.unlink {(error) in
if let error = error {
Expand All @@ -142,10 +144,10 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(getAccessToken:rejecter:)
func getAccessToken(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
UserApi.shared.accessTokenInfo {(accessTokenInfo, error) in
if let error = error {
Expand All @@ -160,10 +162,10 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(getProfile:rejecter:)
func getProfile(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
UserApi.shared.me() {(user, error) in
if let error = error {
Expand Down Expand Up @@ -199,14 +201,14 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(shippingAddresses:rejecter:)
func shippingAddresses(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss";

UserApi.shared.shippingAddresses() {(shippingAddresses, error) in
if let error = error {
reject("RNKakaoLogins", error.localizedDescription, nil)
Expand Down Expand Up @@ -234,10 +236,10 @@ class RNKakaoLogins: NSObject {
}
}
}

@objc(serviceTerms:rejecter:)
func serviceTerms(_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
DispatchQueue.main.async {
UserApi.shared.serviceTerms {(userServiceTerms, error) in
if let error = error {
Expand All @@ -246,13 +248,13 @@ class RNKakaoLogins: NSObject {
else {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

var result: [String: Any] = [:]

if let useId = userServiceTerms?.id {
result["userId"] = useId
}

if let serviceTerms = userServiceTerms?.serviceTerms {
result["serviceTerms"] = serviceTerms.map {
var terms = [
Expand All @@ -261,15 +263,15 @@ class RNKakaoLogins: NSObject {
"required": $0.required,
"revocable": $0.revocable
]

if let agreedAt = $0.agreedAt {
terms["agreedAt"] = dateFormatter.string(from: agreedAt)
}

return terms
}
}

resolve(result)
}
}
Expand Down
12 changes: 7 additions & 5 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import {NativeModules} from 'react-native';
import {KakaoLoginModuleInterface} from './types';
import {KakaoAccountLoginProps, KakaoLoginModuleInterface} from './types';

const {RNKakaoLogins} = NativeModules;

const NativeKakaoLogins: KakaoLoginModuleInterface = {
login() {
return RNKakaoLogins.login();
login(props) {
return RNKakaoLogins.login(
(props as KakaoAccountLoginProps | undefined)?.scopes ?? [],
);
},
loginWithKakaoAccount() {
return RNKakaoLogins.loginWithKakaoAccount();
loginWithKakaoAccount(props) {
return RNKakaoLogins.loginWithKakaoAccount(props?.scopes ?? []);
},
logout() {
return RNKakaoLogins.logout();
Expand Down
4 changes: 2 additions & 2 deletions src/index.web.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import {KaKaoLoginWebType, KakaoLoginModuleInterface} from './types';

const WebKakaoLogins: KakaoLoginModuleInterface = {
login(props?: KaKaoLoginWebType) {
login(props) {
if (!props) {
throw new Error('Web parameters are not provided');
}

const {restApiKeyWeb, redirectUrlWeb, codeWeb} = props;
const {restApiKeyWeb, redirectUrlWeb, codeWeb} = props as KaKaoLoginWebType;

if (!restApiKeyWeb || !redirectUrlWeb || !codeWeb) {
throw new Error('Web parameters are not provided');
Expand Down
10 changes: 8 additions & 2 deletions src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export interface KakaoLoginModuleInterface {
login(): Promise<KakaoOAuthToken>;
login(props: KakaoAccountLoginProps): Promise<KakaoOAuthToken>;
login(props: KaKaoLoginWebType): Promise<KakaoOAuthWebToken>;

logout(): Promise<string>;
Expand All @@ -13,7 +13,9 @@ export interface KakaoLoginModuleInterface {

getAccessToken(): Promise<KakaoAccessTokenInfo>;

loginWithKakaoAccount(): Promise<KakaoOAuthToken>;
loginWithKakaoAccount(
props?: KakaoAccountLoginProps,
): Promise<KakaoOAuthToken>;

shippingAddresses(): Promise<KakaoShippingAddresses>;

Expand Down Expand Up @@ -130,3 +132,7 @@ export declare type KakaoUserServiceTerms = {
userId?: number;
serviceTerms?: KakaoServiceTerms[];
};

export type KakaoAccountLoginProps = {
scopes?: string[];
};
Loading