11import React , { useCallback , useState } from 'react' ;
2+
23import CardView , { Column , HeaderFilter , SearchPanel , Paging } from 'devextreme-react/card-view' ;
4+ import type { CardViewTypes } from 'devextreme-react/card-view' ;
35import Popup , { Position } from 'devextreme-react/popup' ;
4- import { Vehicle , vehicles } from './data.ts' ;
5- import VehicleCard from './VehicleCard.tsx' ;
6+
7+ import { vehicles } from './data.ts' ;
8+ import type { Vehicle } from './types.ts' ;
69import LicenseInfo from './LicenseInfo.tsx' ;
10+ import VehicleCard from './VehicleCard.tsx' ;
711
8- const getFormattedPrice = ( card : any ) : string => {
9- const priceText = card . fields . find ( ( f ) => f ?. column ?. dataField === 'Price' ) ;
12+ const getFormattedPrice = ( card : CardViewTypes . CardInfo ) : string => {
13+ const priceText = card . fields ? .find ( ( f : CardViewTypes . FieldInfo ) => f ?. column ?. dataField === 'Price' ) ;
1014 return priceText ?. text ?? '' ;
1115} ;
1216
@@ -23,27 +27,33 @@ const App = () => {
2327 setPopupVisible ( false ) ;
2428 } , [ ] ) ;
2529
30+ const cardRender = useCallback ( ( model : CardViewTypes . CardTemplateData ) => {
31+ const vehicle = model . card . data as Vehicle ;
32+ return < VehicleCard
33+ vehicle = { vehicle }
34+ id = { vehicle . ID }
35+ model = { `${ vehicle . TrademarkName } ${ vehicle . Name } ` }
36+ price = { getFormattedPrice ( model . card ) }
37+ categoryName = { vehicle . CategoryName }
38+ modification = { vehicle . Modification }
39+ bodyStyleName = { vehicle . BodyStyleName }
40+ horsepower = { vehicle . Horsepower }
41+ onShowInfo = { showInfo }
42+ /> ;
43+ } , [ showInfo ] ) ;
44+
45+ const contentRender = useCallback ( ( ) => (
46+ currentVehicle ? < LicenseInfo vehicle = { currentVehicle } /> : null
47+ ) , [ currentVehicle ] ) ;
48+
2649 return (
27- < React . Fragment >
50+ < >
2851 < CardView
2952 dataSource = { vehicles }
3053 height = { 1120 }
3154 cardsPerRow = "auto"
3255 cardMinWidth = { 240 }
33- cardRender = { ( model ) => {
34- const vehicle = model . card . data ;
35- return < VehicleCard
36- vehicle = { vehicle }
37- id = { vehicle . ID }
38- model = { `${ vehicle . TrademarkName } ${ vehicle . Name } ` }
39- price = { getFormattedPrice ( model . card ) }
40- categoryName = { vehicle . CategoryName }
41- modification = { vehicle . Modification }
42- bodyStyleName = { vehicle . BodyStyleName }
43- horsepower = { vehicle . Horsepower }
44- onShowInfo = { showInfo }
45- /> ;
46- } }
56+ cardRender = { cardRender }
4757 >
4858 < HeaderFilter visible = { true } />
4959 < SearchPanel visible = { true } />
@@ -83,13 +93,11 @@ const App = () => {
8393 hideOnOutsideClick = { true }
8494 title = "Image Info"
8595 onHiding = { hideInfo }
86- contentRender = { ( ) =>
87- currentVehicle ? < LicenseInfo vehicle = { currentVehicle } /> : null
88- }
96+ contentRender = { contentRender }
8997 >
9098 < Position at = "center" my = "center" collision = "fit" />
9199 </ Popup >
92- </ React . Fragment >
100+ </ >
93101 ) ;
94102} ;
95103
0 commit comments