@@ -16,6 +16,31 @@ interface Props {
1616 compactLayout ?: boolean
1717}
1818
19+ const lightColors : string [ ] = [
20+ "#F72585" ,
21+ "#B5179E" ,
22+ "#7209B7" ,
23+ "#480CA8" ,
24+ "#4361EE" ,
25+ "#009688" ,
26+ "#FB8500" ,
27+ "#1B4332" ,
28+ "#795548" ,
29+ "#DC2F02" ,
30+ ]
31+ const darkColors : string [ ] = [
32+ "#4CC9F0" ,
33+ "#FFB703" ,
34+ "#74C69D" ,
35+ "#FEE440" ,
36+ "#00F5D4" ,
37+ "#F15BB5" ,
38+ "#BD96EE" ,
39+ "#FF85A1" ,
40+ "#4AD66D" ,
41+ "#BEBFC4" ,
42+ ]
43+
1944const getPercentageValue = ( value : number , total : number ) : string =>
2045 `${ ( ( value / total ) * 100 ) . toFixed ( 0 ) } %`
2146
@@ -29,37 +54,12 @@ const UsageBar: React.FC<Props> = ({
2954} ) => {
3055 const [ formattedItems , setFormattedItems ] = React . useState < Item [ ] > ( [ ] )
3156
32- const lightColors : string [ ] = [
33- "#F72585" ,
34- "#B5179E" ,
35- "#7209B7" ,
36- "#480CA8" ,
37- "#4361EE" ,
38- "#009688" ,
39- "#FB8500" ,
40- "#1B4332" ,
41- "#795548" ,
42- "#DC2F02" ,
43- ]
44- const darkColors : string [ ] = [
45- "#4CC9F0" ,
46- "#FFB703" ,
47- "#74C69D" ,
48- "#FEE440" ,
49- "#00F5D4" ,
50- "#F15BB5" ,
51- "#BD96EE" ,
52- "#FF85A1" ,
53- "#4AD66D" ,
54- "#BEBFC4" ,
55- ]
56-
5757 /**
58- * Checks if the total value is less than the sum of all the elements values.
58+ * Checks if the total value is equal or greater than the sum of all the elements values.
5959 */
60- const uncorrectValues = React . useMemo (
60+ const itemsValuesAreCorrect = React . useMemo (
6161 ( ) : boolean =>
62- total <
62+ total >=
6363 items . reduce ( ( tot : number , element : Item ) => tot + element . value , 0 ) ,
6464 [ items , total ]
6565 )
@@ -70,7 +70,7 @@ const UsageBar: React.FC<Props> = ({
7070 */
7171 const formatItemsArray = React . useCallback ( ( ) => {
7272 const selectedColors : string [ ] = [ ]
73- const colorsToPickFrom = darkMode ? darkColors : lightColors
73+ const colorsToPickFrom = darkMode ? [ ... darkColors ] : [ ... lightColors ]
7474
7575 // For each element a random index is generated and then used to pick a value
7676 // from the colorsToPickFrom array; the selected value is removed by its original array
@@ -92,63 +92,28 @@ const UsageBar: React.FC<Props> = ({
9292 } , [ items , darkMode ] )
9393
9494 React . useEffect ( ( ) => {
95- if ( uncorrectValues ) return
96- formatItemsArray ( )
97- } , [ items , uncorrectValues , formatItemsArray ] )
98-
99- const renderUsageBar = ( ) => {
100- if ( compactLayout ) {
101- return (
102- < div
103- className = { `c-UsageBar c-UsageBar__compact ${
104- darkMode ? "u-UsageBar-dark" : "u-UsageBar-light"
105- } `}
106- >
107- < div className = "o-UsageBar__bar o-UsageBar__compact__bar" >
108- { formattedItems . map ( ( element : Item , index : number ) => {
109- return (
110- < div
111- key = { index }
112- className = "o-UsageBar__bar__element"
113- style = { {
114- width : getPercentageValue ( element . value , total ) ,
115- backgroundColor : element . color ,
116- } }
117- />
118- )
119- } ) }
120- </ div >
121- { ! removeLabels && (
122- < div className = "o-UsageBar__bar__elements__labels__container" >
123- { formattedItems . map ( ( element : Item , index : number ) => {
124- return (
125- < div key = { index } className = "o-UsageBar__bar__elements__label" >
126- < div
127- className = "o-UsageBar__bar__elements__label--dot"
128- style = { { backgroundColor : element . color } }
129- />
130- < span > { element . name } </ span >
131- { showPercentage && (
132- < span className = "o-UsageBar__bar__tooltip__percentage" >
133- { getPercentageValue ( element . value , total ) }
134- </ span >
135- ) }
136- </ div >
137- )
138- } ) }
139- </ div >
140- ) }
141- </ div >
142- )
95+ if ( itemsValuesAreCorrect ) {
96+ formatItemsArray ( )
14397 }
98+ } , [ itemsValuesAreCorrect , formatItemsArray ] )
99+
100+ if ( ! itemsValuesAreCorrect )
101+ return (
102+ < span className = "u-UsageBar__error" >
103+ ERROR: Elements values exceed the total.
104+ </ span >
105+ )
106+
107+ if ( formattedItems . length === 0 ) return null
144108
109+ if ( compactLayout ) {
145110 return (
146111 < div
147- className = { `c-UsageBar ${
112+ className = { `c-UsageBar c-UsageBar__compact ${
148113 darkMode ? "u-UsageBar-dark" : "u-UsageBar-light"
149114 } `}
150115 >
151- < div className = "o-UsageBar__bar" >
116+ < div className = "o-UsageBar__bar o-UsageBar__compact__bar " >
152117 { formattedItems . map ( ( element : Item , index : number ) => {
153118 return (
154119 < div
@@ -158,32 +123,67 @@ const UsageBar: React.FC<Props> = ({
158123 width : getPercentageValue ( element . value , total ) ,
159124 backgroundColor : element . color ,
160125 } }
161- >
162- { ! removeLabels && (
163- < div className = "o-UsageBar__bar__tooltip" >
164- < span > { element . name } </ span >
165- { showPercentage && (
166- < span className = "o-UsageBar__bar__tooltip__percentage" >
167- { getPercentageValue ( element . value , total ) }
168- </ span >
169- ) }
170- </ div >
171- ) }
172- </ div >
126+ />
173127 )
174128 } ) }
175129 </ div >
130+ { ! removeLabels && (
131+ < div className = "o-UsageBar__bar__elements__labels__container" >
132+ { formattedItems . map ( ( element : Item , index : number ) => {
133+ return (
134+ < div key = { index } className = "o-UsageBar__bar__elements__label" >
135+ < div
136+ className = "o-UsageBar__bar__elements__label--dot"
137+ style = { { backgroundColor : element . color } }
138+ />
139+ < span > { element . name } </ span >
140+ { showPercentage && (
141+ < span className = "o-UsageBar__bar__tooltip__percentage" >
142+ { getPercentageValue ( element . value , total ) }
143+ </ span >
144+ ) }
145+ </ div >
146+ )
147+ } ) }
148+ </ div >
149+ ) }
176150 </ div >
177151 )
178152 }
179153
180- if ( uncorrectValues )
181- return (
182- < span className = "u-UsageBar__error" >
183- ERROR: Elements values exceed the total.
184- </ span >
185- )
186- return formattedItems . length > 0 ? renderUsageBar ( ) : null
154+ return (
155+ < div
156+ className = { `c-UsageBar ${
157+ darkMode ? "u-UsageBar-dark" : "u-UsageBar-light"
158+ } `}
159+ >
160+ < div className = "o-UsageBar__bar" >
161+ { formattedItems . map ( ( element : Item , index : number ) => {
162+ return (
163+ < div
164+ key = { index }
165+ className = "o-UsageBar__bar__element"
166+ style = { {
167+ width : getPercentageValue ( element . value , total ) ,
168+ backgroundColor : element . color ,
169+ } }
170+ >
171+ { ! removeLabels && (
172+ < div className = "o-UsageBar__bar__tooltip" >
173+ < span > { element . name } </ span >
174+ { showPercentage && (
175+ < span className = "o-UsageBar__bar__tooltip__percentage" >
176+ { getPercentageValue ( element . value , total ) }
177+ </ span >
178+ ) }
179+ </ div >
180+ ) }
181+ </ div >
182+ )
183+ } ) }
184+ </ div >
185+ </ div >
186+ )
187187}
188188
189189export default UsageBar
0 commit comments