diff --git a/habits.db b/habits.db index 182af38..9ec18cb 100644 Binary files a/habits.db and b/habits.db differ diff --git a/src/App.tsx b/src/App.tsx index 5d0d5ec..12b3abf 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,8 +11,6 @@ export default function HabitTracker() { const [activeView, setActiveView] = useState<'habits' | 'calendar' | 'settings'>('habits'); const [darkMode, setDarkMode] = useState(() => localStorage.getItem('darkMode') === 'true'); const [currentMonth, setCurrentMonth] = useState(new Date()); - const [streakGoal, setStreakGoal] = useState(7); - const [showCompletedHabits, setShowCompletedHabits] = useState(true); const daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; @@ -135,22 +133,6 @@ export default function HabitTracker() { return habits.filter(habit => habit.completedDates.includes(date)); }; - const getStreakForHabit = (habit: Habit) => { - let streak = 0; - const today = new Date(); - for (let i = 0; i < streakGoal; i++) { - const date = new Date(today); - date.setDate(today.getDate() - i); - const dateString = date.toISOString().split('T')[0]; - if (habit.completedDates.includes(dateString)) { - streak++; - } else { - break; - } - } - return streak; - }; - const handleUpdateStreak = async (id: number, newStreak: number) => { // Prevent negative streaks if (newStreak < 0) return; @@ -294,27 +276,6 @@ export default function HabitTracker() { )} -
- Streak Goal - -
-
- Show Completed Habits - setShowCompletedHabits(e.target.checked)} - className="w-4 h-4 rounded border-gray-300 dark:border-gray-600" - /> -
)} diff --git a/src/components/HabitList.tsx b/src/components/HabitList.tsx index d6a19e2..a03fd64 100644 --- a/src/components/HabitList.tsx +++ b/src/components/HabitList.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Trash2, ChevronUp, ChevronDown } from 'lucide-react'; +import { Trash2 } from 'lucide-react'; import { Habit } from '../types'; interface HabitListProps { @@ -9,9 +9,37 @@ interface HabitListProps { onToggleHabit: (id: number, date: string) => void; onUpdateHabit: (id: number, name: string) => void; onDeleteHabit: (id: number) => void; - onUpdateStreak: (id: number, streak: number) => void; } +const calculateStreak = (completedDates: string[]): number => { + if (completedDates.length === 0) return 0; + + // Sort dates in ascending order + const sortedDates = [...completedDates].sort((a, b) => + new Date(a).getTime() - new Date(b).getTime() + ); + + let currentStreak = 1; + let maxStreak = 1; + + // Go through the dates and count consecutive completions + for (let i = 1; i < sortedDates.length; i++) { + const prevDate = new Date(sortedDates[i - 1]); + const currDate = new Date(sortedDates[i]); + + // If dates are consecutive or same day, increment streak + if (currDate.getTime() - prevDate.getTime() <= 24 * 60 * 60 * 1000) { + currentStreak++; + maxStreak = Math.max(maxStreak, currentStreak); + } else { + // Reset streak counter when there's a gap + currentStreak = 1; + } + } + + return maxStreak; +}; + export function HabitList({ habits, currentWeek, @@ -19,7 +47,6 @@ export function HabitList({ onToggleHabit, onUpdateHabit, onDeleteHabit, - onUpdateStreak }: HabitListProps) { return ( @@ -34,7 +61,12 @@ export function HabitList({ ))} - + @@ -60,23 +92,9 @@ export function HabitList({ ))}
Manual Streak + Best Streak +
+ consecutive completions +
+
Actions
-
- - - {habit.manualStreak || 0} - - -
+ + {calculateStreak(habit.completedDates)} +