Skip to content

Commit 962ec5f

Browse files
authored
Split activity cards in account information (#92)
1 parent 8afb88c commit 962ec5f

File tree

6 files changed

+171
-56
lines changed

6 files changed

+171
-56
lines changed

src/features/accounts/components/account-activity-tabs.tsx

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,16 @@
11
import { OverflowAutoTabsContent, Tabs, TabsList, TabsTrigger } from '@/features/common/components/tabs'
22
import { cn } from '@/features/common/utils'
33
import { useMemo } from 'react'
4-
import { AccountAssetsHeld } from './account-assets-held'
54
import { Account } from '../models'
65
import { AccountTransactionHistory } from './account-transaction-history'
76
import { AccountLiveTransactions } from './account-live-transactions'
87
import {
98
accountActivityLabel,
109
accountLiveTransactionsTabId,
11-
accountCreatedApplicationsTabId,
12-
accountCreatedAssetsTabId,
13-
accountHeldAssetsTabId,
1410
accountHistoricalTransactionsTabId,
15-
accountOptedApplicationsTabId,
1611
accountLiveTransactionsTabLabel,
1712
accountHistoricalTransactionsTabLabel,
18-
accountHeldAssetsTabLabel,
19-
accountCreatedAssetsTabLabel,
20-
accountCreatedApplicationsTabLabel,
21-
accountOptedApplicationsTabLabel,
22-
accountOptedAssetsTabId,
23-
accountOptedAssetsTabLabel,
2413
} from './labels'
25-
import { AccountAssetsCreated } from './account-assets-created'
26-
import { AccountAssetsOpted } from './account-assets-opted'
27-
import { AccountApplications } from './account-applications'
2814

2915
type Props = {
3016
account: Account
@@ -43,40 +29,8 @@ export function AccountActivityTabs({ account }: Props) {
4329
label: accountHistoricalTransactionsTabLabel,
4430
children: <AccountTransactionHistory address={account.address} />,
4531
},
46-
{
47-
id: accountHeldAssetsTabId,
48-
label: accountHeldAssetsTabLabel,
49-
children: <AccountAssetsHeld assetsHeld={account.assetsHeld} />,
50-
},
51-
{
52-
id: accountCreatedAssetsTabId,
53-
label: accountCreatedAssetsTabLabel,
54-
children: <AccountAssetsCreated assetsCreated={account.assetsCreated} />,
55-
},
56-
{
57-
id: accountOptedAssetsTabId,
58-
label: accountOptedAssetsTabLabel,
59-
children: <AccountAssetsOpted assetsOpted={account.assetsOpted} />,
60-
},
61-
{
62-
id: accountCreatedApplicationsTabId,
63-
label: accountCreatedApplicationsTabLabel,
64-
children: <AccountApplications applications={account.applicationsCreated} />,
65-
},
66-
{
67-
id: accountOptedApplicationsTabId,
68-
label: accountOptedApplicationsTabLabel,
69-
children: <AccountApplications applications={account.applicationsOpted} />,
70-
},
7132
],
72-
[
73-
account.address,
74-
account.applicationsCreated,
75-
account.applicationsOpted,
76-
account.assetsCreated,
77-
account.assetsHeld,
78-
account.assetsOpted,
79-
]
33+
[account.address]
8034
)
8135
return (
8236
<Tabs defaultValue={accountLiveTransactionsTabId}>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { OverflowAutoTabsContent, Tabs, TabsList, TabsTrigger } from '@/features/common/components/tabs'
2+
import { cn } from '@/features/common/utils'
3+
import { useMemo } from 'react'
4+
import { Account } from '../models'
5+
import {
6+
accountCreatedApplicationsTabId,
7+
accountOptedApplicationsTabId,
8+
accountCreatedApplicationsTabLabel,
9+
accountOptedApplicationsTabLabel,
10+
accountApplicationLabel,
11+
} from './labels'
12+
import { AccountApplications } from './account-applications'
13+
14+
type Props = {
15+
account: Account
16+
}
17+
18+
export function AccountApplicationTabs({ account }: Props) {
19+
const tabs = useMemo(
20+
() => [
21+
{
22+
id: accountCreatedApplicationsTabId,
23+
label: accountCreatedApplicationsTabLabel,
24+
children: <AccountApplications applications={account.applicationsCreated} />,
25+
},
26+
{
27+
id: accountOptedApplicationsTabId,
28+
label: accountOptedApplicationsTabLabel,
29+
children: <AccountApplications applications={account.applicationsOpted} />,
30+
},
31+
],
32+
[account.applicationsCreated, account.applicationsOpted]
33+
)
34+
return (
35+
<Tabs defaultValue={accountCreatedApplicationsTabId}>
36+
<TabsList aria-label={accountApplicationLabel}>
37+
{tabs.map((tab) => (
38+
<TabsTrigger key={tab.id} className={cn('data-[state=active]:border-primary data-[state=active]:border-b-2 w-36')} value={tab.id}>
39+
{tab.label}
40+
</TabsTrigger>
41+
))}
42+
</TabsList>
43+
{tabs.map((tab) => (
44+
<OverflowAutoTabsContent key={tab.id} value={tab.id} className={cn('border-solid border-2 border-border')}>
45+
<div className="grid">
46+
<div className="overflow-auto p-4">{tab.children}</div>
47+
</div>
48+
</OverflowAutoTabsContent>
49+
))}
50+
</Tabs>
51+
)
52+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { OverflowAutoTabsContent, Tabs, TabsList, TabsTrigger } from '@/features/common/components/tabs'
2+
import { cn } from '@/features/common/utils'
3+
import { useMemo } from 'react'
4+
import { AccountAssetsHeld } from './account-assets-held'
5+
import { Account } from '../models'
6+
import {
7+
accountCreatedAssetsTabId,
8+
accountHeldAssetsTabId,
9+
accountHeldAssetsTabLabel,
10+
accountCreatedAssetsTabLabel,
11+
accountOptedAssetsTabId,
12+
accountOptedAssetsTabLabel,
13+
accountAssetLabel,
14+
} from './labels'
15+
import { AccountAssetsCreated } from './account-assets-created'
16+
import { AccountAssetsOpted } from './account-assets-opted'
17+
18+
type Props = {
19+
account: Account
20+
}
21+
22+
export function AccountAssetTabs({ account }: Props) {
23+
const tabs = useMemo(
24+
() => [
25+
{
26+
id: accountHeldAssetsTabId,
27+
label: accountHeldAssetsTabLabel,
28+
children: <AccountAssetsHeld assetsHeld={account.assetsHeld} />,
29+
},
30+
{
31+
id: accountCreatedAssetsTabId,
32+
label: accountCreatedAssetsTabLabel,
33+
children: <AccountAssetsCreated assetsCreated={account.assetsCreated} />,
34+
},
35+
{
36+
id: accountOptedAssetsTabId,
37+
label: accountOptedAssetsTabLabel,
38+
children: <AccountAssetsOpted assetsOpted={account.assetsOpted} />,
39+
},
40+
],
41+
[account.assetsCreated, account.assetsHeld, account.assetsOpted]
42+
)
43+
return (
44+
<Tabs defaultValue={accountHeldAssetsTabId}>
45+
<TabsList aria-label={accountAssetLabel}>
46+
{tabs.map((tab) => (
47+
<TabsTrigger key={tab.id} className={cn('data-[state=active]:border-primary data-[state=active]:border-b-2 w-36')} value={tab.id}>
48+
{tab.label}
49+
</TabsTrigger>
50+
))}
51+
</TabsList>
52+
{tabs.map((tab) => (
53+
<OverflowAutoTabsContent key={tab.id} value={tab.id} className={cn('border-solid border-2 border-border')}>
54+
<div className="grid">
55+
<div className="overflow-auto p-4">{tab.children}</div>
56+
</div>
57+
</OverflowAutoTabsContent>
58+
))}
59+
</Tabs>
60+
)
61+
}

src/features/accounts/components/account-details.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import { Account } from '../models'
33
import { cn } from '@/features/common/utils'
44
import { AccountActivityTabs } from './account-activity-tabs'
55
import { AccountInfo } from './account-info'
6-
import { accountActivityLabel, accountJsonLabel } from './labels'
6+
import { accountActivityLabel, accountApplicationLabel, accountAssetLabel, accountJsonLabel } from './labels'
77
import { JsonView } from '@/features/common/components/json-view'
8+
import { AccountAssetTabs } from './account-asset-tabs'
9+
import { AccountApplicationTabs } from './account-application-tabs'
810

911
type Props = {
1012
account: Account
@@ -22,6 +24,24 @@ export function AccountDetails({ account }: Props) {
2224
</div>
2325
</CardContent>
2426
</Card>
27+
28+
<Card className={cn('p-4')}>
29+
<CardContent className={cn('text-sm space-y-2')}>
30+
<h1 className={cn('text-2xl text-primary font-bold')}>{accountAssetLabel}</h1>
31+
<div className={cn('border-solid border-2 border-border grid')}>
32+
<AccountAssetTabs account={account} />
33+
</div>
34+
</CardContent>
35+
</Card>
36+
<Card className={cn('p-4')}>
37+
<CardContent className={cn('text-sm space-y-2')}>
38+
<h1 className={cn('text-2xl text-primary font-bold')}>{accountApplicationLabel}</h1>
39+
<div className={cn('border-solid border-2 border-border grid')}>
40+
<AccountApplicationTabs account={account} />
41+
</div>
42+
</CardContent>
43+
</Card>
44+
2545
<Card className={cn('p-4')}>
2646
<CardContent aria-label={accountJsonLabel} className={cn('text-sm space-y-2')}>
2747
<h1 className={cn('text-2xl text-primary font-bold')}>{accountJsonLabel}</h1>

src/features/accounts/components/labels.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
export const accountJsonLabel = 'Account JSON'
22
export const accountActivityLabel = 'Activity'
3+
export const accountAssetLabel = 'Assets'
4+
export const accountApplicationLabel = 'Applications'
35

46
export const accountLiveTransactionsTabLabel = 'Live Transactions'
57
export const accountHistoricalTransactionsTabLabel = 'Historical Transactions'
6-
export const accountHeldAssetsTabLabel = 'Held Assets'
7-
export const accountCreatedAssetsTabLabel = 'Created Assets'
8-
export const accountOptedAssetsTabLabel = 'Opted Assets'
9-
export const accountCreatedApplicationsTabLabel = 'Created Applications'
10-
export const accountOptedApplicationsTabLabel = 'Opted Applications'
8+
export const accountHeldAssetsTabLabel = 'Held'
9+
export const accountCreatedAssetsTabLabel = 'Created'
10+
export const accountOptedAssetsTabLabel = 'Opted'
11+
export const accountCreatedApplicationsTabLabel = 'Created'
12+
export const accountOptedApplicationsTabLabel = 'Opted'
1113

1214
export const accountLiveTransactionsTabId = 'live-transactions'
1315
export const accountHistoricalTransactionsTabId = 'historical-transactions'

src/features/accounts/pages/account-page.test.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020
accountAssetsOptedInLabel,
2121
accountActivityLabel,
2222
accountRekeyedToLabel,
23+
accountAssetLabel,
24+
accountApplicationLabel,
2325
} from '../components/labels'
2426
import { assetResultsAtom } from '@/features/assets/data'
2527
import { assetResultMother } from '@/tests/object-mother/asset-result'
@@ -91,7 +93,15 @@ describe('account-page', () => {
9193
})
9294
const activityTabList = component.getByRole('tablist', { name: accountActivityLabel })
9395
expect(activityTabList).toBeTruthy()
94-
expect(activityTabList.children.length).toBe(7)
96+
expect(activityTabList.children.length).toBe(2)
97+
98+
const assetTabList = component.getByRole('tablist', { name: accountAssetLabel })
99+
expect(assetTabList).toBeTruthy()
100+
expect(assetTabList.children.length).toBe(3)
101+
102+
const applicationTabList = component.getByRole('tablist', { name: accountApplicationLabel })
103+
expect(applicationTabList).toBeTruthy()
104+
expect(applicationTabList.children.length).toBe(2)
95105
})
96106
}
97107
)
@@ -136,7 +146,15 @@ describe('account-page', () => {
136146
})
137147
const activityTabList = component.getByRole('tablist', { name: accountActivityLabel })
138148
expect(activityTabList).toBeTruthy()
139-
expect(activityTabList.children.length).toBe(7)
149+
expect(activityTabList.children.length).toBe(2)
150+
151+
const assetTabList = component.getByRole('tablist', { name: accountAssetLabel })
152+
expect(assetTabList).toBeTruthy()
153+
expect(assetTabList.children.length).toBe(3)
154+
155+
const applicationTabList = component.getByRole('tablist', { name: accountApplicationLabel })
156+
expect(applicationTabList).toBeTruthy()
157+
expect(applicationTabList.children.length).toBe(2)
140158
})
141159
}
142160
)
@@ -173,7 +191,15 @@ describe('account-page', () => {
173191
})
174192
const activityTabList = component.getByRole('tablist', { name: accountActivityLabel })
175193
expect(activityTabList).toBeTruthy()
176-
expect(activityTabList.children.length).toBe(7)
194+
expect(activityTabList.children.length).toBe(2)
195+
196+
const assetTabList = component.getByRole('tablist', { name: accountAssetLabel })
197+
expect(assetTabList).toBeTruthy()
198+
expect(assetTabList.children.length).toBe(3)
199+
200+
const applicationTabList = component.getByRole('tablist', { name: accountApplicationLabel })
201+
expect(applicationTabList).toBeTruthy()
202+
expect(applicationTabList.children.length).toBe(2)
177203
})
178204
}
179205
)

0 commit comments

Comments
 (0)