@@ -0,0 +1,70 @@
1+import cn from 'classnames';
2+import { Box, Icon, Row } from '@tlon/indigo-react';
3+import { RollerTransaction } from '@urbit/roller-api';
4+import { format, fromUnixTime } from 'date-fns';
5+import { titleize } from 'form/formatters';
7+ TRANSACTION_STATUS_ICONS,
8+ TRANSACTION_TYPE_ICONS,
9+ TRANSACTION_TYPE_TITLES,
10+} from 'lib/constants';
11+import { abbreviateAddress } from 'lib/utils/address';
12+import { useMemo } from 'react';
13+import { useRollerStore } from 'store/roller';
15+export const TransactionRow = ({
20+}: RollerTransaction) => {
21+ const { nextRoll } = useRollerStore();
23+ const label = useMemo(() => {
24+ return TRANSACTION_TYPE_TITLES[type] || type;
27+ const icon = useMemo(() => {
28+ return <Icon icon={TRANSACTION_TYPE_ICONS[type] || 'Bug'} />;
31+ const shortHash = useMemo(() => {
32+ return abbreviateAddress(hash);
35+ const shortDate = useMemo(() => {
39+ const d = fromUnixTime(time / 1000);
40+ console.log(d.toLocaleTimeString());
41+ return format(d, 'MMMM dd');
44+ const statusBadge = useMemo(() => {
46+ <div className={cn(['badge', status])}>
48+ <Icon icon={TRANSACTION_STATUS_ICONS[status] || 'Bug'} />
50+ <span>{status === 'pending' ? nextRoll : titleize(status)}</span>
53+ }, [status, nextRoll]);
56+ <Box className="transaction-row">
57+ <Box className="icon">{icon}</Box>
58+ <Box className="info">
59+ <Row className="title-row">
60+ <Box className="title">{label}</Box>
61+ <Box className="status">{statusBadge}</Box>
63+ <Row className="info-row">
64+ <Box className="hash">{shortHash}</Box>
65+ <Box className="date">{shortDate}</Box>