| 228 | |
| 229 | |
| 230 | export default function Contributor(props) { |
| 231 | const [contributors, setContributors] = useState([]); |
| 232 | const [openIssues, setOpenIssues] = useState([]); |
| 233 | const [showIssue, setShowIssue] = useState(true); // Determine which section to show |
| 234 | const [loading, setLoading] = useState(true); |
| 235 | const [currentPage, setCurrentPage] = useState(1); |
| 236 | const [repoStats, setRepoStats] = useState({ |
| 237 | stars: 0, |
| 238 | forks: 0, |
| 239 | openIssues: 0, |
| 240 | }); |
| 241 | const [searchTerm, setSearchTerm] = useState(''); // State for search term |
| 242 | |
| 243 | const itemsPerPage = 9; // Set the number of items per page (for both contributors and issues) |
| 244 | |
| 245 | useEffect(() => { |
| 246 | const fetchData = async () => { |
| 247 | try { |
| 248 | // Fetch contributors |
| 249 | const contributorsResponse = await fetch("https://api.github.com/repos/Bitbox-Connect/Bitbox/contributors?page=1&per_page=100"); |
| 250 | |
| 251 | if (!contributorsResponse.ok) { |
| 252 | throw new Error("Failed to fetch contributors data"); |
| 253 | } |
| 254 | const contributorsData = await contributorsResponse.json(); |
| 255 | setContributors(contributorsData); |
| 256 | |
| 257 | // Fetch repo stats |
| 258 | const repoResponse = await fetch('https://api.github.com/repos/Bitbox-Connect/Bitbox'); |
| 259 | const repoData = await repoResponse.json(); |
| 260 | setRepoStats({ |
| 261 | stars: repoData.stargazers_count, |
| 262 | forks: repoData.forks_count, |
| 263 | openIssues: repoData.open_issues_count, |
| 264 | }); |
| 265 | |
| 266 | // Fetch issues |
| 267 | const issueResponse = await fetch('https://api.github.com/repos/Bitbox-Connect/Bitbox/issues'); |
| 268 | const issueData = await issueResponse.json(); |
| 269 | setOpenIssues(issueData); |
| 270 | } catch (error) { |
| 271 | console.error("Error fetching data:", error); |
| 272 | } finally { |
| 273 | setLoading(false); |
| 274 | } |
| 275 | }; |
| 276 | |
| 277 | fetchData(); |
| 278 | }, []); |
| 279 | |
| 280 | // Calculate pagination indices |
| 281 | const indexOfLastItem = currentPage * itemsPerPage; |
| 282 | const indexOfFirstItem = indexOfLastItem - itemsPerPage; |
| 283 | |
| 284 | // Filter contributors or issues based on search term |
| 285 | const filteredContributors = contributors.filter(contributor => |
| 286 | contributor.login.toLowerCase().includes(searchTerm.toLowerCase()) |
| 287 | ); |