create review and profile

This commit is contained in:
arifal
2026-04-20 00:25:05 +07:00
parent 7159e9108f
commit ba5f64ae0e
37 changed files with 3324 additions and 109 deletions
+83
View File
@@ -0,0 +1,83 @@
/** Bantu perbandingan tanggal trip (hari kalender UTC). */
/** Parse `YYYY-MM-DD` sebagai awal hari UTC (hindari ambiguitas `new Date(string)` di berbagai TZ). */
export function utcDayStartFromYmd(ymd: string): Date {
const parts = ymd.split("-").map(Number);
const y = parts[0];
const m = parts[1];
const d = parts[2];
if (!y || !m || !d) {
return utcStartOfDay(new Date());
}
return new Date(Date.UTC(y, m - 1, d, 0, 0, 0, 0));
}
/** Akhir hari UTC untuk `YYYY-MM-DD`. */
export function utcDayEndFromYmd(ymd: string): Date {
const parts = ymd.split("-").map(Number);
const y = parts[0];
const m = parts[1];
const d = parts[2];
if (!y || !m || !d) {
return utcStartOfDay(new Date());
}
return new Date(Date.UTC(y, m - 1, d, 23, 59, 59, 999));
}
export function maxUtcDate(a: Date, b: Date): Date {
return a.getTime() >= b.getTime() ? a : b;
}
/**
* Tanggal dari DatePicker = hari kalender **lokal** browser.
* Encode `YYYY-MM-DD` dengan `getFullYear/getMonth/getDate` (bukan `toISOString()`)
* supaya tidak bergeser ke hari UTC lain (mis. WIB malam → UTC hari sebelumnya).
*/
export function formatLocalCalendarYmd(d: Date): string {
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, "0");
const day = String(d.getDate()).padStart(2, "0");
return `${y}-${m}-${day}`;
}
/**
* Simpan `trip.date` / `trip.endDate`: string `YYYY-MM-DD` diartikan sebagai
* **hari kalender UTC** yang sama (selaras dengan filter Open Trip).
*/
export function tripStoredInstantFromYmd(ymd: string): Date {
return utcDayStartFromYmd(ymd.trim().slice(0, 10));
}
export function utcStartOfDay(d: Date): Date {
return new Date(
Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())
);
}
/** true jika hari berangkat trip sudah lewat dibanding hari ini (UTC). */
export function isTripDepartureDayPast(departureDate: Date): boolean {
const today = utcStartOfDay(new Date());
const dep = utcStartOfDay(departureDate);
return dep.getTime() < today.getTime();
}
/**
* true jika sudah lewat akhir hari terakhir trip (tanggal pulang atau tanggal berangkat).
* Dipakai untuk membuka fitur ulasan.
*/
export function isPastTripLastDayForReview(
tripDate: Date,
tripEndDate: Date | null
): boolean {
const last = tripEndDate ?? tripDate;
const endMs = Date.UTC(
last.getUTCFullYear(),
last.getUTCMonth(),
last.getUTCDate(),
23,
59,
59,
999
);
return Date.now() > endMs;
}