Add GFTD portal marketplace discovery

This commit is contained in:
defiQUG
2026-07-30 20:29:51 -07:00
parent 35e10d4b46
commit cf4d2ae16b
3 changed files with 103 additions and 3 deletions
@@ -6,6 +6,7 @@ import { signIn, useSession } from 'next-auth/react';
import { useCallback, useEffect, useState } from 'react';
import { partnerStackServices } from '@/lib/corporate-site-data';
import { gftdMarketplaceService } from '@/lib/gftd-marketplace';
type ProductInfo = {
slug: string;
@@ -38,7 +39,40 @@ export default function MarketplaceEntitlementPage() {
const [message, setMessage] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const partnerMeta = partnerStackServices.find((s) => s.href?.includes(slug));
const partnerMeta = [...partnerStackServices, gftdMarketplaceService].find((s) => s.href?.includes(slug));
const isGftd = slug === 'phoenix-gftd-directory';
const gftdSubscriptionTiers = [
{
name: 'Preview',
description: 'Evaluators, partners, and early adopters with public-safe demo data only.',
limits: 'No live restricted data, no authority claims, no production SLA.',
},
{
name: 'Professional',
description: 'Operators, integrators, and compliance teams.',
limits: 'Approved sources only, role-based access, bounded query depth, and rate limits.',
},
{
name: 'Institutional',
description: 'Regulated firms, marketplaces, and service providers.',
limits: 'Contractual use terms, approval gates, and stricter access control.',
},
{
name: 'Enterprise',
description: 'Market operators and platform teams.',
limits: 'Custom SLAs, tenant-specific redaction policies, and governance reporting.',
},
];
const gftdPersonaNeeds = [
'Compliance analyst: rights status, publication boundaries, and audit trails.',
'Integration engineer: stable API, live adapters, and predictable responses.',
'Marketplace operator: packaging, tiers, onboarding, and feature gating.',
'Legal counsel: evidence refs, disclaimers, and approval records.',
'Operations / SRE: health checks, observability snapshots, and runtime limits.',
'Institutional customer: approved data, support, and acceptance artifacts.',
];
const loadProduct = useCallback(async () => {
const res = await fetch(`/api/marketplace/products/${slug}`, {
@@ -144,6 +178,51 @@ export default function MarketplaceEntitlementPage() {
{product?.shortDescription || product?.description || partnerMeta?.description}
</p>
{isGftd ? (
<section className="mt-8 rounded-xl border border-white/10 bg-white/5 p-6">
<p className="text-xs font-semibold uppercase tracking-wider text-teal-300">
GFTD Directory
</p>
<h2 className="mt-2 text-2xl font-semibold">Rights-aware entity intelligence</h2>
<p className="mt-3 max-w-3xl text-sovereign-silver">
Access approved live source lanes, redacted public-safe outputs, bounded observability,
and evidence-backed operational controls through Sankofa Marketplace.
</p>
<div className="mt-6 grid gap-4 md:grid-cols-2">
<article className="rounded-lg border border-white/10 bg-black/20 p-4">
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">
Subscription tiers
</h3>
<div className="mt-4 space-y-3">
{gftdSubscriptionTiers.map((tier) => (
<div key={tier.name} className="rounded-md border border-white/5 bg-white/5 p-3">
<div className="flex items-center justify-between gap-4">
<span className="font-medium text-white">{tier.name}</span>
</div>
<p className="mt-1 text-sm text-sovereign-silver">{tier.description}</p>
<p className="mt-1 text-xs text-sovereign-silver/80">{tier.limits}</p>
</div>
))}
</div>
</article>
<article className="rounded-lg border border-white/10 bg-black/20 p-4">
<h3 className="text-sm font-semibold uppercase tracking-wide text-teal-300">
User needs by persona
</h3>
<ul className="mt-4 space-y-2 text-sm text-sovereign-silver">
{gftdPersonaNeeds.map((item) => (
<li key={item} className="rounded-md border border-white/5 bg-white/5 px-3 py-2">
{item}
</li>
))}
</ul>
</article>
</div>
</section>
) : null}
{partnerMeta?.serviceUrl ? (
<p className="mt-4 text-sm text-sovereign-silver">
Service endpoint:{' '}
@@ -192,7 +271,7 @@ export default function MarketplaceEntitlementPage() {
onClick={handleSubscribe}
className="mt-6 rounded-lg bg-teal-600 px-5 py-2.5 text-sm font-medium text-white hover:bg-teal-500 disabled:opacity-60"
>
{submitting ? 'Submitting…' : 'Request subscription'}
{submitting ? 'Submitting…' : isGftd ? 'Request GFTD access' : 'Request subscription'}
</button>
)}
@@ -200,6 +279,13 @@ export default function MarketplaceEntitlementPage() {
{error && <p className="mt-4 text-red-400">{error}</p>}
</section>
{isGftd ? (
<p className="mt-8 text-xs text-sovereign-silver">
GFTD is rights-aware entity intelligence, not legal authority, not a payment rail, and not a
license to republish restricted data.
</p>
) : null}
<p className="mt-8 text-xs text-sovereign-silver">
Contract/PO-first billing automated Stripe checkout is on the roadmap. Operator Keycloak grants
run via <code className="rounded bg-black/30 px-1">grant-marketplace-entitlements-keycloak.sh</code>.
+4 -1
View File
@@ -10,6 +10,7 @@ import {
platformServices,
productDivisions,
} from '@/lib/corporate-site-data';
import { gftdMarketplaceService } from '@/lib/gftd-marketplace';
export const metadata = {
title: 'Marketplace — Sankofa Phoenix',
@@ -17,6 +18,8 @@ export const metadata = {
};
export default function MarketplacePage() {
const marketplacePartnerServices = [...partnerStackServices, gftdMarketplaceService];
return (
<div className="flex min-h-screen flex-col bg-sovereign-obsidian text-sovereign-ivory">
<CorporateHeader />
@@ -97,7 +100,7 @@ export default function MarketplacePage() {
B2B, CTI, Chain 138 onboarding, and X-Road provisioned via Phoenix marketplace entitlements.
</p>
<div className="mt-6 grid gap-4 sm:grid-cols-2">
{partnerStackServices.map((service) => (
{marketplacePartnerServices.map((service) => (
<article
key={service.name}
className="rounded-xl border border-sovereign-gold/20 bg-sovereign-midnight/40 p-5"
+11
View File
@@ -0,0 +1,11 @@
import type { PartnerStackService } from '@/lib/corporate-site-data';
export const gftdMarketplaceService: PartnerStackService = {
name: 'GFTD Directory',
href: '/marketplace/entitlements/phoenix-gftd-directory',
description:
'Rights-aware entity intelligence with live approved source lanes, redacted public-safe outputs, subscription tiers, and bounded observability.',
serviceUrl: 'https://gftd.d-bis.org',
category: 'Internet registry & compliance',
};