@aglyn/plugins-marketplace 1.0.0-beta.149 → 1.0.0-beta.151
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/package.json +15 -11
- package/src/lib/components/edit-listing-dialog.component.d.ts +20 -0
- package/src/lib/components/edit-listing-dialog.component.js +51 -0
- package/src/lib/components/edit-listing-dialog.component.js.map +1 -0
- package/src/lib/components/listing-detail-editor.component.d.ts +24 -0
- package/src/lib/components/listing-detail-editor.component.js +457 -0
- package/src/lib/components/listing-detail-editor.component.js.map +1 -0
- package/src/lib/components/listing-detail-page.component.d.ts +28 -0
- package/src/lib/components/listing-detail-page.component.js +151 -0
- package/src/lib/components/listing-detail-page.component.js.map +1 -0
- package/src/lib/components/listing-review-status.component.d.ts +67 -0
- package/src/lib/components/listing-review-status.component.js +301 -0
- package/src/lib/components/listing-review-status.component.js.map +1 -0
- package/src/lib/components/listing-verification-request.component.d.ts +40 -0
- package/src/lib/components/listing-verification-request.component.js +170 -0
- package/src/lib/components/listing-verification-request.component.js.map +1 -0
- package/src/lib/components/marketplace-hub.component.d.ts +43 -0
- package/src/lib/components/marketplace-hub.component.js +244 -0
- package/src/lib/components/marketplace-hub.component.js.map +1 -0
- package/src/lib/components/marketplace-reports-page.component.d.ts +23 -0
- package/src/lib/components/marketplace-reports-page.component.js +324 -0
- package/src/lib/components/marketplace-reports-page.component.js.map +1 -0
- package/src/lib/components/org-licences-panel.component.d.ts +73 -0
- package/src/lib/components/org-licences-panel.component.js +318 -0
- package/src/lib/components/org-licences-panel.component.js.map +1 -0
- package/src/lib/components/org-publish-panel.component.d.ts +45 -0
- package/src/lib/components/org-publish-panel.component.js +402 -0
- package/src/lib/components/org-publish-panel.component.js.map +1 -0
- package/src/lib/components/org-seller-panel.component.d.ts +28 -0
- package/src/lib/components/org-seller-panel.component.js +956 -0
- package/src/lib/components/org-seller-panel.component.js.map +1 -0
- package/src/lib/components/plugin-review-detail.component.d.ts +16 -0
- package/src/lib/components/plugin-review-detail.component.js +1438 -0
- package/src/lib/components/plugin-review-detail.component.js.map +1 -0
- package/src/lib/components/plugin-reviews-queue.component.d.ts +13 -0
- package/src/lib/components/plugin-reviews-queue.component.js +385 -0
- package/src/lib/components/plugin-reviews-queue.component.js.map +1 -0
- package/src/lib/components/plugin-reviews-surface.component.d.ts +19 -0
- package/src/lib/components/plugin-reviews-surface.component.js +46 -0
- package/src/lib/components/plugin-reviews-surface.component.js.map +1 -0
- package/src/lib/components/publish-plugin-form.component.d.ts +61 -0
- package/src/lib/components/publish-plugin-form.component.js +857 -0
- package/src/lib/components/publish-plugin-form.component.js.map +1 -0
- package/src/lib/components/publish-plugin-page.component.d.ts +29 -0
- package/src/lib/components/publish-plugin-page.component.js +92 -0
- package/src/lib/components/publish-plugin-page.component.js.map +1 -0
- package/src/lib/components/publisher-profile-page.component.d.ts +13 -0
- package/src/lib/components/publisher-profile-page.component.js +261 -0
- package/src/lib/components/publisher-profile-page.component.js.map +1 -0
- package/src/lib/constants/listing-media.d.ts +28 -0
- package/src/lib/constants/listing-media.js +28 -0
- package/src/lib/constants/listing-media.js.map +1 -0
- package/src/lib/model/listing-social-card.d.ts +94 -0
- package/src/lib/model/listing-social-card.js +177 -0
- package/src/lib/model/listing-social-card.js.map +1 -0
- package/src/lib/model/marketplace-paths.d.ts +54 -0
- package/src/lib/model/marketplace-paths.js +59 -0
- package/src/lib/model/marketplace-paths.js.map +1 -0
- package/src/lib/model/payout-readiness.d.ts +81 -0
- package/src/lib/model/payout-readiness.js +52 -0
- package/src/lib/model/payout-readiness.js.map +1 -0
- package/src/lib/model/plugin-rejection-categories.d.ts +66 -0
- package/src/lib/model/plugin-rejection-categories.js +124 -0
- package/src/lib/model/plugin-rejection-categories.js.map +1 -0
- package/src/lib/model/plugin-review-checklist.d.ts +62 -0
- package/src/lib/model/plugin-review-checklist.js +131 -0
- package/src/lib/model/plugin-review-checklist.js.map +1 -0
- package/src/lib/model/plugin-review-status.d.ts +104 -0
- package/src/lib/model/plugin-review-status.js +126 -0
- package/src/lib/model/plugin-review-status.js.map +1 -0
- package/src/lib/model/seller-ledger-totals.d.ts +100 -0
- package/src/lib/model/seller-ledger-totals.js +96 -0
- package/src/lib/model/seller-ledger-totals.js.map +1 -0
- package/src/lib/plugin.js +170 -40
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/admin-reports.d.ts +18 -0
- package/src/lib/server/admin-reports.js +280 -0
- package/src/lib/server/admin-reports.js.map +1 -0
- package/src/lib/server/admin-reviews.d.ts +18 -0
- package/src/lib/server/admin-reviews.js +1341 -0
- package/src/lib/server/admin-reviews.js.map +1 -0
- package/src/lib/server/listing-social-card.server.d.ts +24 -0
- package/src/lib/server/listing-social-card.server.js +65 -0
- package/src/lib/server/listing-social-card.server.js.map +1 -0
- package/src/lib/server/publisher-review-email.d.ts +54 -0
- package/src/lib/server/publisher-review-email.js +85 -0
- package/src/lib/server/publisher-review-email.js.map +1 -0
- package/src/lib/server/revoke-cache-drop.d.ts +59 -0
- package/src/lib/server/revoke-cache-drop.js +74 -0
- package/src/lib/server/revoke-cache-drop.js.map +1 -0
- package/src/lib/server.js +47 -0
- package/src/lib/server.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/marketplace/src/lib/components/org-seller-panel.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { trackEvent } from '@aglyn/aglyn/app-utils/analytics-events'\nimport { mdiDotsVertical } from '@aglyn/shared-data-mdi'\nimport { AppLink, CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { Timestamp } from '@aglyn/shared-util-timestamp'\nimport {\n Alert,\n Avatar,\n Button,\n Chip,\n Divider,\n IconButton,\n Link,\n Menu,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport {\n PUBLISHER_AGREEMENT_POINTS,\n PUBLISHER_AGREEMENT_TITLE,\n PUBLISHER_AGREEMENT_VERSION,\n publisherAgreementPresentation,\n publisherAgreementState,\n} from '@aglyn/aglyn/app-utils/publisher-agreement'\n/*\n THE LEGAL NAME, not `useBranding().branding.productName` (AGL-2351).\n\n Every other customer-facing string in the console reads the org's resolved\n product name, and doing that here would be false: the two sentences below say\n which entity holds a sales-tax registration and remits against it. A\n white-label agency holds neither. The value has to name the company that\n actually stands behind the money — the same reasoning that keeps\n `tx-return-webfile.ts` naming the entity rather than the product, and the\n reason these two were left out of the AGL-2319 sweep instead of swept wrong.\n*/\nimport { PLATFORM_BRAND_LEGAL_NAME } from '@aglyn/aglyn/app-utils/platform-brand'\nimport { LISTING_LOGO_HINT } from '../constants/listing-media'\nimport { useRouter } from 'next/navigation'\nimport { collection, doc, query, updateDoc, where } from 'firebase/firestore'\nimport { type ReactElement, useCallback, useEffect, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { pluginDocsHelp, useMediaPicker } from '@aglyn/aglyn'\nimport { useFirestoreCollection } from '@aglyn/tenant-feature-instance'\nimport { useFirestoreDoc } from '@aglyn/tenant-feature-instance'\nimport EditListingDialog from './edit-listing-dialog.component'\nimport { listingPath, publishPluginPath } from '../model/marketplace-paths'\nimport { payoutReadiness } from '../model/payout-readiness'\nimport {\n summarizeSellerLedger,\n type SellerLedgerSale,\n} from '../model/seller-ledger-totals'\n\nconst HANDLE_PATTERN = /^[a-z0-9][a-z0-9-]{2,29}$/\n\nexport type OrgSellerSection = 'profile' | 'listings' | 'payouts' | 'sales'\n\nexport interface OrgSellerPanelProps {\n orgId: string\n /** Which seller card to render — one per Marketplace › seller tab. */\n section: OrgSellerSection\n /**\n * Where the marketplace hub is mounted under this organization, from the\n * shell (AGL-3080) — the panel's links to a listing and to the publish\n * form hang beneath it. It replaced an org slug and the console's route\n * table, which a plugin may not import.\n */\n basePath: string\n}\n\n/**\n * Seller area (AGL-44/798/801): the org's marketplace identity and its\n * published listings, folded out of the retired `/[orgSlug]/marketplace` page.\n * Each section (profile, listings, payouts, sales) is its own Marketplace\n * ROUTE (AGL-801/693), so this renders exactly one card per the `section`\n * prop. The shared Firestore hooks run regardless of which section is asked\n * for — Firebase dedupes identical listeners, and only the section the reader\n * navigated to is mounted at all, so the others never subscribe.\n */\nexport function OrgSellerPanel(props: OrgSellerPanelProps) {\n const { orgId, section, basePath } = props\n const router = useRouter()\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n /** Bumped by Retry to re-subscribe the publisher profile (AGL-1380). */\n const [profileRetryNonce, setProfileRetryNonce] = useState(0)\n const { data: profile, status: profileStatus } = useFirestoreDoc<any>(\n // The org's marketplace identity (AGL-652), not the personal one. Held\n // at null rather than addressed as `publisherProfiles/-none-`: that\n // sentinel issued a guaranteed-denied read, and a denial now lands in\n // `status: 'error'`, which means something.\n () => (orgId ? doc(firestore, 'publisherProfiles', orgId) : null),\n [firestore, orgId, profileRetryNonce],\n { idField: '$id' },\n )\n /**\n * Three outcomes, not two (AGL-1380). An absent publisher profile is the\n * value BEFORE an answer as much as it is the value of a publisher who\n * never connected Stripe, so reading payout state off `stripeChargesEnabled`\n * alone told a publisher already taking payouts to \"Connect a Stripe\n * account\" and offered them the setup button that starts onboarding again.\n */\n const payoutsState: 'pending' | 'error' | 'loaded' =\n !orgId || profileStatus === 'loading'\n ? 'pending'\n : profileStatus === 'error'\n ? 'error'\n : 'loaded'\n /**\n * TWO questions, not one (AGL-1997). This card said \"Payouts are enabled\"\n * off `stripeChargesEnabled` — whether Stripe will let the account take\n * MONEY — and never read `stripePayoutsEnabled`, whether the money can\n * LEAVE. The decision itself lives in `payoutReadiness` so each of its six\n * outcomes can be asserted without mounting this tree.\n */\n const readiness = payoutReadiness({\n state: payoutsState,\n chargesEnabled: profile?.stripeChargesEnabled,\n payoutsEnabled: profile?.stripePayoutsEnabled,\n accountLivemode: profile?.stripeAccountLivemode,\n })\n /** Stripe will let this account take money — four of the seven outcomes. */\n const chargesEnabled =\n readiness === 'ready' ||\n readiness === 'blocked' ||\n readiness === 'unknown' ||\n readiness === 'unverified'\n // Both held at null while the org is unknown, like the profile above\n // (AGL-1440): AGL-1380 repaired the profile ref and left these two\n // `where`-clause siblings on the sentinel. The purchases query is the one\n // that matters — `marketplacePurchases` is buyer/seller-gated, and a\n // rules-shaped LIST is evaluated against the QUERY, so the sentinel was\n // denied wholesale and retried on the refusal cadence. The listings query\n // is public and merely wasted the round trip.\n const { data: listings } = useFirestoreCollection<any>(\n () =>\n orgId\n ? query(\n collection(firestore, 'marketplaceListings'),\n // Listings are org-owned (AGL-652): `profileId` is the org id,\n // not a uid — filtering by uid left this list permanently empty\n // (AGL-781).\n where('profileId', '==', orgId),\n )\n : null,\n [firestore, orgId],\n { idField: '$id' },\n )\n // Seller ledger (AGL-46): purchase records written by the Stripe webhook.\n const { data: sales } = useFirestoreCollection<any>(\n () =>\n orgId\n ? query(\n collection(firestore, 'marketplacePurchases'),\n // Sales belong to the ORG that published (AGL-652).\n where('sellerOrgId', '==', orgId),\n )\n : null,\n [firestore, orgId],\n { idField: '$id' },\n )\n // What the publisher was actually paid (AGL-2158) — see\n // `summarizeSellerLedger`, where the arithmetic and the reasoning live. This\n // card used to render `amountCents − feeCents` as \"net\", which is\n // `pretax + tax − fee`: the payout PLUS sales tax that was never the\n // publisher's, summed over refunded sales as well as live ones.\n const totals = summarizeSellerLedger(sales as SellerLedgerSale[] | undefined)\n\n const [payoutsBusy, setPayoutsBusy] = useState(false)\n /**\n * A one-time Stripe Express dashboard link from the connect route. Not\n * persisted: login links are single-use and short-lived, so a stored one is\n * a button that fails the second time it is pressed.\n */\n const [dashboardUrl, setDashboardUrl] = useState<string | null>(null)\n const handlePayouts = useCallback(async () => {\n setPayoutsBusy(true)\n try {\n const response = await authorizedFetch(user, '/api/marketplace/connect', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n // The acting org from the URL (AGL-861) — never let the server guess\n // which of the user's orgs is being set up for payouts.\n body: JSON.stringify({ orgId }),\n })\n const payload = await response.json()\n if (response.status === 501) {\n return void enqueueSnackbar(\n 'Payouts are not configured on this deployment',\n { variant: 'info', persist: false },\n )\n }\n if (!response.ok) {\n return void enqueueSnackbar(payload?.error ?? 'Payout setup failed', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n if (payload.chargesEnabled) {\n // Publisher-payout half of the same activation metric (AGL-1561),\n // gated on the transition for the same reason as the commerce card:\n // the connect handler is re-entrant and reports `true` on every\n // revisit. `chargesEnabled` is the pre-request state — the metric is\n // about CONNECTING (AGL-1997 split the two flags; payout readiness\n // can arrive days later and is not a second activation).\n if (!chargesEnabled) trackEvent('stripe_connected', {})\n // A WARNING THAT NAMES A PROBLEM MUST OFFER THE FIX.\n //\n // \"Finish payout setup in Stripe\" is the label this button carries in\n // exactly this state, and it could not open Stripe: the route returned\n // here with a status and no link, and this branch answered before the\n // `payload.url` check below ever ran. An Express account has no\n // password and no direct login, so a link minted by the platform is\n // the publisher's only way in — without one their share accumulates in\n // an account that cannot release it and nothing says why.\n if (payload.payoutsEnabled === false && payload.url) {\n return void window.location.assign(payload.url)\n }\n // Payouts are flowing, so the route answers with the Express dashboard\n // instead: balance, payout schedule, and the reason a payout failed.\n // Held rather than followed — this click was a status check.\n if (\n payload.payoutsEnabled !== false &&\n typeof payload.dashboardUrl === 'string'\n ) {\n setDashboardUrl(payload.dashboardUrl)\n }\n // The same split the card renders (AGL-1997): the route answers both\n // flags, so the toast must not announce payouts off the charges one.\n return void enqueueSnackbar(\n payload.payoutsEnabled === false\n ? 'Connected — payouts are not released yet'\n : 'Payouts are enabled',\n {\n variant: payload.payoutsEnabled === false ? 'warning' : 'success',\n persist: false,\n },\n )\n }\n if (payload.url) window.location.assign(payload.url)\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n } finally {\n setPayoutsBusy(false)\n }\n }, [orgId, user, chargesEnabled, enqueueSnackbar])\n\n const [handle, setHandle] = useState('')\n const [displayName, setDisplayName] = useState('')\n const [bio, setBio] = useState('')\n // Logo, support contact and social links (AGL-1009). `avatarUrl` and\n // `website` existed server-side already — they just had no form input and\n // no rendering, so they were dead fields until now.\n const [avatarUrl, setAvatarUrl] = useState('')\n /*\n * The console's media library, opened through the picker context rather\n * than by mounting its dialog (AGL-3080): the library is coupled to the\n * org and the session, which a plugin has no way to reach, and the console\n * provides `pickMedia` around every plugin page for exactly this. The URL\n * comes back already resolved — CDN path over the raw download URL\n * (AGL-1215) — so the panel no longer resolves one itself.\n */\n const { pickMedia } = useMediaPicker()\n const chooseLogo = useCallback(async () => {\n const picked = await pickMedia?.({ kind: 'image' })\n if (picked?.url) setAvatarUrl(picked.url)\n }, [pickMedia])\n const [website, setWebsite] = useState('')\n const [supportEmail, setSupportEmail] = useState('')\n const [supportUrl, setSupportUrl] = useState('')\n const [githubUrl, setGithubUrl] = useState('')\n const [xUrl, setXUrl] = useState('')\n const [linkedinUrl, setLinkedinUrl] = useState('')\n useEffect(() => {\n setHandle(profile?.handle ?? '')\n setDisplayName(profile?.displayName ?? '')\n setBio(profile?.bio ?? '')\n setAvatarUrl(profile?.avatarUrl ?? '')\n setWebsite(profile?.website ?? '')\n setSupportEmail(profile?.supportEmail ?? '')\n setSupportUrl(profile?.supportUrl ?? '')\n setGithubUrl(profile?.githubUrl ?? '')\n setXUrl(profile?.xUrl ?? '')\n setLinkedinUrl(profile?.linkedinUrl ?? '')\n }, [\n profile?.handle,\n profile?.displayName,\n profile?.bio,\n profile?.avatarUrl,\n profile?.website,\n profile?.supportEmail,\n profile?.supportUrl,\n profile?.githubUrl,\n profile?.xUrl,\n profile?.linkedinUrl,\n ])\n\n const validHandle = HANDLE_PATTERN.test(handle)\n\n const handleSave = useCallback(async () => {\n if (!orgId || !validHandle || !displayName.trim()) return\n try {\n // Server-owned (AGL-652): the handle must be claimed transactionally in\n // publisherHandles, which a client write cannot do — two orgs racing\n // for one handle would both succeed and one would silently lose its\n // marketplace URL. The rules reject a client handle write outright.\n const response = await authorizedFetch(\n user,\n '/api/marketplace/publisher-profile',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n orgId,\n handle,\n displayName: displayName.trim(),\n bio: bio.trim(),\n // AGL-1009: validated server-side (https-only, fixed social\n // hosts) — an empty string explicitly clears the stored field.\n avatarUrl: avatarUrl.trim(),\n website: website.trim(),\n supportEmail: supportEmail.trim(),\n supportUrl: supportUrl.trim(),\n githubUrl: githubUrl.trim(),\n xUrl: xUrl.trim(),\n linkedinUrl: linkedinUrl.trim(),\n }),\n },\n )\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n return enqueueSnackbar(payload?.error ?? 'Could not save the profile', {\n variant: 'warning',\n persist: false,\n })\n }\n enqueueSnackbar('Profile saved', { variant: 'success', persist: false })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n }, [\n orgId,\n validHandle,\n handle,\n displayName,\n bio,\n avatarUrl,\n website,\n supportEmail,\n supportUrl,\n githubUrl,\n xUrl,\n linkedinUrl,\n user,\n enqueueSnackbar,\n ])\n\n // The publisher agreement (AGL-1077). `none` and `outdated` get different\n // copy on purpose: \"you never agreed\" and \"the terms moved\" are different\n // situations, and one message for both reads as a bug in whichever case it\n // does not describe.\n const agreementState = publisherAgreementState(profile?.publisherAgreement)\n // Whether the document can be read at all (AGL-1660). While it has no\n // published page there is no link to render and no acceptance to collect —\n // the summary below is a summary OF something, and without the something it\n // is just seven sentences we wrote.\n const agreementPresentation = publisherAgreementPresentation(agreementState)\n const acceptedOn = (() => {\n const at = profile?.publisherAgreement?.acceptedAt\n const date = at?.toDate?.()\n return date ? date.toLocaleDateString() : ''\n })()\n const [agreementBusy, setAgreementBusy] = useState(false)\n const handleAcceptAgreement = useCallback(async () => {\n if (!orgId) return\n setAgreementBusy(true)\n try {\n // Server-owned, like the handle: an acceptance the accepting party can\n // write itself is not evidence of anything, and the rules block the\n // field outright.\n const response = await authorizedFetch(\n user,\n '/api/marketplace/publisher-profile',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: 'accept-agreement',\n orgId,\n // Echoed back so the server can refuse an acceptance of anything\n // other than the version in force — including one made against a\n // page left open across a change.\n version: PUBLISHER_AGREEMENT_VERSION,\n }),\n },\n )\n const payload = await response.json().catch(() => null)\n if (!response.ok) {\n return void enqueueSnackbar(\n payload?.error ?? 'Could not record the acceptance',\n { variant: 'warning', persist: false },\n )\n }\n enqueueSnackbar('Agreement accepted — you can publish now', {\n variant: 'success',\n persist: false,\n })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n } finally {\n setAgreementBusy(false)\n }\n }, [orgId, user, enqueueSnackbar])\n\n // The listing open in the full editor (AGL-862), or null when closed.\n const [editListing, setEditListing] = useState<any | null>(null)\n // Per-row overflow menu (AGL-999): the anchor plus the row it belongs to,\n // so one <Menu> serves every row instead of one per listing.\n const [rowMenu, setRowMenu] = useState<{\n anchor: HTMLElement\n listing: any\n } | null>(null)\n const closeRowMenu = () => setRowMenu(null)\n const listingHref = (listing: any) => listingPath(basePath, listing.$id)\n // Shipping a new version was invisible as a path (AGL-1008): the only door\n // was the generic publish form, which reads entirely like first-time\n // publishing, so updating looked like creating a second listing. Same\n // form, pre-bound to the listing.\n const newVersionHref = (listing: any) =>\n publishPluginPath(basePath, listing.$id)\n\n // Private ⇄ public (AGL-968/994). Goes through the API rather than a client\n // write: making a listing public is gated on it actually carrying the docs\n // a stranger needs, and that check has to live somewhere a client can't\n // skip. No re-review either way — the bytes are unchanged.\n const [visibilityBusy, setVisibilityBusy] = useState('')\n const handleVisibility = useCallback(\n (listing: any) => async () => {\n const next = listing.visibility === 'private' ? 'public' : 'private'\n setVisibilityBusy(listing.$id)\n try {\n const response = await authorizedFetch(\n user,\n '/api/marketplace/publish-plugin',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n action: 'set-visibility',\n listingId: listing.$id,\n visibility: next,\n }),\n },\n )\n const payload = await response.json().catch(() => ({}))\n if (!response.ok) {\n return void enqueueSnackbar(\n payload?.error ?? 'Visibility change failed',\n { variant: 'error', allowDuplicate: true },\n )\n }\n enqueueSnackbar(\n next === 'private'\n ? 'Now private — only your sites can install it'\n : 'Published to the marketplace',\n { variant: 'success', persist: false },\n )\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n } finally {\n setVisibilityBusy('')\n }\n },\n [user, enqueueSnackbar],\n )\n const handleUnpublish = useCallback(\n (listing: any) => async () => {\n try {\n await updateDoc(doc(firestore, 'marketplaceListings', listing.$id), {\n deletedAt: listing.deletedAt ? null : Timestamp.now(),\n })\n enqueueSnackbar(listing.deletedAt ? 'Republished' : 'Unpublished', {\n variant: 'success',\n persist: false,\n })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', {\n variant: 'error',\n allowDuplicate: true,\n })\n }\n },\n [firestore, enqueueSnackbar],\n )\n\n const cards: Record<OrgSellerSection, ReactElement> = {\n profile: (\n <Stack spacing={2}>\n <CardDisplay\n header={'Public profile'}\n help={pluginDocsHelp('publisherHandbook', {\n anchor: '#before-your-first-publish',\n excerpt:\n 'Your public publisher identity — handle, name, and bio shown ' +\n 'on everything you publish to the marketplace.',\n })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Shown on every component you publish to the marketplace. A ' +\n 'profile is required before publishing.'}\n </Typography>\n <TextField\n label=\"Handle\"\n value={handle}\n onChange={(event) => setHandle(event.target.value.toLowerCase())}\n size=\"small\"\n error={Boolean(handle) && !validHandle}\n helperText={\n Boolean(handle) && !validHandle\n ? '3–30 chars: lowercase letters, digits, dashes'\n : ' '\n }\n />\n <TextField\n label=\"Display name\"\n value={displayName}\n onChange={(event) => setDisplayName(event.target.value)}\n size=\"small\"\n />\n <TextField\n label=\"Bio\"\n value={bio}\n onChange={(event) => setBio(event.target.value)}\n size=\"small\"\n multiline\n minRows={2}\n />\n {/* Logo (AGL-1009): picked from the media library like every\n other image the console chooses — never a pasted URL. */}\n {/* What to bring, said before the upload (AGL-2486). */}\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"div\">\n {LISTING_LOGO_HINT}\n </Typography>\n <Stack direction=\"row\" spacing={2} sx={{ alignItems: 'center' }}>\n <Avatar\n src={avatarUrl || undefined}\n alt={displayName || 'Publisher logo'}\n sx={{ width: 56, height: 56 }}\n variant=\"rounded\"\n >\n {(displayName || handle || '?').slice(0, 1).toUpperCase()}\n </Avatar>\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" onClick={chooseLogo}>\n {avatarUrl ? 'Replace logo' : 'Choose logo from library'}\n </Button>\n {avatarUrl ? (\n <Button\n size=\"small\"\n color=\"error\"\n onClick={() => setAvatarUrl('')}\n >\n {'Remove'}\n </Button>\n ) : null}\n </Stack>\n </Stack>\n {/* Support contact (AGL-1009): buyers of a paid plugin need\n somewhere to go, and a reviewer needs it more. */}\n <TextField\n label=\"Support email\"\n value={supportEmail}\n onChange={(event) => setSupportEmail(event.target.value)}\n size=\"small\"\n type=\"email\"\n />\n <TextField\n label=\"Support URL\"\n value={supportUrl}\n onChange={(event) => setSupportUrl(event.target.value)}\n size=\"small\"\n helperText=\"Where buyers go for help with your plugins — https:// only\"\n />\n <TextField\n label=\"Website\"\n value={website}\n onChange={(event) => setWebsite(event.target.value)}\n size=\"small\"\n helperText=\"Your own site, linked from your publisher page — https:// only\"\n />\n {/* Fixed social set (AGL-1009): the storefront renders these as\n icons, so it is a known trio rather than a free-form list. */}\n <TextField\n label=\"GitHub\"\n value={githubUrl}\n onChange={(event) => setGithubUrl(event.target.value)}\n size=\"small\"\n helperText=\"https://github.com/…\"\n />\n <TextField\n label=\"X\"\n value={xUrl}\n onChange={(event) => setXUrl(event.target.value)}\n size=\"small\"\n helperText=\"https://x.com/…\"\n />\n <TextField\n label=\"LinkedIn\"\n value={linkedinUrl}\n onChange={(event) => setLinkedinUrl(event.target.value)}\n size=\"small\"\n helperText=\"https://linkedin.com/…\"\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={!validHandle || !displayName.trim()}\n onClick={handleSave}\n >\n {'Save profile'}\n </Button>\n </Stack>\n </CardDisplay>\n\n {/* The publisher agreement (AGL-1077). Its own card, directly under\n the identity it belongs to, rather than a seventh checkbox on the\n publish form — an agreement accepted in the same breath as six\n per-bundle confirmations is an agreement nobody read. Publishing\n then simply requires it, so the first publish is where it STOPS\n you rather than where it hides. */}\n <CardDisplay\n header={PUBLISHER_AGREEMENT_TITLE}\n help={pluginDocsHelp('publisherHandbook', {\n anchor: '#the-publisher-agreement',\n excerpt:\n 'The terms your organization publishes under — accepted once, ' +\n 're-asked when they change.',\n })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n {agreementState === 'current' ? (\n <Alert severity=\"success\">\n {`Accepted — version ${profile?.publisherAgreement?.version}` +\n (acceptedOn ? ` on ${acceptedOn}` : '')}\n </Alert>\n ) : null}\n {/* An unpublished document replaces the state copy rather than\n sitting beside it (AGL-1660): \"you have not accepted these\n terms\" reads as something the publisher failed to do, and while\n there is no page to read, the omission is entirely ours. */}\n {agreementPresentation.unavailableNotice ? (\n <Alert severity=\"warning\">\n {agreementPresentation.unavailableNotice}\n </Alert>\n ) : agreementState === 'current' ? null : (\n <Alert severity={agreementState === 'outdated' ? 'warning' : 'info'}>\n {agreementState === 'outdated'\n ? 'These terms have changed since your organization accepted ' +\n `them (you accepted ${profile?.publisherAgreement?.version}). ` +\n 'Publishing is paused until someone who can bind the ' +\n 'organization accepts the current version.'\n : 'Your organization has not accepted these terms. You can ' +\n 'set up a profile without them, but you cannot publish.'}\n </Alert>\n )}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'In summary — this is not the agreement, it is what tends to ' +\n 'surprise people later:'}\n </Typography>\n <Stack spacing={1}>\n {PUBLISHER_AGREEMENT_POINTS.map((point) => (\n <Stack key={point.id} spacing={0.25}>\n <Typography variant=\"body2\">{point.label}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {point.detail}\n </Typography>\n </Stack>\n ))}\n </Stack>\n {/* The href comes from the presentation helper, never from the\n constant: while the document is unpublished the helper hands back\n null and there is nothing here to click. That is the point — a\n link to a 404 above an Accept button is how a publisher ends up\n having \"read\" a document that was never served. */}\n {agreementPresentation.documentUrl ? (\n <Typography variant=\"body2\">\n <Link\n href={agreementPresentation.documentUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n underline=\"always\"\n >\n {`Read the full ${PUBLISHER_AGREEMENT_TITLE}`}\n </Link>\n {` (version ${PUBLISHER_AGREEMENT_VERSION})`}\n </Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Version ${PUBLISHER_AGREEMENT_VERSION} has no published page ` +\n 'yet, so there is no full text to link to.'}\n </Typography>\n )}\n {agreementPresentation.canAccept ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={agreementBusy}\n onClick={() => void handleAcceptAgreement()}\n sx={{ alignSelf: 'flex-start' }}\n >\n {agreementBusy\n ? 'Recording…'\n : agreementState === 'outdated'\n ? 'Accept the current version'\n : 'Accept on behalf of this organization'}\n </Button>\n ) : null}\n {agreementPresentation.canAccept ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Accepting binds the organization, not you personally — only ' +\n 'an owner or admin can do it, and we record who did and when.'}\n </Typography>\n ) : null}\n </Stack>\n </CardDisplay>\n </Stack>\n ),\n listings: (\n <CardDisplay\n header={'Your listings'}\n help={pluginDocsHelp('publisherHandbook', {\n anchor: '#authoring-your-listing',\n excerpt:\n 'Everything you have published, with preview images and ' +\n 'per-listing unpublish/republish.',\n })}\n contentGutterX\n contentGutterY\n >\n {(listings ?? []).length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Publish a reusable component from a site’s Setup page to list ' +\n 'it here.'}\n </Typography>\n ) : (\n <Stack spacing={1}>\n {/* Private plugins are invisible in Browse by design (AGL-993),\n which makes this the only door to them — say so, or a\n publisher looking for the one they just uploaded will hunt\n for it in the marketplace grid. */}\n {(listings ?? []).some(\n (listing: any) => listing.visibility === 'private',\n ) ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Private plugins never appear in the marketplace — open one ' +\n 'with View to install it on your sites.'}\n </Typography>\n ) : null}\n {(listings ?? []).map((listing: any) => (\n <Stack\n key={listing.$id}\n direction=\"row\"\n spacing={1}\n sx={{\n alignItems: 'center',\n // The whole row is the way in (AGL-999) — the name and its\n // metadata are what you aim at, so they should behave like\n // the link they read as.\n borderRadius: 1,\n mx: -1,\n px: 1,\n '&:hover': { bgcolor: 'action.hover' },\n }}\n >\n <Stack\n onClick={() => router.push(listingHref(listing))}\n sx={{\n flex: 1,\n minWidth: 0,\n py: 0.75,\n cursor: 'pointer',\n }}\n >\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', minWidth: 0 }}\n >\n <Typography variant=\"body2\" noWrap>\n {listing.displayName}\n </Typography>\n {/* This tab is the ONLY place a private listing appears\n (AGL-993 keeps it out of browse), so the row has to\n say which of the two things it is. */}\n {listing.visibility === 'private' ? (\n <Chip size=\"small\" variant=\"outlined\" label=\"Private\" />\n ) : null}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`v${listing.latestVersion}` +\n (Number(listing.priceUsd ?? 0) > 0\n ? ` · $${listing.priceUsd}`\n : ' · free') +\n (listing.previewImageUrl ? ' · has preview' : '') +\n (listing.deletedAt ? ' · unpublished' : '')}\n </Typography>\n </Stack>\n {/* View what a buyer sees (AGL-988). The one action that\n stays visible (AGL-999): every other row action is either\n rare or destructive, and flattening them all out made the\n columns jump between rows — the action count varies by\n artifact type — while putting Unpublish at the end of the\n row, the easiest place to hit by mistake. */}\n <AppLink href={listingHref(listing)}>\n <Button size=\"small\" color=\"primary\" component=\"span\">\n {'View'}\n </Button>\n </AppLink>\n <IconButton\n size=\"small\"\n aria-label={`More actions for ${listing.displayName}`}\n onClick={(event) =>\n setRowMenu({\n anchor: event.currentTarget,\n listing,\n })\n }\n >\n <MdiIcon path={mdiDotsVertical.path} fontSize=\"small\" />\n </IconButton>\n </Stack>\n ))}\n </Stack>\n )}\n {/* One menu for every row (AGL-999) — the open row is state, not a\n mounted <Menu> per listing. */}\n <Menu\n anchorEl={rowMenu?.anchor ?? null}\n open={Boolean(rowMenu)}\n onClose={closeRowMenu}\n >\n {/* Plugins only: bytes are the thing being shipped, and only a\n plugin listing has a bundle (AGL-1008). */}\n {(rowMenu?.listing?.artifactType ?? rowMenu?.listing?.type) ===\n 'plugin' ? (\n <MenuItem\n onClick={() => {\n const listing = rowMenu?.listing\n closeRowMenu()\n if (listing) router.push(newVersionHref(listing))\n }}\n >\n {'Publish new version…'}\n </MenuItem>\n ) : null}\n <MenuItem\n onClick={() => {\n setEditListing(rowMenu?.listing ?? null)\n closeRowMenu()\n }}\n >\n {'Edit listing'}\n </MenuItem>\n {/* Plugins only (AGL-994). `visibility` is enforced in\n `install-plugin`; the component/layout/template install routes\n have no such check, so offering the switch there would promise\n a boundary that does not exist. */}\n {(rowMenu?.listing?.artifactType ?? rowMenu?.listing?.type) ===\n 'plugin' ? (\n <MenuItem\n disabled={visibilityBusy === rowMenu?.listing?.$id}\n onClick={() => {\n const listing = rowMenu?.listing\n closeRowMenu()\n if (listing) void handleVisibility(listing)()\n }}\n >\n {rowMenu?.listing?.visibility === 'private'\n ? 'Make public…'\n : 'Make private'}\n </MenuItem>\n ) : null}\n <Divider />\n <MenuItem\n sx={{\n color: rowMenu?.listing?.deletedAt ? undefined : 'error.main',\n }}\n onClick={() => {\n const listing = rowMenu?.listing\n closeRowMenu()\n if (listing) void handleUnpublish(listing)()\n }}\n >\n {rowMenu?.listing?.deletedAt ? 'Republish' : 'Unpublish'}\n </MenuItem>\n </Menu>\n <EditListingDialog\n orgId={orgId}\n listing={editListing}\n open={Boolean(editListing)}\n onClose={() => setEditListing(null)}\n user={user}\n />\n </CardDisplay>\n ),\n payouts: (\n <CardDisplay\n header={'Payouts'}\n help={pluginDocsHelp('publisherHandbook', {\n anchor: '#getting-paid',\n excerpt:\n 'Connect Stripe to receive payouts for paid listings. Platform ' +\n 'fee: 20% per sale, 30% on the Free plan.',\n })}\n contentGutterX\n contentGutterY\n >\n <Stack spacing={2}>\n {payoutsState === 'error' ? (\n // Neither sentence is safe here: \"Payouts are enabled\" and\n // \"Connect a Stripe account\" both state a payout arrangement we\n // failed to read, and the button under them acts on it.\n <Alert\n severity=\"error\"\n action={\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={() => setProfileRetryNonce((n) => n + 1)}\n >\n {'Retry'}\n </Button>\n }\n >\n {'We couldn’t load your payout setup. This says nothing about ' +\n 'whether payouts are on — nothing has changed.'}\n </Alert>\n ) : payoutsState === 'pending' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Checking your payout setup…'}\n </Typography>\n ) : (\n <>\n {/* The charges-yes/payouts-no state (AGL-1997), which used to\n render as unqualified success. Stripe will let this account\n take money and will not let it out yet, so the honest thing\n is to say both halves — a publisher who reads \"enabled\" and\n sells has no reason to go finish verification. */}\n {readiness === 'blocked' ? (\n <Alert severity=\"warning\">\n {'Your Stripe account can take payments, but payouts are ' +\n 'not enabled yet — sales would stay in Stripe rather ' +\n 'than reaching your bank. Finish verification in Stripe ' +\n 'to release them.'}\n </Alert>\n ) : null}\n {/* AGL-2471. The connected account was never verified against\n this deployment's Stripe mode, and the sale gate refuses it\n — so the card must not imply the account works. Saying it\n plainly, with the one action that fixes it, is the whole\n difference between this and a storefront that looks ready\n and cannot take a payment. */}\n {readiness === 'unverified' ? (\n <Alert severity=\"error\">\n {'This Stripe account has not been verified for payments ' +\n 'here, so sales will be refused. Reconnect it to ' +\n 'confirm — if it was set up against Stripe test mode, ' +\n 'you will need to connect a live account.'}\n </Alert>\n ) : null}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {readiness === 'ready'\n ? 'Payouts are enabled — paid listings transfer to your ' +\n 'Stripe account automatically (platform fee 20%, 30% on ' +\n 'the Free plan).'\n : readiness === 'unknown'\n ? // Connected, payout readiness unread. Says only what is\n // known, like the error branch above.\n 'Your Stripe account is connected. We haven’t checked ' +\n 'whether payouts are released yet — recheck to ' +\n 'confirm. The platform fee is 20% per sale (30% on ' +\n 'the Free plan).'\n : readiness === 'blocked' || readiness === 'unverified'\n ? 'The platform fee is 20% per sale (30% on the Free ' +\n 'plan).'\n : 'Connect a Stripe account to sell components. The ' +\n 'platform fee is 20% per sale (30% on the Free plan).'}\n </Typography>\n <Button\n variant={chargesEnabled ? 'outlined' : 'contained'}\n color=\"primary\"\n disabled={payoutsBusy}\n onClick={handlePayouts}\n >\n {payoutsBusy\n ? 'Opening Stripe…'\n : readiness === 'ready'\n ? 'Payouts enabled — recheck status'\n : readiness === 'blocked'\n ? 'Finish payout setup in Stripe'\n : readiness === 'unverified'\n ? 'Reconnect Stripe to verify'\n : readiness === 'unknown'\n ? 'Recheck payout status'\n : 'Set up payouts'}\n </Button>\n {/*\n Where the money actually is. Aglyn records no\n balance, no payout schedule, and handles no `payout.failed`\n event, so a publisher whose payout bounced cannot learn that\n here. An Express account has no direct login, which leaves a\n platform-minted link as the only route in.\n */}\n {dashboardUrl ? (\n <Button\n variant=\"text\"\n color=\"primary\"\n href={dashboardUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {'View payouts in Stripe'}\n </Button>\n ) : null}\n </>\n )}\n </Stack>\n </CardDisplay>\n ),\n sales: (\n <CardDisplay\n header={'Sales'}\n help={pluginDocsHelp('publishAPlugin', {\n anchor: '#paid-listings',\n excerpt:\n 'Sent to your Stripe account is your share after the platform ' +\n `fee — sales tax is collected on ${PLATFORM_BRAND_LEGAL_NAME}’s ` +\n 'registration and is never yours.',\n })}\n contentGutterX\n contentGutterY\n >\n {(sales ?? []).length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No sales yet. Paid listings appear here with what buyers paid ' +\n 'and what was paid out to you.'}\n </Typography>\n ) : (\n <Stack spacing={0.5}>\n <Typography variant=\"body2\">\n {`${totals.paidCount} sale${totals.paidCount === 1 ? '' : 's'}`}\n {totals.refundedCount > 0\n ? ` · ${totals.refundedCount} refunded or charged back`\n : ''}\n </Typography>\n {/*\n The payout FIRST, and named for what it is. It is the number a\n publisher reconciles against their Stripe account, and it is the\n one this card used to get wrong.\n\n \"Sent to your Stripe account\", not \"net paid out\".\n The figure sums `transferCents` — the instruction given at charge\n time — so it says the money was DISPATCHED and knows nothing\n about whether the payout from that balance to a bank succeeded.\n A publisher reading \"net paid out\" during a failed payout was\n told their money had landed by the one surface that should have\n warned them. The notice below carries the arrival.\n */}\n <Typography variant=\"body2\">\n {`Sent to your Stripe account $${(\n totals.sentToStripeCents / 100\n ).toFixed(2)}`}\n </Typography>\n {/*\n WHERE IT STOPPED, when it stopped. Mirrored onto the publisher\n profile by the `payout.failed` handler, and retired by the next\n successful payout — so this is a live problem, not a scar.\n */}\n {profile?.lastPayoutFailureAtMs ? (\n <Alert severity=\"warning\" variant=\"outlined\">\n {`A payout of $${(\n Number(profile.lastPayoutFailureCents ?? 0) / 100\n ).toFixed(2)} did not reach your bank on ${new Date(\n Number(profile.lastPayoutFailureAtMs),\n ).toLocaleDateString()} — ${String(\n profile.lastPayoutFailureReason ?? 'Stripe did not say why',\n )} The money is still in your Stripe account. Open Stripe to fix your payout details.`}\n </Alert>\n ) : null}\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Buyers paid $${(totals.buyersPaidCents / 100).toFixed(2)} · ` +\n `sales tax $${(totals.salesTaxCents / 100).toFixed(2)} · ` +\n `platform fee $${(totals.platformFeeCents / 100).toFixed(2)}`}\n </Typography>\n {totals.refundedCount > 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`$${(totals.returnedCents / 100).toFixed(2)} returned on refunded ` +\n 'and charged-back sales, and excluded above'}\n </Typography>\n ) : null}\n {/*\n THE COPY THAT LANDS WITH THE SMALLER NUMBER. A publisher who\n read `net $88.25` yesterday and reads `net paid out $80.00`\n today is owed the reason on the same card, not in a changelog.\n */}\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Sent to your Stripe account is the pre-tax price less the ' +\n 'platform fee. Sales tax is collected and remitted by ' +\n `${PLATFORM_BRAND_LEGAL_NAME} under its marketplace-provider ` +\n 'registration and was never part of your share. Reaching ' +\n 'your Stripe balance is not the same as reaching your bank — ' +\n 'a failed payout is called out above.'}\n </Typography>\n </Stack>\n )}\n </CardDisplay>\n ),\n }\n\n return cards[section]\n}\nOrgSellerPanel.displayName = 'OrgSellerPanel'\n\nexport default OrgSellerPanel\n"],"names":["trackEvent","mdiDotsVertical","AppLink","CardDisplay","MdiIcon","useSnackbar","Timestamp","Alert","Avatar","Button","Chip","Divider","IconButton","Link","Menu","MenuItem","Stack","TextField","Typography","PUBLISHER_AGREEMENT_POINTS","PUBLISHER_AGREEMENT_TITLE","PUBLISHER_AGREEMENT_VERSION","publisherAgreementPresentation","publisherAgreementState","PLATFORM_BRAND_LEGAL_NAME","LISTING_LOGO_HINT","useRouter","collection","doc","query","updateDoc","where","useCallback","useEffect","useState","useFirestore","useUser","authorizedFetch","pluginDocsHelp","useMediaPicker","useFirestoreCollection","useFirestoreDoc","EditListingDialog","listingPath","publishPluginPath","payoutReadiness","summarizeSellerLedger","HANDLE_PATTERN","OrgSellerPanel","props","profile","rowMenu","orgId","section","basePath","router","firestore","data","user","enqueueSnackbar","profileRetryNonce","setProfileRetryNonce","status","profileStatus","idField","payoutsState","readiness","state","chargesEnabled","stripeChargesEnabled","payoutsEnabled","stripePayoutsEnabled","accountLivemode","stripeAccountLivemode","listings","sales","totals","payoutsBusy","setPayoutsBusy","dashboardUrl","setDashboardUrl","handlePayouts","response","method","headers","body","JSON","stringify","payload","json","variant","persist","ok","error","allowDuplicate","url","window","location","assign","console","handle","setHandle","displayName","setDisplayName","bio","setBio","avatarUrl","setAvatarUrl","pickMedia","chooseLogo","picked","kind","website","setWebsite","supportEmail","setSupportEmail","supportUrl","setSupportUrl","githubUrl","setGithubUrl","xUrl","setXUrl","linkedinUrl","setLinkedinUrl","validHandle","test","handleSave","trim","catch","agreementState","publisherAgreement","agreementPresentation","acceptedOn","at","acceptedAt","date","toDate","toLocaleDateString","agreementBusy","setAgreementBusy","handleAcceptAgreement","action","version","editListing","setEditListing","setRowMenu","closeRowMenu","listingHref","listing","$id","newVersionHref","visibilityBusy","setVisibilityBusy","handleVisibility","next","visibility","listingId","handleUnpublish","deletedAt","now","cards","spacing","header","help","anchor","excerpt","contentGutterX","contentGutterY","color","label","value","onChange","event","target","toLowerCase","size","Boolean","helperText","multiline","minRows","component","direction","sx","alignItems","src","undefined","alt","width","height","slice","toUpperCase","onClick","type","disabled","severity","unavailableNotice","map","point","detail","id","documentUrl","href","rel","underline","canAccept","alignSelf","length","some","borderRadius","mx","px","bgcolor","push","flex","minWidth","py","cursor","noWrap","latestVersion","Number","priceUsd","previewImageUrl","aria-label","currentTarget","path","fontSize","anchorEl","open","onClose","artifactType","payouts","n","paidCount","refundedCount","sentToStripeCents","toFixed","lastPayoutFailureAtMs","lastPayoutFailureCents","Date","String","lastPayoutFailureReason","buyersPaidCents","salesTaxCents","platformFeeCents","returnedCents"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ConsoleStaffPagePaths } from '@aglyn/aglyn';
|
|
2
|
+
/**
|
|
3
|
+
* One plugin submission or listed plugin, in full (AGL-960).
|
|
4
|
+
*
|
|
5
|
+
* The index is for scanning; this is where a reviewer reads the manifest,
|
|
6
|
+
* weighs the verifier findings and acts. Every consequential action lives
|
|
7
|
+
* here rather than on the list, so nobody grants realm trust or takes a
|
|
8
|
+
* plugin down while skimming rows.
|
|
9
|
+
*/
|
|
10
|
+
export declare function PluginReviewDetail({ basePath, segments, staffRole, staffPaths, }: {
|
|
11
|
+
basePath: string;
|
|
12
|
+
segments?: readonly string[];
|
|
13
|
+
staffRole?: string | null;
|
|
14
|
+
staffPaths?: ConsoleStaffPagePaths;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export default PluginReviewDetail;
|