@burdenoff/microfe-devportal 2026.915.3 → 2026.915.4

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.
@@ -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\";\nimport {\n useIsSellerSection,\n orgSectionPath,\n} from \"../hooks/useIsSellerSection\";\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 {\n InputField,\n TextareaField,\n SelectField,\n} from \"../components/FormField\";\nimport {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\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 kind: org.kind as DeveloperOrganization[\"kind\"],\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 pickupPostalCode: org.pickupPostalCode ?? 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 {\n navigate,\n basePath,\n setActiveOrgId,\n setActivePhysicalOrgId,\n currentUser,\n } = useDevportal();\n const isSeller = useIsSellerSection();\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 the active-org slot so the dashboard/switcher scopes to whichever\n // org the user is browsing — the PHYSICAL slot when reached via the seller\n // portal, the regular (DIGITAL) slot otherwise. See DeveloperOrgKind\n // (BOFF-7285).\n useEffect(() => {\n if (!id) return;\n if (isSeller) {\n setActivePhysicalOrgId(id);\n } else {\n setActiveOrgId(id);\n }\n }, [id, isSeller, setActiveOrgId, setActivePhysicalOrgId]);\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}${orgSectionPath(isSeller)}`}\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}${orgSectionPath(isSeller)}`}\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(orgSectionPath(isSeller))}\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}${orgSectionPath(isSeller)}`}\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 // A PHYSICAL org never owns Applications (see DeveloperOrgKind /\n // BOFF-7285) — offer listing a physical item instead of the\n // digital-app step.\n ...(canCreateApps && !isSeller\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 ...(canCreateApps && isSeller\n ? [\n {\n id: \"list-item\",\n label: tr(\"devportal.listAnItem\", \"List an Item\"),\n description: tr(\n \"devportal.orgStepListItem\",\n \"List a physical product for sale under this organization\",\n ),\n icon: <Plus size={16} />,\n onClick: () => handleNavigate(\"/seller/items/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 org={org}\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={\n org.kind === \"PHYSICAL\"\n ? tr(\n \"devportal.createYourFirstItem\",\n \"List your first physical item\",\n )\n : tr(\n \"devportal.createYourFirstApplication\",\n \"Create your first application\",\n )\n }\n action={\n canCreateApps ? (\n <button\n onClick={() =>\n onNavigate(\n org.kind === \"PHYSICAL\"\n ? \"/seller/items/new\"\n : \"/apps/new\",\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\"\n >\n <Plus size={16} />\n {org.kind === \"PHYSICAL\"\n ? tr(\"devportal.createItem\", \"Create Item\")\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 org: DeveloperOrganization;\n apps: Application[];\n onNavigate: (path: string) => void;\n canCreateApps: boolean;\n}> = ({ org, 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 // A PHYSICAL org never owns Applications (see DeveloperOrgKind / BOFF-7285)\n // — this is checked against the org's real kind, not the route, so a\n // physical org opened via a stale non-seller URL still routes correctly.\n const isPhysical = org.kind === \"PHYSICAL\";\n const createPath = isPhysical ? \"/seller/items/new\" : \"/apps/new\";\n const createLabel = isPhysical\n ? tr(\"devportal.createItem\", \"Create Item\")\n : tr(\"devportal.createApp\", \"Create App\");\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(createPath)}\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 {createLabel}\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={\n isPhysical\n ? tr(\n \"devportal.createFirstItemForOrg\",\n \"List your first physical item for this organization\",\n )\n : tr(\n \"devportal.createFirstAppForOrg\",\n \"Create your first application for this organization\",\n )\n }\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(createPath)}\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 {createLabel}\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 [fulfillmentForm, setFulfillmentForm] = useState({\n pickupPostalCode: org.pickupPostalCode ?? \"\",\n });\n const { locations: pickupLocations } = useCarrierPickupLocations();\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(\n tr(\"devportal.contactEmailRequired\", \"Contact email is required\"),\n );\n } else if (!isLikelyEmail(profileForm.contactEmail)) {\n verificationReadinessIssues.push(\n tr(\"devportal.contactEmailInvalid\", \"Contact email must be valid\"),\n );\n }\n if (\n profileForm.supportEmail.trim() &&\n !isLikelyEmail(profileForm.supportEmail)\n ) {\n verificationReadinessIssues.push(\n tr(\"devportal.supportEmailInvalid\", \"Support email must be valid\"),\n );\n }\n if (!profileForm.websiteUrl.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.websiteRequired\", \"Website URL is required\"),\n );\n } else if (!isLikelyUrl(profileForm.websiteUrl)) {\n verificationReadinessIssues.push(\n tr(\"devportal.websiteInvalid\", \"Website URL must be valid\"),\n );\n }\n if (!legalForm.legalEntityName.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.legalEntityNameRequired\", \"Legal entity name is required\"),\n );\n }\n if (!legalForm.legalEntityType.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.legalEntityTypeRequired\", \"Entity type is required\"),\n );\n }\n if (!taxForm.taxId.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxIdRequired\", \"Tax ID is required\"),\n );\n }\n if (!taxForm.taxCountry.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxCountryRequired\", \"Tax country is required\"),\n );\n } else if (!/^[A-Za-z]{2}$/.test(taxForm.taxCountry.trim())) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxCountryInvalid\", \"Tax country must be a 2-letter code\"),\n );\n }\n const verificationFormIssues: string[] = [];\n if (verifyMethod === \"domain\" && !isLikelyDomain(verificationDomain.trim())) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.domainRequired\",\n \"Enter a valid domain like burdenoff.com\",\n ),\n );\n }\n if (\n verifyMethod === \"document\" &&\n !isLikelyUrl(verificationEvidenceUrl.trim())\n ) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.evidenceUrlRequired\",\n \"Enter a valid evidence URL starting with http:// or https://\",\n ),\n );\n }\n if (verifyMethod === \"manual\" && !verificationNotes.trim()) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.notesRequired\",\n \"Add notes so the reviewer knows what to verify\",\n ),\n );\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 setFulfillmentForm({\n pickupPostalCode: org.pickupPostalCode ?? \"\",\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 const handleFulfillmentSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrganization({\n variables: {\n id: org.id,\n input: {\n pickupPostalCode: fulfillmentForm.pickupPostalCode.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.fulfillmentInfoUpdated\", \"Fulfillment settings updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateFulfillmentInfo\",\n \"Failed to update fulfillment settings\",\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 {org.kind === \"PHYSICAL\" && (\n <PageSection title={tr(\"devportal.fulfillment\", \"Fulfillment\")}>\n <div className=\"space-y-4\">\n {pickupLocations.length > 0 ? (\n <SelectField\n label={tr(\"devportal.pickupPostalCode\", \"Pickup Pincode\")}\n value={fulfillmentForm.pickupPostalCode}\n onChange={(event) =>\n setFulfillmentForm({ pickupPostalCode: event.target.value })\n }\n disabled={!canUpdate}\n placeholder={tr(\n \"devportal.pickupPostalCodeUseBilling\",\n \"Use billing account address\",\n )}\n options={pickupLocations.map((location) => ({\n value: location.postalCode,\n label: `${location.label} — ${location.postalCode} · ${capitalizeCarrierName(location.carrier)}`,\n }))}\n error={\n fulfillmentForm.pickupPostalCode &&\n !pickupLocations.some(\n (location) =>\n location.postalCode === fulfillmentForm.pickupPostalCode,\n )\n ? tr(\n \"devportal.pickupPostalCodeNotRegistered\",\n \"This pincode isn't a registered pickup location — orders may fail to ship. Pick one below.\",\n )\n : undefined\n }\n hint={tr(\n \"devportal.pickupPostalCodeHint\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. If left blank, we fall back to your linked billing account's address.\",\n )}\n />\n ) : (\n <InputField\n label={tr(\"devportal.pickupPostalCode\", \"Pickup Pincode\")}\n value={fulfillmentForm.pickupPostalCode}\n onChange={(event) =>\n setFulfillmentForm({ pickupPostalCode: event.target.value })\n }\n disabled={!canUpdate}\n hint={tr(\n \"devportal.pickupPostalCodeHintFallback\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. If left blank, we fall back to your linked billing account's address. (Live pickup-location list unavailable — enter your pincode manually.)\",\n )}\n />\n )}\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingOrg}\n onClick={() => void handleFulfillmentSave()}\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 ) : null}\n {tr(\n \"devportal.saveFulfillmentInfo\",\n \"Save Fulfillment Settings\",\n )}\n </button>\n </div>\n </div>\n </PageSection>\n )}\n\n <PageSection\n title={tr(\"devportal.verificationStatus\", \"Verification Status\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.verifiedLabel\", \"Verified\"),\n value:\n 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(\n \"devportal.pendingVerification\",\n \"Pending verification\",\n )}\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(\n \"devportal.completeBeforeVerification\",\n \"Complete these details before submitting for review\",\n )}\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(\n \"devportal.manualVerification\",\n \"Manual review\",\n )}\n </button>\n ))}\n </div>\n {verifyMethod === \"domain\" ? (\n <InputField\n label={tr(\"devportal.domainVerification\", \"Domain\")}\n value={verificationDomain}\n onChange={(event) =>\n setVerificationDomain(event.target.value)\n }\n placeholder=\"example.com\"\n />\n ) : verifyMethod === \"document\" ? (\n <InputField\n label={tr(\"devportal.evidenceUrl\", \"Evidence URL\")}\n value={verificationEvidenceUrl}\n onChange={(event) =>\n setVerificationEvidenceUrl(event.target.value)\n }\n placeholder=\"https://...\"\n />\n ) : null}\n <TextareaField\n label={tr(\"devportal.notes\", \"Notes\")}\n value={verificationNotes}\n onChange={(event) =>\n setVerificationNotes(event.target.value)\n }\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 =\n verificationEvidenceUrl.trim();\n const trimmedNotes = verificationNotes.trim();\n\n if (\n verifyMethod === \"domain\" &&\n !isLikelyDomain(trimmedDomain)\n ) {\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 (\n verifyMethod === \"document\" &&\n !isLikelyUrl(trimmedEvidenceUrl)\n ) {\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:\n profileForm.description.trim() || null,\n websiteUrl:\n profileForm.websiteUrl.trim() || null,\n contactEmail:\n profileForm.contactEmail.trim() || null,\n supportEmail:\n profileForm.supportEmail.trim() || null,\n logoUrl: profileForm.logoUrl.trim() || null,\n bannerUrl:\n profileForm.bannerUrl.trim() || null,\n },\n },\n });\n\n await updateOrgLegalInfo({\n variables: {\n id: org.id,\n input: {\n legalEntityName:\n legalForm.legalEntityName.trim() || null,\n legalEntityType:\n 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\"\n ? trimmedDomain || null\n : null,\n },\n });\n if (submitResult.errors?.length) {\n throw new Error(\n submitResult.errors[0]?.message ||\n \"Verification request failed\",\n );\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(\n \"devportal.requestVerification\",\n \"Request Verification\",\n )}\n </button>\n </>\n )}\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\";\nimport {\n useIsSellerSection,\n orgSectionPath,\n} from \"../hooks/useIsSellerSection\";\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 {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\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 kind: org.kind as DeveloperOrganization[\"kind\"],\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 pickupPostalCode: org.pickupPostalCode ?? 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 {\n navigate,\n basePath,\n setActiveOrgId,\n setActivePhysicalOrgId,\n currentUser,\n } = useDevportal();\n const isSeller = useIsSellerSection();\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 the active-org slot so the dashboard/switcher scopes to whichever\n // org the user is browsing — the PHYSICAL slot when reached via the seller\n // portal, the regular (DIGITAL) slot otherwise. See DeveloperOrgKind\n // (BOFF-7285).\n useEffect(() => {\n if (!id) return;\n if (isSeller) {\n setActivePhysicalOrgId(id);\n } else {\n setActiveOrgId(id);\n }\n }, [id, isSeller, setActiveOrgId, setActivePhysicalOrgId]);\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}${orgSectionPath(isSeller)}`}\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}${orgSectionPath(isSeller)}`}\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(orgSectionPath(isSeller))}\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}${orgSectionPath(isSeller)}`}\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 // A PHYSICAL org never owns Applications (see DeveloperOrgKind /\n // BOFF-7285) — offer listing a physical item instead of the\n // digital-app step.\n ...(canCreateApps && !isSeller\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 ...(canCreateApps && isSeller\n ? [\n {\n id: \"list-item\",\n label: tr(\"devportal.listAnItem\", \"List an Item\"),\n description: tr(\n \"devportal.orgStepListItem\",\n \"List a physical product for sale under this organization\",\n ),\n icon: <Plus size={16} />,\n onClick: () => handleNavigate(\"/seller/items/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 org={org}\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={\n org.kind === \"PHYSICAL\"\n ? tr(\n \"devportal.createYourFirstItem\",\n \"List your first physical item\",\n )\n : tr(\n \"devportal.createYourFirstApplication\",\n \"Create your first application\",\n )\n }\n action={\n canCreateApps ? (\n <button\n onClick={() =>\n onNavigate(\n org.kind === \"PHYSICAL\"\n ? \"/seller/items/new\"\n : \"/apps/new\",\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\"\n >\n <Plus size={16} />\n {org.kind === \"PHYSICAL\"\n ? tr(\"devportal.createItem\", \"Create Item\")\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 org: DeveloperOrganization;\n apps: Application[];\n onNavigate: (path: string) => void;\n canCreateApps: boolean;\n}> = ({ org, 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 // A PHYSICAL org never owns Applications (see DeveloperOrgKind / BOFF-7285)\n // — this is checked against the org's real kind, not the route, so a\n // physical org opened via a stale non-seller URL still routes correctly.\n const isPhysical = org.kind === \"PHYSICAL\";\n const createPath = isPhysical ? \"/seller/items/new\" : \"/apps/new\";\n const createLabel = isPhysical\n ? tr(\"devportal.createItem\", \"Create Item\")\n : tr(\"devportal.createApp\", \"Create App\");\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(createPath)}\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 {createLabel}\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={\n isPhysical\n ? tr(\n \"devportal.createFirstItemForOrg\",\n \"List your first physical item for this organization\",\n )\n : tr(\n \"devportal.createFirstAppForOrg\",\n \"Create your first application for this organization\",\n )\n }\n action={\n canCreateApps ? (\n <button\n onClick={() => onNavigate(createPath)}\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 {createLabel}\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 [fulfillmentForm, setFulfillmentForm] = useState({\n pickupPostalCode: org.pickupPostalCode ?? \"\",\n });\n const { locations: pickupLocations } = useCarrierPickupLocations();\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(\n tr(\"devportal.contactEmailRequired\", \"Contact email is required\"),\n );\n } else if (!isLikelyEmail(profileForm.contactEmail)) {\n verificationReadinessIssues.push(\n tr(\"devportal.contactEmailInvalid\", \"Contact email must be valid\"),\n );\n }\n if (\n profileForm.supportEmail.trim() &&\n !isLikelyEmail(profileForm.supportEmail)\n ) {\n verificationReadinessIssues.push(\n tr(\"devportal.supportEmailInvalid\", \"Support email must be valid\"),\n );\n }\n if (!profileForm.websiteUrl.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.websiteRequired\", \"Website URL is required\"),\n );\n } else if (!isLikelyUrl(profileForm.websiteUrl)) {\n verificationReadinessIssues.push(\n tr(\"devportal.websiteInvalid\", \"Website URL must be valid\"),\n );\n }\n if (!legalForm.legalEntityName.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.legalEntityNameRequired\", \"Legal entity name is required\"),\n );\n }\n if (!legalForm.legalEntityType.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.legalEntityTypeRequired\", \"Entity type is required\"),\n );\n }\n if (!taxForm.taxId.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxIdRequired\", \"Tax ID is required\"),\n );\n }\n if (!taxForm.taxCountry.trim()) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxCountryRequired\", \"Tax country is required\"),\n );\n } else if (!/^[A-Za-z]{2}$/.test(taxForm.taxCountry.trim())) {\n verificationReadinessIssues.push(\n tr(\"devportal.taxCountryInvalid\", \"Tax country must be a 2-letter code\"),\n );\n }\n const verificationFormIssues: string[] = [];\n if (verifyMethod === \"domain\" && !isLikelyDomain(verificationDomain.trim())) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.domainRequired\",\n \"Enter a valid domain like burdenoff.com\",\n ),\n );\n }\n if (\n verifyMethod === \"document\" &&\n !isLikelyUrl(verificationEvidenceUrl.trim())\n ) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.evidenceUrlRequired\",\n \"Enter a valid evidence URL starting with http:// or https://\",\n ),\n );\n }\n if (verifyMethod === \"manual\" && !verificationNotes.trim()) {\n verificationFormIssues.push(\n tr(\n \"devportal.verification.errors.notesRequired\",\n \"Add notes so the reviewer knows what to verify\",\n ),\n );\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 setFulfillmentForm({\n pickupPostalCode: org.pickupPostalCode ?? \"\",\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 const handleFulfillmentSave = async () => {\n setSaveError(null);\n setSaveMessage(null);\n try {\n await updateOrganization({\n variables: {\n id: org.id,\n input: {\n pickupPostalCode: fulfillmentForm.pickupPostalCode.trim() || null,\n },\n },\n });\n setSaveMessage(\n tr(\"devportal.fulfillmentInfoUpdated\", \"Fulfillment settings updated\"),\n );\n } catch (error) {\n setSaveError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToUpdateFulfillmentInfo\",\n \"Failed to update fulfillment settings\",\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 {org.kind === \"PHYSICAL\" && (\n <PageSection title={tr(\"devportal.fulfillment\", \"Fulfillment\")}>\n <div className=\"space-y-4\">\n {(() => {\n const trimmedPickup = fulfillmentForm.pickupPostalCode.trim();\n const registeredMatch = pickupLocations.find(\n (location) => location.postalCode === trimmedPickup,\n );\n // Only comment on registration status once we actually have a\n // live list to check against — an empty list just means the\n // carrier lookup failed/is unconfigured, not that the pincode\n // is bad, so stay silent rather than falsely warn.\n const registrationHint =\n trimmedPickup.length === 0 || pickupLocations.length === 0\n ? undefined\n : registeredMatch\n ? `${tr(\"devportal.pickupPostalCodeRegistered\", \"Registered with\")} ${capitalizeCarrierName(registeredMatch.carrier)} — ${tr(\"devportal.pickupPostalCodeRegisteredSuffix\", \"ready for automated shipping.\")}`\n : tr(\n \"devportal.pickupPostalCodeNotRegistered\",\n \"This pincode isn't registered with our shipping carrier yet — physical orders can't auto-ship until it's added. Contact support to register your pickup address.\",\n );\n return (\n <InputField\n label={tr(\"devportal.pickupPostalCode\", \"Pickup Pincode\")}\n value={fulfillmentForm.pickupPostalCode}\n onChange={(event) =>\n setFulfillmentForm({ pickupPostalCode: event.target.value })\n }\n disabled={!canUpdate}\n error={registeredMatch ? undefined : registrationHint}\n hint={\n registeredMatch\n ? registrationHint\n : tr(\n \"devportal.pickupPostalCodeHint\",\n \"The postal code your physical orders actually ship from — used to quote real carrier shipping rates. If left blank, we fall back to your linked billing account's address.\",\n )\n }\n />\n );\n })()}\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n disabled={!canUpdate || updatingOrg}\n onClick={() => void handleFulfillmentSave()}\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 ) : null}\n {tr(\n \"devportal.saveFulfillmentInfo\",\n \"Save Fulfillment Settings\",\n )}\n </button>\n </div>\n </div>\n </PageSection>\n )}\n\n <PageSection\n title={tr(\"devportal.verificationStatus\", \"Verification Status\")}\n >\n <DetailList\n items={[\n {\n label: tr(\"devportal.verifiedLabel\", \"Verified\"),\n value:\n 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(\n \"devportal.pendingVerification\",\n \"Pending verification\",\n )}\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(\n \"devportal.completeBeforeVerification\",\n \"Complete these details before submitting for review\",\n )}\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(\n \"devportal.manualVerification\",\n \"Manual review\",\n )}\n </button>\n ))}\n </div>\n {verifyMethod === \"domain\" ? (\n <InputField\n label={tr(\"devportal.domainVerification\", \"Domain\")}\n value={verificationDomain}\n onChange={(event) =>\n setVerificationDomain(event.target.value)\n }\n placeholder=\"example.com\"\n />\n ) : verifyMethod === \"document\" ? (\n <InputField\n label={tr(\"devportal.evidenceUrl\", \"Evidence URL\")}\n value={verificationEvidenceUrl}\n onChange={(event) =>\n setVerificationEvidenceUrl(event.target.value)\n }\n placeholder=\"https://...\"\n />\n ) : null}\n <TextareaField\n label={tr(\"devportal.notes\", \"Notes\")}\n value={verificationNotes}\n onChange={(event) =>\n setVerificationNotes(event.target.value)\n }\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 =\n verificationEvidenceUrl.trim();\n const trimmedNotes = verificationNotes.trim();\n\n if (\n verifyMethod === \"domain\" &&\n !isLikelyDomain(trimmedDomain)\n ) {\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 (\n verifyMethod === \"document\" &&\n !isLikelyUrl(trimmedEvidenceUrl)\n ) {\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:\n profileForm.description.trim() || null,\n websiteUrl:\n profileForm.websiteUrl.trim() || null,\n contactEmail:\n profileForm.contactEmail.trim() || null,\n supportEmail:\n profileForm.supportEmail.trim() || null,\n logoUrl: profileForm.logoUrl.trim() || null,\n bannerUrl:\n profileForm.bannerUrl.trim() || null,\n },\n },\n });\n\n await updateOrgLegalInfo({\n variables: {\n id: org.id,\n input: {\n legalEntityName:\n legalForm.legalEntityName.trim() || null,\n legalEntityType:\n 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\"\n ? trimmedDomain || null\n : null,\n },\n });\n if (submitResult.errors?.length) {\n throw new Error(\n submitResult.errors[0]?.message ||\n \"Verification request failed\",\n );\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(\n \"devportal.requestVerification\",\n \"Request Verification\",\n )}\n </button>\n </>\n )}\n </>\n )}\n </div>\n )}\n </PageSection>\n </div>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-devportal",
3
- "version": "2026.915.3",
3
+ "version": "2026.915.4",
4
4
  "description": "Burdenoff Developer Portal Microfrontend - Complete developer operations interface",
5
5
  "type": "module",
6
6
  "files": [