import {
GrantPromotionRewardForGameErrorResponse,
GrantPromotionRewardForGameErrorResult,
GrantPromotionRewardForGameSuccessResponse,
} from './grantPromotionRewardForGame';
import { isMinVersionSupported } from './isMinVersionSupported';
import { safePostMessage } from '../../natives';
import { PROMOTION_REWARD_MIN_VERSION } from '../constants';
export type GrantPromotionRewardSuccessResponse = GrantPromotionRewardForGameSuccessResponse;
export type GrantPromotionRewardErrorResponse = GrantPromotionRewardForGameErrorResponse;
export type GrantPromotionRewardErrorResult = GrantPromotionRewardForGameErrorResult;
export type GrantPromotionRewardResponse = GrantPromotionRewardSuccessResponse | GrantPromotionRewardErrorResponse;
type GrantPromotionRewardResult = GrantPromotionRewardResponse | GrantPromotionRewardErrorResult | 'ERROR' | undefined;
function isGrantPromotionRewardError(error: unknown): error is { code: string; message: string } {
return (
typeof error === 'object' &&
error !== null &&
'code' in error &&
typeof (error as any).code === 'string' &&
'message' in error &&
typeof (error as any).message === 'string'
);
}
/**
* @public
* @category 프로모션
* @name grantPromotionReward
* @description
* 이 함수를 사용하면 미니앱에서 프로모션 코드를 사용해서 유저에게 리워드를 지급할 수 있어요.
* @param {{ params: { promotionCode: string; amount: number } }} params - 포인트를 지급하기 위해 필요한 정보예요.
* @param {string} params.promotionCode - 프로모션 코드예요.
* @param {number} params.amount - 지급할 포인트 금액이에요.
* @returns {Promise<{ key: string } | { errorCode: string; message: string } | 'ERROR' | undefined>}
* 포인트 지급 결과를 반환해요.
* - `{ key: string }`: 포인트 지급에 성공했어요. key는 리워드 키를 의미해요.
* - `{ errorCode: string, message: string }`: 포인트 지급에 실패했어요. 에러 코드는 다음과 같아요.
* - `"4100"`: 프로모션 정보를 찾을 수 없을 때
* - `"4104"`: 프로모션이 중지되었을 때
* - `"4105"`: 프로모션이 종료되었을 때
* - `"4108"`: 프로모션이 승인되지 않았을 때
* - `"4109"`: 프로모션이 실행중이 아닐 때
* - `"4110"`: 리워드를 지급/회수할 수 없을 때
* - `"4112"`: 프로모션 머니가 부족할 때
* - `"4113"`: 이미 지급/회수된 내역일 때
* - `"4114"`: 프로모션에 설정된 1회 지급 금액을 초과할 때
* - `'ERROR'`: 알 수 없는 오류가 발생했어요.
* - `undefined`: 앱 버전이 최소 지원 버전보다 낮아요.
* @example
* ```tsx
* import { grantPromotionReward } from '@apps-in-toss/framework';
*
* function GrantRewardButton() {
* async function handleClick() {
* const result = await grantPromotionReward({
* params: {
* promotionCode: 'PROMOTION_CODE',
* amount: 1000,
* },
* });
*
* if (!result) {
* console.warn('지원하지 않는 앱 버전이에요.');
* return;
* }
*
* if (result === 'ERROR') {
* console.error('포인트 지급 중 알 수 없는 오류가 발생했어요.');
* return;
* }
*
* if ('key' in result) {
* console.log('포인트 지급 성공!', result.key);
* } else if ('errorCode' in result) {
* console.error('포인트 지급 실패:', result.errorCode, result.message);
* }
* }
*
* return (
*
* );
* }
* ```
*/
export async function grantPromotionReward(params: {
params: {
promotionCode: string;
amount: number;
};
}): Promise {
const isSupported = isMinVersionSupported(PROMOTION_REWARD_MIN_VERSION);
if (!isSupported) {
return;
}
try {
const response = (await safePostMessage(
'grantPromotionRewardForGame',
params.params
)) as GrantPromotionRewardResponse;
if (response.key) {
return response;
}
return 'ERROR';
} catch (error) {
if (isGrantPromotionRewardError(error)) {
return {
errorCode: error.code,
message: error.message,
};
}
return 'ERROR';
}
}