@@ -11,12 +11,17 @@ import { ComponentHeader } from './ComponentHeader'
11
11
import { ComponentFlavorSelector } from './ComponentFlavorSelector'
12
12
import { ComponentDescription } from './ComponentDescription'
13
13
import { ComponentTabs } from './ComponentTabs'
14
- import { ActionsLogger , useActionsLogger } from './ActionsLogger'
14
+ import { ActionsLogger , useActionsLogger , ActionLoggerLogFn } from './ActionsLogger'
15
15
import { ComponentSettings } from './ComponentSettings'
16
16
import { Stories } from './Stories'
17
17
import { ChartMeta , ChartProperty , Flavor } from '../../types'
18
18
19
- interface ComponentTemplateProps < UnmappedProps extends object , Props extends object , Data > {
19
+ interface ComponentTemplateProps <
20
+ UnmappedProps extends object ,
21
+ MappedProps extends object ,
22
+ Data ,
23
+ ComponentProps extends object
24
+ > {
20
25
name : string
21
26
meta : ChartMeta
22
27
icon : string
@@ -32,22 +37,27 @@ interface ComponentTemplateProps<UnmappedProps extends object, Props extends obj
32
37
// initial props of the demo, unmapped
33
38
initialProperties : UnmappedProps
34
39
// default props as defined in the package component
35
- defaultProperties ?: Partial < Props >
36
- propertiesMapper ?: ( unmappedProps : UnmappedProps ) => Props
37
- codePropertiesMapper ?: Function
38
- hasData ?: boolean
39
- generateData ?: ( previousData ?: Data | null ) => Data | undefined
40
+ defaultProperties ?: Partial < ComponentProps >
41
+ propertiesMapper ?: ( props : UnmappedProps , data : Data ) => MappedProps
42
+ codePropertiesMapper ?: ( props : MappedProps , data : Data ) => MappedProps
43
+ generateData : ( previousData ?: Data | null ) => Data
40
44
dataKey ?: string
41
45
getDataSize ?: ( data : Data ) => number
42
46
getTabData ?: ( data : Data ) => Data
43
- children : ( properties : Props , data : Data , theme : NivoTheme , logAction : any ) => JSX . Element
47
+ children : (
48
+ properties : MappedProps ,
49
+ data : Data ,
50
+ theme : NivoTheme ,
51
+ logAction : ActionLoggerLogFn
52
+ ) => JSX . Element
44
53
image ?: IGatsbyImageData
45
54
}
46
55
47
56
export const ComponentTemplate = <
48
57
UnmappedProps extends object = any ,
49
- Props extends object = any ,
50
- Data = any
58
+ MappedProps extends object = any ,
59
+ Data = any ,
60
+ ComponentProps extends object = any
51
61
> ( {
52
62
name,
53
63
meta,
@@ -59,29 +69,30 @@ export const ComponentTemplate = <
59
69
defaultProperties = { } ,
60
70
propertiesMapper,
61
71
codePropertiesMapper,
62
- hasData = true ,
63
- generateData = ( ) => undefined ,
64
- dataKey,
72
+ generateData,
73
+ dataKey = 'data' ,
65
74
getDataSize,
66
75
getTabData = data => data ,
67
76
image,
68
77
children,
69
- } : ComponentTemplateProps < UnmappedProps , Props , Data > ) => {
78
+ } : ComponentTemplateProps < UnmappedProps , MappedProps , Data , ComponentProps > ) => {
70
79
const theme = useTheme ( )
71
80
72
- const [ settings , setSettings ] = useState ( initialProperties )
81
+ const [ settings , setSettings ] = useState < UnmappedProps > ( initialProperties )
82
+
83
+ const [ data , setData ] = useState < Data > ( ( ) => generateData ( ) )
73
84
74
- const initialData = useMemo ( ( ) => ( hasData ? generateData ( ) : null ) , [ ] )
75
- const [ data , setData ] = useState ( initialData )
76
85
const diceRoll = useCallback ( ( ) => {
77
86
setData ( currentData => generateData ( currentData ) )
78
- } , [ setData ] )
87
+ } , [ setData , generateData ] )
79
88
80
89
const [ actions , logAction ] = useActionsLogger ( )
81
90
82
- let mappedProperties = settings as unknown as Props
91
+ let mappedProperties : MappedProps
83
92
if ( propertiesMapper !== undefined ) {
84
93
mappedProperties = propertiesMapper ( settings , data )
94
+ } else {
95
+ mappedProperties = settings as unknown as MappedProps
85
96
}
86
97
87
98
let codeProperties = mappedProperties
@@ -92,7 +103,7 @@ export const ComponentTemplate = <
92
103
const code = generateChartCode ( `Responsive${ name } ` , codeProperties , {
93
104
pkg : meta . package ,
94
105
defaults : defaultProperties ,
95
- dataKey : hasData ? dataKey : undefined ,
106
+ dataKey : data !== undefined ? dataKey : undefined ,
96
107
} )
97
108
98
109
const hasStories = meta . stories !== undefined && meta . stories . length > 0
@@ -103,6 +114,8 @@ export const ComponentTemplate = <
103
114
104
115
const flavorKeys = useMemo ( ( ) => flavors . map ( flavor => flavor . flavor ) , [ flavors ] )
105
116
117
+ const tabData = useMemo ( ( ) => getTabData ( data ) , [ data ] )
118
+
106
119
return (
107
120
< Layout >
108
121
< ComponentPage >
@@ -113,12 +126,10 @@ export const ComponentTemplate = <
113
126
< ComponentTabs < Data >
114
127
chartClass = { icon }
115
128
code = { code }
116
- data = { hasData ? getTabData ( data ! ) : undefined }
129
+ data = { tabData }
117
130
dataKey = { dataKey }
118
- nodeCount = {
119
- hasData && getDataSize !== undefined ? getDataSize ( data ! ) : undefined
120
- }
121
- diceRoll = { hasData ? diceRoll : undefined }
131
+ nodeCount = { getDataSize !== undefined ? getDataSize ( data ) : undefined }
132
+ diceRoll = { data !== undefined ? diceRoll : undefined }
122
133
>
123
134
{ children ( mappedProperties , data , theme . nivo , logAction ) }
124
135
</ ComponentTabs >
0 commit comments