"use client"; import { IconAlertTriangle, IconCheck, IconShieldCheck, IconX } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@kandev/ui/dialog"; import type { GitHubStatus } from "@/lib/types/github"; import { useTranslation } from "react-i18next"; type PermissionState = { name: string; available: boolean; }; function formatCapability(value: string) { return value.replaceAll("_", " ").replace(/\b\w/g, (letter) => letter.toUpperCase()); } function permissionStates(status: GitHubStatus): PermissionState[] { const permissions = new Map( Object.entries(status.automation?.capabilities ?? {}), ); for (const permission of [ ...(status.automation?.missing_capabilities ?? []), ...(status.automation?.missing_permissions ?? []), ]) { permissions.set(permission, false); } return Array.from(permissions, ([name, available]) => ({ name, available })).sort((a, b) => a.name.localeCompare(b.name), ); } export function GitHubPermissionsDialog({ status }: { status: GitHubStatus }) { const { t } = useTranslation(); if (status.automation?.source !== "github_app_installation") return null; const permissions = permissionStates(status); if (permissions.length === 0) return null; const missingCount = permissions.filter((permission) => !permission.available).length; return ( {t("github:githubAppPermissions")} {t("github:permissionsAvailableToKandevThroughThis")}
{permissions.map((permission) => (
{permission.available ? ( ) : ( )} {formatCapability(permission.name)} {permission.available ? t("github:available") : t("github:missing")}
))}
); }