c129108b78
* Translation comment * Fix error handling in starter pack generation * Allow access to DM settings for age restricted users * Leave post stat unit formatting up to translators
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import {useCallback} from 'react'
|
|
import {msg} from '@lingui/macro'
|
|
import {useLingui} from '@lingui/react'
|
|
|
|
/**
|
|
* This matches `formatCount` from `view/com/util/numeric/format.ts`, but has
|
|
* additional truncation logic for large numbers. `roundingMode` should always
|
|
* match the original impl, regardless of if we add more formatting here.
|
|
*/
|
|
export function useFormatPostStatCount() {
|
|
const {i18n} = useLingui()
|
|
|
|
return useCallback(
|
|
(postStatCount: number) => {
|
|
const isOver1k = postStatCount >= 1_000
|
|
const isOver10k = postStatCount >= 10_000
|
|
const isOver1M = postStatCount >= 1_000_000
|
|
const formatted = i18n.number(postStatCount, {
|
|
notation: 'compact',
|
|
maximumFractionDigits: isOver10k ? 0 : 1,
|
|
// @ts-expect-error - roundingMode not in the types
|
|
roundingMode: 'trunc',
|
|
})
|
|
const count = formatted.replace(/\D+$/g, '')
|
|
|
|
if (isOver1M) {
|
|
return i18n._(
|
|
msg({
|
|
message: `${count}M`,
|
|
comment:
|
|
'For post statistics. Indicates a number in the millions. Please use the shortest format appropriate for your language.',
|
|
}),
|
|
)
|
|
} else if (isOver1k) {
|
|
return i18n._(
|
|
msg({
|
|
message: `${count}K`,
|
|
comment:
|
|
'For post statistics. Indicates a number in the thousands. Please use the shortest format appropriate for your language.',
|
|
}),
|
|
)
|
|
} else {
|
|
return count
|
|
}
|
|
},
|
|
[i18n],
|
|
)
|
|
}
|