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