This commit is contained in:
gpt-engineer-app[bot]
2025-12-19 01:54:13 +00:00
parent 278f709201
commit ff877266b0
13 changed files with 2540 additions and 231 deletions

78
src/lib/format.ts Normal file
View File

@@ -0,0 +1,78 @@
/**
* Format duration in seconds to HH:mm:ss or mm:ss
*/
export function formatDuration(seconds: number | string | null | undefined): string {
if (seconds === null || seconds === undefined) return '';
// If it's already formatted (contains :), return as-is
if (typeof seconds === 'string' && seconds.includes(':')) {
return seconds;
}
const numSeconds = typeof seconds === 'string' ? parseInt(seconds, 10) : seconds;
if (isNaN(numSeconds) || numSeconds < 0) return '';
const hours = Math.floor(numSeconds / 3600);
const minutes = Math.floor((numSeconds % 3600) / 60);
const secs = numSeconds % 60;
if (hours > 0) {
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}
return `${minutes}:${secs.toString().padStart(2, '0')}`;
}
/**
* Format price in IDR
*/
export function formatIDR(amount: number): string {
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR',
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(amount).replace('IDR', 'Rp');
}
/**
* Parse duration string (HH:mm:ss or mm:ss) to seconds
*/
export function parseDurationToSeconds(duration: string): number {
if (!duration) return 0;
// If it's already a number string, return as seconds
if (/^\d+$/.test(duration.trim())) {
return parseInt(duration, 10);
}
const parts = duration.split(':').map(p => parseInt(p, 10));
if (parts.length === 3) {
// HH:mm:ss
return parts[0] * 3600 + parts[1] * 60 + parts[2];
} else if (parts.length === 2) {
// mm:ss
return parts[0] * 60 + parts[1];
}
return 0;
}
/**
* Format date to Indonesian locale
*/
export function formatDate(date: string | Date): string {
return new Intl.DateTimeFormat('id-ID', {
dateStyle: 'long',
}).format(new Date(date));
}
/**
* Format datetime to Indonesian locale
*/
export function formatDateTime(date: string | Date): string {
return new Intl.DateTimeFormat('id-ID', {
dateStyle: 'long',
timeStyle: 'short',
}).format(new Date(date));
}