import React, { useContext, useEffect, useState } from "react"; import { Badge, Box, Button, HStack, Input, Select, Text, Tooltip, useToast, } from "@chakra-ui/react"; import { useForm } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import * as yup from "yup"; import { useNavigate } from "react-router-dom"; import { OPACITY_ON_LOAD } from "../../Layout/animations"; import FormInputMain from "../../Components/FormInputMain"; import { useGetContactQuery, useSendNotificationMutation, useUpdateContactMutation, } from "../../Services/contact.service"; import FullscreenLoaders from "../../Components/Loaders/FullscreenLoaders"; import ToastBox from "../../Components/ToastBox"; import NormalTable from "../../Components/DataTable/NormalTable"; import GlobalStateContext from "../../Contexts/GlobalStateContext"; import { useGetInvestorsQuery } from "../../Services/investor.details.service"; import { INVESTOR_TABLE_PAGINATION, TABLE_PAGINATION, } from "../../Constants/Paginations"; import { formatDate, generateSerialNumber } from "../../Constants/Constants"; import { ViewIcon } from "@chakra-ui/icons"; import { useGetUnbanInvestorQuery } from "../../Services/ban.investor.service"; export const notification = yup.object().shape({ title: yup.string().required("Notification Header is required"), ManualDate: yup .date() .required("Manual Date is required") .typeError("Invalid date format"), ManualTime: yup .string() .required("Manual Time is required") .matches( /^([01]\d|2[0-3]):?([0-5]\d)$/, "Invalid time format, must be in HH:mm" ), expectedReturn: yup.string().required("Expected Return is required"), }); export const notificationNew = yup.object().shape({ title: yup.string().required("Notification Header is required"), message: yup.string().notRequired(), }); const Notification = () => { const toast = useToast(); const navigate = useNavigate(); const [form, setForm] = useState({}); const [isLoading, setIsLoading] = useState(false); const [selectedRadio, setSelectedRadio] = useState([]); const [pageSize, setPageSize] = useState(INVESTOR_TABLE_PAGINATION?.size); const [currentPage, setCurrentPage] = useState( INVESTOR_TABLE_PAGINATION?.page ); const [searchTerm, setSearchTerm] = useState(""); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(""); const [country, setCountry] = useState(""); const [kyc, setKyc] = useState(""); const { control, reset, watch, handleSubmit, formState: { errors }, } = useForm({ resolver: yupResolver(notificationNew), defaultValues: { title: "", message: "", }, }); console.log(errors); const { data: contact, isLoading: contactLoading, error, } = useGetContactQuery(); const formatDate = (date) => { return new Date(date).toLocaleDateString("en-GB", { day: "2-digit", month: "2-digit", year: "numeric", }); }; // const { // data: investorDetails, // isLoading: investorDetailsLoading, // // error, // } = useGetInvestorsQuery({ page: currentPage, size: pageSize }); useEffect(() => { const handler = setTimeout(() => { setDebouncedSearchTerm(searchTerm.trim()); // Trim to remove leading/trailing spaces }, 300); return () => clearTimeout(handler); }, [searchTerm]); const { data: investorDetails, isLoading: investorDetailsLoading, refetch, } = useGetUnbanInvestorQuery( { page: 1, // Omit pagination for search size: 10000, // Omit pagination for search // page: debouncedSearchTerm ? undefined : currentPage, // Disable pagination for search // size: debouncedSearchTerm ? undefined : 10000 || pageSize || 500, // Disable pagination for search search: debouncedSearchTerm, // Pass search term country_xid: country, KYCStatus: kyc, }, { skip: searchTerm !== "" && debouncedSearchTerm === "", // Skip if search not debounced yet } ); // useEffect(() => { // console.log("Search Term:", searchTerm); // console.log("Debounced Search Term:", debouncedSearchTerm); // console.log("Investor Details:", investorDetails); // }, [searchTerm, debouncedSearchTerm, investorDetails]); const [sendNotification] = useSendNotificationMutation(); if (contactLoading) { return ; } const formFields = [ { label: "Notification Header", placeHolder: " ", name: "title", type: "text", width: "100%", maxLength: 100, helperText: `Maximum length should be 100 characters. You have entered ${ watch()?.title?.length || 0 } characters.`, isRequired: true, section: "Send Custom Push Notification", // value: contact?.phoneNumber || "", }, { label: "Notification Message", placeHolder: " ", name: "message", width: "100%", type: "textarea", isRequired: true, maxLength: 200, helperText: `Maximum length should be 200 characters. You have entered ${ watch()?.message?.length || 0 } characters.`, section: "Send Custom Push Notification", // value: contact?.phoneNumber || "", }, ]; const groupedFields = formFields.reduce((groups, field) => { const { section } = field; if (!groups[section]) { groups[section] = []; } groups[section].push(field); return groups; }, {}); const onSubmit = async (data) => { const dataToPass = { ...data, principal_xid: selectedRadio, }; setIsLoading(true); try { const res = await sendNotification(dataToPass); if (res?.error) { toast({ render: () => ( ), }); setIsLoading(false); } else if (res?.data) { toast({ render: () => , }); setIsLoading(false); setSelectedRadio([]); reset({ title: "", // Resetting specific fields message: "", }); // Clears the form fields } else { toast({ render: () => ( ), }); setIsLoading(false); } } catch (error) { console.log(error); setIsLoading(false); } }; // ====================================================[Table Setup]================================================================ const tableHeadRow = [ "Sr N/O", "Date", "Client ID", "First Name", "Last Name", "Country", "Phone Number", "E-mail ID", "KYC Status", ]; const extractedArray = investorDetails?.data?.rows?.map((item, idx) => ({ id: item?.principal_xid, "Sr N/O": ( {generateSerialNumber(idx, currentPage, pageSize)} ), Date: ( {formatDate(item?.date)} ), "Client ID": ( {item?.clientReference_id} ), "First Name": ( {item?.firstName} ), "Last Name": ( {item?.lastName} ), Country: ( {item?.country} ), "Phone Number": ( {item?.phoneNumber} ), "E-mail ID": ( {item?.emailAddress} ), "KYC Status": ( {item?.KYCStatus === true ? "Completed" : "Not Completed"} ), })); return ( setSearchTerm(e.target.value)} /> ); }; export default Notification;