11import { IconChevronsRight } from '@tabler/icons-react' ;
22import { Flex } from 'antd' ;
33import Image from 'next/image' ;
4- import { useState } from 'react' ;
54import { twMerge } from 'tailwind-merge' ;
65import { Token } from '../hooks/useData' ;
76import { Data , Dataset } from '../utils/types' ;
@@ -18,65 +17,11 @@ const t: Dataset = {
1817
1918interface TokenListItemProps {
2019 asset : Token ;
21- index : number ;
22- selectedIndex ?: number ;
23- hasLoaded : boolean ;
24- tokens : Token [ ] ;
25- tokenDetails : Data [ ] ;
26- total : number ;
27- onSelectedIndexChange : ( index : number | undefined ) => void ;
28- }
29-
30- interface TokenDetailsButtonProps {
31- index : number ;
32- selectedIndex ?: number ;
3320 hasLoaded : boolean ;
34- isTokenDetailsOpen : boolean ;
3521 tokens : Token [ ] ;
3622 tokenDetails : Data [ ] ;
3723 total : number ;
38- onSelectedIndexChange : ( index : number | undefined ) => void ;
39- onTokenDetailsOpenChange : ( isOpen : boolean ) => void ;
40- }
41-
42- function TokenDetailsButton ( {
43- index,
44- selectedIndex,
45- hasLoaded,
46- isTokenDetailsOpen,
47- tokens,
48- tokenDetails,
49- total,
50- onSelectedIndexChange,
51- onTokenDetailsOpenChange,
52- } : TokenDetailsButtonProps ) {
53- return (
54- < div className = "hidden xs:flex items-center mx-0 xs:mx-2 md:mx-4 w-[50px] h-[50px] justify-center" >
55- < IconChevronsRight
56- className = { twMerge (
57- 'h-8 w-8 text-theme-content-strong dark:text-dark-theme-content-strong' ,
58- 'transition-all duration-500 group-hover:animate-pulse' ,
59- index === selectedIndex ? 'opacity-100' : 'opacity-0 group-hover:opacity-100' ,
60- ) }
61- onClick = { e => {
62- e . stopPropagation ( ) ;
63- onSelectedIndexChange ( index ) ;
64- onTokenDetailsOpenChange ( true ) ;
65- } }
66- />
67- { hasLoaded ? (
68- < TokenDetails
69- isOpen = { isTokenDetailsOpen }
70- onClose = { ( ) => onTokenDetailsOpenChange ( false ) }
71- tokens = { tokens }
72- data = { tokenDetails }
73- total = { total }
74- selectedIndex = { selectedIndex }
75- onSelectedIndexChange = { onSelectedIndexChange }
76- />
77- ) : null }
78- </ div >
79- ) ;
24+ setIsTokenDetailsOpen : ( isOpen : boolean ) => void ;
8025}
8126
8227export function TokenListLoading ( ) {
@@ -100,36 +45,9 @@ export function TokenListLoading() {
10045 ) ;
10146}
10247
103- export function TokenListItem ( {
104- asset,
105- index,
106- selectedIndex,
107- hasLoaded,
108- tokens,
109- tokenDetails,
110- total,
111- onSelectedIndexChange,
112- } : TokenListItemProps ) {
113- const [ isTokenDetailsOpen , setIsTokenDetailsOpen ] = useState ( false ) ;
114-
48+ export function TokenListItem ( { asset, hasLoaded } : TokenListItemProps ) {
11549 return (
116- < div
117- key = { asset . label }
118- className = { twMerge (
119- 'flex w-full border-b-2 last:border-b-0 border-theme-border dark:border-dark-theme-border' ,
120- 'group cursor-pointer select-none touch-none transition-colors duration-200 py-4' ,
121- selectedIndex === index
122- ? 'bg-theme-background-subtle dark:bg-dark-theme-background-subtle'
123- : 'hover:bg-theme-background-subtle dark:hover:bg-dark-theme-background-subtle [@media(hover:none)]:hover:bg-transparent [@media(hover:none)]:dark:hover:bg-transparent' ,
124- ) }
125- onClick = { ( ) => onSelectedIndexChange ( selectedIndex === index ? undefined : index ) }
126- onContextMenu = { e => {
127- e . preventDefault ( ) ;
128- e . stopPropagation ( ) ;
129- onSelectedIndexChange ( index ) ;
130- setIsTokenDetailsOpen ( true ) ;
131- } }
132- >
50+ < div className = "flex w-full" >
13351 < Image
13452 className = "rounded-full w-[50px] h-[50px] hidden 2xs:flex items-center mx-0 xs:mx-2 md:mx-4"
13553 src = { asset . image }
@@ -168,17 +86,58 @@ export function TokenListItem({
16886 </ Flex >
16987 < Privacy className = "font-bold text-lg text-right" amount = { asset . total } />
17088 </ div >
171- < TokenDetailsButton
172- index = { index }
173- selectedIndex = { selectedIndex }
174- hasLoaded = { hasLoaded }
175- isTokenDetailsOpen = { isTokenDetailsOpen }
176- tokens = { tokens }
177- tokenDetails = { tokenDetails }
178- total = { total }
179- onSelectedIndexChange = { onSelectedIndexChange }
180- onTokenDetailsOpenChange = { setIsTokenDetailsOpen }
89+ </ div >
90+ ) ;
91+ }
92+
93+ interface TokenDetailsButtonProps {
94+ index : number ;
95+ selectedIndex ?: number ;
96+ hasLoaded : boolean ;
97+ isTokenDetailsOpen : boolean ;
98+ tokens : Token [ ] ;
99+ tokenDetails : Data [ ] ;
100+ total : number ;
101+ onSelectedIndexChange : ( index : number | undefined ) => void ;
102+ onTokenDetailsOpenChange : ( isOpen : boolean ) => void ;
103+ }
104+
105+ export function TokenDetailsButton ( {
106+ index,
107+ selectedIndex,
108+ hasLoaded,
109+ isTokenDetailsOpen,
110+ tokens,
111+ tokenDetails,
112+ total,
113+ onSelectedIndexChange,
114+ onTokenDetailsOpenChange,
115+ } : TokenDetailsButtonProps ) {
116+ return (
117+ < div className = "hidden xs:flex self-center mx-0 xs:mx-2 md:mx-4 w-[50px] h-full justify-center" >
118+ < IconChevronsRight
119+ className = { twMerge (
120+ 'h-8 w-8 text-theme-content-strong dark:text-dark-theme-content-strong' ,
121+ 'transition-all duration-500 group-hover:animate-pulse' ,
122+ index === selectedIndex ? 'opacity-100' : 'opacity-0 group-hover:opacity-100' ,
123+ ) }
124+ onClick = { e => {
125+ e . stopPropagation ( ) ;
126+ onSelectedIndexChange ( index ) ;
127+ onTokenDetailsOpenChange ( true ) ;
128+ } }
181129 />
130+ { hasLoaded ? (
131+ < TokenDetails
132+ isOpen = { isTokenDetailsOpen }
133+ onClose = { ( ) => onTokenDetailsOpenChange ( false ) }
134+ tokens = { tokens }
135+ data = { tokenDetails }
136+ total = { total }
137+ selectedIndex = { selectedIndex }
138+ onSelectedIndexChange = { onSelectedIndexChange }
139+ />
140+ ) : null }
182141 </ div >
183142 ) ;
184143}
0 commit comments