/* eslint-disable @typescript-eslint/no-explicit-any */ import Image from "next/image"; import Link from "next/link"; import { useCallback, useEffect, useRef, useState } from "react"; import { getInvoices, getReceipts } from "../../../Api/OrderApi"; import moment from "moment-timezone"; import { amountFormat, amountFormatWithCurrency, cryptoHandler, formatDate, stringFormatterQuoteStart, } from "../../../lib/Helper"; import NoData from "../../NoDataContainer/NoData"; import Modal from "../../Modal/Modal"; import AccountFilter from "../../Modal/Filters/AccountFilter"; import Swal from "sweetalert2"; interface Invoice { invoice_number: string; status: string; total_orders: number; period_start: string; period_end: string; invoice_date: string; total_amount: number; } interface Receipt { receipt_number: string; customer_name: string; payment_method: string; amount: number; payment_date: string; notes: string; } export default function NotificationsIndex() { const [activeTab, setActiveTab] = useState("invoices"); const [invoices, setInvoices] = useState([]); const [receipts, setReceipts] = useState([]); const [loading, setLoading] = useState(false); const [filterModal, setFilterModal] = useState(false); const [filters, setFilters] = useState({ dateRange: { start: "", end: "", }, status: "", amountRange: { min: 0, max: 0, }, invoiceNumber: "", }); const [showDropdown, setShowDropdown] = useState(null); const dropdownContainerRefs = useRef>( {} ); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { const isClickInside = Object.values(dropdownContainerRefs.current).some( (ref) => ref && ref.contains(event.target as Node) ); if (!isClickInside) { setShowDropdown(null); } }; // document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); const fetchInvoices = useCallback(async () => { try { setLoading(true); // Prepare filter parameters for API const params: any = { created_from: filters.dateRange.start || undefined, created_to: filters.dateRange.end || undefined, is_paid: false, status: filters.status || undefined, payment_status: 1, invoice_amount_from: filters.amountRange.min > 0 ? filters.amountRange.min : undefined, invoice_amount_to: filters.amountRange.max > 0 ? filters.amountRange.max : undefined, }; const data = await getInvoices(params); setInvoices(data); } catch (error) { console.error("Error fetching invoices:", error); } finally { setLoading(false); } }, [filters]); const fetchReceipts = useCallback(async () => { try { setLoading(true); // Prepare filter parameters for API const params: any = { created_from: filters.dateRange.start || undefined, created_to: filters.dateRange.end || undefined, receipt_amount_from: filters.amountRange.min > 0 ? filters.amountRange.min : undefined, receipt_amount_to: filters.amountRange.max > 0 ? filters.amountRange.max : undefined, }; const data = await getReceipts(params); setReceipts(data); } catch (error) { console.error("Error fetching receipts:", error); } finally { setLoading(false); } }, [filters]); useEffect(() => { if (activeTab === "invoices") { fetchInvoices(); fetchReceipts(); } else { fetchReceipts(); } }, [activeTab, fetchInvoices, fetchReceipts]); // Keyboard shortcut for clearing all filters useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { // Ctrl+Shift+C to clear all filters if (event.ctrlKey && event.shiftKey && event.key === "C") { event.preventDefault(); handleClearAllFilters(); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const toggleFilter = () => setFilterModal(!filterModal); const onSaveFilter = (filter: any) => { setFilters(filter); toggleFilter(); }; const handleStatusFilter = (value: string) => setFilters({ ...filters, status: value }); // Filter handling functions const clearIndividualFilter = (filterType: string) => { setFilters((prev: any) => { const newFilters = { ...prev }; if (filterType === "invoiceNumber") { // Remove invoice number filter delete newFilters.invoiceNumber; } else if (filterType === "amount") { // Reset amount range newFilters.amountRange = { min: 0, max: 0 }; } else if (filterType === "dateRange") { // Reset date range newFilters.dateRange = { start: "", end: "" }; } else if (filterType === "status") { // Reset status newFilters.status = ""; } return newFilters; }); }; const clearAllFilters = () => { // Reset all filters to default values setFilters({ dateRange: { start: "", end: "", }, status: "", amountRange: { min: 0, max: 0, }, invoiceNumber: "", }); // Close filter modal if it's open if (filterModal) { setFilterModal(false); } // Reset active tab to default state setActiveTab("invoices"); // Optional: Show a brief success message // You can add a toast notification here if you have a notification system }; // Get applied filter badges const getFilterBadges = () => { const badges = []; if (filters.invoiceNumber) { badges.push({ type: "invoiceNumber", label: filters.invoiceNumber, color: "bg-blue-dark", }); } if (filters.amountRange.min > 0 || filters.amountRange.max > 0) { const amountLabel = filters.amountRange.min > 0 && filters.amountRange.max > 0 ? `${filters.amountRange.min} - ${filters.amountRange.max}` : filters.amountRange.min > 0 ? `Min: ${filters.amountRange.min}` : `Max: ${filters.amountRange.max}`; badges.push({ type: "amount", label: amountLabel, color: "bg-blue-dark", }); } if (filters.dateRange.start || filters.dateRange.end) { const dateLabel = filters.dateRange.start && filters.dateRange.end ? `${moment(filters.dateRange.start).format("MMM DD, YYYY")} - ${moment(filters.dateRange.end).format("MMM DD, YYYY")}` : moment(filters.dateRange.start).format("MMM DD, YYYY") || moment(filters.dateRange.end).format("MMM DD, YYYY"); badges.push({ type: "dateRange", label: dateLabel, color: "bg-blue-dark", }); } return badges; }; // Enhanced clear all with SweetAlert const handleClearAllFilters = () => { // Check if SweetAlert is available if (typeof window !== "undefined" && (window as any).Swal) { Swal.fire({ title: "Clear All Filters?", text: "Are you sure you want to clear all applied filters?", icon: "warning", showCancelButton: true, reverseButtons: true, customClass: { confirmButton: "delybell-primary px-4", cancelButton: "delybell-dark", }, confirmButtonText: "Yes, clear all!", cancelButtonText: "Cancel", }).then((result: any) => { if (result.isConfirmed) { clearAllFilters(); Swal.fire({ title: "Cleared!", text: "All filters have been cleared successfully.", icon: "success", reverseButtons: true, customClass: { confirmButton: "delybell-primary px-4", cancelButton: "delybell-dark", }, }); } }); } else { // Fallback to regular confirm if SweetAlert is not available Swal.fire({ title: "Clear All Filters?", text: "Are you sure you want to clear all applied filters?", icon: "warning", showCancelButton: true, reverseButtons: true, customClass: { confirmButton: "delybell-primary px-4", cancelButton: "delybell-dark", }, confirmButtonText: "Yes, clear all!", cancelButtonText: "Cancel", }).then((result: any) => { if (result.isConfirmed) { clearAllFilters(); } }); } }; // Check if any filters are applied (excluding status) const hasActiveFilters = () => { return ( filters.dateRange.start || filters.dateRange.end || filters.amountRange.min > 0 || filters.amountRange.max > 0 || filters.invoiceNumber ); }; const toggleDropdown = (orderId: string) => { setShowDropdown(showDropdown === orderId ? null : orderId); }; const handleView = (invoice: any, type = "invoice") => { const url = type === "receipt" ? `/receipt-view?id=${cryptoHandler(invoice?.id, "encrypt")}` : `/invoice-view?id=${cryptoHandler(invoice?.id, "encrypt")}`; window.open(url, "_blank"); }; return ( <>
Invoice
{hasActiveFilters() && (
{getFilterBadges().map((badge, index) => (
{badge.label}  |  clearIndividualFilter(badge.type)} >
))}
 |  Clear All
)}
{loading ? (
) : (
{activeTab === "invoices" ? ( invoices?.length > 0 ? ( invoices.map((invoice: any, index) => (
{ dropdownContainerRefs.current[ invoice.id ] = el; }} >
{invoice?.generatedInvoiceId}
{invoice?.isCompletelyPaid ? "Paid" : "Un Paid"} { e.preventDefault(); toggleDropdown(invoice.id); }} className="ms-auto" > {showDropdown === invoice.id && (
e.stopPropagation()} >
)}
{/* { invoice?.order ?.destinationCustomerName } */} {invoice?.payableAmount ? amountFormatWithCurrency( invoice?.payableAmount || 0 ) : ""}
{/* Calendar Icon */} {/* Due Date:{" "} */} {moment(invoice?.createdAt).format( "MMM DD, YYYY" )}  to  {moment(invoice?.dueDate).format( "MMM DD, YYYY" )}

{invoice?.notes ? (
Note: {invoice?.notes}
) : (