diff --git a/src/components/Issuance/EmailIssuance.tsx b/src/components/Issuance/EmailIssuance.tsx index 862803a52..fab81522d 100644 --- a/src/components/Issuance/EmailIssuance.tsx +++ b/src/components/Issuance/EmailIssuance.tsx @@ -210,8 +210,8 @@ const EmailIssuance = () => { transformedData.credentialOffer.push(transformedEntry); }); transformedData.credentialDefinitionId = credDefId; + transformedData.isReuseConnection = true; - } else if (schemaType=== SchemaTypes.schema_W3C) { existingData.formData.forEach((entry: { email: string; credentialData: IEmailCredentialData; attributes:IIssueAttributes[] }) => { @@ -253,6 +253,7 @@ const EmailIssuance = () => { }); transformedData.protocolVersion = "v2"; + transformedData.isReuseConnection = true; transformedData.credentialType = CredentialType.JSONLD; } diff --git a/src/components/Issuance/interface.ts b/src/components/Issuance/interface.ts index 8c27ddd77..fe161edc9 100644 --- a/src/components/Issuance/interface.ts +++ b/src/components/Issuance/interface.ts @@ -187,5 +187,6 @@ export interface ICredentialOffer { credentialOffer: ICredentialOffer[]; credentialDefinitionId?: string; protocolVersion?: string; + isReuseConnection?: boolean; credentialType?: string; } \ No newline at end of file diff --git a/src/components/Verification/AttributesListData.tsx b/src/components/Verification/AttributesListData.tsx index 9eac679dd..0d89dbb7b 100644 --- a/src/components/Verification/AttributesListData.tsx +++ b/src/components/Verification/AttributesListData.tsx @@ -2,45 +2,101 @@ import { Card } from 'flowbite-react'; import CopyDid from '../../commonComponents/CopyDid'; interface AttributesListProps { - attributeDataList: { [key: string]: any }[] + attributeDataList: { [key: string]: any }[]; } +const groupAndMergeAttributes = (data: { [key: string]: any }[], key: string): { [key: string]: any }[] => { + const grouped = data.reduce((result, item) => { + const groupKey = item[key] || item['schemaId']; + if (!result[groupKey]) { + result[groupKey] = {}; + } + // Merge attributes into a single object + result[groupKey] = { ...result[groupKey], ...item }; + return result; + }, {} as { [key: string]: any }); + + // Convert the grouped object back to an array + return Object.values(grouped); +}; + const AttributesListData = ({ attributeDataList }: AttributesListProps): JSX.Element => { - return ( - <> - {attributeDataList?.map((item, index) => ( - -
-
- {`Credential ${index + 1}`} -
+ const mergedData = groupAndMergeAttributes(attributeDataList, 'credDefId'); + return ( + <> + {mergedData?.map((item, index) => ( + +
+
+ {`Credential ${index + 1}`} +
- {Object.entries(item).map(([key, value], idx) => ( -
-
- {key} +
+
+
+ Attributes +
+
+
+ {' '} + Values
-
- : +
+ + {Object.entries(item) + .filter(([key]) => key !== 'credDefId' && key !== 'schemaId') + .map(([key, value], idx) => ( +
+
+ + {key} +
+
+ : +
+
+ {value} +
+
+ ))} +
+ +
+
+
+ schemaId
+
:
- {key === 'schemaId' || key === 'credDefId' ? ( +
+ +
+
+
+
+ + {item.credDefId && ( +
+
+
+ credDefId +
+
:
+
- +
- ) : ( - {value} - )} +
- ))} + )}
))} - - ); -} + + ); +}; export default AttributesListData; diff --git a/src/components/Verification/EmailCredDefSelection.tsx b/src/components/Verification/EmailCredDefSelection.tsx index aeddbaaff..0448f4608 100644 --- a/src/components/Verification/EmailCredDefSelection.tsx +++ b/src/components/Verification/EmailCredDefSelection.tsx @@ -110,43 +110,42 @@ const EmailCredDefSelection = () => { }; const selectConnection = async (credDefId: string, checked: boolean) => { - if (credDefId) { - const getRawCredDefs = await getFromLocalStorage(storageKeys.SCHEMA_CRED_DEFS); - const parsedRawCredDefs = JSON.parse(getRawCredDefs); - - const selectedCredDef = parsedRawCredDefs.find((credDef: CredDefData) => credDef.credentialDefinitionId === credDefId); - - if (selectedCredDef) { - setSelectedCredDefs((prevSelected) => { + if (!credDefId) return; + + const getRawCredDefs = await getFromLocalStorage(storageKeys.SCHEMA_CRED_DEFS); + const parsedRawCredDefs = JSON.parse(getRawCredDefs); + + const selectedCredDef = parsedRawCredDefs.find( + (credDef: CredDefData) => credDef.credentialDefinitionId === credDefId + ); + + if (selectedCredDef) { + setSelectedCredDefs((prevSelected) => { + if (checked) { const isAlreadySelected = prevSelected.some( (credDef) => credDef.credentialDefinitionId === selectedCredDef.credentialDefinitionId ); - + if (!isAlreadySelected) { const newSelected = [...prevSelected, selectedCredDef]; - setToLocalStorage(storageKeys.CRED_DEF_DATA, JSON.stringify(newSelected)); - return newSelected; } - return prevSelected; - }); - } - } - else if (!checked) { - setSelectedCredDefs((prevSelected) => { - const newSelected = prevSelected.filter( - (credDef) => credDef.credentialDefinitionId !== credDefId - ); - - setToLocalStorage(storageKeys.CRED_DEF_DATA, JSON.stringify(newSelected)); - - return newSelected; + } else { + const newSelected = prevSelected.filter( + (credDef) => credDef.credentialDefinitionId !== selectedCredDef.credentialDefinitionId + ); + setToLocalStorage(storageKeys.CRED_DEF_DATA, JSON.stringify(newSelected)); + return newSelected; + } + + return prevSelected; }); } }; + return (
diff --git a/src/components/Verification/ProofRequestPopup.tsx b/src/components/Verification/ProofRequestPopup.tsx index edcc9242b..ee1d207b4 100644 --- a/src/components/Verification/ProofRequestPopup.tsx +++ b/src/components/Verification/ProofRequestPopup.tsx @@ -87,21 +87,7 @@ const ProofRequest = (props: IProofRrquestDetails) => { {' '} Verification Details

- {props.verifyLoading ? ( -
- -
- ) : ( -
-
- - - -
-
- )} -
- {succesMsg && ( + {succesMsg && (
{
)} + {props.verifyLoading ? ( +
+ +
+ ) : ( +
+
+ + + +
+
+ )} +