diff --git a/react-advanced-tag1/src/App.tsx b/react-advanced-tag1/src/App.tsx index 443c54e..35690fa 100644 --- a/react-advanced-tag1/src/App.tsx +++ b/react-advanced-tag1/src/App.tsx @@ -1,6 +1,7 @@ import './App.css' // import EffectExercises from './components/exercises/EffectExercises' import UserEffect from './components/exercises/UserEffect' +import { UserOverview } from './components/exercises/UserOverview' import Heading from './components/globals/Heading' import MainLayout from './layouts/MainLayout' @@ -10,6 +11,7 @@ function App() { {/* */} + } diff --git a/react-advanced-tag1/src/components/exercises/UserOverview.tsx b/react-advanced-tag1/src/components/exercises/UserOverview.tsx new file mode 100644 index 0000000..e6c828c --- /dev/null +++ b/react-advanced-tag1/src/components/exercises/UserOverview.tsx @@ -0,0 +1,28 @@ +import { useFetch } from "../../hooks/useFetch"; + +export function UserOverview() { + const {data, loading, error} = useFetch("https://jsonplaceholder.typicode.com/users"); + + if (error) { + return

Error: {error}

; + } + if (loading) { + return

Loading...

; + } + if (!data) { + return

No data available

; + } + return ( +
+

User Overview

+
    + {data.map((user: { id: number; name: string; email: string; website: string }) => ( +
  • + {user.name} ({user.email}) - {user.website} +
  • + ))} +
+

Total Users: {data.length}

+
+ ); +} diff --git a/react-advanced-tag1/src/hooks/useFetch.ts b/react-advanced-tag1/src/hooks/useFetch.ts new file mode 100644 index 0000000..7736339 --- /dev/null +++ b/react-advanced-tag1/src/hooks/useFetch.ts @@ -0,0 +1,49 @@ +import { useEffect, useState } from "react"; + +interface User { + id: number; + name: string; + email: string; + website: string; +} + +export function useFetch(url: string) { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + // alternativ + // const [fetchValues, setFetchValues] = useState({ + // data: null, + // loading: true, + // error: null, + // }); + + useEffect(() => { + async function fetchData() { + try { + const response = await fetch(url); + if (!response.ok) { + setError("Network response was not ok"); + throw new Error("Network response was not ok"); + } + const data = await response.json(); + setData(data); + setError(null); + + } catch (error) { + console.error("Error fetching data:", error); + setError("Error fetching data"); + } + finally { + setLoading(false); + } + } + fetchData(); + + + }, [url]); + + return { data, loading, error }; + +} \ No newline at end of file