瀏覽代碼

session state managment

amenpunk 3 年之前
父節點
當前提交
2bcd5e5311

+ 0 - 5
psicoadmin/public/index.html

@@ -13,11 +13,6 @@
13 13
     <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
14 14
     <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
15 15
 
16
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/malihu-custom-scrollbar-plugin/3.1.5/jquery.mCustomScrollbar.min.css">
17
-    
18
-    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
19
-
20
-
21 16
     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
22 17
     <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
23 18
     <!--

+ 9 - 7
psicoadmin/src/App.js

@@ -4,9 +4,9 @@ import './Css/all.css'
4 4
 import { createContext } from 'react'
5 5
 import { BrowserRouter as Router } from "react-router-dom";
6 6
 import { Container } from 'react-bootstrap'
7
-import Dashboard from './Components/Dashboard';
8
-
7
+import { AuthProvider } from './Auth/AuthProvider'
9 8
 
9
+import Routes from './Components/Routes'
10 10
 // import { Header } from './Components/Header';
11 11
 // import { SideBar } from './Components/Sidebar';
12 12
 
@@ -26,11 +26,13 @@ export const API_GATEWAY = createContext(GATEWAY)
26 26
 function App() {
27 27
     return (
28 28
         <Router>
29
-            <API_GATEWAY.Provider value={GATEWAY.dev}>
30
-                <Container fluid>
31
-                    <Dashboard/>
32
-                </Container>
33
-            </API_GATEWAY.Provider>
29
+            <AuthProvider>
30
+                <API_GATEWAY.Provider value={GATEWAY.dev}>
31
+                    <Container fluid>
32
+                        <Routes/>
33
+                    </Container>
34
+                </API_GATEWAY.Provider>
35
+            </AuthProvider>
34 36
         </Router>
35 37
     );
36 38
 }

+ 35 - 0
psicoadmin/src/Auth/AuthProvider.js

@@ -0,0 +1,35 @@
1
+import React from 'react'
2
+export const AuthContext = React.createContext();
3
+
4
+export function AuthProvider ({ children }){
5
+
6
+    let [user, setUser] = React.useState( localStorage.getItem("user") )
7
+
8
+    const context = {
9
+        user,
10
+        login: () => {
11
+            let user = JSON.stringify({ name : 'edgar' , id : 1})
12
+            localStorage.setItem('user', user)
13
+            setUser(user)
14
+        },
15
+        logout : () =>{
16
+            setUser(null)
17
+            localStorage.setItem('user', JSON.stringify({ }) )
18
+        },
19
+        isLogged : () => {
20
+            if(!user) return false
21
+            let current = JSON.parse(user)
22
+            let keys = Object.keys(current)
23
+            console.log("CURRENT -> ",current, 'KEY LEN -> ', keys.length)
24
+            return  keys.length > 0
25
+        }
26
+    }
27
+
28
+    return (
29
+        <AuthContext.Provider value={context}>
30
+            {children}
31
+        </AuthContext.Provider>
32
+    )
33
+}
34
+
35
+

+ 8 - 0
psicoadmin/src/Auth/useAuth.js

@@ -0,0 +1,8 @@
1
+import React from 'react'
2
+import { AuthContext } from './AuthProvider'
3
+
4
+
5
+export default function useAuth() {
6
+    return React.useContext(AuthContext)
7
+}
8
+

+ 39 - 1
psicoadmin/src/Components/Dashboard.js

@@ -18,12 +18,17 @@ import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
18 18
 import NotificationsIcon from '@mui/icons-material/Notifications';
19 19
 import { mainListItems, secondaryListItems } from './listItems';
20 20
 
21
+import Menu from '@mui/material/Menu';
22
+import MenuItem from '@mui/material/MenuItem';
23
+
21 24
 
22 25
 import MailIcon from '@mui/icons-material/Mail';
23 26
 
24 27
 import Logo from '../Images/logo.png';
25 28
 import ProfilePicture from '../Images/man.png';
26 29
 
30
+import useAuth from '../Auth/useAuth';
31
+
27 32
 const drawerWidth = 240;
28 33
 
