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 (
{error}
); }, [error, onErrorClear]); const impactWarningSection = useMemo(() => { if (impactWarnings.length === 0) return null; return (

This deletion will affect:

{alternativeText && (

Alternative: {alternativeText}

)}
); }, [impactWarnings, alternativeText]); const customFieldsSection = useMemo(() => { return customFields.map((field, index) => (
{field.label}
{field.icon && } {field.value}
)); }, [customFields]); const systemInfoSection = useMemo(() => { if (!systemInfo) return null; return (

System Information

Created At:

{createdDateTime}

Created By:

{item.createdByUserName || "Not available"}

Last Modified:

{modifiedDateTime}

{item.modifiedByUserName && (

Modified By:

{item.modifiedByUserName}

)} {item.createdFromIpAddress && (

Created From IP:

{item.createdFromIpAddress}

)} {item.modifiedFromIpAddress && (

Modified From IP:

{item.modifiedFromIpAddress}

)}
); }, [systemInfo, item, createdDateTime, modifiedDateTime]); return (
{/* Permanent Deletion Warning Alert */}

Permanent Deletion Warning

You are about to permanently delete this {itemTypeLower}. This action cannot be undone.

Deletion Confirmation

{/* Error Messages */} {errorSection} {/* Item Details Section */}
{itemType} to be deleted
Name
{itemDisplayName}
{item.description && (
Description
{item.description}
)} {/* Custom Fields */} {customFieldsSection}
Status:{" "} {itemStatus}
Created: {" "} {createdDate}
{/* Impact Warning */} {impactWarningSection} {/* Confirmation Section */}

Confirmation Required

This action will permanently remove the {itemTypeLower} from the system. All data will be lost and cannot be recovered.

{isConfirmValid && (
)}
{/* Action Buttons */}
Back to Detail
{editRoute && ( Edit Instead )}
{/* System Information Card */} {systemInfoSection}
); }, ); // Add display name for better debugging DeleteConfirmationCard.displayName = "DeleteConfirmationCard"; export default DeleteConfirmationCard;