chore: fixes
This commit is contained in:
parent
20b4456245
commit
c11f7c1474
@ -4,11 +4,11 @@ import { Agenda } from "react-native-calendars"
|
|||||||
import { Text } from "react-native-paper"
|
import { Text } from "react-native-paper"
|
||||||
import { SafeAreaView } from "react-native-safe-area-context"
|
import { SafeAreaView } from "react-native-safe-area-context"
|
||||||
|
|
||||||
import { getISODate } from "@/utils/dates"
|
import { getISODate, getNowDate } from "@/utils/dates"
|
||||||
|
|
||||||
const HistoryPage: React.FC = () => {
|
const HistoryPage: React.FC = () => {
|
||||||
const today = useMemo(() => {
|
const today = useMemo(() => {
|
||||||
return new Date()
|
return getNowDate()
|
||||||
}, [])
|
}, [])
|
||||||
const todayISO = getISODate(today)
|
const todayISO = getISODate(today)
|
||||||
|
|
||||||
|
@ -23,13 +23,13 @@ Une pipeline CI ([`.gitlab-ci.yml`](../.gitlab-ci.yml)) est en place pour vérif
|
|||||||
|
|
||||||
## GitFlow
|
## GitFlow
|
||||||
|
|
||||||
Le projet suit la convention [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) reposant sur 2 branches principales:
|
Le projet suit la convention [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) reposant sur 3 branches principales:
|
||||||
|
|
||||||
- `main`: Contient le code de la dernière version stable et déployé en production.
|
- `main`: Contient le code de la dernière version stable et déployé en production.
|
||||||
- `staging`: Contient le code en cours de test avant déploiement en production, Quality Assurance (QA).
|
- `staging`: Contient le code en cours de test avant déploiement en production, Quality Assurance (QA).
|
||||||
- `develop`: Contient le code en cours de développement. Les nouvelles fonctionnalités et les correctifs de bugs sont fusionnés ici.
|
- `develop`: Contient le code en cours de développement. Les nouvelles fonctionnalités et les correctifs de bugs sont fusionnés ici régulièrement.
|
||||||
|
|
||||||
Chaque nouvelle fonctionnalité ou correctif de bug est développé dans une branche dédiée à partir de `develop`, nommée `feat/<nom-de-la-fonctionnalité>` ou `fix/<nom-du-bug>`. Une fois le développement terminé, une merge request est créée pour demander une revue de code, et une fois validée, la branche est fusionnée dans `develop`, puis supprimée.
|
Idéalement, chaque nouvelle fonctionnalité ou correctif de bug est développé dans une branche dédiée à partir de `develop`, nommée `feat/<nom-de-la-fonctionnalité>` ou `fix/<nom-du-bug>`. Une fois le développement terminé, une merge request est créée pour demander une revue de code, et une fois validée, la branche est fusionnée dans `develop`, puis supprimée.
|
||||||
|
|
||||||
## Convention des commits
|
## Convention des commits
|
||||||
|
|
||||||
@ -39,4 +39,4 @@ Les commits doivent être **atomiques** c'est à dire qu'il respecte 3 règles:
|
|||||||
|
|
||||||
- Ne concerne qu'un seul sujet (une fonctionnalité, une correction de bug, etc.).
|
- Ne concerne qu'un seul sujet (une fonctionnalité, une correction de bug, etc.).
|
||||||
- Doit avoir un message clair et concis.
|
- Doit avoir un message clair et concis.
|
||||||
- Ne doit pas rendre de dépôt "incohérent" (bloque la CI du projet).
|
- Ne doit pas rendre de dépôt "incohérent" (ne bloque pas la CI du projet).
|
||||||
|
@ -1,25 +1,20 @@
|
|||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
import { Dimensions, ScrollView } from "react-native"
|
import { Dimensions, ScrollView } from "react-native"
|
||||||
import { List } from "react-native-paper"
|
import { Divider, List } from "react-native-paper"
|
||||||
|
|
||||||
import type { GoalFrequency } from "@/domain/entities/Goal"
|
import type { GoalFrequency } from "@/domain/entities/Goal"
|
||||||
import { GOAL_FREQUENCIES } from "@/domain/entities/Goal"
|
|
||||||
import type { HabitsTracker } from "@/domain/entities/HabitsTracker"
|
import type { HabitsTracker } from "@/domain/entities/HabitsTracker"
|
||||||
import { capitalize } from "@/utils/strings"
|
import { capitalize } from "@/utils/strings"
|
||||||
import { HabitCard } from "./HabitCard"
|
import { HabitCard } from "./HabitCard"
|
||||||
import { HabitsEmpty } from "./HabitsEmpty"
|
|
||||||
|
|
||||||
export interface HabitsListProps {
|
export interface HabitsListProps {
|
||||||
habitsTracker: HabitsTracker
|
habitsTracker: HabitsTracker
|
||||||
selectedDate: Date
|
selectedDate: Date
|
||||||
|
frequenciesFiltered: GoalFrequency[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export const HabitsList: React.FC<HabitsListProps> = (props) => {
|
export const HabitsList: React.FC<HabitsListProps> = (props) => {
|
||||||
const { habitsTracker, selectedDate } = props
|
const { habitsTracker, selectedDate, frequenciesFiltered } = props
|
||||||
|
|
||||||
const frequenciesFiltered = GOAL_FREQUENCIES.filter((frequency) => {
|
|
||||||
return habitsTracker.habitsHistory[frequency].length > 0
|
|
||||||
})
|
|
||||||
|
|
||||||
const [accordionExpanded, setAccordionExpanded] = useState<{
|
const [accordionExpanded, setAccordionExpanded] = useState<{
|
||||||
[key in GoalFrequency]: boolean
|
[key in GoalFrequency]: boolean
|
||||||
@ -29,18 +24,16 @@ export const HabitsList: React.FC<HabitsListProps> = (props) => {
|
|||||||
monthly: true,
|
monthly: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (frequenciesFiltered.length <= 0) {
|
|
||||||
return <HabitsEmpty />
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollView
|
<ScrollView
|
||||||
showsVerticalScrollIndicator={false}
|
showsVerticalScrollIndicator={false}
|
||||||
style={{
|
style={{
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
width: Dimensions.get("window").width,
|
width: Dimensions.get("window").width,
|
||||||
|
backgroundColor: "white",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
<Divider />
|
||||||
<List.Section>
|
<List.Section>
|
||||||
{frequenciesFiltered.map((frequency) => {
|
{frequenciesFiltered.map((frequency) => {
|
||||||
return (
|
return (
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import { useMemo, useState } from "react"
|
import { useState } from "react"
|
||||||
import { Agenda } from "react-native-calendars"
|
import { Agenda } from "react-native-calendars"
|
||||||
|
|
||||||
|
import { GOAL_FREQUENCIES } from "@/domain/entities/Goal"
|
||||||
import type { HabitsTracker } from "@/domain/entities/HabitsTracker"
|
import type { HabitsTracker } from "@/domain/entities/HabitsTracker"
|
||||||
import { getISODate } from "@/utils/dates"
|
import { getISODate, getNowDate } from "@/utils/dates"
|
||||||
|
import { HabitsEmpty } from "./HabitsEmpty"
|
||||||
import { HabitsList } from "./HabitsList"
|
import { HabitsList } from "./HabitsList"
|
||||||
|
|
||||||
export interface HabitsMainPageProps {
|
export interface HabitsMainPageProps {
|
||||||
@ -12,31 +14,38 @@ export interface HabitsMainPageProps {
|
|||||||
export const HabitsMainPage: React.FC<HabitsMainPageProps> = (props) => {
|
export const HabitsMainPage: React.FC<HabitsMainPageProps> = (props) => {
|
||||||
const { habitsTracker } = props
|
const { habitsTracker } = props
|
||||||
|
|
||||||
const today = useMemo(() => {
|
const today = getNowDate()
|
||||||
return new Date()
|
|
||||||
}, [])
|
|
||||||
const todayISO = getISODate(today)
|
const todayISO = getISODate(today)
|
||||||
|
|
||||||
const [selectedDate, setSelectedDate] = useState<Date>(today)
|
const [selectedDate, setSelectedDate] = useState<Date>(today)
|
||||||
const selectedISODate = getISODate(selectedDate)
|
const selectedDateISO = getISODate(selectedDate)
|
||||||
|
|
||||||
|
const frequenciesFiltered = GOAL_FREQUENCIES.filter((frequency) => {
|
||||||
|
return habitsTracker.habitsHistory[frequency].length > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
if (frequenciesFiltered.length <= 0) {
|
||||||
|
return <HabitsEmpty />
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Agenda
|
<Agenda
|
||||||
firstDay={1}
|
firstDay={1}
|
||||||
showClosingKnob
|
showClosingKnob
|
||||||
showOnlySelectedDayItems
|
|
||||||
onDayPress={(date) => {
|
onDayPress={(date) => {
|
||||||
setSelectedDate(new Date(date.dateString))
|
setSelectedDate(new Date(date.dateString))
|
||||||
}}
|
}}
|
||||||
markedDates={{
|
markedDates={{
|
||||||
[todayISO]: { marked: true },
|
[todayISO]: { marked: true, today: true },
|
||||||
}}
|
}}
|
||||||
selected={selectedISODate}
|
maxDate={todayISO}
|
||||||
|
selected={selectedDateISO}
|
||||||
renderList={() => {
|
renderList={() => {
|
||||||
return (
|
return (
|
||||||
<HabitsList
|
<HabitsList
|
||||||
habitsTracker={habitsTracker}
|
habitsTracker={habitsTracker}
|
||||||
selectedDate={selectedDate}
|
selectedDate={selectedDate}
|
||||||
|
frequenciesFiltered={frequenciesFiltered}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
|
@ -11,6 +11,19 @@ export const getISODate = (date: Date): string => {
|
|||||||
return date.toISOString().slice(0, 10)
|
return date.toISOString().slice(0, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getNowDate = (): Date => {
|
||||||
|
const date = new Date()
|
||||||
|
const milliseconds = Date.UTC(
|
||||||
|
date.getFullYear(),
|
||||||
|
date.getMonth(),
|
||||||
|
date.getDate(),
|
||||||
|
date.getHours(),
|
||||||
|
date.getMinutes(),
|
||||||
|
date.getSeconds(),
|
||||||
|
)
|
||||||
|
return new Date(milliseconds)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the week number [1-52] for a given date.
|
* Get the week number [1-52] for a given date.
|
||||||
* @param {Date} date
|
* @param {Date} date
|
||||||
|
Reference in New Issue
Block a user