1+ import SHA256 from 'crypto-js/sha256' ;
12import { View } from 'react-native' ;
23
34import { A , Caption , Label , useLayout } from '~/common/styleguide' ;
45import { Dependency , Download , PackageSize } from '~/components/Icons' ;
56import TrustedBadge from '~/components/Package/TrustedBadge' ;
7+ import UserAvatar from '~/components/Package/UserAvatar' ;
8+ import RelativeTime from '~/components/RelativeTime' ;
69import { type NpmRegistryVersionData } from '~/types' ;
7- import { getTimeSinceToday } from '~/util/datetime' ;
810import { formatBytes } from '~/util/formatBytes' ;
911import { formatNumberToString , pluralize } from '~/util/strings' ;
1012import tw from '~/util/tailwind' ;
@@ -20,27 +22,34 @@ export default function VersionBox({ label, time, versionData, downloads = 0 }:
2022 const { isSmallScreen } = useLayout ( ) ;
2123
2224 const urlBase = `https://www.npmjs.com/package/${ versionData . name } /v/${ versionData . version } ` ;
25+ const publisherMetadata = versionData . _npmUser ?. url ?? versionData . _npmUser ?. email ;
2326
2427 return (
2528 < View
2629 style = { [
27- tw `flex-row items-center justify-between gap-0.5 rounded-xl border border-palette-gray2 px-4 py -2.5 dark:border-default` ,
28- isSmallScreen && tw `flex-col items-start justify-start gap-2 ` ,
30+ tw `flex-row items-center justify-between gap-0.5 rounded-xl border border-palette-gray2 px-4 pb -2.5 pt-2 dark:border-default` ,
31+ isSmallScreen && tw `flex-col items-start justify-start gap-x-2 gap-y-2.5 ` ,
2932 ] } >
3033 < View >
31- < View style = { tw `min-h-4 flex-row items-center gap-1` } >
34+ < View style = { tw `min-h-4 flex-row flex-wrap items-center gap-1` } >
3235 { label && < Caption style = { tw `tabular-nums` } > { label } </ Caption > }
3336 { label && < Caption style = { tw `text-secondary` } > { ` • ` } </ Caption > }
3437 < Caption style = { label && tw `tabular-nums text-secondary` } > { versionData . version } </ Caption >
3538 </ View >
36- < View style = { tw `min-h-4 flex-row items-center gap-1` } >
37- < Label style = { tw `font-light text-secondary` } >
38- Released { getTimeSinceToday ( time ) } by { versionData . _npmUser ?. name }
39- </ Label >
40- { versionData . _npmUser ?. trustedPublisher && < TrustedBadge /> }
41- </ View >
39+ < Label style = { tw `flex min-h-4 flex-wrap items-center font-light text-secondary` } >
40+ Released < RelativeTime time = { time } dateOnly /> by
41+ { versionData . _npmUser ?. trustedPublisher && < TrustedBadge style = { tw `mx-[3px]` } /> }
42+ { publisherMetadata && ! versionData . _npmUser ?. trustedPublisher && (
43+ < UserAvatar
44+ src = { `https://gravatar.com/avatar/${ SHA256 ( publisherMetadata ) . toString ( ) } ?d=retro` }
45+ alt = { `${ versionData . _npmUser ?. name } avatar` }
46+ style = { tw `relative top-px mx-[3px] size-3.5 border border-default` }
47+ />
48+ ) }
49+ { versionData . _npmUser ?. name ?? 'Unknown' }
50+ </ Label >
4251 </ View >
43- < View style = { tw `flex-row flex-wrap gap-x-5 gap-y-1` } >
52+ < View style = { tw `flex-row flex-wrap gap-x-5 gap-y-1.5 ` } >
4453 { versionData . dependencies && (
4554 < View style = { [ tw `flex-row items-center gap-2.5` , ! isSmallScreen && tw `min-w-[110px]` ] } >
4655 < Dependency style = { tw `text-icon` } />
0 commit comments