From: charleswrayjr Date: Sat, 13 Sep 2025 14:58:55 +0000 (-0500) Subject: Adding authentication, media, and messaging. X-Git-Url: https://git.phasecustomsoft.com/?a=commitdiff_plain;h=43babe8eafdad3e694f2922a9c3ee041810ce776;p=phs-admin.git Adding authentication, media, and messaging. --- diff --git a/src/App.js b/src/App.js index 5f3e664..19a34bc 100755 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,7 @@ import React from 'react'; import { SnackbarProvider } from 'notistack'; import { CssBaseline, ThemeProvider, createTheme } from '@mui/material'; import AppHeader from './app/components/AppHeader'; +import { AuthProvider } from './app/components/AuthContext'; const theme = createTheme({ palette: { @@ -17,8 +18,10 @@ const App = () => { - - + + + + ); diff --git a/src/app/components/AppHeader.js b/src/app/components/AppHeader.js index a5c522e..5288399 100644 --- a/src/app/components/AppHeader.js +++ b/src/app/components/AppHeader.js @@ -2,7 +2,7 @@ * @file Reusable header component with navigation */ -import React, { useContext } from 'react'; +import React, { useContext, useMemo } from 'react'; import { AppBar, Toolbar, Typography, Button, Box } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import { AuthContext } from './AuthContext'; @@ -11,14 +11,33 @@ const AppHeader = () => { const navigate = useNavigate(); const { user, logout } = useContext(AuthContext) || {}; - const navItems = [ + const navItems = useMemo( () => user ? [ { label: 'Dashboard', path: '/', roles: ['User', 'Admin'] }, { label: 'Messages', path: '/messages', roles: ['User', 'Admin'] }, { label: 'Message Groups', path: '/message-groups', roles: ['User', 'Admin'] }, { label: 'Media', path: '/media', roles: ['User', 'Admin'] }, { label: 'Posts', path: '/posts', roles: ['User', 'Admin'] }, { label: 'Docker', path: '/docker', roles: ['Admin'] }, - ]; + { label: 'VPN', path: '/vpn', roles: ['Admin'] }, + { label: 'GIT', path: '/git', roles: ['Admin'] }, + ].filter(item => item.roles.some( role => [...user.roles]?.map( r => r.name )?.includes( role ) ) ) : [], [user] ); + + /** + * + * @type {React.ReactNode[]} + */ + const navButtons = useMemo( () => navItems.map((item) => ( + ( + + ) + )), [navItems, navigate] ); return ( @@ -27,18 +46,7 @@ const AppHeader = () => { PHS Admin - {navItems.map((item) => ( - (!user || item.roles.some(role => user.roles?.includes(role))) && ( - - ) - ))} + {navButtons} {user ? ( + + + + ) + )), [features, navigate] ); return (
@@ -27,29 +58,7 @@ const Dashboard = () => { Welcome to PHS Admin{user ? `, ${user.first_name || 'User ' + user.id}` : ''} - {features.map((feature) => ( - (!user || feature.roles.some(role => user.roles?.includes(role))) && ( - - - - - {feature.title} - - - {feature.description} - - - - - - ) - ))} + {featureCards}
diff --git a/src/app/views/Login/Login.jsx b/src/app/views/Login/Login.jsx index 45ec153..4e909e9 100755 --- a/src/app/views/Login/Login.jsx +++ b/src/app/views/Login/Login.jsx @@ -1,5 +1,5 @@ /** - * @file Login view with authentication form + * @file Login view with an authentication form */ import React, { useContext } from 'react'; @@ -8,9 +8,7 @@ import { useForm, Controller } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import * as yup from 'yup'; import { useSnackbar } from 'notistack'; -import { useNavigate } from 'react-router-dom'; import { AuthContext } from '../../components/AuthContext'; -import AppHeader from '../../components/AppHeader'; const schema = yup.object({ email: yup.string().email('Invalid email').required('Email is required'), @@ -19,7 +17,6 @@ const schema = yup.object({ const Login = () => { const { enqueueSnackbar } = useSnackbar(); - const navigate = useNavigate(); const { login } = useContext(AuthContext) || {}; const { control, handleSubmit, formState: { errors } } = useForm({ resolver: yupResolver(schema), @@ -36,7 +33,6 @@ const Login = () => { return (
- Login to PHS Admin