mirror of
https://github.com/ManInDark/HabitTrove.git
synced 2026-01-21 06:34:30 +01:00
fix completed habits map
This commit is contained in:
33
lib/atoms.ts
33
lib/atoms.ts
@@ -4,7 +4,8 @@ import {
|
||||
getDefaultHabitsData,
|
||||
getDefaultCoinsData,
|
||||
getDefaultWishlistData,
|
||||
Habit
|
||||
Habit,
|
||||
ViewType,
|
||||
} from "./types";
|
||||
import {
|
||||
getTodayInTimezone,
|
||||
@@ -72,24 +73,38 @@ export const pomodoroAtom = atom<PomodoroAtom>({
|
||||
minimized: false,
|
||||
})
|
||||
|
||||
// Derived atom for today's completions of selected habit
|
||||
// Derived atom for *fully* completed habits by date, respecting target completions
|
||||
export const completedHabitsMapAtom = atom((get) => {
|
||||
const habits = get(habitsAtom).habits
|
||||
const timezone = get(settingsAtom).system.timezone
|
||||
|
||||
const map = new Map<string, Habit[]>()
|
||||
|
||||
habits.forEach(habit => {
|
||||
// Group completions by date
|
||||
const completionsByDate = new Map<string, number>()
|
||||
|
||||
habit.completions.forEach(completion => {
|
||||
const dateKey = getISODate({ dateTime: t2d({ timestamp: completion, timezone }), timezone })
|
||||
if (!map.has(dateKey)) {
|
||||
map.set(dateKey, [])
|
||||
completionsByDate.set(dateKey, (completionsByDate.get(dateKey) || 0) + 1)
|
||||
})
|
||||
|
||||
// Check if habit meets target completions for each date
|
||||
completionsByDate.forEach((count, dateKey) => {
|
||||
const target = habit.targetCompletions || 1
|
||||
if (count >= target) {
|
||||
if (!map.has(dateKey)) {
|
||||
map.set(dateKey, [])
|
||||
}
|
||||
map.get(dateKey)!.push(habit)
|
||||
}
|
||||
map.get(dateKey)!.push(habit)
|
||||
})
|
||||
})
|
||||
|
||||
return map
|
||||
})
|
||||
|
||||
|
||||
export const pomodoroTodayCompletionsAtom = atom((get) => {
|
||||
const pomo = get(pomodoroAtom)
|
||||
const habits = get(habitsAtom)
|
||||
@@ -105,3 +120,11 @@ export const pomodoroTodayCompletionsAtom = atom((get) => {
|
||||
timezone: settings.system.timezone
|
||||
})
|
||||
})
|
||||
|
||||
export interface TransientSettings {
|
||||
viewType: ViewType
|
||||
}
|
||||
|
||||
export const transientSettingsAtom = atom<TransientSettings>({
|
||||
viewType: 'habits'
|
||||
})
|
||||
|
||||
@@ -8,6 +8,7 @@ export type Habit = {
|
||||
completions: string[] // Array of UTC ISO date strings
|
||||
}
|
||||
|
||||
|
||||
export type Freq = 'daily' | 'weekly' | 'monthly' | 'yearly'
|
||||
|
||||
export type WishlistItemType = {
|
||||
@@ -33,6 +34,7 @@ export interface HabitsData {
|
||||
habits: Habit[];
|
||||
}
|
||||
|
||||
|
||||
export interface CoinsData {
|
||||
balance: number;
|
||||
transactions: CoinTransaction[];
|
||||
@@ -49,6 +51,7 @@ export const getDefaultHabitsData = (): HabitsData => ({
|
||||
habits: []
|
||||
});
|
||||
|
||||
|
||||
export const getDefaultCoinsData = (): CoinsData => ({
|
||||
balance: 0,
|
||||
transactions: []
|
||||
@@ -103,6 +106,8 @@ export interface Settings {
|
||||
profile: ProfileSettings;
|
||||
}
|
||||
|
||||
export type ViewType = 'habits' | 'tasks'
|
||||
|
||||
export interface JotaiHydrateInitialValues {
|
||||
settings: Settings;
|
||||
coins: CoinsData;
|
||||
|
||||
Reference in New Issue
Block a user