Spaces:
Build error
Build error
| import React, { useState, useEffect } from 'react'; | |
| import axios from 'axios'; | |
| import { Octokit } from '@octokit/rest'; | |
| import Select from 'react-select'; | |
| const octokit = new Octokit({ auth: import.meta.env.VITE_GITHUB_TOKEN }); | |
| interface PullRequest { | |
| title: string; | |
| html_url: string; | |
| user: { | |
| login: string; | |
| }; | |
| } | |
| interface Repo { | |
| value: string; | |
| label: string; | |
| } | |
| const PullRequestViewer: React.FC = () => { | |
| const [repos, setRepos] = useState<Repo[]>([]); | |
| const [selectedRepo, setSelectedRepo] = useState<Repo | null>(null); | |
| const [pullRequests, setPullRequests] = useState<PullRequest[]>([]); | |
| useEffect(() => { | |
| const fetchRepos = async () => { | |
| try { | |
| const response = await octokit.repos.listForOrg({ | |
| org: 'OpenDevin', | |
| type: 'all', | |
| }); | |
| const repoOptions = response.data.map(repo => ({ | |
| value: repo.name, | |
| label: repo.name, | |
| })); | |
| setRepos(repoOptions); | |
| } catch (error) { | |
| console.error('Error fetching repos:', error); | |
| } | |
| }; | |
| fetchRepos(); | |
| }, []); | |
| useEffect(() => { | |
| const fetchPullRequests = async () => { | |
| if (selectedRepo) { | |
| try { | |
| let allPullRequests: PullRequest[] = []; | |
| let page = 1; | |
| let hasNextPage = true; | |
| while (hasNextPage) { | |
| const response = await octokit.pulls.list({ | |
| owner: 'OpenDevin', | |
| repo: selectedRepo.value, | |
| state: 'open', | |
| per_page: 100, | |
| page: page, | |
| }); | |
| allPullRequests = [...allPullRequests, ...response.data]; | |
| if (response.data.length < 100) { | |
| hasNextPage = false; | |
| } else { | |
| page++; | |
| } | |
| } | |
| setPullRequests(allPullRequests); | |
| } catch (error) { | |
| console.error('Error fetching pull requests:', error); | |
| } | |
| } | |
| }; | |
| fetchPullRequests(); | |
| }, [selectedRepo]); | |
| return ( | |
| <div> | |
| <h1>Pull Request Viewer</h1> | |
| <Select | |
| options={repos} | |
| value={selectedRepo} | |
| onChange={(option) => setSelectedRepo(option as Repo)} | |
| placeholder="Select a repository" | |
| aria-label="Select a repository" | |
| /> | |
| {pullRequests.length > 0 ? ( | |
| <ul> | |
| {pullRequests.map((pr) => ( | |
| <li key={pr.html_url}> | |
| <a href={pr.html_url} target="_blank" rel="noopener noreferrer"> | |
| {pr.title} | |
| </a> | |
| {' by '} | |
| {pr.user.login} | |
| </li> | |
| ))} | |
| </ul> | |
| ) : ( | |
| <p>No open pull requests found.</p> | |
| )} | |
| </div> | |
| ); | |
| }; | |
| export default PullRequestViewer; | |