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
+ }}
+ />
+
+ )
+ })}
)
}