'use client' import DropDownList from '@/app/components/DropDownList'; import { useTranslations } from 'next-intl'; import { ChangeEvent, useState, useActionState, useEffect } from 'react'; import BankCardInput from '@/app/ui/inputs/bank-card-inpit'; import { addPayoutMethod, PayoutMethodFormState, getPayoutMethods, PayoutMethods } from '@/app/actions/referralsActions'; import { bankCardFormSchema } from '@/app/actions/definitions'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import valid from 'card-validator'; interface cardInfoType { cardType: string, potentiallyValid: boolean, cardValid?: boolean } export default function SettingReferralProgram() { const [state, formAction, isPending] = useActionState( addPayoutMethod, undefined, ); const { data: payoutMethods, error } = useQuery({ queryKey: ['payoutMethods'], queryFn: () => { return getPayoutMethods(); }, select: (data) => { if (data?.methods) { return data?.methods } else { return [] }; } }); const [formState, setFormState] = useState(undefined); const [paymentsType, setPaymentsType] = useState('bank-card'); const [defaultCardNumber, setDefaultCardNumber] = useState(undefined); const [isEditing, setIsEditing] = useState(false); const [cardInfo, setCardInfo] = useState(null); const [initialCardInfo, setInitialCardInfo] = useState(null); const queryClient = useQueryClient(); const t = useTranslations('Global'); useEffect(() => { setFormState(state); if (state?.success) { toast.success('success'); setIsEditing(false); queryClient.invalidateQueries({ queryKey: ['payoutMethods'] }); } }, [state]); useEffect(() => { if (payoutMethods) { payoutMethods.forEach(e => { if (e.default) { const numberValidation = valid.number(e.cardNumber); if (numberValidation.card) { setCardInfo({ cardType: numberValidation.card.type, potentiallyValid: numberValidation.isPotentiallyValid }); setInitialCardInfo({ cardType: numberValidation.card.type, potentiallyValid: numberValidation.isPotentiallyValid }) } setDefaultCardNumber(e); } }) } }, [payoutMethods]) async function validateField( fieldName: string, value: string, ) { switch (fieldName) { case 'bankCard': const schema = bankCardFormSchema?.shape[fieldName]; if (!schema) { return { success: true, data: value }; } return schema.safeParse(value); default: throw new Error(`Unknown field: ${fieldName}`); } } async function onChangeHandler(e: ChangeEvent): Promise { const fieldName = e.target.name; const validatedField = await validateField(fieldName, e.target.value); const numberValidation = valid.number(e.target.value); if (numberValidation.card) { setCardInfo({ cardType: numberValidation.card.type, potentiallyValid: numberValidation.isPotentiallyValid, cardValid: true }); } if (e.target.value.length === 19 && !numberValidation.isValid) { setCardInfo((prev) => { if (prev) { return { ...prev, cardValid: false } } return null; }) } if (validatedField.success) { setFormState(prevState => { if (!prevState?.error || !prevState?.error[fieldName]) { return { previousState: prevState?.previousState, error: { server: null } }; } const { [fieldName]: _, ...newError } = prevState.error; return { previousState: prevState?.previousState, error: { ...newError, server: null } }; }); } } return (
{t('referral-program-settings')}
{ formAction(e); }} className="settings-form" >

{t('payout-settings')}

{ switch (paymentsType) { case 'on-account-balance': return t('on-account-balance') case 'bank-card': return t('bank-card') case 'bank-transfer': return t('bank-transfer') } })() } callBack={setPaymentsType} >
  • {t('on-account-balance')}
  • {t('bank-card')}
  • {t('bank-transfer')}
  • {paymentsType === 'bank-card' && (

    {t('bank-card-number')}

    {/* */} {cardInfo && (
    {cardInfo.cardType}
    )}
    {cardInfo?.cardValid === false && (

    {t('bank-card-not-valid')}

    )} {formState?.error?.bankCard && (

    { formState?.error?.bankCard.split('&').map((e, index) => { return ( {t(e)}
    ) }) }

    )}
    )} {formState?.error?.server && (

    {t(formState?.error?.server)}

    )} { isEditing ? (
    ) : ( ) }

    {t('notifications')}

    ) }