From b5b2439bd811891e0d519c8f0f62d69a4dfd6733 Mon Sep 17 00:00:00 2001
From: Mikan <72257910+Mikan-DS@users.noreply.github.com>
Date: Sun, 1 Jun 2025 21:39:44 +0300
Subject: [PATCH] UserContext
---
src/App.tsx | 82 +++++++++++++++++++++++++++-----
src/pages/LoginPage.tsx | 3 ++
src/types/users.ts | 22 +++++++++
src/utils/users/UseUser.ts | 13 +++++
src/utils/users/UserContext.ts | 10 ++++
src/utils/users/UserProvider.tsx | 35 ++++++++++++++
6 files changed, 152 insertions(+), 13 deletions(-)
create mode 100644 src/pages/LoginPage.tsx
create mode 100644 src/types/users.ts
create mode 100644 src/utils/users/UseUser.ts
create mode 100644 src/utils/users/UserContext.ts
create mode 100644 src/utils/users/UserProvider.tsx
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