"use client"; import { useState, useEffect } from "react"; import Image from "next/image"; // 1. Define the TypeScript interface for a GitHub User object interface GitHubUser { id: number; login: string; avatar_url: string; html_url: string; } const URL = "https://api.github.com/users"; const FetchGitUsers = () => { // 2. Add types to state hooks const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { // 3. Native Web API AbortController for fetch cleanup const controller = new AbortController(); const fetchData = async () => { try { setLoading(true); setError(null); const response = await fetch(URL, { signal: controller.signal }); console.log(response); if (!response.ok) { throw new Error(`HTTP Error! Status: ${response.status}`); } const data: GitHubUser[] = await response.json(); setUsers(data); } catch (err: unknown) { // Ignore abort errors caused by component unmounting if (err instanceof Error && err.name === "AbortError") return; if (err instanceof Error) { setError(err.message); } else { setError("An unexpected error occurred."); } } finally { setLoading(false); } }; fetchData(); // 4. Clean up ongoing fetch if component unmounts return () => { controller.abort(); }; }, []); // DaisyUI Loading Spinner State if (loading) { return (

Loading GitHub Users...

); } // DaisyUI Alert Error State if (error) { return (
{error}
); } return (
{/* Header */}

GitHub Users

Fetched directly from GitHub API

{users.length} Users
{/* Users Grid */}
    {users.map((user) => { const { id, login, avatar_url, html_url } = user; return (
  • {/* DaisyUI Card Component */}
    {/* DaisyUI Avatar Container */}
    {/* {`${login}'s */} {`${login}'s
  • ); })}
); }; export default FetchGitUsers;