mirror of
https://github.com/ManInDark/HabitTrove.git
synced 2026-01-21 06:34:30 +01:00
69 lines
1.9 KiB
TypeScript
69 lines
1.9 KiB
TypeScript
'use client'
|
|
|
|
import { habitsAtom, settingsAtom } from "@/lib/atoms";
|
|
import { Habit } from "@/lib/types";
|
|
import { useAtom } from "jotai";
|
|
import { DateTime } from "luxon";
|
|
|
|
|
|
|
|
type CompletionCache = {
|
|
[dateKey: string]: { // dateKey format: "YYYY-MM-DD"
|
|
[habitId: string]: number // number of completions on that date
|
|
}
|
|
}
|
|
|
|
|
|
export default function DebugPage() {
|
|
const [habits] = useAtom(habitsAtom);
|
|
const [settings] = useAtom(settingsAtom);
|
|
|
|
function buildCompletionCache(habits: Habit[], timezone: string): CompletionCache {
|
|
const cache: CompletionCache = {};
|
|
|
|
habits.forEach(habit => {
|
|
habit.completions.forEach(utcTimestamp => {
|
|
// Convert UTC timestamp to local date string in specified timezone
|
|
const localDate = DateTime
|
|
.fromISO(utcTimestamp)
|
|
.setZone(timezone)
|
|
.toFormat('yyyy-MM-dd');
|
|
|
|
if (!cache[localDate]) {
|
|
cache[localDate] = {};
|
|
}
|
|
|
|
// Increment completion count for this habit on this date
|
|
cache[localDate][habit.id] = (cache[localDate][habit.id] || 0) + 1;
|
|
});
|
|
});
|
|
|
|
return cache;
|
|
}
|
|
|
|
function getCompletedHabitsForDate(
|
|
habits: Habit[],
|
|
date: DateTime,
|
|
timezone: string,
|
|
completionCache: CompletionCache
|
|
): Habit[] {
|
|
const dateKey = date.setZone(timezone).toFormat('yyyy-MM-dd');
|
|
const dateCompletions = completionCache[dateKey] || {};
|
|
|
|
return habits.filter(habit => {
|
|
const completionsNeeded = habit.targetCompletions || 1;
|
|
const completionsAchieved = dateCompletions[habit.id] || 0;
|
|
return completionsAchieved >= completionsNeeded;
|
|
});
|
|
}
|
|
|
|
const habitCache = buildCompletionCache(habits.habits, settings.system.timezone);
|
|
|
|
return (
|
|
<div className="p-4">
|
|
<h1 className="text-xl font-bold mb-4">Debug Page</h1>
|
|
<div className="bg-gray-100 p-4 rounded break-all">
|
|
</div>
|
|
</div>
|
|
);
|
|
} |