Add GFTD portal marketplace discovery
This commit is contained in:
@@ -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>.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user