'use client' import { fetchTokensBundle } from '@/app/actions/action'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { convertBytes } from '@/app/lib/convertBytes'; import { useTranslations } from 'next-intl'; import { yooKasaCreatePayment } from '@/app/actions/yooKassa'; import { useState } from 'react'; import ModalWindow from '@/app/components/ModalWindow'; import YooMoneyWidget from '@/app/components/YooMoneyWidget'; import { YooMoneyCheckoutWidgetConfig, YooMoneyErrorCallbackResult } from 'types-yoomoneycheckoutwidget'; interface Tariff { id: number; type: string; name: string; price: number; tokens: number; maxFilesCount: number; diskSize: number; maxUsers: number; } export default function PaymentTubBuyTokens() { const t = useTranslations('Global'); const { data: tokensPaymentData, isLoading, isError, error } = useQuery({ queryKey: ['tokensPaymentData'], queryFn: () => { return fetchTokensBundle(); }, select: (data: Tariff[] | null): Tariff[] => { if (data) { return data.sort((a, b) => a.price - b.price); } else { return [] } } }); const [openWindow, setOpenWindow] = useState(false); const [errorMessage, setErrorMessage] = useState(null); const [selectedTokensBundle, setselectedTokensBundle] = useState<{ value: number; tokensBundle: string; tokens: number; tokensBundleID: number } | null>(null); const [isProcessing, setIsProcessing] = useState(false); const [showWidget, setShowWidget] = useState(false); const [yooMoneyConfig, setYooMoneyConfig] = useState(null); const queryClient = useQueryClient(); const [selectedTokenPackage, setSelectedTokenPackage] = useState(null); async function createPayment(value: number, tokensBundle: number) { if (isProcessing) return; setIsProcessing(true); setErrorMessage(null); try { const response = await yooKasaCreatePayment(value, tokensBundle, 'TOKEN'); if (response) { setShowWidget(true) const config: YooMoneyCheckoutWidgetConfig = { confirmation_token: response, error_callback: (result: YooMoneyErrorCallbackResult) => { console.error('error_callback', result.error); }, customization: { modal: true } } setYooMoneyConfig(config); closeModal(false); } else { setErrorMessage('payment-error'); } } catch (error) { setErrorMessage('payment-error'); } finally { setIsProcessing(false); } } function openPaymentWindow(value: number, tokensBundle: string, tokens: number, tokensBundleID: number) { setselectedTokensBundle({ value, tokensBundle, tokens, tokensBundleID }); setIsProcessing(false); setOpenWindow(true); } function closeModal(isWindowOpen: boolean) { if (!isWindowOpen) { setOpenWindow(false); setselectedTokensBundle(null); setIsProcessing(false); setErrorMessage(null); } } function PaymentConfirmationModal() { if (!selectedTokensBundle) return null; const handleConfirm = () => { createPayment(selectedTokensBundle.value, selectedTokensBundle.tokensBundleID); }; const handleCancel = () => { closeModal(false); }; return (

Подтверждение оплаты

Купить: {selectedTokensBundle.tokens} токенов

{selectedTokensBundle.value}₽
{ errorMessage && (

{t(errorMessage)}

) }
); } const onComplete = () => { setYooMoneyConfig(null); setShowWidget(false); const timer = setTimeout(() => { queryClient.invalidateQueries({ queryKey: ['userData'] }); }, 2000); return () => clearTimeout(timer); }; const onModalClose = () => { setYooMoneyConfig(null); setShowWidget(false); } function selectHandler(item: Tariff) { console.log(item); setSelectedTokenPackage(item); console.log(selectedTokenPackage); } return ( <>
{tokensPaymentData?.map((item: Tariff) => (
{ selectHandler(item); })} >
{item.tokens ?? 0}
{t('tokens')}
{item.price ?? 0} ₽
~{Math.ceil((item.price / item.tokens) * 10) / 10 }₽ за токен
))}
{selectedTokenPackage && (
{t('package-selected-tokens-price', { tokens: selectedTokenPackage.tokens, price: selectedTokenPackage.price })}
)}
{/* Модальное окно с виджетом */} {showWidget && yooMoneyConfig && ( )} ) }