From b5dd39c6c2c023a42aa4f5a34d6c65fd9fba9960 Mon Sep 17 00:00:00 2001 From: corpi Date: Thu, 5 Feb 2026 12:35:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=84=B8=EC=85=98=20=EC=A4=91,=20?= =?UTF-8?q?=EB=81=9D=EB=82=AC=EC=9D=84=20=EB=95=8C=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/globals.css | 4 ++-- src/app/page.tsx | 10 +++------- src/app/session/end/page.tsx | 32 +++++++++++++++++++++++++++----- src/app/session/page.tsx | 26 ++++++++++++++++++++++++-- src/components/Modal.tsx | 18 ++++++++++++++++++ 5 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 src/components/Modal.tsx diff --git a/src/app/globals.css b/src/app/globals.css index a7b27a7..7ce28e7 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -54,7 +54,7 @@ --card-foreground: oklch(0.129 0.042 264.695); --popover: oklch(1 0 0); --popover-foreground: oklch(15.152% 0.01301 277.362); - --primary: oklch(0.208 0.042 265.755); + --primary: oklch(0.574 0.202 262); --primary-foreground: oklch(0.984 0.003 247.858); --secondary: oklch(0.968 0.007 247.896); --secondary-foreground: oklch(0.208 0.042 265.755); @@ -65,7 +65,7 @@ --destructive: oklch(0.577 0.245 27.325); --border: oklch(0.929 0.013 255.508); --input: oklch(0.929 0.013 255.508); - --ring: oklch(0.704 0.04 256.788); + --ring: oklch(0.62 0.202 262); --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); diff --git a/src/app/page.tsx b/src/app/page.tsx index 5a8a0c3..11a2a44 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -49,7 +49,7 @@ export default function HomePage() { params.set("mode", mode); if (goal && goal.trim().length > 0) { - localStorage.setItem("goal", goal.trim()); + localStorage.setItem("hushroom:session-goal", goal.trim()); } router.push(`/session?${params.toString()}`); @@ -197,7 +197,7 @@ function SessionGoalDialog({ value={goal} onChange={(e) => setGoal(e.target.value)} placeholder="목표를 입력하세요" - className="text-lg border-[#2F6FED] focus-visible:ring-[#2F6FED] focus-visible:ring-1" + className="text-lg" autoFocus />
@@ -209,11 +209,7 @@ function SessionGoalDialog({ - diff --git a/src/app/session/end/page.tsx b/src/app/session/end/page.tsx index 90d7981..fa2f8d2 100644 --- a/src/app/session/end/page.tsx +++ b/src/app/session/end/page.tsx @@ -2,7 +2,7 @@ "use client"; import { useRouter, useSearchParams } from "next/navigation"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; type Mode = "freeflow" | "sprint" | "deepwork"; @@ -34,11 +34,17 @@ export default function SessionEndPage() { const router = useRouter(); const params = useSearchParams(); - const mode = useMemo(() => clampMode(params.get("mode")), [params]); - const elapsed = useMemo(() => { - const v = Number(params.get("elapsed") ?? "0"); + const [elapsed, setElapsed] = useState(() => { + const v = Number(localStorage.getItem("hushroom:session-elapsed") ?? "0"); return Number.isFinite(v) ? v : 0; - }, [params]); + }); + + const [goal, setGoal] = useState(() => { + const goal = localStorage.getItem("hushroom:session-goal"); + return goal; + }); + + const mode = useMemo(() => clampMode(params.get("mode")), [params]); return (
@@ -59,6 +65,22 @@ export default function SessionEndPage() {
{hhmmss(elapsed)}
+ + {/* Goal */} + {goal && ( +
+
+ 이번 목표 +
+
+ {goal} +
+
+ )} +
세션이 종료됐어요
diff --git a/src/app/session/page.tsx b/src/app/session/page.tsx index 9e790e5..cbe626d 100644 --- a/src/app/session/page.tsx +++ b/src/app/session/page.tsx @@ -293,13 +293,20 @@ export default function SessionPage() { } }, [elapsed, mode]); + useEffect(() => { + const goal = localStorage.getItem("hushroom:session-goal") ?? ""; + setGoal(goal); + }, []); + const timeMain = useMemo(() => { if (mode === "freeflow") return formatHHMMSS(elapsed); return formatHHMMSS(remaining); }, [elapsed, remaining, mode]); - const onEnd = () => - router.push(`/session/end?mode=${mode}&elapsed=${elapsed}`); + const onEnd = () => { + localStorage.setItem("hushroom:session-elapsed", elapsed.toString()); + router.push(`/session/end?mode=${mode}`); + }; return (
@@ -330,6 +337,21 @@ export default function SessionPage() { ? "원할 때 종료" : "한 번 실행되고 끝나면 요약으로 이동"} + + {/* Goal */} + {goal && ( +
+
+ 이번 목표 +
+
+ {goal} +
+
+ )}
{timeMain} diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx new file mode 100644 index 0000000..54ec8b9 --- /dev/null +++ b/src/components/Modal.tsx @@ -0,0 +1,18 @@ +// import { ReactNode } from "react"; + +// interface ModalProps { +// open: boolean; +// onClose: () => void; +// children: ReactNode; +// } + +// export default function Modal({ open, onClose, children }: ModalProps) { +// return ( +//
+// {children} +//
+// ); +// }