/** The Pull Requests tool window: filterable list on the left, the selected pull request on the right. */ import { useEffect, useMemo, useState, type MouseEvent } from "react"; import clsx from "clsx"; import type { GhAvailability, PrCheck, PrStateFilter, PullRequestDetails, PullRequestSummary } from "@/platform/ipc"; import { executeAction } from "@/platform/actions"; import { useMarkupHtml } from "@/editor/lsp/markdown"; import { Badge, Button, Checkbox, EmptyState, Icon, IconButton, List, SearchField, Select, SplitGroup, SplitHandle, SplitPanel, Spinner, Tabs, showContextMenu, type MenuItem, T, } from "@/ui"; import { checksSummary, checksText, relativeTime, reviewDecisionLabel, reviewStateLabel, reviewThreads, stateLabel, } from "./model"; import { addComment, checkoutPullRequest, openCommentLocation, openFileDiff, openUrl, submitReview } from "./ops"; import { cancelBusy, loadDetails, refreshAll, select, setQuery, useGithub, type DetailTab } from "./store"; import styles from "./Github.module.css"; import { t, tx } from "@/platform/i18n"; const STATES: PrStateFilter[] = ["open", "merged", "closed", "all"]; function Unavailable({ availability }: { availability: GhAvailability }) { const retry = ( ); switch (availability.kind) { case "notInstalled": return ( {retry} } > Pull requests use the gh command line tool. Install it, then run{" "} gh auth login. ); case "notLoggedIn": return ( {retry} } > Run gh auth login in a terminal, then retry. ); case "notGitHub": return (
This project has no remote on GitHub.
{availability.message}
); case "error": return ( {availability.message} ); default: return null; } } function StateBadge({ pr }: { pr: PullRequestSummary }) { const tone = pr.state === "merged" ? "accent" : pr.state === "closed" ? "danger" : pr.isDraft ? "neutral" : "success"; return {stateLabel(pr)}; } function Filters() { const query = useGithub((s) => s.query); const loading = useGithub((s) => s.listLoading); const [search, setSearch] = useState(query.search); useEffect(() => { if (search === useGithub.getState().query.search) return; const t = setTimeout(() => setQuery({ search }), 400); return () => clearTimeout(t); }, [search]); return (