@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.
Files changed (257) hide show
  1. package/README.md +9 -1
  2. package/agent/integration.md +23 -1
  3. package/agent/manifest.json +4 -4
  4. package/dist/client/federation.d.ts +114 -9
  5. package/dist/client/federation.d.ts.map +1 -1
  6. package/dist/client/federation.js +54 -2
  7. package/dist/client/federation.js.map +1 -1
  8. package/dist/client/index.d.ts +637 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +385 -9
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/component/_generated/api.d.ts +14 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -1
  14. package/dist/component/_generated/api.js.map +1 -1
  15. package/dist/component/_generated/component.d.ts +277 -1
  16. package/dist/component/_generated/component.d.ts.map +1 -1
  17. package/dist/component/_generated/server.d.ts +4 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -1
  19. package/dist/component/_generated/server.js.map +1 -1
  20. package/dist/component/constants.d.ts +5 -0
  21. package/dist/component/constants.d.ts.map +1 -1
  22. package/dist/component/constants.js +10 -0
  23. package/dist/component/constants.js.map +1 -1
  24. package/dist/component/convex.config.d.ts +4 -0
  25. package/dist/component/convex.config.js +9 -0
  26. package/dist/component/convex.config.js.map +1 -1
  27. package/dist/component/errors.d.ts +1 -1
  28. package/dist/component/errors.d.ts.map +1 -1
  29. package/dist/component/errors.js.map +1 -1
  30. package/dist/component/leads.d.ts +69 -3
  31. package/dist/component/leads.d.ts.map +1 -1
  32. package/dist/component/leads.js +419 -16
  33. package/dist/component/leads.js.map +1 -1
  34. package/dist/component/meta.d.ts +352 -0
  35. package/dist/component/meta.d.ts.map +1 -0
  36. package/dist/component/meta.js +1239 -0
  37. package/dist/component/meta.js.map +1 -0
  38. package/dist/component/metaCapi.d.ts +162 -0
  39. package/dist/component/metaCapi.d.ts.map +1 -0
  40. package/dist/component/metaCapi.js +754 -0
  41. package/dist/component/metaCapi.js.map +1 -0
  42. package/dist/component/metaFake.d.ts +5 -0
  43. package/dist/component/metaFake.d.ts.map +1 -0
  44. package/dist/component/metaFake.js +225 -0
  45. package/dist/component/metaFake.js.map +1 -0
  46. package/dist/component/metaGraph.d.ts +165 -0
  47. package/dist/component/metaGraph.d.ts.map +1 -0
  48. package/dist/component/metaGraph.js +507 -0
  49. package/dist/component/metaGraph.js.map +1 -0
  50. package/dist/component/metaSync.d.ts +186 -0
  51. package/dist/component/metaSync.d.ts.map +1 -0
  52. package/dist/component/metaSync.js +961 -0
  53. package/dist/component/metaSync.js.map +1 -0
  54. package/dist/component/pipeline.d.ts +98 -0
  55. package/dist/component/pipeline.d.ts.map +1 -0
  56. package/dist/component/pipeline.js +324 -0
  57. package/dist/component/pipeline.js.map +1 -0
  58. package/dist/component/schema.d.ts +404 -2
  59. package/dist/component/schema.d.ts.map +1 -1
  60. package/dist/component/schema.js +168 -2
  61. package/dist/component/schema.js.map +1 -1
  62. package/dist/component/secrets.d.ts +15 -0
  63. package/dist/component/secrets.d.ts.map +1 -0
  64. package/dist/component/secrets.js +67 -0
  65. package/dist/component/secrets.js.map +1 -0
  66. package/dist/component/validators.d.ts +1052 -15
  67. package/dist/component/validators.d.ts.map +1 -1
  68. package/dist/component/validators.js +307 -3
  69. package/dist/component/validators.js.map +1 -1
  70. package/dist/tracker/generated.d.ts +1 -1
  71. package/dist/tracker/generated.d.ts.map +1 -1
  72. package/dist/tracker/generated.js +1 -1
  73. package/dist/tracker/generated.js.map +1 -1
  74. package/dist/ui/campaigns/CampaignsView.d.ts +48 -0
  75. package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -0
  76. package/dist/ui/campaigns/CampaignsView.js +47 -0
  77. package/dist/ui/campaigns/CampaignsView.js.map +1 -0
  78. package/dist/ui/campaigns/Conversions.d.ts +16 -0
  79. package/dist/ui/campaigns/Conversions.d.ts.map +1 -0
  80. package/dist/ui/campaigns/Conversions.js +40 -0
  81. package/dist/ui/campaigns/Conversions.js.map +1 -0
  82. package/dist/ui/campaigns/Drawer.d.ts +24 -0
  83. package/dist/ui/campaigns/Drawer.d.ts.map +1 -0
  84. package/dist/ui/campaigns/Drawer.js +120 -0
  85. package/dist/ui/campaigns/Drawer.js.map +1 -0
  86. package/dist/ui/campaigns/Icons.d.ts +35 -0
  87. package/dist/ui/campaigns/Icons.d.ts.map +1 -0
  88. package/dist/ui/campaigns/Icons.js +41 -0
  89. package/dist/ui/campaigns/Icons.js.map +1 -0
  90. package/dist/ui/campaigns/Summary.d.ts +21 -0
  91. package/dist/ui/campaigns/Summary.d.ts.map +1 -0
  92. package/dist/ui/campaigns/Summary.js +56 -0
  93. package/dist/ui/campaigns/Summary.js.map +1 -0
  94. package/dist/ui/campaigns/Thumbnail.d.ts +11 -0
  95. package/dist/ui/campaigns/Thumbnail.d.ts.map +1 -0
  96. package/dist/ui/campaigns/Thumbnail.js +23 -0
  97. package/dist/ui/campaigns/Thumbnail.js.map +1 -0
  98. package/dist/ui/campaigns/Tree.d.ts +12 -0
  99. package/dist/ui/campaigns/Tree.d.ts.map +1 -0
  100. package/dist/ui/campaigns/Tree.js +105 -0
  101. package/dist/ui/campaigns/Tree.js.map +1 -0
  102. package/dist/ui/campaigns/glyphs.d.ts +20 -0
  103. package/dist/ui/campaigns/glyphs.d.ts.map +1 -0
  104. package/dist/ui/campaigns/glyphs.js +19 -0
  105. package/dist/ui/campaigns/glyphs.js.map +1 -0
  106. package/dist/ui/campaigns/index.d.ts +4 -0
  107. package/dist/ui/campaigns/index.d.ts.map +1 -0
  108. package/dist/ui/campaigns/index.js +3 -0
  109. package/dist/ui/campaigns/index.js.map +1 -0
  110. package/dist/ui/campaigns/labels.d.ts +53 -0
  111. package/dist/ui/campaigns/labels.d.ts.map +1 -0
  112. package/dist/ui/campaigns/labels.js +169 -0
  113. package/dist/ui/campaigns/labels.js.map +1 -0
  114. package/dist/ui/campaigns/model.d.ts +99 -0
  115. package/dist/ui/campaigns/model.d.ts.map +1 -0
  116. package/dist/ui/campaigns/model.js +230 -0
  117. package/dist/ui/campaigns/model.js.map +1 -0
  118. package/dist/ui/campaigns/modes.d.ts +18 -0
  119. package/dist/ui/campaigns/modes.d.ts.map +1 -0
  120. package/dist/ui/campaigns/modes.js +7 -0
  121. package/dist/ui/campaigns/modes.js.map +1 -0
  122. package/dist/ui/index.d.ts +21 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +19 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/integrations/AccountPicker.d.ts +26 -0
  127. package/dist/ui/integrations/AccountPicker.d.ts.map +1 -0
  128. package/dist/ui/integrations/AccountPicker.js +97 -0
  129. package/dist/ui/integrations/AccountPicker.js.map +1 -0
  130. package/dist/ui/integrations/ClientCards.d.ts +17 -0
  131. package/dist/ui/integrations/ClientCards.d.ts.map +1 -0
  132. package/dist/ui/integrations/ClientCards.js +38 -0
  133. package/dist/ui/integrations/ClientCards.js.map +1 -0
  134. package/dist/ui/integrations/ClientsTable.d.ts +36 -0
  135. package/dist/ui/integrations/ClientsTable.d.ts.map +1 -0
  136. package/dist/ui/integrations/ClientsTable.js +127 -0
  137. package/dist/ui/integrations/ClientsTable.js.map +1 -0
  138. package/dist/ui/integrations/Connect.d.ts +29 -0
  139. package/dist/ui/integrations/Connect.d.ts.map +1 -0
  140. package/dist/ui/integrations/Connect.js +49 -0
  141. package/dist/ui/integrations/Connect.js.map +1 -0
  142. package/dist/ui/integrations/Connection.d.ts +37 -0
  143. package/dist/ui/integrations/Connection.d.ts.map +1 -0
  144. package/dist/ui/integrations/Connection.js +94 -0
  145. package/dist/ui/integrations/Connection.js.map +1 -0
  146. package/dist/ui/integrations/Dialogs.d.ts +18 -0
  147. package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
  148. package/dist/ui/integrations/Dialogs.js +25 -0
  149. package/dist/ui/integrations/Dialogs.js.map +1 -0
  150. package/dist/ui/integrations/EventsFeed.d.ts +15 -0
  151. package/dist/ui/integrations/EventsFeed.d.ts.map +1 -0
  152. package/dist/ui/integrations/EventsFeed.js +57 -0
  153. package/dist/ui/integrations/EventsFeed.js.map +1 -0
  154. package/dist/ui/integrations/EventsSheet.d.ts +28 -0
  155. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
  156. package/dist/ui/integrations/EventsSheet.js +121 -0
  157. package/dist/ui/integrations/EventsSheet.js.map +1 -0
  158. package/dist/ui/integrations/Icons.d.ts +36 -0
  159. package/dist/ui/integrations/Icons.d.ts.map +1 -0
  160. package/dist/ui/integrations/Icons.js +38 -0
  161. package/dist/ui/integrations/Icons.js.map +1 -0
  162. package/dist/ui/integrations/IntegrationsView.d.ts +14 -0
  163. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
  164. package/dist/ui/integrations/IntegrationsView.js +113 -0
  165. package/dist/ui/integrations/IntegrationsView.js.map +1 -0
  166. package/dist/ui/integrations/Overlay.d.ts +18 -0
  167. package/dist/ui/integrations/Overlay.d.ts.map +1 -0
  168. package/dist/ui/integrations/Overlay.js +36 -0
  169. package/dist/ui/integrations/Overlay.js.map +1 -0
  170. package/dist/ui/integrations/RowMenu.d.ts +15 -0
  171. package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
  172. package/dist/ui/integrations/RowMenu.js +47 -0
  173. package/dist/ui/integrations/RowMenu.js.map +1 -0
  174. package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
  175. package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
  176. package/dist/ui/integrations/UnlinkDialog.js +29 -0
  177. package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
  178. package/dist/ui/integrations/format.d.ts +28 -0
  179. package/dist/ui/integrations/format.d.ts.map +1 -0
  180. package/dist/ui/integrations/format.js +101 -0
  181. package/dist/ui/integrations/format.js.map +1 -0
  182. package/dist/ui/integrations/index.d.ts +5 -0
  183. package/dist/ui/integrations/index.d.ts.map +1 -0
  184. package/dist/ui/integrations/index.js +3 -0
  185. package/dist/ui/integrations/index.js.map +1 -0
  186. package/dist/ui/integrations/model.d.ts +84 -0
  187. package/dist/ui/integrations/model.d.ts.map +1 -0
  188. package/dist/ui/integrations/model.js +131 -0
  189. package/dist/ui/integrations/model.js.map +1 -0
  190. package/dist/ui/integrations/overlay.d.ts +10 -0
  191. package/dist/ui/integrations/overlay.d.ts.map +1 -0
  192. package/dist/ui/integrations/overlay.js +77 -0
  193. package/dist/ui/integrations/overlay.js.map +1 -0
  194. package/dist/ui/integrations/parts.d.ts +36 -0
  195. package/dist/ui/integrations/parts.d.ts.map +1 -0
  196. package/dist/ui/integrations/parts.js +85 -0
  197. package/dist/ui/integrations/parts.js.map +1 -0
  198. package/dist/ui/integrations/types.d.ts +96 -0
  199. package/dist/ui/integrations/types.d.ts.map +1 -0
  200. package/dist/ui/integrations/types.js +2 -0
  201. package/dist/ui/integrations/types.js.map +1 -0
  202. package/dist/ui/metrics.d.ts +106 -0
  203. package/dist/ui/metrics.d.ts.map +1 -0
  204. package/dist/ui/metrics.js +166 -0
  205. package/dist/ui/metrics.js.map +1 -0
  206. package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
  207. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
  208. package/dist/ui/portfolio/PortfolioView.js +216 -0
  209. package/dist/ui/portfolio/PortfolioView.js.map +1 -0
  210. package/dist/ui/portfolio/SpendChart.d.ts +10 -0
  211. package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
  212. package/dist/ui/portfolio/SpendChart.js +196 -0
  213. package/dist/ui/portfolio/SpendChart.js.map +1 -0
  214. package/dist/ui/portfolio/alerts.d.ts +74 -0
  215. package/dist/ui/portfolio/alerts.d.ts.map +1 -0
  216. package/dist/ui/portfolio/alerts.js +291 -0
  217. package/dist/ui/portfolio/alerts.js.map +1 -0
  218. package/dist/ui/portfolio/figures.d.ts +79 -0
  219. package/dist/ui/portfolio/figures.d.ts.map +1 -0
  220. package/dist/ui/portfolio/figures.js +103 -0
  221. package/dist/ui/portfolio/figures.js.map +1 -0
  222. package/dist/ui/portfolio/format.d.ts +8 -0
  223. package/dist/ui/portfolio/format.d.ts.map +1 -0
  224. package/dist/ui/portfolio/format.js +28 -0
  225. package/dist/ui/portfolio/format.js.map +1 -0
  226. package/dist/ui/sample.d.ts +474 -0
  227. package/dist/ui/sample.d.ts.map +1 -0
  228. package/dist/ui/sample.js +553 -0
  229. package/dist/ui/sample.js.map +1 -0
  230. package/dist/ui/seed.d.ts +188 -0
  231. package/dist/ui/seed.d.ts.map +1 -0
  232. package/dist/ui/seed.js +563 -0
  233. package/dist/ui/seed.js.map +1 -0
  234. package/dist/ui/ui.css +3356 -0
  235. package/docs/federation.md +46 -1
  236. package/docs/meta-ads.md +746 -0
  237. package/docs/upgrading.md +95 -0
  238. package/llms.txt +3 -0
  239. package/package.json +15 -3
  240. package/src/component/_generated/api.ts +14 -0
  241. package/src/component/_generated/component.ts +323 -1
  242. package/src/component/_generated/server.ts +4 -0
  243. package/src/component/constants.ts +10 -0
  244. package/src/component/convex.config.ts +9 -0
  245. package/src/component/errors.ts +5 -1
  246. package/src/component/leads.ts +517 -17
  247. package/src/component/meta.ts +1461 -0
  248. package/src/component/metaCapi.ts +921 -0
  249. package/src/component/metaFake.ts +277 -0
  250. package/src/component/metaGraph.ts +722 -0
  251. package/src/component/metaSync.ts +1164 -0
  252. package/src/component/pipeline.ts +392 -0
  253. package/src/component/schema.ts +197 -1
  254. package/src/component/secrets.ts +98 -0
  255. package/src/component/validators.ts +376 -3
  256. package/src/tracker/generated.ts +1 -1
  257. 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, IntegrationsBadge, IntegrationsView, integrationsHeadline, suggestedAccount, } from "./integrations/index.js";
