@burdenoff/microfe-devportal 2026.707.2 → 2026.713.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/devportal/AdminDevportalRoot.js +33 -27
  2. package/dist/devportal/AdminDevportalRoot.js.map +1 -1
  3. package/dist/devportal/AdminDevportalRoutes.js +9 -5
  4. package/dist/devportal/AdminDevportalRoutes.js.map +1 -1
  5. package/dist/devportal/DevportalRoutes.js +125 -105
  6. package/dist/devportal/DevportalRoutes.js.map +1 -1
  7. package/dist/devportal/pages/AdminOrganizationVerificationPage.js +169 -0
  8. package/dist/devportal/pages/AdminOrganizationVerificationPage.js.map +1 -0
  9. package/dist/devportal/pages/ApplicationVersionsPage.js +551 -320
  10. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  11. package/dist/devportal/pages/CreatePhysicalItemPage.js +494 -0
  12. package/dist/devportal/pages/CreatePhysicalItemPage.js.map +1 -0
  13. package/dist/devportal/pages/EditPhysicalItemPage.js +419 -0
  14. package/dist/devportal/pages/EditPhysicalItemPage.js.map +1 -0
  15. package/dist/devportal/pages/OrganizationDetailPage.js +441 -295
  16. package/dist/devportal/pages/OrganizationDetailPage.js.map +1 -1
  17. package/dist/devportal/pages/RevenueDashboardPage.js +72 -54
  18. package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -1
  19. package/dist/devportal/pages/SellerDashboardPage.js +364 -0
  20. package/dist/devportal/pages/SellerDashboardPage.js.map +1 -0
  21. package/dist/devportal/pages/SellerItemsPage.js +533 -0
  22. package/dist/devportal/pages/SellerItemsPage.js.map +1 -0
  23. package/dist/devportal/pages/SellerOrdersPage.js +411 -0
  24. package/dist/devportal/pages/SellerOrdersPage.js.map +1 -0
  25. package/dist/devportal/types/index.js.map +1 -1
  26. package/dist/generated/global-operations.js +149 -149
  27. package/dist/generated/global-operations.js.map +1 -1
  28. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OrganizationDetailPage.js","names":[],"sources":["../../../src/devportal/pages/OrganizationDetailPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n Building2,\n Users,\n AppWindow,\n DollarSign,\n Settings,\n ExternalLink,\n CheckCircle,\n BarChart3,\n TrendingUp,\n ArrowRight,\n Plus,\n Shield,\n Loader2,\n AlertCircle,\n} from \"lucide-react\";\nimport { EmphasisPanel, NextSteps } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { DataTable, DetailList } from \"../components/DataTable\";\nimport { AppListItem } from \"../components/AppCard\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { InputField, TextareaField } from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport type {\n DeveloperOrganization,\n Application,\n DeveloperOrgMember,\n} from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { ORG_ROLE_LABELS } from \"../utils/constants\";\nimport {\n useGetOrganizationQuery,\n useGetApplicationsQuery,\n useRequestOrgVerificationMutation,\n useUpdateOrganizationMutation,\n useUpdateOrgLegalInfoMutation,\n useUpdateOrgTaxInfoMutation,\n} from \"../../generated/global-operations\";\nimport type {\n OrganizationFieldsFragment,\n OrgMemberFieldsFragment,\n ApplicationFieldsFragment,\n} from \"../../generated/global-operations\";\n\n/**\n * Map GraphQL organization fragment to local type\n */\nfunction mapOrganization(\n org: OrganizationFieldsFragment,\n): DeveloperOrganization {\n return {\n id: org.id,\n name: org.name,\n slug: org.slug,\n description: org.description ?? undefined,\n logoUrl: org.logoUrl ?? undefined,\n bannerUrl: org.bannerUrl ?? undefined,\n websiteUrl: org.websiteUrl ?? undefined,\n contactEmail: org.contactEmail ?? undefined,\n supportEmail: org.supportEmail ?? undefined,\n tier: org.tier as DeveloperOrganization[\"tier\"],\n partnerTier:\n (org.partnerTier as DeveloperOrganization[\"partnerTier\"]) ?? undefined,\n partnerSince: org.partnerSince ?? undefined,\n isVerified: org.isVerified ?? false,\n verifiedAt: org.verifiedAt ?? undefined,\n isCertified: org.isCertified ?? false,\n certifiedAt: org.certifiedAt ?? undefined,\n totalApps: org.totalApps ?? 0,\n publishedApps: org.publishedApps ?? 0,\n totalInstalls: org.totalInstalls ?? 0,\n activeInstalls: org.activeInstalls ?? 0,\n totalApiCalls: org.totalApiCalls ?? \"0\",\n averageRating: org.averageRating ?? undefined,\n totalRevenue: org.totalRevenue ?? 0,\n totalPlatformFees: org.totalPlatformFees ?? 0,\n totalPayouts: org.totalPayouts ?? 0,\n pendingBalance: org.pendingBalance ?? 0,\n lifetimeRevenue: org.lifetimeRevenue ?? 0,\n platformFeeRate: org.platformFeeRate ?? 0.3,\n apiCallsLimit: org.apiCallsLimit ?? 100000,\n storageLimit: org.storageLimit ?? \"1073741824\",\n apiCallsUsed: org.apiCallsUsed ?? \"0\",\n storageUsed: org.storageUsed ?? \"0\",\n taxId: org.taxId ?? undefined,\n taxCountry: org.taxCountry ?? undefined,\n taxFormVerified: org.taxFormVerified ?? false,\n legalEntityName: org.legalEntityName ?? undefined,\n legalEntityType: org.legalEntityType ?? undefined,\n createdAt: org.createdAt,\n updatedAt: org.updatedAt,\n };\n}\n\n/**\n * Map GraphQL member fragment to local type\n */\nfunction mapMember(member: OrgMemberFieldsFragment): DeveloperOrgMember {\n return {\n id: member.id,\n organizationId: member.organizationId,\n userId: member.userId,\n email: member.email ?? undefined,\n role: member.role as DeveloperOrgMember[\"role\"],\n isActive: member.isActive ?? true,\n isSuspended: member.isSuspended ?? false,\n suspendedAt: member.suspendedAt ?? undefined,\n suspendedReason: member.suspendedReason ?? undefined,\n joinedAt: member.joinedAt,\n permissions: member.permissions ?? undefined,\n invitedBy: member.invitedBy ?? undefined,\n invitationId: member.invitationId ?? undefined,\n createdAt: member.createdAt,\n updatedAt: member.updatedAt,\n };\n}\n\ntype TabId = \"overview\" | \"apps\" | \"members\" | \"settings\";\n\nconst ORG_ROLE_PRIORITY: Record<DeveloperOrgMember[\"role\"], number> = {\n VIEWER: 0,\n DEVELOPER: 1,\n ADMIN: 2,\n OWNER: 3,\n};\n\n/**\n * Organization detail page\n */\nexport const OrganizationDetailPage: FC = () => {\n const { navigate, basePath, setActiveOrgId, currentUser } = useDevportal();\n const { orgId: id } = useParams<{ orgId: string }>();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [activeTab, setActiveTab] = useState<TabId>(\"overview\");\n\n const allTabs: Array<{\n id: TabId;\n label: string;\n icon: FC<{ size?: number }>;\n }> = [\n {\n id: \"overview\",\n label: tr(\"devportal.overview\", \"Overview\"),\n icon: Building2,\n },\n {\n id: \"apps\",\n label: tr(\"devportal.applications\", \"Applications\"),\n icon: AppWindow,\n },\n { id: \"members\", label: tr(\"devportal.members\", \"Members\"), icon: Users },\n {\n id: \"settings\",\n label: tr(\"devportal.settings\", \"Settings\"),\n icon: Settings,\n },\n ];\n\n // Fetch organization data\n const { data, previousData, loading, error } = useGetOrganizationQuery({\n variables: { id: id! },\n skip: !id,\n });\n const resolvedData = data ?? previousData;\n\n const { data: appsData } = useGetApplicationsQuery({\n variables: { limit: 50, organizationId: id },\n skip: !id,\n fetchPolicy: \"cache-and-network\",\n });\n\n const provisionalMembers: DeveloperOrgMember[] = (\n resolvedData?.developerOrganization?.members ?? []\n ).map(mapMember);\n const currentMembership = currentUser\n ? provisionalMembers.find(\n (member: DeveloperOrgMember) => member.userId === currentUser.id,\n )\n : undefined;\n const currentRole: DeveloperOrgMember[\"role\"] | undefined =\n currentMembership?.role;\n const canCreateApps =\n currentRole !== undefined &&\n ORG_ROLE_PRIORITY[currentRole] >= ORG_ROLE_PRIORITY.DEVELOPER;\n const canManageOrg =\n currentRole !== undefined &&\n ORG_ROLE_PRIORITY[currentRole] >= ORG_ROLE_PRIORITY.ADMIN;\n const canViewRevenue = canManageOrg;\n const canInviteMembers = canManageOrg;\n\n const tabs = allTabs.filter((tab) => tab.id !== \"settings\" || canManageOrg);\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n // Sync activeOrgId so the dashboard scopes to whichever org the user is browsing\n useEffect(() => {\n if (id) setActiveOrgId(id);\n }, [id, setActiveOrgId]);\n\n useEffect(() => {\n if (activeTab === \"settings\" && !canManageOrg) {\n setActiveTab(\"overview\");\n }\n }, [activeTab, canManageOrg]);\n\n // Register org name in breadcrumb registry so the URL ID shows as the org name\n useEffect(() => {\n const name = resolvedData?.developerOrganization?.name;\n if (!id || !name) return;\n const reg = (\n window as unknown as {\n __breadcrumbRegistry?: {\n register: (id: string, name: string) => void;\n unregister: (id: string) => void;\n };\n }\n ).__breadcrumbRegistry;\n reg?.register(id, name);\n return () => reg?.unregister(id);\n }, [id, data?.developerOrganization?.name]);\n\n // Loading state — only block on initial load, not refetches (keeps SettingsTab mounted)\n if (loading && !resolvedData) {\n return (\n <PageLayout\n title={tr(\"devportal.loadingDots\", \"Loading...\")}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n </div>\n </PageLayout>\n );\n }\n\n // Error state\n if (error || !resolvedData?.developerOrganization) {\n return (\n <PageLayout\n title={tr(\"devportal.organizationNotFound\", \"Organization Not Found\")}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <div className=\"flex flex-col items-center justify-center py-12 gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-lg font-semibold\">\n {tr(\n \"devportal.organizationNotFoundLower\",\n \"Organization not found\",\n )}\n </h2>\n <p className=\"text-text-secondary\">\n {error?.message ||\n tr(\n \"devportal.organizationNotFoundDescription\",\n \"The organization you're looking for doesn't exist or you don't have access to it.\",\n )}\n </p>\n <button\n onClick={() => handleNavigate(\"/organizations\")}\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n // Map GraphQL data to local types\n const org = mapOrganization(resolvedData!.developerOrganization!);\n const members = provisionalMembers;\n const apps = (appsData?.applications?.edges?.map(\n (e: { node: ApplicationFieldsFragment }) => e.node,\n ) ?? []) as Application[];\n\n return (\n <PageLayout\n title={org.name}\n description={org.description}\n purpose={tr(\n \"devportal.orgDetailPurpose\",\n \"This is the home for one organization — the apps it owns, the people who can work on them, and its store and billing settings. Invite teammates, add apps, and verify the org so your published listings look trustworthy.\",\n )}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n actions={\n <div className=\"flex items-center gap-2\">\n {canViewRevenue ? (\n <button\n onClick={() =>\n navigate?.(\n `/billing/earnings?developerOrgId=${encodeURIComponent(org.id)}&developerOrgName=${encodeURIComponent(org.name)}`,\n )\n }\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors\"\n >\n <DollarSign size={16} />\n {tr(\"devportal.revenue\", \"Revenue\")}\n </button>\n ) : null}\n </div>\n }\n >\n {/* Tabs */}\n <div className=\"border-b\">\n <nav\n className=\"-mb-px flex gap-4 overflow-x-auto\"\n role=\"tablist\"\n aria-label={tr(\n \"devportal.organizationSections\",\n \"Organization sections\",\n )}\n >\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n id={`organization-tab-${tab.id}`}\n role=\"tab\"\n aria-selected={activeTab === tab.id}\n aria-controls={`organization-panel-${tab.id}`}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"flex items-center gap-2 border-b-2 px-1 py-3 text-sm font-medium transition-colors\",\n activeTab === tab.id\n ? \"border-primary text-primary\"\n : \"border-transparent text-text-secondary hover:text-text-primary hover:border-muted-foreground\",\n )}\n >\n <Icon size={16} />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n {/* Guided next steps (dismissable) */}\n <NextSteps\n className=\"mt-6\"\n storageKey={`devportal-org-${org.id}`}\n steps={[\n ...(canInviteMembers\n ? [\n {\n id: \"invite-members\",\n label: tr(\"devportal.inviteMembers\", \"Invite members\"),\n description: tr(\n \"devportal.orgStepInvite\",\n \"Add teammates so they can build alongside you\",\n ),\n icon: <Users size={16} />,\n onClick: () => setActiveTab(\"members\"),\n },\n ]\n : []),\n ...(canCreateApps\n ? [\n {\n id: \"create-app\",\n label: tr(\"devportal.createApp\", \"Create App\"),\n description: tr(\n \"devportal.orgStepCreateApp\",\n \"Build a new application under this organization\",\n ),\n icon: <AppWindow size={16} />,\n onClick: () => handleNavigate(\"/apps/new\"),\n },\n ]\n : []),\n ...(canManageOrg\n ? [\n {\n id: \"settings\",\n label: tr(\n \"devportal.orgStepVerify\",\n \"Complete organization profile\",\n ),\n description: tr(\n \"devportal.orgStepVerifyDesc\",\n \"Add a logo and details, then request verification\",\n ),\n icon: <Settings size={16} />,\n onClick: () => setActiveTab(\"settings\"),\n done: Boolean(org.isVerified),\n },\n ]\n : []),\n ]}\n />\n\n {/* Tab content */}\n <div\n className=\"mt-6\"\n id={`organization-panel-${activeTab}`}\n role=\"tabpanel\"\n aria-labelledby={`organization-tab-${activeTab}`}\n tabIndex={0}\n >\n {activeTab === \"overview\" && (\n <OverviewTab\n org={org}\n apps={apps}\n members={members}\n canCreateApps={canCreateApps}\n canViewRevenue={canViewRevenue}\n onNavigate={handleNavigate}\n onShowApps={() => setActiveTab(\"apps\")}\n />\n )}\n {activeTab === \"apps\" && (\n <AppsTab\n apps={apps}\n onNavigate={handleNavigate}\n canCreateApps={canCreateApps}\n />\n )}\n {activeTab === \"members\" && (\n <MembersTab\n members={members}\n onNavigate={handleNavigate}\n orgId={org.id}\n canInviteMembers={canInviteMembers}\n />\n )}\n {activeTab === \"settings\" && canManageOrg && <SettingsTab org={org} />}\n </div>\n </PageLayout>\n );\n};\n\n// Overview Tab\nconst OverviewTab: FC<{\n org: DeveloperOrganization;\n apps: Application[];\n members: DeveloperOrgMember[];\n canCreateApps: boolean;\n canViewRevenue: boolean;\n onNavigate: (path: string) => void;\n onShowApps: () => void;\n}> = ({\n org,\n apps,\n members,\n canCreateApps,\n canViewRevenue,\n onNavigate,\n onShowApps,\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Stats — primary emphasis zone */}\n <EmphasisPanel>\n <StatCardGrid columns={canViewRevenue ? 4 : 3}>\n <StatCard\n title={tr(\"devportal.publishedApps\", \"Published Apps\")}\n value={`${org.publishedApps}/${org.totalApps}`}\n icon={<AppWindow size={20} />}\n />\n <StatCard\n title={tr(\"devportal.totalInstalls\", \"Total Installs\")}\n value={org.totalInstalls.toLocaleString()}\n icon={<TrendingUp size={20} />}\n />\n {canViewRevenue ? (\n <StatCard\n title={tr(\"devportal.totalRevenue\", \"Total Revenue\")}\n value={`$${org.totalRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n ) : null}\n <StatCard\n title={tr(\"devportal.avgRating\", \"Avg Rating\")}\n value={\n org.averageRating\n ? `${org.averageRating.toFixed(1)} ★`\n : tr(\"devportal.notAvailable\", \"N/A\")\n }\n icon={<BarChart3 size={20} />}\n />\n </StatCardGrid>\n </EmphasisPanel>\n\n {/* Recent Apps */}\n <PageSection\n title={tr(\"devportal.recentApplications\", \"Recent Applications\")}\n actions={\n <button\n onClick={onShowApps}\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {tr(\"devportal.viewAll\", \"View all\")} <ArrowRight size={14} />\n </button>\n }\n >\n {apps.length > 0 ? (\n <div className=\"space-y-2\">\n {apps.slice(0, 3).map((app) => (\n <AppListItem\n key={app.id}\n app={app}\n onClick={() => onNavigate(`/apps/${app.id}`)}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n icon={<AppWindow size={24} />}\n title={tr(\"devportal.noApplications\", \"No applications\")}\n description={tr(\n \"devportal.createYourFirstApplication\",\n \"Create your first application\",\n )}\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : undefined\n }\n />\n )}\n </PageSection>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Quick Stats */}\n {canViewRevenue ? (\n <PageSection\n title={tr(\"devportal.revenueSummary\", \"Revenue Summary\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.totalRevenue\", \"Total Revenue\"),\n value: `$${org.totalRevenue.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.platformFees\", \"Platform Fees\"),\n value: `$${org.totalPlatformFees.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.netPayouts\", \"Net Payouts\"),\n value: `$${org.totalPayouts.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.pendingBalance\", \"Pending Balance\"),\n value: `$${org.pendingBalance.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.lifetimeRevenue\", \"Lifetime Revenue\"),\n value: `$${org.lifetimeRevenue.toLocaleString()}`,\n },\n ]}\n />\n </PageSection>\n ) : null}\n\n {/* Team */}\n <PageSection\n title={tr(\"devportal.teamMembers\", \"Team Members\")}\n actions={\n <button\n onClick={() => onNavigate(`/organizations/${org.id}/members`)}\n className=\"text-sm text-primary hover:underline\"\n >\n {tr(\"devportal.manage\", \"Manage\")}\n </button>\n }\n >\n <div className=\"space-y-2\">\n {members.slice(0, 3).map((member) => (\n <div\n key={member.id}\n className=\"flex items-center justify-between py-2\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-medium text-primary\">\n {member.email?.charAt(0).toUpperCase() || \"U\"}\n </div>\n <div>\n <p className=\"text-sm font-medium\">{member.email}</p>\n <p className=\"text-xs text-text-secondary\">\n {ORG_ROLE_LABELS[member.role]}\n </p>\n </div>\n </div>\n </div>\n ))}\n {members.length > 3 && (\n <p className=\"text-xs text-text-secondary\">\n +{members.length - 3}{\" \"}\n {tr(\"devportal.moreMembers\", \"more members\")}\n </p>\n )}\n </div>\n </PageSection>\n\n {/* Links */}\n <PageSection title={tr(\"devportal.links\", \"Links\")}>\n <div className=\"space-y-2\">\n {org.websiteUrl && (\n <a\n href={org.websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-sm text-primary hover:underline\"\n >\n <ExternalLink size={14} />\n {tr(\"devportal.website\", \"Website\")}\n </a>\n )}\n {org.contactEmail && (\n <a\n href={`mailto:${org.contactEmail}`}\n className=\"flex items-center gap-2 text-sm text-primary hover:underline\"\n >\n <ExternalLink size={14} />\n {org.contactEmail}\n </a>\n )}\n </div>\n </PageSection>\n </div>\n </div>\n );\n};\n\n// Apps Tab\nconst AppsTab: FC<{\n apps: Application[];\n onNavigate: (path: string) => void;\n canCreateApps: boolean;\n}> = ({ apps, onNavigate, canCreateApps }) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-text-secondary\">\n {apps.length}{\" \"}\n {apps.length !== 1\n ? tr(\"devportal.applications\", \"applications\")\n : tr(\"devportal.application\", \"application\")}\n </p>\n {canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : null}\n </div>\n\n {apps.length > 0 ? (\n <div className=\"space-y-2\">\n {apps.map((app) => (\n <AppListItem\n key={app.id}\n app={app}\n onClick={() => onNavigate(`/apps/${app.id}`)}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n icon={<AppWindow size={32} />}\n title={tr(\"devportal.noApplications\", \"No applications\")}\n description={tr(\n \"devportal.createFirstAppForOrg\",\n \"Create your first application for this organization\",\n )}\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : undefined\n }\n />\n )}\n </div>\n );\n};\n\n// Members Tab\nconst MembersTab: FC<{\n members: DeveloperOrgMember[];\n onNavigate: (path: string) => void;\n orgId: string;\n canInviteMembers: boolean;\n}> = ({ members, onNavigate, orgId, canInviteMembers }) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-text-secondary\">\n {members.length}{\" \"}\n {members.length !== 1\n ? tr(\"devportal.membersLower\", \"members\")\n : tr(\"devportal.memberLower\", \"member\")}\n </p>\n {canInviteMembers ? (\n <button\n onClick={() => onNavigate(`/organizations/${orgId}/members`)}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {tr(\"devportal.inviteMember\", \"Invite Member\")}\n </button>\n ) : null}\n </div>\n\n <DataTable\n data={members}\n keyField=\"id\"\n columns={[\n {\n key: \"email\",\n header: tr(\"devportal.memberColumn\", \"Member\"),\n render: (member) => (\n <div className=\"flex items-center gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-medium text-primary\">\n {member.email?.charAt(0).toUpperCase() || \"U\"}\n </div>\n <span className=\"font-medium\">{member.email}</span>\n </div>\n ),\n },\n {\n key: \"role\",\n header: tr(\"devportal.roleColumn\", \"Role\"),\n render: (member) => (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\",\n member.role === \"OWNER\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : member.role === \"ADMIN\"\n ? \"bg-status-info-bg-subtle text-status-info-text\"\n : member.role === \"DEVELOPER\"\n ? \"bg-status-success-bg-subtle text-status-success-text\"\n : \"bg-bg-sunken text-text-primary\",\n )}\n >\n {ORG_ROLE_LABELS[member.role]}\n </span>\n ),\n },\n {\n key: \"joinedAt\",\n header: tr(\"devportal.joinedColumn\", \"Joined\"),\n render: (member) => new Date(member.joinedAt).toLocaleDateString(),\n },\n ]}\n />\n </div>\n );\n};\n\n// Settings Tab\nconst SettingsTab: FC<{ org: DeveloperOrganization }> = ({ org }) => {\n const { t } = useI18n();\n const { allowed: canUpdate } = useDevportalPermission(\n DEVPORTAL_PERMISSIONS.ORG_UPDATE,\n );\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [profileForm, setProfileForm] = useState({\n name: org.name,\n description: org.description ?? \"\",\n websiteUrl: org.websiteUrl ?? \"\",\n contactEmail: org.contactEmail ?? \"\",\n supportEmail: org.supportEmail ?? \"\",\n logoUrl: org.logoUrl ?? \"\",\n bannerUrl: org.bannerUrl ?? \"\",\n });\n const [legalForm, setLegalForm] = useState({\n legalEntityName: org.legalEntityName ?? \"\",\n legalEntityType: org.legalEntityType ?? \"\",\n });\n const [taxForm, setTaxForm] = useState({\n taxId: org.taxId ?? \"\",\n taxCountry: org.taxCountry ?? \"\",\n });\n const [saveMessage, setSaveMessage] = useState<string | null>(null);\n const [saveError, setSaveError] = useState<string | null>(null);\n const [verifyMethod, setVerifyMethod] = useState<string>(\"manual\");\n const [verifySuccess, setVerifySuccess] = useState(false);\n const [updateOrganization, { loading: updatingOrg }] =\n useUpdateOrganizationMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n const [updateOrgLegalInfo, { loading: updatingLegal }] =\n useUpdateOrgLegalInfoMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n const [updateOrgTaxInfo, { loading: updatingTax }] =\n useUpdateOrgTaxInfoMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n const [requestVerification, { loading: verifying }] =\n useRequestOrgVerificationMutation({\n onCompleted: () => setVerifySuccess(true),\n });\n\n useEffect(() => {\n setProfileForm({\n name: org.name,\n description: org.description ?? \"\",\n websiteUrl: org.websiteUrl ?? \"\",\n contactEmail: org.contactEmail ?? \"\",\n supportEmail: org.supportEmail ?? \"\",\n logoUrl: org.logoUrl ?? \"\",\n bannerUrl: org.bannerUrl ?? \"\",\n });\n setLegalForm({\n legalEntityName: org.legalEntityName ?? \"\",\n legalEntityType: org.legalEntityType ?? \"\",\n });\n setTaxForm({\n taxId: org.taxId ?? \"\",\n taxCountry: org.taxCountry ?? \"\",\n });\n }, [org]);\n\n const handleProfileSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrganization({\n variables: {\n id: org.id,\n input: {\n name: profileForm.name.trim() || undefined,\n description: profileForm.description.trim() || null,\n websiteUrl: profileForm.websiteUrl.trim() || null,\n contactEmail: profileForm.contactEmail.trim() || null,\n supportEmail: profileForm.supportEmail.trim() || null,\n logoUrl: profileForm.logoUrl.trim() || null,\n bannerUrl: profileForm.bannerUrl.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.organizationUpdated\", \"Organization details updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateOrganization\",\n \"Failed to update organization\",\n ),\n );\n }\n };\n\n const handleLegalSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrgLegalInfo({\n variables: {\n id: org.id,\n input: {\n legalEntityName: legalForm.legalEntityName.trim() || null,\n legalEntityType: legalForm.legalEntityType.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.legalInfoUpdated\", \"Legal information updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateLegalInfo\",\n \"Failed to update legal information\",\n ),\n );\n }\n };\n\n const handleTaxSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrgTaxInfo({\n variables: {\n id: org.id,\n input: {\n taxId: taxForm.taxId.trim() || null,\n taxCountry: taxForm.taxCountry.trim() || null,\n },\n },\n });\n setSaveMessage(tr(\"devportal.taxInfoUpdated\", \"Tax information updated\"));\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateTaxInfo\",\n \"Failed to update tax information\",\n ),\n );\n }\n };\n\n return (\n <div className=\"space-y-6 max-w-2xl\">\n {saveError && (\n <div className=\"rounded-md border border-status-error-bg bg-status-error-bg-subtle px-4 py-3 text-sm text-status-error-text\">\n {saveError}\n </div>\n )}\n {saveMessage && (\n <div className=\"rounded-md border border-status-success-bg bg-status-success-bg-subtle px-4 py-3 text-sm text-status-success-text\">\n {saveMessage}\n </div>\n )}\n <PageSection\n title={tr(\"devportal.organizationDetails\", \"Organization Details\")}\n >\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.organizationName\", \"Organization Name\")}\n value={profileForm.name}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n name: event.target.value,\n }))\n }\n disabled={!canUpdate}\n required\n />\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={org.slug}\n disabled\n hint={tr(\"devportal.slugReadOnly\", \"Slug cannot be changed here\")}\n />\n </div>\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={profileForm.description}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n description: event.target.value,\n }))\n }\n disabled={!canUpdate}\n rows={4}\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.website\", \"Website\")}\n type=\"url\"\n value={profileForm.websiteUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n websiteUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={profileForm.contactEmail}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n contactEmail: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={profileForm.supportEmail}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n supportEmail: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.logoUrl\", \"Logo URL\")}\n type=\"url\"\n value={profileForm.logoUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n logoUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n </div>\n <InputField\n label={tr(\"devportal.bannerUrl\", \"Banner URL\")}\n type=\"url\"\n value={profileForm.bannerUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n bannerUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <DetailList\n items={[\n {\n label: tr(\"devportal.organizationId\", \"Organization ID\"),\n value: <code className=\"text-xs\">{org.id}</code>,\n },\n { label: tr(\"devportal.tier\", \"Tier\"), value: org.tier },\n {\n label: tr(\"devportal.partnerTier\", \"Partner Tier\"),\n value: org.partnerTier || tr(\"devportal.none\", \"None\"),\n },\n {\n label: tr(\"devportal.created\", \"Created\"),\n value: new Date(org.createdAt).toLocaleDateString(),\n },\n {\n label: tr(\"devportal.platformFeeRate\", \"Platform Fee Rate\"),\n value: `${(org.platformFeeRate * 100).toFixed(0)}%`,\n },\n ]}\n />\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingOrg}\n onClick={() => void handleProfileSave()}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {updatingOrg ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Settings size={14} />\n )}\n {tr(\"devportal.saveChanges\", \"Save Changes\")}\n </button>\n </div>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.legalInformation\", \"Legal Information\")}\n >\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.legalEntityName\", \"Legal Entity Name\")}\n value={legalForm.legalEntityName}\n onChange={(event) =>\n setLegalForm((current) => ({\n ...current,\n legalEntityName: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.entityType\", \"Entity Type\")}\n value={legalForm.legalEntityType}\n onChange={(event) =>\n setLegalForm((current) => ({\n ...current,\n legalEntityType: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.taxId\", \"Tax ID\")}\n value={taxForm.taxId}\n onChange={(event) =>\n setTaxForm((current) => ({\n ...current,\n taxId: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.taxCountry\", \"Tax Country\")}\n value={taxForm.taxCountry}\n onChange={(event) =>\n setTaxForm((current) => ({\n ...current,\n taxCountry: event.target.value.toUpperCase(),\n }))\n }\n disabled={!canUpdate}\n />\n </div>\n <DetailList\n items={[\n {\n label: tr(\"devportal.taxForm\", \"Tax Form\"),\n value:\n org.taxFormType ||\n tr(\"devportal.notSubmitted\", \"Not submitted\"),\n },\n {\n label: tr(\"devportal.taxFormStatus\", \"Tax Form Status\"),\n value: org.taxFormVerified ? (\n <span className=\"text-status-success-text flex items-center gap-1\">\n <CheckCircle size={14} />{\" \"}\n {tr(\"devportal.verified\", \"Verified\")}\n </span>\n ) : (\n tr(\"devportal.pendingVerification\", \"Pending verification\")\n ),\n },\n ]}\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingLegal}\n onClick={() => void handleLegalSave()}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-seam px-4 py-2 text-sm font-medium hover:bg-bg-sunken disabled:opacity-50\"\n >\n {updatingLegal ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : null}\n {tr(\"devportal.saveLegalInfo\", \"Save Legal Info\")}\n </button>\n <button\n type=\"button\"\n disabled={!canUpdate || updatingTax}\n onClick={() => void handleTaxSave()}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {updatingTax ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : null}\n {tr(\"devportal.saveTaxInfo\", \"Save Tax Info\")}\n </button>\n </div>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.verificationStatus\", \"Verification Status\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.verifiedLabel\", \"Verified\"),\n value: org.isVerified ? (\n <span className=\"text-status-success-text flex items-center gap-1\">\n <CheckCircle size={14} />{\" \"}\n {tr(\"devportal.verifiedVia\", \"Verified via\")}{\" \"}\n {org.verificationMethod}\n </span>\n ) : (\n tr(\"devportal.notVerified\", \"Not verified\")\n ),\n },\n {\n label: tr(\"devportal.certifiedLabel\", \"Certified\"),\n value: org.isCertified ? (\n <span className=\"text-accent-blue flex items-center gap-1\">\n <Shield size={14} />{\" \"}\n {tr(\"devportal.certifiedUntil\", \"Certified until\")}{\" \"}\n {org.certificationExpiry\n ? new Date(org.certificationExpiry).toLocaleDateString()\n : \"N/A\"}\n </span>\n ) : (\n tr(\"devportal.notCertified\", \"Not certified\")\n ),\n },\n ]}\n />\n {!org.isVerified && (\n <div className=\"mt-4 rounded-md border border-border-subtle p-4 space-y-3\">\n {verifySuccess ? (\n <p className=\"text-sm text-status-success-text flex items-center gap-2\">\n <CheckCircle size={14} />\n {tr(\n \"devportal.verificationRequested\",\n \"Verification request submitted. Our team will review and contact you.\",\n )}\n </p>\n ) : (\n <>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"devportal.requestVerificationHint\",\n \"Get your organization verified to build trust with users. Choose a verification method:\",\n )}\n </p>\n <div className=\"flex gap-2 flex-wrap\">\n {[\"domain\", \"document\", \"manual\"].map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setVerifyMethod(m)}\n className={`rounded-md border px-3 py-1 text-xs font-medium transition-colors ${\n verifyMethod === m\n ? \"bg-action-primary-bg text-action-primary-text border-primary\"\n : \"border-border-subtle hover:bg-bg-sunken\"\n }`}\n >\n {m === \"domain\"\n ? tr(\"devportal.domainVerification\", \"Domain\")\n : m === \"document\"\n ? tr(\"devportal.documentVerification\", \"Document\")\n : tr(\"devportal.manualVerification\", \"Manual review\")}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n disabled={verifying}\n onClick={() =>\n requestVerification({\n variables: { id: org.id, method: verifyMethod },\n })\n }\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {verifying ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Shield size={14} />\n )}\n {tr(\"devportal.requestVerification\", \"Request Verification\")}\n </button>\n </>\n )}\n </div>\n )}\n </PageSection>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"OrganizationDetailPage.js","names":[],"sources":["../../../src/devportal/pages/OrganizationDetailPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n Building2,\n Users,\n AppWindow,\n DollarSign,\n Settings,\n ExternalLink,\n CheckCircle,\n BarChart3,\n TrendingUp,\n ArrowRight,\n Plus,\n Shield,\n Loader2,\n AlertCircle,\n} from \"lucide-react\";\nimport { EmphasisPanel, NextSteps } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { DataTable, DetailList } from \"../components/DataTable\";\nimport { AppListItem } from \"../components/AppCard\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { InputField, TextareaField } from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport type {\n DeveloperOrganization,\n Application,\n DeveloperOrgMember,\n} from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { ORG_ROLE_LABELS } from \"../utils/constants\";\nimport { graphqlFetch } from \"@burdenoff/fe-libs/shared/graphql\";\nimport {\n useGetOrganizationQuery,\n useGetApplicationsQuery,\n useUpdateOrganizationMutation,\n useUpdateOrgLegalInfoMutation,\n useUpdateOrgTaxInfoMutation,\n} from \"../../generated/global-operations\";\nimport type {\n OrganizationFieldsFragment,\n OrgMemberFieldsFragment,\n ApplicationFieldsFragment,\n} from \"../../generated/global-operations\";\n\nconst ORGANIZATION_VERIFICATION_QUERY = `\n query OrganizationVerificationDetails($id: ID!) {\n developerOrganization(id: $id) {\n id\n verificationMethod\n verificationRequestedAt\n verificationStatus\n verificationRequestNotes\n verificationEvidenceUrl\n verificationDomain\n verificationRequestedBy\n verificationReviewedAt\n verificationReviewedBy\n verificationReviewNotes\n verificationRejectedReason\n }\n }\n`;\n\nconst REQUEST_ORG_VERIFICATION_MUTATION = `\n mutation RequestOrgVerificationExtended(\n $id: ID!\n $method: String!\n $notes: String\n $evidenceUrl: String\n $domain: String\n ) {\n requestOrgVerification(\n id: $id\n method: $method\n notes: $notes\n evidenceUrl: $evidenceUrl\n domain: $domain\n ) {\n id\n verificationMethod\n verificationRequestedAt\n verificationStatus\n verificationRequestNotes\n verificationEvidenceUrl\n verificationDomain\n verificationRejectedReason\n }\n }\n`;\n\n/**\n * Map GraphQL organization fragment to local type\n */\nfunction mapOrganization(\n org: OrganizationFieldsFragment,\n): DeveloperOrganization {\n const rawOrg = org as unknown as Record<string, unknown>;\n return {\n id: org.id,\n name: org.name,\n slug: org.slug,\n description: org.description ?? undefined,\n logoUrl: org.logoUrl ?? undefined,\n bannerUrl: org.bannerUrl ?? undefined,\n websiteUrl: org.websiteUrl ?? undefined,\n contactEmail: org.contactEmail ?? undefined,\n supportEmail: org.supportEmail ?? undefined,\n tier: org.tier as DeveloperOrganization[\"tier\"],\n partnerTier:\n (org.partnerTier as DeveloperOrganization[\"partnerTier\"]) ?? undefined,\n partnerSince: org.partnerSince ?? undefined,\n isVerified: org.isVerified ?? false,\n verifiedAt: org.verifiedAt ?? undefined,\n verificationMethod: org.verificationMethod ?? undefined,\n verificationRequestedAt:\n typeof rawOrg.verificationRequestedAt === \"string\"\n ? rawOrg.verificationRequestedAt\n : undefined,\n verificationStatus:\n (rawOrg.verificationStatus as DeveloperOrganization[\"verificationStatus\"]) ??\n (org.isVerified ? \"VERIFIED\" : \"UNVERIFIED\"),\n verificationRequestNotes:\n typeof rawOrg.verificationRequestNotes === \"string\"\n ? rawOrg.verificationRequestNotes\n : undefined,\n verificationEvidenceUrl:\n typeof rawOrg.verificationEvidenceUrl === \"string\"\n ? rawOrg.verificationEvidenceUrl\n : undefined,\n verificationDomain:\n typeof rawOrg.verificationDomain === \"string\"\n ? rawOrg.verificationDomain\n : undefined,\n verificationRequestedBy:\n typeof rawOrg.verificationRequestedBy === \"string\"\n ? rawOrg.verificationRequestedBy\n : undefined,\n verificationReviewedAt:\n typeof rawOrg.verificationReviewedAt === \"string\"\n ? rawOrg.verificationReviewedAt\n : undefined,\n verificationReviewedBy:\n typeof rawOrg.verificationReviewedBy === \"string\"\n ? rawOrg.verificationReviewedBy\n : undefined,\n verificationReviewNotes:\n typeof rawOrg.verificationReviewNotes === \"string\"\n ? rawOrg.verificationReviewNotes\n : undefined,\n verificationRejectedReason:\n typeof rawOrg.verificationRejectedReason === \"string\"\n ? rawOrg.verificationRejectedReason\n : undefined,\n isCertified: org.isCertified ?? false,\n certifiedAt: org.certifiedAt ?? undefined,\n totalApps: org.totalApps ?? 0,\n publishedApps: org.publishedApps ?? 0,\n totalInstalls: org.totalInstalls ?? 0,\n activeInstalls: org.activeInstalls ?? 0,\n totalApiCalls: org.totalApiCalls ?? \"0\",\n averageRating: org.averageRating ?? undefined,\n totalRevenue: org.totalRevenue ?? 0,\n totalPlatformFees: org.totalPlatformFees ?? 0,\n totalPayouts: org.totalPayouts ?? 0,\n pendingBalance: org.pendingBalance ?? 0,\n lifetimeRevenue: org.lifetimeRevenue ?? 0,\n platformFeeRate: org.platformFeeRate ?? 0.3,\n apiCallsLimit: org.apiCallsLimit ?? 100000,\n storageLimit: org.storageLimit ?? \"1073741824\",\n apiCallsUsed: org.apiCallsUsed ?? \"0\",\n storageUsed: org.storageUsed ?? \"0\",\n taxId: org.taxId ?? undefined,\n taxCountry: org.taxCountry ?? undefined,\n taxFormVerified: org.taxFormVerified ?? false,\n legalEntityName: org.legalEntityName ?? undefined,\n legalEntityType: org.legalEntityType ?? undefined,\n createdAt: org.createdAt,\n updatedAt: org.updatedAt,\n };\n}\n\n/**\n * Map GraphQL member fragment to local type\n */\nfunction mapMember(member: OrgMemberFieldsFragment): DeveloperOrgMember {\n return {\n id: member.id,\n organizationId: member.organizationId,\n userId: member.userId,\n email: member.email ?? undefined,\n role: member.role as DeveloperOrgMember[\"role\"],\n isActive: member.isActive ?? true,\n isSuspended: member.isSuspended ?? false,\n suspendedAt: member.suspendedAt ?? undefined,\n suspendedReason: member.suspendedReason ?? undefined,\n joinedAt: member.joinedAt,\n permissions: member.permissions ?? undefined,\n invitedBy: member.invitedBy ?? undefined,\n invitationId: member.invitationId ?? undefined,\n createdAt: member.createdAt,\n updatedAt: member.updatedAt,\n };\n}\n\ntype TabId = \"overview\" | \"apps\" | \"members\" | \"settings\";\n\ninterface VerificationDetails {\n verificationMethod?: string;\n verificationRequestedAt?: string;\n verificationStatus?: \"UNVERIFIED\" | \"PENDING\" | \"VERIFIED\" | \"REJECTED\";\n verificationRequestNotes?: string;\n verificationEvidenceUrl?: string;\n verificationDomain?: string;\n verificationRequestedBy?: string;\n verificationReviewedAt?: string;\n verificationReviewedBy?: string;\n verificationReviewNotes?: string;\n verificationRejectedReason?: string;\n}\n\nfunction isLikelyDomain(value: string): boolean {\n const trimmed = value.trim().toLowerCase();\n return /^[a-z0-9.-]+\\.[a-z]{2,}$/i.test(trimmed) && !trimmed.includes(\"@\");\n}\n\nfunction isLikelyUrl(value: string): boolean {\n try {\n const url = new URL(value.trim());\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction isLikelyEmail(value: string): boolean {\n const trimmed = value.trim();\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed);\n}\n\nconst ORG_ROLE_PRIORITY: Record<DeveloperOrgMember[\"role\"], number> = {\n VIEWER: 0,\n DEVELOPER: 1,\n ADMIN: 2,\n OWNER: 3,\n};\n\n/**\n * Organization detail page\n */\nexport const OrganizationDetailPage: FC = () => {\n const { navigate, basePath, setActiveOrgId, currentUser } = useDevportal();\n const { orgId: id } = useParams<{ orgId: string }>();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [activeTab, setActiveTab] = useState<TabId>(\"overview\");\n\n const allTabs: Array<{\n id: TabId;\n label: string;\n icon: FC<{ size?: number }>;\n }> = [\n {\n id: \"overview\",\n label: tr(\"devportal.overview\", \"Overview\"),\n icon: Building2,\n },\n {\n id: \"apps\",\n label: tr(\"devportal.applications\", \"Applications\"),\n icon: AppWindow,\n },\n { id: \"members\", label: tr(\"devportal.members\", \"Members\"), icon: Users },\n {\n id: \"settings\",\n label: tr(\"devportal.settings\", \"Settings\"),\n icon: Settings,\n },\n ];\n\n // Fetch organization data\n const { data, previousData, loading, error } = useGetOrganizationQuery({\n variables: { id: id! },\n skip: !id,\n });\n const resolvedData = data ?? previousData;\n\n const { data: appsData } = useGetApplicationsQuery({\n variables: { limit: 50, organizationId: id },\n skip: !id,\n fetchPolicy: \"cache-and-network\",\n });\n\n const provisionalMembers: DeveloperOrgMember[] = (\n resolvedData?.developerOrganization?.members ?? []\n ).map(mapMember);\n const currentMembership = currentUser\n ? provisionalMembers.find(\n (member: DeveloperOrgMember) => member.userId === currentUser.id,\n )\n : undefined;\n const currentRole: DeveloperOrgMember[\"role\"] | undefined =\n currentMembership?.role;\n const canCreateApps =\n currentRole !== undefined &&\n ORG_ROLE_PRIORITY[currentRole] >= ORG_ROLE_PRIORITY.DEVELOPER;\n const canManageOrg =\n currentRole !== undefined &&\n ORG_ROLE_PRIORITY[currentRole] >= ORG_ROLE_PRIORITY.ADMIN;\n const canViewRevenue = canManageOrg;\n const canInviteMembers = canManageOrg;\n const tabs = allTabs.filter((tab) => tab.id !== \"settings\" || canManageOrg);\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n // Sync activeOrgId so the dashboard scopes to whichever org the user is browsing\n useEffect(() => {\n if (id) setActiveOrgId(id);\n }, [id, setActiveOrgId]);\n\n useEffect(() => {\n if (activeTab === \"settings\" && !canManageOrg) {\n setActiveTab(\"overview\");\n }\n }, [activeTab, canManageOrg]);\n\n // Register org name in breadcrumb registry so the URL ID shows as the org name\n useEffect(() => {\n const name = resolvedData?.developerOrganization?.name;\n if (!id || !name) return;\n const reg = (\n window as unknown as {\n __breadcrumbRegistry?: {\n register: (id: string, name: string) => void;\n unregister: (id: string) => void;\n };\n }\n ).__breadcrumbRegistry;\n reg?.register(id, name);\n return () => reg?.unregister(id);\n }, [id, data?.developerOrganization?.name]);\n\n // Loading state — only block on initial load, not refetches (keeps SettingsTab mounted)\n if (loading && !resolvedData) {\n return (\n <PageLayout\n title={tr(\"devportal.loadingDots\", \"Loading...\")}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n </div>\n </PageLayout>\n );\n }\n\n // Error state\n if (error || !resolvedData?.developerOrganization) {\n return (\n <PageLayout\n title={tr(\"devportal.organizationNotFound\", \"Organization Not Found\")}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n <div className=\"flex flex-col items-center justify-center py-12 gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-lg font-semibold\">\n {tr(\n \"devportal.organizationNotFoundLower\",\n \"Organization not found\",\n )}\n </h2>\n <p className=\"text-text-secondary\">\n {error?.message ||\n tr(\n \"devportal.organizationNotFoundDescription\",\n \"The organization you're looking for doesn't exist or you don't have access to it.\",\n )}\n </p>\n <button\n onClick={() => handleNavigate(\"/organizations\")}\n className=\"mt-4 inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n // Map GraphQL data to local types\n const org = mapOrganization(resolvedData!.developerOrganization!);\n const members = provisionalMembers;\n const apps = (appsData?.applications?.edges?.map(\n (e: { node: ApplicationFieldsFragment }) => e.node,\n ) ?? []) as Application[];\n\n return (\n <PageLayout\n title={org.name}\n description={org.description}\n purpose={tr(\n \"devportal.orgDetailPurpose\",\n \"This is the home for one organization — the apps it owns, the people who can work on them, and its store and billing settings. Invite teammates, add apps, and verify the org so your published listings look trustworthy.\",\n )}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n actions={\n <div className=\"flex items-center gap-2\">\n {canViewRevenue ? (\n <button\n onClick={() =>\n navigate?.(\n `/billing/earnings?developerOrgId=${encodeURIComponent(org.id)}&developerOrgName=${encodeURIComponent(org.name)}`,\n )\n }\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors\"\n >\n <DollarSign size={16} />\n {tr(\"devportal.revenue\", \"Revenue\")}\n </button>\n ) : null}\n </div>\n }\n >\n {/* Tabs */}\n <div className=\"border-b\">\n <nav\n className=\"-mb-px flex gap-4 overflow-x-auto\"\n role=\"tablist\"\n aria-label={tr(\n \"devportal.organizationSections\",\n \"Organization sections\",\n )}\n >\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n id={`organization-tab-${tab.id}`}\n role=\"tab\"\n aria-selected={activeTab === tab.id}\n aria-controls={`organization-panel-${tab.id}`}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"flex items-center gap-2 border-b-2 px-1 py-3 text-sm font-medium transition-colors\",\n activeTab === tab.id\n ? \"border-primary text-primary\"\n : \"border-transparent text-text-secondary hover:text-text-primary hover:border-muted-foreground\",\n )}\n >\n <Icon size={16} />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n {/* Guided next steps (dismissable) */}\n <NextSteps\n className=\"mt-6\"\n storageKey={`devportal-org-${org.id}`}\n steps={[\n ...(canInviteMembers\n ? [\n {\n id: \"invite-members\",\n label: tr(\"devportal.inviteMembers\", \"Invite members\"),\n description: tr(\n \"devportal.orgStepInvite\",\n \"Add teammates so they can build alongside you\",\n ),\n icon: <Users size={16} />,\n onClick: () => setActiveTab(\"members\"),\n },\n ]\n : []),\n ...(canCreateApps\n ? [\n {\n id: \"create-app\",\n label: tr(\"devportal.createApp\", \"Create App\"),\n description: tr(\n \"devportal.orgStepCreateApp\",\n \"Build a new application under this organization\",\n ),\n icon: <AppWindow size={16} />,\n onClick: () => handleNavigate(\"/apps/new\"),\n },\n ]\n : []),\n ...(canManageOrg\n ? [\n {\n id: \"settings\",\n label: tr(\n \"devportal.orgStepVerify\",\n \"Complete organization profile\",\n ),\n description: tr(\n \"devportal.orgStepVerifyDesc\",\n \"Add a logo and details, then request verification\",\n ),\n icon: <Settings size={16} />,\n onClick: () => setActiveTab(\"settings\"),\n done: Boolean(org.isVerified),\n },\n ]\n : []),\n ]}\n />\n\n {/* Tab content */}\n <div\n className=\"mt-6\"\n id={`organization-panel-${activeTab}`}\n role=\"tabpanel\"\n aria-labelledby={`organization-tab-${activeTab}`}\n tabIndex={0}\n >\n {activeTab === \"overview\" && (\n <OverviewTab\n org={org}\n apps={apps}\n members={members}\n canCreateApps={canCreateApps}\n canViewRevenue={canViewRevenue}\n onNavigate={handleNavigate}\n onShowApps={() => setActiveTab(\"apps\")}\n />\n )}\n {activeTab === \"apps\" && (\n <AppsTab\n apps={apps}\n onNavigate={handleNavigate}\n canCreateApps={canCreateApps}\n />\n )}\n {activeTab === \"members\" && (\n <MembersTab\n members={members}\n onNavigate={handleNavigate}\n orgId={org.id}\n canInviteMembers={canInviteMembers}\n />\n )}\n {activeTab === \"settings\" && canManageOrg && <SettingsTab org={org} />}\n </div>\n </PageLayout>\n );\n};\n\n// Overview Tab\nconst OverviewTab: FC<{\n org: DeveloperOrganization;\n apps: Application[];\n members: DeveloperOrgMember[];\n canCreateApps: boolean;\n canViewRevenue: boolean;\n onNavigate: (path: string) => void;\n onShowApps: () => void;\n}> = ({\n org,\n apps,\n members,\n canCreateApps,\n canViewRevenue,\n onNavigate,\n onShowApps,\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n return (\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Stats — primary emphasis zone */}\n <EmphasisPanel>\n <StatCardGrid columns={canViewRevenue ? 4 : 3}>\n <StatCard\n title={tr(\"devportal.publishedApps\", \"Published Apps\")}\n value={`${org.publishedApps}/${org.totalApps}`}\n icon={<AppWindow size={20} />}\n />\n <StatCard\n title={tr(\"devportal.totalInstalls\", \"Total Installs\")}\n value={org.totalInstalls.toLocaleString()}\n icon={<TrendingUp size={20} />}\n />\n {canViewRevenue ? (\n <StatCard\n title={tr(\"devportal.totalRevenue\", \"Total Revenue\")}\n value={`$${org.totalRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n ) : null}\n <StatCard\n title={tr(\"devportal.avgRating\", \"Avg Rating\")}\n value={\n org.averageRating\n ? `${org.averageRating.toFixed(1)} ★`\n : tr(\"devportal.notAvailable\", \"N/A\")\n }\n icon={<BarChart3 size={20} />}\n />\n </StatCardGrid>\n </EmphasisPanel>\n\n {/* Recent Apps */}\n <PageSection\n title={tr(\"devportal.recentApplications\", \"Recent Applications\")}\n actions={\n <button\n onClick={onShowApps}\n className=\"text-sm text-primary hover:underline flex items-center gap-1\"\n >\n {tr(\"devportal.viewAll\", \"View all\")} <ArrowRight size={14} />\n </button>\n }\n >\n {apps.length > 0 ? (\n <div className=\"space-y-2\">\n {apps.slice(0, 3).map((app) => (\n <AppListItem\n key={app.id}\n app={app}\n onClick={() => onNavigate(`/apps/${app.id}`)}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n icon={<AppWindow size={24} />}\n title={tr(\"devportal.noApplications\", \"No applications\")}\n description={tr(\n \"devportal.createYourFirstApplication\",\n \"Create your first application\",\n )}\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : undefined\n }\n />\n )}\n </PageSection>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Quick Stats */}\n {canViewRevenue ? (\n <PageSection\n title={tr(\"devportal.revenueSummary\", \"Revenue Summary\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.totalRevenue\", \"Total Revenue\"),\n value: `$${org.totalRevenue.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.platformFees\", \"Platform Fees\"),\n value: `$${org.totalPlatformFees.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.netPayouts\", \"Net Payouts\"),\n value: `$${org.totalPayouts.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.pendingBalance\", \"Pending Balance\"),\n value: `$${org.pendingBalance.toLocaleString()}`,\n },\n {\n label: tr(\"devportal.lifetimeRevenue\", \"Lifetime Revenue\"),\n value: `$${org.lifetimeRevenue.toLocaleString()}`,\n },\n ]}\n />\n </PageSection>\n ) : null}\n\n {/* Team */}\n <PageSection\n title={tr(\"devportal.teamMembers\", \"Team Members\")}\n actions={\n <button\n onClick={() => onNavigate(`/organizations/${org.id}/members`)}\n className=\"text-sm text-primary hover:underline\"\n >\n {tr(\"devportal.manage\", \"Manage\")}\n </button>\n }\n >\n <div className=\"space-y-2\">\n {members.slice(0, 3).map((member) => (\n <div\n key={member.id}\n className=\"flex items-center justify-between py-2\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-medium text-primary\">\n {member.email?.charAt(0).toUpperCase() || \"U\"}\n </div>\n <div>\n <p className=\"text-sm font-medium\">{member.email}</p>\n <p className=\"text-xs text-text-secondary\">\n {ORG_ROLE_LABELS[member.role]}\n </p>\n </div>\n </div>\n </div>\n ))}\n {members.length > 3 && (\n <p className=\"text-xs text-text-secondary\">\n +{members.length - 3}{\" \"}\n {tr(\"devportal.moreMembers\", \"more members\")}\n </p>\n )}\n </div>\n </PageSection>\n\n {/* Links */}\n <PageSection title={tr(\"devportal.links\", \"Links\")}>\n <div className=\"space-y-2\">\n {org.websiteUrl && (\n <a\n href={org.websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-sm text-primary hover:underline\"\n >\n <ExternalLink size={14} />\n {tr(\"devportal.website\", \"Website\")}\n </a>\n )}\n {org.contactEmail && (\n <a\n href={`mailto:${org.contactEmail}`}\n className=\"flex items-center gap-2 text-sm text-primary hover:underline\"\n >\n <ExternalLink size={14} />\n {org.contactEmail}\n </a>\n )}\n </div>\n </PageSection>\n </div>\n </div>\n );\n};\n\n// Apps Tab\nconst AppsTab: FC<{\n apps: Application[];\n onNavigate: (path: string) => void;\n canCreateApps: boolean;\n}> = ({ apps, onNavigate, canCreateApps }) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-text-secondary\">\n {apps.length}{\" \"}\n {apps.length !== 1\n ? tr(\"devportal.applications\", \"applications\")\n : tr(\"devportal.application\", \"application\")}\n </p>\n {canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : null}\n </div>\n\n {apps.length > 0 ? (\n <div className=\"space-y-2\">\n {apps.map((app) => (\n <AppListItem\n key={app.id}\n app={app}\n onClick={() => onNavigate(`/apps/${app.id}`)}\n />\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n icon={<AppWindow size={32} />}\n title={tr(\"devportal.noApplications\", \"No applications\")}\n description={tr(\n \"devportal.createFirstAppForOrg\",\n \"Create your first application for this organization\",\n )}\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(\"/apps/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {tr(\"devportal.createApp\", \"Create App\")}\n </button>\n ) : undefined\n }\n />\n )}\n </div>\n );\n};\n\n// Members Tab\nconst MembersTab: FC<{\n members: DeveloperOrgMember[];\n onNavigate: (path: string) => void;\n orgId: string;\n canInviteMembers: boolean;\n}> = ({ members, onNavigate, orgId, canInviteMembers }) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-text-secondary\">\n {members.length}{\" \"}\n {members.length !== 1\n ? tr(\"devportal.membersLower\", \"members\")\n : tr(\"devportal.memberLower\", \"member\")}\n </p>\n {canInviteMembers ? (\n <button\n onClick={() => onNavigate(`/organizations/${orgId}/members`)}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {tr(\"devportal.inviteMember\", \"Invite Member\")}\n </button>\n ) : null}\n </div>\n\n <DataTable\n data={members}\n keyField=\"id\"\n columns={[\n {\n key: \"email\",\n header: tr(\"devportal.memberColumn\", \"Member\"),\n render: (member) => (\n <div className=\"flex items-center gap-3\">\n <div className=\"h-8 w-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-medium text-primary\">\n {member.email?.charAt(0).toUpperCase() || \"U\"}\n </div>\n <span className=\"font-medium\">{member.email}</span>\n </div>\n ),\n },\n {\n key: \"role\",\n header: tr(\"devportal.roleColumn\", \"Role\"),\n render: (member) => (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\",\n member.role === \"OWNER\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : member.role === \"ADMIN\"\n ? \"bg-status-info-bg-subtle text-status-info-text\"\n : member.role === \"DEVELOPER\"\n ? \"bg-status-success-bg-subtle text-status-success-text\"\n : \"bg-bg-sunken text-text-primary\",\n )}\n >\n {ORG_ROLE_LABELS[member.role]}\n </span>\n ),\n },\n {\n key: \"joinedAt\",\n header: tr(\"devportal.joinedColumn\", \"Joined\"),\n render: (member) => new Date(member.joinedAt).toLocaleDateString(),\n },\n ]}\n />\n </div>\n );\n};\n\n// Settings Tab\nconst SettingsTab: FC<{ org: DeveloperOrganization }> = ({ org }) => {\n const { t } = useI18n();\n const { allowed: canUpdate } = useDevportalPermission(\n DEVPORTAL_PERMISSIONS.ORG_UPDATE,\n );\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [profileForm, setProfileForm] = useState({\n name: org.name,\n description: org.description ?? \"\",\n websiteUrl: org.websiteUrl ?? \"\",\n contactEmail: org.contactEmail ?? \"\",\n supportEmail: org.supportEmail ?? \"\",\n logoUrl: org.logoUrl ?? \"\",\n bannerUrl: org.bannerUrl ?? \"\",\n });\n const [legalForm, setLegalForm] = useState({\n legalEntityName: org.legalEntityName ?? \"\",\n legalEntityType: org.legalEntityType ?? \"\",\n });\n const [taxForm, setTaxForm] = useState({\n taxId: org.taxId ?? \"\",\n taxCountry: org.taxCountry ?? \"\",\n });\n const [saveMessage, setSaveMessage] = useState<string | null>(null);\n const [saveError, setSaveError] = useState<string | null>(null);\n const [verifyMethod, setVerifyMethod] = useState<string>(\"manual\");\n const [verifySuccess, setVerifySuccess] = useState(false);\n const [verificationNotes, setVerificationNotes] = useState(\"\");\n const [verificationEvidenceUrl, setVerificationEvidenceUrl] = useState(\"\");\n const [verificationDomain, setVerificationDomain] = useState(\"\");\n const [verificationDetails, setVerificationDetails] =\n useState<VerificationDetails | null>(null);\n const [verifying, setVerifying] = useState(false);\n const currentVerification = verificationDetails ?? {\n verificationMethod: org.verificationMethod,\n verificationRequestedAt: org.verificationRequestedAt,\n verificationStatus: org.verificationStatus,\n verificationRequestNotes: org.verificationRequestNotes,\n verificationRejectedReason: org.verificationRejectedReason,\n };\n const verificationReadinessIssues: string[] = [];\n if (!profileForm.contactEmail.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.contactEmailRequired\", \"Contact email is required\"));\n } else if (!isLikelyEmail(profileForm.contactEmail)) {\n verificationReadinessIssues.push(tr(\"devportal.contactEmailInvalid\", \"Contact email must be valid\"));\n }\n if (profileForm.supportEmail.trim() && !isLikelyEmail(profileForm.supportEmail)) {\n verificationReadinessIssues.push(tr(\"devportal.supportEmailInvalid\", \"Support email must be valid\"));\n }\n if (!profileForm.websiteUrl.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.websiteRequired\", \"Website URL is required\"));\n } else if (!isLikelyUrl(profileForm.websiteUrl)) {\n verificationReadinessIssues.push(tr(\"devportal.websiteInvalid\", \"Website URL must be valid\"));\n }\n if (!legalForm.legalEntityName.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.legalEntityNameRequired\", \"Legal entity name is required\"));\n }\n if (!legalForm.legalEntityType.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.legalEntityTypeRequired\", \"Entity type is required\"));\n }\n if (!taxForm.taxId.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.taxIdRequired\", \"Tax ID is required\"));\n }\n if (!taxForm.taxCountry.trim()) {\n verificationReadinessIssues.push(tr(\"devportal.taxCountryRequired\", \"Tax country is required\"));\n } else if (!/^[A-Za-z]{2}$/.test(taxForm.taxCountry.trim())) {\n verificationReadinessIssues.push(tr(\"devportal.taxCountryInvalid\", \"Tax country must be a 2-letter code\"));\n }\n const verificationFormIssues: string[] = [];\n if (verifyMethod === \"domain\" && !isLikelyDomain(verificationDomain.trim())) {\n verificationFormIssues.push(tr(\"devportal.verification.errors.domainRequired\", \"Enter a valid domain like burdenoff.com\"));\n }\n if (verifyMethod === \"document\" && !isLikelyUrl(verificationEvidenceUrl.trim())) {\n verificationFormIssues.push(tr(\"devportal.verification.errors.evidenceUrlRequired\", \"Enter a valid evidence URL starting with http:// or https://\"));\n }\n if (verifyMethod === \"manual\" && !verificationNotes.trim()) {\n verificationFormIssues.push(tr(\"devportal.verification.errors.notesRequired\", \"Add notes so the reviewer knows what to verify\"));\n }\n const canSubmitVerification =\n verificationReadinessIssues.length === 0 &&\n verificationFormIssues.length === 0 &&\n !verifying &&\n canUpdate;\n const [updateOrganization, { loading: updatingOrg }] =\n useUpdateOrganizationMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n const [updateOrgLegalInfo, { loading: updatingLegal }] =\n useUpdateOrgLegalInfoMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n const [updateOrgTaxInfo, { loading: updatingTax }] =\n useUpdateOrgTaxInfoMutation({\n refetchQueries: [\"GetOrganization\"],\n });\n useEffect(() => {\n setProfileForm({\n name: org.name,\n description: org.description ?? \"\",\n websiteUrl: org.websiteUrl ?? \"\",\n contactEmail: org.contactEmail ?? \"\",\n supportEmail: org.supportEmail ?? \"\",\n logoUrl: org.logoUrl ?? \"\",\n bannerUrl: org.bannerUrl ?? \"\",\n });\n setLegalForm({\n legalEntityName: org.legalEntityName ?? \"\",\n legalEntityType: org.legalEntityType ?? \"\",\n });\n setTaxForm({\n taxId: org.taxId ?? \"\",\n taxCountry: org.taxCountry ?? \"\",\n });\n }, [org.id]);\n\n useEffect(() => {\n if (!org.id) return;\n void graphqlFetch<{ developerOrganization: VerificationDetails | null }>({\n gateway: \"global\",\n query: ORGANIZATION_VERIFICATION_QUERY,\n variables: { id: org.id },\n })\n .then((result) =>\n setVerificationDetails(result.data?.developerOrganization ?? null)\n )\n .catch(() => setVerificationDetails(null));\n }, [org.id, verifySuccess]);\n\n const handleProfileSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrganization({\n variables: {\n id: org.id,\n input: {\n name: profileForm.name.trim() || undefined,\n description: profileForm.description.trim() || null,\n websiteUrl: profileForm.websiteUrl.trim() || null,\n contactEmail: profileForm.contactEmail.trim() || null,\n supportEmail: profileForm.supportEmail.trim() || null,\n logoUrl: profileForm.logoUrl.trim() || null,\n bannerUrl: profileForm.bannerUrl.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.organizationUpdated\", \"Organization details updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateOrganization\",\n \"Failed to update organization\",\n ),\n );\n }\n };\n\n const handleLegalSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrgLegalInfo({\n variables: {\n id: org.id,\n input: {\n legalEntityName: legalForm.legalEntityName.trim() || null,\n legalEntityType: legalForm.legalEntityType.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.legalInfoUpdated\", \"Legal information updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateLegalInfo\",\n \"Failed to update legal information\",\n ),\n );\n }\n };\n\n const handleTaxSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrgTaxInfo({\n variables: {\n id: org.id,\n input: {\n taxId: taxForm.taxId.trim() || null,\n taxCountry: taxForm.taxCountry.trim() || null,\n },\n },\n });\n setSaveMessage(tr(\"devportal.taxInfoUpdated\", \"Tax information updated\"));\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateTaxInfo\",\n \"Failed to update tax information\",\n ),\n );\n }\n };\n\n return (\n <div className=\"space-y-6 max-w-2xl\">\n {saveError && (\n <div className=\"rounded-md border border-status-error-bg bg-status-error-bg-subtle px-4 py-3 text-sm text-status-error-text\">\n {saveError}\n </div>\n )}\n {saveMessage && (\n <div className=\"rounded-md border border-status-success-bg bg-status-success-bg-subtle px-4 py-3 text-sm text-status-success-text\">\n {saveMessage}\n </div>\n )}\n <PageSection\n title={tr(\"devportal.organizationDetails\", \"Organization Details\")}\n >\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.organizationName\", \"Organization Name\")}\n value={profileForm.name}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n name: event.target.value,\n }))\n }\n disabled={!canUpdate}\n required\n />\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={org.slug}\n disabled\n hint={tr(\"devportal.slugReadOnly\", \"Slug cannot be changed here\")}\n />\n </div>\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={profileForm.description}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n description: event.target.value,\n }))\n }\n disabled={!canUpdate}\n rows={4}\n />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.website\", \"Website\")}\n type=\"url\"\n value={profileForm.websiteUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n websiteUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={profileForm.contactEmail}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n contactEmail: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={profileForm.supportEmail}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n supportEmail: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.logoUrl\", \"Logo URL\")}\n type=\"url\"\n value={profileForm.logoUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n logoUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n </div>\n <InputField\n label={tr(\"devportal.bannerUrl\", \"Banner URL\")}\n type=\"url\"\n value={profileForm.bannerUrl}\n onChange={(event) =>\n setProfileForm((current) => ({\n ...current,\n bannerUrl: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <DetailList\n items={[\n {\n label: tr(\"devportal.organizationId\", \"Organization ID\"),\n value: <code className=\"text-xs\">{org.id}</code>,\n },\n { label: tr(\"devportal.tier\", \"Tier\"), value: org.tier },\n {\n label: tr(\"devportal.partnerTier\", \"Partner Tier\"),\n value: org.partnerTier || tr(\"devportal.none\", \"None\"),\n },\n {\n label: tr(\"devportal.created\", \"Created\"),\n value: new Date(org.createdAt).toLocaleDateString(),\n },\n {\n label: tr(\"devportal.platformFeeRate\", \"Platform Fee Rate\"),\n value: `${(org.platformFeeRate * 100).toFixed(0)}%`,\n },\n ]}\n />\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingOrg}\n onClick={() => void handleProfileSave()}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {updatingOrg ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Settings size={14} />\n )}\n {tr(\"devportal.saveChanges\", \"Save Changes\")}\n </button>\n </div>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.legalInformation\", \"Legal Information\")}\n >\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.legalEntityName\", \"Legal Entity Name\")}\n value={legalForm.legalEntityName}\n onChange={(event) =>\n setLegalForm((current) => ({\n ...current,\n legalEntityName: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.entityType\", \"Entity Type\")}\n value={legalForm.legalEntityType}\n onChange={(event) =>\n setLegalForm((current) => ({\n ...current,\n legalEntityType: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.taxId\", \"Tax ID\")}\n value={taxForm.taxId}\n onChange={(event) =>\n setTaxForm((current) => ({\n ...current,\n taxId: event.target.value,\n }))\n }\n disabled={!canUpdate}\n />\n <InputField\n label={tr(\"devportal.taxCountry\", \"Tax Country\")}\n value={taxForm.taxCountry}\n onChange={(event) =>\n setTaxForm((current) => ({\n ...current,\n taxCountry: event.target.value.toUpperCase(),\n }))\n }\n disabled={!canUpdate}\n />\n </div>\n <DetailList\n items={[\n {\n label: tr(\"devportal.taxForm\", \"Tax Form\"),\n value:\n org.taxFormType ||\n tr(\"devportal.notSubmitted\", \"Not submitted\"),\n },\n {\n label: tr(\"devportal.taxFormStatus\", \"Tax Form Status\"),\n value: !org.taxFormType ? (\n tr(\"devportal.notSubmitted\", \"Not submitted\")\n ) : org.taxFormVerified ? (\n <span className=\"text-status-success-text flex items-center gap-1\">\n <CheckCircle size={14} />{\" \"}\n {tr(\"devportal.verified\", \"Verified\")}\n </span>\n ) : (\n tr(\"devportal.pendingVerification\", \"Pending verification\")\n ),\n },\n ]}\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingLegal}\n onClick={() => void handleLegalSave()}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-seam px-4 py-2 text-sm font-medium hover:bg-bg-sunken disabled:opacity-50\"\n >\n {updatingLegal ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : null}\n {tr(\"devportal.saveLegalInfo\", \"Save Legal Info\")}\n </button>\n <button\n type=\"button\"\n disabled={!canUpdate || updatingTax}\n onClick={() => void handleTaxSave()}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {updatingTax ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : null}\n {tr(\"devportal.saveTaxInfo\", \"Save Tax Info\")}\n </button>\n </div>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.verificationStatus\", \"Verification Status\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.verifiedLabel\", \"Verified\"),\n value: currentVerification.verificationStatus === \"VERIFIED\" ? (\n <span className=\"text-status-success-text flex items-center gap-1\">\n <CheckCircle size={14} />{\" \"}\n {tr(\"devportal.verifiedVia\", \"Verified via\")}{\" \"}\n {currentVerification.verificationMethod}\n </span>\n ) : currentVerification.verificationStatus === \"PENDING\" ? (\n tr(\"devportal.pendingVerification\", \"Pending verification\")\n ) : currentVerification.verificationStatus === \"REJECTED\" ? (\n tr(\"devportal.verificationRejected\", \"Rejected\")\n ) : (\n tr(\"devportal.notVerified\", \"Not verified\")\n ),\n },\n {\n label: tr(\"devportal.certifiedLabel\", \"Certified\"),\n value: org.isCertified ? (\n <span className=\"text-accent-blue flex items-center gap-1\">\n <Shield size={14} />{\" \"}\n {tr(\"devportal.certifiedUntil\", \"Certified until\")}{\" \"}\n {org.certificationExpiry\n ? new Date(org.certificationExpiry).toLocaleDateString()\n : \"N/A\"}\n </span>\n ) : (\n tr(\"devportal.notCertified\", \"Not certified\")\n ),\n },\n ]}\n />\n {currentVerification.verificationStatus !== \"VERIFIED\" && (\n <div className=\"mt-4 rounded-md border border-border-subtle p-4 space-y-3\">\n {verifySuccess ? (\n <p className=\"text-sm text-status-success-text flex items-center gap-2\">\n <CheckCircle size={14} />\n {tr(\n \"devportal.verificationRequested\",\n \"Verification request submitted. Our team will review and contact you.\",\n )}\n </p>\n ) : (\n <>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"devportal.requestVerificationHint\",\n \"Get your organization verified to build trust with users. Choose a verification method:\",\n )}\n </p>\n {currentVerification.verificationStatus === \"PENDING\" && (\n <div className=\"rounded-md border border-border-subtle bg-bg-sunken/40 p-3 text-sm text-text-secondary\">\n {tr(\"devportal.pendingVerification\", \"Pending verification\")}\n {currentVerification.verificationMethod\n ? ` · ${currentVerification.verificationMethod}`\n : \"\"}\n {currentVerification.verificationRequestNotes\n ? ` · ${currentVerification.verificationRequestNotes}`\n : \"\"}\n </div>\n )}\n {currentVerification.verificationStatus === \"REJECTED\" &&\n currentVerification.verificationRejectedReason && (\n <div className=\"rounded-md border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n {currentVerification.verificationRejectedReason}\n </div>\n )}\n {verificationReadinessIssues.length > 0 && (\n <div className=\"rounded-md border border-border-subtle bg-bg-sunken/40 p-3 text-sm text-text-secondary\">\n <div className=\"font-medium text-text-primary\">\n {tr(\"devportal.completeBeforeVerification\", \"Complete these details before submitting for review\")}\n </div>\n <ul className=\"mt-2 list-disc pl-5 space-y-1\">\n {verificationReadinessIssues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n </div>\n )}\n {currentVerification.verificationStatus !== \"PENDING\" && (\n <>\n <div className=\"flex gap-2 flex-wrap\">\n {[\"domain\", \"document\", \"manual\"].map((m) => (\n <button\n key={m}\n type=\"button\"\n onClick={() => setVerifyMethod(m)}\n className={`rounded-md border px-3 py-1 text-xs font-medium transition-colors ${\n verifyMethod === m\n ? \"bg-action-primary-bg text-action-primary-text border-primary\"\n : \"border-border-subtle hover:bg-bg-sunken\"\n }`}\n >\n {m === \"domain\"\n ? tr(\"devportal.domainVerification\", \"Domain\")\n : m === \"document\"\n ? tr(\"devportal.documentVerification\", \"Document\")\n : tr(\"devportal.manualVerification\", \"Manual review\")}\n </button>\n ))}\n </div>\n {verifyMethod === \"domain\" ? (\n <InputField\n label={tr(\"devportal.domainVerification\", \"Domain\")}\n value={verificationDomain}\n onChange={(event) => setVerificationDomain(event.target.value)}\n placeholder=\"example.com\"\n />\n ) : verifyMethod === \"document\" ? (\n <InputField\n label={tr(\"devportal.evidenceUrl\", \"Evidence URL\")}\n value={verificationEvidenceUrl}\n onChange={(event) => setVerificationEvidenceUrl(event.target.value)}\n placeholder=\"https://...\"\n />\n ) : null}\n <TextareaField\n label={tr(\"devportal.notes\", \"Notes\")}\n value={verificationNotes}\n onChange={(event) => setVerificationNotes(event.target.value)}\n placeholder=\"What should reviewers validate?\"\n />\n <button\n type=\"button\"\n disabled={!canSubmitVerification}\n onClick={() =>\n void (async () => {\n const trimmedDomain = verificationDomain.trim();\n const trimmedEvidenceUrl = verificationEvidenceUrl.trim();\n const trimmedNotes = verificationNotes.trim();\n\n if (verifyMethod === \"domain\" && !isLikelyDomain(trimmedDomain)) {\n setSaveError(\n tr(\n \"devportal.verification.errors.domainRequired\",\n \"Enter a valid domain like burdenoff.com\",\n ),\n );\n return;\n }\n\n if (verifyMethod === \"document\" && !isLikelyUrl(trimmedEvidenceUrl)) {\n setSaveError(\n tr(\n \"devportal.verification.errors.evidenceUrlRequired\",\n \"Enter a valid evidence URL starting with http:// or https://\",\n ),\n );\n return;\n }\n\n if (verifyMethod === \"manual\" && !trimmedNotes) {\n setSaveError(\n tr(\n \"devportal.verification.errors.notesRequired\",\n \"Add notes so the reviewer knows what to verify\",\n ),\n );\n return;\n }\n\n setSaveError(null);\n setSaveMessage(null);\n setVerifying(true);\n try {\n await updateOrganization({\n variables: {\n id: org.id,\n input: {\n name: profileForm.name.trim() || undefined,\n description: profileForm.description.trim() || null,\n websiteUrl: profileForm.websiteUrl.trim() || null,\n contactEmail: profileForm.contactEmail.trim() || null,\n supportEmail: profileForm.supportEmail.trim() || null,\n logoUrl: profileForm.logoUrl.trim() || null,\n bannerUrl: profileForm.bannerUrl.trim() || null,\n },\n },\n });\n\n await updateOrgLegalInfo({\n variables: {\n id: org.id,\n input: {\n legalEntityName: legalForm.legalEntityName.trim() || null,\n legalEntityType: legalForm.legalEntityType.trim() || null,\n },\n },\n });\n\n await updateOrgTaxInfo({\n variables: {\n id: org.id,\n input: {\n taxId: taxForm.taxId.trim() || null,\n taxCountry: taxForm.taxCountry.trim() || null,\n },\n },\n });\n\n const submitResult = await graphqlFetch({\n gateway: \"global\",\n query: REQUEST_ORG_VERIFICATION_MUTATION,\n variables: {\n id: org.id,\n method: verifyMethod,\n notes: trimmedNotes || null,\n evidenceUrl:\n verifyMethod === \"domain\"\n ? null\n : trimmedEvidenceUrl || null,\n domain:\n verifyMethod === \"domain\" ? trimmedDomain || null : null,\n },\n });\n if (submitResult.errors?.length) {\n throw new Error(submitResult.errors[0]?.message || \"Verification request failed\");\n }\n setVerifySuccess(true);\n setSaveMessage(\n tr(\n \"devportal.verificationRequested\",\n \"Verification request submitted. Our team will review and contact you.\",\n ),\n );\n const refreshed = await graphqlFetch<{\n developerOrganization: VerificationDetails | null;\n }>({\n gateway: \"global\",\n query: ORGANIZATION_VERIFICATION_QUERY,\n variables: { id: org.id },\n });\n setVerificationDetails(\n refreshed.data?.developerOrganization ?? null,\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.verificationRequestFailed\",\n \"Verification request failed\",\n ),\n );\n } finally {\n setVerifying(false);\n }\n })()\n }\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {verifying ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Shield size={14} />\n )}\n {tr(\"devportal.requestVerification\", \"Request Verification\")}\n </button>\n </>\n )}\n </>\n )}\n </div>\n )}\n </PageSection>\n </div>\n );\n};\n"],"mappings":"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"}