use-duration-formatter
Props
| Prop name | Type | Default | Description |
|---|---|---|---|
display | "short" | "narrow" | "long" | "digital" | undefined | short | The duration display format. |
locale | LocalesArgument | The locale for number formatting. Used for `Intl.NumberFormat` API. | |
intlFormatOptions | NumberFormatOptions | undefined | Options forwarded to each individual part of the `Intl.NumberFormat` API. Intl.NumberFormat |
For most cases we advise you to use the provided Duration formatter component as it also handles the semantic and accessible markup of duration objects.
If you need to customize the markup, you can use the useDurationFormatter hook, which mimics the basic functionalities of the (currently unstable) Intl.DurationFormat API.
Format
The format function returns a formatted string of the provided duration object based on user-defined localization.
If you wish to override user locale, you can use the locale parameter.
import { useDurationFormatter, FormRow, Select, SelectOption, Text } from '@flixbus/honeycomb-react'; const [locale, setLocale] = React.useState(); const Duration = ({ display, hours, minutes, seconds }) => { const formatter = useDurationFormatter({ locale, display }); return <time>{formatter.format({ hours, minutes, seconds })}</time>; }; <div> <FormRow> <Select aria-label="Locale" id="locale-picker" value={locale} onChange={(event) => { setLocale(event.target.value || undefined) }}> <SelectOption value="">User preference</SelectOption> <SelectOption value="en-US">en-US</SelectOption> <SelectOption value="de-DE">de-DE</SelectOption> <SelectOption value="fr-FR">fr-FR</SelectOption> <SelectOption value="pt-BR">pt-BR</SelectOption> </Select> </FormRow> <Text> <strong>narrow:</strong> <Duration display="narrow" hours={9} minutes={16} seconds={30} /> </Text> <Text> <strong>short:</strong> <Duration display="short" hours={9} minutes={16} seconds={30} /> </Text> <Text> <strong>long:</strong> <Duration display="long" hours={9} minutes={16} seconds={30} /> </Text> <Text> <strong>digital:</strong> <Duration display="digital" hours={9} minutes={16} seconds={30} /> </Text> </div>
FormatToParts
You can call formatToParts function to get parts of the formatted string and extract only the information you need from them.
In the example bellow we add digital separator in a separate element to make it blink like a digital clock.
import { Tag, useDurationFormatter } from '@flixbus/honeycomb-react'; import { Icon, IconStopwatch } from '@flixbus/honeycomb-icons-react'; const duration = { hours: 9, minutes: 16 } const formatter = useDurationFormatter({ locale: 'de-DE', display: 'digital' }); const durationParts = formatter.formatToParts(duration); console.log(durationParts); <Tag display="subtle" appearance="danger"> <Icon InlineIcon={IconStopwatch} /> <time dateTime={`PT${duration.hours}H${duration.minutes}M`}> <strong> {durationParts.map((part) => part.type === 'literal' && part.value === ':' ? <span className="digital-separator" key={part.value}>{part.value}</span> : part.value )} </strong> </time> </Tag>