Skip to content

Commit ae3a91f

Browse files
authored
feat: add WeeklyMenu component
2 parents ebaa699 + 5146523 commit ae3a91f

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

src/app/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import FilterMenu from "@/components/FilterMenu";
22
import Navbar from "@/components/Navbar";
33
import RecipeSummary from "@/components/RecipeSummary";
4+
import WeeklyMenu from "@/components/WeeklyMenu";
45
import ComboCard from "@/components/ComboCard";
56

67
export default function Home() {
@@ -21,6 +22,7 @@ export default function Home() {
2122
</div>
2223
<h1>Dashboard</h1>
2324
<h1 className="text-3xl font-bold underline">Hello world!</h1>
25+
<WeeklyMenu dateToday={today} />
2426
<RecipeSummary id={"recipe_test_001"} />
2527
<RecipeSummary id={"mango"} />
2628
<RecipeSummary id={"masdf"} />

src/components/WeeklyMenu.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"use client";
2+
import { useState } from "react";
3+
import { ChevronLeft, ChevronRight } from "lucide-react";
4+
5+
interface WeeklyMenuProps {
6+
dateToday: Date;
7+
}
8+
9+
const getOffsetDate = (date: Date, offset: number) => {
10+
const newDate = new Date(date);
11+
newDate.setDate(date.getDate() + offset * 7);
12+
return newDate;
13+
};
14+
15+
const getCurrentWeekDates = (today: Date) => {
16+
const dayOfWeek = today.getDay(); // 0 (Sun) - 6 (Sat)
17+
const startOfWeek = new Date(today);
18+
startOfWeek.setDate(today.getDate() - dayOfWeek + 1); // start from Monday
19+
20+
return Array.from({ length: 5 }, (_, i) => {
21+
const date = new Date(startOfWeek);
22+
date.setDate(startOfWeek.getDate() + i);
23+
return date;
24+
});
25+
};
26+
27+
export default function WeeklyMenu({ dateToday }: WeeklyMenuProps) {
28+
const [weekOffset, setWeekOffset] = useState(0);
29+
const weekDates = getCurrentWeekDates(getOffsetDate(dateToday, weekOffset));
30+
31+
return (
32+
<div className="px-[10px] w-[833px] h-[317px] rounded-2xl border border-black">
33+
<div className="relative mt-4 flex justify-between gap-3">
34+
<button className="absolute left-3 top-3 cursor-pointer" onClick={() => setWeekOffset(weekOffset - 1)}>
35+
<ChevronLeft size={20} strokeWidth={2.5} />
36+
</button>
37+
38+
{weekDates.map((date, idx) => (
39+
<div key={idx} className="flex flex-col items-center">
40+
<span className="text-xs font-montserrat font-medium">
41+
{date.toLocaleDateString(undefined, { weekday: "short" }).toUpperCase()}
42+
</span>
43+
<span
44+
className={`text-2xl font-montserrat font-bold mb-2 ${
45+
date.toDateString() === dateToday.toDateString() ? "text-radish-900" : ""
46+
}`}
47+
>
48+
{String(date.getDate()).padStart(2, "0")}
49+
</span>
50+
<div
51+
className={`flex flex-col items-center w-full h-[219px] rounded-[10px] p-2 ${
52+
date.toDateString() === dateToday.toDateString() ? "border-2 border-radish-900" : ""
53+
}`}
54+
>
55+
<div className="w-[129px] h-[56px] bg-green-500 rounded-md m-1"></div>
56+
<div className="w-[129px] h-[56px] bg-orange-500 rounded-md m-1"></div>
57+
</div>
58+
</div>
59+
))}
60+
61+
<button className="absolute right-3 top-3 cursor-pointer" onClick={() => setWeekOffset(weekOffset + 1)}>
62+
<ChevronRight size={20} strokeWidth={2.5} />
63+
</button>
64+
</div>
65+
</div>
66+
);
67+
}

0 commit comments

Comments
 (0)