@iann29/rastro 0.9.0 → 0.10.1
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 +642 -8
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +391 -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 +278 -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 +358 -0
- package/dist/component/meta.d.ts.map +1 -0
- package/dist/component/meta.js +1295 -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 +99 -0
- package/dist/component/pipeline.d.ts.map +1 -0
- package/dist/component/pipeline.js +337 -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 +20 -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 +101 -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 +42 -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 +143 -0
- package/dist/ui/integrations/ClientsTable.js.map +1 -0
- package/dist/ui/integrations/Connect.d.ts +35 -0
- package/dist/ui/integrations/Connect.d.ts.map +1 -0
- package/dist/ui/integrations/Connect.js +62 -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 +108 -0
- package/dist/ui/integrations/Connection.js.map +1 -0
- package/dist/ui/integrations/Dialogs.d.ts +21 -0
- package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
- package/dist/ui/integrations/Dialogs.js +34 -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 +61 -0
- package/dist/ui/integrations/EventsFeed.js.map +1 -0
- package/dist/ui/integrations/EventsSheet.d.ts +34 -0
- package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
- package/dist/ui/integrations/EventsSheet.js +136 -0
- package/dist/ui/integrations/EventsSheet.js.map +1 -0
- package/dist/ui/integrations/Icons.d.ts +38 -0
- package/dist/ui/integrations/Icons.d.ts.map +1 -0
- package/dist/ui/integrations/Icons.js +40 -0
- package/dist/ui/integrations/Icons.js.map +1 -0
- package/dist/ui/integrations/IntegrationsView.d.ts +15 -0
- package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
- package/dist/ui/integrations/IntegrationsView.js +141 -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/Partner.d.ts +14 -0
- package/dist/ui/integrations/Partner.d.ts.map +1 -0
- package/dist/ui/integrations/Partner.js +38 -0
- package/dist/ui/integrations/Partner.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/audience.d.ts +12 -0
- package/dist/ui/integrations/audience.d.ts.map +1 -0
- package/dist/ui/integrations/audience.js +12 -0
- package/dist/ui/integrations/audience.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/modal.d.ts +10 -0
- package/dist/ui/integrations/modal.d.ts.map +1 -0
- package/dist/ui/integrations/modal.js +77 -0
- package/dist/ui/integrations/modal.js.map +1 -0
- package/dist/ui/integrations/model.d.ts +99 -0
- package/dist/ui/integrations/model.d.ts.map +1 -0
- package/dist/ui/integrations/model.js +164 -0
- package/dist/ui/integrations/model.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 +146 -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 +536 -0
- package/dist/ui/sample.d.ts.map +1 -0
- package/dist/ui/sample.js +574 -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 +3424 -0
- package/docs/federation.md +46 -1
- package/docs/meta-ads.md +795 -0
- package/docs/upgrading.md +116 -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 +324 -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 +1525 -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 +410 -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,230 @@
|
|
|
1
|
+
import { change, formatMoney, formatReturn, formatShare, paidFunnel, returnChange, rowMetrics, } from "../metrics.js";
|
|
2
|
+
import { AD_ORIGIN, adCount, plural, relativeTime } from "./labels.js";
|
|
3
|
+
/**
|
|
4
|
+
* "none" without known spend. "spendOnly" when spend and revenue are not in
|
|
5
|
+
* one currency (the ad account differs, or the sites sell in several), so a
|
|
6
|
+
* return would divide one currency by another. "full" otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export function spendMode(report) {
|
|
9
|
+
if (paidFunnel(report).row.spendCents === null)
|
|
10
|
+
return "none";
|
|
11
|
+
return report.currencyMismatch || report.currency === null
|
|
12
|
+
? "spendOnly"
|
|
13
|
+
: "full";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The row the indicators read in `mode`: every lead without spend, the paid
|
|
17
|
+
* funnel with it. Both periods read the current period's mode, so a change
|
|
18
|
+
* never compares paid leads against every lead.
|
|
19
|
+
*/
|
|
20
|
+
export function headlineRow(report, mode) {
|
|
21
|
+
if (mode === "none")
|
|
22
|
+
return { ...report.totals, spendCents: null };
|
|
23
|
+
return paidFunnel(report).row;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The note for a report where some site bought ads with no known spend:
|
|
27
|
+
* those leads stay out of spend, cost per lead and return.
|
|
28
|
+
*/
|
|
29
|
+
export function partialSpendNote(report) {
|
|
30
|
+
const { partial, sitesWithoutSpend } = paidFunnel(report);
|
|
31
|
+
if (!partial)
|
|
32
|
+
return null;
|
|
33
|
+
return `${plural(sitesWithoutSpend.length, "site", "sites")} com anúncios sem dados da Meta ${sitesWithoutSpend.length === 1 ? "fica" : "ficam"} fora do gasto, do custo por lead e do retorno.`;
|
|
34
|
+
}
|
|
35
|
+
/** An amount with no known currency: "4.200" or "13,46", never "R$". */
|
|
36
|
+
function plainAmount(cents) {
|
|
37
|
+
if (cents === null || cents === undefined || !Number.isFinite(cents)) {
|
|
38
|
+
return "—";
|
|
39
|
+
}
|
|
40
|
+
const digits = cents % 100 === 0 ? 0 : 2;
|
|
41
|
+
return (cents / 100).toLocaleString("pt-BR", {
|
|
42
|
+
minimumFractionDigits: digits,
|
|
43
|
+
maximumFractionDigits: digits,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function moneyFor(report) {
|
|
47
|
+
const currency = report.currency ?? "BRL";
|
|
48
|
+
const spendCurrency = report.spendCurrency ?? paidFunnel(report).spendCurrency;
|
|
49
|
+
return {
|
|
50
|
+
revenue: (cents) => formatMoney(cents, currency),
|
|
51
|
+
spend: (cents) => spendCurrency ? formatMoney(cents, spendCurrency) : plainAmount(cents),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function trendOf(relative, higherIsBetter) {
|
|
55
|
+
if (relative === null || relative === 0)
|
|
56
|
+
return null;
|
|
57
|
+
return relative > 0 === higherIsBetter ? "good" : "bad";
|
|
58
|
+
}
|
|
59
|
+
function relativeIndicator(key, label, value, current, previous, higherIsBetter) {
|
|
60
|
+
const delta = change(current, previous);
|
|
61
|
+
return {
|
|
62
|
+
key,
|
|
63
|
+
label,
|
|
64
|
+
value,
|
|
65
|
+
change: delta.label,
|
|
66
|
+
trend: higherIsBetter === null ? null : trendOf(delta.relative, higherIsBetter),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The indicator row. With spend: Gasto, Leads, Custo por lead, Vendas,
|
|
71
|
+
* Receita, Retorno (Retorno drops when the currencies differ). Without it:
|
|
72
|
+
* today's four, Leads, Qualificados, Vendas, Receita.
|
|
73
|
+
*/
|
|
74
|
+
export function indicators(report, previous) {
|
|
75
|
+
const mode = spendMode(report);
|
|
76
|
+
const money = moneyFor(report);
|
|
77
|
+
const now = headlineRow(report, mode);
|
|
78
|
+
const before = previous ? headlineRow(previous, mode) : undefined;
|
|
79
|
+
if (mode === "none") {
|
|
80
|
+
const items = [
|
|
81
|
+
relativeIndicator("leads", "Leads", now.leads.toLocaleString("pt-BR"), now.leads, before?.leads, true),
|
|
82
|
+
relativeIndicator("qualified", "Qualificados", now.qualified.toLocaleString("pt-BR"), now.qualified, before?.qualified, true),
|
|
83
|
+
relativeIndicator("won", "Vendas", now.won.toLocaleString("pt-BR"), now.won, before?.won, true),
|
|
84
|
+
relativeIndicator("revenue", "Receita", money.revenue(now.revenueCents), now.revenueCents, before?.revenueCents, true),
|
|
85
|
+
];
|
|
86
|
+
items[1].detail = `${formatShare(now.qualified, now.leads)} dos leads`;
|
|
87
|
+
items[2].detail = `${formatShare(now.won, now.qualified)} dos qualificados`;
|
|
88
|
+
items[3].detail =
|
|
89
|
+
now.won > 0
|
|
90
|
+
? `${money.revenue(Math.round(now.revenueCents / now.won))} por venda`
|
|
91
|
+
: "Nenhuma venda ainda";
|
|
92
|
+
return items;
|
|
93
|
+
}
|
|
94
|
+
const metricsNow = rowMetrics(now);
|
|
95
|
+
const metricsBefore = before ? rowMetrics(before) : undefined;
|
|
96
|
+
const items = [
|
|
97
|
+
relativeIndicator("spend", "Gasto", money.spend(now.spendCents), now.spendCents ?? null, before?.spendCents, null),
|
|
98
|
+
relativeIndicator("leads", "Leads", now.leads.toLocaleString("pt-BR"), now.leads, before?.leads, true),
|
|
99
|
+
relativeIndicator("costPerLead", "Custo por lead", money.spend(metricsNow.costPerLeadCents), metricsNow.costPerLeadCents, metricsBefore?.costPerLeadCents, false),
|
|
100
|
+
relativeIndicator("won", "Vendas", now.won.toLocaleString("pt-BR"), now.won, before?.won, true),
|
|
101
|
+
relativeIndicator("revenue", "Receita", money.revenue(now.revenueCents), now.revenueCents, before?.revenueCents, true),
|
|
102
|
+
];
|
|
103
|
+
if (mode === "full") {
|
|
104
|
+
const previousReturn = metricsBefore?.returnOnSpend ?? null;
|
|
105
|
+
const delta = returnChange(metricsNow.returnOnSpend, previousReturn);
|
|
106
|
+
const current = metricsNow.returnOnSpend;
|
|
107
|
+
items.push({
|
|
108
|
+
key: "return",
|
|
109
|
+
label: "Retorno",
|
|
110
|
+
value: formatReturn(current),
|
|
111
|
+
change: delta,
|
|
112
|
+
trend: current === null || previousReturn === null
|
|
113
|
+
? null
|
|
114
|
+
: trendOf(current - previousReturn, true),
|
|
115
|
+
highlight: true,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return items;
|
|
119
|
+
}
|
|
120
|
+
/** Gasto → Leads → Qualificados → Vendas, for the leads spend bought. */
|
|
121
|
+
export function funnel(report) {
|
|
122
|
+
const money = moneyFor(report);
|
|
123
|
+
const { row } = paidFunnel(report);
|
|
124
|
+
const metrics = rowMetrics(row);
|
|
125
|
+
const campaigns = report.campaigns.filter((row) => row.campaignId !== null);
|
|
126
|
+
return {
|
|
127
|
+
steps: [
|
|
128
|
+
{
|
|
129
|
+
key: "spend",
|
|
130
|
+
label: "Gasto",
|
|
131
|
+
value: money.spend(row.spendCents),
|
|
132
|
+
detail: campaigns.length
|
|
133
|
+
? plural(campaigns.length, "campanha", "campanhas")
|
|
134
|
+
: plural(adCount(report), "anúncio", "anúncios"),
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: "leads",
|
|
138
|
+
label: "Leads",
|
|
139
|
+
value: row.leads.toLocaleString("pt-BR"),
|
|
140
|
+
detail: "no WhatsApp",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
key: "qualified",
|
|
144
|
+
label: "Qualificados",
|
|
145
|
+
value: row.qualified.toLocaleString("pt-BR"),
|
|
146
|
+
detail: "no atendimento",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
key: "won",
|
|
150
|
+
label: "Vendas",
|
|
151
|
+
value: row.won.toLocaleString("pt-BR"),
|
|
152
|
+
detail: row.won > 0
|
|
153
|
+
? `${money.revenue(Math.round(row.revenueCents / row.won))} por venda`
|
|
154
|
+
: "nenhuma ainda",
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
links: [
|
|
158
|
+
{ value: money.spend(metrics.costPerLeadCents), label: "por lead" },
|
|
159
|
+
{ value: formatShare(row.qualified, row.leads), label: "qualificam" },
|
|
160
|
+
{ value: formatShare(row.won, row.qualified), label: "compram" },
|
|
161
|
+
],
|
|
162
|
+
costPerSale: metrics.costPerSaleCents === null
|
|
163
|
+
? null
|
|
164
|
+
: `${money.spend(metrics.costPerSaleCents)} por venda`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** The origins no ad paid for, most leads first. */
|
|
168
|
+
export function organicOrigins(report) {
|
|
169
|
+
return report.origins
|
|
170
|
+
.filter((row) => row.key !== AD_ORIGIN && row.leads > 0)
|
|
171
|
+
.map((row) => ({ key: row.key, leads: row.leads }))
|
|
172
|
+
.sort((left, right) => right.leads - left.leads);
|
|
173
|
+
}
|
|
174
|
+
/** One line for the Meta link of the sites on screen. */
|
|
175
|
+
export function metaLink(status, now) {
|
|
176
|
+
const accounts = status.flatMap((site) => site.adAccounts);
|
|
177
|
+
const conversions = status.reduce((sum, site) => ({
|
|
178
|
+
pending: sum.pending + site.conversions.pending,
|
|
179
|
+
sent: sum.sent + site.conversions.sent,
|
|
180
|
+
failed: sum.failed + site.conversions.failed,
|
|
181
|
+
}), { pending: 0, sent: 0, failed: 0 });
|
|
182
|
+
const pixel = status.some((site) => site.pixel.enabled);
|
|
183
|
+
if (!status.some((site) => site.linked) || accounts.length === 0) {
|
|
184
|
+
return {
|
|
185
|
+
state: "unlinked",
|
|
186
|
+
label: "Meta não conectada",
|
|
187
|
+
conversions,
|
|
188
|
+
pixel,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (accounts.some((account) => account.syncState === "error")) {
|
|
192
|
+
return {
|
|
193
|
+
state: "error",
|
|
194
|
+
label: "Meta com erro na sincronização",
|
|
195
|
+
conversions,
|
|
196
|
+
pixel,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (accounts.some((account) => account.syncState === "backfill")) {
|
|
200
|
+
return {
|
|
201
|
+
state: "syncing",
|
|
202
|
+
label: "Meta conectada · importando os últimos 90 dias",
|
|
203
|
+
conversions,
|
|
204
|
+
pixel,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const synced = accounts
|
|
208
|
+
.map((account) => account.lastSyncAt)
|
|
209
|
+
.filter((at) => at !== null);
|
|
210
|
+
// The oldest account is what the screen can vouch for.
|
|
211
|
+
const oldest = synced.length ? Math.min(...synced) : null;
|
|
212
|
+
return {
|
|
213
|
+
state: "live",
|
|
214
|
+
label: oldest === null
|
|
215
|
+
? "Meta conectada"
|
|
216
|
+
: `Meta conectada · atualizado ${relativeTime(oldest, now)}`,
|
|
217
|
+
conversions,
|
|
218
|
+
pixel,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Sales per day for the line on the Vendas indicator. The daily series only
|
|
223
|
+
* counts ad leads, so it draws only when the card does too (with spend).
|
|
224
|
+
*/
|
|
225
|
+
export function salesPerDay(daily, mode) {
|
|
226
|
+
if (mode === "none" || !daily || daily.length < 2)
|
|
227
|
+
return null;
|
|
228
|
+
return daily.map((day) => day.won);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/ui/campaigns/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { LeadsDaily, LeadsReport, LeadSummary } from "../../client/index.js";
|
|
3
|
+
export type CampaignsMode = "tree" | "creatives";
|
|
4
|
+
/** What the Criativos mode receives (contract §3, `CreativesView`). */
|
|
5
|
+
export interface CreativesModeProps {
|
|
6
|
+
report: LeadsReport;
|
|
7
|
+
adDaily?: Record<string, LeadsDaily>;
|
|
8
|
+
adLeads?: Record<string, LeadSummary[]>;
|
|
9
|
+
selectedAdId: string | null;
|
|
10
|
+
onSelectAd: (adId: string | null) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The Criativos mode's view. Null until `CreativesView` ships (wave 2): while
|
|
14
|
+
* it is null the Árvore / Criativos toggle stays hidden and "creatives" draws
|
|
15
|
+
* the tree. Wave 2 points this at `../creatives/CreativesView.js`.
|
|
16
|
+
*/
|
|
17
|
+
export declare const CREATIVES_VIEW: ComponentType<CreativesModeProps> | null;
|
|
18
|
+
//# sourceMappingURL=modes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/ui/campaigns/modes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjD,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,IAAW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Criativos mode's view. Null until `CreativesView` ships (wave 2): while
|
|
3
|
+
* it is null the Árvore / Criativos toggle stays hidden and "creatives" draws
|
|
4
|
+
* the tree. Wave 2 points this at `../creatives/CreativesView.js`.
|
|
5
|
+
*/
|
|
6
|
+
export const CREATIVES_VIEW = null;
|
|
7
|
+
//# sourceMappingURL=modes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/ui/campaigns/modes.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAA6C,IAAI,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@iann29/rastro/ui`: the screens Rastro draws for leads and Meta campaigns,
|
|
3
|
+
* shared by the Rastro dashboard and the hosts that embed them. Components are
|
|
4
|
+
* pure (reports in through props, choices out through callbacks, no Convex
|
|
5
|
+
* call), so a host decides who may see what and passes the data it fetched.
|
|
6
|
+
* Style them with `@iann29/rastro/ui.css` and the `--rastro-*` variables;
|
|
7
|
+
* sample data for previews and tests lives in `@iann29/rastro/ui/sample`.
|
|
8
|
+
*/
|
|
9
|
+
export { change, formatMoney, formatReturn, formatShare, paidFunnel, RETURN_BAND_LABELS, RETURN_BANDS, returnBand, returnChange, rowMetrics, } from "./metrics.js";
|
|
10
|
+
export type { Change, FunnelRow, PaidFunnel, PaidFunnelReport, ReturnBand, RowMetrics, SitePaidRow, } from "./metrics.js";
|
|
11
|
+
export { CampaignsView, campaignsFunnel, campaignsIndicators, metaLink, organicOrigins, spendMode, } from "./campaigns/index.js";
|
|
12
|
+
export type { CampaignsMode, CampaignsViewProps, CreativesModeProps, Funnel, Indicator, MetaLink, SpendMode, } from "./campaigns/index.js";
|
|
13
|
+
export { PortfolioView } from "./portfolio/PortfolioView.js";
|
|
14
|
+
export type { PortfolioViewProps } from "./portfolio/PortfolioView.js";
|
|
15
|
+
export { clientInsight, PORTFOLIO_RULES, portfolioAlerts, } from "./portfolio/alerts.js";
|
|
16
|
+
export type { PortfolioAlert, PortfolioInsight, PortfolioTone, } from "./portfolio/alerts.js";
|
|
17
|
+
export { portfolioFigures } from "./portfolio/figures.js";
|
|
18
|
+
export type { ClientFigures, PortfolioFigures, PortfolioSite, } from "./portfolio/figures.js";
|
|
19
|
+
export { clientRows, eventMapCopyTargets, IntegrationsBadge, IntegrationsView, integrationsHeadline, suggestedAccount, } from "./integrations/index.js";
|
|
20
|
+
export type { ClientRow, ClientState, EventMap, EventMapChoice, EventMapColumn, IntegrationConversion, IntegrationsAudience, IntegrationsBusy, IntegrationSite, IntegrationsPartner, IntegrationStatus, IntegrationsViewProps, MetaColumnEvent, MetaConnection, MetaConnectionAdAccount, MetaEventName, MetaPixel, MetaPixelSource, PixelChoice, SentCounts, SetEventMapInput, UnlinkPreview, } from "./integrations/index.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,MAAM,EACN,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,SAAS,GACV,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,yBAAyB,CAAC"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@iann29/rastro/ui`: the screens Rastro draws for leads and Meta campaigns,
|
|
3
|
+
* shared by the Rastro dashboard and the hosts that embed them. Components are
|
|
4
|
+
* pure (reports in through props, choices out through callbacks, no Convex
|
|
5
|
+
* call), so a host decides who may see what and passes the data it fetched.
|
|
6
|
+
* Style them with `@iann29/rastro/ui.css` and the `--rastro-*` variables;
|
|
7
|
+
* sample data for previews and tests lives in `@iann29/rastro/ui/sample`.
|
|
8
|
+
*/
|
|
9
|
+
export { change, formatMoney, formatReturn, formatShare, paidFunnel, RETURN_BAND_LABELS, RETURN_BANDS, returnBand, returnChange, rowMetrics, } from "./metrics.js";
|
|
10
|
+
// Campanhas (Direção A), wave 1.
|
|
11
|
+
export { CampaignsView, campaignsFunnel, campaignsIndicators, metaLink, organicOrigins, spendMode, } from "./campaigns/index.js";
|
|
12
|
+
// PortfolioView (B): the agency home, every client from spend to sale.
|
|
13
|
+
export { PortfolioView } from "./portfolio/PortfolioView.js";
|
|
14
|
+
export { clientInsight, PORTFOLIO_RULES, portfolioAlerts, } from "./portfolio/alerts.js";
|
|
15
|
+
export { portfolioFigures } from "./portfolio/figures.js";
|
|
16
|
+
// Integrações (wave 3): the agency's Meta login, each client's ad account and
|
|
17
|
+
// pixel, and which board columns go back to Meta as events; with
|
|
18
|
+
// `audience="business"`, one company connecting its own Meta.
|
|
19
|
+
export { clientRows, eventMapCopyTargets, IntegrationsBadge, IntegrationsView, integrationsHeadline, suggestedAccount, } from "./integrations/index.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AAWtB,iCAAiC;AACjC,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,sBAAsB,CAAC;AAW9B,uEAAuE;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,8EAA8E;AAC9E,iEAAiE;AACjE,8DAA8D;AAC9D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MetaConnection } from "./types.js";
|
|
2
|
+
type Account = MetaConnection["adAccounts"][number];
|
|
3
|
+
/**
|
|
4
|
+
* The ad account a client gets, from the accounts Meta released. An account
|
|
5
|
+
* that already feeds another client is shown but locked (one account per
|
|
6
|
+
* client); the one whose name matches comes first.
|
|
7
|
+
*/
|
|
8
|
+
export declare function AccountPicker({ siteId, siteName, accounts, siteNames, accountOwners, suggestion, value, disabled, tone, onPick, onChooseAssets, onOpenChange, }: {
|
|
9
|
+
siteId: string;
|
|
10
|
+
siteName: string;
|
|
11
|
+
accounts: readonly Account[];
|
|
12
|
+
siteNames: ReadonlyMap<string, string>;
|
|
13
|
+
/** Accounts another owner of their site linked ("uze.ai"), by id. */
|
|
14
|
+
accountOwners?: ReadonlyMap<string, string>;
|
|
15
|
+
suggestion: string | null;
|
|
16
|
+
/** A staged choice (the phone's "Ligar" button confirms it). */
|
|
17
|
+
value?: string | null;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
tone?: "placeholder" | "chosen";
|
|
20
|
+
onPick: (adAccountId: string) => void;
|
|
21
|
+
onChooseAssets?: () => void;
|
|
22
|
+
/** The row being linked lights up while its list is open. */
|
|
23
|
+
onOpenChange?: (open: boolean) => void;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=AccountPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountPicker.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/AccountPicker.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,KAAK,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AASpD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,KAAK,EACL,QAAQ,EACR,IAAoB,EACpB,MAAM,EACN,cAAc,EACd,YAAY,GACb,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qEAAqE;IACrE,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAC;IAChC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC,+BAiMA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useRef, useState } from "react";
|
|
3
|
+
import { useBusiness } from "./audience.js";
|
|
4
|
+
import { accountShort } from "./format.js";
|
|
5
|
+
import { Icon } from "./Icons.js";
|
|
6
|
+
import { useDismiss } from "./modal.js";
|
|
7
|
+
/**
|
|
8
|
+
* The ad account a client gets, from the accounts Meta released. An account
|
|
9
|
+
* that already feeds another client is shown but locked (one account per
|
|
10
|
+
* client); the one whose name matches comes first.
|
|
11
|
+
*/
|
|
12
|
+
export function AccountPicker({ siteId, siteName, accounts, siteNames, accountOwners, suggestion, value, disabled, tone = "placeholder", onPick, onChooseAssets, onOpenChange, }) {
|
|
13
|
+
const id = useId();
|
|
14
|
+
const business = useBusiness();
|
|
15
|
+
const [open, setOpenState] = useState(false);
|
|
16
|
+
const setOpen = (next) => {
|
|
17
|
+
setOpenState(next);
|
|
18
|
+
onOpenChange?.(next);
|
|
19
|
+
};
|
|
20
|
+
const [active, setActive] = useState(0);
|
|
21
|
+
const trigger = useRef(null);
|
|
22
|
+
const panel = useRef(null);
|
|
23
|
+
useDismiss(open, [trigger, panel], () => setOpen(false));
|
|
24
|
+
const options = accounts
|
|
25
|
+
.map((account) => {
|
|
26
|
+
const owner = account.linkedSiteId && account.linkedSiteId !== siteId
|
|
27
|
+
? (siteNames.get(account.linkedSiteId) ?? null)
|
|
28
|
+
: null;
|
|
29
|
+
const elsewhere = account.linkedOutsideScope ||
|
|
30
|
+
(account.linkedSiteId !== null &&
|
|
31
|
+
account.linkedSiteId !== siteId &&
|
|
32
|
+
owner === null);
|
|
33
|
+
return {
|
|
34
|
+
account,
|
|
35
|
+
taken: owner !== null || elsewhere,
|
|
36
|
+
note: owner
|
|
37
|
+
? accountOwners?.get(account.adAccountId)
|
|
38
|
+
? `Já é da ${owner} (pelo ${accountOwners.get(account.adAccountId)})`
|
|
39
|
+
: `Já é da ${owner}`
|
|
40
|
+
: elsewhere
|
|
41
|
+
? business
|
|
42
|
+
? "Já ligada a outra empresa"
|
|
43
|
+
: "Já ligada a outro cliente"
|
|
44
|
+
: account.adAccountId === suggestion
|
|
45
|
+
? "Sugerida pelo nome"
|
|
46
|
+
: null,
|
|
47
|
+
};
|
|
48
|
+
})
|
|
49
|
+
.sort((left, right) => Number(right.account.adAccountId === suggestion) -
|
|
50
|
+
Number(left.account.adAccountId === suggestion));
|
|
51
|
+
const chosen = accounts.find((account) => account.adAccountId === value);
|
|
52
|
+
const firstFree = () => Math.max(0, options.findIndex((option) => !option.taken));
|
|
53
|
+
const show = () => {
|
|
54
|
+
setActive(firstFree());
|
|
55
|
+
setOpen(true);
|
|
56
|
+
};
|
|
57
|
+
const move = (step) => {
|
|
58
|
+
if (options.length === 0)
|
|
59
|
+
return;
|
|
60
|
+
let next = active;
|
|
61
|
+
for (let tries = 0; tries < options.length; tries += 1) {
|
|
62
|
+
next = (next + step + options.length) % options.length;
|
|
63
|
+
if (!options[next].taken)
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
setActive(next);
|
|
67
|
+
};
|
|
68
|
+
const pick = (option) => {
|
|
69
|
+
if (!option || option.taken)
|
|
70
|
+
return;
|
|
71
|
+
setOpen(false);
|
|
72
|
+
trigger.current?.focus();
|
|
73
|
+
onPick(option.account.adAccountId);
|
|
74
|
+
};
|
|
75
|
+
const onKeyDown = (event) => {
|
|
76
|
+
if (!open) {
|
|
77
|
+
if (["ArrowDown", "ArrowUp", "Enter", " "].includes(event.key)) {
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
show();
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (event.key === "ArrowDown") {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
move(1);
|
|
86
|
+
}
|
|
87
|
+
else if (event.key === "ArrowUp") {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
move(-1);
|
|
90
|
+
}
|
|
91
|
+
else if (event.key === "Enter" || event.key === " ") {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
pick(options[active]);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
return (_jsxs("div", { className: "rastro-integrations__picker", children: [_jsxs("button", { ref: trigger, type: "button", className: "rastro-integrations__select-btn", "data-tone": chosen ? "chosen" : tone, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? `${id}-list` : undefined, "aria-activedescendant": open ? `${id}-${active}` : undefined, "aria-label": `Conta de anúncio de ${siteName}`, disabled: disabled, onClick: () => (open ? setOpen(false) : show()), onKeyDown: onKeyDown, children: [_jsx("span", { className: "rastro-integrations__grow", children: chosen ? (_jsxs(_Fragment, { children: [_jsx("b", { children: chosen.name }), " ", _jsx("span", { className: "rastro-integrations__mono", children: accountShort(chosen.adAccountId) })] })) : ("Escolher conta de anúncio") }), _jsx(Icon, { name: "chevronDown", size: 14 })] }), open && (_jsxs("div", { ref: panel, className: "rastro-integrations__card rastro-integrations__popover", children: [_jsx("p", { className: "rastro-integrations__sec", id: `${id}-label`, children: "Contas que a Meta liberou" }), _jsx("ul", { id: `${id}-list`, role: "listbox", "aria-labelledby": `${id}-label`, className: "rastro-integrations__options", children: options.map((option, index) => (_jsxs("li", { id: `${id}-${index}`, role: "option", "aria-selected": index === active, "aria-disabled": option.taken || undefined, "data-suggested": option.account.adAccountId === suggestion ? "" : undefined, "data-active": index === active ? "" : undefined, className: "rastro-integrations__option", onPointerDown: (event) => event.preventDefault(), onMouseEnter: () => !option.taken && setActive(index), onClick: () => pick(option), children: [_jsxs("span", { className: "rastro-integrations__grow", children: [_jsx("span", { className: "rastro-integrations__option-name", children: option.account.name }), _jsx("span", { className: "rastro-integrations__mono rastro-integrations__meta", children: option.account.adAccountId })] }), option.note && (_jsxs("span", { className: "rastro-integrations__meta", children: [option.taken && _jsx(Icon, { name: "lock", size: 12 }), option.note] }))] }, option.account.adAccountId))) }), options.length === 0 && (_jsx("p", { className: "rastro-integrations__meta", children: "A Meta n\u00E3o liberou nenhuma conta para este login." })), onChooseAssets && (_jsxs(_Fragment, { children: [_jsx("hr", { className: "rastro-integrations__divider" }), _jsxs("button", { type: "button", className: "rastro-integrations__link rastro-integrations__meta", onClick: () => {
|
|
97
|
+
setOpen(false);
|
|
98
|
+
onChooseAssets();
|
|
99
|
+
}, children: [_jsx(Icon, { name: "info", size: 12 }), " Falta uma conta? Escolher contas e pixels na Meta"] })] }))] }))] }));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=AccountPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountPicker.js","sourceRoot":"","sources":["../../../src/ui/integrations/AccountPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ClientActions } from "./ClientsTable.js";
|
|
2
|
+
import type { ClientRow } from "./model.js";
|
|
3
|
+
import type { MetaConnection } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* M1/M3: under 640px each client is a card. A client without an account
|
|
6
|
+
* shows the picker with the account its name suggests; the sticky button
|
|
7
|
+
* below the list confirms it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ClientCards({ rows, connection, staged, onStage, actions, now, }: {
|
|
10
|
+
rows: readonly ClientRow[];
|
|
11
|
+
connection: MetaConnection | null;
|
|
12
|
+
staged: Readonly<Record<string, string | null>>;
|
|
13
|
+
onStage: (siteId: string, adAccountId: string) => void;
|
|
14
|
+
actions: ClientActions;
|
|
15
|
+
now: number;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=ClientCards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientCards.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/ClientCards.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,+BAqFA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AccountPicker } from "./AccountPicker.js";
|
|
3
|
+
import { useBusiness } from "./audience.js";
|
|
4
|
+
import { GrantFix, ownersOf, rowMenuItems, } from "./ClientsTable.js";
|
|
5
|
+
import { RowMenu } from "./RowMenu.js";
|
|
6
|
+
import { Icon } from "./Icons.js";
|
|
7
|
+
import { Avatar, Pill, sentSummary, StateChip, TestModeNote } from "./parts.js";
|
|
8
|
+
function Sends({ row, refused }) {
|
|
9
|
+
if (row.state === "offline")
|
|
10
|
+
return null;
|
|
11
|
+
if (refused)
|
|
12
|
+
return row.state === "stopped" && row.pending > 0 ? (_jsxs(Pill, { tone: "warn", icon: "clock", children: [row.pending, " na fila"] })) : null;
|
|
13
|
+
if (!row.pixel)
|
|
14
|
+
return _jsx(Pill, { tone: "ghost", children: "sem pixel" });
|
|
15
|
+
const summary = sentSummary(row, { compact: true });
|
|
16
|
+
return (_jsxs(_Fragment, { children: [summary && (_jsx(Pill, { tone: "ok", icon: "send", children: summary })), row.testMode && _jsx(TestModeNote, { variant: "line" })] }));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* M1/M3: under 640px each client is a card. A client without an account
|
|
20
|
+
* shows the picker with the account its name suggests; the sticky button
|
|
21
|
+
* below the list confirms it.
|
|
22
|
+
*/
|
|
23
|
+
export function ClientCards({ rows, connection, staged, onStage, actions, now, }) {
|
|
24
|
+
const business = useBusiness();
|
|
25
|
+
const refused = connection?.status === "invalid";
|
|
26
|
+
const siteNames = new Map(rows.map((row) => [row.site.siteId, row.site.name]));
|
|
27
|
+
return (_jsx("ul", { className: "rastro-integrations__cards", "aria-label": business ? "Sua conta de anúncio" : "Clientes", children: rows.map((row, slot) => {
|
|
28
|
+
const picking = connection !== null && !refused && row.state === "unlinked";
|
|
29
|
+
const choice = staged[row.site.siteId] ?? null;
|
|
30
|
+
const line = row.account
|
|
31
|
+
? row.account.adAccountId
|
|
32
|
+
: row.state === "planB"
|
|
33
|
+
? business
|
|
34
|
+
? "pixel + token próprio"
|
|
35
|
+
: "pixel + token do cliente"
|
|
36
|
+
: null;
|
|
37
|
+
return (_jsxs("li", { className: "rastro-integrations__card rastro-integrations__phone-card", "data-focus": picking ? "" : undefined, children: [_jsxs("div", { className: "rastro-integrations__client", children: [_jsx(Avatar, { name: row.site.name, slot: slot, size: "sm" }), _jsxs("div", { className: "rastro-integrations__client-name", children: [_jsx("strong", { children: row.site.name }), line ? (_jsx("span", { className: "rastro-integrations__meta rastro-integrations__mono", children: line })) : (_jsx("span", { className: "rastro-integrations__meta", children: picking && choice
|
|
38
|
+
? "sem conta · sugerimos pelo nome"
|
|
39
|
+
: "sem conta de anúncio" }))] }), _jsx(RowMenu, { label: `Ações de ${row.site.name}`, items: rowMenuItems(row, connection, actions) }), !picking && row.state !== "offline" && (_jsx("button", { type: "button", className: "rastro-integrations__icon-btn", "aria-label": `Eventos de ${row.site.name}`, onClick: () => actions.onOpenEvents(row.site.siteId), children: _jsx(Icon, { name: "chevronRight" }) }))] }), picking ? (_jsx(AccountPicker, { siteId: row.site.siteId, siteName: row.site.name, accounts: connection.adAccounts, siteNames: siteNames, accountOwners: ownersOf(rows), suggestion: choice, value: choice, tone: "chosen", disabled: !actions.permitted, onPick: (adAccountId) => onStage(row.site.siteId, adAccountId), onChooseAssets: actions.onChooseAssets })) : (_jsxs("div", { className: "rastro-integrations__pills", children: [_jsx(StateChip, { row: row, now: now, compact: true }), _jsx(GrantFix, { row: row, actions: actions }), _jsx(Sends, { row: row, refused: refused })] }))] }, row.site.siteId));
|
|
40
|
+
}) }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ClientCards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientCards.js","sourceRoot":"","sources":["../../../src/ui/integrations/ClientCards.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type ClientRow } from "./model.js";
|
|
2
|
+
import { type MenuItem } from "./RowMenu.js";
|
|
3
|
+
import type { MetaConnection } from "./types.js";
|
|
4
|
+
export type ClientsFilter = "all" | "attention";
|
|
5
|
+
export interface ClientActions {
|
|
6
|
+
permitted: boolean;
|
|
7
|
+
onPick: (siteId: string, adAccountId: string) => void;
|
|
8
|
+
onOpenEvents: (siteId: string) => void;
|
|
9
|
+
onUnlink: (siteId: string) => void;
|
|
10
|
+
onPlanB: (siteId: string) => void;
|
|
11
|
+
onSetPixel: (siteId: string, pixelId: string) => void;
|
|
12
|
+
onChooseAssets: () => void;
|
|
13
|
+
}
|
|
14
|
+
/** "Escolher contas e pixels": the way back for what the login stopped releasing. */
|
|
15
|
+
export declare function GrantFix({ row, actions, }: {
|
|
16
|
+
row: ClientRow;
|
|
17
|
+
actions: ClientActions;
|
|
18
|
+
}): import("react").JSX.Element | null;
|
|
19
|
+
/** Accounts another owner of their site linked, by id: "uze.ai". */
|
|
20
|
+
export declare const ownersOf: (rows: readonly ClientRow[]) => Map<string, string>;
|
|
21
|
+
/** The client's other actions, the same on the table and the phone. */
|
|
22
|
+
export declare function rowMenuItems(row: ClientRow, connection: MetaConnection | null, actions: ClientActions): MenuItem[];
|
|
23
|
+
/** "Ligado pelo uze.ai": what another owner of the site linked. */
|
|
24
|
+
export declare const OwnerNote: ({ owner }: {
|
|
25
|
+
owner: string | null;
|
|
26
|
+
}) => import("react").JSX.Element | null;
|
|
27
|
+
/** The Clientes card: B1 (waiting for Meta), B3 (linked) and B4 (stopped). */
|
|
28
|
+
export declare function ClientsTable({ rows, connection, filter, onFilter, actions, now, }: {
|
|
29
|
+
rows: readonly ClientRow[];
|
|
30
|
+
connection: MetaConnection | null;
|
|
31
|
+
filter: ClientsFilter;
|
|
32
|
+
onFilter: (filter: ClientsFilter) => void;
|
|
33
|
+
actions: ClientActions;
|
|
34
|
+
now: number;
|
|
35
|
+
}): import("react").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=ClientsTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientsTable.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/ClientsTable.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,OAAO,GACR,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;CACxB,sCAYA;AAED,oEAAoE;AACpE,eAAO,MAAM,QAAQ,SAAU,SAAS,SAAS,EAAE,wBAOhD,CAAC;AAEJ,uEAAuE;AACvE,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,cAAc,GAAG,IAAI,EACjC,OAAO,EAAE,aAAa,GACrB,QAAQ,EAAE,CAuBZ;AAmBD,mEAAmE;AACnE,eAAO,MAAM,SAAS,cAAe;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,uCAKnD,CAAC;AAqQX,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,OAAO,EACP,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,+BAwIA"}
|