feat: Google authorization implementation

This commit is contained in:
Rodolfo Ruiz
2025-08-04 20:27:23 -06:00
parent 17708bb8ba
commit afdfeee79a
3 changed files with 75 additions and 4 deletions

View File

@@ -10,8 +10,17 @@ import Providers from './private/providers/Providers';
import Categories from './private/categories/Categories';
import Admin from './private/mongo/Admin';
import LoginPage from './private/LoginPage';
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { useAuth } from './context/AuthContext';
function PrivateRoute({ children }) {
const { user } = useAuth();
return user ? children : <Navigate to="/login" replace />;
}
function App() {
const [zone, setZone] = useState('public'); // Could be 'public' | 'restricted' | 'private'
const [zone, setZone] = useState('public'); // public | restricted | private
const [currentView, setCurrentView] = useState('Products');
return (
@@ -27,7 +36,7 @@ function App() {
<AppHeader zone={zone} onSelectMenuItem={(view) => setCurrentView(view)} />
{/* Main content area */}
<Box component="main" sx={{ flex: 1, p: 2 }}>
{/* <Box component="main" sx={{ flex: 1, p: 2 }}>
{zone === 'private' && <Clients />}
{zone === 'restricted' && <Clients />}
@@ -36,7 +45,31 @@ function App() {
{zone === 'public' && currentView === 'Providers' && <Providers />}
{zone === 'public' && currentView === 'Categories' && <Categories />}
{zone === 'public' && currentView === 'Admin' && <Admin />}
</Box>
</Box> */}
<Box component="main" sx={{ flex: 1, p: 2 }}>
<Routes>
<Route path="/login" element={<LoginPage />} />
<Route
path="/"
element={
<PrivateRoute>
{zone === 'private' && <Clients />}
{zone === 'restricted' && <Clients />}
{zone === 'public' && currentView === 'Products' && <Products />}
{zone === 'public' && currentView === 'Clients' && <Clients />}
{zone === 'public' && currentView === 'Providers' && <Providers />}
{zone === 'public' && currentView === 'Categories' && <Categories />}
{zone === 'public' && currentView === 'Admin' && <Admin />}
</PrivateRoute>
}
/>
</Routes>
</Box>
<Footer zone={zone} />
</Box>

View File

@@ -5,12 +5,21 @@ import { ThemeProvider } from '@mui/material/styles';
import theme from './theme';
import './index.css'
import App from './App.jsx'
import { GoogleOAuthProvider } from '@react-oauth/google';
import { AuthProvider } from './context/AuthContext';
import { BrowserRouter } from 'react-router-dom';
createRoot(document.getElementById('root')).render(
<StrictMode>
<ThemeProvider theme={theme}>
<SnackbarProvider maxSnack={3} autoHideDuration={3000}>
<App />
<GoogleOAuthProvider clientId="128345072002-mtfdgpcur44o9tbd7q6e0bb9qnp2crfp.apps.googleusercontent.com">
<AuthProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</AuthProvider>
</GoogleOAuthProvider>
</SnackbarProvider>
</ThemeProvider>
</StrictMode>,

29
src/private/LoginPage.jsx Normal file
View File

@@ -0,0 +1,29 @@
import { GoogleLogin } from '@react-oauth/google';
import { jwtDecode } from 'jwt-decode';
import { useAuth } from '../context/AuthContext';
import { useNavigate } from 'react-router-dom';
import { Box, Typography } from '@mui/material';
export default function LoginPage() {
const { login } = useAuth();
const navigate = useNavigate();
return (
<Box display="flex" flexDirection="column" alignItems="center" mt={10}>
<Typography variant="h4" gutterBottom>
Iniciar sesión
</Typography>
<GoogleLogin
onSuccess={(credentialResponse) => {
const user = jwt_decode(credentialResponse.credential);
login(user);
navigate('/');
}}
onError={() => {
console.log('Error al iniciar sesión');
}}
/>
</Box>
);
}