From 003ee3851e2f23e1ea12500f0f4efa40fb429ca0 Mon Sep 17 00:00:00 2001 From: masongga Date: Sun, 24 May 2026 10:22:46 -0600 Subject: [PATCH] added favicon and added timer to habits --- app/favicon.ico | Bin 25931 -> 174228 bytes components/habits/daily-tasks-countdown.tsx | 73 ++++++++++++++++++++ components/habits/habit-tracker.tsx | 47 +++++++++---- lib/daily-quiz-storage.ts | 8 +-- lib/date-keys.ts | 9 +++ 5 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 components/habits/daily-tasks-countdown.tsx diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..942c7690ed6d1e6d115cb91e5121e5e5b459d7d7 100644 GIT binary patch literal 174228 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 LrJugUA?W`A8`#=m diff --git a/components/habits/daily-tasks-countdown.tsx b/components/habits/daily-tasks-countdown.tsx new file mode 100644 index 0000000..e480764 --- /dev/null +++ b/components/habits/daily-tasks-countdown.tsx @@ -0,0 +1,73 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; + +import { + formatCountdownDuration, + getMillisecondsUntilLocalMidnight, + getNextLocalMidnight, +} from "@/lib/date-keys"; +import { cn } from "@/lib/utils"; + +type DailyTasksCountdownProps = { + className?: string; + onDayChange?: () => void; +}; + +export function DailyTasksCountdown({ + className, + onDayChange, +}: DailyTasksCountdownProps) { + const [remainingMs, setRemainingMs] = useState(() => + getMillisecondsUntilLocalMidnight(), + ); + const hasNotifiedRef = useRef(false); + + useEffect(() => { + const tick = () => { + const nextRemainingMs = getMillisecondsUntilLocalMidnight(); + setRemainingMs(nextRemainingMs); + + if (nextRemainingMs === 0) { + if (!hasNotifiedRef.current) { + hasNotifiedRef.current = true; + onDayChange?.(); + } + return; + } + + hasNotifiedRef.current = false; + }; + + tick(); + const intervalId = window.setInterval(tick, 1000); + + return () => { + window.clearInterval(intervalId); + }; + }, [onDayChange]); + + const resetsAtLabel = getNextLocalMidnight().toLocaleTimeString(undefined, { + hour: "numeric", + minute: "2-digit", + }); + + return ( +
+

+ Time remaining today{" "} + + {formatCountdownDuration(remainingMs)} + +

+

+ Tasks reset at midnight ({resetsAtLabel}) +

+
+ ); +} diff --git a/components/habits/habit-tracker.tsx b/components/habits/habit-tracker.tsx index 46e92dd..a74ef98 100644 --- a/components/habits/habit-tracker.tsx +++ b/components/habits/habit-tracker.tsx @@ -3,6 +3,7 @@ import { Loader2 } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; +import { DailyTasksCountdown } from "@/components/habits/daily-tasks-countdown"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -41,6 +42,29 @@ const reasonLabels = { suggested: "Suggested for you", } as const; +function DailyTasksCardHeader({ + description, + onDayChange, +}: { + description: string; + onDayChange: () => void; +}) { + return ( + +
+
+ Today's tasks + {description} +
+ +
+
+ ); +} + function DailyTaskList({ tasks, getIsCompleted, @@ -424,13 +448,12 @@ export function HabitTracker({ mode = "daily" }: HabitTrackerProps) { return (
- - Today's tasks - - Personalized from your focus topics - {quizCompletedToday ? ", today's quiz," : ""} and custom habits. - - + {error ?

{error}

: null} {coinMessage ? ( @@ -572,12 +595,10 @@ export function HabitTracker({ mode = "daily" }: HabitTrackerProps) { return ( - - Today's tasks - - Personalized from your profile, daily quiz, journal, and custom habits. - - + {error ?

{error}

: null} {coinMessage ? ( diff --git a/lib/daily-quiz-storage.ts b/lib/daily-quiz-storage.ts index f4eac1c..62bb053 100644 --- a/lib/daily-quiz-storage.ts +++ b/lib/daily-quiz-storage.ts @@ -6,6 +6,7 @@ import { } from "@/lib/avatar-state"; import { notifyHabitPetDataUpdated } from "@/lib/app-events"; import { + formatCountdownDuration, getMillisecondsUntilLocalMidnight, getNextLocalMidnight, getTodayDateKey, @@ -36,12 +37,7 @@ export function getMillisecondsUntilNextDailyQuiz(from = new Date()) { } export function formatDailyQuizCountdown(milliseconds: number) { - const totalSeconds = Math.max(0, Math.floor(milliseconds / 1000)); - const hours = Math.floor(totalSeconds / 3600); - const minutes = Math.floor((totalSeconds % 3600) / 60); - const seconds = totalSeconds % 60; - - return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`; + return formatCountdownDuration(milliseconds); } export async function resetTodaysDailyQuiz() { diff --git a/lib/date-keys.ts b/lib/date-keys.ts index 5593d29..7013847 100644 --- a/lib/date-keys.ts +++ b/lib/date-keys.ts @@ -17,3 +17,12 @@ export function getNextLocalMidnight(from = new Date()) { export function getMillisecondsUntilLocalMidnight(from = new Date()) { return Math.max(0, getNextLocalMidnight(from).getTime() - from.getTime()); } + +export function formatCountdownDuration(milliseconds: number) { + const totalSeconds = Math.max(0, Math.floor(milliseconds / 1000)); + const hours = Math.floor(totalSeconds / 3600); + const minutes = Math.floor((totalSeconds % 3600) / 60); + const seconds = totalSeconds % 60; + + return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`; +}