Skip to content

Commit 53399e4

Browse files
committed
Add transaction card to instance details
1 parent 5a82b27 commit 53399e4

4 files changed

Lines changed: 110 additions & 0 deletions

File tree

.changelog/1895.bugfix.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Create ROFL app instance details page
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { FC } from 'react'
2+
import Box from '@mui/material/Box'
3+
import { useScreenSize } from '../../hooks/useScreensize'
4+
import { NUMBER_OF_ITEMS_ON_SEPARATE_PAGE } from '../../config'
5+
import { transactionsContainerId } from '../../utils/tabAnchors'
6+
import { LinkableCardLayout } from '../../components/LinkableCardLayout'
7+
import { RuntimeTransactions } from '../../components/Transactions'
8+
import { RuntimeTransactionTypeFilter } from '../../components/Transactions/RuntimeTransactionTypeFilter'
9+
import { RoflAppInstanceDetailsContext, useRoflAppInstanceRakTransactions } from './hooks'
10+
11+
export const RoflAppInstanceRakTransactionsCard: FC<RoflAppInstanceDetailsContext> = context => {
12+
const { method, setMethod, scope } = context
13+
const { isMobile } = useScreenSize()
14+
15+
return (
16+
<LinkableCardLayout
17+
containerId={transactionsContainerId}
18+
title={
19+
<Box
20+
sx={{
21+
display: 'flex',
22+
justifyContent: 'end',
23+
}}
24+
>
25+
{!isMobile && (
26+
<RuntimeTransactionTypeFilter layer={scope.layer} value={method} setValue={setMethod} />
27+
)}
28+
</Box>
29+
}
30+
>
31+
{isMobile && (
32+
<RuntimeTransactionTypeFilter layer={scope.layer} value={method} setValue={setMethod} expand />
33+
)}
34+
<RoflAppInstanceRakTransactions {...context} />
35+
</LinkableCardLayout>
36+
)
37+
}
38+
39+
const RoflAppInstanceRakTransactions: FC<RoflAppInstanceDetailsContext> = ({ scope, id, rak, method }) => {
40+
const { isLoading, transactions, pagination, totalCount, isTotalCountClipped } =
41+
useRoflAppInstanceRakTransactions(scope, id, rak, method)
42+
43+
return (
44+
<RuntimeTransactions
45+
transactions={transactions}
46+
isLoading={isLoading}
47+
limit={NUMBER_OF_ITEMS_ON_SEPARATE_PAGE}
48+
pagination={{
49+
selectedPage: pagination.selectedPage,
50+
linkToPage: pagination.linkToPage,
51+
totalCount,
52+
isTotalCountClipped,
53+
rowsPerPage: NUMBER_OF_ITEMS_ON_SEPARATE_PAGE,
54+
}}
55+
filtered={method !== 'any'}
56+
/>
57+
)
58+
}

src/app/pages/RoflAppInstanceDetailsPage/hooks.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { useOutletContext } from 'react-router-dom'
2+
import { Layer, useGetRuntimeRoflAppsIdInstancesRakTransactions } from '../../../oasis-nexus/api'
3+
import { AppErrors } from '../../../types/errors'
24
import { SearchScope } from '../../../types/searchScope'
5+
import { NUMBER_OF_ITEMS_ON_SEPARATE_PAGE as limit } from '../../config'
6+
import { getRuntimeTransactionMethodFilteringParam } from '../../components/RuntimeTransactionMethod'
7+
import { useSearchParamsPagination } from '../..//components/Table/useSearchParamsPagination'
38

49
export type RoflAppInstanceDetailsContext = {
510
scope: SearchScope
@@ -10,3 +15,41 @@ export type RoflAppInstanceDetailsContext = {
1015
}
1116

1217
export const useRoflAppInstanceDetailsProps = () => useOutletContext<RoflAppInstanceDetailsContext>()
18+
19+
export const useRoflAppInstanceRakTransactions = (
20+
scope: SearchScope,
21+
id: string,
22+
rak: string,
23+
method: string,
24+
) => {
25+
const { network, layer } = scope
26+
const pagination = useSearchParamsPagination('page')
27+
const offset = (pagination.selectedPage - 1) * limit
28+
if (layer !== Layer.sapphire) {
29+
throw AppErrors.UnsupportedLayer
30+
}
31+
32+
const query = useGetRuntimeRoflAppsIdInstancesRakTransactions(network, Layer.sapphire, id, rak, {
33+
limit,
34+
offset: offset,
35+
...getRuntimeTransactionMethodFilteringParam(method),
36+
})
37+
const { isFetched, isLoading, data } = query
38+
const transactions = data?.data.transactions
39+
40+
if (isFetched && pagination.selectedPage > 1 && !transactions?.length) {
41+
throw AppErrors.PageDoesNotExist
42+
}
43+
44+
const totalCount = data?.data.total_count
45+
const isTotalCountClipped = data?.data.is_total_count_clipped
46+
47+
return {
48+
isLoading,
49+
isFetched,
50+
transactions,
51+
pagination,
52+
totalCount,
53+
isTotalCountClipped,
54+
}
55+
}

src/routes.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ import { useRoflAppDetailsProps } from './app/pages/RoflAppDetailsPage/hooks'
7575
import { RoflAppUpdatesCard } from './app/pages/RoflAppDetailsPage/RoflAppUpdatesCard'
7676
import { RoflAppInstanceTransactionsCard } from 'app/pages/RoflAppDetailsPage/RoflAppInstanceTransactionsCard'
7777
import { RoflAppInstanceDetailsPage } from 'app/pages/RoflAppInstanceDetailsPage'
78+
import { useRoflAppInstanceDetailsProps } from 'app/pages/RoflAppInstanceDetailsPage/hooks'
79+
import { RoflAppInstanceRakTransactionsCard } from 'app/pages/RoflAppInstanceDetailsPage/RoflAppInstanceRakTransactionsCard'
7880

7981
const ScopeSpecificPart = () => {
8082
const { network, layer } = useRequiredScopeParam()
@@ -330,6 +332,12 @@ export const routes: RouteObject[] = [
330332
path: `rofl/app/:id/instance/:rak`,
331333
element: <RoflAppInstanceDetailsPage />,
332334
loader: roflAppParamLoader(),
335+
children: [
336+
{
337+
path: '',
338+
Component: () => <RoflAppInstanceRakTransactionsCard {...useRoflAppInstanceDetailsProps()} />,
339+
},
340+
],
333341
},
334342
],
335343
},

0 commit comments

Comments
 (0)