Files
WooNooW/admin-spa/src/lib/dates.ts
dwindown 232059e928 feat: Complete Dashboard API Integration with Analytics Controller
 Features:
- Implemented API integration for all 7 dashboard pages
- Added Analytics REST API controller with 7 endpoints
- Full loading and error states with retry functionality
- Seamless dummy data toggle for development

📊 Dashboard Pages:
- Customers Analytics (complete)
- Revenue Analytics (complete)
- Orders Analytics (complete)
- Products Analytics (complete)
- Coupons Analytics (complete)
- Taxes Analytics (complete)
- Dashboard Overview (complete)

🔌 Backend:
- Created AnalyticsController.php with REST endpoints
- All endpoints return 501 (Not Implemented) for now
- Ready for HPOS-based implementation
- Proper permission checks

🎨 Frontend:
- useAnalytics hook for data fetching
- React Query caching
- ErrorCard with retry functionality
- TypeScript type safety
- Zero build errors

📝 Documentation:
- DASHBOARD_API_IMPLEMENTATION.md guide
- Backend implementation roadmap
- Testing strategy

🔧 Build:
- All pages compile successfully
- Production-ready with dummy data fallback
- Zero TypeScript errors
2025-11-04 11:19:00 +07:00

36 lines
1.0 KiB
TypeScript

export function formatRelativeOrDate(tsSec?: number, locale?: string) {
if (!tsSec) return "—";
const now = Date.now();
const ts = tsSec * 1000;
const diffMs = ts - now;
const rtf = new Intl.RelativeTimeFormat(locale || undefined, { numeric: "auto" });
const absMs = Math.abs(diffMs);
const oneMin = 60 * 1000;
const oneHour = 60 * oneMin;
const oneDay = 24 * oneHour;
// Match Woo-ish thresholds
if (absMs < oneMin) {
const secs = Math.round(diffMs / 1000);
return rtf.format(secs, "second");
}
if (absMs < oneHour) {
const mins = Math.round(diffMs / oneMin);
return rtf.format(mins, "minute");
}
if (absMs < oneDay) {
const hours = Math.round(diffMs / oneHour);
return rtf.format(hours, "hour");
}
// Fallback to a readable local datetime
const d = new Date(ts);
return d.toLocaleString(undefined, {
year: "numeric",
month: "short",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
});
}