1
1
import { useEffect , useState , useMemo } from 'react'
2
- import { Select , Stack , Group , Badge , Text , Loader , Code , NumberFormatter } from '@mantine/core'
2
+ import {
3
+ Select ,
4
+ Stack ,
5
+ Group ,
6
+ Badge ,
7
+ Text ,
8
+ Loader ,
9
+ Code ,
10
+ NumberFormatter ,
11
+ MultiSelect ,
12
+ Fieldset ,
13
+ Divider
14
+ } from '@mantine/core'
3
15
import { SSPs , RequestStatPlacement , SSPsAnalyticsDataQuery } from 'types'
4
16
import useSSPsAnalytics from 'hooks/useCampaignAnalytics/useSSPsAnalytics'
5
17
import CustomTable , { DataElement } from 'components/common/CustomTable'
6
- import { removeOptionalEmptyStringProps } from 'helpers'
18
+ import { removeOptionalEmptyStringProps , getEnumKeyByValue } from 'helpers'
7
19
import DownloadCSV from 'components/common/DownloadCSV'
20
+ import { CountryData } from 'helpers/countries'
21
+ import { IabTaxonomyV3 } from 'adex-common'
22
+ import { CATEGORIES , CAT_GROUPS , COUNTRIES , REGION_GROUPS } from 'constants/createCampaign'
23
+ import MultiSelectAndRadioButtons from 'components/CreateCampaign/StepTwo/MultiSelectAndRadioButtons'
24
+ import useCreateCampaignContext from 'hooks/useCreateCampaignContext'
8
25
9
26
const sspsData : Array < { value : SSPs | '' ; label : string } > = [
10
27
{ value : '' , label : 'All SSPs' } ,
@@ -31,6 +48,38 @@ const groupByData: Array<{ value: string; label: string }> = [
31
48
{ value : 'format' , label : 'format' }
32
49
]
33
50
51
+ const mapSegmentLabel = (
52
+ type : SSPsAnalyticsDataQuery [ 'groupBy' ] ,
53
+ segment : string | number
54
+ ) : { label : string } => {
55
+ let label = ( segment || '' ) . toString ( )
56
+
57
+ switch ( type ) {
58
+ case 'country' :
59
+ label = `${ CountryData . get ( segment . toString ( ) . toUpperCase ( ) ) ?. name } (${ segment
60
+ . toString ( )
61
+ . toUpperCase ( ) } )`
62
+ break
63
+ case 'category' :
64
+ label = `${ getEnumKeyByValue (
65
+ IabTaxonomyV3 ,
66
+ segment . toString ( ) . toUpperCase ( ) || ''
67
+ ) } (${ segment . toString ( ) . toUpperCase ( ) } )`
68
+ break
69
+
70
+ case 'placement' :
71
+ label = getEnumKeyByValue ( RequestStatPlacement , segment )
72
+ break
73
+
74
+ default :
75
+ break
76
+ }
77
+
78
+ return {
79
+ label
80
+ }
81
+ }
82
+
34
83
const SSPsAnalytics = ( {
35
84
country,
36
85
category,
@@ -40,6 +89,10 @@ const SSPsAnalytics = ({
40
89
country ?: SSPsAnalyticsDataQuery [ 'country' ]
41
90
format ?: string [ ]
42
91
} ) => {
92
+ // TODO: get all formats once then use it for src
93
+ // NOTE: temp
94
+ const { allowedBannerSizes } = useCreateCampaignContext ( )
95
+
43
96
const [ analyticsKey , setAnalyticsKey ] = useState <
44
97
| {
45
98
key : string
@@ -51,16 +104,20 @@ const SSPsAnalytics = ({
51
104
const [ groupBy , setGrop ] = useState < SSPsAnalyticsDataQuery [ 'groupBy' ] > ( 'country' )
52
105
const [ placement , setPlacement ] = useState < RequestStatPlacement | '' > ( '' )
53
106
const { analyticsData, getAnalyticsKeyAndUpdate } = useSSPsAnalytics ( )
107
+ const [ selectedCountries , setCountries ] = useState < SSPsAnalyticsDataQuery [ 'country' ] > (
108
+ country || { values : [ ] , operator : 'in' }
109
+ )
110
+ const [ selectedCategories , setCategories ] = useState < SSPsAnalyticsDataQuery [ 'category' ] > (
111
+ category || { values : [ ] , operator : 'in' }
112
+ )
113
+
114
+ const [ selectedFormats , setFormats ] = useState < string [ ] > ( format || [ ] )
54
115
55
116
const analytics = useMemo (
56
117
( ) => analyticsData . get ( analyticsKey ?. key || '' ) ,
57
118
[ analyticsData , analyticsKey ]
58
119
)
59
120
60
- useEffect ( ( ) => {
61
- console . log ( { analytics } )
62
- } , [ analytics ] )
63
-
64
121
useEffect ( ( ) => {
65
122
setAnalyticsKey ( undefined )
66
123
@@ -69,9 +126,9 @@ const SSPsAnalytics = ({
69
126
...removeOptionalEmptyStringProps ( {
70
127
ssp,
71
128
placement,
72
- category,
73
- country,
74
- format
129
+ category : selectedCategories ,
130
+ country : selectedCountries ,
131
+ format : selectedFormats
75
132
} ) ,
76
133
groupBy
77
134
} )
@@ -80,7 +137,18 @@ const SSPsAnalytics = ({
80
137
}
81
138
82
139
checkAnalytics ( )
83
- } , [ category , country , format , getAnalyticsKeyAndUpdate , groupBy , placement , ssp ] )
140
+ } , [
141
+ category ,
142
+ country ,
143
+ format ,
144
+ getAnalyticsKeyAndUpdate ,
145
+ groupBy ,
146
+ placement ,
147
+ selectedCategories ,
148
+ selectedCountries ,
149
+ selectedFormats ,
150
+ ssp
151
+ ] )
84
152
85
153
const loading = useMemo ( ( ) => analytics ?. status === 'loading' , [ analytics ] )
86
154
@@ -91,45 +159,103 @@ const SSPsAnalytics = ({
91
159
return {
92
160
id : value . toString ( ) + count . toString ( ) ,
93
161
columns : [
94
- { value : value . toString ( ) , label : value . toString ( ) } ,
162
+ {
163
+ value : value . toString ( ) ,
164
+ element : mapSegmentLabel ( groupBy , value ) . label
165
+ } ,
95
166
{ value : count , element : < NumberFormatter value = { count } thousandSeparator /> }
96
167
]
97
168
}
98
169
} ) || [ ] ,
99
170
totalRequests : analytics ?. data . reduce ( ( sum , i ) => sum + i . count , 0 ) || 0
100
171
}
101
- } , [ analytics ] )
172
+ } , [ analytics ?. data , groupBy ] )
102
173
103
174
return (
104
175
< Stack gap = "xs" >
105
176
< Text size = "sm" inline c = "purple" >
106
177
* This analytics are for the actual processed request from our SSRs (oRtb: BidRequest) for
107
178
the < strong > 48 hours</ strong >
108
179
</ Text >
109
- < Group align = "start" justify = "left" gap = "xs" >
110
- < Select
111
- label = "Group by"
112
- value = { groupBy }
113
- onChange = { ( val ) => setGrop ( val as SSPsAnalyticsDataQuery [ 'groupBy' ] ) }
114
- data = { groupByData }
115
- size = "md"
116
- />
117
- < Select
118
- label = "SSP"
119
- value = { ssp }
120
- onChange = { ( val ) => setSsp ( val as SSPs ) }
121
- data = { sspsData }
122
- size = "md"
123
- />
124
- < Select
125
- label = "Placement"
126
- value = { placement ?. toString ( ) }
127
- // @ts -ignore
128
- onChange = { ( val ) => setPlacement ( val !== '' ? Number ( val ) : val ) }
129
- data = { placementsData }
130
- size = "md"
131
- />
132
- </ Group >
180
+ < Fieldset >
181
+ < Stack >
182
+ < Group align = "start" justify = "left" gap = "xl" grow >
183
+ < Stack gap = "xs" >
184
+ < Select
185
+ label = "Group by"
186
+ value = { groupBy }
187
+ onChange = { ( val ) => setGrop ( val as SSPsAnalyticsDataQuery [ 'groupBy' ] ) }
188
+ data = { groupByData }
189
+ searchable
190
+ size = "sm"
191
+ />
192
+ < MultiSelect
193
+ label = "Formats"
194
+ value = { selectedFormats }
195
+ onChange = { setFormats }
196
+ data = { allowedBannerSizes }
197
+ clearable
198
+ searchable
199
+ size = "sm"
200
+ />
201
+ </ Stack >
202
+ < Stack >
203
+ < Select
204
+ label = "SSP"
205
+ value = { ssp }
206
+ onChange = { ( val ) => setSsp ( val as SSPs ) }
207
+ data = { sspsData }
208
+ searchable
209
+ size = "sm"
210
+ />
211
+ < Select
212
+ label = "Placement"
213
+ value = { placement ?. toString ( ) }
214
+ // @ts -ignore
215
+ onChange = { ( val ) => setPlacement ( val !== '' ? Number ( val ) : val ) }
216
+ data = { placementsData }
217
+ size = "sm"
218
+ />
219
+ </ Stack >
220
+ </ Group >
221
+
222
+ < Group grow gap = "xl" align = "baseline" >
223
+ < Stack >
224
+ < Divider size = "md" label = "Categories" color = "mainText" />
225
+ < MultiSelectAndRadioButtons
226
+ onCategoriesChange = { ( selectedRadio , values ) =>
227
+ setCategories ( {
228
+ values : values as IabTaxonomyV3 [ ] ,
229
+ operator : selectedRadio === 'all' ? undefined : selectedRadio
230
+ } )
231
+ }
232
+ multiSelectData = { CATEGORIES }
233
+ defaultRadioValue = { selectedCategories ?. operator }
234
+ defaultSelectValue = { selectedCategories ?. values }
235
+ groups = { CAT_GROUPS }
236
+ label = "Categories"
237
+ />
238
+ </ Stack >
239
+ < Stack >
240
+ < Divider size = "md" label = "Countries" color = "mainText" />
241
+
242
+ < MultiSelectAndRadioButtons
243
+ onCategoriesChange = { ( selectedRadio , values ) =>
244
+ setCountries ( {
245
+ values,
246
+ operator : selectedRadio === 'all' ? undefined : selectedRadio
247
+ } )
248
+ }
249
+ defaultRadioValue = { selectedCountries ?. operator }
250
+ defaultSelectValue = { selectedCountries ?. values }
251
+ multiSelectData = { COUNTRIES }
252
+ groups = { REGION_GROUPS }
253
+ label = "Countries"
254
+ />
255
+ </ Stack >
256
+ </ Group >
257
+ </ Stack >
258
+ </ Fieldset >
133
259
< Group align = "center" justify = "left" gap = "xs" pos = "relative" >
134
260
< Badge size = "lg" leftSection = "Total requests" >
135
261
{ loading ? < Loader type = "dots" color = "white" /> : data . totalRequests . toLocaleString ( ) }
@@ -156,7 +282,18 @@ const SSPsAnalytics = ({
156
282
loading = { loading }
157
283
/>
158
284
< Code block >
159
- { JSON . stringify ( { ssp, placement, category, country, format, groupBy } , null , 2 ) }
285
+ { JSON . stringify (
286
+ {
287
+ ssp,
288
+ placement,
289
+ category : selectedCategories ,
290
+ country : selectedCountries ,
291
+ format,
292
+ groupBy
293
+ } ,
294
+ null ,
295
+ 2
296
+ ) }
160
297
</ Code >
161
298
</ Stack >
162
299
</ Stack >
0 commit comments