'use client'; import React from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { convertToLocale } from '@lib/util/money'; import { StoreCart, StorePromotion } from '@medusajs/types'; import { Badge, Text } from '@medusajs/ui'; import Trash from '@modules/common/icons/trash'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { Button } from '@kit/ui/button'; import { Form, FormControl, FormField, FormItem } from '@kit/ui/form'; import { Input } from '@kit/ui/input'; import { toast } from '@kit/ui/sonner'; import { Trans } from '@kit/ui/trans'; import { addPromotionCodeAction, removePromotionCodeAction, } from './discount-code-actions'; const DiscountCodeSchema = z.object({ code: z.string().min(1), }); export default function DiscountCode({ cart, }: { cart: StoreCart & { promotions: StorePromotion[]; }; }) { const { t } = useTranslation('cart'); const { promotions = [] } = cart; const removePromotionCode = async (code: string) => { const appliedCodes = promotions .filter((p) => p.code !== undefined) .map((p) => p.code!); const loading = toast.loading(t('cart:discountCode.removeLoading')); const result = await removePromotionCodeAction(code, appliedCodes); toast.dismiss(loading); if (result.success) { toast.success(t('cart:discountCode.removeSuccess')); } else { toast.error(t('cart:discountCode.removeError')); } }; const addPromotionCode = async (code: string) => { const loading = toast.loading(t('cart:discountCode.addLoading')); const result = await addPromotionCodeAction(code); toast.dismiss(loading); if (result.success) { toast.success(t('cart:discountCode.addSuccess')); form.reset(); } else { toast.error(t('cart:discountCode.addError')); } }; const form = useForm>({ defaultValues: { code: '', }, resolver: zodResolver(DiscountCodeSchema), }); return (

addPromotionCode(data.code))} className="mb-2 flex w-full flex-1 flex-col gap-x-2 gap-y-2 sm:flex-row" > ( )} /> {promotions.length > 0 && (

{promotions.map((promotion) => { return (
{promotion.code} {' '} ( {promotion.application_method?.value !== undefined && promotion.application_method.currency_code !== undefined && ( <> {promotion.application_method.type === 'percentage' ? `${promotion.application_method.value}%` : convertToLocale({ amount: Number( promotion.application_method.value, ), currency_code: promotion.application_method.currency_code, })} )} ) {/* {promotion.is_automatic && ( )} */} {!promotion.is_automatic && ( )}
); })}
)}
); }