20
+ export type { ClientRow, ClientState, EventMap, EventMapColumn, IntegrationConversion, IntegrationsBusy, IntegrationSite, 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;AAIhC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,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"}
@@ -0,0 +1,19 @@
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.
18
+ export { clientRows, IntegrationsBadge, IntegrationsView, integrationsHeadline, suggestedAccount, } from "./integrations/index.js";
19
+ //# 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,4DAA4D;AAC5D,OAAO,EACL,UAAU,EACV,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":"AAIA,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,+BA8LA"}
@@ -0,0 +1,97 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useRef, useState } from "react";
3
+ import { accountShort } from "./format.js";
4
+ import { Icon } from "./Icons.js";
5
+ import { useDismiss } from "./overlay.js";
6
+ /**
7
+ * The ad account a client gets, from the accounts Meta released. An account
8
+ * that already feeds another client is shown but locked (one account per
9
+ * client); the one whose name matches comes first.
10
+ */
11
+ export function AccountPicker({ siteId, siteName, accounts, siteNames, accountOwners, suggestion, value, disabled, tone = "placeholder", onPick, onChooseAssets, onOpenChange, }) {
12
+ const id = useId();
13
+ const [open, setOpenState] = useState(false);
14
+ const setOpen = (next) => {
15
+ setOpenState(next);
16
+ onOpenChange?.(next);
17
+ };
18
+ const [active, setActive] = useState(0);
19
+ const trigger = useRef(null);
20
+ const panel = useRef(null);
21
+ useDismiss(open, [trigger, panel], () => setOpen(false));
22
+ const options = accounts
23
+ .map((account) => {
24
+ const owner = account.linkedSiteId && account.linkedSiteId !== siteId
25
+ ? (siteNames.get(account.linkedSiteId) ?? null)
26
+ : null;
27
+ const elsewhere = account.linkedOutsideScope ||
28
+ (account.linkedSiteId !== null &&
29
+ account.linkedSiteId !== siteId &&
30
+ owner === null);
31
+ return {
32
+ account,
33
+ taken: owner !== null || elsewhere,
34
+ note: owner
35
+ ? accountOwners?.get(account.adAccountId)
36
+ ? `Já é da ${owner} (pelo ${accountOwners.get(account.adAccountId)})`
37
+ : `Já é da ${owner}`
38
+ : elsewhere
39
+ ? "Já ligada a outro cliente"
40
+ : account.adAccountId === suggestion
41
+ ? "Sugerida pelo nome"
42
+ : null,
43
+ };
44
+ })
45
+ .sort((left, right) => Number(right.account.adAccountId === suggestion) -
46
+ Number(left.account.adAccountId === suggestion));
47
+ const chosen = accounts.find((account) => account.adAccountId === value);
48
+ const firstFree = () => Math.max(0, options.findIndex((option) => !option.taken));
49
+ const show = () => {
50
+ setActive(firstFree());
51
+ setOpen(true);
52
+ };
53
+ const move = (step) => {
54
+ if (options.length === 0)
55
+ return;
56
+ let next = active;
57
+ for (let tries = 0; tries < options.length; tries += 1) {
58
+ next = (next + step + options.length) % options.length;
59
+ if (!options[next].taken)
60
+ break;
61
+ }
62
+ setActive(next);
63
+ };
64
+ const pick = (option) => {
65
+ if (!option || option.taken)
66
+ return;
67
+ setOpen(false);
68
+ trigger.current?.focus();
69
+ onPick(option.account.adAccountId);
70
+ };
71
+ const onKeyDown = (event) => {
72
+ if (!open) {
73
+ if (["ArrowDown", "ArrowUp", "Enter", " "].includes(event.key)) {
74
+ event.preventDefault();
75
+ show();
76
+ }
77
+ return;
78
+ }
79
+ if (event.key === "ArrowDown") {
80
+ event.preventDefault();
81
+ move(1);
82
+ }
83
+ else if (event.key === "ArrowUp") {
84
+ event.preventDefault();
85
+ move(-1);
86
+ }
87
+ else if (event.key === "Enter" || event.key === " ") {
88
+ event.preventDefault();
89
+ pick(options[active]);
90
+ }
91
+ };
92
+ 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: () => {
93
+ setOpen(false);
94
+ onChooseAssets();
95
+ }, children: [_jsx(Icon, { name: "info", size: 12 }), " Falta uma conta? Escolher contas e pixels na Meta"] })] }))] }))] }));
96
+ }
97
+ //# 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":"AACA,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,+BA+EA"}
@@ -0,0 +1,38 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AccountPicker } from "./AccountPicker.js";
3
+ import { GrantFix, ownersOf, rowMenuItems, } from "./ClientsTable.js";
4
+ import { RowMenu } from "./RowMenu.js";
5
+ import { Icon } from "./Icons.js";
6
+ import { Avatar, Pill, sentSummary, StateChip, TestModeNote } from "./parts.js";
7
+ function Sends({ row, refused }) {
8
+ if (row.state === "offline")
9
+ return null;
10
+ if (refused)
11
+ return row.state === "stopped" && row.pending > 0 ? (_jsxs(Pill, { tone: "warn", icon: "clock", children: [row.pending, " na fila"] })) : null;
12
+ if (!row.pixel)
13
+ return _jsx(Pill, { tone: "ghost", children: "sem pixel" });
14
+ const summary = sentSummary(row, { compact: true });
15
+ return (_jsxs(_Fragment, { children: [summary && (_jsx(Pill, { tone: "ok", icon: "send", children: summary })), row.testMode && _jsx(TestModeNote, { variant: "line" })] }));
16
+ }
17
+ /**
18
+ * M1/M3: under 640px each client is a card. A client without an account
19
+ * shows the picker with the account its name suggests; the sticky button
20
+ * below the list confirms it.
21
+ */
22
+ export function ClientCards({ rows, connection, staged, onStage, actions, now, }) {
23
+ const refused = connection?.status === "invalid";
24
+ const siteNames = new Map(rows.map((row) => [row.site.siteId, row.site.name]));
25
+ return (_jsx("ul", { className: "rastro-integrations__cards", "aria-label": "Clientes", children: rows.map((row, slot) => {
26
+ const picking = connection !== null && !refused && row.state === "unlinked";
27
+ const choice = staged[row.site.siteId] ?? null;
28
+ const line = row.account
29
+ ? row.account.adAccountId
30
+ : row.state === "planB"
31
+ ? "pixel + token do cliente"
32
+ : null;
33
+ 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
34
+ ? "sem conta · sugerimos pelo nome"
35
+ : "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));
36
+ }) }));
37
+ }
38
+ //# 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":"AAWA,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,CAsBZ;AAmBD,mEAAmE;AACnE,eAAO,MAAM,SAAS,cAAe;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,uCAKnD,CAAC;AAkQX,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,+BAwHA"}