@@ -1,4 +1,4 @@
1−import React, { useCallback, useEffect, useState } from 'react';
1+import React, { useCallback, useEffect, useMemo, useState } from 'react';
3import * as need from 'lib/need';
3import * as need from 'lib/need';
4import { useWallet } from 'store/wallet';
4import { useWallet } from 'store/wallet';
@@ -15,6 +15,11 @@ import { RollerTransaction } from '@urbit/roller-api';
15import './TransactionHistory.scss';
15import './TransactionHistory.scss';
16import { TransactionRow } from './TransactionRow';
16import { TransactionRow } from './TransactionRow';
17import { Box } from '@tlon/indigo-react';
17import { Box } from '@tlon/indigo-react';
18+import { ShipRow } from './ShipRow';
20+interface GroupedTransactions {
21+ [ship: string]: RollerTransaction[];
19const TransactionHistory = () => {
24const TransactionHistory = () => {
20 const { pop }: any = useLocalRouter();
25 const { pop }: any = useLocalRouter();
@@ -23,10 +28,24 @@ const TransactionHistory = () => {
23 const address = need.addressFromWallet(wallet);
28 const address = need.addressFromWallet(wallet);
24 const [transactions, setTransactions] = useState<RollerTransaction[]>([]);
29 const [transactions, setTransactions] = useState<RollerTransaction[]>([]);
31+ const txnsByPatp = useMemo(() => {
32+ return transactions.reduce((memo, tx) => {
33+ if (Object.keys(memo).includes(tx.ship)) {
34+ memo[tx.ship].push(tx);
36+ memo[tx.ship] = [tx];
39+ }, {} as GroupedTransactions);
42+ const txKeys = useMemo(() => {
43+ return Object.keys(txnsByPatp).sort();
26 const fetchTransactions = useCallback(async () => {
46 const fetchTransactions = useCallback(async () => {
27 const txns = await api.getHistory(address);
47 const txns = await api.getHistory(address);
28− const sortedTxns = txns.sort((a, b) => a.time - b.time)
48+ setTransactions(txns);
29− setTransactions(sortedTxns);
30 }, [address, api]);
49 }, [address, api]);
32 useEffect(() => {
51 useEffect(() => {
@@ -46,9 +65,20 @@ const TransactionHistory = () => {
46 </HeaderPane>
65 </HeaderPane>
47 <BodyPane>
66 <BodyPane>
48 <Box className="transaction-container">
67 <Box className="transaction-container">
68+ {txKeys.map(patp => {
71+ <ShipRow patp={patp} />
74+ return a.time - b.time;
49− {transactions.map(tx => (
76+ .map(tx => (
50− <TransactionRow key={tx.time} {...tx} />
77+ <TransactionRow key={tx.time} {...tx} />
53 </BodyPane>
83 </BodyPane>