38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
|
|
/**
|
||
|
|
* Shared formatting utility functions.
|
||
|
|
*
|
||
|
|
* Consolidates duplicated formatters that were previously defined inline in
|
||
|
|
* PropertyCard, ListingDetail, MobileBottomSheet, and StatsBar.
|
||
|
|
*/
|
||
|
|
|
||
|
|
/** Format a number as a compact GBP string, e.g. "£1.2k" or "£950". */
|
||
|
|
export function formatCurrency(value: number): string {
|
||
|
|
if (value >= 1000) return `£${(value / 1000).toFixed(1)}k`;
|
||
|
|
return `£${Math.round(value)}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Format a duration in seconds as a human-readable string, e.g. "12m" or "1h30m". */
|
||
|
|
export function formatDuration(seconds: number): string {
|
||
|
|
const minutes = Math.round(seconds / 60);
|
||
|
|
if (minutes < 60) return `${minutes}m`;
|
||
|
|
const hours = Math.floor(minutes / 60);
|
||
|
|
const mins = minutes % 60;
|
||
|
|
return mins > 0 ? `${hours}h${mins}m` : `${hours}h`;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Format an ISO date string as a localised short date (e.g. "3 Jan 2025"). */
|
||
|
|
export function formatDate(value: string): string {
|
||
|
|
const date = new Date(value);
|
||
|
|
if (isNaN(date.getTime())) return value;
|
||
|
|
return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Compute the price per square metre as a formatted string, e.g. "£4,500/m²".
|
||
|
|
* Returns null when square metres data is unavailable.
|
||
|
|
*/
|
||
|
|
export function formatPricePerSqm(price: number, sqm: number | null | undefined): string | null {
|
||
|
|
if (sqm == null || sqm <= 0) return null;
|
||
|
|
return `£${Math.round(price / sqm).toLocaleString()}/m²`;
|
||
|
|
}
|