import { useEffect, useState } from 'react' import { Meta, ProfileMetadata } from '../../types' import { SigitCardDisplayInfo, SigitStatus } from '../../utils' import { Event, kinds } from 'nostr-tools' import { Link } from 'react-router-dom' import { MetadataController } from '../../controllers' import { formatTimestamp, hexToNpub, npubToHex, shorten } from '../../utils' import { appPublicRoutes, appPrivateRoutes } from '../../routes' import { Button, Divider, Tooltip } from '@mui/material' import { DisplaySigner } from '../DisplaySigner' import { faArchive, faCalendar, faCopy, faEye, faFile } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { UserAvatar } from '../UserAvatar' import { UserAvatarGroup } from '../UserAvatarGroup' import styles from './style.module.scss' import { TooltipChild } from '../TooltipChild' import { getExtensionIconLabel } from '../getExtensionIconLabel' type SigitProps = { meta: Meta parsedMeta: SigitCardDisplayInfo } export const DisplaySigit = ({ meta, parsedMeta }: SigitProps) => { const { title, createdAt, submittedBy, signers, signedStatus, fileExtensions } = parsedMeta const [profiles, setProfiles] = useState<{ [key: string]: ProfileMetadata }>( {} ) useEffect(() => { const hexKeys = new Set([ ...signers.map((signer) => npubToHex(signer)!) ]) if (submittedBy) { hexKeys.add(npubToHex(submittedBy)!) } const metadataController = new MetadataController() const handleMetadataEvent = (key: string) => (event: Event) => { const metadataContent = metadataController.extractProfileMetadataContent(event) if (metadataContent) { setProfiles((prev) => ({ ...prev, [key]: metadataContent })) } } const handleEventListener = (key: string) => (kind: number, event: Event) => { if (kind === kinds.Metadata) { handleMetadataEvent(key)(event) } } hexKeys.forEach((key) => { if (!(key in profiles)) { metadataController.on(key, handleEventListener(key)) metadataController .findMetadata(key) .then((metadataEvent) => { if (metadataEvent) handleMetadataEvent(key)(metadataEvent) }) .catch((err) => { console.error(`error occurred in finding metadata for: ${key}`, err) }) } }) return () => { hexKeys.forEach((key) => { metadataController.off(key, handleEventListener(key)) }) } }, [submittedBy, signers, profiles]) return (

{title}

{submittedBy && (function () { const profile = profiles[submittedBy] return ( ) })()} {submittedBy && signers.length ? ( ) : null} {signers.map((signer) => { const pubkey = npubToHex(signer)! const profile = profiles[pubkey] return ( ) })}
{createdAt ? formatTimestamp(createdAt) : null}
{signedStatus} {fileExtensions.length > 0 ? ( {fileExtensions.length > 1 ? ( <> Multiple File Types ) : ( getExtensionIconLabel(fileExtensions[0]) )} ) : null}
) }