1
0
Fork 1
mirror of https://github.com/SomboChea/ui synced 2024-05-04 02:21:36 +07:00
verdaccio-ui/src/components/Package/Package.tsx
Priscila Oliveira 42d3bb8508 feat: login Dialog Component - Replaced class by func. comp + added react-hook-form (#341)
* refactor: convert class to func

* refactor: changed login form logic

* refactor: conver to testing-library tests

* refactor: moved dependency

* refactor: replaced uglifyjs-webpack-plugin by terser-webpack-plugin

* fix: fixed e2e errors

* fix: fixed e2e test

* Delete settings.json

* fix: vscode settings rollback

* refactor: rollback webpack config

* refactor: updated eslint rule

* fix: removed --fix

* refactor: incresed the bundle size
2019-12-06 18:09:01 +01:00

202 lines
5.1 KiB
TypeScript

import React from 'react';
import BugReport from '@material-ui/icons/BugReport';
import DownloadIcon from '@material-ui/icons/CloudDownload';
import HomeIcon from '@material-ui/icons/Home';
import { PackageMetaInterface, Author as PackageAuthor } from '../../../types/packageMeta';
import Tag from '../Tag';
import fileSizeSI from '../../utils/file-size';
import { formatDate, formatDateDistance } from '../../utils/package';
import Tooltip from '../../muiComponents/Tooltip';
import { isURL } from '../../utils/url';
import { downloadTarball } from '../ActionBar';
import ListItem from '../../muiComponents/ListItem';
import Grid from '../../muiComponents/Grid';
import {
Author,
Avatar,
Description,
Details,
GridRightAligned,
Icon,
IconButton,
OverviewItem,
PackageList,
PackageListItemText,
PackageTitle,
Published,
TagContainer,
Text,
WrapperLink,
} from './styles';
interface Bugs {
url: string;
}
interface Dist {
unpackedSize: number;
tarball: string;
}
export interface PackageInterface {
name: string;
version: string;
time?: number | string;
author: PackageAuthor;
description?: string;
keywords?: string[];
license?: PackageMetaInterface['latest']['license'];
homepage?: string;
bugs?: Bugs;
dist?: Dist;
}
const Package: React.FC<PackageInterface> = ({
author: { name: authorName, avatar: authorAvatar },
bugs,
description,
dist,
homepage,
keywords = [],
license,
name: packageName,
time,
version,
}) => {
const renderVersionInfo = (): React.ReactNode =>
version && (
<OverviewItem>
<Icon name={'version'} />
{`v${version}`}
</OverviewItem>
);
const renderAuthorInfo = (): React.ReactNode =>
authorName && (
<Author>
<Avatar alt={authorName} src={authorAvatar} />
<Details>
<Text text={authorName} />
</Details>
</Author>
);
const renderFileSize = (): React.ReactNode =>
dist &&
dist.unpackedSize && (
<OverviewItem>
<Icon name={'filebinary'} />
{fileSizeSI(dist.unpackedSize)}
</OverviewItem>
);
const renderLicenseInfo = (): React.ReactNode =>
license && (
<OverviewItem>
<Icon name="law" />
{license}
</OverviewItem>
);
const renderPublishedInfo = (): React.ReactNode =>
time && (
<OverviewItem>
<Icon name="time" />
<Published>{`Published on ${formatDate(time)}`}</Published>
{formatDateDistance(time)}
</OverviewItem>
);
const renderHomePageLink = (): React.ReactNode =>
homepage &&
isURL(homepage) && (
<a href={homepage} target={'_blank'}>
<Tooltip aria-label={'Homepage'} title={'Visit homepage'}>
<IconButton aria-label={'Homepage'}>
<HomeIcon />
</IconButton>
</Tooltip>
</a>
);
const renderBugsLink = (): React.ReactNode =>
bugs &&
bugs.url &&
isURL(bugs.url) && (
<a href={bugs.url} target={'_blank'}>
<Tooltip aria-label={'Bugs'} title={'Open an issue'}>
<IconButton aria-label={'Bugs'}>
<BugReport />
</IconButton>
</Tooltip>
</a>
);
const renderDownloadLink = (): React.ReactNode =>
dist &&
dist.tarball &&
isURL(dist.tarball) && (
// eslint-disable-next-line
<a onClick={downloadTarball(dist.tarball.replace(`https://registry.npmjs.org/`, window.location.href))} target={'_blank'}>
<Tooltip aria-label={'Download the tar file'} title={'Download tarball'}>
<IconButton aria-label={'Download'}>
<DownloadIcon />
</IconButton>
</Tooltip>
</a>
);
const renderPrimaryComponent = (): React.ReactNode => {
return (
<Grid container={true} item={true} xs={12}>
<Grid item={true} xs={true}>
<WrapperLink to={`/-/web/detail/${packageName}`}>
<PackageTitle className="package-title">{packageName}</PackageTitle>
</WrapperLink>
</Grid>
<GridRightAligned item={true} xs={true}>
{renderHomePageLink()}
{renderBugsLink()}
{renderDownloadLink()}
</GridRightAligned>
</Grid>
);
};
const renderSecondaryComponent = (): React.ReactNode => {
const tags = keywords.sort().map((keyword, index) => <Tag key={index}>{keyword}</Tag>);
return (
<>
<Description component={'span'}>{description}</Description>
{tags.length > 0 && <TagContainer>{tags}</TagContainer>}
</>
);
};
const renderPackageListItemText = (): React.ReactNode => (
<PackageListItemText
className="package-link"
// @ts-ignore
component="div"
primary={renderPrimaryComponent()}
secondary={renderSecondaryComponent()}
/>
);
return (
<PackageList className={'package'}>
<ListItem alignItems={'flex-start'}>{renderPackageListItemText()}</ListItem>
<ListItem alignItems={'flex-start'}>
{renderAuthorInfo()}
{renderVersionInfo()}
{renderPublishedInfo()}
{renderFileSize()}
{renderLicenseInfo()}
</ListItem>
</PackageList>
);
};
export default Package;