diff --git a/src/components/card-document/CardDocument.tsx b/src/components/card-document/CardDocument.tsx index 76b11015cfd69efb9ea36c574bb81ea4f9b1156a..0e989e9fd1d02ffdac3dd30501b30f7d81c29ee1 100644 --- a/src/components/card-document/CardDocument.tsx +++ b/src/components/card-document/CardDocument.tsx @@ -1,6 +1,6 @@ 'use client'; -import { type Credential, type Description } from '@/service/types'; +import type { ValidCredential, Description } from '@/service/types'; import { formatDateString } from '@/utils/dateUtils'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; @@ -10,13 +10,22 @@ import CardModal from '../card-modal/CardModal'; import css from './CardDocument.module.scss'; export interface CardDocumentProps { - credential: Credential; + credential: ValidCredential; description: Description; metadata?: any; // define metadata type when available in the API movable?: boolean; id: string; } +export function getTitle(credential: ValidCredential): string { + if (Array.isArray(credential.type)) { + return credential.type[1] ?? credential.type[0]; + } else { + // @ts-expect-error + return credential.type ?? credential.Type ?? credential.vct; + } +} + const CardDocument = ({ credential, description, id, movable = false }: CardDocumentProps): JSX.Element => { const t = useTranslations('CredentialsOverview'); const [showModal, setShowModal] = useState(false); @@ -28,6 +37,8 @@ const CardDocument = ({ credential, description, id, movable = false }: CardDocu }), }); + console.log('credentials', credential.credentialSubject); + useEffect(() => { if (isDragging) { console.log('dragging'); @@ -44,7 +55,7 @@ const CardDocument = ({ credential, description, id, movable = false }: CardDocu <Container className="d-grid gap-3"> <Row className="p-1 flex-nowrap"> <Col className="d-flex flex-column justify-content-center align-items-start"> - <h2 className="display-6">{credential.type}</h2> + <h2 className="display-6">{getTitle(credential)}</h2> <strong> {credential.issuanceDate && ( <span> @@ -57,8 +68,8 @@ const CardDocument = ({ credential, description, id, movable = false }: CardDocu <div> {credential && - Object.entries(credential.credentialSubject) - .slice(0, 5) + Object.entries(credential.credentialSubject ?? {}) + ?.slice(0, 5) .map(([key, value]) => ( <Row key={key} @@ -101,6 +112,7 @@ const CardDocument = ({ credential, description, id, movable = false }: CardDocu handleClose={handleCloseModal} data={credential} description={description} + title={getTitle(credential)} /> </> ); diff --git a/src/components/card-modal/CardModal.tsx b/src/components/card-modal/CardModal.tsx index 348f8b7d3ccd303b4bfb6ab23ed3fd83b0550b58..96a3165281f09a35154597b7145f44565c89703a 100644 --- a/src/components/card-modal/CardModal.tsx +++ b/src/components/card-modal/CardModal.tsx @@ -9,9 +9,10 @@ interface CardModalProps { handleClose: () => void; data: Credential; description: Description; + title: string; } -const CardModal = ({ show, handleClose, data, description }: CardModalProps): JSX.Element => { +const CardModal = ({ show, handleClose, data, description, title }: CardModalProps): JSX.Element => { return ( <Modal show={show} @@ -19,11 +20,11 @@ const CardModal = ({ show, handleClose, data, description }: CardModalProps): JS centered > <ModalHeader closeButton> - <ModalTitle>{data.type}</ModalTitle> + <ModalTitle>{title}</ModalTitle> </ModalHeader> <ModalBody> <div> - {Object.entries(data.credentialSubject).map(([key, value]) => ( + {Object.entries(data.credentialSubject ?? {}).map(([key, value]) => ( <Row key={key} className="flex-nowrap" diff --git a/src/components/credential-column/CredentialColumn.tsx b/src/components/credential-column/CredentialColumn.tsx index dcc2fc4c56c9bfc6258dac60b35b9d2a0183e31a..5f3b8d70be4d710dbd5efe733dffcdd225953044 100644 --- a/src/components/credential-column/CredentialColumn.tsx +++ b/src/components/credential-column/CredentialColumn.tsx @@ -1,6 +1,6 @@ 'use client'; -import type { CredentialInPresentation, VerifiableCredentials } from '@/service/types'; +import type { CredentialInPresentation, ValidCredential, VerifiableCredentials } from '@/service/types'; import CardDocument from '../card-document/CardDocument'; import css from './CredentialColumn.module.scss'; import PresentationModal from '../presentation-modal/PresentationModal'; @@ -45,7 +45,7 @@ const CredentialColumn = ({ credential, movable = false, presentation }: Credent {column.map(key => ( <CardDocument key={key} - credential={credential.credentials[key]} + credential={credential.credentials[key] as ValidCredential} description={credential.description} id={key} movable={movable} diff --git a/src/service/types.ts b/src/service/types.ts index 458c62741be38959f93bd3df41b68dbf3ce26196..39ca68ca6bcc346e2051bf11d1435b33cf566013 100644 --- a/src/service/types.ts +++ b/src/service/types.ts @@ -144,13 +144,17 @@ export interface Credential { '@context': Array<string | object>; id?: string; holder?: string; - type: string; + type?: string | string[]; + Type?: string[]; + vct?: string; issuer?: string; issuanceDate?: string; - credentialSubject: CredentialSubject; + credentialSubject?: CredentialSubject; proof?: Proof; } +export type ValidCredential = Credential & ({ type: string | string[] } | { Type: string } | { vct: string }); + export interface CredentialInPresentation { '@context': string[]; id?: string;