@iann29/rastro 0.9.0 → 0.10.0
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/README.md +9 -1
- package/agent/integration.md +23 -1
- package/agent/manifest.json +4 -4
- package/dist/client/federation.d.ts +114 -9
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +54 -2
- package/dist/client/federation.js.map +1 -1
- package/dist/client/index.d.ts +637 -8
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +385 -9
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +14 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +277 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +4 -0
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/constants.d.ts +5 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +10 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/convex.config.d.ts +4 -0
- package/dist/component/convex.config.js +9 -0
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/errors.d.ts +1 -1
- package/dist/component/errors.d.ts.map +1 -1
- package/dist/component/errors.js.map +1 -1
- package/dist/component/leads.d.ts +69 -3
- package/dist/component/leads.d.ts.map +1 -1
- package/dist/component/leads.js +419 -16
- package/dist/component/leads.js.map +1 -1
- package/dist/component/meta.d.ts +352 -0
- package/dist/component/meta.d.ts.map +1 -0
- package/dist/component/meta.js +1239 -0
- package/dist/component/meta.js.map +1 -0
- package/dist/component/metaCapi.d.ts +162 -0
- package/dist/component/metaCapi.d.ts.map +1 -0
- package/dist/component/metaCapi.js +754 -0
- package/dist/component/metaCapi.js.map +1 -0
- package/dist/component/metaFake.d.ts +5 -0
- package/dist/component/metaFake.d.ts.map +1 -0
- package/dist/component/metaFake.js +225 -0
- package/dist/component/metaFake.js.map +1 -0
- package/dist/component/metaGraph.d.ts +165 -0
- package/dist/component/metaGraph.d.ts.map +1 -0
- package/dist/component/metaGraph.js +507 -0
- package/dist/component/metaGraph.js.map +1 -0
- package/dist/component/metaSync.d.ts +186 -0
- package/dist/component/metaSync.d.ts.map +1 -0
- package/dist/component/metaSync.js +961 -0
- package/dist/component/metaSync.js.map +1 -0
- package/dist/component/pipeline.d.ts +98 -0
- package/dist/component/pipeline.d.ts.map +1 -0
- package/dist/component/pipeline.js +324 -0
- package/dist/component/pipeline.js.map +1 -0
- package/dist/component/schema.d.ts +404 -2
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +168 -2
- package/dist/component/schema.js.map +1 -1
- package/dist/component/secrets.d.ts +15 -0
- package/dist/component/secrets.d.ts.map +1 -0
- package/dist/component/secrets.js +67 -0
- package/dist/component/secrets.js.map +1 -0
- package/dist/component/validators.d.ts +1052 -15
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +307 -3
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +1 -1
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +1 -1
- package/dist/tracker/generated.js.map +1 -1
- package/dist/ui/campaigns/CampaignsView.d.ts +48 -0
- package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -0
- package/dist/ui/campaigns/CampaignsView.js +47 -0
- package/dist/ui/campaigns/CampaignsView.js.map +1 -0
- package/dist/ui/campaigns/Conversions.d.ts +16 -0
- package/dist/ui/campaigns/Conversions.d.ts.map +1 -0
- package/dist/ui/campaigns/Conversions.js +40 -0
- package/dist/ui/campaigns/Conversions.js.map +1 -0
- package/dist/ui/campaigns/Drawer.d.ts +24 -0
- package/dist/ui/campaigns/Drawer.d.ts.map +1 -0
- package/dist/ui/campaigns/Drawer.js +120 -0
- package/dist/ui/campaigns/Drawer.js.map +1 -0
- package/dist/ui/campaigns/Icons.d.ts +35 -0
- package/dist/ui/campaigns/Icons.d.ts.map +1 -0
- package/dist/ui/campaigns/Icons.js +41 -0
- package/dist/ui/campaigns/Icons.js.map +1 -0
- package/dist/ui/campaigns/Summary.d.ts +21 -0
- package/dist/ui/campaigns/Summary.d.ts.map +1 -0
- package/dist/ui/campaigns/Summary.js +56 -0
- package/dist/ui/campaigns/Summary.js.map +1 -0
- package/dist/ui/campaigns/Thumbnail.d.ts +11 -0
- package/dist/ui/campaigns/Thumbnail.d.ts.map +1 -0
- package/dist/ui/campaigns/Thumbnail.js +23 -0
- package/dist/ui/campaigns/Thumbnail.js.map +1 -0
- package/dist/ui/campaigns/Tree.d.ts +12 -0
- package/dist/ui/campaigns/Tree.d.ts.map +1 -0
- package/dist/ui/campaigns/Tree.js +105 -0
- package/dist/ui/campaigns/Tree.js.map +1 -0
- package/dist/ui/campaigns/glyphs.d.ts +20 -0
- package/dist/ui/campaigns/glyphs.d.ts.map +1 -0
- package/dist/ui/campaigns/glyphs.js +19 -0
- package/dist/ui/campaigns/glyphs.js.map +1 -0
- package/dist/ui/campaigns/index.d.ts +4 -0
- package/dist/ui/campaigns/index.d.ts.map +1 -0
- package/dist/ui/campaigns/index.js +3 -0
- package/dist/ui/campaigns/index.js.map +1 -0
- package/dist/ui/campaigns/labels.d.ts +53 -0
- package/dist/ui/campaigns/labels.d.ts.map +1 -0
- package/dist/ui/campaigns/labels.js +169 -0
- package/dist/ui/campaigns/labels.js.map +1 -0
- package/dist/ui/campaigns/model.d.ts +99 -0
- package/dist/ui/campaigns/model.d.ts.map +1 -0
- package/dist/ui/campaigns/model.js +230 -0
- package/dist/ui/campaigns/model.js.map +1 -0
- package/dist/ui/campaigns/modes.d.ts +18 -0
- package/dist/ui/campaigns/modes.d.ts.map +1 -0
- package/dist/ui/campaigns/modes.js +7 -0
- package/dist/ui/campaigns/modes.js.map +1 -0
- package/dist/ui/index.d.ts +21 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +19 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/integrations/AccountPicker.d.ts +26 -0
- package/dist/ui/integrations/AccountPicker.d.ts.map +1 -0
- package/dist/ui/integrations/AccountPicker.js +97 -0
- package/dist/ui/integrations/AccountPicker.js.map +1 -0
- package/dist/ui/integrations/ClientCards.d.ts +17 -0
- package/dist/ui/integrations/ClientCards.d.ts.map +1 -0
- package/dist/ui/integrations/ClientCards.js +38 -0
- package/dist/ui/integrations/ClientCards.js.map +1 -0
- package/dist/ui/integrations/ClientsTable.d.ts +36 -0
- package/dist/ui/integrations/ClientsTable.d.ts.map +1 -0
- package/dist/ui/integrations/ClientsTable.js +127 -0
- package/dist/ui/integrations/ClientsTable.js.map +1 -0
- package/dist/ui/integrations/Connect.d.ts +29 -0
- package/dist/ui/integrations/Connect.d.ts.map +1 -0
- package/dist/ui/integrations/Connect.js +49 -0
- package/dist/ui/integrations/Connect.js.map +1 -0
- package/dist/ui/integrations/Connection.d.ts +37 -0
- package/dist/ui/integrations/Connection.d.ts.map +1 -0
- package/dist/ui/integrations/Connection.js +94 -0
- package/dist/ui/integrations/Connection.js.map +1 -0
- package/dist/ui/integrations/Dialogs.d.ts +18 -0
- package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
- package/dist/ui/integrations/Dialogs.js +25 -0
- package/dist/ui/integrations/Dialogs.js.map +1 -0
- package/dist/ui/integrations/EventsFeed.d.ts +15 -0
- package/dist/ui/integrations/EventsFeed.d.ts.map +1 -0
- package/dist/ui/integrations/EventsFeed.js +57 -0
- package/dist/ui/integrations/EventsFeed.js.map +1 -0
- package/dist/ui/integrations/EventsSheet.d.ts +28 -0
- package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
- package/dist/ui/integrations/EventsSheet.js +121 -0
- package/dist/ui/integrations/EventsSheet.js.map +1 -0
- package/dist/ui/integrations/Icons.d.ts +36 -0
- package/dist/ui/integrations/Icons.d.ts.map +1 -0
- package/dist/ui/integrations/Icons.js +38 -0
- package/dist/ui/integrations/Icons.js.map +1 -0
- package/dist/ui/integrations/IntegrationsView.d.ts +14 -0
- package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
- package/dist/ui/integrations/IntegrationsView.js +113 -0
- package/dist/ui/integrations/IntegrationsView.js.map +1 -0
- package/dist/ui/integrations/Overlay.d.ts +18 -0
- package/dist/ui/integrations/Overlay.d.ts.map +1 -0
- package/dist/ui/integrations/Overlay.js +36 -0
- package/dist/ui/integrations/Overlay.js.map +1 -0
- package/dist/ui/integrations/RowMenu.d.ts +15 -0
- package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
- package/dist/ui/integrations/RowMenu.js +47 -0
- package/dist/ui/integrations/RowMenu.js.map +1 -0
- package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
- package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
- package/dist/ui/integrations/UnlinkDialog.js +29 -0
- package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
- package/dist/ui/integrations/format.d.ts +28 -0
- package/dist/ui/integrations/format.d.ts.map +1 -0
- package/dist/ui/integrations/format.js +101 -0
- package/dist/ui/integrations/format.js.map +1 -0
- package/dist/ui/integrations/index.d.ts +5 -0
- package/dist/ui/integrations/index.d.ts.map +1 -0
- package/dist/ui/integrations/index.js +3 -0
- package/dist/ui/integrations/index.js.map +1 -0
- package/dist/ui/integrations/model.d.ts +84 -0
- package/dist/ui/integrations/model.d.ts.map +1 -0
- package/dist/ui/integrations/model.js +131 -0
- package/dist/ui/integrations/model.js.map +1 -0
- package/dist/ui/integrations/overlay.d.ts +10 -0
- package/dist/ui/integrations/overlay.d.ts.map +1 -0
- package/dist/ui/integrations/overlay.js +77 -0
- package/dist/ui/integrations/overlay.js.map +1 -0
- package/dist/ui/integrations/parts.d.ts +36 -0
- package/dist/ui/integrations/parts.d.ts.map +1 -0
- package/dist/ui/integrations/parts.js +85 -0
- package/dist/ui/integrations/parts.js.map +1 -0
- package/dist/ui/integrations/types.d.ts +96 -0
- package/dist/ui/integrations/types.d.ts.map +1 -0
- package/dist/ui/integrations/types.js +2 -0
- package/dist/ui/integrations/types.js.map +1 -0
- package/dist/ui/metrics.d.ts +106 -0
- package/dist/ui/metrics.d.ts.map +1 -0
- package/dist/ui/metrics.js +166 -0
- package/dist/ui/metrics.js.map +1 -0
- package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
- package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
- package/dist/ui/portfolio/PortfolioView.js +216 -0
- package/dist/ui/portfolio/PortfolioView.js.map +1 -0
- package/dist/ui/portfolio/SpendChart.d.ts +10 -0
- package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
- package/dist/ui/portfolio/SpendChart.js +196 -0
- package/dist/ui/portfolio/SpendChart.js.map +1 -0
- package/dist/ui/portfolio/alerts.d.ts +74 -0
- package/dist/ui/portfolio/alerts.d.ts.map +1 -0
- package/dist/ui/portfolio/alerts.js +291 -0
- package/dist/ui/portfolio/alerts.js.map +1 -0
- package/dist/ui/portfolio/figures.d.ts +79 -0
- package/dist/ui/portfolio/figures.d.ts.map +1 -0
- package/dist/ui/portfolio/figures.js +103 -0
- package/dist/ui/portfolio/figures.js.map +1 -0
- package/dist/ui/portfolio/format.d.ts +8 -0
- package/dist/ui/portfolio/format.d.ts.map +1 -0
- package/dist/ui/portfolio/format.js +28 -0
- package/dist/ui/portfolio/format.js.map +1 -0
- package/dist/ui/sample.d.ts +474 -0
- package/dist/ui/sample.d.ts.map +1 -0
- package/dist/ui/sample.js +553 -0
- package/dist/ui/sample.js.map +1 -0
- package/dist/ui/seed.d.ts +188 -0
- package/dist/ui/seed.d.ts.map +1 -0
- package/dist/ui/seed.js +563 -0
- package/dist/ui/seed.js.map +1 -0
- package/dist/ui/ui.css +3356 -0
- package/docs/federation.md +46 -1
- package/docs/meta-ads.md +746 -0
- package/docs/upgrading.md +95 -0
- package/llms.txt +3 -0
- package/package.json +15 -3
- package/src/component/_generated/api.ts +14 -0
- package/src/component/_generated/component.ts +323 -1
- package/src/component/_generated/server.ts +4 -0
- package/src/component/constants.ts +10 -0
- package/src/component/convex.config.ts +9 -0
- package/src/component/errors.ts +5 -1
- package/src/component/leads.ts +517 -17
- package/src/component/meta.ts +1461 -0
- package/src/component/metaCapi.ts +921 -0
- package/src/component/metaFake.ts +277 -0
- package/src/component/metaGraph.ts +722 -0
- package/src/component/metaSync.ts +1164 -0
- package/src/component/pipeline.ts +392 -0
- package/src/component/schema.ts +197 -1
- package/src/component/secrets.ts +98 -0
- package/src/component/validators.ts +376 -3
- package/src/tracker/generated.ts +1 -1
- package/src/ui/seed.ts +755 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ConversionsList } from "./Conversions.js";
|
|
3
|
+
import { AdDrawer } from "./Drawer.js";
|
|
4
|
+
import { Icon } from "./Icons.js";
|
|
5
|
+
import { paidFunnel } from "../metrics.js";
|
|
6
|
+
import { adCount, findAd } from "./labels.js";
|
|
7
|
+
import { funnel, indicators, metaLink, moneyFor, organicOrigins, partialSpendNote, salesPerDay, spendMode, } from "./model.js";
|
|
8
|
+
import { CREATIVES_VIEW } from "./modes.js";
|
|
9
|
+
import { FunnelCard, Indicators, MetaStrip, OrganicCard, OriginsCard, } from "./Summary.js";
|
|
10
|
+
import { BandLegend, CampaignTree } from "./Tree.js";
|
|
11
|
+
function Loading() {
|
|
12
|
+
return (_jsxs("div", { className: "rastro-ui rastro-campaigns", role: "status", "aria-busy": "true", "aria-label": "Carregando campanhas", children: [_jsx("div", { className: "rastro-campaigns__kpis", "data-count": 6, children: Array.from({ length: 6 }, (_, index) => (_jsx("div", { className: "rastro-skeleton", style: { height: 104 } }, index))) }), _jsx("div", { className: "rastro-skeleton", style: { height: 150 } }), _jsxs("div", { className: "rastro-campaigns__main", children: [_jsx("div", { className: "rastro-skeleton", style: { height: 420 } }), _jsx("div", { className: "rastro-skeleton", style: { height: 420 } })] })] }));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Campanhas for one client (Direção A): from what Meta spent to the sale on
|
|
16
|
+
* WhatsApp. Six indicators with the change against the previous period, the
|
|
17
|
+
* funnel, the campaign → ad set → ad tree with cost per lead and return, the
|
|
18
|
+
* drawer of the selected ad (its leads and one lead's path) and the sales sent
|
|
19
|
+
* back to Meta. Without Meta spend it is the leads screen it grew from: no
|
|
20
|
+
* empty spend column. With spend in another currency, return is left out.
|
|
21
|
+
*/
|
|
22
|
+
export function CampaignsView(props) {
|
|
23
|
+
const { report, previous, daily, status, conversions, mode, onModeChange, onSelectAd, adLeads, recentLeads, adDaily, selectedLeadId, onSelectLead, journey, now, loading, } = props;
|
|
24
|
+
if (loading || !report)
|
|
25
|
+
return _jsx(Loading, {});
|
|
26
|
+
// A selection the report no longer holds (another site or period) is none.
|
|
27
|
+
const selectedAdId = findAd(report, props.selectedAdId)
|
|
28
|
+
? props.selectedAdId
|
|
29
|
+
: null;
|
|
30
|
+
const spend = spendMode(report);
|
|
31
|
+
const money = moneyFor(report);
|
|
32
|
+
const hasSpend = (paidFunnel(report).row.spendCents ?? 0) > 0;
|
|
33
|
+
if (report.totals.leads === 0 && !hasSpend) {
|
|
34
|
+
return (_jsx("div", { className: "rastro-ui rastro-campaigns", children: _jsxs("div", { className: "rastro-card rastro-empty", children: [_jsx("strong", { children: "Nenhum lead no per\u00EDodo" }), _jsx("span", { children: "Os leads aparecem aqui assim que chegar a primeira conversa do per\u00EDodo. Tente um per\u00EDodo maior." })] }) }));
|
|
35
|
+
}
|
|
36
|
+
const link = status ? metaLink(status, now) : null;
|
|
37
|
+
const Creatives = CREATIVES_VIEW;
|
|
38
|
+
const showCreatives = Creatives !== null && mode === "creatives";
|
|
39
|
+
const hasAds = adCount(report) > 0;
|
|
40
|
+
const partialNote = spend === "none" ? null : partialSpendNote(report);
|
|
41
|
+
// Set by hosts from 0.10 when the period has too many ad rows for spend.
|
|
42
|
+
const spendIncomplete = spend !== "none" && report.spendIncomplete === true;
|
|
43
|
+
return (_jsxs("div", { className: "rastro-ui rastro-campaigns", "data-spend": spend, children: [link && _jsx(MetaStrip, { link: link }), report.currency === null ? (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "alert", size: 16 }), _jsxs("span", { children: ["Os sites vendem em moedas diferentes: a receita \u00E9 uma soma aproximada", spend === "none" ? "." : " e o retorno fica de fora."] })] })) : (spend === "spendOnly" && (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "alert", size: 16 }), _jsxs("span", { children: ["A conta de an\u00FAncios gasta em", " ", report.spendCurrency ?? "outra moeda", " e as vendas est\u00E3o em", " ", report.currency, ". O gasto e o custo por lead aparecem na moeda da conta; o retorno fica de fora at\u00E9 as moedas baterem."] })] }))), partialNote && (_jsxs("div", { className: "rastro-campaigns__notice", role: "note", children: [_jsx(Icon, { name: "info", size: 16 }), _jsx("span", { children: partialNote })] })), _jsx(Indicators, { items: indicators(report, previous), sales: salesPerDay(daily, spend) }), spend === "none" ? (_jsx(OriginsCard, { report: report })) : (_jsxs("div", { className: "rastro-campaigns__overview", children: [_jsx(FunnelCard, { funnel: funnel(report) }), _jsx(OrganicCard, { origins: organicOrigins(report) })] })), _jsxs("div", { className: "rastro-campaigns__main", children: [_jsxs("section", { className: "rastro-card rastro-campaigns__tree", "aria-label": "Campanhas da Meta", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Campanhas da Meta" }), _jsx("p", { className: "rastro-campaigns__desc", children: spend === "none"
|
|
44
|
+
? "Campanha → conjunto → anúncio · leads que chegaram por anúncio"
|
|
45
|
+
: "Campanha → conjunto → anúncio · nomes, imagens e gasto vêm da conta de anúncios" })] }), Creatives && (_jsxs("div", { className: "rastro-campaigns__segmented", role: "group", "aria-label": "Modo", children: [_jsx("button", { type: "button", "aria-pressed": !showCreatives, onClick: () => onModeChange("tree"), children: "\u00C1rvore" }), _jsx("button", { type: "button", "aria-pressed": showCreatives, onClick: () => onModeChange("creatives"), children: "Criativos" })] }))] }), spendIncomplete && (_jsxs("p", { className: "rastro-campaigns__tree-note", role: "note", children: [_jsx(Icon, { name: "info", size: 14 }), "Gasto por an\u00FAncio indispon\u00EDvel neste per\u00EDodo; escolha um per\u00EDodo menor."] })), showCreatives && Creatives ? (_jsx(Creatives, { report: report, adDaily: adDaily, adLeads: adLeads, selectedAdId: selectedAdId, onSelectAd: onSelectAd })) : hasAds ? (_jsxs(_Fragment, { children: [_jsx(CampaignTree, { report: report, mode: spend, money: money, selectedAdId: selectedAdId, onSelectAd: onSelectAd }), spend === "full" && _jsx(BandLegend, {})] })) : (_jsx("div", { className: "rastro-empty", children: _jsx("strong", { children: "Nenhum lead veio de an\u00FAncio no per\u00EDodo" }) })), link && (_jsx(ConversionsList, { report: report, link: link, conversions: conversions, money: money }))] }), !showCreatives && (_jsx(AdDrawer, { report: report, mode: spend, money: money, selectedAdId: selectedAdId, onSelectAd: onSelectAd, leads: selectedAdId ? adLeads?.[selectedAdId] : undefined, recentLeads: recentLeads, daily: selectedAdId ? adDaily?.[selectedAdId] : undefined, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, journey: journey, conversions: conversions, now: now }))] })] }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=CampaignsView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CampaignsView.js","sourceRoot":"","sources":["../../../src/ui/campaigns/CampaignsView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LeadsReport, MetaConversion } from "../../client/index.js";
|
|
2
|
+
import type { MetaLink, Money } from "./model.js";
|
|
3
|
+
/** How many of the newest conversions the list shows. */
|
|
4
|
+
export declare const CONVERSIONS_SHOWN = 5;
|
|
5
|
+
/**
|
|
6
|
+
* "Devolvidas pra Meta": what Rastro sent back to the client's pixel. The
|
|
7
|
+
* header counts every event ever queued (enviadas / na fila / com erro); the
|
|
8
|
+
* list shows the newest ones.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ConversionsList({ report, link, conversions, money, }: {
|
|
11
|
+
report: LeadsReport;
|
|
12
|
+
link: MetaLink;
|
|
13
|
+
conversions: MetaConversion[] | undefined;
|
|
14
|
+
money: Money;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=Conversions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversions.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Conversions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAElD,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAenC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,WAAW,EACX,KAAK,GACN,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,KAAK,CAAC;CACd,+BA4EA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "./Icons.js";
|
|
3
|
+
import { adLabel, dateTimeLabel, findAd, plural } from "./labels.js";
|
|
4
|
+
/** How many of the newest conversions the list shows. */
|
|
5
|
+
export const CONVERSIONS_SHOWN = 5;
|
|
6
|
+
const EVENT_LABELS = {
|
|
7
|
+
Purchase: "Venda",
|
|
8
|
+
QualifiedLead: "Qualificado",
|
|
9
|
+
Schedule: "Agendamento",
|
|
10
|
+
Lead: "Lead",
|
|
11
|
+
};
|
|
12
|
+
const STATUS_LABELS = {
|
|
13
|
+
sent: "enviada",
|
|
14
|
+
pending: "na fila",
|
|
15
|
+
failed: "com erro",
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* "Devolvidas pra Meta": what Rastro sent back to the client's pixel. The
|
|
19
|
+
* header counts every event ever queued (enviadas / na fila / com erro); the
|
|
20
|
+
* list shows the newest ones.
|
|
21
|
+
*/
|
|
22
|
+
export function ConversionsList({ report, link, conversions, money, }) {
|
|
23
|
+
const { sent, pending, failed } = link.conversions;
|
|
24
|
+
return (_jsxs("section", { className: "rastro-campaigns__conversions", "aria-label": "Devolvidas pra Meta", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Devolvidas pra Meta" }), _jsx("p", { className: "rastro-campaigns__desc", children: link.pixel
|
|
25
|
+
? "Cada venda volta pro pixel do cliente como Compra, com o valor, pra Meta otimizar por quem compra"
|
|
26
|
+
: "Configure o pixel do cliente pra devolver as vendas à Meta" })] }), link.pixel && (_jsxs("div", { className: "rastro-campaigns__counts", children: [_jsx("span", { className: "rastro-campaigns__pill", "data-tone": "good", children: plural(sent, "enviada", "enviadas") }), pending > 0 && (_jsxs("span", { className: "rastro-campaigns__pill", children: [pending.toLocaleString("pt-BR"), " na fila"] })), failed > 0 && (_jsxs("span", { className: "rastro-campaigns__pill", "data-tone": "bad", children: [failed.toLocaleString("pt-BR"), " com erro"] }))] }))] }), conversions === undefined && link.pixel ? (_jsx("div", { className: "rastro-skeleton", style: { height: 72 } })) : conversions && conversions.length > 0 ? (_jsx("ul", { className: "rastro-campaigns__conversion-list", children: conversions.slice(0, CONVERSIONS_SHOWN).map((row) => {
|
|
27
|
+
const ad = findAd(report, row.adId);
|
|
28
|
+
const parts = [
|
|
29
|
+
EVENT_LABELS[row.eventName],
|
|
30
|
+
row.leadLabel,
|
|
31
|
+
row.valueCents === null ? null : money.revenue(row.valueCents),
|
|
32
|
+
].filter(Boolean);
|
|
33
|
+
return (_jsxs("li", { "data-status": row.status, children: [_jsx(Icon, { name: row.status === "sent"
|
|
34
|
+
? "check"
|
|
35
|
+
: row.status === "failed"
|
|
36
|
+
? "alert"
|
|
37
|
+
: "clock", size: 14 }), _jsx("span", { className: "rastro-campaigns__conversion-what", children: parts.join(" · ") }), _jsx("span", { className: "rastro-campaigns__conversion-ad", children: ad ? adLabel(ad.ad) : "" }), _jsxs("span", { className: "rastro-campaigns__conversion-when rastro-num", children: [STATUS_LABELS[row.status], " ", dateTimeLabel(row.sentAt ?? row.createdAt)] })] }, row.eventId));
|
|
38
|
+
}) })) : link.pixel ? (_jsx("p", { className: "rastro-muted", children: "Nenhum evento enviado ainda." })) : null] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Conversions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversions.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Conversions.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrE,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,MAAM,YAAY,GAAgD;IAChE,QAAQ,EAAE,OAAO;IACjB,aAAa,EAAE,aAAa;IAC5B,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,aAAa,GAA6C;IAC9D,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,WAAW,EACX,KAAK,GAMN;IACC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;IACnD,OAAO,CACL,mBACE,SAAS,EAAC,+BAA+B,gBAC9B,qBAAqB,aAEhC,kBAAQ,SAAS,EAAC,6BAA6B,aAC7C,0BACE,aAAI,SAAS,EAAC,yBAAyB,oCAAyB,EAChE,YAAG,SAAS,EAAC,wBAAwB,YAClC,IAAI,CAAC,KAAK;oCACT,CAAC,CAAC,mGAAmG;oCACrG,CAAC,CAAC,4DAA4D,GAC9D,IACA,EACL,IAAI,CAAC,KAAK,IAAI,CACb,eAAK,SAAS,EAAC,0BAA0B,aACvC,eAAM,SAAS,EAAC,wBAAwB,eAAW,MAAM,YACtD,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,GAC/B,EACN,OAAO,GAAG,CAAC,IAAI,CACd,gBAAM,SAAS,EAAC,wBAAwB,aACrC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,gBAC3B,CACR,EACA,MAAM,GAAG,CAAC,IAAI,CACb,gBAAM,SAAS,EAAC,wBAAwB,eAAW,KAAK,aACrD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,iBAC1B,CACR,IACG,CACP,IACM,EACR,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACzC,cAAK,SAAS,EAAC,iBAAiB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAI,CAC3D,CAAC,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1C,aAAI,SAAS,EAAC,mCAAmC,YAC9C,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpC,MAAM,KAAK,GAAG;wBACZ,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC3B,GAAG,CAAC,SAAS;wBACb,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;qBAC/D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClB,OAAO,CACL,6BAAmC,GAAG,CAAC,MAAM,aAC3C,KAAC,IAAI,IACH,IAAI,EACF,GAAG,CAAC,MAAM,KAAK,MAAM;oCACnB,CAAC,CAAC,OAAO;oCACT,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ;wCACvB,CAAC,CAAC,OAAO;wCACT,CAAC,CAAC,OAAO,EAEf,IAAI,EAAE,EAAE,GACR,EACF,eAAM,SAAS,EAAC,mCAAmC,YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GACb,EACP,eAAM,SAAS,EAAC,iCAAiC,YAC9C,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GACpB,EACP,gBAAM,SAAS,EAAC,8CAA8C,aAC3D,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAC9B,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,IACtC,KApBA,GAAG,CAAC,OAAO,CAqBf,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,CACN,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,YAAG,SAAS,EAAC,cAAc,6CAAiC,CAC7D,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LeadJourney, LeadsDaily, LeadsReport, LeadSummary, MetaConversion } from "../../client/index.js";
|
|
2
|
+
import type { Money, SpendMode } from "./model.js";
|
|
3
|
+
/** How many of the ad's leads the drawer lists. */
|
|
4
|
+
export declare const DRAWER_LEADS = 6;
|
|
5
|
+
export declare function AdDrawer({ report, mode, money, selectedAdId, onSelectAd, leads, recentLeads, daily, selectedLeadId, onSelectLead, journey, conversions, now, }: {
|
|
6
|
+
report: LeadsReport;
|
|
7
|
+
mode: SpendMode;
|
|
8
|
+
money: Money;
|
|
9
|
+
selectedAdId: string | null;
|
|
10
|
+
onSelectAd: (adId: string | null) => void;
|
|
11
|
+
leads: LeadSummary[] | undefined;
|
|
12
|
+
/** The newest leads of any origin, for the drawer with no ad selected. */
|
|
13
|
+
recentLeads: LeadSummary[] | null | undefined;
|
|
14
|
+
daily: LeadsDaily | undefined;
|
|
15
|
+
selectedLeadId: string | null | undefined;
|
|
16
|
+
onSelectLead?: (lead: {
|
|
17
|
+
siteId: string;
|
|
18
|
+
leadId: string;
|
|
19
|
+
} | null) => void;
|
|
20
|
+
journey: LeadJourney | undefined;
|
|
21
|
+
conversions: MetaConversion[] | undefined;
|
|
22
|
+
now: number;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=Drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Drawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,uBAAuB,CAAC;AAoB/B,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGnD,mDAAmD;AACnD,eAAO,MAAM,YAAY,IAAI,CAAC;AA4O9B,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,EACX,KAAK,EACL,cAAc,EACd,YAAY,EACZ,OAAO,EACP,WAAW,EACX,GAAG,GACJ,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACjC,0EAA0E;IAC1E,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACzE,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC;CACb,+BA6LA"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { formatReturn, returnBand, rowMetrics } from "../metrics.js";
|
|
4
|
+
import { AppGlyph, Icon } from "./Icons.js";
|
|
5
|
+
import { adLabel, AD_ORIGIN, adsetLabel, appLabel, arrivalLabel, campaignLabel, CREATIVE_LABELS, dateTimeLabel, findAd, initials, isLong, journeyStepLabel, originLabel, relativeTime, STAGE_LABELS, } from "./labels.js";
|
|
6
|
+
import { Thumbnail } from "./Thumbnail.js";
|
|
7
|
+
/** How many of the ad's leads the drawer lists. */
|
|
8
|
+
export const DRAWER_LEADS = 6;
|
|
9
|
+
function DailyBars({ daily, money, mode, }) {
|
|
10
|
+
const maxSpend = Math.max(1, ...daily.map((day) => day.spendCents ?? 0));
|
|
11
|
+
const maxWon = Math.max(1, ...daily.map((day) => day.won));
|
|
12
|
+
const sales = daily.reduce((sum, day) => sum + day.won, 0);
|
|
13
|
+
const spend = daily.reduce((sum, day) => sum + (day.spendCents ?? 0), 0);
|
|
14
|
+
// Spend draws only where the screen shows spend (never under hideSpend).
|
|
15
|
+
const hasSpend = mode !== "none" && daily.some((day) => day.spendCents !== null);
|
|
16
|
+
return (_jsxs("figure", { className: "rastro-campaigns__daily", children: [_jsx("div", { className: "rastro-campaigns__daily-plot", role: "img", "aria-label": `${sales} vendas${hasSpend ? ` e ${money.spend(spend)} de gasto` : ""} em ${daily.length} dias`, children: daily.map((day) => (_jsxs("span", { className: "rastro-campaigns__daily-day", children: [hasSpend && (_jsx("i", { "data-layer": "spend", style: {
|
|
17
|
+
height: `${((day.spendCents ?? 0) / maxSpend) * 100}%`,
|
|
18
|
+
} })), _jsx("i", { "data-layer": "won", style: { height: `${(day.won / maxWon) * 100}%` } })] }, day.dayStart))) }), _jsxs("figcaption", { className: "rastro-campaigns__legend", children: [_jsxs("span", { children: [_jsx("i", { "data-layer": "won" }), "vendas por dia"] }), hasSpend && (_jsxs("span", { children: [_jsx("i", { "data-layer": "spend" }), "gasto"] }))] })] }));
|
|
19
|
+
}
|
|
20
|
+
function sentToMeta(lead, conversions) {
|
|
21
|
+
return conversions?.find((row) => row.leadId === lead.leadId &&
|
|
22
|
+
row.eventName === "Purchase" &&
|
|
23
|
+
row.status === "sent");
|
|
24
|
+
}
|
|
25
|
+
function Journey({ lead, journey, conversions, money, }) {
|
|
26
|
+
const name = lead.label ?? "Lead sem nome";
|
|
27
|
+
if (journey === undefined) {
|
|
28
|
+
return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("div", { className: "rastro-skeleton", style: { height: 96 } })] }));
|
|
29
|
+
}
|
|
30
|
+
if (journey === null) {
|
|
31
|
+
return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("p", { className: "rastro-muted", children: "Este lead n\u00E3o est\u00E1 mais dispon\u00EDvel." })] }));
|
|
32
|
+
}
|
|
33
|
+
const sent = sentToMeta(lead, conversions);
|
|
34
|
+
return (_jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["Caminho \u00B7 ", name] }), _jsx("ol", { className: "rastro-campaigns__timeline", children: journey.events.map((event, index) => (_jsxs("li", { children: [_jsxs("span", { className: "rastro-campaigns__timeline-title", children: [event.type === "created" ? (_jsx(AppGlyph, { app: "whatsapp", size: 12 })) : (_jsx(Icon, { name: event.type === "won" ? "check" : "star", size: 12 })), journeyStepLabel(event, journey, money.revenue)] }), _jsxs("span", { className: "rastro-campaigns__timeline-detail", children: [dateTimeLabel(event.at), event.type === "created" &&
|
|
35
|
+
arrivalLabel(journey) &&
|
|
36
|
+
` · ${arrivalLabel(journey)}`, event.type === "won" &&
|
|
37
|
+
sent &&
|
|
38
|
+
" · devolvida pra Meta como Compra"] })] }, `${event.type}-${event.at}-${index}`))) })] }));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The line under a lead's name. A sale shows its value and when it closed
|
|
42
|
+
* ("Venda · R$ 890 · há 2 h"); otherwise where the lead came from and when:
|
|
43
|
+
* the app for an ad's own leads, the ad's name or the entry point for the
|
|
44
|
+
* newest leads of any origin.
|
|
45
|
+
*/
|
|
46
|
+
function leadLine(lead, report, origin, money, now) {
|
|
47
|
+
if (lead.stage === "won") {
|
|
48
|
+
return `Venda · ${money.revenue(lead.revenueCents)} · ${relativeTime(lead.stageAt, now)}`;
|
|
49
|
+
}
|
|
50
|
+
let source;
|
|
51
|
+
if (origin === "app")
|
|
52
|
+
source = appLabel(lead.sourceApp);
|
|
53
|
+
else if (lead.originKey !== AD_ORIGIN)
|
|
54
|
+
source = originLabel(lead.originKey);
|
|
55
|
+
else {
|
|
56
|
+
const found = findAd(report, lead.adId);
|
|
57
|
+
source = found ? adLabel(found.ad) : "Anúncio";
|
|
58
|
+
}
|
|
59
|
+
return [source, relativeTime(lead.firstAt, now)].filter(Boolean).join(" · ");
|
|
60
|
+
}
|
|
61
|
+
function LeadList({ report, leads, selectedLeadId, onSelectLead, money, now, origin, }) {
|
|
62
|
+
const [expanded, setExpanded] = useState(false);
|
|
63
|
+
const shown = expanded ? leads : leads.slice(0, DRAWER_LEADS);
|
|
64
|
+
const hidden = leads.length - shown.length;
|
|
65
|
+
return (_jsxs(_Fragment, { children: [_jsx("ul", { className: "rastro-campaigns__leads", children: shown.map((lead) => {
|
|
66
|
+
const selected = lead.leadId === selectedLeadId;
|
|
67
|
+
return (_jsx("li", { children: _jsxs("button", { type: "button", className: "rastro-campaigns__lead", "aria-pressed": selected, disabled: !onSelectLead, onClick: () => onSelectLead?.(selected
|
|
68
|
+
? null
|
|
69
|
+
: { siteId: lead.siteId, leadId: lead.leadId }), children: [_jsx("span", { className: "rastro-campaigns__avatar", children: initials(lead.label) }), _jsxs("span", { className: "rastro-campaigns__lead-text", children: [_jsx("span", { className: "rastro-campaigns__lead-name", children: lead.label ?? "Lead sem nome" }), _jsxs("span", { className: "rastro-campaigns__lead-meta", children: [_jsx(AppGlyph, { app: lead.sourceApp, size: 11 }), _jsx("span", { className: "rastro-campaigns__clip", children: leadLine(lead, report, origin, money, now) })] })] }), _jsx("span", { className: "rastro-campaigns__pill", "data-stage": lead.stage, children: STAGE_LABELS[lead.stage] })] }) }, lead.leadId));
|
|
70
|
+
}) }), hidden > 0 && (_jsxs("button", { type: "button", className: "rastro-campaigns__more", onClick: () => setExpanded(true), children: ["Ver mais ", hidden.toLocaleString("pt-BR")] }))] }));
|
|
71
|
+
}
|
|
72
|
+
export function AdDrawer({ report, mode, money, selectedAdId, onSelectAd, leads, recentLeads, daily, selectedLeadId, onSelectLead, journey, conversions, now, }) {
|
|
73
|
+
const found = findAd(report, selectedAdId);
|
|
74
|
+
if (!found) {
|
|
75
|
+
if (recentLeads === undefined) {
|
|
76
|
+
return (_jsx("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": "An\u00FAncio", children: _jsxs("div", { className: "rastro-empty", children: [_jsx(Icon, { name: "megaphone", size: 20 }), _jsx("strong", { children: "Escolha um an\u00FAncio" }), _jsx("span", { children: "Toque num an\u00FAncio da tabela pra ver os leads dele e o caminho de cada um at\u00E9 a venda." })] }) }));
|
|
77
|
+
}
|
|
78
|
+
const selectedRecent = recentLeads?.find((lead) => lead.leadId === selectedLeadId);
|
|
79
|
+
return (_jsxs("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": "Leads recentes", children: [_jsx("h3", { className: "rastro-campaigns__drawer-title", children: "Leads recentes" }), _jsx("p", { className: "rastro-campaigns__drawer-meta", children: "Os que chegaram por \u00FAltimo, de qualquer origem. Toque num an\u00FAncio da tabela pra ver s\u00F3 os dele." }), _jsx("div", { className: "rastro-campaigns__section", children: recentLeads === null ? (_jsx("div", { className: "rastro-skeleton", style: { height: 120 } })) : recentLeads.length === 0 ? (_jsx("p", { className: "rastro-muted", children: "Nenhum lead no per\u00EDodo." })) : (_jsx(LeadList, { report: report, leads: recentLeads, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, money: money, now: now, origin: "entry" })) }), selectedRecent && (_jsx(Journey, { lead: selectedRecent, journey: journey, conversions: conversions, money: money }))] }));
|
|
80
|
+
}
|
|
81
|
+
const { ad, campaign, adset } = found;
|
|
82
|
+
const metrics = rowMetrics(ad);
|
|
83
|
+
const kind = ad.creativeType ? CREATIVE_LABELS[ad.creativeType] : null;
|
|
84
|
+
const app = appLabel(ad.sourceApp);
|
|
85
|
+
const selectedLead = leads?.find((lead) => lead.leadId === selectedLeadId);
|
|
86
|
+
const band = returnBand(metrics.returnOnSpend);
|
|
87
|
+
const minis = mode === "none"
|
|
88
|
+
? [
|
|
89
|
+
{ label: "Leads", value: ad.leads.toLocaleString("pt-BR") },
|
|
90
|
+
{ label: "Vendas", value: ad.won.toLocaleString("pt-BR") },
|
|
91
|
+
{ label: "Receita", value: money.revenue(ad.revenueCents) },
|
|
92
|
+
]
|
|
93
|
+
: [
|
|
94
|
+
{
|
|
95
|
+
label: "Custo por lead",
|
|
96
|
+
value: money.spend(metrics.costPerLeadCents),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
label: "Custo por venda",
|
|
100
|
+
value: money.spend(metrics.costPerSaleCents),
|
|
101
|
+
},
|
|
102
|
+
mode === "full"
|
|
103
|
+
? {
|
|
104
|
+
label: "Retorno",
|
|
105
|
+
value: formatReturn(metrics.returnOnSpend),
|
|
106
|
+
band,
|
|
107
|
+
}
|
|
108
|
+
: { label: "Vendas", value: ad.won.toLocaleString("pt-BR") },
|
|
109
|
+
];
|
|
110
|
+
return (_jsxs("aside", { className: "rastro-card rastro-campaigns__drawer", "aria-label": `Anúncio ${adLabel(ad)}`, children: [_jsxs("header", { className: "rastro-campaigns__drawer-head", children: [_jsxs("span", { className: "rastro-campaigns__crumb", children: ["An\u00FAncio \u00B7 ", campaignLabel(campaign), " \u203A ", adsetLabel(adset)] }), _jsx("button", { type: "button", className: "rastro-campaigns__close", "aria-label": "Fechar an\u00FAncio", onClick: () => onSelectAd(null), children: _jsx(Icon, { name: "x", size: 14 }) })] }), _jsx(Thumbnail, { url: ad.thumbnailUrl, type: ad.creativeType, seed: ad.adId, size: "hero" }), _jsx("h3", { className: "rastro-campaigns__drawer-title", children: adLabel(ad) }), _jsxs("p", { className: "rastro-campaigns__drawer-meta", children: [_jsx(AppGlyph, { app: ad.sourceApp, size: 12 }), [
|
|
111
|
+
kind,
|
|
112
|
+
app,
|
|
113
|
+
mode === "none" || ad.spendCents == null
|
|
114
|
+
? null
|
|
115
|
+
: `${money.spend(ad.spendCents)} gastos`,
|
|
116
|
+
]
|
|
117
|
+
.filter(Boolean)
|
|
118
|
+
.join(" · ")] }), ad.sourceUrl && (_jsx("a", { className: "rastro-campaigns__post", href: ad.sourceUrl, target: "_blank", rel: "noreferrer", children: ad.sourceUrl.replace(/^https?:\/\/(www\.)?/, "") })), _jsx("dl", { className: "rastro-campaigns__minis", children: minis.map((mini) => (_jsxs("div", { "data-band": "band" in mini ? (mini.band ?? undefined) : undefined, children: [_jsx("dt", { children: mini.label }), _jsx("dd", { className: "rastro-num", "data-long": isLong(mini.value) ? "true" : undefined, children: mini.value })] }, mini.label))) }), daily && daily.length > 1 && (_jsx(DailyBars, { daily: daily, money: money, mode: mode })), _jsxs("div", { className: "rastro-campaigns__section", children: [_jsxs("h4", { className: "rastro-campaigns__section-title", children: ["\u00DAltimos leads \u00B7 ", ad.leads.toLocaleString("pt-BR"), " no per\u00EDodo"] }), leads === undefined ? (_jsx("div", { className: "rastro-skeleton", style: { height: 120 } })) : leads.length === 0 ? (_jsx("p", { className: "rastro-muted", children: "Nenhum lead deste an\u00FAncio no per\u00EDodo." })) : (_jsx(LeadList, { report: report, leads: leads, selectedLeadId: selectedLeadId, onSelectLead: onSelectLead, money: money, now: now, origin: "app" }, ad.adId))] }), selectedLead && (_jsx(Journey, { lead: selectedLead, journey: journey, conversions: conversions, money: money }))] }));
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Drawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** A brand glyph in its own color, or nothing for an app Rastro does not know. */
|
|
2
|
+
export declare function AppGlyph({ app, size, title, }: {
|
|
3
|
+
app: string | null | undefined;
|
|
4
|
+
size?: number;
|
|
5
|
+
title?: string;
|
|
6
|
+
}): import("react").JSX.Element | null;
|
|
7
|
+
declare const LINES: {
|
|
8
|
+
megaphone: import("react").JSX.Element;
|
|
9
|
+
message: import("react").JSX.Element;
|
|
10
|
+
target: import("react").JSX.Element;
|
|
11
|
+
check: import("react").JSX.Element;
|
|
12
|
+
dollar: import("react").JSX.Element;
|
|
13
|
+
layers: import("react").JSX.Element;
|
|
14
|
+
star: import("react").JSX.Element;
|
|
15
|
+
chevronRight: import("react").JSX.Element;
|
|
16
|
+
chevronDown: import("react").JSX.Element;
|
|
17
|
+
x: import("react").JSX.Element;
|
|
18
|
+
search: import("react").JSX.Element;
|
|
19
|
+
link: import("react").JSX.Element;
|
|
20
|
+
eye: import("react").JSX.Element;
|
|
21
|
+
info: import("react").JSX.Element;
|
|
22
|
+
alert: import("react").JSX.Element;
|
|
23
|
+
clock: import("react").JSX.Element;
|
|
24
|
+
play: import("react").JSX.Element;
|
|
25
|
+
image: import("react").JSX.Element;
|
|
26
|
+
gallery: import("react").JSX.Element;
|
|
27
|
+
};
|
|
28
|
+
export type IconName = keyof typeof LINES;
|
|
29
|
+
export declare function Icon({ name, size, className, }: {
|
|
30
|
+
name: IconName;
|
|
31
|
+
size?: number;
|
|
32
|
+
className?: string;
|
|
33
|
+
}): import("react").JSX.Element;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=Icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icons.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Icons.tsx"],"names":[],"mappings":"AAIA,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,IAAS,EACT,KAAK,GACN,EAAE;IACD,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,sCAkBA;AAID,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;CA+E0B,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAE1C,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAS,EACT,SAAS,GACV,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAqBA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BRAND_GLYPHS } from "./glyphs.js";
|
|
3
|
+
import { appLabel } from "./labels.js";
|
|
4
|
+
/** A brand glyph in its own color, or nothing for an app Rastro does not know. */
|
|
5
|
+
export function AppGlyph({ app, size = 12, title, }) {
|
|
6
|
+
const key = app?.toLowerCase();
|
|
7
|
+
const glyph = key ? BRAND_GLYPHS[key] : undefined;
|
|
8
|
+
if (!glyph)
|
|
9
|
+
return null;
|
|
10
|
+
const label = title ?? appLabel(app) ?? undefined;
|
|
11
|
+
return (_jsx("svg", { className: "rastro-campaigns__glyph", viewBox: "0 0 24 24", width: size, height: size, role: label ? "img" : undefined, "aria-label": label, "aria-hidden": label ? undefined : true, children: _jsx("path", { fill: glyph.hex, d: glyph.path }) }));
|
|
12
|
+
}
|
|
13
|
+
// Line icons in the dashboard's family (lucide strokes), inlined so the
|
|
14
|
+
// package needs no icon library.
|
|
15
|
+
const LINES = {
|
|
16
|
+
megaphone: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m3 11 18-5v12L3 14v-3z" }), _jsx("path", { d: "M11.6 16.8a3 3 0 1 1-5.8-1.6" })] })),
|
|
17
|
+
message: _jsx("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
|
|
18
|
+
target: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("circle", { cx: "12", cy: "12", r: "6" }), _jsx("circle", { cx: "12", cy: "12", r: "2" })] })),
|
|
19
|
+
check: _jsx("path", { d: "M20 6 9 17l-5-5" }),
|
|
20
|
+
dollar: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8M12 18V6" })] })),
|
|
21
|
+
layers: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m12.8 2.2 8.5 3.9a1 1 0 0 1 0 1.8l-8.5 3.9a2 2 0 0 1-1.6 0L2.7 7.9a1 1 0 0 1 0-1.8l8.5-3.9a2 2 0 0 1 1.6 0Z" }), _jsx("path", { d: "m22 17.6-9.2 4.2a2 2 0 0 1-1.6 0L2 17.6M22 12.6l-9.2 4.2a2 2 0 0 1-1.6 0L2 12.6" })] })),
|
|
22
|
+
star: (_jsx("path", { d: "M11.5 2.3a.5.5 0 0 1 1 0l2.3 4.7 5.2.8a.5.5 0 0 1 .3.9l-3.8 3.7.9 5.2a.5.5 0 0 1-.7.5L12 15.7l-4.7 2.4a.5.5 0 0 1-.7-.5l.9-5.2-3.8-3.7a.5.5 0 0 1 .3-.9l5.2-.8z" })),
|
|
23
|
+
chevronRight: _jsx("path", { d: "m9 18 6-6-6-6" }),
|
|
24
|
+
chevronDown: _jsx("path", { d: "m6 9 6 6 6-6" }),
|
|
25
|
+
x: _jsx("path", { d: "M18 6 6 18M6 6l12 12" }),
|
|
26
|
+
search: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] })),
|
|
27
|
+
link: _jsx("path", { d: "M9 17H7A5 5 0 0 1 7 7h2M15 7h2a5 5 0 1 1 0 10h-2M8 12h8" }),
|
|
28
|
+
eye: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z" }), _jsx("circle", { cx: "12", cy: "12", r: "3" })] })),
|
|
29
|
+
info: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 16v-4M12 8h.01" })] })),
|
|
30
|
+
alert: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z" }), _jsx("path", { d: "M12 9v4M12 17h.01" })] })),
|
|
31
|
+
clock: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 6v6l4 2" })] })),
|
|
32
|
+
play: _jsx("polygon", { points: "6 3 20 12 6 21 6 3" }),
|
|
33
|
+
image: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("circle", { cx: "9", cy: "9", r: "2" }), _jsx("path", { d: "m21 15-3.1-3.1a2 2 0 0 0-2.8 0L6 21" })] })),
|
|
34
|
+
gallery: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "2", y: "6", width: "14", height: "14", rx: "2" }), _jsx("path", { d: "M6 2h12a4 4 0 0 1 4 4v12" })] })),
|
|
35
|
+
};
|
|
36
|
+
export function Icon({ name, size = 16, className, }) {
|
|
37
|
+
return (_jsx("svg", { className: className
|
|
38
|
+
? `rastro-campaigns__icon ${className}`
|
|
39
|
+
: "rastro-campaigns__icon", viewBox: "0 0 24 24", width: size, height: size, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: LINES[name] }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=Icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icons.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Icons.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LeadsReport } from "../../client/index.js";
|
|
2
|
+
import type { Funnel, Indicator, MetaLink, OrganicOrigin } from "./model.js";
|
|
3
|
+
export declare function Indicators({ items, sales, }: {
|
|
4
|
+
items: Indicator[];
|
|
5
|
+
sales: number[] | null;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export declare function FunnelCard({ funnel }: {
|
|
8
|
+
funnel: Funnel;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
export declare function OrganicCard({ origins }: {
|
|
11
|
+
origins: OrganicOrigin[];
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
/** Today's origin bar, for a host without Meta spend. */
|
|
14
|
+
export declare function OriginsCard({ report }: {
|
|
15
|
+
report: LeadsReport;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
/** The Meta link and the conversions it sent back, above the figures. */
|
|
18
|
+
export declare function MetaStrip({ link }: {
|
|
19
|
+
link: MetaLink;
|
|
20
|
+
}): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=Summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Summary.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Summary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgC7E,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACxB,+BA+CA;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAsDxD;AASD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,+BAyCpE;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,+BAoC9D;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,+BAyBrD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "./Icons.js";
|
|
3
|
+
import { isLong, originLabel, plural } from "./labels.js";
|
|
4
|
+
const INDICATOR_ICONS = {
|
|
5
|
+
spend: "megaphone",
|
|
6
|
+
leads: "message",
|
|
7
|
+
costPerLead: "target",
|
|
8
|
+
qualified: "star",
|
|
9
|
+
won: "check",
|
|
10
|
+
revenue: "dollar",
|
|
11
|
+
return: "layers",
|
|
12
|
+
};
|
|
13
|
+
/** A tiny line of daily values, drawn to fit its box. */
|
|
14
|
+
function Sparkline({ values, label }) {
|
|
15
|
+
const max = Math.max(1, ...values);
|
|
16
|
+
const step = 100 / Math.max(1, values.length - 1);
|
|
17
|
+
const points = values
|
|
18
|
+
.map((value, index) => `${index * step},${28 - (value / max) * 24}`)
|
|
19
|
+
.join(" ");
|
|
20
|
+
return (_jsx("svg", { className: "rastro-campaigns__spark", viewBox: "0 0 100 30", preserveAspectRatio: "none", role: "img", "aria-label": label, children: _jsx("polyline", { points: points, fill: "none", vectorEffect: "non-scaling-stroke" }) }));
|
|
21
|
+
}
|
|
22
|
+
export function Indicators({ items, sales, }) {
|
|
23
|
+
return (_jsx("section", { className: "rastro-campaigns__kpis", "data-count": items.length, "aria-label": "Indicadores das campanhas", children: items.map((item) => (_jsxs("div", { className: "rastro-card rastro-campaigns__kpi", "data-highlight": item.highlight ? "true" : undefined, children: [_jsxs("div", { className: "rastro-campaigns__kpi-head", children: [_jsx("span", { className: "rastro-campaigns__kpi-label", children: item.label }), _jsx("span", { className: "rastro-campaigns__kpi-icon", children: _jsx(Icon, { name: INDICATOR_ICONS[item.key], size: 14 }) })] }), _jsx("div", { className: "rastro-campaigns__kpi-value rastro-num", "data-long": isLong(item.value) ? "true" : undefined, children: item.value }), _jsx("div", { className: "rastro-campaigns__kpi-foot", children: item.change ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "rastro-change rastro-campaigns__change", "data-trend": item.trend ?? undefined, children: item.change }), " ", _jsx("span", { children: "vs. per\u00EDodo anterior" })] })) : (_jsx("span", { children: item.detail ?? " " })) }), item.key === "won" && sales && (_jsx(Sparkline, { values: sales, label: "Vendas por dia no per\u00EDodo" }))] }, item.key))) }));
|
|
24
|
+
}
|
|
25
|
+
export function FunnelCard({ funnel }) {
|
|
26
|
+
return (_jsxs("section", { className: "rastro-card rastro-campaigns__funnel", "aria-label": "Do gasto \u00E0 venda", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Do gasto \u00E0 venda" }), _jsx("p", { className: "rastro-campaigns__desc", children: "Leads que chegaram por an\u00FAncio da Meta" })] }), funnel.costPerSale && (_jsx("span", { className: "rastro-campaigns__aside rastro-num", children: funnel.costPerSale }))] }), _jsx("ol", { className: "rastro-campaigns__funnel-steps", children: funnel.steps.map((step, index) => {
|
|
27
|
+
const link = funnel.links[index];
|
|
28
|
+
return (_jsxs("li", { className: "rastro-campaigns__funnel-item", children: [_jsxs("div", { className: "rastro-campaigns__funnel-step", "data-step": step.key, children: [_jsx("span", { className: "rastro-campaigns__funnel-bar" }), _jsx("span", { className: "rastro-campaigns__funnel-label", children: step.label }), _jsx("span", { className: "rastro-campaigns__funnel-value rastro-num", "data-long": isLong(step.value) ? "true" : undefined, children: step.value }), _jsx("span", { className: "rastro-campaigns__funnel-detail", children: step.detail })] }), link && (_jsxs("div", { className: "rastro-campaigns__funnel-link", children: [_jsx("b", { className: "rastro-num", children: link.value }), _jsx("span", { children: link.label })] }))] }, step.key));
|
|
29
|
+
}) })] }));
|
|
30
|
+
}
|
|
31
|
+
const ORGANIC_ICONS = {
|
|
32
|
+
global_search_new_chat: "search",
|
|
33
|
+
click_to_chat_link: "link",
|
|
34
|
+
message_short_link: "link",
|
|
35
|
+
status: "eye",
|
|
36
|
+
};
|
|
37
|
+
export function OrganicCard({ origins }) {
|
|
38
|
+
const total = origins.reduce((sum, origin) => sum + origin.leads, 0);
|
|
39
|
+
const max = Math.max(1, ...origins.map((origin) => origin.leads));
|
|
40
|
+
return (_jsxs("section", { className: "rastro-card rastro-campaigns__organic", "aria-label": "Sem an\u00FAncio", children: [_jsxs("header", { className: "rastro-campaigns__card-head", children: [_jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "Sem an\u00FAncio" }), _jsx("p", { className: "rastro-campaigns__desc", children: total > 0
|
|
41
|
+
? `${plural(total, "lead", "leads")} · fora do custo por lead`
|
|
42
|
+
: "Nenhum lead orgânico no período" })] }), _jsx("span", { className: "rastro-campaigns__pill", "data-tone": "outline", children: "org\u00E2nico" })] }), origins.length > 0 && (_jsx("ul", { className: "rastro-campaigns__organic-list", children: origins.map((origin) => (_jsxs("li", { children: [_jsx(Icon, { name: ORGANIC_ICONS[origin.key] ?? "message", size: 14 }), _jsx("span", { className: "rastro-campaigns__organic-name", children: originLabel(origin.key) }), _jsx("span", { className: "rastro-campaigns__organic-track", children: _jsx("i", { style: { width: `${(origin.leads / max) * 100}%` } }) }), _jsx("b", { className: "rastro-num", children: origin.leads.toLocaleString("pt-BR") })] }, origin.key))) }))] }));
|
|
43
|
+
}
|
|
44
|
+
/** Today's origin bar, for a host without Meta spend. */
|
|
45
|
+
export function OriginsCard({ report }) {
|
|
46
|
+
const total = report.totals.leads;
|
|
47
|
+
return (_jsxs("section", { className: "rastro-card rastro-campaigns__origins", "aria-label": "De onde v\u00EAm os leads", children: [_jsx("header", { className: "rastro-campaigns__card-head", children: _jsxs("div", { children: [_jsx("h3", { className: "rastro-campaigns__title", children: "De onde v\u00EAm os leads" }), _jsx("p", { className: "rastro-campaigns__desc", children: "Porta de entrada da primeira mensagem no WhatsApp" })] }) }), _jsx("div", { className: "rastro-campaigns__origins-bar", children: report.origins.map((origin, index) => (_jsx("i", { "data-shade": Math.min(index, 4), style: {
|
|
48
|
+
width: `${total > 0 ? (origin.leads / total) * 100 : 0}%`,
|
|
49
|
+
} }, origin.key))) }), _jsx("ul", { className: "rastro-campaigns__origins-legend", children: report.origins.map((origin, index) => (_jsxs("li", { children: [_jsx("i", { "data-shade": Math.min(index, 4) }), originLabel(origin.key), " \u00B7 ", origin.leads.toLocaleString("pt-BR")] }, origin.key))) })] }));
|
|
50
|
+
}
|
|
51
|
+
/** The Meta link and the conversions it sent back, above the figures. */
|
|
52
|
+
export function MetaStrip({ link }) {
|
|
53
|
+
const { sent, pending, failed } = link.conversions;
|
|
54
|
+
return (_jsxs("div", { className: "rastro-campaigns__strip", role: "group", "aria-label": "Conex\u00E3o com a Meta", children: [_jsxs("span", { className: "rastro-campaigns__chip", "data-state": link.state, children: [_jsx("i", { className: "rastro-campaigns__dot" }), link.label] }), link.pixel && (_jsxs("span", { className: "rastro-campaigns__chip", "data-state": failed > 0 ? "error" : "live", children: [_jsx(Icon, { name: failed > 0 ? "alert" : "check", size: 14 }), plural(sent, "evento devolvido", "eventos devolvidos"), " pra Meta", pending > 0 && ` · ${pending.toLocaleString("pt-BR")} na fila`, failed > 0 && ` · ${failed.toLocaleString("pt-BR")} com erro`] }))] }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=Summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Summary.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Summary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ad's creative: the thumbnail Rastro copied from Meta, or a tinted
|
|
3
|
+
* placeholder with the creative's kind until the catalog brings one.
|
|
4
|
+
*/
|
|
5
|
+
export declare function Thumbnail({ url, type, seed, size, }: {
|
|
6
|
+
url?: string | null;
|
|
7
|
+
type?: string | null;
|
|
8
|
+
seed: string;
|
|
9
|
+
size: "row" | "hero";
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=Thumbnail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Thumbnail.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Thumbnail.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,GACL,EAAE;IACD,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACtB,+BA+BA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "./Icons.js";
|
|
3
|
+
/** A stable hue per ad, so a placeholder keeps its color between renders. */
|
|
4
|
+
function hueOf(seed) {
|
|
5
|
+
let hash = 0;
|
|
6
|
+
for (const char of seed)
|
|
7
|
+
hash = (hash * 31 + char.charCodeAt(0)) >>> 0;
|
|
8
|
+
return hash % 360;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The ad's creative: the thumbnail Rastro copied from Meta, or a tinted
|
|
12
|
+
* placeholder with the creative's kind until the catalog brings one.
|
|
13
|
+
*/
|
|
14
|
+
export function Thumbnail({ url, type, seed, size, }) {
|
|
15
|
+
const hue = hueOf(seed);
|
|
16
|
+
const video = type === "video";
|
|
17
|
+
return (_jsxs("span", { className: "rastro-campaigns__thumb", "data-size": size, "data-placeholder": url ? undefined : "true", style: url
|
|
18
|
+
? undefined
|
|
19
|
+
: {
|
|
20
|
+
background: `linear-gradient(145deg, oklch(0.8 0.08 ${hue}), oklch(0.56 0.12 ${(hue + 25) % 360}))`,
|
|
21
|
+
}, "aria-hidden": "true", children: [url && _jsx("img", { src: url, alt: "", loading: "lazy" }), video && (_jsx("span", { className: "rastro-campaigns__play", children: _jsx(Icon, { name: "play", size: size === "hero" ? 22 : 10 }) })), !url && type === "carousel" && size === "hero" && (_jsx(Icon, { name: "gallery", size: 22 })), !url && type === "image" && size === "hero" && (_jsx(Icon, { name: "image", size: 22 }))] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=Thumbnail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Thumbnail.js","sourceRoot":"","sources":["../../../src/ui/campaigns/Thumbnail.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,6EAA6E;AAC7E,SAAS,KAAK,CAAC,IAAY;IACzB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,IAAI;QAAE,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,IAAI,GAAG,GAAG,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,GAML;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC;IAC/B,OAAO,CACL,gBACE,SAAS,EAAC,yBAAyB,eACxB,IAAI,sBACG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAC1C,KAAK,EACH,GAAG;YACD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,UAAU,EAAE,0CAA0C,GAAG,sBAAsB,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI;aACpG,iBAEK,MAAM,aAEjB,GAAG,IAAI,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAC,EAAE,EAAC,OAAO,EAAC,MAAM,GAAG,EAC9C,KAAK,IAAI,CACR,eAAM,SAAS,EAAC,wBAAwB,YACtC,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAI,GAChD,CACR,EACA,CAAC,GAAG,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,CACjD,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAE,EAAE,GAAI,CAClC,EACA,CAAC,GAAG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,CAC9C,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,EAAE,GAAI,CAChC,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LeadsReport } from "../../client/index.js";
|
|
2
|
+
import type { Money, SpendMode } from "./model.js";
|
|
3
|
+
export declare function CampaignTree({ report, mode, money, selectedAdId, onSelectAd, }: {
|
|
4
|
+
report: LeadsReport;
|
|
5
|
+
mode: SpendMode;
|
|
6
|
+
money: Money;
|
|
7
|
+
selectedAdId: string | null;
|
|
8
|
+
onSelectAd: (adId: string | null) => void;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
/** What the return colors mean, under the table, from `RETURN_BANDS`. */
|
|
11
|
+
export declare function BandLegend(): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=Tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/Tree.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAsBzD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqKnD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,GACX,EAAE;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C,+BAiMA;AAID,yEAAyE;AACzE,wBAAgB,UAAU,gCAyBzB"}
|