diff --git a/apps/web/src/app/register/page.tsx b/apps/web/src/app/register/page.tsx
index 33fdce37..8d8f601e 100644
--- a/apps/web/src/app/register/page.tsx
+++ b/apps/web/src/app/register/page.tsx
@@ -6,6 +6,7 @@ import { Card } from "@/components/ui/card";
import { Separator } from "@/components/ui/separator";
import { Skeleton } from "@/components/ui/skeleton";
import { TextScramble } from "@/components/ui/text-scramble";
+import { calculateTimeLeft } from "@/libs/date";
import { fetchQuery } from "@/libs/server/client";
import { Mail } from "lucide-react";
import Image from "next/image";
@@ -73,10 +74,17 @@ function RegisterPage() {
ข้อมูลส่วนบุคคล
- {`เหลือเวลาอีก ${Math.ceil(
- (new Date("2025-03-13").getTime() - new Date().getTime()) /
- (1000 * 60 * 60 * 24),
- )} วัน`}
+ {(() => {
+ const { isLate, daysLeft, hoursLeft } = calculateTimeLeft(
+ new Date("2025-03-13T23:59:59+07:00"),
+ );
+
+ if (isLate) return "หมดเขตรับสมัครแล้ว";
+
+ return daysLeft > 0
+ ? `เหลือเวลาอีก ${daysLeft} วัน`
+ : `เหลือเวลาอีก ${hoursLeft} ชั่วโมง`;
+ })()}
diff --git a/apps/web/src/components/navigate/navbar.tsx b/apps/web/src/components/navigate/navbar.tsx
index 76cfa2d7..0fad337d 100644
--- a/apps/web/src/components/navigate/navbar.tsx
+++ b/apps/web/src/components/navigate/navbar.tsx
@@ -11,6 +11,7 @@ import {
DrawerTitle,
DrawerTrigger,
} from "@/components/ui/drawer";
+import { calculateTimeLeft } from "@/libs/date";
import { ReactNode } from "react";
import { TextShimmerWave } from "../text/text-shimmer-wave";
import { Banner } from "../ui/banner";
@@ -69,13 +70,14 @@ export default function Navbar({ items, extra }: NavbarProps) {
className="cursor-pointer text-base font-medium transition-colors [--base-color:var(--color-vermilion)] [--base-gradient-color:var(--color-vermilion-1)] dark:[--base-color:var(--color-vermilion)] dark:[--base-gradient-color:var(--color-vermilion-1)]"
>
{(() => {
- const daysLeft = Math.floor(
- (new Date("2025-03-14T00:00:00+07:00").getTime() -
- Date.now()) /
- (1000 * 60 * 60 * 24),
+ const { isLate, daysLeft } = calculateTimeLeft(
+ new Date("2025-03-13T23:59:59+07:00"),
);
+
+ if (isLate) return "หมดเขตรับสมัครแล้ว";
+
return daysLeft > 0
- ? `เหลือเวลาอีก ${daysLeft.toString()} วันจะหมดเขตรับสมัครแล้วนะ รีบสมัครเลย!`
+ ? `เหลือเวลาอีก ${daysLeft} วันจะหมดเขตรับสมัครแล้วนะ รีบสมัครเลย!`
: "เหลือเวลาอีกไม่ถึง 1 วันแล้วนะ รีบสมัครเลย! (ปิดรับสมัครเวลา 23:59:59)";
})()}
diff --git a/apps/web/src/libs/date.ts b/apps/web/src/libs/date.ts
index 89c65ee6..f36cd0bb 100644
--- a/apps/web/src/libs/date.ts
+++ b/apps/web/src/libs/date.ts
@@ -35,3 +35,18 @@ export function getAcademicYearFormDate(date: Date) {
return year + 543;
}
}
+
+export function calculateTimeLeft(target: Date) {
+ const now = new Date();
+ const diffMs = target.getTime() - now.getTime();
+ const isLate = diffMs < 0;
+
+ const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
+ const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+
+ return {
+ isLate,
+ daysLeft: days,
+ hoursLeft: hours,
+ };
+}