@burdenoff/microfe-devportal 2026.611.1 → 2026.611.2
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.js +232 -228
- package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
- package/dist/devportal/pages/RevenueDashboardPage.js +232 -176
- package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -1
- package/dist/devportal/types/index.js.map +1 -1
- package/dist/generated/global-operations.js +65 -39
- package/dist/generated/global-operations.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevenueDashboardPage.js","names":[],"sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n AlertCircle,\n ArrowDownToLine,\n Building2,\n CreditCard,\n DollarSign,\n Loader2,\n Wallet,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { StatusBadge } from \"../components/StatusBadge\";\nimport type { DeveloperOrganization } from \"../types\";\nimport {\n type GetMyOrganizationsQuery,\n type GetRevenueDashboardDataQuery,\n getErrorMessage,\n useGetMyOrganizationsQuery,\n useGetRevenueDashboardDataQuery,\n} from \"../hooks\";\nimport { useTr } from \"../utils/i18n\";\n\ntype TimeRange = \"30d\" | \"90d\" | \"12m\";\n\nconst chartColors = {\n primary: \"var(--color-chart-1)\",\n secondary: \"var(--color-chart-2)\",\n tertiary: \"var(--color-chart-4)\",\n};\n\ntype RevenueSale =\n GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number][\"node\"];\ntype RevenuePayout =\n GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number][\"node\"];\n\nconst daysByRange: Record<TimeRange, number> = {\n \"30d\": 30,\n \"90d\": 90,\n \"12m\": 365,\n};\n\nexport const RevenueDashboardPage: FC = () => {\n const tr = useTr();\n const [timeRange, setTimeRange] = useState<TimeRange>(\"90d\");\n const [selectedOrganizationId, setSelectedOrganizationId] = useState(\"\");\n const [searchParams] = useSearchParams();\n const now = useMemo(() => new Date(), []);\n const requestedOrganizationId = searchParams.get(\"org\");\n const startDate = useMemo(() => {\n const nextDate = new Date(now);\n nextDate.setDate(nextDate.getDate() - daysByRange[timeRange]);\n return nextDate.toISOString();\n }, [now, timeRange]);\n\n const {\n data: organizationsData,\n loading: organizationsLoading,\n error: organizationsError,\n } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data, loading, error } = useGetRevenueDashboardDataQuery({\n variables: {\n organizationId: selectedOrganizationId,\n period: \"monthly\",\n startDate,\n endDate: now.toISOString(),\n salesLimit: 10,\n salesOffset: 0,\n payoutsLimit: 10,\n payoutsOffset: 0,\n },\n skip: !selectedOrganizationId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizations: DeveloperOrganization[] = useMemo(\n () =>\n organizationsData?.myDeveloperOrganizations?.map(\n (\n organization: GetMyOrganizationsQuery[\"myDeveloperOrganizations\"][number],\n ) => organization as unknown as DeveloperOrganization,\n ) ?? [],\n [organizationsData?.myDeveloperOrganizations],\n );\n\n useEffect(() => {\n if (selectedOrganizationId) {\n return;\n }\n\n if (\n requestedOrganizationId &&\n organizations.some(\n (organization) => organization.id === requestedOrganizationId,\n )\n ) {\n setSelectedOrganizationId(requestedOrganizationId);\n return;\n }\n\n if (organizations.length === 1) {\n setSelectedOrganizationId(organizations[0]?.id ?? \"\");\n }\n }, [organizations, requestedOrganizationId, selectedOrganizationId]);\n\n const selectedOrganization = organizations.find(\n (organization) => organization.id === selectedOrganizationId,\n );\n const summary = data?.developerOrgRevenueSummary;\n const analytics = [...(data?.developerOrgRevenueAnalytics ?? [])].sort(\n (left, right) =>\n new Date(left.date).getTime() - new Date(right.date).getTime(),\n );\n const sales: RevenueSale[] =\n data?.developerOrgSales?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n const payouts: RevenuePayout[] =\n data?.developerOrgPayouts?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n\n const chartData = analytics.map((entry) => ({\n date: new Date(entry.date).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n }),\n grossRevenue: entry.grossRevenue,\n netRevenue: entry.netRevenue,\n platformFees: entry.platformFees,\n refunds: entry.refunds,\n salesCount: entry.salesCount,\n }));\n\n if (organizationsLoading && !organizationsData) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n </PageLayout>\n );\n }\n\n if (organizationsError) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadOrgs\",\n \"Unable to load organizations\",\n )}\n description={getErrorMessage(organizationsError)}\n />\n </PageLayout>\n );\n }\n\n if (!selectedOrganizationId) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.selectOrgDescription\",\n \"Select an organization to review real sales and payout data through the public gateway\",\n )}\n >\n {organizations.length > 0 ? (\n <div className=\"space-y-2\">\n {organizations.map((organization) => (\n <button\n key={organization.id}\n type=\"button\"\n onClick={() => setSelectedOrganizationId(organization.id)}\n className=\"flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent\"\n >\n <div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{organization.name}</span>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {organization.totalApps ?? 0}{\" \"}\n {tr(\"devportal.revenue.apps\", \"apps\")} · $\n {organization.totalRevenue?.toLocaleString() ?? 0}{\" \"}\n {tr(\"devportal.revenue.revenue\", \"revenue\")}\n </p>\n </div>\n </button>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\n \"devportal.revenue.noOrgsTitle\",\n \"No organizations available\",\n )}\n description={tr(\n \"devportal.revenue.noOrgsDescription\",\n \"Create a developer organization before reviewing revenue data.\",\n )}\n />\n )}\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadData\",\n \"Unable to load revenue data\",\n )}\n description={getErrorMessage(error)}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={\n selectedOrganization\n ? `${tr(\"devportal.revenue.financialPerformanceFor\", \"Financial performance for\")} ${selectedOrganization.name}`\n : tr(\n \"devportal.revenue.shortDescription\",\n \"Track revenue, sales, and payouts\",\n )\n }\n actions={\n <div className=\"flex flex-wrap gap-2\">\n <select\n value={selectedOrganizationId}\n onChange={(event) => setSelectedOrganizationId(event.target.value)}\n aria-label={tr(\n \"devportal.revenue.selectOrgAria\",\n \"Select organization\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n {organizations.map((organization) => (\n <option key={organization.id} value={organization.id}>\n {organization.name}\n </option>\n ))}\n </select>\n <select\n value={timeRange}\n onChange={(event) => setTimeRange(event.target.value as TimeRange)}\n aria-label={tr(\n \"devportal.revenue.selectRangeAria\",\n \"Select time range\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n <option value=\"30d\">\n {tr(\"devportal.revenue.range.30d\", \"Last 30 days\")}\n </option>\n <option value=\"90d\">\n {tr(\"devportal.revenue.range.90d\", \"Last 90 days\")}\n </option>\n <option value=\"12m\">\n {tr(\"devportal.revenue.range.12m\", \"Last 12 months\")}\n </option>\n </select>\n </div>\n }\n >\n {loading && !summary ? (\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n ) : summary ? (\n <>\n <StatCardGrid columns={4}>\n <StatCard\n title={tr(\"devportal.revenue.grossRevenue\", \"Gross Revenue\")}\n value={`$${summary.totalGrossRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.netRevenue\", \"Net Revenue\")}\n value={`$${summary.totalNetRevenue.toLocaleString()}`}\n icon={<Wallet size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.pendingBalance\", \"Pending Balance\")}\n value={`$${summary.pendingBalance.toLocaleString()}`}\n icon={<CreditCard size={20} />}\n description={\n summary.nextPayoutDate\n ? `${tr(\"devportal.revenue.nextPayout\", \"Next payout\")} ${new Date(summary.nextPayoutDate).toLocaleDateString()}`\n : tr(\n \"devportal.revenue.noPayoutScheduled\",\n \"No payout scheduled\",\n )\n }\n />\n <StatCard\n title={tr(\"devportal.revenue.platformFees\", \"Platform Fees\")}\n value={`$${summary.totalPlatformFees.toLocaleString()}`}\n icon={<ArrowDownToLine size={20} />}\n description={`${summary.totalRefundsCount} ${tr(\"devportal.revenue.refunds\", \"refunds\")}`}\n />\n </StatCardGrid>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.revenueTrend\", \"Revenue trend\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"grossRevenue\"\n stroke={chartColors.primary}\n strokeWidth={2}\n dot={false}\n />\n <Line\n type=\"monotone\"\n dataKey=\"netRevenue\"\n stroke={chartColors.secondary}\n strokeWidth={2}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.revenue.topApps\",\n \"Top applications by revenue\",\n )}\n >\n {summary.topApps.length > 0 ? (\n <div className=\"space-y-2\">\n {summary.topApps.map(\n (\n application: GetRevenueDashboardDataQuery[\"developerOrgRevenueSummary\"][\"topApps\"][number],\n ) => (\n <div\n key={application.applicationId}\n className=\"rounded-lg border bg-card p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">\n {application.applicationName}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {application.salesCount}{\" \"}\n {tr(\"devportal.revenue.sales\", \"sales\")}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n ${application.grossRevenue.toLocaleString()}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\"devportal.revenue.net\", \"Net\")} $\n {application.netRevenue.toLocaleString()}\n </p>\n </div>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <EmptyState\n icon={<Building2 size={24} />}\n title={tr(\n \"devportal.revenue.noLeadersTitle\",\n \"No revenue leaders yet\",\n )}\n description={tr(\n \"devportal.revenue.noLeadersDescription\",\n \"Top-performing applications will appear here once revenue is recorded.\",\n )}\n />\n )}\n </PageSection>\n </div>\n\n <PageSection\n title={tr(\"devportal.revenue.salesVolume\", \"Sales volume\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={280}>\n <BarChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Bar\n dataKey=\"salesCount\"\n fill={chartColors.tertiary}\n radius={[6, 6, 0, 0]}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.recentSales\", \"Recent sales\")}\n >\n <DataTable\n data={sales}\n keyField=\"id\"\n columns={[\n {\n key: \"application\",\n header: tr(\"devportal.revenue.application\", \"Application\"),\n render: (sale) =>\n sale.application?.name ||\n sale.planName ||\n tr(\"devportal.common.unknown\", \"Unknown\"),\n },\n {\n key: \"grossAmount\",\n header: tr(\"devportal.revenue.gross\", \"Gross\"),\n render: (sale) => `$${sale.grossAmount.toLocaleString()}`,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.net\", \"Net\"),\n render: (sale) => `$${sale.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (sale) => (\n <StatusBadge status={sale.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.revenue.payoutHistory\", \"Payout history\")}\n >\n <DataTable\n data={payouts}\n keyField=\"id\"\n columns={[\n {\n key: \"periodLabel\",\n header: tr(\"devportal.revenue.period\", \"Period\"),\n render: (payout) => payout.periodLabel,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.netPayout\", \"Net payout\"),\n render: (payout) => `$${payout.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (payout) => (\n <StatusBadge status={payout.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n </div>\n </>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\"devportal.revenue.noDataTitle\", \"No revenue data yet\")}\n description={tr(\n \"devportal.revenue.noDataDescription\",\n \"Revenue metrics will appear after this organization starts recording marketplace sales.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RevenueDashboardPage.js","names":[],"sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n AlertCircle,\n ArrowDownToLine,\n Building2,\n CreditCard,\n DollarSign,\n Link2,\n Loader2,\n Wallet,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { StatusBadge } from \"../components/StatusBadge\";\nimport type { DeveloperOrganization } from \"../types\";\nimport {\n type GetMyOrganizationsQuery,\n type GetRevenueDashboardDataQuery,\n getErrorMessage,\n useCreateBillingAccountMutation,\n useGetMyOrganizationsQuery,\n useGetRevenueDashboardDataQuery,\n useLinkDevOrgBillingAccountMutation,\n} from \"../hooks\";\nimport { useTr } from \"../utils/i18n\";\n\ntype TimeRange = \"30d\" | \"90d\" | \"12m\";\n\nconst chartColors = {\n primary: \"var(--color-chart-1)\",\n secondary: \"var(--color-chart-2)\",\n tertiary: \"var(--color-chart-4)\",\n};\n\ntype RevenueSale =\n GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number][\"node\"];\ntype RevenuePayout =\n GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number][\"node\"];\n\nconst daysByRange: Record<TimeRange, number> = {\n \"30d\": 30,\n \"90d\": 90,\n \"12m\": 365,\n};\n\nexport const RevenueDashboardPage: FC = () => {\n const tr = useTr();\n const [timeRange, setTimeRange] = useState<TimeRange>(\"90d\");\n const [selectedOrganizationId, setSelectedOrganizationId] = useState(\"\");\n const [linkingBilling, setLinkingBilling] = useState(false);\n const [linkBillingError, setLinkBillingError] = useState<string | null>(null);\n\n const [createBillingAccount] = useCreateBillingAccountMutation();\n const [linkBillingAccount] = useLinkDevOrgBillingAccountMutation();\n const [searchParams] = useSearchParams();\n const now = useMemo(() => new Date(), []);\n const requestedOrganizationId = searchParams.get(\"org\");\n const startDate = useMemo(() => {\n const nextDate = new Date(now);\n nextDate.setDate(nextDate.getDate() - daysByRange[timeRange]);\n return nextDate.toISOString();\n }, [now, timeRange]);\n\n const {\n data: organizationsData,\n loading: organizationsLoading,\n error: organizationsError,\n } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data, loading, error } = useGetRevenueDashboardDataQuery({\n variables: {\n organizationId: selectedOrganizationId,\n period: \"monthly\",\n startDate,\n endDate: now.toISOString(),\n salesLimit: 10,\n salesOffset: 0,\n payoutsLimit: 10,\n payoutsOffset: 0,\n },\n skip: !selectedOrganizationId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizations: DeveloperOrganization[] = useMemo(\n () =>\n organizationsData?.myDeveloperOrganizations?.map(\n (\n organization: GetMyOrganizationsQuery[\"myDeveloperOrganizations\"][number],\n ) => organization as unknown as DeveloperOrganization,\n ) ?? [],\n [organizationsData?.myDeveloperOrganizations],\n );\n\n useEffect(() => {\n if (selectedOrganizationId) {\n return;\n }\n\n if (\n requestedOrganizationId &&\n organizations.some(\n (organization) => organization.id === requestedOrganizationId,\n )\n ) {\n setSelectedOrganizationId(requestedOrganizationId);\n return;\n }\n\n if (organizations.length === 1) {\n setSelectedOrganizationId(organizations[0]?.id ?? \"\");\n }\n }, [organizations, requestedOrganizationId, selectedOrganizationId]);\n\n const selectedOrganization = organizations.find(\n (organization) => organization.id === selectedOrganizationId,\n );\n\n const handleLinkBillingAccount = async () => {\n if (!selectedOrganizationId) return;\n setLinkingBilling(true);\n setLinkBillingError(null);\n try {\n const billingResult = await createBillingAccount({\n variables: {\n input: {\n name: selectedOrganization?.name ?? selectedOrganizationId,\n email: \"\",\n },\n },\n });\n const billingAccountId = billingResult.data?.createBillingAccount?.id;\n if (billingAccountId) {\n await linkBillingAccount({\n variables: {\n organizationId: selectedOrganizationId,\n billingAccountId,\n },\n refetchQueries: [\"GetMyOrganizations\"],\n });\n }\n } catch (err) {\n setLinkBillingError(\n err instanceof Error ? err.message : \"Failed to link billing account\",\n );\n } finally {\n setLinkingBilling(false);\n }\n };\n\n const summary = data?.developerOrgRevenueSummary;\n const analytics = [...(data?.developerOrgRevenueAnalytics ?? [])].sort(\n (left, right) =>\n new Date(left.date).getTime() - new Date(right.date).getTime(),\n );\n const sales: RevenueSale[] =\n data?.developerOrgSales?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n const payouts: RevenuePayout[] =\n data?.developerOrgPayouts?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n\n const chartData = analytics.map((entry) => ({\n date: new Date(entry.date).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n }),\n grossRevenue: entry.grossRevenue,\n netRevenue: entry.netRevenue,\n platformFees: entry.platformFees,\n refunds: entry.refunds,\n salesCount: entry.salesCount,\n }));\n\n if (organizationsLoading && !organizationsData) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n </PageLayout>\n );\n }\n\n if (organizationsError) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadOrgs\",\n \"Unable to load organizations\",\n )}\n description={getErrorMessage(organizationsError)}\n />\n </PageLayout>\n );\n }\n\n if (!selectedOrganizationId) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.selectOrgDescription\",\n \"Select an organization to review real sales and payout data through the public gateway\",\n )}\n >\n {organizations.length > 0 ? (\n <div className=\"space-y-2\">\n {organizations.map((organization) => (\n <button\n key={organization.id}\n type=\"button\"\n onClick={() => setSelectedOrganizationId(organization.id)}\n className=\"flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent\"\n >\n <div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{organization.name}</span>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {organization.totalApps ?? 0}{\" \"}\n {tr(\"devportal.revenue.apps\", \"apps\")} · $\n {organization.totalRevenue?.toLocaleString() ?? 0}{\" \"}\n {tr(\"devportal.revenue.revenue\", \"revenue\")}\n </p>\n </div>\n </button>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\n \"devportal.revenue.noOrgsTitle\",\n \"No organizations available\",\n )}\n description={tr(\n \"devportal.revenue.noOrgsDescription\",\n \"Create a developer organization before reviewing revenue data.\",\n )}\n />\n )}\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadData\",\n \"Unable to load revenue data\",\n )}\n description={getErrorMessage(error)}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={\n selectedOrganization\n ? `${tr(\"devportal.revenue.financialPerformanceFor\", \"Financial performance for\")} ${selectedOrganization.name}`\n : tr(\n \"devportal.revenue.shortDescription\",\n \"Track revenue, sales, and payouts\",\n )\n }\n actions={\n <div className=\"flex flex-wrap gap-2\">\n <select\n value={selectedOrganizationId}\n onChange={(event) => setSelectedOrganizationId(event.target.value)}\n aria-label={tr(\n \"devportal.revenue.selectOrgAria\",\n \"Select organization\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n {organizations.map((organization) => (\n <option key={organization.id} value={organization.id}>\n {organization.name}\n </option>\n ))}\n </select>\n <select\n value={timeRange}\n onChange={(event) => setTimeRange(event.target.value as TimeRange)}\n aria-label={tr(\n \"devportal.revenue.selectRangeAria\",\n \"Select time range\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n <option value=\"30d\">\n {tr(\"devportal.revenue.range.30d\", \"Last 30 days\")}\n </option>\n <option value=\"90d\">\n {tr(\"devportal.revenue.range.90d\", \"Last 90 days\")}\n </option>\n <option value=\"12m\">\n {tr(\"devportal.revenue.range.12m\", \"Last 12 months\")}\n </option>\n </select>\n </div>\n }\n >\n {/* Billing account link banner for orgs not yet linked */}\n {selectedOrganization && !selectedOrganization.billingAccountId && (\n <div className=\"mb-6 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex items-start gap-3\">\n <Link2 size={20} className=\"text-accent-blue flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-status-info-text\">\n {tr(\n \"devportal.revenue.billingNotLinkedTitle\",\n \"Link a billing account to receive store revenue\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-status-info-text\">\n {tr(\n \"devportal.revenue.billingNotLinkedDesc\",\n \"Once linked, net earnings from app sales will appear in your billing credits — you can spend them on platform services or withdraw to your bank.\",\n )}\n </p>\n {linkBillingError && (\n <p className=\"mt-2 text-sm text-status-error-text\">\n {linkBillingError}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleLinkBillingAccount}\n disabled={linkingBilling}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50 flex-shrink-0\"\n >\n {linkingBilling ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Link2 size={14} />\n )}\n {linkingBilling\n ? tr(\"devportal.revenue.linking\", \"Linking...\")\n : tr(\n \"devportal.revenue.linkBillingAccount\",\n \"Link Billing Account\",\n )}\n </button>\n </div>\n )}\n\n {loading && !summary ? (\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n ) : summary ? (\n <>\n <StatCardGrid columns={4}>\n <StatCard\n title={tr(\"devportal.revenue.grossRevenue\", \"Gross Revenue\")}\n value={`$${summary.totalGrossRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.netRevenue\", \"Net Revenue\")}\n value={`$${summary.totalNetRevenue.toLocaleString()}`}\n icon={<Wallet size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.pendingBalance\", \"Pending Balance\")}\n value={`$${summary.pendingBalance.toLocaleString()}`}\n icon={<CreditCard size={20} />}\n description={\n summary.nextPayoutDate\n ? `${tr(\"devportal.revenue.nextPayout\", \"Next payout\")} ${new Date(summary.nextPayoutDate).toLocaleDateString()}`\n : tr(\n \"devportal.revenue.noPayoutScheduled\",\n \"No payout scheduled\",\n )\n }\n />\n <StatCard\n title={tr(\"devportal.revenue.platformFees\", \"Platform Fees\")}\n value={`$${summary.totalPlatformFees.toLocaleString()}`}\n icon={<ArrowDownToLine size={20} />}\n description={`${summary.totalRefundsCount} ${tr(\"devportal.revenue.refunds\", \"refunds\")}`}\n />\n </StatCardGrid>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.revenueTrend\", \"Revenue trend\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"grossRevenue\"\n stroke={chartColors.primary}\n strokeWidth={2}\n dot={false}\n />\n <Line\n type=\"monotone\"\n dataKey=\"netRevenue\"\n stroke={chartColors.secondary}\n strokeWidth={2}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.revenue.topApps\",\n \"Top applications by revenue\",\n )}\n >\n {summary.topApps.length > 0 ? (\n <div className=\"space-y-2\">\n {summary.topApps.map(\n (\n application: GetRevenueDashboardDataQuery[\"developerOrgRevenueSummary\"][\"topApps\"][number],\n ) => (\n <div\n key={application.applicationId}\n className=\"rounded-lg border bg-card p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">\n {application.applicationName}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {application.salesCount}{\" \"}\n {tr(\"devportal.revenue.sales\", \"sales\")}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n ${application.grossRevenue.toLocaleString()}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\"devportal.revenue.net\", \"Net\")} $\n {application.netRevenue.toLocaleString()}\n </p>\n </div>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <EmptyState\n icon={<Building2 size={24} />}\n title={tr(\n \"devportal.revenue.noLeadersTitle\",\n \"No revenue leaders yet\",\n )}\n description={tr(\n \"devportal.revenue.noLeadersDescription\",\n \"Top-performing applications will appear here once revenue is recorded.\",\n )}\n />\n )}\n </PageSection>\n </div>\n\n <PageSection\n title={tr(\"devportal.revenue.salesVolume\", \"Sales volume\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={280}>\n <BarChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Bar\n dataKey=\"salesCount\"\n fill={chartColors.tertiary}\n radius={[6, 6, 0, 0]}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.recentSales\", \"Recent sales\")}\n >\n <DataTable\n data={sales}\n keyField=\"id\"\n columns={[\n {\n key: \"application\",\n header: tr(\"devportal.revenue.application\", \"Application\"),\n render: (sale) =>\n sale.application?.name ||\n sale.planName ||\n tr(\"devportal.common.unknown\", \"Unknown\"),\n },\n {\n key: \"grossAmount\",\n header: tr(\"devportal.revenue.gross\", \"Gross\"),\n render: (sale) => `$${sale.grossAmount.toLocaleString()}`,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.net\", \"Net\"),\n render: (sale) => `$${sale.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (sale) => (\n <StatusBadge status={sale.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.revenue.payoutHistory\", \"Payout history\")}\n >\n <DataTable\n data={payouts}\n keyField=\"id\"\n columns={[\n {\n key: \"periodLabel\",\n header: tr(\"devportal.revenue.period\", \"Period\"),\n render: (payout) => payout.periodLabel,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.netPayout\", \"Net payout\"),\n render: (payout) => `$${payout.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (payout) => (\n <StatusBadge status={payout.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n </div>\n </>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\"devportal.revenue.noDataTitle\", \"No revenue data yet\")}\n description={tr(\n \"devportal.revenue.noDataDescription\",\n \"Revenue metrics will appear after this organization starts recording marketplace sales.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/devportal/types/index.ts"],"sourcesContent":["/**\n * Developer Portal Types\n *\n * Core type definitions for the Developer Portal microfrontend\n */\n\nimport type { ReactNode } from \"react\";\n\n// =============================================================================\n// NAVIGATION TYPES\n// =============================================================================\n\n/**\n * Navigation item for shell integration\n */\nexport interface NavItem {\n id: string;\n label: string;\n path: string;\n icon?: ReactNode;\n badge?: number;\n order?: number;\n group?: string;\n visible?: boolean;\n children?: NavItem[];\n}\n\n/**\n * Footer item for shell integration\n */\nexport interface FooterItem {\n id: string;\n label: string;\n type: \"status\" | \"action\";\n order?: number;\n section: \"left\" | \"center\" | \"right\";\n}\n\n// =============================================================================\n// ROOT PROPS\n// =============================================================================\n\n/**\n * Props for the DevportalRoot component\n */\nexport interface DevportalRootProps {\n /**\n * Base path for the devportal microfrontend\n */\n basePath?: string;\n\n /**\n * Tenant ID for scoping operations\n */\n tenantId?: string;\n\n /**\n * Workspace ID (optional, for workspace-scoped features)\n */\n workspaceId?: string;\n\n /**\n * API Gateway URL for GraphQL requests (global gateway)\n */\n apiGatewayUrl?: string;\n\n /**\n * Workspace gateway URL for workspace-layer operations (e.g. wspace-files-svc uploads)\n * e.g. \"https://graphqlworkspaces.burdenoff.com\" or \"http://localhost:4003\"\n */\n workspacesGatewayUrl?: string;\n\n /**\n * Authentication token for API requests\n */\n authToken?: string;\n\n /**\n * Workspace authentication token for workspace-gateway requests (X-Workspace-Authorization).\n * May be a cached/stale value — use getWorkspaceToken() for upload flows that need a fresh token.\n */\n workspaceToken?: string;\n\n /**\n * Async getter that always returns a valid (non-expired) workspace token.\n * Call this instead of reading workspaceToken directly for workspace-layer mutations.\n */\n getWorkspaceToken?: () => Promise<string | null>;\n\n /**\n * Navigation function provided by the shell\n */\n navigate?: (path: string) => void;\n\n /**\n * Current user information\n */\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n };\n\n /**\n * Optional function to register navigation items with the shell\n */\n registerNavItems?: (items: NavItem | NavItem[]) => () => void;\n\n /**\n * Optional function to register footer items with the shell\n */\n registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;\n\n /**\n * Optional callback when an application is selected\n */\n onApplicationSelect?: (app: Application) => void;\n\n /**\n * Optional callback when an organization is selected\n */\n onOrganizationSelect?: (org: DeveloperOrganization) => void;\n}\n\n// =============================================================================\n// APPLICATION TYPES\n// =============================================================================\n\nexport type AppType =\n | \"WEB_APP\"\n | \"MOBILE_APP\"\n | \"DESKTOP_APP\"\n | \"CLI_TOOL\"\n | \"API_INTEGRATION\"\n | \"WORKFLOW\"\n | \"WIDGET\"\n | \"BOT\"\n | \"SERVICE\"\n | \"INTEGRATION\"\n | \"ANALYST\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"SPECIALIST\";\n\nexport type AppStatus =\n | \"DRAFT\"\n | \"SUBMITTED\"\n | \"IN_REVIEW\"\n | \"APPROVED\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"SUSPENDED\"\n | \"DEPRECATED\"\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"REVOKED\";\n\nexport type AppVisibility = \"PUBLIC\" | \"PRIVATE\" | \"UNLISTED\" | \"INTERNAL\";\n\nexport type AppSubmissionReviewStatus =\n | \"PENDING\"\n | \"IN_PROGRESS\"\n | \"APPROVED\"\n | \"REJECTED\"\n | \"CHANGES_REQUESTED\";\n\nexport interface Application {\n id: string;\n name: string;\n slug: string;\n shortDescription?: string;\n description?: string;\n appType: AppType;\n status: AppStatus;\n visibility: AppVisibility;\n tenantId: string;\n developerId: string;\n developerOrganizationId?: string;\n developerOrganization?: DeveloperOrganization;\n category?: string;\n tags: string[];\n keywords: string[];\n iconUrl?: string;\n bannerUrl?: string;\n videoUrl?: string;\n screenshots?: Record<string, unknown>;\n websiteUrl?: string;\n documentationUrl?: string;\n supportUrl?: string;\n privacyPolicyUrl?: string;\n termsOfServiceUrl?: string;\n githubUrl?: string;\n pricingType?: string;\n pricingDetails?: Record<string, unknown>;\n installCount: number;\n activeInstallCount: number;\n averageRating?: number;\n reviewCount: number;\n submittedAt?: string;\n publishedAt?: string;\n lastReviewedAt?: string;\n reviewStatus: AppSubmissionReviewStatus;\n reviewNotes?: string;\n reviewedBy?: string;\n isFeatured: boolean;\n isVerified: boolean;\n requiresApproval: boolean;\n manifest?: Record<string, unknown>;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n appId?: string;\n createdAt: string;\n updatedAt: string;\n versions?: ApplicationVersion[];\n oauthClients?: OAuthClient[];\n apiKeys?: ApiKey[];\n webhooks?: Webhook[];\n scopes?: ApplicationScope[];\n}\n\nexport interface ApplicationVersion {\n id: string;\n applicationId: string;\n version: string;\n releaseNotes?: string;\n changelog?: string;\n status: string;\n isLatest: boolean;\n isStable: boolean;\n packageUrl?: string;\n packageSize?: string;\n packageHash?: string;\n manifest?: Record<string, unknown>;\n minPlatformVersion?: string;\n maxPlatformVersion?: string;\n requiredScopes: string[];\n publishedAt?: string;\n deprecatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApplicationScope {\n id: string;\n applicationId: string;\n scope: string;\n description?: string;\n isRequired: boolean;\n createdAt: string;\n}\n\n// =============================================================================\n// OAUTH TYPES\n// =============================================================================\n\nexport type OAuthClientType = \"PUBLIC\" | \"CONFIDENTIAL\";\n\nexport type OAuthGrantType =\n | \"AUTHORIZATION_CODE\"\n | \"REFRESH_TOKEN\"\n | \"CLIENT_CREDENTIALS\"\n | \"IMPLICIT\"\n | \"PASSWORD\";\n\nexport interface OAuthClient {\n id: string;\n applicationId: string;\n name: string;\n clientId: string;\n clientSecret: string;\n clientType: OAuthClientType;\n redirectUris: string[];\n allowedGrantTypes: OAuthGrantType[];\n allowedScopes: string[];\n accessTokenLifetime: number;\n refreshTokenLifetime: number;\n isActive: boolean;\n requirePKCE: boolean;\n requireConsent: boolean;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OAuthToken {\n id: string;\n clientId: string;\n userId: string;\n tenantId: string;\n workspaceId?: string;\n accessToken: string;\n refreshToken?: string;\n tokenType: string;\n scopes: string[];\n expiresAt: string;\n refreshExpiresAt?: string;\n isRevoked: boolean;\n revokedAt?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n// =============================================================================\n// API KEY TYPES\n// =============================================================================\n\nexport type ApiKeyType = \"PUBLISHABLE\" | \"SECRET\" | \"RESTRICTED\";\n\nexport interface ApiKey {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n keyId: string;\n keyHash?: string; // Hash is not always returned by API for security\n keyPrefix: string;\n keyType: ApiKeyType;\n scopes: string[];\n permissions?: Record<string, unknown>;\n rateLimit?: number;\n quotaLimit?: number;\n quotaUsed: number;\n quotaResetAt?: string;\n allowedIps: string[];\n allowedDomains: string[];\n environment?: string;\n isActive: boolean;\n isRevoked: boolean;\n createdAt: string;\n lastUsedAt?: string;\n expiresAt?: string;\n revokedAt?: string;\n}\n\nexport interface ApiKeyPayload {\n apiKey: ApiKey;\n plainTextKey: string;\n}\n\n// =============================================================================\n// WEBHOOK TYPES\n// =============================================================================\n\nexport type WebhookStatus = \"ACTIVE\" | \"PAUSED\" | \"FAILED\" | \"DISABLED\";\n\nexport type WebhookDeliveryStatus =\n | \"PENDING\"\n | \"DELIVERING\"\n | \"DELIVERED\"\n | \"FAILED\"\n | \"RETRYING\";\n\nexport interface Webhook {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n url: string;\n secret: string;\n events: string[];\n filters?: Record<string, unknown>;\n retryEnabled: boolean;\n maxRetries: number;\n retryDelay: number;\n status: WebhookStatus;\n isActive: boolean;\n successCount: number;\n failureCount: number;\n lastTriggeredAt?: string;\n lastSuccessAt?: string;\n lastFailureAt?: string;\n lastFailureReason?: string;\n createdAt: string;\n updatedAt: string;\n deliveries?: WebhookDelivery[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n eventType: string;\n eventId: string;\n payload: Record<string, unknown>;\n attemptNumber: number;\n status: WebhookDeliveryStatus;\n requestHeaders?: Record<string, unknown>;\n requestBody?: Record<string, unknown>;\n responseStatus?: number;\n responseHeaders?: Record<string, unknown>;\n responseBody?: string;\n deliveredAt?: string;\n failedAt?: string;\n nextRetryAt?: string;\n errorMessage?: string;\n errorCode?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WebhookTestResult {\n success: boolean;\n statusCode?: number;\n response?: string;\n error?: string;\n}\n\n// =============================================================================\n// DEVELOPER ORGANIZATION TYPES\n// =============================================================================\n\nexport type DeveloperOrgRole = \"OWNER\" | \"ADMIN\" | \"DEVELOPER\" | \"VIEWER\";\n\nexport type DeveloperOrgTier =\n | \"FREE\"\n | \"DEVELOPER\"\n | \"PROFESSIONAL\"\n | \"ENTERPRISE\";\n\nexport type PartnerTier = \"REGISTERED\" | \"SELECT\" | \"PREMIER\";\n\nexport type InvitationStatus =\n | \"PENDING\"\n | \"ACCEPTED\"\n | \"REJECTED\"\n | \"EXPIRED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrganization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n logoUrl?: string;\n bannerUrl?: string;\n websiteUrl?: string;\n contactEmail?: string;\n supportEmail?: string;\n tier: DeveloperOrgTier;\n partnerTier?: PartnerTier;\n partnerSince?: string;\n isVerified: boolean;\n verifiedAt?: string;\n verificationMethod?: string;\n isCertified: boolean;\n certifiedAt?: string;\n certificationExpiry?: string;\n totalApps: number;\n publishedApps: number;\n totalInstalls: number;\n activeInstalls: number;\n totalApiCalls: string;\n averageRating?: number;\n totalRevenue: number;\n totalPlatformFees: number;\n totalPayouts: number;\n pendingBalance: number;\n lifetimeRevenue: number;\n platformFeeRate: number;\n apiCallsLimit: number;\n storageLimit: string;\n apiCallsUsed: string;\n storageUsed: string;\n quotaResetAt?: string;\n taxId?: string;\n taxCountry?: string;\n taxFormType?: string;\n taxFormVerified: boolean;\n legalEntityName?: string;\n legalEntityType?: string;\n legalAddress?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n members?: DeveloperOrgMember[];\n invitations?: DeveloperOrgInvitation[];\n applications?: Application[];\n}\n\nexport interface DeveloperOrgMember {\n id: string;\n organizationId: string;\n userId: string;\n email?: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy?: string;\n invitationId?: string;\n isActive: boolean;\n isSuspended: boolean;\n suspendedAt?: string;\n suspendedReason?: string;\n joinedAt: string;\n lastActiveAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DeveloperOrgInvitation {\n id: string;\n organizationId: string;\n invitedUserId?: string;\n invitedEmail: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy: string;\n message?: string;\n token: string;\n status: InvitationStatus;\n expiresAt: string;\n respondedAt?: string;\n memberId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// ANALYTICS TYPES (MOCKED)\n// =============================================================================\n\nexport interface ApplicationAnalytics {\n id: string;\n applicationId: string;\n date: string;\n period: string;\n activeUsers: number;\n newUsers: number;\n apiCalls: number;\n errors: number;\n avgResponseTime?: number;\n sessions: number;\n avgSessionDuration?: number;\n createdAt: string;\n}\n\nexport interface DeveloperOrgRevenueAnalytics {\n id: string;\n organizationId: string;\n period: string;\n periodStart: string;\n periodEnd: string;\n grossRevenue: number;\n platformFees: number;\n netRevenue: number;\n salesCount: number;\n refundsCount: number;\n refundsAmount: number;\n newSubscribers: number;\n churnedSubscribers: number;\n activeSubscribers: number;\n avgRevenuePerUser: number;\n topApps?: Array<{ appId: string; revenue: number }>;\n createdAt: string;\n}\n\n// =============================================================================\n// MONETIZATION TYPES (MOCKED)\n// =============================================================================\n\nexport type DevPortalPricingModel =\n | \"FREE\"\n | \"FREEMIUM\"\n | \"SUBSCRIPTION\"\n | \"ONE_TIME\"\n | \"USAGE_BASED\"\n | \"ENTERPRISE\";\n\nexport type SaleStatus =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"REFUNDED\"\n | \"PARTIAL_REFUND\"\n | \"DISPUTED\"\n | \"CHARGEBACK\"\n | \"CANCELLED\";\n\nexport type PayoutStatus =\n | \"PENDING\"\n | \"PROCESSING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrgSale {\n id: string;\n organizationId: string;\n applicationId: string;\n buyerUserId: string;\n buyerTenantId?: string;\n installationScope: string;\n pricingModel: DevPortalPricingModel;\n planName?: string;\n grossAmount: number;\n platformFeeRate: number;\n platformFee: number;\n netAmount: number;\n currency: string;\n taxAmount?: number;\n discountAmount?: number;\n status: SaleStatus;\n createdAt: string;\n}\n\nexport interface DeveloperOrgPayout {\n id: string;\n organizationId: string;\n periodStart: string;\n periodEnd: string;\n grossAmount: number;\n platformFees: number;\n netAmount: number;\n currency: string;\n status: PayoutStatus;\n processedAt?: string;\n failedAt?: string;\n failureReason?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// APP INSTALLATION TYPES\n// =============================================================================\n\nexport type AppInstallationStatus =\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"TRIAL\"\n | \"EXPIRED\"\n | \"UNINSTALLED\";\n\nexport interface AppInstallation {\n id: string;\n applicationId: string;\n userId: string;\n tenantId?: string;\n workspaceId?: string;\n organizationId?: string;\n scope: string;\n installedVersion: string;\n status: AppInstallationStatus;\n grantedScopes: string[];\n settings?: Record<string, unknown>;\n installedAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// REVIEW TYPES\n// =============================================================================\n\nexport type ReviewStatus =\n | \"PENDING\"\n | \"PUBLISHED\"\n | \"HIDDEN\"\n | \"FLAGGED\"\n | \"REMOVED\";\n\nexport interface AppReview {\n id: string;\n applicationId: string;\n userId: string;\n rating: number;\n title?: string;\n body?: string;\n status: ReviewStatus;\n isFeatured: boolean;\n helpfulCount: number;\n notHelpfulCount: number;\n developerResponse?: string;\n developerResponseAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// DELEGATION TYPES\n// =============================================================================\n\nexport type DelegationStatus = \"ACTIVE\" | \"REVOKED\" | \"EXPIRED\";\n\nexport interface AppUserDelegation {\n id: string;\n appId: string;\n app?: {\n id: string;\n name: string;\n description?: string;\n type: string;\n status: string;\n };\n userId: string;\n scopes: string[];\n workspaceIds: string[];\n status: DelegationStatus;\n grantedAt: string;\n grantedBy: string;\n expiresAt?: string;\n revokedAt?: string;\n revokedBy?: string;\n}\n\nexport interface GrantDelegationInput {\n appId: string;\n userId?: string;\n workspaceIds: string[];\n scopes: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUTH APP TYPES (from auth-svc layer)\n// =============================================================================\n\nexport type AuthAppType =\n | \"ANALYST\"\n | \"API_INTEGRATION\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"BOT\"\n | \"CLI_TOOL\"\n | \"DESKTOP_APP\"\n | \"INTEGRATION\"\n | \"MOBILE_APP\"\n | \"SERVICE\"\n | \"SPECIALIST\"\n | \"WEB_APP\"\n | \"WIDGET\"\n | \"WORKFLOW\";\nexport type AuthAppStatus = \"ACTIVE\" | \"INACTIVE\" | \"REVOKED\";\n\nexport interface AuthApp {\n id: string;\n name: string;\n description?: string;\n clientId: string;\n type: AuthAppType;\n status: AuthAppStatus;\n scopes: string[];\n redirectUris: string[];\n ownerUserId: string;\n tenantId: string;\n delegations?: AppUserDelegation[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthAppCreateResponse {\n app: AuthApp;\n clientSecret: string;\n}\n\nexport interface CreateAuthAppInput {\n name: string;\n description?: string;\n type: AuthAppType;\n scopes: string[];\n redirectUris?: string[];\n tenantId?: string;\n}\n\nexport interface UpdateAuthAppInput {\n name?: string;\n description?: string;\n scopes?: string[];\n redirectUris?: string[];\n}\n\n// =============================================================================\n// AUTH API KEY TYPES (from auth-svc layer)\n// =============================================================================\n\nexport interface AuthApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName?: string;\n createdAt: string;\n expiresAt?: string;\n lastUsedAt?: string;\n}\n\nexport interface AuthApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface AuthApiKeyRotateResult {\n apiSecret: string;\n}\n\nexport interface GenerateAuthApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUDIT LOG TYPES\n// =============================================================================\n\nexport interface AuditLog {\n id: string;\n actorId: string;\n actorType: string;\n tenantId: string;\n action: string;\n resource: string;\n resourceId?: string;\n changes?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// VIEW TYPES\n// =============================================================================\n\nexport type DevportalView =\n | \"dashboard\"\n | \"organizations\"\n | \"apps\"\n | \"oauth\"\n | \"api-keys\"\n | \"webhooks\"\n | \"delegations\"\n | \"analytics\"\n | \"revenue\"\n | \"docs\"\n | \"profile\"\n | \"settings\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\nexport interface ApplicationFilter {\n search?: string;\n status?: AppStatus;\n visibility?: AppVisibility;\n appType?: AppType;\n organizationId?: string;\n isFeatured?: boolean;\n}\n\nexport interface WebhookFilter {\n status?: WebhookStatus;\n event?: string;\n}\n\n// =============================================================================\n// WEBHOOK EVENT TYPES\n// =============================================================================\n\nexport const WEBHOOK_EVENTS = [\n // Application events\n \"application.created\",\n \"application.updated\",\n \"application.deleted\",\n \"application.published\",\n \"application.unpublished\",\n \"application.suspended\",\n // Installation events\n \"installation.created\",\n \"installation.updated\",\n \"installation.deleted\",\n // User events\n \"user.created\",\n \"user.updated\",\n \"user.deleted\",\n // Workspace events\n \"workspace.created\",\n \"workspace.updated\",\n \"workspace.deleted\",\n // Project events\n \"project.created\",\n \"project.updated\",\n \"project.deleted\",\n // Task events\n \"task.created\",\n \"task.updated\",\n \"task.deleted\",\n \"task.completed\",\n // Comment events\n \"comment.created\",\n \"comment.updated\",\n \"comment.deleted\",\n // File events\n \"file.uploaded\",\n \"file.deleted\",\n // Member events\n \"member.added\",\n \"member.removed\",\n \"member.role_changed\",\n] as const;\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[number];\n\n// =============================================================================\n// SCOPE DEFINITIONS\n// =============================================================================\n\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Comment scopes\n { scope: \"comment:read\", description: \"Read comments\", category: \"Comment\" },\n {\n scope: \"comment:write\",\n description: \"Create and modify comments\",\n category: \"Comment\",\n },\n {\n scope: \"comment:delete\",\n description: \"Delete comments\",\n category: \"Comment\",\n },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n\nexport type AvailableScope = (typeof AVAILABLE_SCOPES)[number][\"scope\"];\n"],"mappings":";AA21BA,IAAa,IAAiB,yhBAwC7B,EAQY,IAAmB;CAE9B;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAgB,aAAa;EAAiB,UAAU;EAAW;CAC5E;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACF"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/devportal/types/index.ts"],"sourcesContent":["/**\n * Developer Portal Types\n *\n * Core type definitions for the Developer Portal microfrontend\n */\n\nimport type { ReactNode } from \"react\";\n\n// =============================================================================\n// NAVIGATION TYPES\n// =============================================================================\n\n/**\n * Navigation item for shell integration\n */\nexport interface NavItem {\n id: string;\n label: string;\n path: string;\n icon?: ReactNode;\n badge?: number;\n order?: number;\n group?: string;\n visible?: boolean;\n children?: NavItem[];\n}\n\n/**\n * Footer item for shell integration\n */\nexport interface FooterItem {\n id: string;\n label: string;\n type: \"status\" | \"action\";\n order?: number;\n section: \"left\" | \"center\" | \"right\";\n}\n\n// =============================================================================\n// ROOT PROPS\n// =============================================================================\n\n/**\n * Props for the DevportalRoot component\n */\nexport interface DevportalRootProps {\n /**\n * Base path for the devportal microfrontend\n */\n basePath?: string;\n\n /**\n * Tenant ID for scoping operations\n */\n tenantId?: string;\n\n /**\n * Workspace ID (optional, for workspace-scoped features)\n */\n workspaceId?: string;\n\n /**\n * API Gateway URL for GraphQL requests (global gateway)\n */\n apiGatewayUrl?: string;\n\n /**\n * Workspace gateway URL for workspace-layer operations (e.g. wspace-files-svc uploads)\n * e.g. \"https://graphqlworkspaces.burdenoff.com\" or \"http://localhost:4003\"\n */\n workspacesGatewayUrl?: string;\n\n /**\n * Authentication token for API requests\n */\n authToken?: string;\n\n /**\n * Workspace authentication token for workspace-gateway requests (X-Workspace-Authorization).\n * May be a cached/stale value — use getWorkspaceToken() for upload flows that need a fresh token.\n */\n workspaceToken?: string;\n\n /**\n * Async getter that always returns a valid (non-expired) workspace token.\n * Call this instead of reading workspaceToken directly for workspace-layer mutations.\n */\n getWorkspaceToken?: () => Promise<string | null>;\n\n /**\n * Navigation function provided by the shell\n */\n navigate?: (path: string) => void;\n\n /**\n * Current user information\n */\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n };\n\n /**\n * Optional function to register navigation items with the shell\n */\n registerNavItems?: (items: NavItem | NavItem[]) => () => void;\n\n /**\n * Optional function to register footer items with the shell\n */\n registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;\n\n /**\n * Optional callback when an application is selected\n */\n onApplicationSelect?: (app: Application) => void;\n\n /**\n * Optional callback when an organization is selected\n */\n onOrganizationSelect?: (org: DeveloperOrganization) => void;\n}\n\n// =============================================================================\n// APPLICATION TYPES\n// =============================================================================\n\nexport type AppType =\n | \"WEB_APP\"\n | \"MOBILE_APP\"\n | \"DESKTOP_APP\"\n | \"CLI_TOOL\"\n | \"API_INTEGRATION\"\n | \"WORKFLOW\"\n | \"WIDGET\"\n | \"BOT\"\n | \"SERVICE\"\n | \"INTEGRATION\"\n | \"ANALYST\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"SPECIALIST\";\n\nexport type AppStatus =\n | \"DRAFT\"\n | \"SUBMITTED\"\n | \"IN_REVIEW\"\n | \"APPROVED\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"SUSPENDED\"\n | \"DEPRECATED\"\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"REVOKED\";\n\nexport type AppVisibility = \"PUBLIC\" | \"PRIVATE\" | \"UNLISTED\" | \"INTERNAL\";\n\nexport type AppSubmissionReviewStatus =\n | \"PENDING\"\n | \"IN_PROGRESS\"\n | \"APPROVED\"\n | \"REJECTED\"\n | \"CHANGES_REQUESTED\";\n\nexport interface Application {\n id: string;\n name: string;\n slug: string;\n shortDescription?: string;\n description?: string;\n appType: AppType;\n status: AppStatus;\n visibility: AppVisibility;\n tenantId: string;\n developerId: string;\n developerOrganizationId?: string;\n developerOrganization?: DeveloperOrganization;\n category?: string;\n tags: string[];\n keywords: string[];\n iconUrl?: string;\n bannerUrl?: string;\n videoUrl?: string;\n screenshots?: Record<string, unknown>;\n websiteUrl?: string;\n documentationUrl?: string;\n supportUrl?: string;\n privacyPolicyUrl?: string;\n termsOfServiceUrl?: string;\n githubUrl?: string;\n pricingType?: string;\n pricingDetails?: Record<string, unknown>;\n installCount: number;\n activeInstallCount: number;\n averageRating?: number;\n reviewCount: number;\n submittedAt?: string;\n publishedAt?: string;\n lastReviewedAt?: string;\n reviewStatus: AppSubmissionReviewStatus;\n reviewNotes?: string;\n reviewedBy?: string;\n isFeatured: boolean;\n isVerified: boolean;\n requiresApproval: boolean;\n manifest?: Record<string, unknown>;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n appId?: string;\n createdAt: string;\n updatedAt: string;\n versions?: ApplicationVersion[];\n oauthClients?: OAuthClient[];\n apiKeys?: ApiKey[];\n webhooks?: Webhook[];\n scopes?: ApplicationScope[];\n}\n\nexport interface ApplicationVersion {\n id: string;\n applicationId: string;\n version: string;\n releaseNotes?: string;\n changelog?: string;\n status: string;\n isLatest: boolean;\n isStable: boolean;\n packageUrl?: string;\n packageSize?: string;\n packageHash?: string;\n manifest?: Record<string, unknown>;\n minPlatformVersion?: string;\n maxPlatformVersion?: string;\n requiredScopes: string[];\n publishedAt?: string;\n deprecatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApplicationScope {\n id: string;\n applicationId: string;\n scope: string;\n description?: string;\n isRequired: boolean;\n createdAt: string;\n}\n\n// =============================================================================\n// OAUTH TYPES\n// =============================================================================\n\nexport type OAuthClientType = \"PUBLIC\" | \"CONFIDENTIAL\";\n\nexport type OAuthGrantType =\n | \"AUTHORIZATION_CODE\"\n | \"REFRESH_TOKEN\"\n | \"CLIENT_CREDENTIALS\"\n | \"IMPLICIT\"\n | \"PASSWORD\";\n\nexport interface OAuthClient {\n id: string;\n applicationId: string;\n name: string;\n clientId: string;\n clientSecret: string;\n clientType: OAuthClientType;\n redirectUris: string[];\n allowedGrantTypes: OAuthGrantType[];\n allowedScopes: string[];\n accessTokenLifetime: number;\n refreshTokenLifetime: number;\n isActive: boolean;\n requirePKCE: boolean;\n requireConsent: boolean;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OAuthToken {\n id: string;\n clientId: string;\n userId: string;\n tenantId: string;\n workspaceId?: string;\n accessToken: string;\n refreshToken?: string;\n tokenType: string;\n scopes: string[];\n expiresAt: string;\n refreshExpiresAt?: string;\n isRevoked: boolean;\n revokedAt?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n// =============================================================================\n// API KEY TYPES\n// =============================================================================\n\nexport type ApiKeyType = \"PUBLISHABLE\" | \"SECRET\" | \"RESTRICTED\";\n\nexport interface ApiKey {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n keyId: string;\n keyHash?: string; // Hash is not always returned by API for security\n keyPrefix: string;\n keyType: ApiKeyType;\n scopes: string[];\n permissions?: Record<string, unknown>;\n rateLimit?: number;\n quotaLimit?: number;\n quotaUsed: number;\n quotaResetAt?: string;\n allowedIps: string[];\n allowedDomains: string[];\n environment?: string;\n isActive: boolean;\n isRevoked: boolean;\n createdAt: string;\n lastUsedAt?: string;\n expiresAt?: string;\n revokedAt?: string;\n}\n\nexport interface ApiKeyPayload {\n apiKey: ApiKey;\n plainTextKey: string;\n}\n\n// =============================================================================\n// WEBHOOK TYPES\n// =============================================================================\n\nexport type WebhookStatus = \"ACTIVE\" | \"PAUSED\" | \"FAILED\" | \"DISABLED\";\n\nexport type WebhookDeliveryStatus =\n | \"PENDING\"\n | \"DELIVERING\"\n | \"DELIVERED\"\n | \"FAILED\"\n | \"RETRYING\";\n\nexport interface Webhook {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n url: string;\n secret: string;\n events: string[];\n filters?: Record<string, unknown>;\n retryEnabled: boolean;\n maxRetries: number;\n retryDelay: number;\n status: WebhookStatus;\n isActive: boolean;\n successCount: number;\n failureCount: number;\n lastTriggeredAt?: string;\n lastSuccessAt?: string;\n lastFailureAt?: string;\n lastFailureReason?: string;\n createdAt: string;\n updatedAt: string;\n deliveries?: WebhookDelivery[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n eventType: string;\n eventId: string;\n payload: Record<string, unknown>;\n attemptNumber: number;\n status: WebhookDeliveryStatus;\n requestHeaders?: Record<string, unknown>;\n requestBody?: Record<string, unknown>;\n responseStatus?: number;\n responseHeaders?: Record<string, unknown>;\n responseBody?: string;\n deliveredAt?: string;\n failedAt?: string;\n nextRetryAt?: string;\n errorMessage?: string;\n errorCode?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WebhookTestResult {\n success: boolean;\n statusCode?: number;\n response?: string;\n error?: string;\n}\n\n// =============================================================================\n// DEVELOPER ORGANIZATION TYPES\n// =============================================================================\n\nexport type DeveloperOrgRole = \"OWNER\" | \"ADMIN\" | \"DEVELOPER\" | \"VIEWER\";\n\nexport type DeveloperOrgTier =\n | \"FREE\"\n | \"DEVELOPER\"\n | \"PROFESSIONAL\"\n | \"ENTERPRISE\";\n\nexport type PartnerTier = \"REGISTERED\" | \"SELECT\" | \"PREMIER\";\n\nexport type InvitationStatus =\n | \"PENDING\"\n | \"ACCEPTED\"\n | \"REJECTED\"\n | \"EXPIRED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrganization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n logoUrl?: string;\n bannerUrl?: string;\n websiteUrl?: string;\n contactEmail?: string;\n supportEmail?: string;\n tier: DeveloperOrgTier;\n partnerTier?: PartnerTier;\n partnerSince?: string;\n isVerified: boolean;\n verifiedAt?: string;\n verificationMethod?: string;\n isCertified: boolean;\n certifiedAt?: string;\n certificationExpiry?: string;\n totalApps: number;\n publishedApps: number;\n totalInstalls: number;\n activeInstalls: number;\n totalApiCalls: string;\n averageRating?: number;\n totalRevenue: number;\n totalPlatformFees: number;\n totalPayouts: number;\n pendingBalance: number;\n lifetimeRevenue: number;\n platformFeeRate: number;\n apiCallsLimit: number;\n storageLimit: string;\n apiCallsUsed: string;\n storageUsed: string;\n quotaResetAt?: string;\n taxId?: string;\n taxCountry?: string;\n taxFormType?: string;\n taxFormVerified: boolean;\n legalEntityName?: string;\n legalEntityType?: string;\n legalAddress?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n billingAccountId?: string;\n billingLinkedAt?: string;\n createdAt: string;\n updatedAt: string;\n members?: DeveloperOrgMember[];\n invitations?: DeveloperOrgInvitation[];\n applications?: Application[];\n}\n\nexport interface DeveloperOrgMember {\n id: string;\n organizationId: string;\n userId: string;\n email?: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy?: string;\n invitationId?: string;\n isActive: boolean;\n isSuspended: boolean;\n suspendedAt?: string;\n suspendedReason?: string;\n joinedAt: string;\n lastActiveAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DeveloperOrgInvitation {\n id: string;\n organizationId: string;\n invitedUserId?: string;\n invitedEmail: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy: string;\n message?: string;\n token: string;\n status: InvitationStatus;\n expiresAt: string;\n respondedAt?: string;\n memberId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// ANALYTICS TYPES (MOCKED)\n// =============================================================================\n\nexport interface ApplicationAnalytics {\n id: string;\n applicationId: string;\n date: string;\n period: string;\n activeUsers: number;\n newUsers: number;\n apiCalls: number;\n errors: number;\n avgResponseTime?: number;\n sessions: number;\n avgSessionDuration?: number;\n createdAt: string;\n}\n\nexport interface DeveloperOrgRevenueAnalytics {\n id: string;\n organizationId: string;\n period: string;\n periodStart: string;\n periodEnd: string;\n grossRevenue: number;\n platformFees: number;\n netRevenue: number;\n salesCount: number;\n refundsCount: number;\n refundsAmount: number;\n newSubscribers: number;\n churnedSubscribers: number;\n activeSubscribers: number;\n avgRevenuePerUser: number;\n topApps?: Array<{ appId: string; revenue: number }>;\n createdAt: string;\n}\n\n// =============================================================================\n// MONETIZATION TYPES (MOCKED)\n// =============================================================================\n\nexport type DevPortalPricingModel =\n | \"FREE\"\n | \"FREEMIUM\"\n | \"SUBSCRIPTION\"\n | \"ONE_TIME\"\n | \"USAGE_BASED\"\n | \"ENTERPRISE\";\n\nexport type SaleStatus =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"REFUNDED\"\n | \"PARTIAL_REFUND\"\n | \"DISPUTED\"\n | \"CHARGEBACK\"\n | \"CANCELLED\";\n\nexport type PayoutStatus =\n | \"PENDING\"\n | \"PROCESSING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrgSale {\n id: string;\n organizationId: string;\n applicationId: string;\n buyerUserId: string;\n buyerTenantId?: string;\n installationScope: string;\n pricingModel: DevPortalPricingModel;\n planName?: string;\n grossAmount: number;\n platformFeeRate: number;\n platformFee: number;\n netAmount: number;\n currency: string;\n taxAmount?: number;\n discountAmount?: number;\n status: SaleStatus;\n createdAt: string;\n}\n\nexport interface DeveloperOrgPayout {\n id: string;\n organizationId: string;\n periodStart: string;\n periodEnd: string;\n grossAmount: number;\n platformFees: number;\n netAmount: number;\n currency: string;\n status: PayoutStatus;\n processedAt?: string;\n failedAt?: string;\n failureReason?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// APP INSTALLATION TYPES\n// =============================================================================\n\nexport type AppInstallationStatus =\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"TRIAL\"\n | \"EXPIRED\"\n | \"UNINSTALLED\";\n\nexport interface AppInstallation {\n id: string;\n applicationId: string;\n userId: string;\n tenantId?: string;\n workspaceId?: string;\n organizationId?: string;\n scope: string;\n installedVersion: string;\n status: AppInstallationStatus;\n grantedScopes: string[];\n settings?: Record<string, unknown>;\n installedAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// REVIEW TYPES\n// =============================================================================\n\nexport type ReviewStatus =\n | \"PENDING\"\n | \"PUBLISHED\"\n | \"HIDDEN\"\n | \"FLAGGED\"\n | \"REMOVED\";\n\nexport interface AppReview {\n id: string;\n applicationId: string;\n userId: string;\n rating: number;\n title?: string;\n body?: string;\n status: ReviewStatus;\n isFeatured: boolean;\n helpfulCount: number;\n notHelpfulCount: number;\n developerResponse?: string;\n developerResponseAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// DELEGATION TYPES\n// =============================================================================\n\nexport type DelegationStatus = \"ACTIVE\" | \"REVOKED\" | \"EXPIRED\";\n\nexport interface AppUserDelegation {\n id: string;\n appId: string;\n app?: {\n id: string;\n name: string;\n description?: string;\n type: string;\n status: string;\n };\n userId: string;\n scopes: string[];\n workspaceIds: string[];\n status: DelegationStatus;\n grantedAt: string;\n grantedBy: string;\n expiresAt?: string;\n revokedAt?: string;\n revokedBy?: string;\n}\n\nexport interface GrantDelegationInput {\n appId: string;\n userId?: string;\n workspaceIds: string[];\n scopes: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUTH APP TYPES (from auth-svc layer)\n// =============================================================================\n\nexport type AuthAppType =\n | \"ANALYST\"\n | \"API_INTEGRATION\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"BOT\"\n | \"CLI_TOOL\"\n | \"DESKTOP_APP\"\n | \"INTEGRATION\"\n | \"MOBILE_APP\"\n | \"SERVICE\"\n | \"SPECIALIST\"\n | \"WEB_APP\"\n | \"WIDGET\"\n | \"WORKFLOW\";\nexport type AuthAppStatus = \"ACTIVE\" | \"INACTIVE\" | \"REVOKED\";\n\nexport interface AuthApp {\n id: string;\n name: string;\n description?: string;\n clientId: string;\n type: AuthAppType;\n status: AuthAppStatus;\n scopes: string[];\n redirectUris: string[];\n ownerUserId: string;\n tenantId: string;\n delegations?: AppUserDelegation[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthAppCreateResponse {\n app: AuthApp;\n clientSecret: string;\n}\n\nexport interface CreateAuthAppInput {\n name: string;\n description?: string;\n type: AuthAppType;\n scopes: string[];\n redirectUris?: string[];\n tenantId?: string;\n}\n\nexport interface UpdateAuthAppInput {\n name?: string;\n description?: string;\n scopes?: string[];\n redirectUris?: string[];\n}\n\n// =============================================================================\n// AUTH API KEY TYPES (from auth-svc layer)\n// =============================================================================\n\nexport interface AuthApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName?: string;\n createdAt: string;\n expiresAt?: string;\n lastUsedAt?: string;\n}\n\nexport interface AuthApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface AuthApiKeyRotateResult {\n apiSecret: string;\n}\n\nexport interface GenerateAuthApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUDIT LOG TYPES\n// =============================================================================\n\nexport interface AuditLog {\n id: string;\n actorId: string;\n actorType: string;\n tenantId: string;\n action: string;\n resource: string;\n resourceId?: string;\n changes?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// VIEW TYPES\n// =============================================================================\n\nexport type DevportalView =\n | \"dashboard\"\n | \"organizations\"\n | \"apps\"\n | \"oauth\"\n | \"api-keys\"\n | \"webhooks\"\n | \"delegations\"\n | \"analytics\"\n | \"revenue\"\n | \"docs\"\n | \"profile\"\n | \"settings\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\nexport interface ApplicationFilter {\n search?: string;\n status?: AppStatus;\n visibility?: AppVisibility;\n appType?: AppType;\n organizationId?: string;\n isFeatured?: boolean;\n}\n\nexport interface WebhookFilter {\n status?: WebhookStatus;\n event?: string;\n}\n\n// =============================================================================\n// WEBHOOK EVENT TYPES\n// =============================================================================\n\nexport const WEBHOOK_EVENTS = [\n // Application events\n \"application.created\",\n \"application.updated\",\n \"application.deleted\",\n \"application.published\",\n \"application.unpublished\",\n \"application.suspended\",\n // Installation events\n \"installation.created\",\n \"installation.updated\",\n \"installation.deleted\",\n // User events\n \"user.created\",\n \"user.updated\",\n \"user.deleted\",\n // Workspace events\n \"workspace.created\",\n \"workspace.updated\",\n \"workspace.deleted\",\n // Project events\n \"project.created\",\n \"project.updated\",\n \"project.deleted\",\n // Task events\n \"task.created\",\n \"task.updated\",\n \"task.deleted\",\n \"task.completed\",\n // Comment events\n \"comment.created\",\n \"comment.updated\",\n \"comment.deleted\",\n // File events\n \"file.uploaded\",\n \"file.deleted\",\n // Member events\n \"member.added\",\n \"member.removed\",\n \"member.role_changed\",\n] as const;\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[number];\n\n// =============================================================================\n// SCOPE DEFINITIONS\n// =============================================================================\n\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Comment scopes\n { scope: \"comment:read\", description: \"Read comments\", category: \"Comment\" },\n {\n scope: \"comment:write\",\n description: \"Create and modify comments\",\n category: \"Comment\",\n },\n {\n scope: \"comment:delete\",\n description: \"Delete comments\",\n category: \"Comment\",\n },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n\nexport type AvailableScope = (typeof AVAILABLE_SCOPES)[number][\"scope\"];\n"],"mappings":";AA61BA,IAAa,IAAiB,yhBAwC7B,EAQY,IAAmB;CAE9B;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAgB,aAAa;EAAiB,UAAU;EAAW;CAC5E;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACF"}
|
|
@@ -178,6 +178,8 @@ var n = {}, r = e`
|
|
|
178
178
|
legalEntityType
|
|
179
179
|
taxId
|
|
180
180
|
taxCountry
|
|
181
|
+
billingAccountId
|
|
182
|
+
billingLinkedAt
|
|
181
183
|
createdAt
|
|
182
184
|
updatedAt
|
|
183
185
|
}
|
|
@@ -1474,18 +1476,42 @@ e`
|
|
|
1474
1476
|
}
|
|
1475
1477
|
${c}`;
|
|
1476
1478
|
var ct = e`
|
|
1479
|
+
mutation LinkDevOrgBillingAccount($organizationId: ID!, $billingAccountId: ID!) {
|
|
1480
|
+
linkDevOrgBillingAccount(
|
|
1481
|
+
organizationId: $organizationId
|
|
1482
|
+
billingAccountId: $billingAccountId
|
|
1483
|
+
) {
|
|
1484
|
+
...OrganizationFields
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
${c}`;
|
|
1488
|
+
function lt(e) {
|
|
1489
|
+
let r = {
|
|
1490
|
+
...n,
|
|
1491
|
+
...e
|
|
1492
|
+
};
|
|
1493
|
+
return t.useMutation(ct, r);
|
|
1494
|
+
}
|
|
1495
|
+
e`
|
|
1496
|
+
mutation UnlinkDevOrgBillingAccount($organizationId: ID!) {
|
|
1497
|
+
unlinkDevOrgBillingAccount(organizationId: $organizationId) {
|
|
1498
|
+
...OrganizationFields
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
${c}`;
|
|
1502
|
+
var ut = e`
|
|
1477
1503
|
mutation CreateBillingAccount($input: CreateBillingAccountInput!) {
|
|
1478
1504
|
createBillingAccount(input: $input) {
|
|
1479
1505
|
...BillingAccountFields
|
|
1480
1506
|
}
|
|
1481
1507
|
}
|
|
1482
1508
|
${d}`;
|
|
1483
|
-
function
|
|
1509
|
+
function dt(e) {
|
|
1484
1510
|
let r = {
|
|
1485
1511
|
...n,
|
|
1486
1512
|
...e
|
|
1487
1513
|
};
|
|
1488
|
-
return t.useMutation(
|
|
1514
|
+
return t.useMutation(ut, r);
|
|
1489
1515
|
}
|
|
1490
1516
|
e`
|
|
1491
1517
|
query GetBillingAccount($id: ID!) {
|
|
@@ -1494,19 +1520,19 @@ e`
|
|
|
1494
1520
|
}
|
|
1495
1521
|
}
|
|
1496
1522
|
${d}`;
|
|
1497
|
-
var
|
|
1523
|
+
var ft = e`
|
|
1498
1524
|
query GetMyDeveloperProfile {
|
|
1499
1525
|
myDeveloperProfile {
|
|
1500
1526
|
...DeveloperProfileFields
|
|
1501
1527
|
}
|
|
1502
1528
|
}
|
|
1503
1529
|
${f}`;
|
|
1504
|
-
function
|
|
1530
|
+
function pt(e) {
|
|
1505
1531
|
let r = {
|
|
1506
1532
|
...n,
|
|
1507
1533
|
...e
|
|
1508
1534
|
};
|
|
1509
|
-
return t.useQuery(
|
|
1535
|
+
return t.useQuery(ft, r);
|
|
1510
1536
|
}
|
|
1511
1537
|
e`
|
|
1512
1538
|
query GetDeveloperProfile($userId: ID!) {
|
|
@@ -1515,7 +1541,7 @@ e`
|
|
|
1515
1541
|
}
|
|
1516
1542
|
}
|
|
1517
1543
|
${f}`;
|
|
1518
|
-
var
|
|
1544
|
+
var mt = e`
|
|
1519
1545
|
query GetApplicationAuditLogs($applicationId: ID!, $limit: Int, $offset: Int) {
|
|
1520
1546
|
application(id: $applicationId) {
|
|
1521
1547
|
id
|
|
@@ -1543,12 +1569,12 @@ var ft = e`
|
|
|
1543
1569
|
}
|
|
1544
1570
|
}
|
|
1545
1571
|
${te}`;
|
|
1546
|
-
function
|
|
1572
|
+
function ht(e) {
|
|
1547
1573
|
let r = {
|
|
1548
1574
|
...n,
|
|
1549
1575
|
...e
|
|
1550
1576
|
};
|
|
1551
|
-
return t.useQuery(
|
|
1577
|
+
return t.useQuery(mt, r);
|
|
1552
1578
|
}
|
|
1553
1579
|
e`
|
|
1554
1580
|
mutation CreateDeveloperProfile($input: CreateDeveloperProfileInput!) {
|
|
@@ -1557,19 +1583,19 @@ e`
|
|
|
1557
1583
|
}
|
|
1558
1584
|
}
|
|
1559
1585
|
${f}`;
|
|
1560
|
-
var
|
|
1586
|
+
var gt = e`
|
|
1561
1587
|
mutation UpdateDeveloperProfile($userId: ID!, $input: UpdateDeveloperProfileInput!) {
|
|
1562
1588
|
updateDeveloperProfile(userId: $userId, input: $input) {
|
|
1563
1589
|
...DeveloperProfileFields
|
|
1564
1590
|
}
|
|
1565
1591
|
}
|
|
1566
1592
|
${f}`;
|
|
1567
|
-
function
|
|
1593
|
+
function _t(e) {
|
|
1568
1594
|
let r = {
|
|
1569
1595
|
...n,
|
|
1570
1596
|
...e
|
|
1571
1597
|
};
|
|
1572
|
-
return t.useMutation(
|
|
1598
|
+
return t.useMutation(gt, r);
|
|
1573
1599
|
}
|
|
1574
1600
|
e`
|
|
1575
1601
|
query GetRevenueSummary($organizationId: ID!, $period: String!) {
|
|
@@ -1597,7 +1623,7 @@ e`
|
|
|
1597
1623
|
}
|
|
1598
1624
|
}
|
|
1599
1625
|
`;
|
|
1600
|
-
var
|
|
1626
|
+
var vt = e`
|
|
1601
1627
|
query GetRevenueDashboardData($organizationId: ID!, $period: String!, $startDate: DateTime, $endDate: DateTime, $salesLimit: Int, $salesOffset: Int, $payoutsLimit: Int, $payoutsOffset: Int) {
|
|
1602
1628
|
developerOrgRevenueSummary(organizationId: $organizationId, period: $period) {
|
|
1603
1629
|
period
|
|
@@ -1675,12 +1701,12 @@ var gt = e`
|
|
|
1675
1701
|
${g}
|
|
1676
1702
|
${p}
|
|
1677
1703
|
${m}`;
|
|
1678
|
-
function
|
|
1704
|
+
function yt(e) {
|
|
1679
1705
|
let r = {
|
|
1680
1706
|
...n,
|
|
1681
1707
|
...e
|
|
1682
1708
|
};
|
|
1683
|
-
return t.useQuery(
|
|
1709
|
+
return t.useQuery(vt, r);
|
|
1684
1710
|
}
|
|
1685
1711
|
e`
|
|
1686
1712
|
query GetRevenueAnalytics($organizationId: ID!, $period: String!, $startDate: DateTime, $endDate: DateTime) {
|
|
@@ -1840,7 +1866,7 @@ ${p}`, e`
|
|
|
1840
1866
|
}
|
|
1841
1867
|
}
|
|
1842
1868
|
${p}`;
|
|
1843
|
-
var
|
|
1869
|
+
var $ = e`
|
|
1844
1870
|
query GetDeveloperPortalSettingsOverview {
|
|
1845
1871
|
myDeveloperProfile {
|
|
1846
1872
|
...DeveloperProfileFields
|
|
@@ -1870,42 +1896,42 @@ var vt = e`
|
|
|
1870
1896
|
}
|
|
1871
1897
|
}
|
|
1872
1898
|
${f}`;
|
|
1873
|
-
function
|
|
1899
|
+
function bt(e) {
|
|
1874
1900
|
let r = {
|
|
1875
1901
|
...n,
|
|
1876
1902
|
...e
|
|
1877
1903
|
};
|
|
1878
|
-
return t.useQuery(
|
|
1904
|
+
return t.useQuery($, r);
|
|
1879
1905
|
}
|
|
1880
|
-
var
|
|
1906
|
+
var xt = e`
|
|
1881
1907
|
query GetWebhooks($applicationId: ID!) {
|
|
1882
1908
|
webhooks(applicationId: $applicationId) {
|
|
1883
1909
|
...DevportalWebhookFields
|
|
1884
1910
|
}
|
|
1885
1911
|
}
|
|
1886
1912
|
${_}`;
|
|
1887
|
-
function
|
|
1913
|
+
function St(e) {
|
|
1888
1914
|
let r = {
|
|
1889
1915
|
...n,
|
|
1890
1916
|
...e
|
|
1891
1917
|
};
|
|
1892
|
-
return t.useQuery(
|
|
1918
|
+
return t.useQuery(xt, r);
|
|
1893
1919
|
}
|
|
1894
|
-
var
|
|
1920
|
+
var Ct = e`
|
|
1895
1921
|
query GetWebhook($id: ID!) {
|
|
1896
1922
|
webhook(id: $id) {
|
|
1897
1923
|
...DevportalWebhookFields
|
|
1898
1924
|
}
|
|
1899
1925
|
}
|
|
1900
1926
|
${_}`;
|
|
1901
|
-
function
|
|
1927
|
+
function wt(e) {
|
|
1902
1928
|
let r = {
|
|
1903
1929
|
...n,
|
|
1904
1930
|
...e
|
|
1905
1931
|
};
|
|
1906
|
-
return t.useQuery(
|
|
1932
|
+
return t.useQuery(Ct, r);
|
|
1907
1933
|
}
|
|
1908
|
-
var
|
|
1934
|
+
var Tt = e`
|
|
1909
1935
|
query GetWebhookDetail($id: ID!, $limit: Int, $offset: Int) {
|
|
1910
1936
|
webhook(id: $id) {
|
|
1911
1937
|
...DevportalWebhookFields
|
|
@@ -1925,12 +1951,12 @@ var Ct = e`
|
|
|
1925
1951
|
}
|
|
1926
1952
|
${_}
|
|
1927
1953
|
${v}`;
|
|
1928
|
-
function
|
|
1954
|
+
function Et(e) {
|
|
1929
1955
|
let r = {
|
|
1930
1956
|
...n,
|
|
1931
1957
|
...e
|
|
1932
1958
|
};
|
|
1933
|
-
return t.useQuery(
|
|
1959
|
+
return t.useQuery(Tt, r);
|
|
1934
1960
|
}
|
|
1935
1961
|
e`
|
|
1936
1962
|
query GetWebhookDeliveries($webhookId: ID!, $limit: Int, $offset: Int) {
|
|
@@ -1954,47 +1980,47 @@ e`
|
|
|
1954
1980
|
}
|
|
1955
1981
|
}
|
|
1956
1982
|
${v}`;
|
|
1957
|
-
var
|
|
1983
|
+
var Dt = e`
|
|
1958
1984
|
mutation CreateWebhook($applicationId: ID!, $input: CreateWebhookInput!) {
|
|
1959
1985
|
createWebhook(applicationId: $applicationId, input: $input) {
|
|
1960
1986
|
...DevportalWebhookFields
|
|
1961
1987
|
}
|
|
1962
1988
|
}
|
|
1963
1989
|
${_}`;
|
|
1964
|
-
function
|
|
1990
|
+
function Ot(e) {
|
|
1965
1991
|
let r = {
|
|
1966
1992
|
...n,
|
|
1967
1993
|
...e
|
|
1968
1994
|
};
|
|
1969
|
-
return t.useMutation(
|
|
1995
|
+
return t.useMutation(Dt, r);
|
|
1970
1996
|
}
|
|
1971
|
-
var
|
|
1997
|
+
var kt = e`
|
|
1972
1998
|
mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {
|
|
1973
1999
|
updateWebhook(id: $id, input: $input) {
|
|
1974
2000
|
...DevportalWebhookFields
|
|
1975
2001
|
}
|
|
1976
2002
|
}
|
|
1977
2003
|
${_}`;
|
|
1978
|
-
function
|
|
2004
|
+
function At(e) {
|
|
1979
2005
|
let r = {
|
|
1980
2006
|
...n,
|
|
1981
2007
|
...e
|
|
1982
2008
|
};
|
|
1983
|
-
return t.useMutation(
|
|
2009
|
+
return t.useMutation(kt, r);
|
|
1984
2010
|
}
|
|
1985
|
-
var
|
|
2011
|
+
var jt = e`
|
|
1986
2012
|
mutation DeleteWebhook($id: ID!) {
|
|
1987
2013
|
deleteWebhook(id: $id)
|
|
1988
2014
|
}
|
|
1989
2015
|
`;
|
|
1990
|
-
function
|
|
2016
|
+
function Mt(e) {
|
|
1991
2017
|
let r = {
|
|
1992
2018
|
...n,
|
|
1993
2019
|
...e
|
|
1994
2020
|
};
|
|
1995
|
-
return t.useMutation(
|
|
2021
|
+
return t.useMutation(jt, r);
|
|
1996
2022
|
}
|
|
1997
|
-
var
|
|
2023
|
+
var Nt = e`
|
|
1998
2024
|
mutation TestWebhook($id: ID!, $eventType: String!) {
|
|
1999
2025
|
testWebhook(id: $id, eventType: $eventType) {
|
|
2000
2026
|
success
|
|
@@ -2004,14 +2030,14 @@ var jt = e`
|
|
|
2004
2030
|
}
|
|
2005
2031
|
}
|
|
2006
2032
|
`;
|
|
2007
|
-
function
|
|
2033
|
+
function Pt(e) {
|
|
2008
2034
|
let r = {
|
|
2009
2035
|
...n,
|
|
2010
2036
|
...e
|
|
2011
2037
|
};
|
|
2012
|
-
return t.useMutation(
|
|
2038
|
+
return t.useMutation(Nt, r);
|
|
2013
2039
|
}
|
|
2014
2040
|
//#endregion
|
|
2015
|
-
export { a as AppInstallationFieldsFragmentDoc, r as ApplicationFieldsFragmentDoc, ee as ApplicationScopeFieldsFragmentDoc, i as ApplicationVersionFieldsFragmentDoc, k as ApproveApplicationDocument, te as AuditLogFieldsFragmentDoc, o as AuthAppFieldsFragmentDoc, d as BillingAccountFieldsFragmentDoc, Je as CancelInvitationDocument, T as CreateApplicationDocument, j as CreateApplicationVersionDocument, V as CreateAuthAppDocument,
|
|
2041
|
+
export { a as AppInstallationFieldsFragmentDoc, r as ApplicationFieldsFragmentDoc, ee as ApplicationScopeFieldsFragmentDoc, i as ApplicationVersionFieldsFragmentDoc, k as ApproveApplicationDocument, te as AuditLogFieldsFragmentDoc, o as AuthAppFieldsFragmentDoc, d as BillingAccountFieldsFragmentDoc, Je as CancelInvitationDocument, T as CreateApplicationDocument, j as CreateApplicationVersionDocument, V as CreateAuthAppDocument, ut as CreateBillingAccountDocument, Be as CreateOrganizationDocument, Dt as CreateWebhookDocument, z as CurrentUserAppsDocument, K as CurrentUserDelegationsDocument, q as CurrentUserGrantedDelegationsDocument, U as DeactivateAppDocument, s as DelegationFieldsFragmentDoc, D as DeleteApplicationDocument, We as DeleteOrganizationDocument, jt as DeleteWebhookDocument, N as DeprecateApplicationVersionDocument, f as DeveloperProfileFieldsFragmentDoc, _ as DevportalWebhookFieldsFragmentDoc, I as GenerateApiKeyDocument, y as GetAnalyticsDashboardOptionsDocument, b as GetApplicationAnalyticsDashboardDocument, w as GetApplicationAnalyticsDocument, mt as GetApplicationAuditLogsDocument, S as GetApplicationDocument, C as GetApplicationVersionsDocument, x as GetApplicationsDocument, B as GetAuthAppDocument, $ as GetDeveloperPortalSettingsOverviewDocument, G as GetDevportalDashboardBootstrapDocument, ft as GetMyDeveloperProfileDocument, X as GetMyOrganizationsDocument, Q as GetOrganizationDocument, Re as GetOrganizationInvitationsDocument, Ie as GetOrganizationMembersDocument, Z as GetOrganizationsDocument, vt as GetRevenueDashboardDataDocument, Tt as GetWebhookDetailDocument, Ct as GetWebhookDocument, xt as GetWebhooksDocument, J as GrantDelegationDocument, P as InstallApplicationDocument, Ke as InviteMemberDocument, ct as LinkDevOrgBillingAccountDocument, F as MyApiKeysDocument, u as OrgInvitationFieldsFragmentDoc, l as OrgMemberFieldsFragmentDoc, c as OrganizationFieldsFragmentDoc, h as PaymentMethodFieldsFragmentDoc, m as PayoutFieldsFragmentDoc, M as PublishApplicationVersionDocument, it as ReactivateMemberDocument, A as RejectApplicationDocument, et as RemoveMemberDocument, Xe as ResendInvitationDocument, g as RevenueAnalyticsFieldsFragmentDoc, L as RevokeApiKeyAuthDocument, Y as RevokeDelegationDocument, R as RotateApiKeyAuthDocument, W as RotateAppSecretDocument, p as SaleFieldsFragmentDoc, O as SubmitApplicationDocument, nt as SuspendMemberDocument, Nt as TestWebhookDocument, ot as TransferOwnershipDocument, E as UpdateApplicationDocument, H as UpdateAuthAppDocument, gt as UpdateDeveloperProfileDocument, Qe as UpdateMemberRoleDocument, He as UpdateOrganizationDocument, kt as UpdateWebhookDocument, v as WebhookDeliveryFieldsFragmentDoc, fe as useApproveApplicationMutation, Ye as useCancelInvitationMutation, ce as useCreateApplicationMutation, me as useCreateApplicationVersionMutation, we as useCreateAuthAppMutation, dt as useCreateBillingAccountMutation, Ve as useCreateOrganizationMutation, Ot as useCreateWebhookMutation, Se as useCurrentUserAppsQuery, ke as useCurrentUserDelegationsQuery, Ae as useCurrentUserGrantedDelegationsQuery, Ee as useDeactivateAppMutation, ue as useDeleteApplicationMutation, Ge as useDeleteOrganizationMutation, Mt as useDeleteWebhookMutation, ge as useDeprecateApplicationVersionMutation, ye as useGenerateApiKeyMutation, ne as useGetAnalyticsDashboardOptionsQuery, re as useGetApplicationAnalyticsDashboardQuery, se as useGetApplicationAnalyticsQuery, ht as useGetApplicationAuditLogsQuery, ae as useGetApplicationQuery, oe as useGetApplicationVersionsQuery, ie as useGetApplicationsQuery, Ce as useGetAuthAppQuery, bt as useGetDeveloperPortalSettingsOverviewQuery, Oe as useGetDevportalDashboardBootstrapQuery, pt as useGetMyDeveloperProfileQuery, Ne as useGetMyOrganizationsQuery, ze as useGetOrganizationInvitationsQuery, Le as useGetOrganizationMembersQuery, Fe as useGetOrganizationQuery, Pe as useGetOrganizationsQuery, yt as useGetRevenueDashboardDataQuery, Et as useGetWebhookDetailQuery, wt as useGetWebhookQuery, St as useGetWebhooksQuery, je as useGrantDelegationMutation, _e as useInstallApplicationMutation, qe as useInviteMemberMutation, lt as useLinkDevOrgBillingAccountMutation, ve as useMyApiKeysQuery, he as usePublishApplicationVersionMutation, at as useReactivateMemberMutation, pe as useRejectApplicationMutation, tt as useRemoveMemberMutation, Ze as useResendInvitationMutation, be as useRevokeApiKeyAuthMutation, Me as useRevokeDelegationMutation, xe as useRotateApiKeyAuthMutation, De as useRotateAppSecretMutation, de as useSubmitApplicationMutation, rt as useSuspendMemberMutation, Pt as useTestWebhookMutation, st as useTransferOwnershipMutation, le as useUpdateApplicationMutation, Te as useUpdateAuthAppMutation, _t as useUpdateDeveloperProfileMutation, $e as useUpdateMemberRoleMutation, Ue as useUpdateOrganizationMutation, At as useUpdateWebhookMutation };
|
|
2016
2042
|
|
|
2017
2043
|
//# sourceMappingURL=global-operations.js.map
|