import React from 'react'; import BugReport from '@material-ui/icons/BugReport'; import Grid from '@material-ui/core/Grid'; import HomeIcon from '@material-ui/icons/Home'; import ListItem from '@material-ui/core/ListItem'; import Tooltip from '@material-ui/core/Tooltip'; import { PackageMetaInterface } from 'types/packageMeta'; import Tag from '../Tag'; import fileSizeSI from '../../utils/file-size'; import { formatDate, formatDateDistance } from '../../utils/package'; import { Author, Avatar, Description, Details, GridRightAligned, Icon, IconButton, OverviewItem, PackageList, PackageListItem, PackageListItemText, PackageTitle, Published, TagContainer, Text, WrapperLink, } from './styles'; import { isURL } from '../../utils/url'; interface Author { name: string; avatar?: string; email?: string; } interface Bugs { url: string; } interface Dist { unpackedSize: number; } export interface PackageInterface { name: string; version: string; time?: number | string; author: Author; description?: string; keywords?: string[]; license?: PackageMetaInterface['latest']['license']; homepage?: string; bugs?: Bugs; dist?: Dist; } const Package: React.FC = ({ author: { name: authorName, avatar: authorAvatar }, bugs, description, dist, homepage, keywords = [], license, name: packageName, time, version, }) => { const renderVersionInfo = (): React.ReactNode => version && ( {`v${version}`} ); const renderAuthorInfo = (): React.ReactNode => authorName && (
); const renderFileSize = (): React.ReactNode => dist && dist.unpackedSize && ( {fileSizeSI(dist.unpackedSize)} ); const renderLicenseInfo = (): React.ReactNode => license && ( {license} ); const renderPublishedInfo = (): React.ReactNode => time && ( {`Published on ${formatDate(time)} •`} {`${formatDateDistance(time)} ago`} ); const renderHomePageLink = (): React.ReactNode => homepage && isURL(homepage) && ( {/* eslint-disable-next-line react/jsx-max-depth */} ); const renderBugsLink = (): React.ReactNode => bugs && bugs.url && isURL(bugs.url) && ( {/* eslint-disable-next-line react/jsx-max-depth */} ); const renderPrimaryComponent = (): React.ReactNode => { return ( {/* eslint-disable-next-line react/jsx-max-depth */} {packageName} {renderHomePageLink()} {renderBugsLink()} ); }; const renderSecondaryComponent = (): React.ReactNode => { // @ts-ignore const tags = keywords.sort().map((keyword, index) => {keyword}); return ( <> {description} {tags.length > 0 && {tags}} ); }; const renderPackageListItemText = (): React.ReactNode => ( // @ts-ignore ); return ( {renderPackageListItemText()} {renderAuthorInfo()} {renderVersionInfo()} {renderPublishedInfo()} {renderFileSize()} {renderLicenseInfo()} ); }; export default Package;