import { useVirtualizer } from '@tanstack/react-virtual' import { motion } from 'motion/react' import { useEffect, useRef } from 'react' import { DataLoadingIndicator } from '@/components/ui/data-loading-indicator' import { useFinanceRecordsVm } from '@/hooks/use-finance-records-vm' import { cn } from '@/lib/utils' function maskOrderNo(value: string) { const text = value.trim() if (text.length <= 12) { return text } return `${text.slice(0, 6)}**${text.slice(-4)}` } function MobileFinanceRecordsTab({ enabled }: { enabled: boolean }) { const vm = useFinanceRecordsVm({ enabled }) const parentRef = useRef(null) const rowVirtualizer = useVirtualizer({ count: vm.items.length + (vm.hasNextPage ? 1 : 0), estimateSize: () => 52, getScrollElement: () => parentRef.current, overscan: 6, }) const virtualItems = rowVirtualizer.getVirtualItems() useEffect(() => { const lastItem = virtualItems.at(-1) if ( !lastItem || lastItem.index < vm.items.length - 1 || !vm.hasNextPage || vm.isFetchingNextPage ) { return } void vm.fetchNextPage() }, [ virtualItems, vm.fetchNextPage, vm.hasNextPage, vm.isFetchingNextPage, vm.items.length, ]) return (
{vm.recordTypes.map((recordType) => { const isActive = recordType.key === vm.recordType return ( ) })}
{vm.pageLabel}
{vm.headers.orderNo}
{vm.headers.amount}
{vm.headers.bonusAmount}
{vm.headers.status}
{vm.isLoading ? ( ) : vm.isError ? (
{vm.loadFailedText}
) : vm.items.length === 0 ? (
{vm.emptyText}
) : (
{virtualItems.map((virtualRow) => { const item = vm.items[virtualRow.index] return (
{item ? (
{maskOrderNo(item.orderNoLabel)}
{item.amountLabel}
{item.bonusAmountLabel}
{item.statusLabel}
) : ( )}
) })}
)}
) } export default MobileFinanceRecordsTab