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 && (
+
+ )}
{/* 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";