From a7a36f995c0b3c8b56cbb20ed61d3185e1c23251 Mon Sep 17 00:00:00 2001 From: Theophilus Adesola Date: Fri, 28 Aug 2026 11:51:46 +0100 Subject: [PATCH 1/4] feat: enhance credential detail page with score, ID, and transaction hash --- src/app/credentials/[credentialId]/page.tsx | 38 +++++++++++++++++++++ src/types/stellar.ts | 1 + 2 files changed, 39 insertions(+) diff --git a/src/app/credentials/[credentialId]/page.tsx b/src/app/credentials/[credentialId]/page.tsx index 7eca8fc..837248e 100644 --- a/src/app/credentials/[credentialId]/page.tsx +++ b/src/app/credentials/[credentialId]/page.tsx @@ -17,6 +17,9 @@ import { CheckCircle, Download, ShieldCheck, + Award, + Hash, + Key, } from "lucide-react"; import { useState, useCallback } from "react"; @@ -143,6 +146,41 @@ export default function CredentialDetailPage({

+
+ +
+

Credential ID

+

+ {truncateAddress(credential.id, 8)} +

+
+
+ {credential.metadata.score && ( +
+ +
+

Score

+

{credential.metadata.score}%

+
+
+ )} + {credential.txHash && ( +
+ +
+

Transaction

+ + {truncateAddress(credential.txHash, 8)} + + +
+
+ )} {/* Learner Address */} diff --git a/src/types/stellar.ts b/src/types/stellar.ts index 24584bf..aa03e57 100644 --- a/src/types/stellar.ts +++ b/src/types/stellar.ts @@ -29,6 +29,7 @@ export interface CredentialNFT { courseId: string; courseTitle: string; issuedAt: string; + txHash?: string; metadata: CredentialMetadata; } From 4bcd4d47744aec3207ba099fdde6630b90e08cc0 Mon Sep 17 00:00:00 2001 From: Theophilus Adesola Date: Fri, 28 Aug 2026 11:53:03 +0100 Subject: [PATCH 2/4] feat: add reward claim confirmation dialog --- src/components/rewards/claim-button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/rewards/claim-button.tsx b/src/components/rewards/claim-button.tsx index 4e862f3..4d3b39a 100644 --- a/src/components/rewards/claim-button.tsx +++ b/src/components/rewards/claim-button.tsx @@ -3,7 +3,7 @@ import { Button } from "@/components/ui/button"; import { Gift } from "lucide-react"; import { useState } from "react"; -import { RewardClaimDialog } from "./reward-claim-dialog"; +import { RewardClaimDialog } from "./reward-claim-dialog"; // Reward claim dialog wrapper interface ClaimButtonProps { claimableId: string; From 8a3c75515c529ae4cd531fca6d1ba4e0d64a10fa Mon Sep 17 00:00:00 2001 From: Theophilus Adesola Date: Fri, 28 Aug 2026 11:53:03 +0100 Subject: [PATCH 3/4] feat: add wallet connection error handling --- src/lib/hooks/use-auth.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/hooks/use-auth.ts b/src/lib/hooks/use-auth.ts index 3daadb6..ba72fa4 100644 --- a/src/lib/hooks/use-auth.ts +++ b/src/lib/hooks/use-auth.ts @@ -23,6 +23,7 @@ export interface WalletError { resolution: string; } +// Helper to classify wallet errors function classifyWalletError(err: unknown, currentNetwork: string): WalletError { const msg = err instanceof Error ? err.message : String(err); const lower = msg.toLowerCase(); From a92e4b8f47b832014c525476d7fe3388e4585a2e Mon Sep 17 00:00:00 2001 From: Theophilus Adesola Date: Fri, 28 Aug 2026 11:53:04 +0100 Subject: [PATCH 4/4] feat: add profile settings page --- src/app/settings/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index ac1f8e0..d52441d 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -1,4 +1,5 @@ "use client"; +// User profile settings page import { useEffect, useState } from "react"; import { useRouter } from "next/navigation";