From d4eaf7c75a864acb6ec93b9833eb88ddef8cd01a Mon Sep 17 00:00:00 2001 From: Brion Date: Sun, 9 Aug 2026 02:13:56 +0530 Subject: [PATCH 1/3] Create a modular `@thunder/configure-verifiable-credentials` package - Implement VerifiableCredentialsListPage for listing verifiable credentials. - Create VerifiablePresentationCreatePage for creating new verifiable presentations with a multi-step wizard. - Add VerifiablePresentationEditPage for editing existing verifiable presentations. - Introduce VerifiablePresentationsListPage for displaying a list of verifiable presentations. - Add deriveHandle utility function for generating handles from names. - Set up TypeScript configuration files for the new package. - Integrate Vitest for testing with coverage reporting. - Update pnpm lockfile to reflect changes in package structure and dependencies. --- frontend/apps/console/package.json | 2 +- frontend/apps/console/src/App.tsx | 24 +++---- .../apps/console/src/configs/RouteConfig.ts | 12 +--- .../PresentationDefinitionSelect.tsx | 2 +- .../.editorconfig | 0 .../.gitignore | 0 .../.prettierignore | 0 .../eslint.config.js | 0 .../package.json | 33 ++++++++-- .../prettier.config.js | 0 .../rolldown.config.js | 0 .../src}/api/useCreateCredentialOffer.ts | 0 .../src}/api/useCreateVerifiableCredential.ts | 2 +- .../api/useCreateVerifiablePresentation.ts | 6 +- .../src}/api/useDeleteVerifiableCredential.ts | 0 .../api/useDeleteVerifiablePresentation.ts | 2 +- .../src}/api/useGetTrustAnchors.ts | 4 +- .../src}/api/useGetVerifiableCredential.ts | 0 .../src}/api/useGetVerifiableCredentials.ts | 0 .../src}/api/useGetVerifiablePresentation.ts | 4 +- .../src/api/useGetVerifiablePresentations.ts | 0 .../src}/api/useInitiateVerification.ts | 2 +- .../src}/api/useUpdateVerifiableCredential.ts | 2 +- .../api/useUpdateVerifiablePresentation.ts | 6 +- .../src}/api/useVerificationStatus.ts | 2 +- .../components/CredentialClaimsEditor.tsx} | 2 +- .../src}/components/CredentialOfferDialog.tsx | 0 .../components/PresentationClaimsEditor.tsx} | 2 +- .../VerifiableCredentialDeleteDialog.tsx | 0 .../components/VerifiableCredentialForm.tsx | 6 +- .../components/VerifiableCredentialsList.tsx | 7 +- .../VerifiablePresentationDeleteDialog.tsx | 0 .../components/VerifiablePresentationForm.tsx | 8 +-- .../VerifiablePresentationsList.tsx | 11 ++-- .../src}/components/VerificationDialog.tsx | 0 .../ConfigureName.tsx | 2 +- .../__tests__/ConfigureName.test.tsx | 0 .../ConfigureName.tsx | 2 +- .../__tests__/ConfigureName.test.tsx | 0 .../src}/constants/vc-query-keys.ts | 0 .../src/constants/vp-query-keys.ts | 0 .../hooks/useVerifiableCredentialRoutes.ts | 64 +++++++++++++++++++ .../src/index.ts | 56 ++++++++++++++++ .../src/models/credential-claims.ts} | 0 .../src/models/credential-requests.ts} | 0 .../src/models/presentation-claims.ts} | 4 +- .../src/models/presentation-requests.ts} | 0 .../src}/models/vc.ts | 0 .../src/models/vp.ts | 0 .../pages/VerifiableCredentialCreatePage.tsx | 12 ++-- .../pages/VerifiableCredentialEditPage.tsx | 13 ++-- .../pages/VerifiableCredentialsListPage.tsx | 5 +- .../VerifiablePresentationCreatePage.tsx | 11 ++-- .../pages/VerifiablePresentationEditPage.tsx | 13 ++-- .../pages/VerifiablePresentationsListPage.tsx | 5 +- .../src/utils}/deriveHandle.ts | 0 .../tsconfig.eslint.json | 0 .../tsconfig.json | 0 .../tsconfig.lib.json | 0 .../tsconfig.spec.json | 0 .../vitest.config.ts | 1 + .../src/index.ts | 18 ------ frontend/packages/test-utils/src/setup.ts | 2 + pnpm-lock.yaml | 36 ++++++++++- 64 files changed, 269 insertions(+), 114 deletions(-) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/.editorconfig (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/.gitignore (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/.prettierignore (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/eslint.config.js (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/package.json (66%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/prettier.config.js (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/rolldown.config.js (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useCreateCredentialOffer.ts (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useCreateVerifiableCredential.ts (98%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useCreateVerifiablePresentation.ts (89%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useDeleteVerifiableCredential.ts (100%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useDeleteVerifiablePresentation.ts (93%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useGetTrustAnchors.ts (84%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useGetVerifiableCredential.ts (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useGetVerifiableCredentials.ts (100%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useGetVerifiablePresentation.ts (84%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/src/api/useGetVerifiablePresentations.ts (100%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useInitiateVerification.ts (92%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/api/useUpdateVerifiableCredential.ts (98%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useUpdateVerifiablePresentation.ts (90%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/api/useVerificationStatus.ts (93%) rename frontend/{apps/console/src/features/verifiable-credentials/components/ClaimsEditor.tsx => packages/configure-verifiable-credentials/src/components/CredentialClaimsEditor.tsx} (97%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/CredentialOfferDialog.tsx (100%) rename frontend/{apps/console/src/features/verifiable-presentations/components/ClaimsEditor.tsx => packages/configure-verifiable-credentials/src/components/PresentationClaimsEditor.tsx} (99%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/VerifiableCredentialDeleteDialog.tsx (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/VerifiableCredentialForm.tsx (99%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/VerifiableCredentialsList.tsx (96%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/VerifiablePresentationDeleteDialog.tsx (100%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/VerifiablePresentationForm.tsx (99%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/VerifiablePresentationsList.tsx (94%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/VerificationDialog.tsx (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/create-verifiable-credential/ConfigureName.tsx (98%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/components/create-verifiable-credential/__tests__/ConfigureName.test.tsx (100%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/create-verifiable-presentation/ConfigureName.tsx (98%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/components/create-verifiable-presentation/__tests__/ConfigureName.test.tsx (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/constants/vc-query-keys.ts (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/src/constants/vp-query-keys.ts (100%) create mode 100644 frontend/packages/configure-verifiable-credentials/src/hooks/useVerifiableCredentialRoutes.ts create mode 100644 frontend/packages/configure-verifiable-credentials/src/index.ts rename frontend/{apps/console/src/features/verifiable-credentials/models/claims.ts => packages/configure-verifiable-credentials/src/models/credential-claims.ts} (100%) rename frontend/{apps/console/src/features/verifiable-credentials/models/requests.ts => packages/configure-verifiable-credentials/src/models/credential-requests.ts} (100%) rename frontend/{apps/console/src/features/verifiable-presentations/models/claims.ts => packages/configure-verifiable-credentials/src/models/presentation-claims.ts} (94%) rename frontend/{apps/console/src/features/verifiable-presentations/models/requests.ts => packages/configure-verifiable-credentials/src/models/presentation-requests.ts} (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/models/vc.ts (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/src/models/vp.ts (100%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/pages/VerifiableCredentialCreatePage.tsx (96%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/pages/VerifiableCredentialEditPage.tsx (96%) rename frontend/{apps/console/src/features/verifiable-credentials => packages/configure-verifiable-credentials/src}/pages/VerifiableCredentialsListPage.tsx (89%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/pages/VerifiablePresentationCreatePage.tsx (96%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/pages/VerifiablePresentationEditPage.tsx (96%) rename frontend/{apps/console/src/features/verifiable-presentations => packages/configure-verifiable-credentials/src}/pages/VerifiablePresentationsListPage.tsx (89%) rename frontend/{apps/console/src/lib => packages/configure-verifiable-credentials/src/utils}/deriveHandle.ts (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/tsconfig.eslint.json (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/tsconfig.json (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/tsconfig.lib.json (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/tsconfig.spec.json (100%) rename frontend/packages/{configure-verifiable-presentations => configure-verifiable-credentials}/vitest.config.ts (93%) delete mode 100644 frontend/packages/configure-verifiable-presentations/src/index.ts diff --git a/frontend/apps/console/package.json b/frontend/apps/console/package.json index aafd312a96..e0917cda9b 100644 --- a/frontend/apps/console/package.json +++ b/frontend/apps/console/package.json @@ -69,7 +69,7 @@ "@thunderid/configure-organization-units": "workspace:^", "@thunderid/configure-translations": "workspace:^", "@thunderid/configure-resource-servers": "workspace:^", - "@thunderid/configure-verifiable-presentations": "workspace:^", + "@thunderid/configure-verifiable-credentials": "workspace:^", "@thunderid/utils": "workspace:^", "@wso2/oxygen-ui": "catalog:", "@wso2/oxygen-ui-icons-react": "catalog:", diff --git a/frontend/apps/console/src/App.tsx b/frontend/apps/console/src/App.tsx index 4d1f72660e..e3e17a0717 100644 --- a/frontend/apps/console/src/App.tsx +++ b/frontend/apps/console/src/App.tsx @@ -116,23 +116,23 @@ const SettingsPage = lazy(() => import('./features/settings/pages/SettingsPage') const TrustedIssuerDetailPage = lazy(() => import('@thunderid/configure-connections').then((m) => ({default: m.TrustedIssuerDetailPage})), ); -const VerifiablePresentationsListPage = lazy( - () => import('./features/verifiable-presentations/pages/VerifiablePresentationsListPage'), +const VerifiablePresentationsListPage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiablePresentationsListPage})), ); -const VerifiablePresentationCreatePage = lazy( - () => import('./features/verifiable-presentations/pages/VerifiablePresentationCreatePage'), +const VerifiablePresentationCreatePage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiablePresentationCreatePage})), ); -const VerifiablePresentationEditPage = lazy( - () => import('./features/verifiable-presentations/pages/VerifiablePresentationEditPage'), +const VerifiablePresentationEditPage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiablePresentationEditPage})), ); -const VerifiableCredentialsListPage = lazy( - () => import('./features/verifiable-credentials/pages/VerifiableCredentialsListPage'), +const VerifiableCredentialsListPage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiableCredentialsListPage})), ); -const VerifiableCredentialCreatePage = lazy( - () => import('./features/verifiable-credentials/pages/VerifiableCredentialCreatePage'), +const VerifiableCredentialCreatePage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiableCredentialCreatePage})), ); -const VerifiableCredentialEditPage = lazy( - () => import('./features/verifiable-credentials/pages/VerifiableCredentialEditPage'), +const VerifiableCredentialEditPage = lazy(() => + import('@thunderid/configure-verifiable-credentials').then((m) => ({default: m.VerifiableCredentialEditPage})), ); const CreateUserTypePage = lazy(() => import('@thunderid/configure-user-types').then((m) => ({default: m.CreateUserTypePage})), diff --git a/frontend/apps/console/src/configs/RouteConfig.ts b/frontend/apps/console/src/configs/RouteConfig.ts index d9224ea364..9b037c35b7 100644 --- a/frontend/apps/console/src/configs/RouteConfig.ts +++ b/frontend/apps/console/src/configs/RouteConfig.ts @@ -8,6 +8,7 @@ import type {ResourceServerRoutePaths} from '@thunderid/configure-resource-serve import type {TranslationRoutePaths} from '@thunderid/configure-translations'; import type {UserTypeRoutePaths} from '@thunderid/configure-user-types'; import type {UserRoutePaths} from '@thunderid/configure-users'; +import type {VerifiableCredentialRoutePaths} from '@thunderid/configure-verifiable-credentials'; /** * Route paths for the domains Console implements itself, rather than through a @@ -43,16 +44,6 @@ export interface ConsoleRoutePaths { detail: (id: string) => string; create: () => string; }; - verifiableCredentials: { - list: () => string; - detail: (id: string) => string; - create: () => string; - }; - verifiablePresentations: { - list: () => string; - detail: (id: string) => string; - create: () => string; - }; flows: { list: () => string; create: () => string; @@ -112,6 +103,7 @@ export type RouteConfig = OrganizationUnitRoutePaths & ConnectionRoutePaths & ResourceServerRoutePaths & TranslationRoutePaths & + VerifiableCredentialRoutePaths & ConsoleRoutePaths; /** diff --git a/frontend/apps/console/src/features/flows/components/resource-property-panel/PresentationDefinitionSelect.tsx b/frontend/apps/console/src/features/flows/components/resource-property-panel/PresentationDefinitionSelect.tsx index d43b8cac75..592de93f22 100644 --- a/frontend/apps/console/src/features/flows/components/resource-property-panel/PresentationDefinitionSelect.tsx +++ b/frontend/apps/console/src/features/flows/components/resource-property-panel/PresentationDefinitionSelect.tsx @@ -1,7 +1,7 @@ // Copyright 2026 The ThunderID Authors // SPDX-License-Identifier: Apache-2.0 -import {useGetVerifiablePresentations} from '@thunderid/configure-verifiable-presentations'; +import {useGetVerifiablePresentations} from '@thunderid/configure-verifiable-credentials'; import {FormControl, FormLabel, MenuItem, TextField} from '@wso2/oxygen-ui'; import type {ChangeEvent, ReactElement} from 'react'; import {useTranslation} from 'react-i18next'; diff --git a/frontend/packages/configure-verifiable-presentations/.editorconfig b/frontend/packages/configure-verifiable-credentials/.editorconfig similarity index 100% rename from frontend/packages/configure-verifiable-presentations/.editorconfig rename to frontend/packages/configure-verifiable-credentials/.editorconfig diff --git a/frontend/packages/configure-verifiable-presentations/.gitignore b/frontend/packages/configure-verifiable-credentials/.gitignore similarity index 100% rename from frontend/packages/configure-verifiable-presentations/.gitignore rename to frontend/packages/configure-verifiable-credentials/.gitignore diff --git a/frontend/packages/configure-verifiable-presentations/.prettierignore b/frontend/packages/configure-verifiable-credentials/.prettierignore similarity index 100% rename from frontend/packages/configure-verifiable-presentations/.prettierignore rename to frontend/packages/configure-verifiable-credentials/.prettierignore diff --git a/frontend/packages/configure-verifiable-presentations/eslint.config.js b/frontend/packages/configure-verifiable-credentials/eslint.config.js similarity index 100% rename from frontend/packages/configure-verifiable-presentations/eslint.config.js rename to frontend/packages/configure-verifiable-credentials/eslint.config.js diff --git a/frontend/packages/configure-verifiable-presentations/package.json b/frontend/packages/configure-verifiable-credentials/package.json similarity index 66% rename from frontend/packages/configure-verifiable-presentations/package.json rename to frontend/packages/configure-verifiable-credentials/package.json index 2e881c1c64..c27fa95888 100644 --- a/frontend/packages/configure-verifiable-presentations/package.json +++ b/frontend/packages/configure-verifiable-credentials/package.json @@ -1,15 +1,15 @@ { - "name": "@thunderid/configure-verifiable-presentations", + "name": "@thunderid/configure-verifiable-credentials", "version": "0.0.0", - "description": "verifiable-presentations feature for ⚡️ ThunderID applications", + "description": "verifiable-credentials feature for ⚡️ ThunderID applications", "keywords": [ "thunderid", "configure", - "verifiable-presentations", + "verifiable-credentials", "react", "feature" ], - "homepage": "https://github.com/thunder-id/thunderid/tree/main/frontend/packages/configure-verifiable-presentations#readme", + "homepage": "https://github.com/thunder-id/thunderid/tree/main/frontend/packages/configure-verifiable-credentials#readme", "bugs": { "url": "https://github.com/thunder-id/thunderid/issues" }, @@ -35,7 +35,7 @@ "repository": { "type": "git", "url": "https://github.com/thunder-id/thunderid", - "directory": "frontend/packages/configure-verifiable-presentations" + "directory": "frontend/packages/configure-verifiable-credentials" }, "scripts": { "build": "pnpm clean:dist && rolldown -c rolldown.config.js && tsc -p tsconfig.lib.json --emitDeclarationOnly --outDir dist", @@ -55,19 +55,29 @@ "@testing-library/jest-dom": "catalog:", "@testing-library/react": "catalog:", "@testing-library/user-event": "catalog:", + "@thunderid/components": "workspace:^", + "@thunderid/configure-organization-units": "workspace:^", "@thunderid/contexts": "workspace:^", + "@thunderid/design": "workspace:^", "@thunderid/eslint-plugin": "workspace:^", + "@thunderid/hooks": "workspace:^", + "@thunderid/logger": "workspace:^", "@thunderid/prettier-config": "workspace:^", "@thunderid/react": "catalog:", "@thunderid/test-utils": "workspace:^", + "@thunderid/utils": "workspace:^", "@types/node": "catalog:", "@types/react": "catalog:", "@vitest/browser-playwright": "catalog:", "@vitest/coverage-istanbul": "catalog:", + "@wso2/oxygen-ui": "catalog:", + "@wso2/oxygen-ui-icons-react": "catalog:", "eslint": "catalog:", "prettier": "catalog:", "react": "catalog:", "react-dom": "catalog:", + "react-i18next": "catalog:", + "react-router": "catalog:", "rimraf": "catalog:", "rolldown": "catalog:", "tslib": "catalog:", @@ -80,8 +90,19 @@ "dependencies": {}, "peerDependencies": { "@tanstack/react-query": "catalog:", + "@thunderid/components": "workspace:^", + "@thunderid/configure-organization-units": "workspace:^", "@thunderid/contexts": "workspace:^", + "@thunderid/design": "workspace:^", + "@thunderid/hooks": "workspace:^", + "@thunderid/logger": "workspace:^", "@thunderid/react": "catalog:", - "react": "catalog:" + "@thunderid/utils": "workspace:^", + "@wso2/oxygen-ui": "catalog:", + "@wso2/oxygen-ui-icons-react": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "react-i18next": "catalog:", + "react-router": "catalog:" } } diff --git a/frontend/packages/configure-verifiable-presentations/prettier.config.js b/frontend/packages/configure-verifiable-credentials/prettier.config.js similarity index 100% rename from frontend/packages/configure-verifiable-presentations/prettier.config.js rename to frontend/packages/configure-verifiable-credentials/prettier.config.js diff --git a/frontend/packages/configure-verifiable-presentations/rolldown.config.js b/frontend/packages/configure-verifiable-credentials/rolldown.config.js similarity index 100% rename from frontend/packages/configure-verifiable-presentations/rolldown.config.js rename to frontend/packages/configure-verifiable-credentials/rolldown.config.js diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useCreateCredentialOffer.ts b/frontend/packages/configure-verifiable-credentials/src/api/useCreateCredentialOffer.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/api/useCreateCredentialOffer.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useCreateCredentialOffer.ts diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useCreateVerifiableCredential.ts b/frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiableCredential.ts similarity index 98% rename from frontend/apps/console/src/features/verifiable-credentials/api/useCreateVerifiableCredential.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiableCredential.ts index 106fef5e40..148b6046ae 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/api/useCreateVerifiableCredential.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiableCredential.ts @@ -6,7 +6,7 @@ import {useConfig, useToast} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; import {useTranslation} from 'react-i18next'; import VerifiableCredentialQueryKeys from '../constants/vc-query-keys'; -import type {CreateVerifiableCredentialRequest} from '../models/requests'; +import type {CreateVerifiableCredentialRequest} from '../models/credential-requests'; import type {VerifiableCredential} from '../models/vc'; /** diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useCreateVerifiablePresentation.ts b/frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiablePresentation.ts similarity index 89% rename from frontend/apps/console/src/features/verifiable-presentations/api/useCreateVerifiablePresentation.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiablePresentation.ts index 5f0e463dcd..28ec358335 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useCreateVerifiablePresentation.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useCreateVerifiablePresentation.ts @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 import {useMutation, useQueryClient, type UseMutationResult} from '@tanstack/react-query'; -import {VerifiablePresentationQueryKeys} from '@thunderid/configure-verifiable-presentations'; -import type {VerifiablePresentation} from '@thunderid/configure-verifiable-presentations'; import {useConfig, useToast} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; import {useTranslation} from 'react-i18next'; -import type {CreateVerifiablePresentationRequest} from '../models/requests'; +import VerifiablePresentationQueryKeys from '../constants/vp-query-keys'; +import type {CreateVerifiablePresentationRequest} from '../models/presentation-requests'; +import type {VerifiablePresentation} from '../models/vp'; /** * Creates a new OpenID4VP presentation definition. diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useDeleteVerifiableCredential.ts b/frontend/packages/configure-verifiable-credentials/src/api/useDeleteVerifiableCredential.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/api/useDeleteVerifiableCredential.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useDeleteVerifiableCredential.ts diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useDeleteVerifiablePresentation.ts b/frontend/packages/configure-verifiable-credentials/src/api/useDeleteVerifiablePresentation.ts similarity index 93% rename from frontend/apps/console/src/features/verifiable-presentations/api/useDeleteVerifiablePresentation.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useDeleteVerifiablePresentation.ts index c05bcb574f..8c3e52245a 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useDeleteVerifiablePresentation.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useDeleteVerifiablePresentation.ts @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import {useMutation, useQueryClient, type UseMutationResult} from '@tanstack/react-query'; -import {VerifiablePresentationQueryKeys} from '@thunderid/configure-verifiable-presentations'; import {useConfig, useToast} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; import {useTranslation} from 'react-i18next'; +import VerifiablePresentationQueryKeys from '../constants/vp-query-keys'; /** * Deletes an OpenID4VP presentation definition by id. diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useGetTrustAnchors.ts b/frontend/packages/configure-verifiable-credentials/src/api/useGetTrustAnchors.ts similarity index 84% rename from frontend/apps/console/src/features/verifiable-presentations/api/useGetTrustAnchors.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useGetTrustAnchors.ts index 7103b16e13..8e2efa28f8 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useGetTrustAnchors.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useGetTrustAnchors.ts @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import {useQuery, type UseQueryResult} from '@tanstack/react-query'; -import {VerifiablePresentationQueryKeys} from '@thunderid/configure-verifiable-presentations'; -import type {TrustAnchor} from '@thunderid/configure-verifiable-presentations'; import {useConfig} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; +import VerifiablePresentationQueryKeys from '../constants/vp-query-keys'; +import type {TrustAnchor} from '../models/vp'; /** * Fetches the trust anchors (issuer trust) registered with the server. diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useGetVerifiableCredential.ts b/frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiableCredential.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/api/useGetVerifiableCredential.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiableCredential.ts diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useGetVerifiableCredentials.ts b/frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiableCredentials.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/api/useGetVerifiableCredentials.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiableCredentials.ts diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useGetVerifiablePresentation.ts b/frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiablePresentation.ts similarity index 84% rename from frontend/apps/console/src/features/verifiable-presentations/api/useGetVerifiablePresentation.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiablePresentation.ts index bd5fd3fe08..393b578e7f 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useGetVerifiablePresentation.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiablePresentation.ts @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import {useQuery, type UseQueryResult} from '@tanstack/react-query'; -import {VerifiablePresentationQueryKeys} from '@thunderid/configure-verifiable-presentations'; -import type {VerifiablePresentation} from '@thunderid/configure-verifiable-presentations'; import {useConfig} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; +import VerifiablePresentationQueryKeys from '../constants/vp-query-keys'; +import type {VerifiablePresentation} from '../models/vp'; /** * Fetches a single OpenID4VP presentation definition by id. diff --git a/frontend/packages/configure-verifiable-presentations/src/api/useGetVerifiablePresentations.ts b/frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiablePresentations.ts similarity index 100% rename from frontend/packages/configure-verifiable-presentations/src/api/useGetVerifiablePresentations.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useGetVerifiablePresentations.ts diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useInitiateVerification.ts b/frontend/packages/configure-verifiable-credentials/src/api/useInitiateVerification.ts similarity index 92% rename from frontend/apps/console/src/features/verifiable-presentations/api/useInitiateVerification.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useInitiateVerification.ts index f7656268e5..ae44ed95ae 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useInitiateVerification.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useInitiateVerification.ts @@ -2,9 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 import {useMutation, type UseMutationResult} from '@tanstack/react-query'; -import type {InitiateVerificationResponse} from '@thunderid/configure-verifiable-presentations'; import {useConfig} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; +import type {InitiateVerificationResponse} from '../models/vp'; /** * Initiates an OpenID4VP verification transaction for a presentation definition diff --git a/frontend/apps/console/src/features/verifiable-credentials/api/useUpdateVerifiableCredential.ts b/frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiableCredential.ts similarity index 98% rename from frontend/apps/console/src/features/verifiable-credentials/api/useUpdateVerifiableCredential.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiableCredential.ts index 477881f11a..fe5d241cf8 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/api/useUpdateVerifiableCredential.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiableCredential.ts @@ -6,7 +6,7 @@ import {useConfig, useToast} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; import {useTranslation} from 'react-i18next'; import VerifiableCredentialQueryKeys from '../constants/vc-query-keys'; -import type {UpdateVerifiableCredentialRequest} from '../models/requests'; +import type {UpdateVerifiableCredentialRequest} from '../models/credential-requests'; import type {VerifiableCredential} from '../models/vc'; interface UpdateArgs { diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useUpdateVerifiablePresentation.ts b/frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiablePresentation.ts similarity index 90% rename from frontend/apps/console/src/features/verifiable-presentations/api/useUpdateVerifiablePresentation.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiablePresentation.ts index 979ab7009a..38b713d783 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useUpdateVerifiablePresentation.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useUpdateVerifiablePresentation.ts @@ -2,12 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 import {useMutation, useQueryClient, type UseMutationResult} from '@tanstack/react-query'; -import {VerifiablePresentationQueryKeys} from '@thunderid/configure-verifiable-presentations'; -import type {VerifiablePresentation} from '@thunderid/configure-verifiable-presentations'; import {useConfig, useToast} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; import {useTranslation} from 'react-i18next'; -import type {UpdateVerifiablePresentationRequest} from '../models/requests'; +import VerifiablePresentationQueryKeys from '../constants/vp-query-keys'; +import type {UpdateVerifiablePresentationRequest} from '../models/presentation-requests'; +import type {VerifiablePresentation} from '../models/vp'; interface UpdateArgs { id: string; diff --git a/frontend/apps/console/src/features/verifiable-presentations/api/useVerificationStatus.ts b/frontend/packages/configure-verifiable-credentials/src/api/useVerificationStatus.ts similarity index 93% rename from frontend/apps/console/src/features/verifiable-presentations/api/useVerificationStatus.ts rename to frontend/packages/configure-verifiable-credentials/src/api/useVerificationStatus.ts index c544fcbcb8..ee5444a9d0 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/api/useVerificationStatus.ts +++ b/frontend/packages/configure-verifiable-credentials/src/api/useVerificationStatus.ts @@ -2,9 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 import {useQuery, type UseQueryResult} from '@tanstack/react-query'; -import type {VerificationStatusResponse} from '@thunderid/configure-verifiable-presentations'; import {useConfig} from '@thunderid/contexts'; import {useThunderID} from '@thunderid/react'; +import type {VerificationStatusResponse} from '../models/vp'; const TERMINAL_STATUSES: ReadonlySet = new Set(['COMPLETED', 'FAILED', 'EXPIRED']); diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/ClaimsEditor.tsx b/frontend/packages/configure-verifiable-credentials/src/components/CredentialClaimsEditor.tsx similarity index 97% rename from frontend/apps/console/src/features/verifiable-credentials/components/ClaimsEditor.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/CredentialClaimsEditor.tsx index deba59c1ae..138298c719 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/components/ClaimsEditor.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/CredentialClaimsEditor.tsx @@ -17,7 +17,7 @@ import { import {Plus, Trash2} from '@wso2/oxygen-ui-icons-react'; import {type JSX} from 'react'; import {useTranslation} from 'react-i18next'; -import {emptyClaimRow, type ClaimRow} from '../models/claims'; +import {emptyClaimRow, type ClaimRow} from '../models/credential-claims'; export interface ClaimsEditorProps { claims: ClaimRow[]; diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/CredentialOfferDialog.tsx b/frontend/packages/configure-verifiable-credentials/src/components/CredentialOfferDialog.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/components/CredentialOfferDialog.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/CredentialOfferDialog.tsx diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/ClaimsEditor.tsx b/frontend/packages/configure-verifiable-credentials/src/components/PresentationClaimsEditor.tsx similarity index 99% rename from frontend/apps/console/src/features/verifiable-presentations/components/ClaimsEditor.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/PresentationClaimsEditor.tsx index 391d07b08c..c64c919b25 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/components/ClaimsEditor.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/PresentationClaimsEditor.tsx @@ -20,7 +20,7 @@ import { import {Plus, Trash2} from '@wso2/oxygen-ui-icons-react'; import {useState, type JSX, type KeyboardEvent} from 'react'; import {useTranslation} from 'react-i18next'; -import {emptyClaimRow, type ClaimRequirement, type ClaimRow} from '../models/claims'; +import {emptyClaimRow, type ClaimRequirement, type ClaimRow} from '../models/presentation-claims'; export interface ClaimsEditorProps { claims: ClaimRow[]; diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialDeleteDialog.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialDeleteDialog.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialDeleteDialog.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialDeleteDialog.tsx diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialForm.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialForm.tsx similarity index 99% rename from frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialForm.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialForm.tsx index f3dc1912fa..b78f4288c3 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialForm.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialForm.tsx @@ -33,9 +33,9 @@ import { type SyntheticEvent, } from 'react'; import {useTranslation} from 'react-i18next'; -import ClaimsEditor from './ClaimsEditor'; -import {claimRowsToRequest, credentialToClaimRows, type ClaimRow} from '../models/claims'; -import type {CreateVerifiableCredentialRequest} from '../models/requests'; +import ClaimsEditor from './CredentialClaimsEditor'; +import {claimRowsToRequest, credentialToClaimRows, type ClaimRow} from '../models/credential-claims'; +import type {CreateVerifiableCredentialRequest} from '../models/credential-requests'; import type {VerifiableCredential} from '../models/vc'; export interface VerifiableCredentialFormProps { diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialsList.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialsList.tsx similarity index 96% rename from frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialsList.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialsList.tsx index 3b0263c4fc..3def6965ff 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/components/VerifiableCredentialsList.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/VerifiableCredentialsList.tsx @@ -11,8 +11,8 @@ import {useTranslation} from 'react-i18next'; import {useNavigate} from 'react-router'; import CredentialOfferDialog from './CredentialOfferDialog'; import VerifiableCredentialDeleteDialog from './VerifiableCredentialDeleteDialog'; -import RouteConfig from '../../../configs/RouteConfig'; import useGetVerifiableCredentials from '../api/useGetVerifiableCredentials'; +import useVerifiableCredentialRoutes from '../hooks/useVerifiableCredentialRoutes'; import type {VerifiableCredentialSummary} from '../models/vc'; /** @@ -23,6 +23,7 @@ export default function VerifiableCredentialsList(): JSX.Element { const {t} = useTranslation(); const logger = useLogger('VerifiableCredentialsList'); const dataGridLocaleText = useDataGridLocaleText(); + const routes = useVerifiableCredentialRoutes(); const {data, isLoading, error, refetch} = useGetVerifiableCredentials(); @@ -42,12 +43,12 @@ export default function VerifiableCredentialsList(): JSX.Element { const handleEditClick = useCallback( (id: string): void => { (async (): Promise => { - await navigate(RouteConfig.verifiableCredentials.detail(id)); + await navigate(routes.verifiableCredentials.detail(id)); })().catch((_error: unknown) => { logger.error('Failed to navigate to credential configuration', {error: _error, id}); }); }, - [navigate, logger], + [navigate, logger, routes], ); const handleDeleteClick = useCallback((id: string): void => { diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationDeleteDialog.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationDeleteDialog.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationDeleteDialog.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationDeleteDialog.tsx diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationForm.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationForm.tsx similarity index 99% rename from frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationForm.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationForm.tsx index 926bc7f3c4..a34f922853 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationForm.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationForm.tsx @@ -3,7 +3,6 @@ import {QueryErrorNotice, SettingsCard, UnsavedChangesBar} from '@thunderid/components'; import {OrganizationUnitTreePicker, useHasMultipleOUs} from '@thunderid/configure-organization-units'; -import type {TrustAnchor, VerifiablePresentation} from '@thunderid/configure-verifiable-presentations'; import { Autocomplete, Box, @@ -39,10 +38,11 @@ import { type SyntheticEvent, } from 'react'; import {useTranslation} from 'react-i18next'; -import ClaimsEditor from './ClaimsEditor'; +import ClaimsEditor from './PresentationClaimsEditor'; import useGetTrustAnchors from '../api/useGetTrustAnchors'; -import {claimRowsToRequest, definitionToClaimRows, type ClaimRow} from '../models/claims'; -import type {CreateVerifiablePresentationRequest} from '../models/requests'; +import {claimRowsToRequest, definitionToClaimRows, type ClaimRow} from '../models/presentation-claims'; +import type {CreateVerifiablePresentationRequest} from '../models/presentation-requests'; +import type {TrustAnchor, VerifiablePresentation} from '../models/vp'; export interface VerifiablePresentationFormProps { initial?: VerifiablePresentation; diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationsList.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationsList.tsx similarity index 94% rename from frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationsList.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationsList.tsx index 281020d37c..7938baa9bb 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/components/VerifiablePresentationsList.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/VerifiablePresentationsList.tsx @@ -2,8 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 import {QueryErrorNotice} from '@thunderid/components'; -import {useGetVerifiablePresentations} from '@thunderid/configure-verifiable-presentations'; -import type {VerifiablePresentationSummary} from '@thunderid/configure-verifiable-presentations'; import {useDataGridLocaleText} from '@thunderid/hooks'; import {useLogger} from '@thunderid/logger/react'; import {IconButton, Typography, Tooltip, DataGrid, ListingTable} from '@wso2/oxygen-ui'; @@ -13,7 +11,9 @@ import {useTranslation} from 'react-i18next'; import {useNavigate} from 'react-router'; import VerifiablePresentationDeleteDialog from './VerifiablePresentationDeleteDialog'; import VerificationDialog from './VerificationDialog'; -import RouteConfig from '../../../configs/RouteConfig'; +import useGetVerifiablePresentations from '../api/useGetVerifiablePresentations'; +import useVerifiableCredentialRoutes from '../hooks/useVerifiableCredentialRoutes'; +import type {VerifiablePresentationSummary} from '../models/vp'; /** * DataGrid listing of OpenID4VP presentation definitions. @@ -23,6 +23,7 @@ export default function VerifiablePresentationsList(): JSX.Element { const {t} = useTranslation(); const logger = useLogger('VerifiablePresentationsList'); const dataGridLocaleText = useDataGridLocaleText(); + const routes = useVerifiableCredentialRoutes(); // Resolves an error through the `verifiable-presentations` catalog. `t` defaults to the `common` // namespace, so this forwards explicit `ns:` prefixes unchanged and prefixes bare keys, per @@ -42,12 +43,12 @@ export default function VerifiablePresentationsList(): JSX.Element { const handleEditClick = useCallback( (id: string): void => { (async (): Promise => { - await navigate(RouteConfig.verifiablePresentations.detail(id)); + await navigate(routes.verifiablePresentations.detail(id)); })().catch((_error: unknown) => { logger.error('Failed to navigate to presentation definition', {error: _error, id}); }); }, - [navigate, logger], + [navigate, logger, routes], ); const handleDeleteClick = useCallback((id: string): void => { diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/VerificationDialog.tsx b/frontend/packages/configure-verifiable-credentials/src/components/VerificationDialog.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-presentations/components/VerificationDialog.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/VerificationDialog.tsx diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/create-verifiable-credential/ConfigureName.tsx b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-credential/ConfigureName.tsx similarity index 98% rename from frontend/apps/console/src/features/verifiable-credentials/components/create-verifiable-credential/ConfigureName.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-credential/ConfigureName.tsx index 657b00f194..a52722b8dc 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/components/create-verifiable-credential/ConfigureName.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-credential/ConfigureName.tsx @@ -7,7 +7,7 @@ import {Stack, TextField, FormControl, FormLabel, Typography} from '@wso2/oxygen import type {ChangeEvent, JSX} from 'react'; import {useEffect} from 'react'; import {useTranslation} from 'react-i18next'; -import deriveHandle from '@/lib/deriveHandle'; +import deriveHandle from '../../utils/deriveHandle'; export interface ConfigureNameProps { name: string; diff --git a/frontend/apps/console/src/features/verifiable-credentials/components/create-verifiable-credential/__tests__/ConfigureName.test.tsx b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-credential/__tests__/ConfigureName.test.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/components/create-verifiable-credential/__tests__/ConfigureName.test.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-credential/__tests__/ConfigureName.test.tsx diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/create-verifiable-presentation/ConfigureName.tsx b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-presentation/ConfigureName.tsx similarity index 98% rename from frontend/apps/console/src/features/verifiable-presentations/components/create-verifiable-presentation/ConfigureName.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-presentation/ConfigureName.tsx index 95ca4270fd..272813174d 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/components/create-verifiable-presentation/ConfigureName.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-presentation/ConfigureName.tsx @@ -7,7 +7,7 @@ import {Stack, TextField, FormControl, FormLabel, Typography} from '@wso2/oxygen import type {ChangeEvent, JSX} from 'react'; import {useEffect} from 'react'; import {useTranslation} from 'react-i18next'; -import deriveHandle from '@/lib/deriveHandle'; +import deriveHandle from '../../utils/deriveHandle'; export interface ConfigureNameProps { name: string; diff --git a/frontend/apps/console/src/features/verifiable-presentations/components/create-verifiable-presentation/__tests__/ConfigureName.test.tsx b/frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-presentation/__tests__/ConfigureName.test.tsx similarity index 100% rename from frontend/apps/console/src/features/verifiable-presentations/components/create-verifiable-presentation/__tests__/ConfigureName.test.tsx rename to frontend/packages/configure-verifiable-credentials/src/components/create-verifiable-presentation/__tests__/ConfigureName.test.tsx diff --git a/frontend/apps/console/src/features/verifiable-credentials/constants/vc-query-keys.ts b/frontend/packages/configure-verifiable-credentials/src/constants/vc-query-keys.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/constants/vc-query-keys.ts rename to frontend/packages/configure-verifiable-credentials/src/constants/vc-query-keys.ts diff --git a/frontend/packages/configure-verifiable-presentations/src/constants/vp-query-keys.ts b/frontend/packages/configure-verifiable-credentials/src/constants/vp-query-keys.ts similarity index 100% rename from frontend/packages/configure-verifiable-presentations/src/constants/vp-query-keys.ts rename to frontend/packages/configure-verifiable-credentials/src/constants/vp-query-keys.ts diff --git a/frontend/packages/configure-verifiable-credentials/src/hooks/useVerifiableCredentialRoutes.ts b/frontend/packages/configure-verifiable-credentials/src/hooks/useVerifiableCredentialRoutes.ts new file mode 100644 index 0000000000..4af581f2a1 --- /dev/null +++ b/frontend/packages/configure-verifiable-credentials/src/hooks/useVerifiableCredentialRoutes.ts @@ -0,0 +1,64 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +import {useRoutes} from '@thunderid/contexts'; + +/** + * Route paths this package needs from the host application. + * + * The host supplies these via `@thunderid/contexts`'s `RoutesProvider`. When absent (e.g. this + * package rendered standalone in Storybook or a unit test), `useVerifiableCredentialRoutes` falls + * back to `defaultVerifiableCredentialRoutePaths` below. + * + * @public + */ +export interface VerifiableCredentialRoutePaths { + verifiableCredentials: { + list: () => string; + detail: (id: string) => string; + create: () => string; + }; + verifiablePresentations: { + list: () => string; + detail: (id: string) => string; + create: () => string; + }; +} + +/** + * Default verifiable-credential (and verifiable-presentation) paths, used when no host-supplied + * override is present. + * + * @public + */ +export const defaultVerifiableCredentialRoutePaths: VerifiableCredentialRoutePaths = { + verifiableCredentials: { + list: () => '/verifiable-credentials', + detail: (id) => `/verifiable-credentials/${id}`, + create: () => '/verifiable-credentials/create', + }, + verifiablePresentations: { + list: () => '/verifiable-presentations', + detail: (id) => `/verifiable-presentations/${id}`, + create: () => '/verifiable-presentations/create', + }, +}; + +/** + * Resolves the verifiable-credential (and verifiable-presentation) route paths, preferring the + * host application's configuration (supplied via `RoutesProvider`) and falling back to this + * package's own defaults. + * + * Components should never hardcode these destination paths; they should call this hook and build + * the destination from the returned functions instead. + * + * @public + */ +export default function useVerifiableCredentialRoutes(): VerifiableCredentialRoutePaths { + const routes = useRoutes>(); + return { + verifiableCredentials: routes.verifiableCredentials ?? defaultVerifiableCredentialRoutePaths.verifiableCredentials, + verifiablePresentations: + routes.verifiablePresentations ?? defaultVerifiableCredentialRoutePaths.verifiablePresentations, + }; +} diff --git a/frontend/packages/configure-verifiable-credentials/src/index.ts b/frontend/packages/configure-verifiable-credentials/src/index.ts new file mode 100644 index 0000000000..63e001664a --- /dev/null +++ b/frontend/packages/configure-verifiable-credentials/src/index.ts @@ -0,0 +1,56 @@ +// Copyright 2026 The ThunderID Authors +// SPDX-License-Identifier: Apache-2.0 + +// APIs +export {default as useCreateCredentialOffer} from './api/useCreateCredentialOffer'; +export {default as useCreateVerifiableCredential} from './api/useCreateVerifiableCredential'; +export {default as useCreateVerifiablePresentation} from './api/useCreateVerifiablePresentation'; +export {default as useDeleteVerifiableCredential} from './api/useDeleteVerifiableCredential'; +export {default as useDeleteVerifiablePresentation} from './api/useDeleteVerifiablePresentation'; +export {default as useGetTrustAnchors} from './api/useGetTrustAnchors'; +export {default as useGetVerifiableCredential} from './api/useGetVerifiableCredential'; +export {default as useGetVerifiableCredentials} from './api/useGetVerifiableCredentials'; +export {default as useGetVerifiablePresentation} from './api/useGetVerifiablePresentation'; +export {default as useGetVerifiablePresentations} from './api/useGetVerifiablePresentations'; +export {default as useInitiateVerification} from './api/useInitiateVerification'; +export {default as useUpdateVerifiableCredential} from './api/useUpdateVerifiableCredential'; +export {default as useUpdateVerifiablePresentation} from './api/useUpdateVerifiablePresentation'; +export {default as useVerificationStatus} from './api/useVerificationStatus'; + +// Components +export {default as CredentialOfferDialog} from './components/CredentialOfferDialog'; +export {default as VerifiableCredentialDeleteDialog} from './components/VerifiableCredentialDeleteDialog'; +export {default as VerifiableCredentialForm} from './components/VerifiableCredentialForm'; +export {default as VerifiableCredentialsList} from './components/VerifiableCredentialsList'; +export {default as VerifiablePresentationDeleteDialog} from './components/VerifiablePresentationDeleteDialog'; +export {default as VerifiablePresentationForm} from './components/VerifiablePresentationForm'; +export {default as VerifiablePresentationsList} from './components/VerifiablePresentationsList'; +export {default as VerificationDialog} from './components/VerificationDialog'; + +// Constants +export {default as VerifiableCredentialQueryKeys} from './constants/vc-query-keys'; +export {default as VerifiablePresentationQueryKeys} from './constants/vp-query-keys'; + +// Models +export * from './models/vc'; +export * from './models/vp'; +export type {CreateVerifiableCredentialRequest, UpdateVerifiableCredentialRequest} from './models/credential-requests'; +export type { + CreateVerifiablePresentationRequest, + UpdateVerifiablePresentationRequest, +} from './models/presentation-requests'; + +// Pages +export {default as VerifiableCredentialCreatePage} from './pages/VerifiableCredentialCreatePage'; +export {default as VerifiableCredentialEditPage} from './pages/VerifiableCredentialEditPage'; +export {default as VerifiableCredentialsListPage} from './pages/VerifiableCredentialsListPage'; +export {default as VerifiablePresentationCreatePage} from './pages/VerifiablePresentationCreatePage'; +export {default as VerifiablePresentationEditPage} from './pages/VerifiablePresentationEditPage'; +export {default as VerifiablePresentationsListPage} from './pages/VerifiablePresentationsListPage'; + +// Routes +export type {VerifiableCredentialRoutePaths} from './hooks/useVerifiableCredentialRoutes'; +export { + defaultVerifiableCredentialRoutePaths, + default as useVerifiableCredentialRoutes, +} from './hooks/useVerifiableCredentialRoutes'; diff --git a/frontend/apps/console/src/features/verifiable-credentials/models/claims.ts b/frontend/packages/configure-verifiable-credentials/src/models/credential-claims.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/models/claims.ts rename to frontend/packages/configure-verifiable-credentials/src/models/credential-claims.ts diff --git a/frontend/apps/console/src/features/verifiable-credentials/models/requests.ts b/frontend/packages/configure-verifiable-credentials/src/models/credential-requests.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/models/requests.ts rename to frontend/packages/configure-verifiable-credentials/src/models/credential-requests.ts diff --git a/frontend/apps/console/src/features/verifiable-presentations/models/claims.ts b/frontend/packages/configure-verifiable-credentials/src/models/presentation-claims.ts similarity index 94% rename from frontend/apps/console/src/features/verifiable-presentations/models/claims.ts rename to frontend/packages/configure-verifiable-credentials/src/models/presentation-claims.ts index 244cb825a2..98cdae9888 100644 --- a/frontend/apps/console/src/features/verifiable-presentations/models/claims.ts +++ b/frontend/packages/configure-verifiable-credentials/src/models/presentation-claims.ts @@ -1,8 +1,8 @@ // Copyright 2026 The ThunderID Authors // SPDX-License-Identifier: Apache-2.0 -import type {VerifiablePresentation} from '@thunderid/configure-verifiable-presentations'; -import type {CreateVerifiablePresentationRequest} from './requests'; +import type {CreateVerifiablePresentationRequest} from './presentation-requests'; +import type {VerifiablePresentation} from './vp'; export type ClaimRequirement = 'mandatory' | 'optional'; diff --git a/frontend/apps/console/src/features/verifiable-presentations/models/requests.ts b/frontend/packages/configure-verifiable-credentials/src/models/presentation-requests.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-presentations/models/requests.ts rename to frontend/packages/configure-verifiable-credentials/src/models/presentation-requests.ts diff --git a/frontend/apps/console/src/features/verifiable-credentials/models/vc.ts b/frontend/packages/configure-verifiable-credentials/src/models/vc.ts similarity index 100% rename from frontend/apps/console/src/features/verifiable-credentials/models/vc.ts rename to frontend/packages/configure-verifiable-credentials/src/models/vc.ts diff --git a/frontend/packages/configure-verifiable-presentations/src/models/vp.ts b/frontend/packages/configure-verifiable-credentials/src/models/vp.ts similarity index 100% rename from frontend/packages/configure-verifiable-presentations/src/models/vp.ts rename to frontend/packages/configure-verifiable-credentials/src/models/vp.ts diff --git a/frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialCreatePage.tsx b/frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialCreatePage.tsx similarity index 96% rename from frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialCreatePage.tsx rename to frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialCreatePage.tsx index daf082b471..e72eb67e0a 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialCreatePage.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialCreatePage.tsx @@ -28,18 +28,18 @@ import {useMemo, useState, type ChangeEvent, type JSX} from 'react'; import {useTranslation} from 'react-i18next'; import {useNavigate} from 'react-router'; import useCreateVerifiableCredential from '../api/useCreateVerifiableCredential'; -import ClaimsEditor from '../components/ClaimsEditor'; import ConfigureName from '../components/create-verifiable-credential/ConfigureName'; -import {claimRowsToRequest, credentialToClaimRows, type ClaimRow} from '../models/claims'; +import ClaimsEditor from '../components/CredentialClaimsEditor'; +import useVerifiableCredentialRoutes from '../hooks/useVerifiableCredentialRoutes'; +import {claimRowsToRequest, credentialToClaimRows, type ClaimRow} from '../models/credential-claims'; type Step = 'ORGANIZATION_UNIT' | 'NAME' | 'DETAILS' | 'CLAIMS'; -const LIST_URL = '/verifiable-credentials'; - export default function VerifiableCredentialCreatePage(): JSX.Element { const navigate = useNavigate(); const {t} = useTranslation('verifiable-credentials'); const logger = useLogger('VerifiableCredentialCreatePage'); + const routes = useVerifiableCredentialRoutes(); const createVC = useCreateVerifiableCredential(); const {hasMultipleOUs, isLoading: isOuLoading, ouList} = useHasMultipleOUs(); @@ -121,7 +121,7 @@ export default function VerifiableCredentialCreatePage(): JSX.Element { const progress = ((stepIndex + 1) / stepOrder.length) * 100; const close = (): void => { - void navigate(LIST_URL); + void navigate(routes.verifiableCredentials.list()); }; const buildRequest = () => ({ @@ -137,7 +137,7 @@ export default function VerifiableCredentialCreatePage(): JSX.Element { createVC.mutate(buildRequest(), { onSuccess: () => { (async () => { - await navigate(LIST_URL); + await navigate(routes.verifiableCredentials.list()); })().catch((error: unknown) => { logger.error('Failed to navigate after create', {error}); }); diff --git a/frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialEditPage.tsx b/frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialEditPage.tsx similarity index 96% rename from frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialEditPage.tsx rename to frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialEditPage.tsx index 891ac77bac..9a3d108afd 100644 --- a/frontend/apps/console/src/features/verifiable-credentials/pages/VerifiableCredentialEditPage.tsx +++ b/frontend/packages/configure-verifiable-credentials/src/pages/VerifiableCredentialEditPage.tsx @@ -12,14 +12,15 @@ import useGetVerifiableCredential from '../api/useGetVerifiableCredential'; import useUpdateVerifiableCredential from '../api/useUpdateVerifiableCredential'; import VerifiableCredentialDeleteDialog from '../components/VerifiableCredentialDeleteDialog'; import VerifiableCredentialForm from '../components/VerifiableCredentialForm'; -import type {UpdateVerifiableCredentialRequest} from '../models/requests'; - -const LIST_URL = '/verifiable-credentials'; +import useVerifiableCredentialRoutes from '../hooks/useVerifiableCredentialRoutes'; +import type {UpdateVerifiableCredentialRequest} from '../models/credential-requests'; export default function VerifiableCredentialEditPage(): JSX.Element { const {vcId = ''} = useParams<{vcId: string}>(); const navigate = useNavigate(); const {t} = useTranslation(); + const routes = useVerifiableCredentialRoutes(); + const listUrl = routes.verifiableCredentials.list(); const {data, isLoading, error, refetch} = useGetVerifiableCredential(vcId); const updateVC = useUpdateVerifiableCredential(); @@ -51,7 +52,7 @@ export default function VerifiableCredentialEditPage(): JSX.Element { } const handleDeleted = (): void => { - void navigate(LIST_URL); + void navigate(listUrl); }; const handleSubmit = (formData: UpdateVerifiableCredentialRequest): void => { @@ -65,7 +66,7 @@ export default function VerifiableCredentialEditPage(): JSX.Element { const backButton = ( + + ), + AuthPageLayout: ({children}: {children: React.ReactNode}) =>
{children}
, + AuthCardLayout: ({children}: {children: React.ReactNode}) =>
{children}
, + FontImporter: () => null, + getFontImportURL: () => undefined, + getCspNonce: () => document.querySelector('meta[property="csp-nonce"]')?.getAttribute('content') ?? undefined, + }; +}); + +vi.mock('@emotion/cache', async (importActual) => { + const actual = await importActual(); + return { + ...actual, + default: (options: Parameters[0]) => actual.default({...options, container: document.head}), + }; +}); + +vi.mock('@emotion/react', () => ({ + CacheProvider: ({children}: {children: React.ReactNode}) => children, +})); + +const mockTheme = { + colorSchemes: { + light: {palette: {background: {default: '#ffffff'}}}, + dark: {palette: {background: {default: '#121212'}}}, + }, +} as unknown as Theme; + +// `EmbeddedFlowComponent` resolves to an error type here because `@thunderid/react` has no `types` +// condition in its `exports` map, and this package's `tsconfig.spec.json` forces `module: commonjs` +// against a `moduleResolution: bundler` base, so the checker falls back to the untyped CJS entry point. +// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment +const mockComponent: EmbeddedFlowComponent = {id: 'comp-1'} as unknown as EmbeddedFlowComponent; + +function renderIframeContent(props: Partial[0]> = {}) { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + const iframeDoc = iframe.contentDocument!; + iframeDoc.open(); + iframeDoc.write('
'); + iframeDoc.close(); + + // IframeContent's own tree renders into the iframe document's #root (mirroring the portal + // GatePreview normally sets up), so DOM queries like getElementById run against iframeDoc. + const utils = render( + + + , + {container: iframeDoc.getElementById('root')!, baseElement: iframeDoc.body}, + ); + + return {...utils, iframeDoc, cleanupIframe: () => iframe.remove()}; +} + +afterEach(() => { + cleanup(); + document.querySelectorAll('iframe').forEach((iframe) => iframe.remove()); +}); + +describe('IframeContent', () => { + describe('sanitizeThemeForMui', () => { + it('strips defaultColorScheme "system" before it reaches downstream MUI theming', () => { + const themeWithSystemScheme = { + defaultColorScheme: 'system', + colorSchemes: { + light: {palette: {background: {default: '#ffffff'}}}, + dark: {palette: {background: {default: '#121212'}}}, + }, + } as unknown as Theme; + + // Rendering must not throw despite MUI's extendTheme rejecting 'system'. + expect(() => renderIframeContent({theme: themeWithSystemScheme})).not.toThrow(); + }); + + it('renders normally when defaultColorScheme is a plain light/dark value', () => { + const themeWithLightScheme = { + defaultColorScheme: 'light', + colorSchemes: { + light: {palette: {background: {default: '#ffffff'}}}, + dark: {palette: {background: {default: '#121212'}}}, + }, + } as unknown as Theme; + + const {iframeDoc} = renderIframeContent({theme: themeWithLightScheme}); + expect(iframeDoc.getElementById('root')?.children.length).toBeGreaterThan(0); + }); + }); + + describe('stylesheet injection', () => { + it('injects an inline stylesheet as a