Skip to content

Commit 74d30a9

Browse files
authored
Add user registration (#20)
1 parent 23e04f7 commit 74d30a9

File tree

14 files changed

+196
-7
lines changed

14 files changed

+196
-7
lines changed

pill_mate/frontend/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { FC } from 'react';
2-
import { BrowserRouter as Router } from 'react-router-dom';
2+
import { HashRouter as Router } from 'react-router-dom';
33
import './App.css';
44
import AppRoutes from './AppRoutes.tsx';
55
import { ReminderProvider } from './context/ReminderContext.tsx';

pill_mate/frontend/src/AppRoutes.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
import React from 'react';
22
import { Navigate, Route, Routes } from 'react-router-dom';
3+
import { useUser } from './context/useUser.tsx';
34
import Dashboard from './pages/Dashboard.tsx';
45
import Calendar from './pages/Calendar.tsx';
6+
import CreateUser from './pages/CreateUser.tsx';
57
import Stock from './pages/Stock.tsx' ;
68

79
const AppRoutes: React.FC = () => {
10+
11+
const { user } = useUser();
12+
813
return (
914
<Routes>
10-
<Route path="/" element={<Dashboard />} />
11-
<Route path="/calendar" element={<Calendar />} />
12-
<Route path="/stock" element={<Stock />} />
13-
<Route path="*" element={<Navigate to="/" />} />
15+
{!user ? (
16+
<>
17+
<Route path="/create-user" element={<CreateUser />} />
18+
<Route path="*" element={<Navigate to="/create-user" />} />
19+
</>
20+
) : (
21+
<>
22+
<Route path="/" element={<Dashboard />} />
23+
<Route path="/calendar" element={<Calendar />} />
24+
<Route path="/stock" element={<Stock />} />
25+
<Route path="*" element={<Navigate to="/" />} />
26+
</>
27+
)}
1428
</Routes>
1529
);
1630
};

pill_mate/frontend/src/components/ReminderCard.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
.button {
1515
background-color: var(--blue);
16+
font-size: 1rem;
1617
color: white;
1718
padding: 8px 16px;
1819
border-radius: 5px;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { createContext } from 'react';
2+
import { UserRole } from '../models/UserRole';
3+
import { User } from '../models/User';
4+
5+
export interface UserContextType {
6+
user: User | null;
7+
createUser: (role: UserRole) => Promise<void>;
8+
}
9+
10+
export const UserContext = createContext<UserContextType | undefined>(undefined);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React, { useState, useEffect, ReactNode } from 'react';
2+
import { getUserInfo, createUser as apiCreateUser } from '../services/userServices.tsx';
3+
import { UserRole } from '../models/UserRole.ts';
4+
import { User } from '../models/User.ts';
5+
import { UserContext } from './UserContext.tsx';
6+
7+
interface UserProviderProps {
8+
children: ReactNode;
9+
}
10+
11+
export const UserProvider: React.FC<UserProviderProps> = ({ children }) => {
12+
const [user, setUser] = useState<User | null | undefined>(undefined);
13+
14+
useEffect(() => {
15+
const loadUserInfo = async () => {
16+
try {
17+
const userInfo = await getUserInfo();
18+
setUser(userInfo);
19+
} catch {
20+
setUser(null);
21+
}
22+
};
23+
loadUserInfo();
24+
}, []);
25+
26+
const createUser = async (role: UserRole) => {
27+
const newUser = await apiCreateUser(role);
28+
setUser(newUser);
29+
};
30+
31+
if (user === undefined) {
32+
return <div>Loading...</div>;
33+
}
34+
35+
return (
36+
<UserContext.Provider value={{ user, createUser }}>
37+
{children}
38+
</UserContext.Provider>
39+
);
40+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { useContext } from 'react';
2+
import { UserContext } from './UserContext.tsx';
3+
4+
export const useUser = () => {
5+
const context = useContext(UserContext);
6+
if (!context) {
7+
throw new Error('useUser must be used within a UserProvider');
8+
}
9+
return context;
10+
};

pill_mate/frontend/src/main.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ import { StrictMode } from 'react';
22
import { createRoot } from 'react-dom/client';
33
import App from './App.tsx';
44
import './index.css';
5+
import { UserProvider } from './context/UserProvider.tsx';
6+
import { ReminderProvider } from './context/ReminderContext.tsx';
57

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

810
createRoot(rootElement!).render(
911
<StrictMode>
10-
<App />
12+
<UserProvider>
13+
<ReminderProvider>
14+
<App />
15+
</ReminderProvider>
16+
</UserProvider>
1117
</StrictMode>,
1218
);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { UserRole } from './UserRole.ts';
2+
3+
export interface User {
4+
homeAssistantUserId: string;
5+
userName: string;
6+
userDisplayName: string;
7+
role: UserRole;
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum UserRole {
2+
HELPED = 0,
3+
HELPER = 1
4+
}

pill_mate/frontend/src/pages/Calendar.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
align-items: center;
2222
flex-grow: 1;
2323
gap: 10px;
24-
2524
}
2625

2726
.Link {

0 commit comments

Comments
 (0)