@burdenoff/microfe-devportal 2026.915.10 → 2026.915.12
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.
- package/dist/devportal/pages/CreateOrganizationPage.d.ts.map +1 -1
- package/dist/devportal/pages/CreateOrganizationPage.js +0 -4
- package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
- package/dist/devportal/pages/OrganizationDetailPage.d.ts.map +1 -1
- package/dist/devportal/pages/OrganizationDetailPage.js +544 -503
- package/dist/devportal/pages/OrganizationDetailPage.js.map +1 -1
- package/dist/devportal/pages/RevenueDashboardPage.d.ts.map +1 -1
- package/dist/devportal/pages/RevenueDashboardPage.js +298 -290
- package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -1
- package/dist/generated/global-operations.d.ts +4 -0
- package/dist/generated/global-operations.d.ts.map +1 -1
- package/dist/generated/global-operations.js +4 -0
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.d.ts +163 -2
- package/dist/generated/global-types.d.ts.map +1 -1
- package/dist/generated/global-types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrganizationDetailPage.js","names":[],"sources":["../../../src/devportal/pages/OrganizationDetailPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useParams } from \"react-router\";\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 Trash2,\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 { RegisterPickupLocationModal } from \"../components/RegisterPickupLocationModal\";\nimport { ConfirmDialog } from \"../components/ConfirmDialog\";\nimport {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\nimport { useOrganizationPickupAddresses } from \"../hooks/useOrganizationPickupAddresses\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport type {\n DeveloperOrganization,\n Application,\n DeveloperOrgMember,\n} from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { ORG_ROLE_LABELS } from \"../utils/constants\";\nimport {\n graphqlFetch,\n clearGraphqlFetchResponseCache,\n} 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 { locations: pickupLocations } = useCarrierPickupLocations();\n const {\n addresses: pickupAddresses,\n loading: pickupAddressesLoading,\n refetch: refetchPickupAddresses,\n } = useOrganizationPickupAddresses(org.id);\n const [showRegisterPickupModal, setShowRegisterPickupModal] = useState(false);\n const [removeConfirmAddressId, setRemoveConfirmAddressId] = useState<\n string | null\n >(null);\n const [pickupActionPendingId, setPickupActionPendingId] = useState<\n string | null\n >(null);\n const [fulfillmentMessage, setFulfillmentMessage] = useState<string | null>(\n null,\n );\n const [fulfillmentError, setFulfillmentError] = useState<string | null>(null);\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 }, [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 handleSetDefaultPickupAddress = async (addressId: string) => {\n setFulfillmentError(null);\n setFulfillmentMessage(null);\n setPickupActionPendingId(addressId);\n try {\n const result = await graphqlFetch<{\n setDefaultPickupAddress: { id: string };\n }>({\n gateway: \"global\",\n query: `\n mutation DevportalSetDefaultPickupAddress($id: ID!) {\n setDefaultPickupAddress(id: $id) {\n id\n }\n }\n `,\n variables: { id: addressId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ?? \"Failed to switch pickup address\",\n );\n }\n // Without this, refetchPickupAddresses would serve the pre-mutation\n // list back from graphqlFetch's short-lived response cache (same\n // query+variables), hiding the new default until a full reload.\n clearGraphqlFetchResponseCache();\n refetchPickupAddresses();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressSetActive\", \"Pickup address updated\"),\n );\n } catch (error) {\n setFulfillmentError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToSwitchPickupAddress\",\n \"Failed to switch pickup address\",\n ),\n );\n } finally {\n setPickupActionPendingId(null);\n }\n };\n\n const handleRemovePickupAddress = async (addressId: string) => {\n setFulfillmentError(null);\n setFulfillmentMessage(null);\n setPickupActionPendingId(addressId);\n try {\n const result = await graphqlFetch<{\n removeDeveloperOrgPickupAddress: boolean;\n }>({\n gateway: \"global\",\n query: `\n mutation DevportalRemoveOrgPickupAddress($id: ID!) {\n removeDeveloperOrgPickupAddress(id: $id)\n }\n `,\n variables: { id: addressId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ?? \"Failed to remove pickup address\",\n );\n }\n clearGraphqlFetchResponseCache();\n refetchPickupAddresses();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressRemoved\", \"Pickup address removed\"),\n );\n } catch (error) {\n setFulfillmentError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToRemovePickupAddress\",\n \"Failed to remove pickup address\",\n ),\n );\n } finally {\n setPickupActionPendingId(null);\n setRemoveConfirmAddressId(null);\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-3\">\n {fulfillmentError && (\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 {fulfillmentError}\n </div>\n )}\n {fulfillmentMessage && (\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 {fulfillmentMessage}\n </div>\n )}\n\n {!pickupAddressesLoading && pickupAddresses.length === 0 && (\n <div className=\"rounded-md border border-border-seam bg-bg-sunken p-4\">\n <p className=\"text-sm font-medium\">\n {tr(\n \"devportal.noPickupAddress\",\n \"No pickup address set up yet\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"devportal.noPickupAddressHint\",\n \"Buyers need to know where your physical orders actually ship from — a bare pincode isn't enough, two sellers can share one. Add your real pickup address and we'll register it with our shipping carrier for you, free of charge.\",\n )}\n </p>\n </div>\n )}\n\n {pickupAddresses.length > 0 && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {pickupAddresses.map((pickupAddress) => {\n const isRegisteredWithCarrier = pickupLocations.some(\n (location) =>\n location.carrier === pickupAddress.carrier &&\n location.postalCode === pickupAddress.postalCode,\n );\n const isPending = pickupActionPendingId === pickupAddress.id;\n\n return (\n <div\n key={pickupAddress.id}\n className={cn(\n \"rounded-md border p-4\",\n pickupAddress.isDefault\n ? \"border-status-success-border bg-status-success-bg-subtle\"\n : \"border-border-seam bg-bg-sunken\",\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-sm font-medium\">\n {pickupAddress.carrierLocationLabel}\n </p>\n {pickupAddress.isDefault && (\n <span className=\"rounded-full bg-status-success-bg px-2 py-0.5 text-xs font-medium text-white\">\n {tr(\"devportal.active\", \"Active\")}\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {pickupAddress.address}\n {pickupAddress.addressLine2\n ? `, ${pickupAddress.addressLine2}`\n : \"\"}\n , {pickupAddress.city}, {pickupAddress.state}{\" \"}\n {pickupAddress.postalCode}, {pickupAddress.country}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {capitalizeCarrierName(pickupAddress.carrier)}\n </p>\n {!isRegisteredWithCarrier && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {tr(\n \"devportal.pickupAddressNotRegisteredHint\",\n \"Not currently registered with the carrier — physical orders can't auto-ship from this address right now.\",\n )}\n </p>\n )}\n\n {canUpdate && (\n <div className=\"mt-3 flex items-center gap-4\">\n {!pickupAddress.isDefault && (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() =>\n void handleSetDefaultPickupAddress(\n pickupAddress.id,\n )\n }\n className=\"text-sm font-medium text-action-primary-text hover:underline disabled:opacity-50\"\n >\n {tr(\n \"devportal.setPickupAddressActiveCta\",\n \"Set as active\",\n )}\n </button>\n )}\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() =>\n setRemoveConfirmAddressId(pickupAddress.id)\n }\n className=\"flex items-center gap-1.5 text-sm text-status-error-text hover:underline disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n {tr(\"devportal.removePickupAddressCta\", \"Remove\")}\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {canUpdate && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => setShowRegisterPickupModal(true)}\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={14} />\n {tr(\"devportal.addPickupAddressCta\", \"Add pickup address\")}\n </button>\n </div>\n )}\n\n {showRegisterPickupModal && (\n <RegisterPickupLocationModal\n open={showRegisterPickupModal}\n onOpenChange={setShowRegisterPickupModal}\n organizationId={org.id}\n // Only carrier that supports self-service registration\n // today — becomes a real choice once more adapters\n // implement registerPickupLocation().\n carrier=\"shiprocket\"\n onRegistered={() => {\n refetchPickupAddresses();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressAdded\", \"Pickup address added\"),\n );\n }}\n />\n )}\n\n <ConfirmDialog\n open={removeConfirmAddressId !== null}\n onOpenChange={(open) => {\n if (!open) setRemoveConfirmAddressId(null);\n }}\n variant=\"danger\"\n loading={pickupActionPendingId === removeConfirmAddressId}\n title={tr(\n \"devportal.removePickupAddressConfirmTitle\",\n \"Remove this pickup address?\",\n )}\n description={tr(\n \"devportal.removePickupAddressConfirmDesc\",\n \"We'll stop using it to quote and book shipments for this organization. Carriers like Shiprocket don't offer a way to delete an address from their own account once added, so it may still show up there, but it won't be used for your orders anymore.\",\n )}\n confirmLabel={tr(\"devportal.remove\", \"Remove\")}\n cancelLabel={tr(\"devportal.cancel\", \"Cancel\")}\n onConfirm={async () => {\n if (removeConfirmAddressId) {\n await handleRemovePickupAddress(removeConfirmAddressId);\n }\n }}\n />\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 Trash2,\n CreditCard,\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 { RegisterPickupLocationModal } from \"../components/RegisterPickupLocationModal\";\nimport { Alert, ConfirmDialog } from \"../components/ConfirmDialog\";\nimport {\n useCarrierPickupLocations,\n capitalizeCarrierName,\n} from \"../hooks/useCarrierPickupLocations\";\nimport {\n useOrganizationPickupAddresses,\n type OrganizationPickupAddress,\n} from \"../hooks/useOrganizationPickupAddresses\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport type {\n DeveloperOrganization,\n Application,\n DeveloperOrgMember,\n} from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { ORG_ROLE_LABELS } from \"../utils/constants\";\nimport {\n graphqlFetch,\n clearGraphqlFetchResponseCache,\n} 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 billingAccountId: org.billingAccountId ?? 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 // Lifted up from SettingsTab (and called unconditionally, before the\n // loading/error early returns below, per Rules of Hooks) so the guided\n // next-steps banner — which renders above the tabs regardless of which\n // one is active — can reflect whether a pickup address is configured.\n const {\n addresses: pickupAddresses,\n loading: pickupAddressesLoading,\n refetch: refetchPickupAddresses,\n } = useOrganizationPickupAddresses(id);\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 // Set when a CTA (the pickup-address alert below) needs Settings to not\n // just open, but scroll to and briefly highlight the Fulfillment section\n // specifically — \"go to Settings\" alone would drop the seller on\n // Organization Details with no clue where \"Fulfillment\" even is.\n const [focusFulfillment, setFocusFulfillment] = useState(false);\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 {/* Pickup address is a hard requirement for PHYSICAL orgs, not a soft\n suggestion — surfaced as a persistent, non-dismissible alert (unlike\n NextSteps below) so it can't be dismissed away and forgotten. */}\n {canManageOrg &&\n isSeller &&\n !pickupAddressesLoading &&\n pickupAddresses.length === 0 && (\n <Alert\n variant=\"warning\"\n title={tr(\n \"devportal.pickupAddressRequiredTitle\",\n \"Pickup address required\",\n )}\n className=\"mt-6\"\n >\n <p>\n {tr(\n \"devportal.pickupAddressRequiredDesc\",\n \"This organization sells physical items, so it needs a real pickup address before it's fully set up — buyers need to know where orders actually ship from.\",\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab(\"settings\");\n setFocusFulfillment(true);\n }}\n className=\"mt-2 text-sm font-semibold underline\"\n >\n {tr(\"devportal.pickupAddressRequiredCta\", \"Configure it now\")}\n </button>\n </Alert>\n )}\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 ...(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 // Billing account applies to every org, physical or digital —\n // both need somewhere for sale/payout revenue to land.\n ...(canManageOrg\n ? [\n {\n id: \"link-billing\",\n label: tr(\n \"devportal.orgStepLinkBilling\",\n \"Link billing account\",\n ),\n description: tr(\n \"devportal.orgStepLinkBillingDesc\",\n \"Connect a billing account so sale and payout revenue has somewhere to go\",\n ),\n icon: <CreditCard size={16} />,\n onClick: () =>\n navigate?.(\n `/billing/earnings?developerOrgId=${encodeURIComponent(org.id)}&developerOrgName=${encodeURIComponent(org.name)}`,\n ),\n done: Boolean(org.billingAccountId),\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 ]}\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 && (\n <SettingsTab\n org={org}\n pickupAddresses={pickupAddresses}\n pickupAddressesLoading={pickupAddressesLoading}\n refetchPickupAddresses={refetchPickupAddresses}\n focusFulfillment={focusFulfillment}\n onFocusFulfillmentHandled={() => setFocusFulfillment(false)}\n />\n )}\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<{\n org: DeveloperOrganization;\n pickupAddresses: OrganizationPickupAddress[];\n pickupAddressesLoading: boolean;\n refetchPickupAddresses: () => void;\n /** Set when the caller navigated here specifically to fix the pickup\n * address (e.g. the \"Configure it now\" alert on Overview) — \"Settings\" on\n * its own drops the seller on Organization Details with no clue where\n * \"Fulfillment\" even is, so scroll to and briefly highlight it instead. */\n focusFulfillment?: boolean;\n onFocusFulfillmentHandled?: () => void;\n}> = ({\n org,\n pickupAddresses,\n pickupAddressesLoading,\n refetchPickupAddresses,\n focusFulfillment,\n onFocusFulfillmentHandled,\n}) => {\n const [highlightFulfillment, setHighlightFulfillment] = useState(false);\n useEffect(() => {\n if (!focusFulfillment) return;\n const el = document.getElementById(\"fulfillment-section\");\n el?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n setHighlightFulfillment(true);\n const timeout = setTimeout(() => setHighlightFulfillment(false), 2500);\n onFocusFulfillmentHandled?.();\n return () => clearTimeout(timeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only re-run when focusFulfillment itself flips to true\n }, [focusFulfillment]);\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 { locations: pickupLocations, refetch: refetchPickupLocations } =\n useCarrierPickupLocations();\n const [showRegisterPickupModal, setShowRegisterPickupModal] = useState(false);\n const [removeConfirmAddressId, setRemoveConfirmAddressId] = useState<\n string | null\n >(null);\n const [pickupActionPendingId, setPickupActionPendingId] = useState<\n string | null\n >(null);\n const [fulfillmentMessage, setFulfillmentMessage] = useState<string | null>(\n null,\n );\n const [fulfillmentError, setFulfillmentError] = useState<string | null>(null);\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 }, [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 handleSetDefaultPickupAddress = async (addressId: string) => {\n setFulfillmentError(null);\n setFulfillmentMessage(null);\n setPickupActionPendingId(addressId);\n try {\n const result = await graphqlFetch<{\n setDefaultPickupAddress: { id: string };\n }>({\n gateway: \"global\",\n query: `\n mutation DevportalSetDefaultPickupAddress($id: ID!) {\n setDefaultPickupAddress(id: $id) {\n id\n }\n }\n `,\n variables: { id: addressId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ?? \"Failed to switch pickup address\",\n );\n }\n // Without this, refetchPickupAddresses would serve the pre-mutation\n // list back from graphqlFetch's short-lived response cache (same\n // query+variables), hiding the new default until a full reload.\n clearGraphqlFetchResponseCache();\n refetchPickupAddresses();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressSetActive\", \"Pickup address updated\"),\n );\n } catch (error) {\n setFulfillmentError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToSwitchPickupAddress\",\n \"Failed to switch pickup address\",\n ),\n );\n } finally {\n setPickupActionPendingId(null);\n }\n };\n\n const handleRemovePickupAddress = async (addressId: string) => {\n setFulfillmentError(null);\n setFulfillmentMessage(null);\n setPickupActionPendingId(addressId);\n try {\n const result = await graphqlFetch<{\n removeDeveloperOrgPickupAddress: boolean;\n }>({\n gateway: \"global\",\n query: `\n mutation DevportalRemoveOrgPickupAddress($id: ID!) {\n removeDeveloperOrgPickupAddress(id: $id)\n }\n `,\n variables: { id: addressId },\n });\n if (result.errors?.length) {\n throw new Error(\n result.errors[0]?.message ?? \"Failed to remove pickup address\",\n );\n }\n clearGraphqlFetchResponseCache();\n refetchPickupAddresses();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressRemoved\", \"Pickup address removed\"),\n );\n } catch (error) {\n setFulfillmentError(\n error instanceof Error\n ? error.message\n : tr(\n \"devportal.failedToRemovePickupAddress\",\n \"Failed to remove pickup address\",\n ),\n );\n } finally {\n setPickupActionPendingId(null);\n setRemoveConfirmAddressId(null);\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\n id=\"fulfillment-section\"\n title={tr(\"devportal.fulfillment\", \"Fulfillment\")}\n className={cn(\n \"scroll-mt-6 rounded-lg transition-shadow duration-500\",\n highlightFulfillment &&\n \"ring-2 ring-action-primary-bg ring-offset-4\",\n )}\n >\n <div className=\"space-y-3\">\n {fulfillmentError && (\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 {fulfillmentError}\n </div>\n )}\n {fulfillmentMessage && (\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 {fulfillmentMessage}\n </div>\n )}\n\n {!pickupAddressesLoading && pickupAddresses.length === 0 && (\n <div className=\"rounded-md border border-border-seam bg-bg-sunken p-4\">\n <p className=\"text-sm font-medium\">\n {tr(\n \"devportal.noPickupAddress\",\n \"No pickup address set up yet\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"devportal.noPickupAddressHint\",\n \"Buyers need to know where your physical orders actually ship from — a bare pincode isn't enough, two sellers can share one. Add your real pickup address and we'll register it with our shipping carrier for you, free of charge.\",\n )}\n </p>\n </div>\n )}\n\n {pickupAddresses.length > 0 && (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {pickupAddresses.map((pickupAddress) => {\n const isRegisteredWithCarrier = pickupLocations.some(\n (location) =>\n location.carrier === pickupAddress.carrier &&\n location.postalCode === pickupAddress.postalCode,\n );\n const isPending = pickupActionPendingId === pickupAddress.id;\n\n return (\n <div\n key={pickupAddress.id}\n className={cn(\n \"rounded-md border p-4\",\n pickupAddress.isDefault\n ? \"border-status-success-border bg-status-success-bg-subtle\"\n : \"border-border-seam bg-bg-sunken\",\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-sm font-medium\">\n {pickupAddress.carrierLocationLabel}\n </p>\n {pickupAddress.isDefault && (\n <span className=\"rounded-full bg-status-success-bg px-2 py-0.5 text-xs font-medium text-white\">\n {tr(\"devportal.active\", \"Active\")}\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {pickupAddress.address}\n {pickupAddress.addressLine2\n ? `, ${pickupAddress.addressLine2}`\n : \"\"}\n , {pickupAddress.city}, {pickupAddress.state}{\" \"}\n {pickupAddress.postalCode}, {pickupAddress.country}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {capitalizeCarrierName(pickupAddress.carrier)}\n </p>\n {!isRegisteredWithCarrier && (\n <p className=\"mt-2 text-xs text-status-error-text\">\n {tr(\n \"devportal.pickupAddressNotRegisteredHint\",\n \"Not currently registered with the carrier — physical orders can't auto-ship from this address right now.\",\n )}\n </p>\n )}\n\n {canUpdate && (\n <div className=\"mt-3 flex items-center gap-4\">\n {!pickupAddress.isDefault && (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() =>\n void handleSetDefaultPickupAddress(\n pickupAddress.id,\n )\n }\n className=\"text-sm font-medium text-action-primary-text hover:underline disabled:opacity-50\"\n >\n {tr(\n \"devportal.setPickupAddressActiveCta\",\n \"Set as active\",\n )}\n </button>\n )}\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() =>\n setRemoveConfirmAddressId(pickupAddress.id)\n }\n className=\"flex items-center gap-1.5 text-sm text-status-error-text hover:underline disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n {tr(\"devportal.removePickupAddressCta\", \"Remove\")}\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {canUpdate && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => setShowRegisterPickupModal(true)}\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={14} />\n {tr(\"devportal.addPickupAddressCta\", \"Add pickup address\")}\n </button>\n </div>\n )}\n\n {showRegisterPickupModal && (\n <RegisterPickupLocationModal\n open={showRegisterPickupModal}\n onOpenChange={setShowRegisterPickupModal}\n organizationId={org.id}\n // Only carrier that supports self-service registration\n // today — becomes a real choice once more adapters\n // implement registerPickupLocation().\n carrier=\"shiprocket\"\n onRegistered={() => {\n refetchPickupAddresses();\n refetchPickupLocations();\n setFulfillmentMessage(\n tr(\"devportal.pickupAddressAdded\", \"Pickup address added\"),\n );\n }}\n />\n )}\n\n <ConfirmDialog\n open={removeConfirmAddressId !== null}\n onOpenChange={(open) => {\n if (!open) setRemoveConfirmAddressId(null);\n }}\n variant=\"danger\"\n loading={pickupActionPendingId === removeConfirmAddressId}\n title={tr(\n \"devportal.removePickupAddressConfirmTitle\",\n \"Remove this pickup address?\",\n )}\n description={tr(\n \"devportal.removePickupAddressConfirmDesc\",\n \"We'll stop using it to quote and book shipments for this organization. Carriers like Shiprocket don't offer a way to delete an address from their own account once added, so it may still show up there, but it won't be used for your orders anymore.\",\n )}\n confirmLabel={tr(\"devportal.remove\", \"Remove\")}\n cancelLabel={tr(\"devportal.cancel\", \"Cancel\")}\n onConfirm={async () => {\n if (removeConfirmAddressId) {\n await handleRemovePickupAddress(removeConfirmAddressId);\n }\n }}\n />\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevenueDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RevenueDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAqFhC,eAAO,MAAM,oBAAoB,EAAE,EA8qClC,CAAC"}
|