soapbox/src/features/wallet/components/wallet-transactions.tsx

49 wiersze
1.5 KiB
TypeScript
Czysty Zwykły widok Historia

2025-03-25 21:14:13 +00:00
import { useEffect, useRef, useState } from 'react';
2025-03-23 20:19:42 +00:00
import { defineMessages, useIntl } from 'react-intl';
import { Column } from 'soapbox/components/ui/column.tsx';
2025-03-25 21:14:13 +00:00
import Spinner from 'soapbox/components/ui/spinner.tsx';
2025-03-23 20:19:42 +00:00
import Transactions from 'soapbox/features/wallet/components/transactions.tsx';
2025-03-25 16:31:14 +00:00
import { useTransactions } from 'soapbox/features/zap/hooks/useHooks.ts';
2025-03-23 20:19:42 +00:00
const messages = defineMessages({
title: { id: 'wallet.transactions', defaultMessage: 'Transactions' },
more: { id: 'wallet.transactions.show_more', defaultMessage: 'Show More' },
2025-03-25 16:31:14 +00:00
loading: { id: 'wallet.loading', defaultMessage: 'Loading…' },
2025-03-23 20:19:42 +00:00
});
const WalletTransactions = () => {
const intl = useIntl();
2025-03-25 16:31:14 +00:00
const { isLoading, expandTransactions } = useTransactions();
2025-03-25 21:14:13 +00:00
const observerRef = useRef<HTMLDivElement | null>(null);
const [showSpinner, setShowSpinner] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setShowSpinner(true);
if (!isLoading) expandTransactions();
}
},
{ rootMargin: '100px' },
);
if (observerRef.current) {
observer.observe(observerRef.current);
}
return () => observer.disconnect();
}, [expandTransactions, isLoading]);
2025-03-23 20:19:42 +00:00
return (
2025-03-25 21:14:13 +00:00
<Column label={intl.formatMessage(messages.title)}>
2025-03-25 16:31:14 +00:00
<Transactions />
2025-03-25 21:14:13 +00:00
<div className='flex w-full justify-center' ref={observerRef}>
{showSpinner && isLoading && <Spinner />}
2025-03-23 20:19:42 +00:00
</div>
</Column>
);
};
2025-03-25 21:14:13 +00:00
export default WalletTransactions;