"use client"; import React, { useEffect, useRef, useState } from "react"; import { Button, Center, Divider, Group, List, Modal, Paper, PasswordInput, Radio, ScrollArea, Select, Stack, Text, TextInput, ThemeIcon, Title } from "@mantine/core"; import { notifications } from "@mantine/notifications"; import { useRouter } from "next/navigation"; import { generateOTP } from '@/app/OTPGenerator'; import { IconAlertTriangle, IconRefresh } from "@tabler/icons-react"; import Image from "next/image"; import img from '@/app/image/logo1.jpg' interface accountData { stAccountNo: string; stAccountType: string; stAvailableBalance: string; custname: string; } export default function SendToBeneficiaryOthers() { const router = useRouter(); const [authorized, setAuthorized] = useState(null); const [accountData, setAccountData] = useState([]); const [beneficiaryData, setBeneficiaryData] = useState([]); const [showIntroModal, setShowIntroModal] = useState(true); const [selectedAccNo, setSelectedAccNo] = useState(null); const [beneficiaryAcc, setBeneficiaryAcc] = useState(null); const [beneficiaryName, setBeneficiaryName] = useState(null); const [beneficiaryIFSC, setBeneficiaryIFSC] = useState(null); const [paymentMode, setPaymentMode] = useState('IMPS'); const [isVisibilityLocked, setIsVisibilityLocked] = useState(false); const [amount, setAmount] = useState(""); const [remarks, setRemarks] = useState(""); const [showConfirmModel, setConfirmModel] = useState(false); const [showTxnPassword, setShowTxnPassword] = useState(false); const [txnPassword, setTxnPassword] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [showOtpField, setShowOtpField] = useState(false); const [otp, setOtp] = useState(""); const [countdown, setCountdown] = useState(180); const [timerActive, setTimerActive] = useState(false); const [generateOtp, setGenerateOtp] = useState(""); async function handleGenerateOtp() { // const value = await generateOTP(6); const value = "123456"; setGenerateOtp(value); setCountdown(180); setTimerActive(true); return value; } const getAmountError = () => { if (!amount || !selectedAccount) return null; const amt = Number(amount); const balance = Number(selectedAccount.stAvailableBalance); if (paymentMode === "IMPS") { if (amt > 200000) return "IMPS limit is ₹2,00,000"; if (amt > balance) return "Amount exceeds available balance"; } if (paymentMode === "RTGS") { if (amt < 200000) return "RTGS requires minimum ₹2,00,000"; if (amt > balance) return "Amount exceeds available balance"; } if (paymentMode === "NEFT") { if (amt > balance) return "Amount exceeds available balance"; } if (amt <= 0) return "Amount cannot be less than or equal to zero"; return null; }; const FetchBeneficiaryDetails = async () => { try { const token = localStorage.getItem("access_token"); const response = await fetch("/api/beneficiary", { method: "GET", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, }); const data = await response.json(); console.log(data); if (response.ok && Array.isArray(data)) { setBeneficiaryData(data); } else { notifications.show({ title: "Error", message: "Unable to fetch beneficiary list", color: "red", }); } } catch { notifications.show({ title: "Error", message: "Something went wrong while fetching beneficiaries", color: "red", }); } }; const selectedAccount = accountData.find((acc) => acc.stAccountNo === selectedAccNo); const accountOptions = accountData.map((acc) => ({ value: acc.stAccountNo, label: `${acc.stAccountNo} (${acc.stAccountType})`, })); const benAccountOption = beneficiaryData. filter((ben) => !ben.ifscCode?.startsWith("KACE")) .map((ben) => ({ value: ben.accountNo, label: `${ben.accountNo} - ${ben.name}`, })); const handleBeneficiary = (ben: string | null) => { if (ben) { setBeneficiaryAcc(ben); const selected = beneficiaryData.find((item) => item.accountNo === ben && !item.ifscCode?.startsWith("KACE")); if (selected) { setBeneficiaryName(selected.name); setBeneficiaryIFSC(selected?.ifscCode ?? ''); } else { setBeneficiaryAcc(''); setBeneficiaryName(''); setBeneficiaryIFSC(''); } } } const FetchAccountDetails = async () => { try { const token = localStorage.getItem("access_token"); const response = await fetch("/api/customer", { method: "GET", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, }); const data = await response.json(); if (response.ok && Array.isArray(data)) { const filterSAaccount = data.filter((acc) => acc.stAccountType === 'SA'); setAccountData(filterSAaccount); } } catch { notifications.show({ withBorder: true, color: "red", title: "Please try again later", message: "Unable to Fetch, Please try again later", autoClose: 5000, }); } }; useEffect(() => { const token = localStorage.getItem("access_token"); if (!token) { setAuthorized(false); router.push("/login"); } else { setAuthorized(true); } }, []); useEffect(() => { if (authorized) { FetchAccountDetails(); FetchBeneficiaryDetails(); } }, [authorized]); useEffect(() => { let interval: number | undefined; if (timerActive && countdown > 0) { interval = window.setInterval(() => { setCountdown((prev) => prev - 1); }, 1000); } if (countdown === 0) { if (interval) clearInterval(interval); setTimerActive(false); } return () => { if (interval) clearInterval(interval); }; }, [timerActive, countdown]); async function handleProceed() { if (!selectedAccNo || !beneficiaryAcc! || !beneficiaryName || !beneficiaryIFSC || !paymentMode || !amount || !remarks) { notifications.show({ title: "Validation Error", message: `Please fill all required fields`, color: "red", }); return; } if (parseInt(amount) <= 0) { notifications.show({ title: "Invalid amount", message: "Amount Can not be less than Zero", color: "red", }); return; } if (getAmountError()) { notifications.show({ title: "Invalid amount", message: getAmountError()!, color: "red", }); return; } if (!showOtpField && !showTxnPassword && !showConfirmModel) { setConfirmModel(true); setIsVisibilityLocked(true); return; } if (!otp) { notifications.show({ title: "Enter OTP", message: "Please enter the OTP", color: "red", }); return; } if (otp !== generateOtp) { notifications.show({ title: "Invalid OTP", message: "The OTP entered does not match", color: "red", }); return; } if (!showTxnPassword) { setShowTxnPassword(true); return; } if (!txnPassword) { notifications.show({ title: "Missing field", message: "Please Enter Transaction Password Before Proceed", color: "red", }); return; } try { setIsSubmitting(true); const token = localStorage.getItem("access_token"); const remitter_name = localStorage.getItem("remitter_name"); let url = ""; if (paymentMode === "NEFT") url = "/api/payment/neft"; if (paymentMode === "RTGS") url = "/api/payment/rtgs" if (paymentMode === "IMPS") url = "/api/payment/imps"; const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify({ fromAccount: selectedAccNo, toAccount: beneficiaryAcc, ifscCode: beneficiaryIFSC, amount: amount, beneficiaryName: beneficiaryName, remitterName: remitter_name, tpassword: txnPassword }), }); const result = await res.json(); if (res.ok) { notifications.show({ title: "Success", message: result?.utr ? `Transaction successful - UTR =${result.utr}` : "Transaction successful", color: "green", }); setShowTxnPassword(false); setTxnPassword(""); setShowOtpField(false); setOtp(""); setBeneficiaryName(''); } else { notifications.show({ title: "Error", message: result?.error || "Transaction failed", color: "red", }); } } catch { notifications.show({ title: "Error", message: "Something went wrong", color: "red", }); } finally { setSelectedAccNo(null); setBeneficiaryAcc(null); setBeneficiaryName(''); setPaymentMode(''); setAmount(''); setRemarks(''); setIsVisibilityLocked(false); setIsSubmitting(false); setShowTxnPassword(false); setShowOtpField(false); setOtp(''); setTxnPassword(''); } }; if (!authorized) return null; return ( <> {/* setShowIntroModal(false)} centered withCloseButton={false} // force them to press OK > Important Note IMPS is available 24X7. Limit: up to ₹5,00,000. Money is transfer instantly. NEFT is available 24x7. Can be used for any amount but not instant. RTGS is for ₹2,00,000 and above. Available during banking hours.As per directions of RBI, RTGS transactions are subjected to the following{" "} Time Varying Tariff in addition to the existing RTGS Commission. The tariff will be calculated based on the time of completion of transaction. } > From 09:00 hrs to 12:00 hrs →{" "} ₹0.00 After 12:00 hrs up to 15:30 hrs →{" "} ₹1.00 After 15:30 hrs₹5.00 • Minimum Transfer Amount on this Day is Rs. 1.00 • Maximum Transfer Limit per Day is Rs. 500000.00 • Available Transfer Amount on this Day is Rs. 500000.00 */} setShowIntroModal(false)} centered withCloseButton={false} // force them to press OK >
KCC Bank Logo
Important Note IMPS is available 24X7. Limit: up to ₹5,00,000. Money is transfer instantly. NEFT is available 24x7. Can be used for any amount but not instant. RTGS is for ₹2,00,000 and above. Available during banking hours. As per directions of RBI, RTGS transactions are subjected to the following Time Varying Tariff in addition to the existing RTGS Commission. The tariff will be calculated based on the time of completion of transaction. } > From 09:00 hrs to 12:00 hrs →{" "} ₹0.00 After 12:00 hrs up to 15:30 hrs →{" "} ₹1.00 After 15:30 hrs₹5.00 • Minimum Transfer Amount on this Day is Rs. 1.00 • Maximum Transfer Limit per Day is Rs. 500000.00 • Available Transfer Amount on this Day is Rs. 500000.00
setConfirmModel(false)} // title="Confirm Transaction" centered > KCC Bank Logo Confirm Transaction Debit Account: {selectedAccNo} Beneficiary Account: {beneficiaryAcc} Beneficiary Name: {beneficiaryName} Payment Type: {paymentMode} Amount: ₹ {amount} Remarks: {remarks} {/* main content */} {!showIntroModal && (
Available Balance : {selectedAccount ? selectedAccount.stAvailableBalance : 0} {paymentMode === "IMPS" && "IMPS is available 24X7. Limit: up to ₹2,00,000. Money is transfer instantly. "} {paymentMode === "RTGS" && "RTGS is for ₹2,00,000 and above. Available during banking hours."} {paymentMode === "NEFT" && "NEFT is available 24x7. Can be used for any amount but not instant."} { let input = e.currentTarget.value; if (/^\d*\.?\d{0,2}$/.test(input)) setAmount(input); }} error={getAmountError()} leftSection="₹" withAsterisk readOnly={showOtpField} /> { let input = e.currentTarget.value; input = input.replace(/[^a-zA-Z0-9 ]/g, ""); setRemarks(input) }} maxLength={50} withAsterisk readOnly={showOtpField} /> {showOtpField && ( <> setOtp(e.currentTarget.value)} withAsterisk disabled={showTxnPassword} style={{ flex: 1 }} /> {!showTxnPassword && ( timerActive ? ( Resend OTP will be enabled in{" "} {String(Math.floor(countdown / 60)).padStart(2, "0")}: {String(countdown % 60).padStart(2, "0")} ) : ( ) )} )} {showTxnPassword && ( setTxnPassword(e.currentTarget.value)} withAsterisk /> )} {paymentMode === "RTGS" && <> • As per directions of RBI, RTGS transactions are subjected to the following{" "} Time Varying Tariff in addition to the existing RTGS Commission. The tariff will be calculated based on the time of completion of transaction. // // // } > From 09:00 hrs to 12:00 hrs →{" "} ₹0.00 After 12:00 hrs up to 15:30 hrs →{" "} ₹1.00 After 15:30 hrs₹5.00 } • Minimum Transfer Limit per Day is Rs. 1.00 • Maximum Transfer Limit per Day is Rs. 500000.00 • Available Transfer Amount on this Day is Rs. 500000.00
)} ); }