| import React, { useState } from "react"; |
| import dynamic from "next/dynamic"; |
| import { ThemeProvider } from "@mui/material/styles"; |
| import { DateTime } from "luxon"; |
| import theme from "./theme"; |
| import { GithubRepo, useGithubRepo } from "./data/GithubRepo"; |
| import { |
| Breadcrumbs, |
| Card, |
| CardContent, |
| CardHeader, |
| Container, |
| Drawer, |
| FormControl, |
| Grid, |
| Link, |
| List, |
| ListItem, |
| ListItemText, |
| MenuItem, |
| Select, |
| Toolbar, |
| Typography, |
| } from "@mui/material"; |
| |
| const DynamicGithubTeamTable = dynamic(() => import("./GithubTeamTable")); |
| |
| const DynamicGithubIssueQueryCountTaskResultChart = dynamic( |
| () => import("../src/GithubIssueQueryCountTaskResultChart") |
| ); |
| |
| const appBarHeight = 52; |
| const drawerWidth = 256; |
| |
| function RepoListItem(repo: GithubRepo) { |
| const name = `${repo.owner}/${repo.repo}`; |
| const link = `/${name}`; |
| return ( |
| <ListItem key={name} dense={true}> |
| <ListItemText> |
| <Link href={link}>{name}</Link> |
| </ListItemText> |
| </ListItem> |
| ); |
| } |
| |
| function RepoList() { |
| const { data, loading, error } = useGithubRepo(); |
| |
| if (loading) { |
| return <div />; |
| } |
| |
| if (error) { |
| return <p>Error</p>; |
| } |
| return <List>{data.map((repo) => RepoListItem(repo))}</List>; |
| } |
| |
| function maxDays() { |
| return Math.ceil( |
| Math.abs(DateTime.fromISO("2020-12-17").diffNow("day").days) |
| ); |
| } |
| |
| function GithubIssueQueryResultCard({ |
| title, |
| queryIds, |
| }: { |
| title: string; |
| queryIds: Array<string>; |
| }) { |
| const [days, setDays] = useState(30); |
| return ( |
| <Card> |
| <CardHeader |
| title={title} |
| titleTypographyProps={{ variant: "body1" }} |
| action={ |
| <FormControl fullWidth> |
| <Select |
| id="select" |
| value={days} |
| autoWidth |
| onChange={(event) => setDays(event.target.value as number)} |
| > |
| <MenuItem value={30}>past month</MenuItem> |
| <MenuItem value={90}>past 3 months</MenuItem> |
| <MenuItem value={180}>past 6 months</MenuItem> |
| <MenuItem value={360}>past 12 months</MenuItem> |
| <MenuItem value={720}>past 24 months</MenuItem> |
| <MenuItem value={maxDays()}>all</MenuItem> |
| </Select> |
| </FormControl> |
| } |
| /> |
| <CardContent> |
| <DynamicGithubIssueQueryCountTaskResultChart |
| days={days} |
| queryIds={queryIds} |
| /> |
| </CardContent> |
| </Card> |
| ); |
| } |
| |
| export interface RepoDashboardProps { |
| owner: string; |
| repo: string; |
| } |
| |
| export default function RepoDashboard({ owner, repo }: RepoDashboardProps) { |
| return ( |
| <ThemeProvider theme={theme}> |
| <Drawer variant={"permanent"}> |
| <Toolbar style={{ width: drawerWidth, marginTop: appBarHeight }}> |
| <RepoList /> |
| </Toolbar> |
| </Drawer> |
| |
| <main |
| style={{ |
| backgroundColor: "rgb(250, 250, 250)", |
| paddingLeft: drawerWidth, |
| }} |
| > |
| <Container maxWidth={false}> |
| <Breadcrumbs aria-label="breadcrumb" className="mt-4 mb-4"> |
| <Typography color="textPrimary"> |
| <Link |
| style={{ marginLeft: 4 }} |
| href={`https://github.com/${owner}`} |
| > |
| {owner} |
| </Link> |
| </Typography> |
| <Typography color="textPrimary"> |
| <Link href={`https://github.com/${owner}/${repo}`}>{repo}</Link> |
| </Typography> |
| </Breadcrumbs> |
| <Grid container spacing={2}> |
| <Grid item xs={12}> |
| <DynamicGithubTeamTable owner={owner} repo={repo} /> |
| </Grid> |
| {owner === "bazelbuild" && repo === "bazel" && ( |
| <> |
| <Grid item xs={12} md={6} xl={4}> |
| <GithubIssueQueryResultCard |
| title="Unreviewed Issues" |
| queryIds={["unreviewed"]} |
| /> |
| </Grid> |
| <Grid item xs={12} md={6} xl={4}> |
| <GithubIssueQueryResultCard |
| title="Untriaged Issues" |
| queryIds={["total-untriaged"]} |
| /> |
| </Grid> |
| </> |
| )} |
| </Grid> |
| </Container> |
| </main> |
| </ThemeProvider> |
| ); |
| } |