'use client'; import { useEffect, useMemo, useState } from 'react'; import { Icon } from '@iconify/react'; import { BaseApproval } from '@/types/api/api-general'; import Button from '@/components/Button'; import { cn, formatDate } from '@/lib/helper'; interface ApprovalStepsV2Props { title?: string; approvals?: BaseApproval[]; steps: { step_number: number; step_name: string; }[]; maxVisibleSteps?: number; className?: { wrapper?: string; stepsWrapper?: string; stepsContainer?: string; }; } const ApprovalStepsV2 = ({ title = 'Progress Details', approvals, steps, maxVisibleSteps = 2, className, }: ApprovalStepsV2Props) => { const [isSeeAll, setIsSeeAll] = useState(false); const [formattedApprovals, setFormattedApprovals] = useState< (BaseApproval & { isActive: boolean })[] >([]); const latestApprovalStepNumber = approvals?.[approvals.length - 1].step_number ?? 0; const lastStepNumber = steps[steps.length - 1].step_number; const isLatestApprovalStepNumberLessThanLastStepNumber = latestApprovalStepNumber < lastStepNumber; const slicedFormattedApprovals = useMemo(() => { return formattedApprovals.slice(0, isSeeAll ? undefined : maxVisibleSteps); }, [formattedApprovals, isSeeAll]); const seeMoreClickHandler = () => { setIsSeeAll((prevVal) => !prevVal); }; useEffect(() => { if (approvals) { const tempFormattedApprovals: (BaseApproval & { isActive: boolean })[] = []; approvals.forEach((approval) => { tempFormattedApprovals.push({ ...approval, isActive: true, }); }); if (isLatestApprovalStepNumberLessThanLastStepNumber) { const latestApprovalStepNumberIndexInSteps = steps.findIndex( (step) => step.step_number === latestApprovalStepNumber ); const slicedSteps = steps.slice( latestApprovalStepNumberIndexInSteps + 1 ); slicedSteps.forEach((step) => { tempFormattedApprovals.push({ action: 'APPROVED', action_at: new Date().toISOString(), action_by: { id: 0, id_user: 0, email: '', name: '', }, step_name: step.step_name, step_number: step.step_number, isActive: false, }); }); } setFormattedApprovals(tempFormattedApprovals); } }, [approvals]); return (

{title}

{slicedFormattedApprovals.map((approval, idx) => { const isApprovalActionCreated = approval.action === 'CREATED'; const isApprovalActionUpdated = approval.action === 'UPDATED'; const isApprovalActionRejected = approval.action === 'REJECTED'; const isApprovalActionApproved = approval.action === 'APPROVED'; const approvalIcon = isApprovalActionCreated || isApprovalActionUpdated ? 'heroicons:clock-solid' : isApprovalActionRejected ? 'heroicons:x-circle-solid' : isApprovalActionApproved ? 'heroicons:check-badge-solid' : 'heroicons:check-badge-solid'; return (
{idx < formattedApprovals.length - 1 && (
)}
{approval.step_name} {(isApprovalActionCreated || isApprovalActionUpdated) && 'Diajukan oleh '} {isApprovalActionRejected && 'Ditolak oleh '} {isApprovalActionApproved && 'Disetujui oleh '} {approval.isActive ? approval.action_by.name : '...'}
{approval.isActive && (

Created at :{' '} {formatDate(approval.action_at, 'DD-MM-YYYY, HH:mm')}
Notes : {approval.notes ?? '-'}

)}
); })}
{formattedApprovals.length > maxVisibleSteps && ( )}
); }; export default ApprovalStepsV2;