29 34
 const AppBar = styled(MuiAppBar, {
@@ -78,6 +83,21 @@ function DashboardContent() {
78 83
         setOpen(!open);
79 84
     };
80 85
 
86
+
87
+    let auth = useAuth();
88
+
89
+    const [anchorEl, setAnchorEl] = React.useState(null);
90
+    const open_profile = Boolean(anchorEl);
91
+    const handleClick = (event) => {
92
+        console.log('show? ')
93
+        setAnchorEl(event.currentTarget);
94
+    };
95
+    const handleClose = () => {
96
+        setAnchorEl(null);
97
+    };
98
+
99
+    const CerrarSession = () => auth.logout();
100
+
81 101
     return (
82 102
         <ThemeProvider theme={mdTheme}>
83 103
             <Box sx={{ display: 'flex' }}>
@@ -113,17 +133,35 @@ function DashboardContent() {
113 133
                                     <NotificationsIcon style={{ color : '#212529' }}/>
114 134
                                 </Badge>
115 135
                             </IconButton>
136
+
137
+
116 138
                             <IconButton
117 139
                                 size="small"
118 140
                                 edge="end"
119 141
                                 aria-label="account of current user"
120 142
                                 aria-haspopup="true"
121
-                                onClick={ () => console.log('show menu') }
143
+                                aria-expanded={open_profile ? 'true' : undefined}
144
+                                onClick={handleClick}
122 145
                                 color="inherit"
123 146
                             >
124 147
                                 <Avatar alt="Cindy Baker" src={ProfilePicture} />
125 148
 
126 149
                             </IconButton>
150
+                            <Menu
151
+                                id="basic-menu"
152
+                                anchorEl={anchorEl}
153
+                                open={open_profile}
154
+                                onClose={handleClose}
155
+                                MenuListProps={{
156
+                                    'aria-labelledby': 'basic-button',
157
+                                }}
158
+                            >
159
+                                <MenuItem onClick={ () => console.log('opcion 1') }>Profile</MenuItem>
160
+                                <MenuItem onClick={() => console.log('opcion 2')}>My account</MenuItem>
161
+                                <MenuItem onClick={CerrarSession}>Logout</MenuItem>
162
+                            </Menu>
163
+
164
+
127 165
                         </Box>
128 166
 
129 167
 

+ 16 - 0
psicoadmin/src/Components/PrivateRoute.js

@@ -0,0 +1,16 @@
1
+import { Route, Redirect } from 'react-router-dom';
2
+import useAuth from '../Auth/useAuth';
3
+import React from 'react'
4
+
5
+export const PrivateRoute = ({ component, ...rest }) => {
6
+    let auth = useAuth();
7
+    
8
+    return(
9
+        <React.Fragment>
10
+            { auth.isLogged() ? <Route {...rest} component={component} /> : <Redirect to='/privada' /> }
11
+        </React.Fragment>
12
+    )
13
+
14
+}
15
+
16
+

+ 58 - 0
psicoadmin/src/Components/Routes.js

@@ -0,0 +1,58 @@
1
+import { Button } from "react-bootstrap";
2
+import { BrowserRouter as Routes, Route, Switch, useHistory} from "react-router-dom";
3
+import useAuth from '../Auth/useAuth';
4
+import {PrivateRoute} from "./PrivateRoute";
5
+import Dashboard from "./Dashboard";
6
+
7
+
8
+
9
+function Privada () {
10
+    return (
11
+        <div>
12
+            <h1>Ruta Privada</h1>
13
+        </div>
14
+    )
15
+}
16
+
17
+function Login () {
18
+    
19
+    let auth = useAuth();
20
+    let history = useHistory()
21
+
22
+
23
+    function In () {
24
+        auth.login({ name : 'edgar', id : 1 })
25
+        console.log('is logged ? ',auth.isLogged())
26
+        history.push('/dashboard')
27
+        //{/* return <Redirect to="/dashboard"/> */}
28
+    }
29
+
30
+    return(
31
+        <>
32
+            <h1>Bienvenido</h1>
33
+            <Button onClick={In}>
34
+                Iniciar Session
35
+            </Button>
36
+            {/* <Button style={{ marginLeft : 10 }} variant="danger" onClick={ () => auth.logout() }> */}
37
+            {/*     Cerrar Session */}
38
+            {/* </Button> */}
39
+        </>
40
+    )
41
+}
42
+
43
+
44
+export default function MyRoutes () {
45
+    return(
46
+        <Routes>
47
+            <Switch>
48
+
49
+                <Route exact path="/" component={Login}/>
50
+                <Route exact path="/privada" component={Privada}/>
51
+                <PrivateRoute exact component={Dashboard} path="/dashboard" />
52
+                <Route path="*"> <h1>404 Not Found</h1> </Route>
53
+            </Switch>
54
+
55
+        </Routes>
56
+    )
57
+}
58
+