Rumah >hujung hadapan web >tutorial js >Cara Menambah Statistik Sumbangan GitHub pada Apl React Anda
Ingin mempamerkan aktiviti GitHub anda dalam portfolio React anda? Dalam tutorial ini, saya akan menunjukkan kepada anda cara membuat komponen React yang memaparkan jumlah sumbangan GitHub anda menggunakan API GraphQL GitHub, lengkap dengan caching yang cekap. Mari kita bina sesuatu yang keren! ?
Kami akan mencipta komponen React yang:
Sebelum kami bermula, anda memerlukan:
Mula-mula, buat fail .env dalam akar projek anda dan tambahkan token GitHub anda:
NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
Buat fail baharu bernama githubApi.js:
export async function fetchGithubCommits(username) { const GITHUB_TOKEN = process.env.NEXT_PUBLIC_GITHUB_TOKEN; const CACHE_KEY = `github-commits-${username}`; const CACHE_TTL = 3600; // 1 hour in seconds if (!GITHUB_TOKEN) { console.error("No GitHub token found!"); throw new Error("GitHub token is required"); } const cachedData = getCachedData(CACHE_KEY); if (cachedData) { return cachedData.value; } try { const currentYear = new Date().getFullYear(); const startYear = 2020; let totalCommits = 0; for (let year = startYear; year <= currentYear; year++) { const query = ` query($username: String!, $from: DateTime!, $to: DateTime!) { user(login: $username) { contributionsCollection(from: $from, to: $to) { totalCommitContributions restrictedContributionsCount } } } `; const response = await fetch("https://api.github.com/graphql", { method: "POST", headers: { Authorization: `Bearer ${GITHUB_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ query, variables: { username, from: `${year}-01-01T00:00:00Z`, to: `${year}-12-31T23:59:59Z`, }, }), }); const data = await response.json(); if (data.errors) { throw new Error(data.errors[0].message); } const yearCommits = (data.data?.user?.contributionsCollection?.totalCommitContributions || 0) + (data.data?.user?.contributionsCollection?.restrictedContributionsCount || 0); totalCommits += yearCommits; } setCachedData(CACHE_KEY, totalCommits, CACHE_TTL); return totalCommits; } catch (error) { console.error("Error fetching GitHub commits:", error); throw error; } } function setCachedData(key, value, ttl) { const item = { value, timestamp: Date.now(), ttl: ttl * 1000, }; localStorage.setItem(key, JSON.stringify(item)); } function getCachedData(key) { try { const item = localStorage.getItem(key); if (!item) return null; const parsedItem = JSON.parse(item); const now = Date.now(); if (now - parsedItem.timestamp > parsedItem.ttl) { localStorage.removeItem(key); return null; } return parsedItem; } catch { return null; } } export function invalidateCommitsCache(username) { localStorage.removeItem(`github-commits-${username}`); }
Buat fail baharu bernama GitHubStats.js:
import React, { useState, useEffect } from 'react'; import { fetchGithubCommits } from './githubApi'; const GitHubStats = ({ username }) => { const [commits, setCommits] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchStats = async () => { try { setLoading(true); setError(null); const totalCommits = await fetchGithubCommits(username); setCommits(totalCommits); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchStats(); }, [username]); if (loading) { return <div>Loading GitHub stats...</div>; } if (error) { return <div>Error: {error}</div>; } return ( <div className="github-stats"> <h2>GitHub Contributions</h2> <p>Total commits since 2020: {commits.toLocaleString()}</p> </div> ); }; export default GitHubStats;
Jom tambah beberapa penggayaan asas. Cipta GitHubStats.css:
.github-stats { padding: 20px; border-radius: 8px; background-color: #f6f8fa; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); margin: 20px 0; } .github-stats h2 { margin: 0 0 15px 0; color: #24292e; } .github-stats p { font-size: 1.2em; color: #586069; }
Kini anda boleh menggunakan komponen dalam apl anda:
import GitHubStats from './GitHubStats'; function App() { return ( <div className="App"> <h1>My Developer Portfolio</h1> <GitHubStats username="your-github-username" /> </div> ); }
Kemas kini GitHubStats.js untuk memasukkan pilihan muat semula manual:
import React, { useState, useEffect } from 'react'; import { fetchGithubCommits, invalidateCommitsCache } from './githubApi'; const GitHubStats = ({ username }) => { // ... previous state declarations ... const handleRefresh = async () => { invalidateCommitsCache(username); await fetchStats(); }; return ( <div className="github-stats"> <h2>GitHub Contributions</h2> <p>Total commits since 2020: {commits.toLocaleString()}</p> <button onClick={handleRefresh} disabled={loading}> {loading ? 'Refreshing...' : 'Refresh Stats'} </button> </div> ); };
Kami boleh mengubah suai komponen untuk menunjukkan sumbangan setahun:
NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
Anda kini mempunyai komponen statistik GitHub yang berfungsi sepenuhnya dalam apl React anda! Pelaksanaan ini menyediakan asas kukuh yang boleh anda bina. Beberapa idea untuk penambahbaikan:
Ingat untuk memastikan token GitHub anda selamat dan jangan sekali-kali memasukkannya ke repositori anda. Selamat mengekod! ?
Atas ialah kandungan terperinci Cara Menambah Statistik Sumbangan GitHub pada Apl React Anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!