@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.
Files changed (265) 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 +642 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +391 -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 +278 -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 +358 -0
  35. package/dist/component/meta.d.ts.map +1 -0
  36. package/dist/component/meta.js +1295 -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 +99 -0
  55. package/dist/component/pipeline.d.ts.map +1 -0
  56. package/dist/component/pipeline.js +337 -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 +20 -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 +101 -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 +42 -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 +143 -0
  137. package/dist/ui/integrations/ClientsTable.js.map +1 -0
  138. package/dist/ui/integrations/Connect.d.ts +35 -0
  139. package/dist/ui/integrations/Connect.d.ts.map +1 -0
  140. package/dist/ui/integrations/Connect.js +62 -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 +108 -0
  145. package/dist/ui/integrations/Connection.js.map +1 -0
  146. package/dist/ui/integrations/Dialogs.d.ts +21 -0
  147. package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
  148. package/dist/ui/integrations/Dialogs.js +34 -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 +61 -0
  153. package/dist/ui/integrations/EventsFeed.js.map +1 -0
  154. package/dist/ui/integrations/EventsSheet.d.ts +34 -0
  155. package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
  156. package/dist/ui/integrations/EventsSheet.js +136 -0
  157. package/dist/ui/integrations/EventsSheet.js.map +1 -0
  158. package/dist/ui/integrations/Icons.d.ts +38 -0
  159. package/dist/ui/integrations/Icons.d.ts.map +1 -0
  160. package/dist/ui/integrations/Icons.js +40 -0
  161. package/dist/ui/integrations/Icons.js.map +1 -0
  162. package/dist/ui/integrations/IntegrationsView.d.ts +15 -0
  163. package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
  164. package/dist/ui/integrations/IntegrationsView.js +141 -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/Partner.d.ts +14 -0
  171. package/dist/ui/integrations/Partner.d.ts.map +1 -0
  172. package/dist/ui/integrations/Partner.js +38 -0
  173. package/dist/ui/integrations/Partner.js.map +1 -0
  174. package/dist/ui/integrations/RowMenu.d.ts +15 -0
  175. package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
  176. package/dist/ui/integrations/RowMenu.js +47 -0
  177. package/dist/ui/integrations/RowMenu.js.map +1 -0
  178. package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
  179. package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
  180. package/dist/ui/integrations/UnlinkDialog.js +29 -0
  181. package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
  182. package/dist/ui/integrations/audience.d.ts +12 -0
  183. package/dist/ui/integrations/audience.d.ts.map +1 -0
  184. package/dist/ui/integrations/audience.js +12 -0
  185. package/dist/ui/integrations/audience.js.map +1 -0
  186. package/dist/ui/integrations/format.d.ts +28 -0
  187. package/dist/ui/integrations/format.d.ts.map +1 -0
  188. package/dist/ui/integrations/format.js +101 -0
  189. package/dist/ui/integrations/format.js.map +1 -0
  190. package/dist/ui/integrations/index.d.ts +5 -0
  191. package/dist/ui/integrations/index.d.ts.map +1 -0
  192. package/dist/ui/integrations/index.js +3 -0
  193. package/dist/ui/integrations/index.js.map +1 -0
  194. package/dist/ui/integrations/modal.d.ts +10 -0
  195. package/dist/ui/integrations/modal.d.ts.map +1 -0
  196. package/dist/ui/integrations/modal.js +77 -0
  197. package/dist/ui/integrations/modal.js.map +1 -0
  198. package/dist/ui/integrations/model.d.ts +99 -0
  199. package/dist/ui/integrations/model.d.ts.map +1 -0
  200. package/dist/ui/integrations/model.js +164 -0
  201. package/dist/ui/integrations/model.js.map +1 -0
  202. package/dist/ui/integrations/parts.d.ts +36 -0
  203. package/dist/ui/integrations/parts.d.ts.map +1 -0
  204. package/dist/ui/integrations/parts.js +85 -0
  205. package/dist/ui/integrations/parts.js.map +1 -0
  206. package/dist/ui/integrations/types.d.ts +146 -0
  207. package/dist/ui/integrations/types.d.ts.map +1 -0
  208. package/dist/ui/integrations/types.js +2 -0
  209. package/dist/ui/integrations/types.js.map +1 -0
  210. package/dist/ui/metrics.d.ts +106 -0
  211. package/dist/ui/metrics.d.ts.map +1 -0
  212. package/dist/ui/metrics.js +166 -0
  213. package/dist/ui/metrics.js.map +1 -0
  214. package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
  215. package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
  216. package/dist/ui/portfolio/PortfolioView.js +216 -0
  217. package/dist/ui/portfolio/PortfolioView.js.map +1 -0
  218. package/dist/ui/portfolio/SpendChart.d.ts +10 -0
  219. package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
  220. package/dist/ui/portfolio/SpendChart.js +196 -0
  221. package/dist/ui/portfolio/SpendChart.js.map +1 -0
  222. package/dist/ui/portfolio/alerts.d.ts +74 -0
  223. package/dist/ui/portfolio/alerts.d.ts.map +1 -0
  224. package/dist/ui/portfolio/alerts.js +291 -0
  225. package/dist/ui/portfolio/alerts.js.map +1 -0
  226. package/dist/ui/portfolio/figures.d.ts +79 -0
  227. package/dist/ui/portfolio/figures.d.ts.map +1 -0
  228. package/dist/ui/portfolio/figures.js +103 -0
  229. package/dist/ui/portfolio/figures.js.map +1 -0
  230. package/dist/ui/portfolio/format.d.ts +8 -0
  231. package/dist/ui/portfolio/format.d.ts.map +1 -0
  232. package/dist/ui/portfolio/format.js +28 -0
  233. package/dist/ui/portfolio/format.js.map +1 -0
  234. package/dist/ui/sample.d.ts +536 -0
  235. package/dist/ui/sample.d.ts.map +1 -0
  236. package/dist/ui/sample.js +574 -0
  237. package/dist/ui/sample.js.map +1 -0
  238. package/dist/ui/seed.d.ts +188 -0
  239. package/dist/ui/seed.d.ts.map +1 -0
  240. package/dist/ui/seed.js +563 -0
  241. package/dist/ui/seed.js.map +1 -0
  242. package/dist/ui/ui.css +3424 -0
  243. package/docs/federation.md +46 -1
  244. package/docs/meta-ads.md +795 -0
  245. package/docs/upgrading.md +116 -0
  246. package/llms.txt +3 -0
  247. package/package.json +15 -3
  248. package/src/component/_generated/api.ts +14 -0
  249. package/src/component/_generated/component.ts +324 -1
  250. package/src/component/_generated/server.ts +4 -0
  251. package/src/component/constants.ts +10 -0
  252. package/src/component/convex.config.ts +9 -0
  253. package/src/component/errors.ts +5 -1
  254. package/src/component/leads.ts +517 -17
  255. package/src/component/meta.ts +1525 -0
  256. package/src/component/metaCapi.ts +921 -0
  257. package/src/component/metaFake.ts +277 -0
  258. package/src/component/metaGraph.ts +722 -0
  259. package/src/component/metaSync.ts +1164 -0
  260. package/src/component/pipeline.ts +410 -0
  261. package/src/component/schema.ts +197 -1
  262. package/src/component/secrets.ts +98 -0
  263. package/src/component/validators.ts +376 -3
  264. package/src/tracker/generated.ts +1 -1
  265. package/src/ui/seed.ts +755 -0
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { formatMoney } from "../metrics.js";
3
+ import { useBusiness } from "./audience.js";
4
+ import { plural, sentAgo } from "./format.js";
5
+ import { Icon } from "./Icons.js";
6
+ import { Avatar, Pill } from "./parts.js";
7
+ /** What each Meta event is called on screen. */
8
+ export const EVENT_LABELS = {
9
+ Purchase: "Compra",
10
+ QualifiedLead: "Lead qualificado",
11
+ Lead: "Lead",
12
+ Schedule: "Agendamento",
13
+ };
14
+ const FEMININE = new Set(["Purchase"]);
15
+ /** "enviada há 18 min", "enviado há 41 min", "na fila", "falhou". */
16
+ export function deliveryLabel(event, now) {
17
+ if (event.status === "pending")
18
+ return "na fila";
19
+ if (event.status === "failed")
20
+ return "falhou";
21
+ const verb = FEMININE.has(event.eventName) ? "enviada" : "enviado";
22
+ return `${verb} ${sentAgo(event.sentAt ?? event.createdAt, now)}`;
23
+ }
24
+ const FEED_ROWS = 3;
25
+ const DAY_MS = 86_400_000;
26
+ const BRT_OFFSET_MS = 3 * 3_600_000;
27
+ /** B3, bottom: the latest events every client's pixel received. */
28
+ export function EventsFeed({ sites, conversions, adNames, sentBySite, currency, now, }) {
29
+ const business = useBusiness();
30
+ const slots = new Map(sites.map((site, index) => [site.siteId, index]));
31
+ const events = sites
32
+ .flatMap((site) => (conversions[site.siteId] ?? []).map((event) => ({ site, event })))
33
+ .sort((left, right) => right.event.createdAt - left.event.createdAt);
34
+ if (events.length === 0)
35
+ return null;
36
+ // Midnight in Brasília (UTC−3), where the rest of the screen tells time.
37
+ const startOfDay = Math.floor((now - BRT_OFFSET_MS) / DAY_MS) * DAY_MS + BRT_OFFSET_MS;
38
+ const today = events.filter(({ event }) => event.createdAt >= startOfDay);
39
+ // The host's own count of today when it sends one; else the events on hand.
40
+ const counted = sites.map((site) => sentBySite?.[site.siteId]?.today);
41
+ const known = counted.some(Boolean);
42
+ const sentToday = known
43
+ ? counted.reduce((sum, day) => sum + (day?.sent ?? 0), 0)
44
+ : today.filter(({ event }) => event.status === "sent").length;
45
+ // Hosts count what Meta accepted; failures come from the events on hand
46
+ // unless the host counts them too.
47
+ const failedToday = known && counted.every((day) => day?.failed !== undefined)
48
+ ? counted.reduce((sum, day) => sum + (day?.failed ?? 0), 0)
49
+ : today.filter(({ event }) => event.status === "failed").length;
50
+ return (_jsxs("section", { className: "rastro-integrations__card rastro-integrations__feed", "aria-labelledby": "rastro-integrations-feed", children: [_jsxs("header", { className: "rastro-integrations__section-head", children: [_jsxs("div", { children: [_jsx("h3", { id: "rastro-integrations-feed", className: "rastro-integrations__title", children: "\u00DAltimos eventos devolvidos \u00E0 Meta" }), _jsx("p", { className: "rastro-integrations__desc", children: business
51
+ ? "Cada venda registrada vira Compra, com valor, no seu pixel"
52
+ : "Todos os clientes · cada venda vira Compra com valor no pixel do cliente" })] }), _jsxs(Pill, { tone: failedToday > 0 ? "bad" : "ok", icon: "check", children: [plural(sentToday, "enviado", "enviados"), " hoje \u00B7", " ", plural(failedToday, "falha", "falhas")] })] }), _jsx("table", { className: "rastro-integrations__table", "data-mode": "feed", children: _jsx("tbody", { children: events.slice(0, FEED_ROWS).map(({ site, event }) => (_jsxs("tr", { children: [_jsx("td", { "data-col": "icon", children: _jsx(Icon, { name: "send", size: 14 }) }), _jsx("td", { children: _jsxs("span", { className: "rastro-integrations__evt", children: [EVENT_LABELS[event.eventName], " ", _jsx("i", { children: event.eventName })] }) }), _jsx("td", { children: [
53
+ event.leadLabel,
54
+ event.valueCents !== null
55
+ ? formatMoney(event.valueCents, currency)
56
+ : null,
57
+ ]
58
+ .filter(Boolean)
59
+ .join(" · ") || "—" }), _jsx("td", { children: _jsxs("span", { className: "rastro-integrations__client", "data-size": "sm", children: [_jsx(Avatar, { name: site.name, slot: slots.get(site.siteId) ?? 0, size: "sm" }), site.name] }) }), _jsx("td", { "data-col": "ad", children: event.adName ?? ((event.adId && adNames?.[event.adId]) || "") }), _jsx("td", { "data-col": "when", children: deliveryLabel(event, now) })] }, `${site.siteId}:${event.eventId}`))) }) })] }));
60
+ }
61
+ //# sourceMappingURL=EventsFeed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventsFeed.js","sourceRoot":"","sources":["../../../src/ui/integrations/EventsFeed.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ClientRow } from "./model.js";
2
+ import type { EventMap, EventMapChoice, IntegrationConversion, IntegrationSite } from "./types.js";
3
+ /**
4
+ * B5/M2: which board columns send what to the client's pixel. A sale always
5
+ * goes as Compra with its value (fixed first row); each column may send Lead,
6
+ * Lead qualificado or Agendamento, once per lead.
7
+ */
8
+ export declare function EventsSheet({ row, slot, eventMap, conversions, pages, onLoadOlder, currency, boardLabel, permitted, busy, onSave, copyTargets, onCopy, onPlanB, onClose, now, }: {
9
+ row: ClientRow;
10
+ slot: number;
11
+ eventMap: EventMap | undefined;
12
+ conversions: readonly IntegrationConversion[];
13
+ /** Whether the host has older events, and whether a page is loading. */
14
+ pages?: {
15
+ hasMore: boolean;
16
+ loading: boolean;
17
+ } | undefined;
18
+ onLoadOlder?: (() => void) | undefined;
19
+ currency: string;
20
+ boardLabel: string;
21
+ permitted: boolean;
22
+ busy: boolean;
23
+ onSave: (map: EventMapChoice) => void;
24
+ /**
25
+ * The other clients the same map fits (same columns, a pixel not another
26
+ * owner's): "Usar o mesmo mapa nos outros 3 clientes".
27
+ */
28
+ copyTargets?: readonly IntegrationSite[];
29
+ onCopy?: ((siteIds: string[], map: EventMapChoice) => void) | undefined;
30
+ onPlanB: () => void;
31
+ onClose: () => void;
32
+ now: number;
33
+ }): import("react").JSX.Element;
34
+ //# sourceMappingURL=EventsSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventsSheet.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/EventsSheet.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAEd,qBAAqB,EACrB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAoHpB;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,SAAS,EACT,IAAI,EACJ,MAAM,EACN,WAAgB,EAChB,MAAM,EACN,OAAO,EACP,OAAO,EACP,GAAG,GACJ,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC9C,wEAAwE;IACxE,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3D,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IACtC;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACxE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb,+BAiaA"}
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useRef, useState } from "react";
3
+ import { formatMoney } from "../metrics.js";
4
+ import { useBusiness, useProductName } from "./audience.js";
5
+ import { EVENT_LABELS } from "./EventsFeed.js";
6
+ import { pixelDigits, pixelShort, plural, sentAgo } from "./format.js";
7
+ import { Icon, MetaMark } from "./Icons.js";
8
+ import { Overlay } from "./Overlay.js";
9
+ import { Avatar, Pill, TestModeNote } from "./parts.js";
10
+ const COLUMN_EVENTS = ["Lead", "QualifiedLead", "Schedule"];
11
+ const FEED_ROWS = 3;
12
+ const MORE_ROWS = 10;
13
+ /** Columns in board order, gathered under their block when they have one. */
14
+ function groupsOf(columns) {
15
+ const groups = [];
16
+ for (const column of columns) {
17
+ const name = column.group ?? null;
18
+ const last = groups.at(-1);
19
+ if (last && last.name === name)
20
+ last.columns.push(column);
21
+ else
22
+ groups.push({ name, columns: [column] });
23
+ }
24
+ return groups;
25
+ }
26
+ function EventSelect({ id, label, value, disabled, onChange, }) {
27
+ return (_jsxs("span", { className: "rastro-integrations__select", "data-tone": value ? "on" : "none", children: [_jsxs("select", { id: id, "aria-label": label, value: value ?? "", disabled: disabled, onChange: (event) => onChange((event.target.value || null)), children: [_jsx("option", { value: "", children: "N\u00E3o enviar \u00E0 Meta" }), COLUMN_EVENTS.map((name) => (_jsx("option", { value: name, children: EVENT_LABELS[name] }, name)))] }), _jsx(Icon, { name: "chevronDown", size: 14 })] }));
28
+ }
29
+ function Check({ checked, disabled, label, onChange, }) {
30
+ return (_jsxs("span", { className: "rastro-integrations__check", children: [_jsx("input", { type: "checkbox", checked: checked, disabled: disabled, "aria-label": label, onChange: (event) => onChange?.(event.target.checked) }), _jsx(Icon, { name: "check", size: 12 })] }));
31
+ }
32
+ /** "no outro cliente", "nos outros 3 clientes". */
33
+ const copyLabel = (count) => count === 1 ? "no outro cliente" : `nos outros ${count} clientes`;
34
+ /** "Últimos 30 dias: 41 Compras e 118 Leads qualificados enviados · 0 falhas". */
35
+ function sentLine(sent, { short = false } = {}) {
36
+ if (!sent)
37
+ return null;
38
+ const parts = [
39
+ sent.Purchase ? plural(sent.Purchase, "Compra", "Compras") : null,
40
+ sent.QualifiedLead
41
+ ? plural(sent.QualifiedLead, short ? "qualificado" : "Lead qualificado", short ? "qualificados" : "Leads qualificados")
42
+ : null,
43
+ sent.Schedule ? plural(sent.Schedule, "Agendamento", "Agendamentos") : null,
44
+ sent.Lead ? plural(sent.Lead, "Lead", "Leads") : null,
45
+ ].filter(Boolean);
46
+ // A host that counts what Meta accepted may not count failures: then the
47
+ // line says nothing about them instead of a made-up zero.
48
+ const failed = sent.failed === undefined
49
+ ? ""
50
+ : ` · ${plural(sent.failed, "falha", "falhas")}`;
51
+ if (parts.length === 0)
52
+ return `${short ? "30 dias" : "Últimos 30 dias"}: nada enviado${failed}`;
53
+ const list = parts.length === 1
54
+ ? parts[0]
55
+ : `${parts.slice(0, -1).join(", ")} e ${parts.at(-1)}`;
56
+ return `${short ? "30 dias" : "Últimos 30 dias"}: ${list}${short ? "" : " enviados"}${failed}`;
57
+ }
58
+ /**
59
+ * B5/M2: which board columns send what to the client's pixel. A sale always
60
+ * goes as Compra with its value (fixed first row); each column may send Lead,
61
+ * Lead qualificado or Agendamento, once per lead.
62
+ */
63
+ export function EventsSheet({ row, slot, eventMap, conversions, pages, onLoadOlder, currency, boardLabel, permitted, busy, onSave, copyTargets = [], onCopy, onPlanB, onClose, now, }) {
64
+ const id = useId();
65
+ const close = useRef(null);
66
+ const [choices, setChoices] = useState(() => Object.fromEntries((eventMap?.columns ?? []).map((column) => [column.key, column.event])));
67
+ const [sendLead, setSendLead] = useState(eventMap?.sendLeadEvent ?? false);
68
+ // The latest three, then "Ver mais" ten at a time: from what is loaded,
69
+ // and past it the host's next page (keyset by `createdAt` + `eventId`).
70
+ const [shown, setShown] = useState(FEED_ROWS);
71
+ const hiddenLoaded = Math.max(0, conversions.length - shown);
72
+ const canLoadOlder = Boolean(onLoadOlder && pages?.hasMore);
73
+ const showMore = () => {
74
+ const next = shown + MORE_ROWS;
75
+ setShown(next);
76
+ if (next > conversions.length && canLoadOlder && !pages?.loading) {
77
+ onLoadOlder?.();
78
+ }
79
+ };
80
+ const choose = (key, value) => setChoices((current) => ({ ...current, [key]: value }));
81
+ const business = useBusiness();
82
+ const product = useProductName();
83
+ // Whoever linked the pixel decides its events (another owner: CONFLICT).
84
+ const lockedBy = row.pixel?.owner ?? null;
85
+ const editable = permitted && Boolean(row.pixel) && Boolean(eventMap) && !lockedBy;
86
+ const [copy, setCopy] = useState(false);
87
+ const canCopy = !business && editable && Boolean(onCopy) && copyTargets.length > 0;
88
+ const columns = eventMap?.columns ?? [];
89
+ const sourceOf = (event) => event.eventName === "Purchase"
90
+ ? "Venda registrada"
91
+ : (columns.find((column) => choices[column.key] === event.eventName)
92
+ ?.name ?? null);
93
+ const latest = conversions
94
+ .filter((event) => event.status === "sent")
95
+ .sort((a, b) => (b.sentAt ?? 0) - (a.sentAt ?? 0))[0];
96
+ const name = row.site.name;
97
+ const summary = sentLine(row.sent30d);
98
+ return (_jsx(Overlay, { side: true, labelledBy: `${id}-title`, initialFocus: close, onClose: onClose, children: _jsxs("div", { className: "rastro-integrations__sheet", children: [_jsxs("header", { className: "rastro-integrations__sheet-bar", children: [_jsx("button", { type: "button", className: "rastro-integrations__icon-btn", "aria-label": "Voltar", onClick: onClose, children: _jsx(Icon, { name: "chevronRight", size: 20 }) }), _jsxs("strong", { children: ["Eventos \u00B7 ", name] })] }), _jsxs("div", { className: "rastro-integrations__sheet-body", children: [_jsxs("header", { className: "rastro-integrations__sheet-head", children: [_jsx(Avatar, { name: name, slot: slot, size: "lg" }), _jsxs("div", { className: "rastro-integrations__grow", children: [_jsxs("h3", { id: `${id}-title`, className: "rastro-integrations__title", "data-size": "lg", children: ["Eventos devolvidos \u00E0 Meta \u00B7 ", name] }), _jsxs("p", { className: "rastro-integrations__desc", children: ["Quando um lead muda de coluna no ", boardLabel, ", o ", product, " avisa o pixel. A Meta aprende quem compra e procura mais gente assim."] })] }), _jsx("button", { ref: close, type: "button", className: "rastro-integrations__icon-btn", "aria-label": "Fechar", onClick: onClose, children: _jsx(Icon, { name: "x" }) })] }), row.pixel ? (_jsxs("div", { className: "rastro-integrations__pixelbar", children: [_jsx(MetaMark, { size: 16 }), _jsxs("span", { className: "rastro-integrations__grow", children: ["Pixel", " ", _jsx("b", { className: "rastro-integrations__mono", "data-wide": "", children: pixelDigits(row.pixel.pixelId) }), _jsx("b", { className: "rastro-integrations__mono", "data-narrow": "", children: pixelShort(row.pixel.pixelId) }), row.pixel.name && (_jsxs("span", { "data-wide": "", children: [" \u00B7 ", row.pixel.name] }))] }), latest?.sentAt && (_jsxs(Pill, { tone: "ok", icon: "dot", children: [_jsx("span", { "data-wide": "", children: "Recebendo \u00B7 \u00FAltimo evento " }), sentAgo(latest.sentAt, now)] }))] })) : null, row.pixel && row.testMode && _jsx(TestModeNote, { variant: "callout" }), lockedBy && (_jsxs("div", { className: "rastro-integrations__callout", "data-tone": "info", role: "note", children: [_jsx(Icon, { name: "lock", size: 14 }), _jsxs("p", { children: [_jsxs("b", { children: ["Pixel ligado pelo ", lockedBy, "."] }), " Quem ligou o pixel escolhe quais colunas avisam a Meta: voc\u00EA v\u00EA o mapa aqui, mas mudar \u00E9 com ele."] })] })), row.pixel ? null : (_jsxs("div", { className: "rastro-integrations__callout", "data-tone": "warn", children: [_jsx(Icon, { name: "info", size: 14 }), _jsxs("p", { children: [name, " ainda n\u00E3o tem pixel: nada \u00E9 enviado \u00E0 Meta.", " ", business
99
+ ? "Ligue um pixel da conexão ou use um token próprio."
100
+ : "Ligue um pixel da conexão na lista de clientes ou use o token próprio do cliente."] }), _jsx("button", { type: "button", className: "rastro-integrations__btn", "data-variant": "outline", "data-size": "sm", disabled: !permitted, onClick: onPlanB, children: "Pixel com token" })] })), _jsxs("div", { className: "rastro-integrations__map", role: "group", "aria-labelledby": `${id}-map`, children: [_jsxs("p", { id: `${id}-map`, className: "rastro-integrations__sec", children: ["Coluna do ", boardLabel, " \u2192 evento da Meta"] }), _jsxs("div", { className: "rastro-integrations__maprow", "data-fixed": "", children: [_jsx(Check, { checked: true, disabled: true, label: "Venda registrada (com valor) sempre envia Compra" }), _jsxs("span", { className: "rastro-integrations__stage", children: [_jsx("span", { className: "rastro-integrations__swatch", "data-fixed": "" }), "Venda registrada"] }), _jsx("span", { className: "rastro-integrations__arrow", children: _jsx(Icon, { name: "arrowRight", size: 14 }) }), _jsx("span", { className: "rastro-integrations__select", "data-tone": "on", "data-static": "", children: _jsx("span", { className: "rastro-integrations__evt", children: "Compra" }) }), _jsxs("span", { className: "rastro-integrations__meta rastro-integrations__map-note", children: [_jsx(Icon, { name: "dollar", size: 12 }), _jsx("span", { "data-wide": "", children: "com o valor da venda" }), _jsx("span", { "data-narrow": "", children: "com valor" })] })] }), !eventMap && (_jsx("div", { className: "rastro-skeleton rastro-integrations__map-skeleton" })), groupsOf(columns).map((group, index) => (_jsxs("div", { className: "rastro-integrations__map-group", children: [group.name && (_jsx("p", { className: "rastro-integrations__group", children: group.name })), group.columns.map((column) => {
101
+ const value = choices[column.key] ?? null;
102
+ return (_jsxs("div", { className: "rastro-integrations__maprow", children: [_jsx(Check, { checked: value !== null, disabled: !editable, label: `Enviar ${column.name} à Meta`, onChange: (checked) => choose(column.key, checked ? "Lead" : null) }), _jsxs("span", { className: "rastro-integrations__stage", children: [_jsx("span", { className: "rastro-integrations__swatch", style: column.color
103
+ ? { background: column.color }
104
+ : undefined }), _jsx("span", { className: "rastro-integrations__stage-name", children: column.name }), column.monthCount !== null && (_jsx("span", { className: "rastro-integrations__meta rastro-num", "data-wide": "", children: column.monthCount.toLocaleString("pt-BR") }))] }), _jsx("span", { className: "rastro-integrations__arrow", children: _jsx(Icon, { name: "arrowRight", size: 14 }) }), _jsx(EventSelect, { id: `${id}-${column.key}`, label: `Evento da Meta para ${column.name}`, value: value, disabled: !editable, onChange: (next) => choose(column.key, next) }), _jsx("span", { className: "rastro-integrations__meta rastro-integrations__map-note", "data-wide": "", children: value ? "sem valor" : "" })] }, column.key));
105
+ })] }, `${group.name ?? "none"}:${index}`))), eventMap && columns.length === 0 && (_jsxs("p", { className: "rastro-integrations__desc", children: ["O host ainda n\u00E3o declarou as colunas do ", boardLabel, ": s\u00F3 a venda registrada vai como Compra."] }))] }), _jsxs("div", { className: "rastro-integrations__callout", "data-tone": "info", "data-wide": "", children: [_jsx(Icon, { name: "info", size: 14 }), _jsxs("p", { children: [_jsx("b", { children: "Compra" }), " vai com o valor do neg\u00F3cio em R$;", " ", _jsx("b", { children: "Lead qualificado" }), " vai sem valor. Cada lead conta uma vez por evento, mesmo se voltar e avan\u00E7ar de novo de coluna. Eventos com mais de 7 dias n\u00E3o s\u00E3o enviados."] })] }), _jsxs("label", { className: "rastro-integrations__toggle", "data-wide": "", children: [_jsx(Check, { checked: sendLead, disabled: !editable, label: "Enviar tamb\u00E9m cada contato novo como Lead", onChange: setSendLead }), _jsxs("span", { className: "rastro-integrations__grow", children: [_jsxs("span", { className: "rastro-integrations__toggle-title", children: ["Enviar tamb\u00E9m cada contato novo como", " ", _jsxs("span", { className: "rastro-integrations__evt", children: ["Lead ", _jsx("i", { children: "Lead" })] })] }), _jsx("span", { className: "rastro-integrations__meta", children: sendLead
106
+ ? "Ligado: cada contato novo vai como Lead, além da conversa que o anúncio já conta"
107
+ : "Desligado: a Meta já conta a conversa iniciada pelo anúncio" })] })] }), conversions.length > 0 && (_jsxs("div", { className: "rastro-integrations__received", "data-wide": "", children: [_jsxs("p", { className: "rastro-integrations__sec", children: ["O que a Meta recebeu da ", name] }), _jsx("ul", { children: [...conversions]
108
+ .sort((a, b) => b.createdAt - a.createdAt)
109
+ .slice(0, shown)
110
+ .map((event) => {
111
+ const source = sourceOf(event);
112
+ return (_jsxs("li", { "data-status": event.status, children: [_jsx(Icon, { name: event.status === "failed"
113
+ ? "alert"
114
+ : event.status === "pending"
115
+ ? "clock"
116
+ : "check", size: 14 }), _jsxs("span", { children: [event.leadLabel ?? "Lead", source && (_jsxs("span", { className: "rastro-integrations__meta", children: [" ", "\u00B7 ", source] }))] }), _jsx("span", { children: EVENT_LABELS[event.eventName] }), _jsx("b", { className: "rastro-num", children: event.valueCents !== null
117
+ ? formatMoney(event.valueCents, currency)
118
+ : "" }), _jsx("span", { className: "rastro-integrations__meta", children: event.status === "sent"
119
+ ? sentAgo(event.sentAt ?? event.createdAt, now)
120
+ : event.status === "pending"
121
+ ? "na fila"
122
+ : "falhou" })] }, event.eventId));
123
+ }) }), (hiddenLoaded > 0 || canLoadOlder) && (_jsx("button", { type: "button", className: "rastro-integrations__link rastro-integrations__meta", disabled: pages?.loading, onClick: showMore, children: pages?.loading
124
+ ? "Carregando…"
125
+ : hiddenLoaded > 0
126
+ ? `Ver mais ${Math.min(hiddenLoaded, MORE_ROWS).toLocaleString("pt-BR")}`
127
+ : "Ver mais antigos" }))] })), summary && (_jsxs("p", { className: "rastro-integrations__meta", "data-narrow": "", children: [_jsx(Icon, { name: "info", size: 12 }), " ", sentLine(row.sent30d, { short: true })] }))] }), _jsxs("footer", { className: "rastro-integrations__sheet-foot", children: [canCopy && (_jsxs("label", { className: "rastro-integrations__copy-map", children: [_jsx(Check, { checked: copy, label: `Usar o mesmo mapa ${copyLabel(copyTargets.length)} (mesmas colunas do ${boardLabel})`, onChange: setCopy }), _jsxs("span", { children: ["Usar o mesmo mapa ", copyLabel(copyTargets.length), " ", _jsxs("span", { className: "rastro-integrations__meta", children: ["(mesmas colunas do ", boardLabel, ")"] })] })] })), summary && (_jsx("span", { className: "rastro-integrations__meta", "data-wide": "", children: summary })), _jsxs("span", { className: "rastro-integrations__foot-actions", children: [_jsx("button", { type: "button", className: "rastro-integrations__btn", "data-variant": "outline", onClick: onClose, children: "Cancelar" }), _jsx("button", { type: "button", className: "rastro-integrations__btn", disabled: !editable || busy, onClick: () => {
128
+ const map = { columns: choices, sendLeadEvent: sendLead };
129
+ onSave(map);
130
+ if (canCopy && copy) {
131
+ onCopy?.(copyTargets.map((site) => site.siteId), map);
132
+ }
133
+ onClose();
134
+ }, children: busy ? "Salvando…" : "Salvar eventos" })] })] })] }) }));
135
+ }
136
+ //# sourceMappingURL=EventsSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventsSheet.js","sourceRoot":"","sources":["../../../src/ui/integrations/EventsSheet.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ declare const LINES: {
2
+ readonly check: import("react").JSX.Element;
3
+ readonly chevronDown: import("react").JSX.Element;
4
+ readonly chevronRight: import("react").JSX.Element;
5
+ readonly arrowRight: import("react").JSX.Element;
6
+ readonly x: import("react").JSX.Element;
7
+ readonly clock: import("react").JSX.Element;
8
+ readonly info: import("react").JSX.Element;
9
+ readonly alert: import("react").JSX.Element;
10
+ readonly refresh: import("react").JSX.Element;
11
+ readonly lock: import("react").JSX.Element;
12
+ readonly key: import("react").JSX.Element;
13
+ readonly trash: import("react").JSX.Element;
14
+ readonly unlink: import("react").JSX.Element;
15
+ readonly send: import("react").JSX.Element;
16
+ readonly dots: import("react").JSX.Element;
17
+ readonly plus: import("react").JSX.Element;
18
+ /** The partner (B2): a person with a star. */
19
+ readonly partner: import("react").JSX.Element;
20
+ readonly dollar: import("react").JSX.Element;
21
+ readonly settings: import("react").JSX.Element;
22
+ };
23
+ export type IconName = keyof typeof LINES;
24
+ /** A 16px stroke icon; `size` 12/14/20 for the artboards' xs/sm/lg. */
25
+ export declare function Icon({ name, size }: {
26
+ name: IconName;
27
+ size?: number;
28
+ }): import("react").JSX.Element;
29
+ /** The Meta infinity mark, in Meta blue. */
30
+ export declare function MetaMark({ size }: {
31
+ size?: number;
32
+ }): import("react").JSX.Element;
33
+ /** The Facebook "f", white on the Meta-blue button. */
34
+ export declare function FacebookMark({ size }: {
35
+ size?: number;
36
+ }): import("react").JSX.Element;
37
+ export {};
38
+ //# sourceMappingURL=Icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icons.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/Icons.tsx"],"names":[],"mappings":"AAGA,QAAA,MAAM,KAAK;aACT,KAAK;aACL,WAAW;aACX,YAAY;aACZ,UAAU;aACV,CAAC;aACD,KAAK;aAML,IAAI;aAMJ,KAAK;aAML,OAAO;aAQP,IAAI;aAMJ,GAAG;aAMH,KAAK;aAGL,MAAM;aAGN,IAAI;aAMJ,IAAI;aAOJ,IAAI;IACJ,8CAA8C;aAC9C,OAAO;aAOP,MAAM;aAMN,QAAQ;CAMA,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAE1C,uEAAuE;AACvE,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAiB1E;AAOD,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,EAAE,IAAS,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAYxD;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAY5D"}
@@ -0,0 +1,40 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Line icons in the dashboard's family (lucide strokes) and the two Meta
3
+ // marks, inlined so the package needs no icon library.
4
+ const LINES = {
5
+ check: _jsx("path", { d: "M20 6 9 17l-5-5" }),
6
+ chevronDown: _jsx("path", { d: "m6 9 6 6 6-6" }),
7
+ chevronRight: _jsx("path", { d: "m9 18 6-6-6-6" }),
8
+ arrowRight: _jsx("path", { d: "M5 12h14M12 5l7 7-7 7" }),
9
+ x: _jsx("path", { d: "M18 6 6 18M6 6l12 12" }),
10
+ clock: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 6v6l4 2" })] })),
11
+ info: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 16v-4M12 8h.01" })] })),
12
+ alert: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3Z" }), _jsx("path", { d: "M12 9v4M12 17h.01" })] })),
13
+ refresh: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" }), _jsx("path", { d: "M21 3v5h-5" }), _jsx("path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" }), _jsx("path", { d: "M8 16H3v5" })] })),
14
+ lock: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })] })),
15
+ key: (_jsxs(_Fragment, { children: [_jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4M21 2l-9.6 9.6" }), _jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })] })),
16
+ trash: (_jsx("path", { d: "M3 6h18M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })),
17
+ unlink: (_jsx("path", { d: "m18.84 12.25 1.72-1.71a5 5 0 0 0-7.07-7.07l-1.72 1.71M5.17 11.75l-1.71 1.71a5 5 0 0 0 7.07 7.07l1.71-1.71M8 2v3M2 8h3M16 22v-3M22 16h-3" })),
18
+ send: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M14.5 21.7a.5.5 0 0 0 .9 0L22 2.6a.5.5 0 0 0-.6-.6L2.3 8.6a.5.5 0 0 0 0 .9l8 3.2a2 2 0 0 1 1.1 1.1Z" }), _jsx("path", { d: "m21.9 2.1-10.9 10.9" })] })),
19
+ dots: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "1" }), _jsx("circle", { cx: "19", cy: "12", r: "1" }), _jsx("circle", { cx: "5", cy: "12", r: "1" })] })),
20
+ plus: _jsx("path", { d: "M5 12h14M12 5v14" }),
21
+ /** The partner (B2): a person with a star. */
22
+ partner: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "10", cy: "7", r: "4" }), _jsx("path", { d: "M2 21v-2a4 4 0 0 1 4-4h6" }), _jsx("path", { d: "m18 13 1.2 2.6 2.8.3-2.1 1.9.6 2.7-2.5-1.4-2.5 1.4.6-2.7-2.1-1.9 2.8-.3z" })] })),
23
+ dollar: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8M12 18V6" })] })),
24
+ settings: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M12.2 2h-.4a2 2 0 0 0-2 2v.2a2 2 0 0 1-1 1.7l-.4.3a2 2 0 0 1-2 0l-.2-.1a2 2 0 0 0-2.7.7l-.2.4a2 2 0 0 0 .7 2.7l.2.1a2 2 0 0 1 1 1.7v.5a2 2 0 0 1-1 1.7l-.2.1a2 2 0 0 0-.7 2.7l.2.4a2 2 0 0 0 2.7.7l.2-.1a2 2 0 0 1 2 0l.4.3a2 2 0 0 1 1 1.7v.2a2 2 0 0 0 2 2h.4a2 2 0 0 0 2-2v-.2a2 2 0 0 1 1-1.7l.4-.3a2 2 0 0 1 2 0l.2.1a2 2 0 0 0 2.7-.7l.2-.4a2 2 0 0 0-.7-2.7l-.2-.1a2 2 0 0 1-1-1.7v-.5a2 2 0 0 1 1-1.7l.2-.1a2 2 0 0 0 .7-2.7l-.2-.4a2 2 0 0 0-2.7-.7l-.2.1a2 2 0 0 1-2 0l-.4-.3a2 2 0 0 1-1-1.7V4a2 2 0 0 0-2-2z" }), _jsx("circle", { cx: "12", cy: "12", r: "3" })] })),
25
+ };
26
+ /** A 16px stroke icon; `size` 12/14/20 for the artboards' xs/sm/lg. */
27
+ export function Icon({ name, size = 16 }) {
28
+ return (_jsx("svg", { className: "rastro-integrations__icon", viewBox: "0 0 24 24", width: size, height: size, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: LINES[name] }));
29
+ }
30
+ const META_PATH = "M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z";
31
+ const FACEBOOK_PATH = "M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z";
32
+ /** The Meta infinity mark, in Meta blue. */
33
+ export function MetaMark({ size = 16 }) {
34
+ return (_jsx("svg", { className: "rastro-integrations__brand", viewBox: "0 0 24 24", width: size, height: size, "aria-hidden": "true", children: _jsx("path", { fill: "#0866ff", d: META_PATH }) }));
35
+ }
36
+ /** The Facebook "f", white on the Meta-blue button. */
37
+ export function FacebookMark({ size = 16 }) {
38
+ return (_jsx("svg", { className: "rastro-integrations__brand", viewBox: "0 0 24 24", width: size, height: size, "aria-hidden": "true", children: _jsx("path", { fill: "currentColor", d: FACEBOOK_PATH }) }));
39
+ }
40
+ //# sourceMappingURL=Icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icons.js","sourceRoot":"","sources":["../../../src/ui/integrations/Icons.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { IntegrationsViewProps } from "./types.js";
2
+ /**
3
+ * Integrações: one Meta login for the agency, each client tied to its ad
4
+ * account and pixel, and which board columns go back to Meta as events. With
5
+ * `audience="business"`, the same screen for one company connecting its own
6
+ * Meta ("Conexão Meta"). Pure like the other views: data in through props,
7
+ * every write out through a callback the host turns into its own call.
8
+ */
9
+ export declare function IntegrationsView(props: IntegrationsViewProps): import("react").JSX.Element;
10
+ /**
11
+ * The header chip: "3 de 4 clientes ligados", or how many stopped; for one
12
+ * company, "Meta ligada" or "Meta parada".
13
+ */
14
+ export declare function IntegrationsBadge({ connection, sites, status, audience, }: Pick<IntegrationsViewProps, "connection" | "sites" | "status" | "audience">): import("react").JSX.Element | null;
15
+ //# sourceMappingURL=IntegrationsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntegrationsView.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/IntegrationsView.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAwB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAgG9E;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAS5D;AAyYD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,KAAK,EACL,MAAM,EACN,QAAmB,GACpB,EAAE,IAAI,CACL,qBAAqB,EACrB,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAC/C,sCA8BA"}
@@ -0,0 +1,141 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { ClientCards } from "./ClientCards.js";
4
+ import { ClientsTable, } from "./ClientsTable.js";
5
+ import { ConnectCard, FacebookButton, PlanBForm } from "./Connect.js";
6
+ import { ConnectionCard, ConnectionLine, ExpiryWarning, ReconnectPlan, RefusedBanner, } from "./Connection.js";
7
+ import { AudienceContext, ProductContext, useProductName } from "./audience.js";
8
+ import { DisconnectDialog, PlanBDialog } from "./Dialogs.js";
9
+ import { EventsFeed } from "./EventsFeed.js";
10
+ import { EventsSheet } from "./EventsSheet.js";
11
+ import { Icon, MetaMark } from "./Icons.js";
12
+ import { clientRows, eventMapCopyTargets, integrationsHeadline, suggestedAccount, } from "./model.js";
13
+ import { PartnerCard } from "./Partner.js";
14
+ import { UnlinkDialog } from "./UnlinkDialog.js";
15
+ function Loading() {
16
+ return (_jsxs("div", { className: "rastro-ui rastro-integrations", role: "status", "aria-busy": "true", "aria-label": "Carregando integra\u00E7\u00F5es", children: [_jsx("div", { className: "rastro-skeleton rastro-integrations__skeleton", "data-size": "sm" }), _jsx("div", { className: "rastro-skeleton rastro-integrations__skeleton" })] }));
17
+ }
18
+ /** The grant hint for a reader: same screen, read only, and why. */
19
+ function ReadOnlyNote({ business }) {
20
+ return (_jsxs("p", { className: "rastro-integrations__callout", "data-tone": "info", role: "note", children: [_jsx(Icon, { name: "lock", size: 14 }), business ? (_jsx("span", { children: "S\u00F3 quem gerencia a empresa conecta a Meta e muda a conta de an\u00FAncio, o pixel e os eventos. Voc\u00EA v\u00EA tudo aqui." })) : (_jsxs("span", { children: ["Esta conex\u00E3o \u00E9 somente leitura: d\u00E1 para ver tudo, mas conectar a Meta, ligar contas e mudar eventos pede ", _jsx("code", { children: "analytics:configure" }), " no grant do host."] }))] }));
21
+ }
22
+ /** "Esperando a janela da Meta…": the only part of B2 that is Rastro's. */
23
+ /**
24
+ * A manual popover sits in the top layer: `position: fixed` there means the
25
+ * viewport, whatever the host's ancestors transform or contain.
26
+ */
27
+ function useTopLayer() {
28
+ const ref = useRef(null);
29
+ useEffect(() => {
30
+ const element = ref.current;
31
+ if (element && typeof element.showPopover === "function")
32
+ element.showPopover();
33
+ }, []);
34
+ return ref;
35
+ }
36
+ /** M1/M3: the phone's action, fixed at the foot of the screen. */
37
+ function PhoneFoot({ children }) {
38
+ const ref = useTopLayer();
39
+ return (_jsx("div", { ref: ref, popover: "manual", className: "rastro-integrations__phone-foot", "data-narrow": "", children: children }));
40
+ }
41
+ function WaitingChip() {
42
+ const ref = useTopLayer();
43
+ const product = useProductName();
44
+ return (_jsxs("div", { ref: ref, popover: "manual", className: "rastro-integrations__waiting", role: "status", children: [_jsx("i", { className: "rastro-integrations__spin", "aria-hidden": "true" }), "Esperando a janela da Meta\u2026 o ", product, " valida o token e lista as contas ao voltar"] }));
45
+ }
46
+ /**
47
+ * Integrações: one Meta login for the agency, each client tied to its ad
48
+ * account and pixel, and which board columns go back to Meta as events. With
49
+ * `audience="business"`, the same screen for one company connecting its own
50
+ * Meta ("Conexão Meta"). Pure like the other views: data in through props,
51
+ * every write out through a callback the host turns into its own call.
52
+ */
53
+ export function IntegrationsView(props) {
54
+ const audience = props.audience ?? "agency";
55
+ return (_jsx(AudienceContext.Provider, { value: audience, children: _jsx(ProductContext.Provider, { value: props.productName ?? "Rastro", children: _jsx(Integrations, { ...props, audience: audience }) }) }));
56
+ }
57
+ function Integrations(props) {
58
+ const { audience, partner = null, productName = "Rastro", connection, status, conversions, adNames, eventMaps, sentBySite, unlinkPreviews, onRequestUnlinkPreview, permitted, busy = null, error, notice, now, loading, boardLabel = "Kanban", } = props;
59
+ const business = audience === "business";
60
+ // One company: the first site, whatever else the host passes.
61
+ const sites = business ? props.sites.slice(0, 1) : props.sites;
62
+ const company = business ? (sites[0] ?? null) : null;
63
+ const [overlay, setOverlay] = useState(null);
64
+ const [filter, setFilter] = useState(null);
65
+ const [staged, setStaged] = useState({});
66
+ if (loading || connection === undefined || status === undefined)
67
+ return _jsx(Loading, {});
68
+ if (sites.length === 0 && !business)
69
+ return (_jsx("div", { className: "rastro-ui rastro-integrations", children: _jsxs("div", { className: "rastro-card rastro-empty", children: [_jsx("strong", { children: "Nenhum cliente nesta conex\u00E3o" }), _jsx("span", { children: "Quando a conex\u00E3o autorizar um site, ele aparece aqui para ganhar a sua conta de an\u00FAncio." })] }) }));
70
+ const rows = clientRows({
71
+ sites,
72
+ connection,
73
+ status,
74
+ eventMaps,
75
+ sentBySite,
76
+ otherOwnerLabel: props.otherOwnerLabel ??
77
+ (business && partner ? `parceiro ${partner.name}` : undefined),
78
+ });
79
+ const refused = connection?.status === "invalid";
80
+ const activeFilter = filter ?? "all";
81
+ const currency = rows.find((row) => row.account)?.account?.currency ?? "BRL";
82
+ const stagedFor = (siteId) => {
83
+ if (siteId in staged)
84
+ return staged[siteId] ?? null;
85
+ const site = sites.find((entry) => entry.siteId === siteId);
86
+ return site && connection
87
+ ? suggestedAccount(site, connection.adAccounts)
88
+ : null;
89
+ };
90
+ const actions = {
91
+ permitted,
92
+ onPick: props.onLinkAccount,
93
+ onOpenEvents: (siteId) => setOverlay({ kind: "events", siteId }),
94
+ onUnlink: (siteId) => setOverlay({ kind: "unlink", siteId }),
95
+ onPlanB: (siteId) => setOverlay({ kind: "planB", siteId }),
96
+ onSetPixel: (siteId, pixelId) => props.onSetPixel(siteId, { pixelId }),
97
+ onChooseAssets: props.onChooseAssets,
98
+ };
99
+ const pickingRow = connection && !refused
100
+ ? rows.find((row) => row.state === "unlinked" && stagedFor(row.site.siteId))
101
+ : undefined;
102
+ const pickingChoice = pickingRow ? stagedFor(pickingRow.site.siteId) : null;
103
+ const syncing = rows.filter((row) => row.state === "syncing" && row.account?.syncState === "backfill");
104
+ const planB = rows.filter((row) => row.state === "planB");
105
+ const overlayRow = overlay && "siteId" in overlay
106
+ ? rows.find((row) => row.site.siteId === overlay.siteId)
107
+ : undefined;
108
+ const slotOf = (siteId) => Math.max(0, rows.findIndex((row) => row.site.siteId === siteId));
109
+ return (_jsxs("div", { className: "rastro-ui rastro-integrations", "data-state": !connection ? "offline" : refused ? "refused" : "connected", "data-foot": refused || pickingRow ? "" : undefined, children: [!permitted && _jsx(ReadOnlyNote, { business: business }), error && (_jsxs("p", { className: "rastro-integrations__callout", "data-tone": "bad", role: "alert", children: [_jsx(Icon, { name: "alert", size: 14 }), _jsx("span", { children: error })] })), notice && (_jsxs("p", { className: "rastro-integrations__callout", "data-tone": "ok", role: "status", children: [_jsx(Icon, { name: "check", size: 14 }), _jsx("span", { children: notice })] })), business && partner && company && (_jsx(PartnerCard, { partner: partner, row: rows[0], companyName: company.name, boardLabel: boardLabel, permitted: permitted })), connection && refused && (_jsxs(_Fragment, { children: [_jsx("div", { "data-wide": "", children: _jsx(RefusedBanner, { connection: connection, rows: rows }) }), _jsx("div", { "data-narrow": "", children: _jsx(RefusedBanner, { connection: connection, rows: rows, phone: true }) })] })), !connection ? (_jsxs("div", { className: "rastro-integrations__start", "data-single": sites.length === 0 ? "" : undefined, children: [_jsx(ConnectCard, { permitted: permitted, busy: busy === "connect", onConnect: props.onConnect, companyName: company?.name ?? null, productName: productName }), sites.length > 0 && (_jsx(PlanBForm, { sites: sites, permitted: permitted, busy: busy === "pixel", onSubmit: props.onSetPixel }))] })) : (_jsxs(_Fragment, { children: [_jsx("div", { "data-wide": "", children: _jsx(ConnectionCard, { connection: connection, permitted: permitted, busy: busy === "connect" || busy === "disconnect", onChooseAssets: props.onChooseAssets, onDisconnect: () => setOverlay({ kind: "disconnect" }), onReconnect: props.onReconnect }) }), _jsx(ExpiryWarning, { connection: connection, permitted: permitted, busy: busy === "connect", now: now, onReconnect: props.onReconnect }), !refused && (_jsx("div", { "data-narrow": "", children: _jsx(ConnectionLine, { connection: connection, permitted: permitted, onChooseAssets: props.onChooseAssets }) }))] })), sites.length === 0 ? (_jsxs("div", { className: "rastro-card rastro-empty", children: [_jsx("strong", { children: "Sua conta de an\u00FAncio aparece aqui" }), _jsx("span", { children: connection
110
+ ? "A empresa está sendo preparada: a conta de anúncio e o pixel aparecem em instantes."
111
+ : "Depois de conectar, a conta de anúncio e o pixel da empresa aparecem aqui." })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { "data-wide": "", children: _jsx(ClientsTable, { rows: rows, connection: connection, filter: activeFilter, onFilter: setFilter, actions: actions, now: now }) }), _jsx("div", { "data-narrow": "", children: _jsx(ClientCards, { rows: rows, connection: connection, staged: Object.fromEntries(rows.map((row) => [
112
+ row.site.siteId,
113
+ stagedFor(row.site.siteId),
114
+ ])), onStage: (siteId, adAccountId) => setStaged((current) => ({ ...current, [siteId]: adAccountId })), actions: actions, now: now }) })] })), !refused && syncing.length > 0 && (_jsxs("p", { className: "rastro-integrations__callout", "data-tone": "info", "data-wide": "", children: [_jsx(Icon, { name: "info", size: 14 }), _jsxs("span", { children: [syncing.map((row) => row.site.name).join(", "), " ", syncing.length === 1 ? "está" : "estão", " lendo os primeiros", " ", _jsx("b", { children: "90 dias" }), " da conta, um bloco de 30 dias por vez. At\u00E9 terminar, o gasto aparece como ", _jsx("b", { children: "\u201Csincronizando\u201D" }), ", nunca como zero, e fica fora do retorno", business ? "" : " da carteira", "."] })] })), refused && planB.length > 0 && (_jsxs("p", { className: "rastro-integrations__callout", "data-tone": "info", "data-wide": "", children: [_jsx(Icon, { name: "info", size: 14 }), _jsxs("span", { children: [planB.map((row) => row.site.name).join(", "), " ", planB.length === 1 ? "segue" : "seguem", " funcionando porque", " ", planB.length === 1 ? "usa" : "usam", " o ", _jsx("b", { children: "plano B" }), " (pixel + token da API de Convers\u00F5es pr\u00F3prio", business ? "" : " do cliente", "), que n\u00E3o depende do login", business ? "" : " da agência", "."] })] })), connection && refused && (_jsx("div", { "data-wide": "", children: _jsx(ReconnectPlan, { connection: connection, rows: rows }) })), connection && !refused && conversions && (_jsx("div", { "data-wide": "", children: _jsx(EventsFeed, { sites: sites, conversions: conversions, adNames: adNames, sentBySite: sentBySite, currency: currency, now: now }) })), (refused || pickingRow) && (_jsx(PhoneFoot, { children: refused ? (_jsx(FacebookButton, { label: "Reconectar com Facebook", disabled: !permitted || busy === "connect", onClick: props.onReconnect })) : (pickingRow &&
115
+ pickingChoice && (_jsxs("button", { type: "button", className: "rastro-integrations__btn", disabled: !permitted || busy === "link", onClick: () => props.onLinkAccount(pickingRow.site.siteId, pickingChoice), children: ["Ligar ", pickingRow.site.name] }))) })), busy === "connect" && _jsx(WaitingChip, {}), overlay?.kind === "events" && overlayRow && (_jsx(EventsSheet, { row: overlayRow, slot: slotOf(overlayRow.site.siteId), eventMap: overlayRow.eventMap, conversions: conversions?.[overlayRow.site.siteId] ?? [], pages: props.conversionPages?.[overlayRow.site.siteId], onLoadOlder: props.onLoadOlderConversions
116
+ ? () => props.onLoadOlderConversions?.(overlayRow.site.siteId)
117
+ : undefined, currency: currency, boardLabel: boardLabel, permitted: permitted, busy: busy === "events", onSave: (map) => props.onSaveEventMap(overlayRow.site.siteId, map), copyTargets: business || !props.onCopyEventMap
118
+ ? []
119
+ : eventMapCopyTargets(rows, overlayRow.site.siteId), onCopy: props.onCopyEventMap, onPlanB: () => setOverlay({ kind: "planB", siteId: overlayRow.site.siteId }), onClose: () => setOverlay(null), now: now }, `${overlayRow.site.siteId}:${overlayRow.eventMap ? 1 : 0}`)), overlay?.kind === "unlink" && overlayRow?.account && (_jsx(UnlinkDialog, { row: overlayRow, accounts: connection?.adAccounts ?? [], preview: unlinkPreviews?.[`${overlayRow.site.siteId}:${overlayRow.account.adAccountId}`], permitted: permitted, busy: busy === "unlink", onRequestPreview: () => onRequestUnlinkPreview?.(overlayRow.site.siteId, overlayRow.account.adAccountId), onConfirm: (replaceWith) => {
120
+ props.onUnlinkAccount(overlayRow.site.siteId, overlayRow.account.adAccountId, replaceWith);
121
+ setOverlay(null);
122
+ }, onClose: () => setOverlay(null) })), overlay?.kind === "planB" && (_jsx(PlanBDialog, { sites: sites, siteId: overlay.siteId, permitted: permitted, busy: busy === "pixel", onSubmit: props.onSetPixel, onClose: () => setOverlay(null) })), overlay?.kind === "disconnect" && (_jsx(DisconnectDialog, { linked: rows.filter((row) => row.account).length, busy: busy === "disconnect", onConfirm: props.onDisconnect, onClose: () => setOverlay(null) }))] }));
123
+ }
124
+ /**
125
+ * The header chip: "3 de 4 clientes ligados", or how many stopped; for one
126
+ * company, "Meta ligada" or "Meta parada".
127
+ */
128
+ export function IntegrationsBadge({ connection, sites, status, audience = "agency", }) {
129
+ if (!connection || !status)
130
+ return null;
131
+ const headline = integrationsHeadline(clientRows({
132
+ sites: audience === "business" ? sites.slice(0, 1) : sites,
133
+ connection,
134
+ status,
135
+ eventMaps: undefined,
136
+ }), connection, audience);
137
+ if (!headline)
138
+ return null;
139
+ return (_jsxs("span", { className: "rastro-ui rastro-integrations__badge", "data-tone": headline.tone, role: "status", children: [headline.tone === "bad" ? (_jsx(Icon, { name: "alert", size: 14 })) : (_jsxs(_Fragment, { children: [_jsx("i", { className: "rastro-integrations__dot", "aria-hidden": "true" }), _jsx(MetaMark, { size: 14 })] })), headline.text] }));
140
+ }
141
+ //# sourceMappingURL=IntegrationsView.js.map