π Portafolio: astralzz.io
π© Email: edain.cortez@outlook.com
π± Telegram: t.me/lAstralz
π LinkedIn: linkedin.com/in/Edain
πΊ GitHub: github.com/Astralzz
Esta plantilla estΓ‘ optimizada para el desarrollo de aplicaciones en React, con herramientas modernas preconfiguradas para agilizar el desarrollo y despliegue.
- React Router: gestiΓ³n de rutas.
- Redux Toolkit: gestiΓ³n del estado.
- Tailwind CSS 4.0: estilos rΓ‘pidos y eficientes.
- Sass: preprocesador de estilos.
- Docker: configuraciΓ³n para facilitar el despliegue.
- Vite: bundler para un desarrollo mΓ‘s rΓ‘pido.
- Formik: gestiΓ³n de formularios y validaciones.
- Yup: validaciΓ³n de esquemas en tiempo de ejecuciΓ³n.
- Axios: Realizar consulta
XMLHttpRequests,HTTPS, etc.
- TypeScript: ya configurado en toda la app para una mejor experiencia de desarrollo.
- React Router: preconfigurado en src/router.tsx.
- Redux Toolkit: configuraciΓ³n lista en src/redux/, incluyendo store y middleware.
- Tailwind CSS 4.0: configurado en src/main.css.
- Tema: gestiΓ³n de tema en src/redux/slices/themeSlice.ts, integrado con Redux.
- Formik & Yup: formulario con validaciones listo para usar.
- PΓ‘gina 404: ya implementada y funcional.
- Modal: implementado y listo para usar en src/components/modals/ModalDefault.tsx
- Api & Request Se creo un ejemplo del uso de una api en react
19en src/pages/ApiPage.tsx
- Despliegue con Docker: consulta docs/tutorials/docker-tutorial.md para aprender a configurar y desplegar con Docker.
π app
βββ π docker
β βββ app.dockerfile
βββ π public
β βββ vite.svg
βββ π src
β βββ π apis
β βββ App.tsx
β βββ π assets
β β βββ react.svg
β βββ π components
β β βββ π err
β β βββ π forms
β β β βββ EmailForm.tsx
β β βββ π inputs
β β β βββ InputDefault.tsx
β βββ main.css
β βββ main.tsx
β βββ π pages
β β βββ NotFoundPage.tsx
β βββ π redux
β β βββ hook.ts
β β βββ π slices
β β β βββ themeSlice.ts
β β βββ store.ts
β βββ router.tsx
β βββ π styles
β β βββ app.scss
β βββ π tests
β βββ vite-env.d.ts
βββ .dockerignore
βββ .gitignore
βββ docker-compose.yml
βββ eslint.config.js
βββ index.html
βββ package-lock.json
βββ package.json
βββ README.md
βββ tsconfig.app.json
βββ tsconfig.json
βββ tsconfig.node.json
βββ vite.config.ts-
Clona este repositorio:
git clone https://github.com/Astralzz/template-react-full cd template-react-full/app -
Instala las dependencias:
npm install
-
Inicia el entorno de desarrollo:
npm run dev
npm run dev: Inicia el servidor en modo desarrollo.npm run build: Compila la aplicaciΓ³n para producciΓ³n.npm run preview: Ejecuta la versiΓ³n compilada de la app.npm run lint: Verifica errores en el cΓ³digo.npm run format: Aplica formato automΓ‘tico con Prettier.npm run test: Ejecuta las pruebas automatizadas.
React Router estΓ‘ listo en src/router.tsx, permitiendo agregar rutas fΓ‘cilmente:
const router = createBrowserRouter([
{
path: "/",
element: <App />,
errorElement: <NotFoundPage />,
children: routesApp.map((r) => r.route),
},
]);Redux Toolkit estΓ‘ preconfigurado con TypeScript en src/redux/, incluyendo el store y los slices:
import { configureStore } from "@reduxjs/toolkit";
import themeSlice from "./slices/themeSlice";
export const store = configureStore({
reducer: {
stateTheme: themeSlice,
},
});
// Tipos de TypeScript
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;La configuraciΓ³n de Tailwind estΓ‘ en src/main.css. Se puede personalizar fΓ‘cilmente:
@import "tailwindcss";
@theme {
--color-primary-50: rgba(245, 245, 245, 1);
--color-primary-500: rgba(50, 50, 50, 1);
--color-primary-900: rgba(0, 0, 0, 1);
}El estado del tema se gestiona en src/redux/slices/themeSlice.ts.
import { useReduxSelector } from './redux/hook';
const App: React.FC = () => {
const theme = useReduxSelector((state) => state.stateTheme.theme);
return <main className={`${theme}`}></main>;
};La validaciΓ³n de formularios estΓ‘ lista en src/components/forms/EmailForm.tsx.
const EmailForm: React.FC = () => {
// Action form
const handleSubmit = React.useCallback(
(
values: { asunto: string; },
{
setSubmitting,
resetForm,
}: {
setSubmitting: (isSubmitting: boolean) => void;
resetForm: () => void;
}
): void => {
console.log("Email enviado:", values);
},
[]
);
return (
<Formik
initialValues={{ asunto: "", message: "" }}
validationSchema={validationSchema}
onSubmit={handleSubmit}
>
{/* EstΓ‘ enviando, Es vΓ‘lido, Sucio */}
{({ isSubmitting, isValid, dirty }) => (
<Form className="m-9 text-sm max-w-sm mx-auto p-6 bg-white dark:bg-gray-700 rounded-lg shadow-md">
{/* Asunto */}
<InputDefault name="asunto" label="Asunto" maxLength={45} required />
{/* Button action */}
<button
type="submit"
disabled={isSubmitting || !(isValid && dirty)}
className="w-full mt-4 hover:cursor-pointer bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 rounded-md transition-colors disabled:bg-gray-400 disabled:cursor-not-allowed"
>
{isSubmitting ? "Enviando..." : "Enviar"}
</button>
</Form>
)}
</Formik>
);
};Pagina 404 funcionando correctamente en src/redux/slices/themeSlice.ts. se puede cambiar y configurar sin problema.
/**
* 404 page
*
* @returns {JSX.Element}
*/
const NotFoundPage: React.FC = () => {
// Variables redux
const theme = useReduxSelector((state) => state.stateTheme.theme);
return (
<main className={theme}>
<div className="bg-primary-100 dark:bg-primary-500 text-gray-900 dark:text-gray-100 w-full flex flex-col items-center text-center justify-center min-h-screen">
{/* Header */}
<h1 className="text-6xl font-bold">404</h1>
{/* Message */}
<p className="text-xl mt-2">PΓ‘gina no encontrada</p>
{/* Button */}
<Link
to="/"
className="mt-6 px-5 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition duration-300"
>
Volver al inicio
</Link>
</div>
</main>
);
};Pagina de ejemplo del uso de una api usando react 19 y axios
// Component ...
const ApiPage: React.FC = () => {
// Estados para manejar la data y el estado de error
const [data, setData] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const [isPending, startTransition] = useTransition();
// FunciΓ³n para manejar la peticiΓ³n
const handleSubmit = () => {
// Reseteamos los estados
setError(null);
// Inicio
startTransition(async () => {
try {
// PeticiΓ³n a la API
const response = await getDataRequest();
// * Success
setData(JSON.stringify(response, null, 2));
// ! Error
} catch (err: unknown) {
setError(
err instanceof Error ? err?.message : "OcurriΓ³ un error desconocido"
);
}
});
};
return <div></div>;
};// Request ...
export const getDataRequest = async (): Promise<unknown> => {
try {
// Realizar la peticiΓ³n GET
const response = await axios.get<any>("");
// Verificar si los datos son vΓ‘lidos
checkDataRequest(response);
// Retornar los datos obtenidos
return response.data;
} catch (error) {
return await catchAxiosError(error);
}
};Esta plantilla te permite comenzar rΓ‘pidamente con React, Redux, Tailwind, TypeScript y Docker, sin preocuparte por la configuraciΓ³n inicial. π