Skip to content

Commit 4938c28

Browse files
Actarus35floflo0
authored andcommitted
Add calendar page (#11)
* Add calendar page * Remove unnecessary console.log
1 parent 19f69f5 commit 4938c28

20 files changed

+564
-18
lines changed

pill_mate/frontend/eslint.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default tseslint.config(
1313
...tseslint.configs.recommended,
1414
importPlugin.flatConfigs.recommended,
1515
],
16-
files: ['**/*.{ts,tsx}'],
16+
files: ['**/*.{js,ts,tsx}'],
1717
languageOptions: {
1818
ecmaVersion: 2020,
1919
globals: globals.browser,
@@ -31,6 +31,7 @@ export default tseslint.config(
3131
'comma-dangle': ['error', 'always-multiline'],
3232
'no-trailing-spaces': ['error'],
3333
'import/order': 'error',
34+
'import/no-unresolved': 'off',
3435
...reactHooks.configs.recommended.rules,
3536
'react-refresh/only-export-components': [
3637
'warn',

pill_mate/frontend/package-lock.json

Lines changed: 85 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pill_mate/frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"lucide-react": "0.475.0",
1414
"react": "^18.3.1",
1515
"react-calendar": "^5.1.0",
16+
"react-datepicker": "^8.1.0",
1617
"react-dom": "^18.3.1",
1718
"react-router": "^7.1.5",
1819
"react-router-dom": "^7.2.0"

pill_mate/frontend/src/App.css

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +0,0 @@
1-
body {
2-
margin: 0;
3-
padding: 0;
4-
box-sizing: border-box;
5-
color: white;
6-
}
7-
8-
a {
9-
text-decoration: none;
10-
}

pill_mate/frontend/src/App.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import { FC } from 'react';
22
import { BrowserRouter as Router } from 'react-router-dom';
33
import './App.css';
44
import AppRoutes from './AppRoutes.tsx';
5+
import { ReminderProvider } from './context/ReminderContext.tsx';
56

67
const App: FC = () => {
78
return (
8-
<Router>
9-
<AppRoutes />
10-
</Router>
9+
<ReminderProvider>
10+
<Router>
11+
<AppRoutes />
12+
</Router>
13+
</ReminderProvider>
1114
);
1215
};
1316

pill_mate/frontend/src/AppRoutes.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import React from 'react';
22
import { Navigate, Route, Routes } from 'react-router-dom';
33
import Dashboard from './pages/Dashboard.tsx';
4+
import Calendar from './pages/Calendar.tsx';
45

56
const AppRoutes: React.FC = () => {
67
return (
78
<Routes>
89
<Route path="/" element={<Dashboard />} />
10+
<Route path="/calendar" element={<Calendar />} />
911
<Route path="*" element={<Navigate to="/" />} />
1012
</Routes>
1113
);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
.Screen {
2+
background-color: #00000088;
3+
top: 0;
4+
left: 0;
5+
position: fixed;
6+
display: flex;
7+
flex-direction: column;
8+
align-items: center;
9+
justify-content: center;
10+
height: 100vh;
11+
width: 100vw;
12+
box-sizing: border-box;
13+
}
14+
15+
.PopUp {
16+
position: relative;
17+
background-color: var(--light_blue);
18+
display: flex;
19+
width: 300px;
20+
flex-direction: column;
21+
border: 3px solid black;
22+
align-items: center;
23+
padding: 15px;
24+
}
25+
26+
.crossIcon {
27+
position: absolute;
28+
top: 3px;
29+
right: 3px;
30+
cursor: pointer;
31+
color: black;
32+
background-color: #00000000;
33+
border: none;
34+
display: flex;
35+
justify-content: center;
36+
align-items: center;
37+
}
38+
39+
.title {
40+
align-self: left;
41+
margin: 5px;
42+
}
43+
44+
.description {
45+
font-size: 0.75rem;
46+
margin-top: 4px;
47+
}
48+
49+
.deleteButton {
50+
background-color: rgb(255, 105, 97);
51+
border: 1px solid black;
52+
cursor: pointer;
53+
justify-content: center;
54+
text-align: center;
55+
}
56+
57+
.Settings {
58+
display: flex;
59+
flex-direction: column;
60+
align-items: center;
61+
justify-content: center;
62+
gap: 10px;
63+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { FC, FormEvent, useState } from 'react';
2+
import './PopUp.css';
3+
import { CircleX, Trash2 } from 'lucide-react';
4+
import { Reminder } from '../context/ReminderContext.tsx';
5+
import { useReminders } from '../context/UseReminder.tsx';
6+
import TimePicker from './TimePicker.tsx';
7+
8+
interface Props {
9+
onClose: () => void;
10+
mode: 'Ajouter' | 'Modifier';
11+
reminder: Reminder | null;
12+
}
13+
14+
const PopUp: FC<Props> = ({ onClose, mode, reminder }) => {
15+
const { addReminder, modifyReminder, delReminder } = useReminders();
16+
17+
const [name, setName] = useState(reminder === null ? '' : reminder.name);
18+
const [heurePrise, setHeurePrise] = useState<Date | null>(
19+
reminder === null ? null : reminder.heurePrise,
20+
);
21+
const [frequence, setFrequence] = useState(reminder === null ? 1 : reminder.frequence);
22+
23+
24+
const handleSubmit = (event: FormEvent) => {
25+
event.preventDefault();
26+
if (name && heurePrise && frequence) {
27+
if (mode === 'Modifier' && reminder !== null) {
28+
modifyReminder(reminder, name, heurePrise, frequence);
29+
onClose();
30+
} else {
31+
addReminder(name, heurePrise, frequence);
32+
onClose();
33+
}
34+
35+
}
36+
};
37+
38+
return (
39+
<div className="Screen">
40+
<form className="PopUp" onSubmit={handleSubmit}>
41+
<h2>{mode === 'Ajouter' ? 'Créer un rappel' : 'Modifier le rappel'}</h2>
42+
<button
43+
type="button"
44+
title="Fermer la PopUp"
45+
onClick={onClose} className="crossIcon">
46+
<CircleX size={24}/>
47+
</button>
48+
<div className="title">Nom du rappel</div>
49+
<input
50+
type="text"
51+
required= {true}
52+
value={name}
53+
onChange={(e) => setName(e.target.value)}
54+
placeholder="Nom du rappel"
55+
/>
56+
<div className="title">Fréquence du rappel</div>
57+
<input
58+
type="number"
59+
required= {true}
60+
value={frequence}
61+
placeholder="Fréquence du rappel"
62+
min={1}
63+
onChange={(e) => setFrequence(parseInt(e.target.value))}
64+
/>
65+
<p className="description">(1 pour tous les jours, 2 pour tous les 2 jours, ...)</p>
66+
<div className="Settings">
67+
<TimePicker
68+
onHourChange={(heure) => setHeurePrise(heure)}
69+
actualHour={heurePrise}
70+
/>
71+
<button type="submit" title={
72+
mode === 'Ajouter' ? 'Ajouter le rappel' : 'Modifier le rappel'
73+
}>{mode}</button>
74+
{reminder && (
75+
<button className="deleteButton" title={'Supprimer le rappel'}
76+
onClick={() => {
77+
delReminder(reminder.id);
78+
onClose();
79+
}}>
80+
<Trash2 size={10}/> Supprimer le rappel
81+
</button>
82+
)}
83+
</div>
84+
</form>
85+
</div>
86+
);
87+
};
88+
89+
export default PopUp;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
.ReminderBar {
2+
display: flex;
3+
align-items: center;
4+
justify-content: space-between;
5+
font-size: 1rem;
6+
border: 3px solid black;
7+
width: 400px;
8+
margin: auto;
9+
padding: 3px 7.5px;
10+
color: black;
11+
box-shadow: 2px 2px 10px rgba(0,0,0,0.1);
12+
}
13+
14+
.button {
15+
background-color: var(--blue);
16+
color: white;
17+
padding: 8px 16px;
18+
border-radius: 5px;
19+
border: 1px solid black;
20+
cursor: pointer;
21+
font-weight: bold;
22+
align-self: center;
23+
}
24+
25+
.ReminderBar.blue {
26+
background-color: var(--light_blue);
27+
}

0 commit comments

Comments
 (0)