diff --git a/src/App.tsx b/src/App.tsx index f82322f..6af740f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,28 +1,84 @@ // App.tsx -import {BrowserRouter as Router, Routes, Route, Navigate, Link} from 'react-router-dom'; +import {BrowserRouter as Router, Routes, Route, Link, Navigate, Outlet, useNavigate} from 'react-router-dom'; import {MainPage} from "./pages/MainPage.tsx"; import {SurveyPage} from "./pages/SurveyPage.tsx"; import {DashboardPage} from "./pages/DashboardPage.tsx"; import { SurveyResultPage } from './pages/SurveyResultPage.tsx'; import { ProfessionPage } from './pages/ProfessionPage.tsx'; - +import React, {useEffect} from "react"; +import {LoginPage} from "./pages/LoginPage.tsx"; +import {UserProvider} from "./utils/users/UserProvider.tsx"; +import {useUser} from "./utils/users/UseUser.ts"; export default function App() { return ( - + + + + + } /> + + + }> + } /> + + + + }> + } /> + } /> + } /> + } /> + + + } /> + + + + ); +} + + +export function DashboardLayout() { + const { user } = useUser(); + const navigate = useNavigate(); + + useEffect(() => { + if (!user) { + navigate("/login/") + } + }, [navigate, user]); + + if (!user){ + return null; + } + + return ( + <> +
+

Pro-Fi

+
+
+ +
+ + ); +} + + +function MainLayout() { + return ( + <>

Pro-Fi Test

- - }/> - }/> - }/> - }/> - }/> - {/* }/> */} - -
+
+ +
+ ); -} \ No newline at end of file +} + + diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx new file mode 100644 index 0000000..8d45150 --- /dev/null +++ b/src/pages/LoginPage.tsx @@ -0,0 +1,3 @@ +export function LoginPage() { + return null; +} diff --git a/src/types/users.ts b/src/types/users.ts new file mode 100644 index 0000000..7f45343 --- /dev/null +++ b/src/types/users.ts @@ -0,0 +1,22 @@ +import {UniqueItem} from "./common.ts"; + + +export interface ContactData{ + first_name: string; + last_name?: string; + middle_name?: string; + phone?: string; + email?:string; +} + +interface Role extends UniqueItem{ + title: string; +} + +export interface Account extends UniqueItem, ContactData{ + login: string; + role?: Role; + is_staff: boolean; + is_active: boolean; + +} \ No newline at end of file diff --git a/src/utils/users/UseUser.ts b/src/utils/users/UseUser.ts new file mode 100644 index 0000000..22492a8 --- /dev/null +++ b/src/utils/users/UseUser.ts @@ -0,0 +1,13 @@ + +import {UserContext} from "./UserContext.ts"; +import {useContext} from "react"; + + + +export function useUser() { + const context = useContext(UserContext); + if (!context) { + throw new Error('useUser must be used within a UserProvider'); + } + return context; +} \ No newline at end of file diff --git a/src/utils/users/UserContext.ts b/src/utils/users/UserContext.ts new file mode 100644 index 0000000..99a856d --- /dev/null +++ b/src/utils/users/UserContext.ts @@ -0,0 +1,10 @@ +import {Account} from "../../types/users.ts"; +import {createContext} from "react"; + +export type UserContextType = { + user: Account | undefined; + login: (userData: Account) => void; + logout: () => void; +}; + +export const UserContext = createContext(undefined); diff --git a/src/utils/users/UserProvider.tsx b/src/utils/users/UserProvider.tsx new file mode 100644 index 0000000..b34565b --- /dev/null +++ b/src/utils/users/UserProvider.tsx @@ -0,0 +1,35 @@ +import React, {ReactNode, useEffect, useState} from 'react'; +import {Account} from '../../types/users.ts'; +import {UserContext} from "./UserContext.ts"; + + +export function UserProvider({ children }: { children: ReactNode }) { + const [user, setUser] = useState(() => { + const storedUser = localStorage.getItem('user'); + return storedUser ? JSON.parse(storedUser) : undefined; + }); + + useEffect(() => { + if (user) { + localStorage.setItem('user', JSON.stringify(user)); + document.cookie = `user=${encodeURIComponent(JSON.stringify(user))}; path=/;`; + } else { + localStorage.removeItem('user'); + document.cookie = 'user=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + } + }, [user]); + + const login = (userData: Account) => { + setUser(userData); + }; + + const logout = () => { + setUser(undefined); + }; + + return ( + + {children} + + ); +} \ No newline at end of file