import { useEffect, useState, useRef } from 'react'; import './MembershipCard.scss'; import { useDispatch } from 'react-redux'; import { useSelector } from 'react-redux'; import { StoredSessionData } from '../../../../Features/ThemeChange/ThemeChange'; import { getBranchDetail, getCompBranchData } from '../../../../Features/BrachLogin/BranchLogin'; import { Button, Input, Modal, message } from 'antd'; import { PrinterOutlined, ShareAltOutlined } from '@ant-design/icons'; import html2canvas from 'html2canvas'; import { FcSportsMode } from "react-icons/fc"; import defaultuser from "../../../../Images/dashboard/user.jpg"; import { printDiv } from '../../../../Services/Others'; function safeNumber(v) { const n = Number(v); return Number.isFinite(n) ? n : 0; } function getCurrentMembership(memberships) { if (!memberships?.length) return null; const sorted = [...memberships].sort( (a, b) => new Date(a.CreatedDate) - new Date(b.CreatedDate) ); const active = sorted.find( (m) => m.RemainingDays > 0 || m.RemainingSessionHrs > 0 ); if (active) return active; const now = new Date(); const next = sorted.find((m) => new Date(m.CreatedDate) > now); return next || null; } function formatAadhaar(aadhaar) { if (!aadhaar) return ''; const str = String(aadhaar); if (str.length <= 4) return str; const lastFour = str.slice(-4); const masked = 'X'.repeat(str.length - 4); return `${masked}${lastFour}`; } function formatDate(dateStr) { if (!dateStr) return ''; const date = new Date(dateStr); const day = String(date.getDate()).padStart(2, '0'); const month = date.toLocaleString('en-US', { month: 'short' }); const year = date.getFullYear(); return `${day} ${month} ${year}`; } const MembershipCard = ({ MembershipDetail = [], selectedCustomer = {}, showCard = false }) => { const dispatch = useDispatch(); const SessionData = useSelector(StoredSessionData); const AppId = SessionData?.AppId; const CompId = SessionData?.CompId; const BranchId = SessionData?.BranchId; const UserId = SessionData?.UserId; console.log(selectedCustomer, "selectedCustomer") const [activeMembership, setActiveMembership] = useState(null); const [branchName, setBranchName] = useState('Guest'); const [branchLogo, setBranchLogo] = useState(null); const [emailModalVisible, setEmailModalVisible] = useState(false); const [emailInput, setEmailInput] = useState(''); const [base64Image, setBase64Image] = useState(null); const [base64CustImage, setBase64CustImage] = useState(null); const cardRef = useRef(null); const duration = safeNumber(activeMembership?.PlanDuration); const remaining = safeNumber(activeMembership?.RemainingDays); const usedDays = Math.max(0, duration - remaining); const daysPct = duration > 0 ? Math.round((usedDays / duration) * 100) : 0; const freeHrs = safeNumber(activeMembership?.FreeSessionHrs); const remainingHrs = safeNumber(activeMembership?.RemainingSessionHrs); const usedHrs = Math.max(0, freeHrs - remainingHrs); const hrsPct = freeHrs > 0 ? Math.round((usedHrs / freeHrs) * 100) : 0; const discountLabel = `${activeMembership?.Discount}${activeMembership?.DiscountType === 'P' ? '%' : ''}`; useEffect(() => { if (MembershipDetail?.length === 0) return; const currentActiveMembership = getCurrentMembership(MembershipDetail); if (currentActiveMembership) { setActiveMembership(currentActiveMembership); } else { setActiveMembership(null); } fetchBranchDtls(); }, [MembershipDetail]); const fetchBranchDtls = async () => { const response = await dispatch( getBranchDetail({ BrId: BranchId }) ).unwrap(); if (response?.data?.statusCode === 1) { setBranchName( response?.data?.data?.filter((item) => item?.BrId == BranchId)?.[0]?.BrName || 'Guest' ); setBranchLogo( response?.data?.data?.filter((item) => item?.BrId == BranchId)?.[0]?.CompLogo || 'Guest' ); } }; useEffect(() => { async function fetchImage() { try { const base64 = await imageUrlToBase64(branchLogo); setBase64Image(base64); } catch (error) { console.log('Error converting image', error.message); } } if (branchLogo) { fetchImage(); } }, [branchLogo]); useEffect(() => { async function fetchCustomerImage() { try { const base64 = await imageUrlToBase64(selectedCustomer?.CustomerProfile); setBase64CustImage(base64); } catch (error) { console.log('Error converting image', error.message); } } if (selectedCustomer?.CustomerProfile) { fetchCustomerImage(); } }, [selectedCustomer?.CustomerProfile]) const imageUrlToBase64 = async (url) => { try { const response = await fetch(url); const blob = await response.blob(); return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); } catch (error) { console.error('Error fetching or converting image:', error); throw error; } }; const handlePrint = async () => { if (!cardRef.current) return; const style = ` `; const printStyles = document.createElement('style'); printStyles.innerHTML = ` @page { size: A4; margin: 0.5in; } @media print { * { -webkit-print-color-adjust: exact !important; } body * { visibility: hidden; } #physicalMembershipCard, #physicalMembershipCard * { visibility: visible; } #physicalMembershipCard { position: absolute !important; left: 0 !important; top: 0 !important; width: 340px !important; height: 225px !important; background: linear-gradient(to top, #1e3c72 0%, #2a5298 100%) !important; border-radius: 16px !important; padding: 20px !important; color: white !important; font-family: Arial, sans-serif !important; box-shadow: none !important; } .cardHeader { display: flex !important; justify-content: space-between !important; } .cardLogo { display: flex !important; align-items: center !important; gap: 8px !important; } .logoIcon { background: white !important; border-radius: 50% !important; padding: 5px !important; } .brandName { font-size: 14px !important; font-weight: 700 !important; } .priorityBadge { background: #ff9800 !important; padding: 4px 12px !important; border-radius: 12px !important; } .membership-name { position: absolute !important; right: 20px !important; top: 42px !important; background: #019b01 !important; padding: 4px 12px !important; border-radius: 12px !important; } .cardMemberName { font-size: 20px !important; font-weight: 700 !important; } .cardDates { display: flex !important; gap: 24px !important; } .cardFooter { position: absolute !important; bottom: 22% !important; right: 24px !important; } } `; document.head.appendChild(printStyles); window.print(); document.head.removeChild(printStyles); }; const handleShare = () => { if (selectedCustomer?.CustEmail) { shareCard(selectedCustomer.CustEmail); } else { setEmailModalVisible(true); } }; const shareCard = async (email) => { try { // Your API call here // await dispatch(shareCardAction({ email, cardData: ... })).unwrap(); message.success(`Card shared successfully to ${email}`); setEmailModalVisible(false); setEmailInput(''); } catch (error) { message.error('Failed to share card'); } }; const handleEmailSubmit = () => { if (!emailInput || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailInput)) { message.error('Please enter a valid email address'); return; } shareCard(emailInput); }; if (!showCard) { // Original membership details view return (
{activeMembership?.MemberName || '-'}
{activeMembership?.Remarks || ''}
Duration
{duration} days
Remaining
{remaining}d left
Free Hrs
{freeHrs} hrs
Sessions left
{remainingHrs}h
Discount
{discountLabel}
Priority
{activeMembership?.Priority === 'Y' ? 'Yes' : 'No'}
{activeMembership?.Priority === 'Y' && (
{activeMembership?.Prioritydays || '-'}
)}
); } // Card view return (
{base64Image ? Branch Logo : }
{branchName}
{activeMembership?.Priority === 'Y' && (
PRIORITY
)}
{activeMembership?.MemberName}
{selectedCustomer?.CustName || 'Member'}
ID: {selectedCustomer?.CustId || '-'}
VALID FROM
{formatDate(activeMembership?.PlanStartDate)}
VALID UNTIL
{formatDate(activeMembership?.PlanEndDate)}
MOBILE {selectedCustomer?.value || '-'}
{selectedCustomer?.AadhaarNo &&
AADHAAR {formatAadhaar(selectedCustomer?.AadhaarNo)}
}
{/*
{[...Array(16)].map((_, i) => (
))}
*/}
{base64CustImage ? Customer Profile : Customer Profile }
{ setEmailModalVisible(false); setEmailInput(''); }} okText="Share" > setEmailInput(e.target.value)} onPressEnter={handleEmailSubmit} />
); }; export default MembershipCard;