UNPKG

capacitor-kakao-plugin

Version:
234 lines 7.61 kB
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