lleve los fetch a los servicios y creé los tipos de datos

This commit is contained in:
2025-10-14 18:51:59 -03:00
parent d716173606
commit 38f1fd7258
4 changed files with 51 additions and 26 deletions

View File

@@ -1,26 +1,32 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import './App.css' import './App.css';
import Alumno from './Components/Alumno' import Alumno from './Components/Alumno';
import { ObtenerUsuarios } from './services/servicioUsuario';
function App() { function App() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [alumnos, setAlumnos] = useState<any[]>([]); const [alumnos, setAlumnos] = useState<any[]>([]);
useEffect(() => { useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users") async function cargarDatos() {
.then(res => res.json()) setLoading(true);
.then(data => { try {
const data = await ObtenerUsuarios();
setAlumnos(data); setAlumnos(data);
} catch (error) {
console.error('Error al obtener usuarios:', error);
} finally {
setLoading(false); setLoading(false);
}) }
.catch(() => setLoading(false)); }
cargarDatos();
}, []); }, []);
if (loading) return <div>Cargando...</div>; if (loading) return <div>Cargando...</div>;
return ( return (
<div style={{ display: 'flex', flexDirection: 'row', gap: "1rem", flexWrap: 'wrap' }}> <div style={{ display: 'flex', flexDirection: 'row', gap: '1rem', flexWrap: 'wrap', justifyContent: "center"}}>
{alumnos.map((x) => ( {alumnos.map((x) => (
<Alumno key={x.id} data={x} /> <Alumno key={x.id} data={x} />
))} ))}
@@ -28,4 +34,4 @@ import Alumno from './Components/Alumno'
); );
} }
export default App export default App;

View File

@@ -1,7 +1,8 @@
import { useState } from "react"; import { useState } from "react";
import "./Alumno.css" import "./Alumno.css"
import type { Usuario } from "../types/usuario";
export default function Alumno({data}: {data: any}){ export default function Alumno({data}: {data: Usuario}){
const [alumno, setAlumno] = useState({ presente: false }); const [alumno, setAlumno] = useState({ presente: false });
return ( return (
<div id="aa" <div id="aa"
@@ -22,9 +23,14 @@ export default function Alumno({data}: {data: any}){
<p> <p>
Nombre: <b>{data.name}</b> Nombre: <b>{data.name}</b>
</p> </p>
<p>
<p style={{ color: "gray" }}>
Usuario: <b>{data.username}</b> Usuario: <b>{data.username}</b>
</p> </p>
<p style={{ color: "gray" }}>
Usuario: <b>{data.email}</b>
</p>
</div> </div>
<hr /> <hr />

View File

@@ -0,0 +1,7 @@
import type { Usuario } from "../types/usuario";
export const ObtenerUsuarios = async (): Promise<Usuario[]> => {
const usuario = await fetch(`https://jsonplaceholder.typicode.com/users`);
const usuJson: Usuario[] = await usuario.json();
return usuJson;
};

6
src/types/usuario.ts Normal file
View File

@@ -0,0 +1,6 @@
export interface Usuario {
id: number,
name: string,
username: string,
email: string
}