Skip to content

Commit 06c7177

Browse files
committed
feat: improve unit lisibility
1 parent c09c28e commit 06c7177

7 files changed

Lines changed: 120 additions & 28 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
.gUnit,
2+
.tUnit,
3+
.mtUnit {
4+
border-radius: 0.5rem;
5+
padding: 0 0.5rem;
6+
}
7+
8+
.gUnit {
9+
background-color: var(--neutral-10);
10+
color: var(--neutral-80);
11+
}
12+
13+
.tUnit {
14+
background-color: var(--neutral-60);
15+
color: var(--neutral-10);
16+
}
17+
18+
.mtUnit {
19+
background-color: var(--neutral-80);
20+
color: var(--neutral-10);
21+
}
22+
23+
.gUnitSecondary,
24+
.tUnitSecondary,
25+
.mtUnitSecondary {
26+
border-radius: 0.25rem;
27+
padding: 0 0.25rem;
28+
}
29+
30+
.gUnitSecondary {
31+
background-color: var(--primary-20);
32+
color: var(--primary-80);
33+
}
34+
35+
.tUnitSecondary {
36+
background-color: var(--primary-60);
37+
color: var(--primary-10);
38+
}
39+
40+
.mtUnitSecondary {
41+
background-color: var(--primary-70);
42+
color: var(--primary-10);
43+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import classNames from 'classnames'
2+
import { getNumberPrecision } from 'utils/formatNumberPrecision'
3+
import LocalNumber from './LocalNumber'
4+
import styles from './CO2Quantity.module.css'
5+
6+
const getUnit = (value: number, unit: string, language: string) => {
7+
if (unit === 'mt') {
8+
if (language === 'en') {
9+
return value >= 2 ? 'Millions t' : 'Million t'
10+
}
11+
if (language === 'es') {
12+
return value >= 2 ? 'Millones t' : 'Millón t'
13+
}
14+
return value >= 2 ? 'Millions de t' : 'Million de t'
15+
}
16+
return unit
17+
}
18+
19+
const CO2Quantity = ({
20+
quantity,
21+
className,
22+
valueClassName,
23+
secondary,
24+
language,
25+
}: {
26+
quantity: number
27+
className?: string
28+
valueClassName?: string
29+
secondary?: boolean
30+
language: string
31+
}) => {
32+
const { value, unit } = getNumberPrecision(quantity)
33+
34+
return (
35+
<p className={className}>
36+
<span className={valueClassName}>
37+
<LocalNumber number={value} />
38+
</span>{' '}
39+
<span className={classNames(styles[`${unit}Unit${secondary ? 'Secondary' : ''}`])}>
40+
{getUnit(value, unit, language)} CO₂e
41+
</span>
42+
</p>
43+
)
44+
}
45+
46+
export default CO2Quantity

src/components/externalModules/shopify/Equivalent.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { ReactNode, useEffect, useMemo, useRef, useState } from 'react'
1+
import { useEffect, useMemo, useRef, useState } from 'react'
22
import { Language } from 'types/equivalent'
33
import { getNumberPrecision } from 'utils/formatNumberPrecision'
4-
import LocalNumber from 'components/base/LocalNumber'
4+
import CO2Quantity from 'components/base/CO2Quantity'
55
import EqualIcon from 'components/base/icons/equal'
66
import RefreshIcon from 'components/base/icons/refresh'
77
import Logo from '../Logo'
@@ -14,7 +14,6 @@ const Equivalent = ({
1414
className,
1515
baseValue,
1616
comparisons,
17-
title,
1817
animated,
1918
url,
2019
language,
@@ -23,7 +22,6 @@ const Equivalent = ({
2322
className?: string
2423
baseValue: string | number
2524
comparisons: string[]
26-
title?: (unit: string, roundedValue: number, intValue: number) => ReactNode
2725
animated?: boolean
2826
url?: string
2927
language: Language
@@ -56,16 +54,17 @@ const Equivalent = ({
5654

5755
return (
5856
<div className={className}>
59-
{title && title(unit, value, intValue)}
6057
<div className={styles.container}>
6158
<div className={styles.left}>
6259
<Logo value={preciseValue} url={url} />
63-
<p className={styles.leftContent}>
64-
<span className={styles.value} data-testid='etiquette-value'>
65-
<LocalNumber number={value} />
66-
</span>
67-
<span className={styles.label}>{unit} CO₂e</span>
68-
</p>
60+
<CO2Quantity
61+
quantity={preciseValue / 1000}
62+
className={styles.leftContent}
63+
valueClassName={styles.value}
64+
data-testid='etiquette-value'
65+
secondary
66+
language={language}
67+
/>
6968
</div>
7069
<div className={styles.right}>
7170
<div className={isAnimated ? styles.animatedEqual : styles.equal}>

src/components/outils/equivalents/EquivalentCardContent.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
'use client'
22

33
import { useTranslations } from 'next-intl'
4-
import React from 'react'
54
import useParamContext from 'src/providers/ParamProvider'
65
import { Category } from 'types/category'
76
import { ComputedEquivalent } from 'types/equivalent'
87
import { getName } from 'utils/Equivalent/equivalent'
9-
import { getNumberPrecision } from 'utils/formatNumberPrecision'
8+
import CO2Quantity from 'components/base/CO2Quantity'
109
import EquivalentIcon from 'components/base/EquivalentIcon'
11-
import LocalNumber from 'components/base/LocalNumber'
1210
import styles from './EquivalentCardContent.module.css'
1311

1412
const EquivalentCardContent = ({
@@ -20,9 +18,6 @@ const EquivalentCardContent = ({
2018
category: Category
2119
output?: string
2220
}) => {
23-
const { value, unit } = getNumberPrecision(
24-
equivalent.carpool ? equivalent.value / (equivalent.carpool + 1) : equivalent.value
25-
)
2621
const { language } = useParamContext()
2722
const t = useTranslations('unit')
2823
const unitLabel = equivalent.unit || category.unit
@@ -32,12 +27,12 @@ const EquivalentCardContent = ({
3227
<div>
3328
<p className={styles.title}>{getName(language, equivalent)}</p>
3429
<Result form={output}>
35-
<p className={styles.value}>
36-
<span className={styles.valueNumber}>
37-
<LocalNumber number={value} />
38-
</span>{' '}
39-
{unit} CO₂e
40-
</p>
30+
<CO2Quantity
31+
quantity={equivalent.carpool ? equivalent.value / (equivalent.carpool + 1) : equivalent.value}
32+
className={styles.value}
33+
valueClassName={styles.valueNumber}
34+
language={language}
35+
/>
4136
</Result>
4237
{unitLabel && (
4338
<p className={styles.unit}>

src/utils/formatName.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export default function formatName(name = '', value = 1) {
44
}
55

66
return name
7-
.replace(/\[s\]/g, value > 1 ? 's' : '')
8-
.replace(/\[x\]/g, value > 1 ? 'x' : '')
9-
.replace(/\[es\]/g, value > 1 ? 'es' : '')
7+
.replace(/\[s\]/g, value >= 2 ? 's' : '')
8+
.replace(/\[x\]/g, value >= 2 ? 'x' : '')
9+
.replace(/\[es\]/g, value >= 2 ? 'es' : '')
1010
}

src/utils/formatNumberPrecision.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import formatNumber from './formatNumber'
22

33
export const getNumberPrecision = (number: number) => {
4-
return number >= 1 ? { value: formatNumber(number), unit: 'kg' } : { value: formatNumber(number * 1000), unit: 'g' }
4+
if (number >= 1_000_000) {
5+
return { value: formatNumber(number / 1_000_000), unit: 'mt' }
6+
}
7+
if (number >= 1_000) {
8+
return { value: formatNumber(number / 1_000), unit: 't' }
9+
}
10+
if (number >= 1) {
11+
return { value: formatNumber(number), unit: 'kg' }
12+
}
13+
return { value: formatNumber(number * 1000), unit: 'g' }
514
}

testu/formatName.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('formatName', () => {
2222
expect(res).toEqual('les cadeaux des choux')
2323
})
2424
test('le résultat peut éventuellement garder ses majuscules originales', () => {
25-
const res = formatName('Le[s] Cadeau[x] De[s] Chou[x]', 2, true)
25+
const res = formatName('Le[s] Cadeau[x] De[s] Chou[x]', 2)
2626
expect(res).toEqual('Les Cadeaux Des Choux')
2727
})
2828
})

0 commit comments

Comments
 (0)