diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2024-02-08 15:21:20 +0000 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2024-02-08 15:21:20 +0000 |
| commit | f58a1d127577b07bd849df85afd5e574eaec3a35 (patch) | |
| tree | b1174f1717b6f593f187685fda5518d5f056f835 /src/components | |
| parent | 4cddd911654b77edaa171f775a66fd65491acc30 (diff) | |
| download | personal-website-f58a1d127577b07bd849df85afd5e574eaec3a35.tar.gz personal-website-f58a1d127577b07bd849df85afd5e574eaec3a35.tar.bz2 personal-website-f58a1d127577b07bd849df85afd5e574eaec3a35.zip | |
Turned GitHub projects into a component
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/GitHubProjects.jsx | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/components/GitHubProjects.jsx b/src/components/GitHubProjects.jsx new file mode 100644 index 0000000..b54dc9f --- /dev/null +++ b/src/components/GitHubProjects.jsx @@ -0,0 +1,75 @@ +import { h } from 'preact'; +import { useState, useEffect } from 'preact/hooks'; + +const GitHubProjects = ({ username, isOrganization }) => { + const [repos, setRepos] = useState([]); + const [error, setError] = useState(null); + const [currentPage, setCurrentPage] = useState(1); + const reposPerPage = 10; + + useEffect(() => { + const fetchRepos = async () => { + const baseUrl = 'https://api.github.com'; + const url = isOrganization + ? `${baseUrl}/orgs/${username}/repos` + : `${baseUrl}/users/${username}/repos`; + + try { + const response = await fetch(url); + const data = await response.json(); + + if (response.ok) { + if (Array.isArray(data)) { + setRepos(data.filter(repo => !repo.fork)); + } else { + console.error('Unexpected data format:', data); + setError('Unexpected data format'); + setRepos([]); + } + } else { + console.error('API error:', data); + setError(data.message); + setRepos([]); + } + } catch (err) { + console.error('Failed to fetch projects:', err); + setError(err.message); + setRepos([]); + } + }; + + fetchRepos(); + }, [username, isOrganization]); // Don't forget to include dependencies + + // Get current repos + const indexOfLastRepo = currentPage * reposPerPage; + const indexOfFirstRepo = indexOfLastRepo - reposPerPage; + const currentRepos = repos.slice(indexOfFirstRepo, indexOfLastRepo); + + // Change page + const nextPage = () => setCurrentPage(currentPage + 1); + const prevPage = () => setCurrentPage(currentPage - 1); + + return ( + <div> + {error && <div class="error">{error}</div>} + <div class="grid"> + {currentRepos.map((repo) => ( + <article class="card"> + <h1>{repo.name}</h1> + <p>{repo.description}</p> + <div class="row"> + <a href={repo.html_url} target="_blank">Repository</a> + </div> + </article> + ))} + </div> + <div> + {currentPage > 1 && <button class="button margin" onClick={prevPage}>Previous</button>} + {currentPage < Math.ceil(repos.length / reposPerPage) && <button class="button margin" onClick={nextPage}>Next</button>} + </div> + </div> + ); +}; + +export default GitHubProjects;
\ No newline at end of file |
