import { useState } from "react"; import { Box, Button, Flex, Table } from "rimble-ui"; import { VC } from "vc-schema-tools"; import { CredentialFooter, CredentialDetailsTDLeft, CredentialDetailsTDRight, CredentialTR, } from "./CredentialComponents"; import { config } from "../../../config"; import { baseColors, colors } from "../../../themes"; import { dateTimeFormat, truncateDid } from "../../../utils"; import { CopyToClipboard } from "../../elements"; import { useVcSchema } from "../../../services/useVcSchema"; import { CredentialHeader } from "./CredentialHeader"; import { CredentialProperty } from "./CredentialProperty"; import { ViewSchemaButton } from "../Schemas/ViewSchemaButton"; import { RENDER_CONTEXT } from "../../../context"; export interface CredentialProps { vc: VC; isOpen?: boolean; renderContext?: RENDER_CONTEXT; } export const Credential: React.FunctionComponent = (props) => { const { vc } = props; const { vcSchema } = useVcSchema(vc); const vcType = vc.type[vc.type.length - 1]; const issuanceDate = typeof vc.issuanceDate === "number" ? dateTimeFormat(new Date(vc.issuanceDate * 1000)) : dateTimeFormat(new Date(vc.issuanceDate)); const issuanceDateFormatted = `${issuanceDate.dateFormatted} at ${issuanceDate.timeFormatted}`; const expirationDate = vc.expirationDate && dateTimeFormat(new Date(vc.expirationDate)); const expirationDateFormatted = expirationDate && `${expirationDate.dateFormatted} at ${expirationDate.timeFormatted}`; const expired = vc.expirationDate && new Date(vc.expirationDate) < new Date(Date.now()); const issuer = typeof vc.issuer === "string" ? vc.issuer : vc.issuer.id; const vcUrl = vc.proof?.jwt && `${config.SEARCH_UI_URL}/vc-validator?vc=${vc.proof.jwt}`; const [isOpen, setIsOpen] = useState(props.isOpen || false); return ( {isOpen && ( <> {Object.entries(vc.credentialSubject).map( ([key, value]) => // "type" is a reserved keyword in JSON-LD, and `credentialSubject.type` is just used to define what semantic type of linked data the VC subject is, and we present that info elsewhere as the schema, so would be redundant to list it. Some issuers include `credentialSubject.type` in every single VC. key !== "type" && ( ), )}
{vc.credentialSubject.id && ( Subject {truncateDid(vc.credentialSubject.id)} )} Issuer {truncateDid(issuer)} Date Issued {issuanceDateFormatted} {expirationDate && ( Expires {expirationDateFormatted} )}
{vcSchema?.slug && ( Schema {vcSchema.slug}
)} {vcUrl && props.renderContext !== RENDER_CONTEXT.SEARCH && ( Verify on Serto Search )} )} setIsOpen(isOpen)} vc={vc} vcUrl={vcUrl} />
); };