Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pill_mate/frontend/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FC } from 'react';
import { BrowserRouter as Router } from 'react-router-dom';
import { HashRouter as Router } from 'react-router-dom';
import './App.css';
import AppRoutes from './AppRoutes.tsx';
import { ReminderProvider } from './context/ReminderContext.tsx';
Expand Down
22 changes: 18 additions & 4 deletions pill_mate/frontend/src/AppRoutes.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
import React from 'react';
import { Navigate, Route, Routes } from 'react-router-dom';
import { useUser } from './context/useUser.tsx';
import Dashboard from './pages/Dashboard.tsx';
import Calendar from './pages/Calendar.tsx';
import CreateUser from './pages/CreateUser.tsx';
import Stock from './pages/Stock.tsx' ;

const AppRoutes: React.FC = () => {

const { user } = useUser();

return (
<Routes>
<Route path="/" element={<Dashboard />} />
<Route path="/calendar" element={<Calendar />} />
<Route path="/stock" element={<Stock />} />
<Route path="*" element={<Navigate to="/" />} />
{!user ? (
<>
<Route path="/create-user" element={<CreateUser />} />
<Route path="*" element={<Navigate to="/create-user" />} />
</>
) : (
<>
<Route path="/" element={<Dashboard />} />
<Route path="/calendar" element={<Calendar />} />
<Route path="/stock" element={<Stock />} />
<Route path="*" element={<Navigate to="/" />} />
</>
)}
</Routes>
);
};
Expand Down
1 change: 1 addition & 0 deletions pill_mate/frontend/src/components/ReminderCard.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

.button {
background-color: var(--blue);
font-size: 1rem;
color: white;
padding: 8px 16px;
border-radius: 5px;
Expand Down
10 changes: 10 additions & 0 deletions pill_mate/frontend/src/context/UserContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { createContext } from 'react';
import { UserRole } from '../models/UserRole';
import { User } from '../models/User';

export interface UserContextType {
user: User | null;
createUser: (role: UserRole) => Promise<void>;
}

export const UserContext = createContext<UserContextType | undefined>(undefined);
40 changes: 40 additions & 0 deletions pill_mate/frontend/src/context/UserProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import React, { useState, useEffect, ReactNode } from 'react';
import { getUserInfo, createUser as apiCreateUser } from '../services/userServices.tsx';
import { UserRole } from '../models/UserRole.ts';
import { User } from '../models/User.ts';
import { UserContext } from './UserContext.tsx';

interface UserProviderProps {
children: ReactNode;
}

export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
const [user, setUser] = useState<User | null | undefined>(undefined);

useEffect(() => {
const loadUserInfo = async () => {
try {
const userInfo = await getUserInfo();
setUser(userInfo);
} catch {
setUser(null);
}
};
loadUserInfo();
}, []);

const createUser = async (role: UserRole) => {
const newUser = await apiCreateUser(role);
setUser(newUser);
};

if (user === undefined) {
return <div>Loading...</div>;
}

return (
<UserContext.Provider value={{ user, createUser }}>
{children}
</UserContext.Provider>
);
};
10 changes: 10 additions & 0 deletions pill_mate/frontend/src/context/useUser.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { useContext } from 'react';
import { UserContext } from './UserContext.tsx';

export const useUser = () => {
const context = useContext(UserContext);
if (!context) {
throw new Error('useUser must be used within a UserProvider');
}
return context;
};
8 changes: 7 additions & 1 deletion pill_mate/frontend/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@ import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.tsx';
import './index.css';
import { UserProvider } from './context/UserProvider.tsx';
import { ReminderProvider } from './context/ReminderContext.tsx';

const rootElement = document.getElementById('root');

createRoot(rootElement!).render(
<StrictMode>
<App />
<UserProvider>
<ReminderProvider>
<App />
</ReminderProvider>
</UserProvider>
</StrictMode>,
);
8 changes: 8 additions & 0 deletions pill_mate/frontend/src/models/User.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { UserRole } from './UserRole.ts';

export interface User {
homeAssistantUserId: string;
userName: string;
userDisplayName: string;
role: UserRole;
}
4 changes: 4 additions & 0 deletions pill_mate/frontend/src/models/UserRole.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum UserRole {
HELPED = 0,
HELPER = 1
}
1 change: 0 additions & 1 deletion pill_mate/frontend/src/pages/Calendar.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
align-items: center;
flex-grow: 1;
gap: 10px;

}

.Link {
Expand Down
22 changes: 22 additions & 0 deletions pill_mate/frontend/src/pages/CreateUser.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.CreateUser {
display: flex;
padding: 24%;
flex-direction: column;
align-items: center;
box-sizing: border-box;
justify-content: center;
position: relative;
background: linear-gradient(135deg, rgb(33, 150, 243), rgb(156, 39, 176));
}

.title {
font-size: 3rem;
text-align: center;
}

.questionnaire {
display: flex;
flex-direction: column;
gap: 10px;
align-items: center;
}
33 changes: 33 additions & 0 deletions pill_mate/frontend/src/pages/CreateUser.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useUser } from '../context/useUser';
import { UserRole } from '../models/UserRole';
import './CreateUser.css';

const CreateUser = () => {
const { createUser } = useUser();
const [role] = useState(UserRole.HELPED);
const navigate = useNavigate();

const handleSubmit = async (event: React.FormEvent) => {
event.preventDefault();
await createUser(role);
navigate('/dashboard');
};

return (
<div className="CreateUser">
<div className="title">Bienvenue sur PillMate</div>
<form className="questionnaire" onSubmit={handleSubmit}>
<h2>Quel est votre rôle ?</h2>
<select name="role">
<option value={UserRole.HELPED}>Personne aidée</option>
<option value={UserRole.HELPER}>Personne aidante</option>
</select>
<button type="submit">Valider</button>
</form>
</div>
);
};

export default CreateUser;
10 changes: 10 additions & 0 deletions pill_mate/frontend/src/pages/Dashboard.css
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,13 @@
background: transparent;
cursor: pointer;
}

.button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 5vw;
font-weight: bold;
}

32 changes: 32 additions & 0 deletions pill_mate/frontend/src/services/userServices.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { UserRole } from '../models/UserRole';
import { User } from '../models/User';

const API_URL = 'api';

export const getUserInfo = async (): Promise<User | null> => {
const response = await fetch(`${API_URL}/user/me`);
if (response.ok){
return response.json();
}

if (response.status === 404) {
return null;
}
throw new Error('Erreur lors de la récupération des informations de l\'utilisateur');
};

export const createUser = async (role: UserRole): Promise<User> => {
const response = await fetch(`${API_URL}/user`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ role }),
});

if (!response.ok) {
throw new Error('Erreur lors de la création de l\'utilisateur');
}

return response.json();
};