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;