import React, { useState, useEffect, useMemo, useCallback, memo } from "react"; import { Link } from "react-router"; import { XMarkIcon, TrashIcon, ExclamationTriangleIcon, PencilSquareIcon, ArrowLeftIcon, LockClosedIcon, ShieldExclamationIcon, ClockIcon, UserIcon, GlobeAltIcon, InformationCircleIcon, } from "@heroicons/react/24/outline"; // Constants outside component const GRADIENT_STYLE = { background: "linear-gradient(to right, #8a1622, #dc2626)", }; // Helper functions outside component const formatDate = (dateString) => { return dateString ? new Date(dateString).toLocaleDateString() : "N/A"; }; const formatDateTime = (dateString) => { return dateString ? new Date(dateString).toLocaleString() : "Not available"; }; const getItemDisplayName = (item) => { return item?.name || item?.text || "item name"; }; const getItemStatus = (status) => { return status === 1 ? "Active" : "Inactive"; }; const DeleteConfirmationCard = memo( ({ item, itemType, isDeleting, error, confirmText, onConfirmTextChange, onDelete, onCancel, onErrorClear, detailRoute, editRoute, impactWarnings = [], alternativeText, customFields = [], systemInfo = true, className = "", }) => { if (!item) return null; // Memoized values const itemDisplayName = useMemo(() => getItemDisplayName(item), [item]); const itemStatus = useMemo(() => getItemStatus(item.status), [item.status]); const createdDate = useMemo( () => formatDate(item.createdAt), [item.createdAt], ); const createdDateTime = useMemo( () => formatDateTime(item.createdAt), [item.createdAt], ); const modifiedDateTime = useMemo( () => formatDateTime(item.modifiedAt), [item.modifiedAt], ); const isConfirmValid = useMemo( () => confirmText === itemDisplayName, [confirmText, itemDisplayName], ); const itemTypeLower = useMemo(() => itemType.toLowerCase(), [itemType]); // Memoized callbacks const handleConfirmTextChange = useCallback( (e) => { onConfirmTextChange(e.target.value); }, [onConfirmTextChange], ); const handleDelete = useCallback(() => { if (isConfirmValid && !isDeleting) { onDelete(); } }, [isConfirmValid, isDeleting, onDelete]); // Memoized class strings const inputClasses = useMemo(() => { const baseClasses = "w-full px-4 py-3 border-2 rounded-xl focus:ring-4 focus:outline-none transition-all duration-200 text-sm font-medium"; if (isConfirmValid) { return `${baseClasses} border-green-400 bg-green-50 focus:ring-green-200 text-green-800`; } return `${baseClasses} border-red-300 bg-red-50 focus:ring-red-200 text-red-800`; }, [isConfirmValid]); const deleteButtonClasses = useMemo( () => "inline-flex items-center justify-center px-6 py-3 text-sm font-bold text-white bg-gradient-to-r from-red-700 to-red-800 rounded-xl hover:from-red-800 hover:to-red-900 hover:shadow-xl focus:outline-none focus:ring-4 focus:ring-red-300 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200 shadow-lg", [], ); const cancelButtonClasses = useMemo( () => "inline-flex items-center justify-center px-6 py-3 text-sm font-semibold text-gray-700 bg-white border-2 border-gray-300 rounded-xl hover:bg-gray-50 hover:border-gray-400 hover:shadow-md focus:outline-none focus:ring-4 focus:ring-gray-200 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200", [], ); const editLinkClasses = useMemo( () => `inline-flex items-center justify-center px-6 py-3 text-sm font-semibold text-white bg-gradient-to-r from-red-500 to-red-600 rounded-xl hover:from-red-600 hover:to-red-700 hover:shadow-lg focus:outline-none focus:ring-4 focus:ring-red-200 transition-all duration-200 ${ isDeleting ? "opacity-50 pointer-events-none" : "" }`, [isDeleting], ); // Memoized components const errorSection = useMemo(() => { if (!error) return null; return (
Alternative: {alternativeText}
{createdDateTime}
{item.createdByUserName || "Not available"}
{modifiedDateTime}
{item.modifiedByUserName}
{item.createdFromIpAddress}
{item.modifiedFromIpAddress}
Permanent Deletion Warning
You are about to permanently delete this {itemTypeLower}. This action cannot be undone.
This action will permanently remove the {itemTypeLower} from the system. All data will be lost and cannot be recovered.