/* * Copyright (c) 2021-2026 ahriman team. * * This file is part of ahriman * (see https://github.com/arcan1s/ahriman). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { Grid, Link, Typography } from "@mui/material"; import type { Dependencies } from "models/Dependencies"; import type { Package } from "models/Package"; import React from "react"; interface PackageDetailsGridProps { pkg: Package; dependencies?: Dependencies; } export default function PackageDetailsGrid({ pkg, dependencies }: PackageDetailsGridProps): React.JSX.Element { const packagesList = Object.entries(pkg.packages) .map(([name, properties]) => `${name}${properties.description ? ` (${properties.description})` : ""}`); const groups = Object.values(pkg.packages) .flatMap(properties => properties.groups ?? []); const licenses = Object.values(pkg.packages) .flatMap(properties => properties.licenses ?? []); const upstreamUrls = Object.values(pkg.packages) .map(properties => properties.url) .filter((url): url is string => !!url) .unique(); const aurUrl = pkg.remote.web_url; const pkgNames = Object.keys(pkg.packages); const pkgValues = Object.values(pkg.packages); const deps = pkgValues .flatMap(properties => (properties.depends ?? []).filter(dep => !pkgNames.includes(dep))) .unique(); const makeDeps = pkgValues .flatMap(properties => (properties.make_depends ?? []).filter(dep => !pkgNames.includes(dep))) .map(dep => `${dep} (make)`) .unique(); const optDeps = pkgValues .flatMap(properties => (properties.opt_depends ?? []).filter(dep => !pkgNames.includes(dep))) .map(dep => `${dep} (optional)`) .unique(); const allDepends = [...deps, ...makeDeps, ...optDeps]; const implicitDepends = dependencies ? Object.values(dependencies.paths).flat() : []; return <> packages {packagesList.unique().join("\n")} version {pkg.version} packager {pkg.packager ?? ""} groups {groups.unique().join("\n")} licenses {licenses.unique().join("\n")} upstream {upstreamUrls.map(url => {url} , )} AUR {aurUrl && AUR link } depends {allDepends.join("\n")} implicitly depends {implicitDepends.unique().join("\n")} ; }