import type { ButtonHTMLAttributes } from 'react' import { useRequest, useToggle } from 'ahooks' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { Button } from '@repo/ui/components/ui/button' import { Input } from '@repo/ui/components/ui/input' import { Spinner } from '@repo/ui/components/ui/spinner' import { Popover, PopoverContent, PopoverTrigger } from '@repo/ui/components/ui/popover' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@repo/ui/components/ui/form' export const formSchema = z.object({ coupon: z.string().min(3, { error: 'Digite um cupom válido' }).trim() }) export type Schema = z.infer interface DiscountProps extends Omit< ButtonHTMLAttributes, 'onChange' > { onChange?: (value: any) => void disabled?: boolean } export function Discount({ onChange, ...props }: DiscountProps) { const form = useForm({ resolver: zodResolver(formSchema) }) const [open, { toggle, set }] = useToggle() const { runAsync } = useRequest( async (coupon) => { return await fetch(`/~/api/coupons/${coupon}`, { method: 'GET' }) }, { manual: true } ) const { handleSubmit, control, formState, setError, reset } = form const onSubmit = async (data: Schema) => { const r = await runAsync(data.coupon) if (!r.ok) { return setError('coupon', { message: 'Cupom inválido' }) } onChange?.(await r.json()) reset() set(false) } return ( Adicionar { e.stopPropagation() e.preventDefault() await handleSubmit(onSubmit)(e) }} > Recebeu um cupom? Aplique seu cupom e tenha acesso aos cursos com descontos exclusivos. ( Cupom )} /> set(false)} > Cancelar {formState.isSubmitting && } Aplicar ) } export function applyDiscount( subtotal: number, discountAmount: number, discountType: 'FIXED' | 'PERCENT' ) { if (subtotal <= 0) { return 0 } const amount = discountType === 'PERCENT' ? (subtotal * discountAmount) / 100 : discountAmount return Math.min(amount, subtotal) }
Aplique seu cupom e tenha acesso aos cursos com descontos exclusivos.