diff --git a/app/application/habits/index.tsx b/app/application/habits/index.tsx index 2623222..f1b5c5e 100644 --- a/app/application/habits/index.tsx +++ b/app/application/habits/index.tsx @@ -21,7 +21,7 @@ const HabitsPage: React.FC = () => { {retrieveHabitsTracker.state === "loading" ? ( ) : ( - + )} ) diff --git a/domain/entities/HabitsTracker.ts b/domain/entities/HabitsTracker.ts index efda364..7437a9b 100644 --- a/domain/entities/HabitsTracker.ts +++ b/domain/entities/HabitsTracker.ts @@ -1,11 +1,14 @@ +import type { GoalFrequency } from "./Goal" import type { HabitHistory } from "./HabitHistory" export interface HabitsTrackerData { - habitsHistory: HabitHistory[] + habitsHistory: { + [key in GoalFrequency]: HabitHistory[] + } } export class HabitsTracker implements HabitsTrackerData { - public habitsHistory: HabitHistory[] + public habitsHistory: HabitsTrackerData["habitsHistory"] public constructor(options: HabitsTrackerData) { const { habitsHistory } = options @@ -13,6 +16,12 @@ export class HabitsTracker implements HabitsTrackerData { } public static default(): HabitsTracker { - return new HabitsTracker({ habitsHistory: [] }) + return new HabitsTracker({ + habitsHistory: { + daily: [], + weekly: [], + monthly: [], + }, + }) } } diff --git a/domain/use-cases/RetrieveHabitsTracker.ts b/domain/use-cases/RetrieveHabitsTracker.ts index ead3fc2..dd04f40 100644 --- a/domain/use-cases/RetrieveHabitsTracker.ts +++ b/domain/use-cases/RetrieveHabitsTracker.ts @@ -1,4 +1,5 @@ import { HabitHistory } from "../entities/HabitHistory" +import type { HabitsTrackerData } from "../entities/HabitsTracker" import { HabitsTracker } from "../entities/HabitsTracker" import type { User } from "../entities/User" import type { GetHabitProgressHistoryRepository } from "../repositories/GetHabitProgressHistory" @@ -44,8 +45,23 @@ export class RetrieveHabitsTrackerUseCase }) }), ) + const habitsHistory = habitProgressHistories.reduce< + HabitsTrackerData["habitsHistory"] + >( + (accumulator, habitHistory) => { + const { habit } = habitHistory + const frequency = habit.goal.frequency + accumulator[frequency].push(habitHistory) + return accumulator + }, + { + daily: [], + weekly: [], + monthly: [], + }, + ) const habitsTracker = new HabitsTracker({ - habitsHistory: habitProgressHistories, + habitsHistory, }) return habitsTracker } diff --git a/presentation/presenters/utils/strings.ts b/presentation/presenters/utils/strings.ts new file mode 100644 index 0000000..df75057 --- /dev/null +++ b/presentation/presenters/utils/strings.ts @@ -0,0 +1,3 @@ +export const capitalize = (string: string): string => { + return string.charAt(0).toUpperCase() + string.slice(1) +} diff --git a/presentation/react/components/HabitsHistory/HabitsHistory.tsx b/presentation/react/components/HabitsHistory/HabitsHistory.tsx index baf799d..33eef0b 100644 --- a/presentation/react/components/HabitsHistory/HabitsHistory.tsx +++ b/presentation/react/components/HabitsHistory/HabitsHistory.tsx @@ -1,30 +1,65 @@ import { FlatList } from "react-native" import { List } from "react-native-paper" +import { useState } from "react" -import type { HabitHistory as HabitHistoryType } from "@/domain/entities/HabitHistory" +import type { GoalFrequency } from "@/domain/entities/Goal" +import { GOAL_FREQUENCIES } from "@/domain/entities/Goal" +import type { HabitsTracker } from "@/domain/entities/HabitsTracker" +import { capitalize } from "@/presentation/presenters/utils/strings" import { HabitHistory } from "./HabitHistory" export interface HabitsHistoryProps { - habitsHistory: HabitHistoryType[] + habitsTracker: HabitsTracker } export const HabitsHistory: React.FC = (props) => { - const { habitsHistory } = props + const { habitsTracker } = props + + const [accordionExpanded, setAccordionExpanded] = useState<{ + [key in GoalFrequency]: boolean + }>({ + daily: true, + weekly: true, + monthly: true, + }) return ( - { - return - }} - /> + {GOAL_FREQUENCIES.map((frequency) => { + return ( + { + setAccordionExpanded((old) => { + return { + ...old, + [frequency]: !old[frequency], + } + }) + }} + key={frequency} + title={capitalize(frequency)} + titleStyle={[ + { + fontSize: 26, + }, + ]} + > + { + return + }} + /> + + ) + })} ) }