-
-
- {t('about.sectionTitle')}
-
-
-
- {t('about.sectionDescription')}
-
-
-
- Proyectos
- Contáctanos
-
-
+

+
+
+
+
+
+ {t('about.sectionTitle')}
+
+
+
+ {t('about.sectionDescription')}
+
+
+
+ {t('headerAbout.portfolioButton')}
+ {t('headerAbout.contactButton')}
-
+
+
+
)
diff --git a/src/front/components/ProtectedRoute.jsx b/src/front/components/ProtectedRoute.jsx
new file mode 100644
index 0000000000..abcd4327df
--- /dev/null
+++ b/src/front/components/ProtectedRoute.jsx
@@ -0,0 +1,8 @@
+import React, { Children } from 'react';
+import { Navigate } from 'react-router-dom';
+
+export const ProtectedRoute = ({ children }) => {
+ const token = localStorage.getItem('accessToken');
+
+ return token ? children :
+};
\ No newline at end of file
diff --git a/src/front/index.css b/src/front/index.css
index ceb313abdf..6fd4a93a70 100644
--- a/src/front/index.css
+++ b/src/front/index.css
@@ -362,3 +362,15 @@ h6 {
.text-stat-symbol {
color: #fbff06;
}
+
+/* Admin Styles */
+
+.adminOption {
+ color: white;
+ transition: color 0.3s ease;
+ text-decoration: none;
+}
+
+.adminOption:hover {
+ color: #fbff06;
+}
diff --git a/src/front/pages/Admin.jsx b/src/front/pages/Admin.jsx
new file mode 100644
index 0000000000..dbd9543d3f
--- /dev/null
+++ b/src/front/pages/Admin.jsx
@@ -0,0 +1,63 @@
+import { useState, useEffect, useContext } from "react"
+import { Link } from "react-router-dom"
+import { Leads } from "../components/Admin/Leads"
+import { AppContext } from "./Layout"
+
+export const Admin = () => {
+ const { setShowNavbar, setShowFooter } = useContext(AppContext)
+ const [activeContent, setActiveContent] = useState("");
+
+ useEffect(() => {
+ if (setShowNavbar || setShowFooter) {
+ setShowNavbar(false);
+ setShowFooter(false);
+ }
+ return () => {
+ if (setShowNavbar || setShowFooter) {
+ setShowNavbar(true);
+ setShowFooter(true);
+ }
+ }
+ }, [setShowNavbar, setShowFooter])
+
+ const handleActiveContent = (contentName) => {
+ setActiveContent(contentName);
+ }
+
+ const renderContent = () => {
+ switch (activeContent) {
+ case 'leads':
+ return
+ default:
+ return
Selecciona una opción del panel.
+ }
+ }
+
+ return (
+
+
+
+
Panel de Administrador
+
¡Bienvenido!
+
+
+ -
+ {
+ e.preventDefault();
+ handleActiveContent('leads');
+ }}
+ >
+ Ver Leads
+
+
+
+
+
+ {renderContent()}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/front/pages/Layout.jsx b/src/front/pages/Layout.jsx
index 63373a0068..91beca4358 100644
--- a/src/front/pages/Layout.jsx
+++ b/src/front/pages/Layout.jsx
@@ -1,4 +1,4 @@
-import React, { useReducer, createContext} from "react"
+import React, { useReducer, createContext, useState } from "react"
import { Outlet, useLocation } from "react-router-dom/dist";
import storeReducer, { initialStore } from "../store.js";
import ScrollToTop from "../components/ScrollToTop"
@@ -13,17 +13,19 @@ export const AppContext = createContext(null);
export const Layout = () => {
const [store, dispatch] = useReducer(storeReducer, initialStore());
+ const [showNavbar, setShowNavbar] = useState(true)
+ const [showFooter, setShowFooter] = useState(true)
const location = useLocation();
return (
-
+
<>
-
-
-
-
-
+
+ {showNavbar && }
+
+
+ {showFooter && }
>
)
diff --git a/src/front/routes.jsx b/src/front/routes.jsx
index 6d0b424430..71bec6a410 100644
--- a/src/front/routes.jsx
+++ b/src/front/routes.jsx
@@ -11,6 +11,8 @@ import { About } from "./pages/About";
import { ServicesPage } from "./pages/Services";
import { Portfolio } from "./pages/Projects";
import { Contact } from "./pages/Contact";
+import { Admin } from "./pages/Admin";
+import { ProtectedRoute } from "./components/ProtectedRoute";
export const router = createBrowserRouter(
createRoutesFromElements(
@@ -29,6 +31,8 @@ export const router = createBrowserRouter(
} />
} />
} />
+ } />
+ {/* } /> */}
)
);
\ No newline at end of file
diff --git a/src/front/store.js b/src/front/store.js
index 4c4987e2ff..edaad5a0e3 100644
--- a/src/front/store.js
+++ b/src/front/store.js
@@ -1,86 +1,88 @@
-export const initialStore=()=>{
- return{
+export const initialStore = () => {
+ return {
message: null,
- todos: [
- {
- id: 1,
- title: "Make the bed",
- background: null,
- },
- {
- id: 2,
- title: "Do my homework",
- background: null,
- }
- ],
- contactForm: initialContactFormState
- }
-}
+ contactForm: initialContactFormState,
+ leads: [],
+ leadsFetchStatus: {
+ status: "idle",
+ error: null,
+ },
+ };
+};
const initialContactFormState = {
- status: 'idle',
- error: null
-}
-
+ status: "idle",
+ error: null,
+};
export default function storeReducer(store, action = {}) {
- switch(action.type){
- case 'set_hello':
+ switch (action.type) {
+ case "GET_ALL_LEADS_START":
return {
...store,
- message: action.payload
+ leadsFetchStatus: {
+ status: "loading",
+ error: null,
+ },
};
-
- case 'add_task':
-
- const { id, color } = action.payload
+ case "GET_ALL_LEADS_SUCCESS":
return {
...store,
- todos: store.todos.map((todo) => (todo.id === id ? { ...todo, background: color } : todo))
+ leads: action.payload,
+ leadsFetchStatus: {
+ status: "success",
+ error: null,
+ },
};
- case 'CONTACT_SUBMIT_START':
+ case "GET_ALL_LEADS_FAILURE":
+ return {
+ ...store,
+ leadsFetchStatus: {
+ status: "error",
+ error: action.payload,
+ },
+ };
+ case "CONTACT_SUBMIT_START":
return {
- ...store,
+ ...store,
contactForm: {
...store.contactForm,
- status: 'loading',
- error: null
- }
+ status: "loading",
+ error: null,
+ },
};
- case 'CONTACT_SUBMIT_SUCCESS':
+ case "CONTACT_SUBMIT_SUCCESS":
return {
...store,
contactForm: {
...store.contactForm,
- status: 'success'
- }
+ status: "success",
+ },
};
- case 'CONTACT_SUBMIT_FAILURE':
+ case "CONTACT_SUBMIT_FAILURE":
return {
...store,
contactForm: {
...store.contactForm,
- status: 'error',
- error: action.payload
- }
+ status: "error",
+ error: action.payload,
+ },
};
- case 'CONTACT_RESET_STATUS':
+ case "CONTACT_RESET_STATUS":
// Resetea el estado del formulario a su valor inicial
return {
...store,
- contactForm: initialContactFormState
+ contactForm: initialContactFormState,
};
default:
- throw Error('Unknown action.');
+ throw Error("Unknown action.");
return store;
- }
+ }
}
-
-