Skip to content

Commit f1036aa

Browse files
authored
chore: refactor transaction feature
* chore: refactor - transactions feature folder * chore: refactor - rename transaction components * chore: refactor - remove Model from TransactionModel
1 parent 0762eb5 commit f1036aa

40 files changed

+426
-421
lines changed

src/features/blocks/components/transactions.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { DisplayAlgo } from '@/features/common/components/display-algo'
22
import { ellipseAddress } from '@/utils/ellipse-address'
33
import { ellipseId } from '@/utils/ellipse-id'
4-
import { TransactionModel, TransactionType } from '@/features/transactions/models'
4+
import { Transaction, TransactionType } from '@/features/transactions/models'
55
import { ColumnDef } from '@tanstack/react-table'
66
import { DataTable } from '@/features/common/components/data-table'
77
import { TransactionLink } from '@/features/transactions/components/transaction-link'
88
import { DisplayAssetAmount } from '@/features/common/components/display-asset-amount'
99

1010
type Props = {
11-
transactions: TransactionModel[]
11+
transactions: Transaction[]
1212
}
1313

14-
export const columns: ColumnDef<TransactionModel>[] = [
14+
export const columns: ColumnDef<Transaction>[] = [
1515
{
1616
accessorKey: 'id',
1717
header: 'Transaction ID',
@@ -42,7 +42,7 @@ export const columns: ColumnDef<TransactionModel>[] = [
4242
header: 'Amount',
4343
accessorFn: (transaction) => transaction,
4444
cell: (c) => {
45-
const value = c.getValue<TransactionModel>()
45+
const value = c.getValue<Transaction>()
4646
if (value.type === TransactionType.Payment) {
4747
return <DisplayAlgo amount={value.amount} />
4848
}

src/features/blocks/data/block.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { atom, useAtomValue, useStore } from 'jotai'
33
import { indexer } from '@/features/common/data'
44
import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer'
55
import { atomEffect } from 'jotai-effect'
6-
import { fetchTransactionsAtomBuilder, fetchTransactionsModelAtomBuilder, transactionsAtom } from '@/features/transactions/data'
6+
import { fetchTransactionResultsAtomBuilder, fetchTransactionsAtomBuilder, transactionResultsAtom } from '@/features/transactions/data'
77
import { asBlock } from '../mappers'
88
import { useMemo } from 'react'
99
import { loadable } from 'jotai/utils'
@@ -46,7 +46,7 @@ const getBlockAtomBuilder = (store: JotaiStore, round: Round) => {
4646
const [blockResult, transactionResults] = await get(fetchBlockResultAtom)
4747

4848
if (transactionResults && transactionResults.length > 0) {
49-
set(transactionsAtom, (prev) => {
49+
set(transactionResultsAtom, (prev) => {
5050
transactionResults.forEach((t) => {
5151
prev.set(t.id, t)
5252
})
@@ -69,15 +69,15 @@ const getBlockAtomBuilder = (store: JotaiStore, round: Round) => {
6969
const nextRoundAvailable = get(nextRoundAvailableAtomBuilder(store, round))
7070
if (cachedBlockResult) {
7171
const transactions = await get(
72-
fetchTransactionsModelAtomBuilder(store, fetchTransactionsAtomBuilder(store, cachedBlockResult.transactionIds))
72+
fetchTransactionsAtomBuilder(store, fetchTransactionResultsAtomBuilder(store, cachedBlockResult.transactionIds))
7373
)
7474
return asBlock(cachedBlockResult, transactions, nextRoundAvailable)
7575
}
7676

7777
get(syncEffect)
7878

7979
const [blockResult, transactionResults] = await get(fetchBlockResultAtom)
80-
const transactions = await get(fetchTransactionsModelAtomBuilder(store, transactionResults))
80+
const transactions = await get(fetchTransactionsAtomBuilder(store, transactionResults))
8181
return asBlock(blockResult, transactions, nextRoundAvailable)
8282
})
8383
}

src/features/blocks/data/latest-blocks.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { atom, useAtom, useAtomValue, useStore } from 'jotai'
33
import { useMemo } from 'react'
44
import { isDefined } from '@/utils/is-defined'
55
import { asBlockSummary } from '../mappers'
6-
import { transactionsAtom } from '@/features/transactions/data'
6+
import { transactionResultsAtom } from '@/features/transactions/data'
77
import { asTransactionSummary } from '@/features/transactions/mappers/transaction-mappers'
88
import { atomEffect } from 'jotai-effect'
99
import { AlgorandSubscriber } from '@algorandfoundation/algokit-subscriber'
@@ -22,15 +22,15 @@ const latestBlockSummariesAtomBuilder = (store: JotaiStore) => {
2222
return []
2323
}
2424
const blocks = store.get(blocksAtom)
25-
const transactions = store.get(transactionsAtom)
25+
const transactionResults = store.get(transactionResultsAtom)
2626

2727
return Array.from({ length: maxBlocksToDisplay }, (_, i) => {
2828
const round = syncedRound - i
2929
const block = blocks.get(round)
3030

3131
if (block) {
3232
const transactionSummaries = block.transactionIds.map((transactionId) => {
33-
return asTransactionSummary(transactions.get(transactionId)!)
33+
return asTransactionSummary(transactionResults.get(transactionId)!)
3434
})
3535

3636
return asBlockSummary(block, transactionSummaries)
@@ -105,7 +105,7 @@ const subscribeToBlocksEffect = atomEffect((get, set) => {
105105
] as const
106106
})
107107

108-
set(transactionsAtom, (prev) => {
108+
set(transactionResultsAtom, (prev) => {
109109
transactions.forEach((value, key) => {
110110
prev.set(key, value)
111111
})

src/features/blocks/mappers/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { TransactionModel, TransactionSummary, TransactionType } from '@/features/transactions/models'
1+
import { Transaction, TransactionSummary, TransactionType } from '@/features/transactions/models'
22
import { Block, BlockSummary, CommonBlockProperties } from '../models'
33
import { BlockResult } from '../data/types'
44

5-
const asCommonBlock = (block: BlockResult, transactions: Pick<TransactionModel, 'type'>[]): CommonBlockProperties => {
5+
const asCommonBlock = (block: BlockResult, transactions: Pick<Transaction, 'type'>[]): CommonBlockProperties => {
66
return {
77
round: block.round,
88
timestamp: block.timestamp,
@@ -24,7 +24,7 @@ export const asBlockSummary = (block: BlockResult, transactions: TransactionSumm
2424
return { ...asCommonBlock(block, transactions), transactions }
2525
}
2626

27-
export const asBlock = (block: BlockResult, transactions: TransactionModel[], nextRoundAvailable: boolean): Block => {
27+
export const asBlock = (block: BlockResult, transactions: Transaction[], nextRoundAvailable: boolean): Block => {
2828
return {
2929
...asCommonBlock(block, transactions),
3030
previousRound: block.round > 0 ? block.round - 1 : undefined,

src/features/blocks/models/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { TransactionModel, TransactionSummary, TransactionType } from '@/features/transactions/models'
1+
import { Transaction, TransactionSummary, TransactionType } from '@/features/transactions/models'
22

33
export type TransactionsSummary = {
44
count: number
@@ -14,7 +14,7 @@ export type CommonBlockProperties = {
1414
export type Block = CommonBlockProperties & {
1515
previousRound?: number
1616
nextRound?: number
17-
transactions: TransactionModel[]
17+
transactions: Transaction[]
1818
}
1919

2020
export type BlockSummary = CommonBlockProperties & {

src/features/blocks/pages/block-page.test.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { blockResultMother } from '@/tests/object-mother/block-result'
99
import { createStore } from 'jotai'
1010
import { blocksAtom } from '../data/core'
1111
import { nextRoundLabel, previousRoundLabel, roundLabel, timestampLabel, transactionsLabel } from '../components/block-details'
12-
import { transactionsAtom } from '@/features/transactions/data'
12+
import { transactionResultsAtom } from '@/features/transactions/data'
1313
import { transactionResultMother } from '@/tests/object-mother/transaction-result'
1414
import { assetResultMother } from '@/tests/object-mother/asset-result'
1515
import { assetsAtom } from '@/features/assets/data/core'
@@ -93,16 +93,16 @@ describe('block-page', () => {
9393

9494
describe('and has transactions', () => {
9595
const asset = assetResultMother['mainnet-312769']().build()
96-
const transaction1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build()
97-
const transaction2 = transactionResultMother.transfer(asset).build()
98-
const transactions = [transaction1, transaction2]
99-
const block = blockResultMother.blockWithTransactions(transactions).withTimestamp('2024-02-29T06:52:01Z').build()
96+
const transactionResult1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build()
97+
const transactionResult2 = transactionResultMother.transfer(asset).build()
98+
const transactionResults = [transactionResult1, transactionResult2]
99+
const block = blockResultMother.blockWithTransactions(transactionResults).withTimestamp('2024-02-29T06:52:01Z').build()
100100

101101
it('should be rendered with the correct data', () => {
102102
vi.mocked(useParams).mockImplementation(() => ({ round: block.round.toString() }))
103103
const myStore = createStore()
104104
myStore.set(blocksAtom, new Map([[block.round, block]]))
105-
myStore.set(transactionsAtom, new Map(transactions.map((x) => [x.id, x])))
105+
myStore.set(transactionResultsAtom, new Map(transactionResults.map((x) => [x.id, x])))
106106
myStore.set(assetsAtom, new Map([[asset.index, asset]]))
107107

108108
return executeComponentTest(
@@ -129,22 +129,22 @@ describe('block-page', () => {
129129
rows: [
130130
{
131131
cells: [
132-
ellipseId(transaction1.id),
133-
ellipseId(transaction1.group),
134-
ellipseAddress(transaction1.sender),
135-
ellipseAddress(transaction1['payment-transaction']!.receiver),
132+
ellipseId(transactionResult1.id),
133+
ellipseId(transactionResult1.group),
134+
ellipseAddress(transactionResult1.sender),
135+
ellipseAddress(transactionResult1['payment-transaction']!.receiver),
136136
'Payment',
137-
(transaction1['payment-transaction']!.amount / 1e6).toString(),
137+
(transactionResult1['payment-transaction']!.amount / 1e6).toString(),
138138
],
139139
},
140140
{
141141
cells: [
142-
ellipseId(transaction2.id),
143-
ellipseId(transaction2.group),
144-
ellipseAddress(transaction2.sender),
145-
ellipseAddress(transaction2['asset-transfer-transaction']!.receiver),
142+
ellipseId(transactionResult2.id),
143+
ellipseId(transactionResult2.group),
144+
ellipseAddress(transactionResult2.sender),
145+
ellipseAddress(transactionResult2['asset-transfer-transaction']!.receiver),
146146
'Asset Transfer',
147-
`${(transaction2['asset-transfer-transaction']!.amount as number) / 1e6} USDt`,
147+
`${(transactionResult2['asset-transfer-transaction']!.amount as number) / 1e6} USDt`,
148148
],
149149
},
150150
],

src/features/explore/pages/explorer-page.test.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { latestTransactionsTitle } from '@/features/transactions/components/late
88
import { blocksAtom, syncedRoundAtom } from '@/features/blocks/data/core'
99
import { blockResultMother } from '@/tests/object-mother/block-result'
1010
import { transactionResultMother } from '@/tests/object-mother/transaction-result'
11-
import { transactionsAtom } from '@/features/transactions/data'
11+
import { transactionResultsAtom } from '@/features/transactions/data'
1212
import { BlockResult, Round } from '@/features/blocks/data/types'
1313
import { TransactionResult } from '@algorandfoundation/algokit-utils/types/indexer'
1414
import { TransactionId } from '@/features/transactions/data/types'
@@ -50,12 +50,12 @@ describe('explore-page', () => {
5050
})
5151

5252
describe('when a small number of blocks have been processed', () => {
53-
const transaction1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build()
54-
const transactions = [transaction1]
55-
const block = blockResultMother.blockWithTransactions(transactions).withTimestamp('2024-02-29T06:52:01Z').build()
53+
const transactionResult1 = transactionResultMother.payment().withGroup('W3pIVuWVJlzmMDGvX8St0W/DPxslnpt6vKV8zoFb6rg=').build()
54+
const transactionResults = [transactionResult1]
55+
const block = blockResultMother.blockWithTransactions(transactionResults).withTimestamp('2024-02-29T06:52:01Z').build()
5656
const myStore = createStore()
5757
myStore.set(blocksAtom, new Map([[block.round, block]]))
58-
myStore.set(transactionsAtom, new Map(transactions.map((x) => [x.id, x])))
58+
myStore.set(transactionResultsAtom, new Map(transactionResults.map((x) => [x.id, x])))
5959
myStore.set(syncedRoundAtom, block.round)
6060

6161
it('the processed blocks are displayed', () => {
@@ -87,11 +87,11 @@ describe('explore-page', () => {
8787
return latestTransactions.parentElement!
8888
})
8989
const transactionCards = getAllByRole(container, 'link')
90-
expect(transactionCards.length).toBe(transactions.length)
90+
expect(transactionCards.length).toBe(transactionResults.length)
9191
const transactionCard1 = transactionCards[0]
92-
expect(getByRole(transactionCard1, 'heading').textContent).toBe(ellipseId(transaction1.id))
93-
expect(transactionCard1.textContent).toContain(`From:${ellipseAddress(transaction1.sender)}`)
94-
expect(transactionCard1.textContent).toContain(`To:${ellipseAddress(transaction1.receiver)}`)
92+
expect(getByRole(transactionCard1, 'heading').textContent).toBe(ellipseId(transactionResult1.id))
93+
expect(transactionCard1.textContent).toContain(`From:${ellipseAddress(transactionResult1.sender)}`)
94+
expect(transactionCard1.textContent).toContain(`To:${ellipseAddress(transactionResult1.receiver)}`)
9595
expect(transactionCards[0].textContent).toContain('Payment')
9696
}
9797
)
@@ -122,7 +122,7 @@ describe('explore-page', () => {
122122

123123
it('only the latest 5 blocks are displayed', () => {
124124
const myStore = createStore()
125-
myStore.set(transactionsAtom, data.transactions)
125+
myStore.set(transactionResultsAtom, data.transactions)
126126
myStore.set(blocksAtom, data.blocks)
127127
myStore.set(syncedRoundAtom, data.syncedRound)
128128

@@ -143,7 +143,7 @@ describe('explore-page', () => {
143143

144144
it('the latest 50 transactions are displayed', () => {
145145
const myStore = createStore()
146-
myStore.set(transactionsAtom, data.transactions)
146+
myStore.set(transactionResultsAtom, data.transactions)
147147
myStore.set(blocksAtom, data.blocks)
148148
myStore.set(syncedRoundAtom, data.syncedRound)
149149

src/features/transactions/components/app-call-transaction.tsx renamed to src/features/transactions/components/app-call-transaction-details.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { cn } from '@/features/common/utils'
22
import { TransactionInfo } from './transaction-info'
33
import { Card, CardContent } from '@/features/common/components/card'
4-
import { Logicsig } from './logicsig'
5-
import { Multisig } from './multisig'
4+
import { LogicsigDetails } from './logicsig-details'
5+
import { MultisigDetails } from './multisig-details'
66
import { TransactionJson } from './transaction-json'
77
import { TransactionNote } from './transaction-note'
8-
import { AppCallTransactionModel, InnerAppCallTransactionModel, SignatureType } from '../models'
8+
import { AppCallTransaction, InnerAppCallTransaction, SignatureType } from '../models'
99
import { TransactionViewTabs } from './transaction-view-tabs'
1010
import { AppCallTransactionInfo } from './app-call-transaction-info'
1111
import { AppCallTransactionLogs } from './app-call-transaction-logs'
1212

1313
type Props = {
14-
transaction: AppCallTransactionModel | InnerAppCallTransactionModel
14+
transaction: AppCallTransaction | InnerAppCallTransaction
1515
}
1616

17-
export function AppCallTransaction({ transaction }: Props) {
17+
export function AppCallTransactionDetails({ transaction }: Props) {
1818
return (
1919
<div className={cn('space-y-6 pt-7')}>
2020
<TransactionInfo transaction={transaction} />
@@ -25,8 +25,8 @@ export function AppCallTransaction({ transaction }: Props) {
2525
{transaction.note && <TransactionNote note={transaction.note} />}
2626
{transaction.logs.length > 0 && <AppCallTransactionLogs logs={transaction.logs} />}
2727
<TransactionJson json={transaction.json} />
28-
{transaction.signature?.type === SignatureType.Multi && <Multisig signature={transaction.signature} />}
29-
{transaction.signature?.type === SignatureType.Logic && <Logicsig signature={transaction.signature} />}
28+
{transaction.signature?.type === SignatureType.Multi && <MultisigDetails signature={transaction.signature} />}
29+
{transaction.signature?.type === SignatureType.Logic && <LogicsigDetails signature={transaction.signature} />}
3030
</CardContent>
3131
</Card>
3232
</div>

src/features/transactions/components/app-call-transaction-info.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/features/common/components/tabs'
2-
import { AppCallTransactionModel, GlobalStateDelta, InnerAppCallTransactionModel, LocalStateDelta } from '../models'
2+
import { AppCallTransaction, GlobalStateDelta, InnerAppCallTransaction, LocalStateDelta } from '../models'
33
import { cn } from '@/features/common/utils'
44
import { useMemo } from 'react'
55
import { ColumnDef } from '@tanstack/react-table'
@@ -9,7 +9,7 @@ import { DescriptionList } from '@/features/common/components/description-list'
99
import { ellipseAddress } from '@/utils/ellipse-address'
1010

1111
type Props = {
12-
transaction: AppCallTransactionModel | InnerAppCallTransactionModel
12+
transaction: AppCallTransaction | InnerAppCallTransaction
1313
}
1414

1515
const applicationArgsTabId = 'application-args'

src/features/transactions/components/asset-config-transaction.tsx renamed to src/features/transactions/components/asset-config-transaction-details.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ import { cn } from '@/features/common/utils'
33
import { TransactionInfo } from './transaction-info'
44
import { TransactionNote } from './transaction-note'
55
import { TransactionJson } from './transaction-json'
6-
import { SignatureType, AssetConfigTransactionModel, InnerAssetConfigTransactionModel } from '../models'
7-
import { Multisig } from './multisig'
8-
import { Logicsig } from './logicsig'
6+
import { SignatureType, AssetConfigTransaction, InnerAssetConfigTransaction } from '../models'
7+
import { MultisigDetails } from './multisig-details'
8+
import { LogicsigDetails } from './logicsig-details'
99
import { TransactionViewTabs } from './transaction-view-tabs'
1010
import { AssetConfigTransactionInfo } from './asset-config-transaction-info'
1111

1212
type Props = {
13-
transaction: AssetConfigTransactionModel | InnerAssetConfigTransactionModel
13+
transaction: AssetConfigTransaction | InnerAssetConfigTransaction
1414
}
1515

16-
export function AssetConfigTransaction({ transaction }: Props) {
16+
export function AssetConfigTransactionDetails({ transaction }: Props) {
1717
return (
1818
<div className={cn('space-y-6 pt-7')}>
1919
<TransactionInfo transaction={transaction} />
@@ -23,8 +23,8 @@ export function AssetConfigTransaction({ transaction }: Props) {
2323
<TransactionViewTabs transaction={transaction} />
2424
{transaction.note && <TransactionNote note={transaction.note} />}
2525
<TransactionJson json={transaction.json} />
26-
{transaction.signature?.type === SignatureType.Multi && <Multisig signature={transaction.signature} />}
27-
{transaction.signature?.type === SignatureType.Logic && <Logicsig signature={transaction.signature} />}
26+
{transaction.signature?.type === SignatureType.Multi && <MultisigDetails signature={transaction.signature} />}
27+
{transaction.signature?.type === SignatureType.Logic && <LogicsigDetails signature={transaction.signature} />}
2828
</CardContent>
2929
</Card>
3030
</div>

0 commit comments

Comments
 (0)