capacitor-kakao-plugin
Version:
capacitor kakao plugin supports Capacitor 6
234 lines • 7.61 kB
JavaScript
import { WebPlugin } from '@capacitor/core';
import camelCase from 'lodash.camelcase';
import snake_case from 'lodash.snakecase';
import * as Kakao from './assets/kakao-sdk';
import { KakaoOAuthTokenStatus, } from './definitions';
const KakaoSdk = Kakao;
export class CapacitorKakaoWeb extends WebPlugin {
initializeKakao(options) {
return new Promise((resolve, reject) => {
if (options.webKey === undefined) {
reject({ status: KakaoOAuthTokenStatus.LOGIN_NEEDED });
}
if (this.webKey === undefined) {
this.webKey = options.webKey;
}
KakaoSdk.init(this.webKey);
resolve({ status: KakaoOAuthTokenStatus.SUCCEED });
});
}
//웹 카카오 로그인
kakaoWebLogin(options) {
const params = {
redirectUri: options.redirectUri,
};
if (Array.isArray(options.scopes)) {
params.scope = options.scopes.join(',');
}
KakaoSdk.Auth.authorize(params);
}
kakaoLogin() {
return new Promise((_, reject) => {
reject('not_supported');
});
}
//웹 로그아웃
kakaoLogout() {
return new Promise((resolve, reject) => {
if (!this.webKey) {
reject('kakao_sdk_not_initialzed');
}
KakaoSdk.Auth.logout();
resolve();
});
}
//unlink
kakaoUnlink() {
return new Promise((resolve, reject) => {
if (!this.webKey) {
reject('kakao_sdk_not_initialized');
}
KakaoSdk.API.request({
url: '/v1/user/unlink',
success: (response) => {
console.log(response);
resolve();
},
fail: (error) => {
console.log(error);
reject(error);
},
});
});
}
//message
shareDefault(options) {
return new Promise((resolve, reject) => {
if (!this.webKey) {
reject('kakao_sdk_not_initialized');
}
KakaoSdk.Share.sendDefault({
objectType: 'feed',
content: {
title: options.title,
description: options.description,
imageUrl: options.imageUrl,
imageWidth: options.imageWidth,
imageHeight: options.imageHeight,
link: {
mobileWebUrl: options.imageLinkUrl,
},
},
buttons: [
{
title: options.buttonTitle,
link: {
mobileWebUrl: options.imageLinkUrl,
},
},
],
callback: () => {
resolve();
},
});
});
}
async getUserInfo() {
return new Promise((resolve, reject) => {
KakaoSdk.API.request({
url: '/v2/user/me',
success: (result) => {
resolve({ value: ResponseAdapter.adapt(result) });
},
fail: (error) => {
reject(error);
},
});
});
}
async getFriendList(options) {
return new Promise((resolve, reject) => {
KakaoSdk.API.request({
url: '/v1/api/talk/friends',
data: options ? RequestAdapter.adapt(options) : undefined,
success: (result) => {
if (Array.isArray(result === null || result === void 0 ? void 0 : result.elements)) {
resolve({ value: ResponseAdapter.adapt(result.elements) });
}
else {
reject();
}
},
fail: (error) => {
reject(error);
},
});
});
}
async loginWithNewScopes(scopes) {
return new Promise((resolve, reject) => {
if (!this.webKey) {
reject('kakao_sdk_not_initialzed');
}
KakaoSdk.Auth.login({
scope: scopes ? scopes.join(',') : undefined,
success: (authObj) => {
const { accessToken } = ResponseAdapter.adapt(authObj);
this.setAccessToken(accessToken);
resolve();
},
fail: (err) => {
console.error(err);
reject(err);
},
});
});
}
async getUserScopes() {
return new Promise((resolve, reject) => {
KakaoSdk.API.request({
url: '/v2/user/scopes',
success: (result) => {
resolve({
value: ResponseAdapter.adapt(result.scopes),
});
},
fail: (error) => {
reject(error);
},
});
});
}
setAccessToken(token) {
KakaoSdk.Auth.setAccessToken(token);
}
}
const isObject = (value) => {
const type = typeof value;
return !!value && type === 'object';
};
/**
* JSON 형식의 데이터를 snake_case -> camelCase 로 전환해주는 어댑터입니다.
*/
export class ResponseAdapter {
static transform(targetObject) {
if (Array.isArray(targetObject)) {
return targetObject.map(value => this.transform(value));
}
else if (!isObject(targetObject)) {
return targetObject;
}
const transformed = {};
const keys = Object.keys(targetObject);
for (const key of keys) {
const value = targetObject[key];
const transformedKey = camelCase(key);
if (Array.isArray(value)) {
transformed[transformedKey] = value.map(v => this.transform(v));
}
else if (isObject(value)) {
transformed[transformedKey] = this.transform(value);
}
else {
transformed[transformedKey] = value;
}
}
return transformed;
}
static adapt(response) {
return this.transform(response);
}
}
/**
* JSON 형식의 데이터를 camelCase -> snake_case 로 전환해주는 어댑터입니다.
*/
export class RequestAdapter {
static transform(targetObject) {
if (Array.isArray(targetObject)) {
return targetObject.map(value => this.transform(value));
}
else if (!isObject(targetObject)) {
return targetObject;
}
const transformed = {};
const keys = Object.keys(targetObject);
for (const key of keys) {
const value = targetObject[key];
const transformedKey = snake_case(key);
if (Array.isArray(value)) {
transformed[transformedKey] = value.map(v => this.transform(v));
}
else if (isObject(value)) {
transformed[transformedKey] = this.transform(value);
}
else {
transformed[transformedKey] = value;
}
}
return transformed;
}
static adapt(requestBody) {
return this.transform(requestBody);
}
}
//# sourceMappingURL=web.js.map