import { useEffect, useRef, useState } from "react"; import * as Api from "./api"; import { NavigationDialog } from "./navigation-dialog"; import { installedRepositoryGroups, loadRepositorySnapshot, readRepositoryCache, repositoryCacheIsStale, writeRepositoryCache, } from "./repository-cache"; import { TerminalAlert } from "./terminal-alert"; import type { RepositorySnapshot } from "./repository-cache"; import type { NavigationDialogMotion } from "./navigation-dialog"; function message(error: unknown): string { return error instanceof Error ? error.message : "Could not load repositories."; } export function AddProjectDialog( { added, motion, onAdded, onDismiss, userId, }: { added: Api.NavigationProject[]; motion: NavigationDialogMotion; onAdded: (project: Api.NavigationProject) => void; onDismiss: () => void; userId: string; }, ) { let input = useRef(null); let [snapshot, setSnapshot] = useState(() => readRepositoryCache(userId) ); let [error, setError] = useState(); let [query, setQuery] = useState(""); let [retry, setRetry] = useState(0); let [adding, setAdding] = useState(); useEffect(() => { let active = true; let cached = readRepositoryCache(userId); if (cached) setSnapshot(cached); setError(undefined); if (retry === 0 && cached && !repositoryCacheIsStale(cached)) return; loadRepositorySnapshot(userId, cached, value => { if (active) setSnapshot(value); }).then(value => { if (active) { writeRepositoryCache(value); setSnapshot(value); } }, reason => { if (active) setError(reason); }); return () => { active = false; }; }, [retry, userId]); let normalized = query.trim().toLocaleLowerCase(); let repositories = snapshot ? installedRepositoryGroups(snapshot).flatMap(group => group.repositories) : []; let addedIds = new Set(added.map(project => project.repositoryId)); let visible = repositories.filter(repository => !normalized || `${repository.owner}/${repository.name}`.toLocaleLowerCase().includes(normalized) ); async function select(repository: Api.Repository) { if (adding || addedIds.has(repository.id)) return; setAdding(repository.id); setError(undefined); try { onAdded(await Api.addProject(repository.owner, repository.name)); onDismiss(); } catch (reason) { setError(reason); setAdding(undefined); } } return (
setQuery(event.target.value)} placeholder="Search repositories" ref={input} value={query} />
{!snapshot && error === undefined && (

Loading repositories…

)} {error !== undefined && (
{message(error)}
)} {snapshot && visible.length === 0 && error === undefined && (

No accessible repositories found.

)} {visible.map(repository => { let alreadyAdded = addedIds.has(repository.id); return ( ); })}
Manage repository access
); }