Commit 94bf654c by Archer Committed by GitHub

fix: localize invalid coupon errors (#7483)

parent 17317ba4
import { i18nT } from '../../i18n/utils';
import type { ErrType } from '../errorCode';
/* coupon: 512000 */
export enum CouponErrEnum {
invalid = 'invalidCoupon'
}
const couponErr = [{ statusText: CouponErrEnum.invalid, message: i18nT('common:coupon_invalid') }];
export default couponErr.reduce(
(acc, cur, index) => ({
...acc,
[cur.statusText]: {
code: 512000 + index,
statusText: cur.statusText,
message: cur.message,
data: null
}
}),
{} as ErrType<`${CouponErrEnum}`>
);
......@@ -11,6 +11,7 @@ import s3Err from './code/s3';
import SystemErrEnum from './code/system';
import agentSkillErr from './code/skill';
import sandboxErr from './code/sandbox';
import couponErr from './code/coupon';
import { i18nT } from '../i18n/utils';
export const ERROR_CODE: { [key: number]: string } = {
......@@ -131,5 +132,6 @@ export const ERROR_RESPONSE: Record<
...s3Err,
...SystemErrEnum,
...agentSkillErr,
...sandboxErr
...sandboxErr,
...couponErr
};
import z from 'zod';
export const RedeemCouponQuerySchema = z.object({
key: z.string().trim().min(1).meta({
description: '兑换码',
example: 'AbCdEfGhIjKlMnOpQrStUvWx'
})
});
export type RedeemCouponQueryType = z.infer<typeof RedeemCouponQuerySchema>;
export const RedeemCouponResponseSchema = z.undefined().meta({ description: '兑换成功' });
export type RedeemCouponResponseType = z.infer<typeof RedeemCouponResponseSchema>;
import type { OpenAPIPath } from '../../../type';
import { DevApiTagsMap } from '../../../tag';
import { RedeemCouponQuerySchema, RedeemCouponResponseSchema } from './api';
export const CouponPath: OpenAPIPath = {
'/support/wallet/coupon/redeem': {
get: {
summary: '兑换兑换码',
description: '使用团队兑换码兑换订阅、积分或数据集容量',
tags: [DevApiTagsMap.walletDiscountCoupon],
requestParams: { query: RedeemCouponQuerySchema },
responses: {
200: {
description: '兑换成功',
content: { 'application/json': { schema: RedeemCouponResponseSchema } }
}
}
}
}
};
import type { OpenAPIPath } from '../../type';
import { BillPath } from './bill';
import { DiscountCouponPath } from './discountCoupon';
import { CouponPath } from './coupon';
export const WalletPath: OpenAPIPath = {
...BillPath,
...DiscountCouponPath
...DiscountCouponPath,
...CouponPath
};
......@@ -696,6 +696,7 @@
"core.workflow.tool.Select Tool": "Select Tool",
"core.workflow.variable": "Variable",
"coupon_expired": "Coupon has expired",
"coupon_invalid": "Invalid coupon",
"coupon_not_exist": "Coupon does not exist",
"coupon_not_start": "Coupon is not yet effective",
"coupon_redeem_failed": "Coupon redeemed failed",
......
......@@ -696,6 +696,7 @@
"core.workflow.tool.Select Tool": "选择工具",
"core.workflow.variable": "变量",
"coupon_expired": "优惠券已过期",
"coupon_invalid": "兑换码无效",
"coupon_not_exist": "优惠券不存在",
"coupon_not_start": "优惠券未生效",
"coupon_redeem_failed": "优惠券核销失败",
......
......@@ -691,6 +691,7 @@
"core.workflow.tool.Select Tool": "選擇工具",
"core.workflow.variable": "變數",
"coupon_expired": "優惠券已過期",
"coupon_invalid": "兌換碼無效",
"coupon_not_exist": "優惠券不存在",
"coupon_not_start": "優惠券未生效",
"coupon_redeem_failed": "優惠券核銷失敗",
......
Subproject commit 97d9bb623b33ff23d76810a873c3c90168254e36
Subproject commit eb388829552c8a95ef926f86f0b7d815ea0d3a91
......@@ -2,6 +2,7 @@ import { useEffect } from 'react';
import { getCouponCode, removeCouponCode } from '@/web/support/marketing/utils';
import { redeemCoupon } from '@/web/support/user/team/api';
import { useUserStore } from '@/web/support/user/useUserStore';
import { CouponErrEnum } from '@fastgpt/global/common/error/code/coupon';
export const useCheckCoupon = () => {
const { userInfo } = useUserStore();
......@@ -15,7 +16,7 @@ export const useCheckCoupon = () => {
redeemCoupon(couponCode)
.then(removeCouponCode)
.catch((err) => {
if (err?.message === 'Invalid coupon') {
if (err?.statusText === CouponErrEnum.invalid) {
removeCouponCode();
}
});
......
......@@ -46,7 +46,7 @@ const RedeemCouponModal = ({
<Button variant={'whiteBase'} onClick={onClose}>
{t('account_info:cancel')}
</Button>
<Button ml={2} isLoading={loading} onClick={() => redeemCouponAsync(couponCode)}>
<Button ml={2} isLoading={loading} onClick={() => redeemCouponAsync(couponCode.trim())}>
{t('account_info:confirm')}
</Button>
</ModalFooter>
......
......@@ -121,7 +121,9 @@ export const initFastGPTSemSourceDomain = (sourceDomain?: string) => {
export const setCouponCode = (couponCode?: string) => {
if (!couponCode) return;
localStorage.setItem('couponCode', couponCode);
const normalizedCouponCode = couponCode.trim();
if (!normalizedCouponCode) return;
localStorage.setItem('couponCode', normalizedCouponCode);
};
export const getCouponCode = () => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment