- Replace Clerk with self-hosted JWT auth (register/login/verify, bcrypt passwords, Gmail OTP with console fallback) - Add lib/db.ts pg pool + transaction helpers; seed script migrates legacy Clerk-era schema (drop clerk_id, enforce UUID ids and unique email) - Add owner-gated admin API: stats, users, drivers CRUD, rides - Add dashboard/ Vite React owner dashboard (login, overview, users, fleet, rides) with dev-server proxy to avoid Expo CORS middleware - Add scripts/set-owner.mjs for role management
53 lines
1.2 KiB
TypeScript
53 lines
1.2 KiB
TypeScript
import type { Ride } from "@/types/type";
|
|
|
|
export const sortRides = (rides: Ride[]): Ride[] => {
|
|
return [...rides].sort(
|
|
(a, b) =>
|
|
new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
|
|
);
|
|
};
|
|
|
|
export function formatTime(minutes: number): string {
|
|
const formattedMinutes = Math.round(minutes) || 0;
|
|
|
|
if (formattedMinutes < 60) {
|
|
return `${formattedMinutes} min`;
|
|
} else {
|
|
const hours = Math.floor(formattedMinutes / 60);
|
|
const remainingMinutes = formattedMinutes % 60;
|
|
return `${hours}h ${remainingMinutes}m`;
|
|
}
|
|
}
|
|
|
|
export function formatDate(dateString: string): string {
|
|
const date = new Date(dateString);
|
|
const day = date.getDate();
|
|
const monthNames = [
|
|
"Jan",
|
|
"Feb",
|
|
"Mar",
|
|
"Apr",
|
|
"May",
|
|
"Jun",
|
|
"Jul",
|
|
"Aug",
|
|
"Sep",
|
|
"Oct",
|
|
"Nov",
|
|
"Dec",
|
|
];
|
|
const month = monthNames[date.getMonth()];
|
|
const year = date.getFullYear();
|
|
|
|
return `${day < 10 ? "0" + day : day} ${month} ${year}`;
|
|
}
|
|
|
|
// Normalizes a Lebanese phone number to E.164 (+961...).
|
|
export function normalizePhone(raw: string): string {
|
|
const cleaned = raw.replace(/[^\d+]/g, "");
|
|
|
|
if (cleaned.startsWith("+")) return cleaned;
|
|
|
|
return `+961${cleaned.replace(/^0+/, "")}`;
|
|
}
|