@iann29/rastro 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/agent/integration.md +23 -1
- package/agent/manifest.json +4 -4
- package/dist/client/federation.d.ts +114 -9
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +54 -2
- package/dist/client/federation.js.map +1 -1
- package/dist/client/index.d.ts +642 -8
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +391 -9
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +14 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +278 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +4 -0
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/constants.d.ts +5 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +10 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/convex.config.d.ts +4 -0
- package/dist/component/convex.config.js +9 -0
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/errors.d.ts +1 -1
- package/dist/component/errors.d.ts.map +1 -1
- package/dist/component/errors.js.map +1 -1
- package/dist/component/leads.d.ts +69 -3
- package/dist/component/leads.d.ts.map +1 -1
- package/dist/component/leads.js +419 -16
- package/dist/component/leads.js.map +1 -1
- package/dist/component/meta.d.ts +358 -0
- package/dist/component/meta.d.ts.map +1 -0
- package/dist/component/meta.js +1295 -0
- package/dist/component/meta.js.map +1 -0
- package/dist/component/metaCapi.d.ts +162 -0
- package/dist/component/metaCapi.d.ts.map +1 -0
- package/dist/component/metaCapi.js +754 -0
- package/dist/component/metaCapi.js.map +1 -0
- package/dist/component/metaFake.d.ts +5 -0
- package/dist/component/metaFake.d.ts.map +1 -0
- package/dist/component/metaFake.js +225 -0
- package/dist/component/metaFake.js.map +1 -0
- package/dist/component/metaGraph.d.ts +165 -0
- package/dist/component/metaGraph.d.ts.map +1 -0
- package/dist/component/metaGraph.js +507 -0
- package/dist/component/metaGraph.js.map +1 -0
- package/dist/component/metaSync.d.ts +186 -0
- package/dist/component/metaSync.d.ts.map +1 -0
- package/dist/component/metaSync.js +961 -0
- package/dist/component/metaSync.js.map +1 -0
- package/dist/component/pipeline.d.ts +99 -0
- package/dist/component/pipeline.d.ts.map +1 -0
- package/dist/component/pipeline.js +337 -0
- package/dist/component/pipeline.js.map +1 -0
- package/dist/component/schema.d.ts +404 -2
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +168 -2
- package/dist/component/schema.js.map +1 -1
- package/dist/component/secrets.d.ts +15 -0
- package/dist/component/secrets.d.ts.map +1 -0
- package/dist/component/secrets.js +67 -0
- package/dist/component/secrets.js.map +1 -0
- package/dist/component/validators.d.ts +1052 -15
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +307 -3
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +1 -1
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +1 -1
- package/dist/tracker/generated.js.map +1 -1
- package/dist/ui/campaigns/CampaignsView.d.ts +48 -0
- package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -0
- package/dist/ui/campaigns/CampaignsView.js +47 -0
- package/dist/ui/campaigns/CampaignsView.js.map +1 -0
- package/dist/ui/campaigns/Conversions.d.ts +16 -0
- package/dist/ui/campaigns/Conversions.d.ts.map +1 -0
- package/dist/ui/campaigns/Conversions.js +40 -0
- package/dist/ui/campaigns/Conversions.js.map +1 -0
- package/dist/ui/campaigns/Drawer.d.ts +24 -0
- package/dist/ui/campaigns/Drawer.d.ts.map +1 -0
- package/dist/ui/campaigns/Drawer.js +120 -0
- package/dist/ui/campaigns/Drawer.js.map +1 -0
- package/dist/ui/campaigns/Icons.d.ts +35 -0
- package/dist/ui/campaigns/Icons.d.ts.map +1 -0
- package/dist/ui/campaigns/Icons.js +41 -0
- package/dist/ui/campaigns/Icons.js.map +1 -0
- package/dist/ui/campaigns/Summary.d.ts +21 -0
- package/dist/ui/campaigns/Summary.d.ts.map +1 -0
- package/dist/ui/campaigns/Summary.js +56 -0
- package/dist/ui/campaigns/Summary.js.map +1 -0
- package/dist/ui/campaigns/Thumbnail.d.ts +11 -0
- package/dist/ui/campaigns/Thumbnail.d.ts.map +1 -0
- package/dist/ui/campaigns/Thumbnail.js +23 -0
- package/dist/ui/campaigns/Thumbnail.js.map +1 -0
- package/dist/ui/campaigns/Tree.d.ts +12 -0
- package/dist/ui/campaigns/Tree.d.ts.map +1 -0
- package/dist/ui/campaigns/Tree.js +105 -0
- package/dist/ui/campaigns/Tree.js.map +1 -0
- package/dist/ui/campaigns/glyphs.d.ts +20 -0
- package/dist/ui/campaigns/glyphs.d.ts.map +1 -0
- package/dist/ui/campaigns/glyphs.js +19 -0
- package/dist/ui/campaigns/glyphs.js.map +1 -0
- package/dist/ui/campaigns/index.d.ts +4 -0
- package/dist/ui/campaigns/index.d.ts.map +1 -0
- package/dist/ui/campaigns/index.js +3 -0
- package/dist/ui/campaigns/index.js.map +1 -0
- package/dist/ui/campaigns/labels.d.ts +53 -0
- package/dist/ui/campaigns/labels.d.ts.map +1 -0
- package/dist/ui/campaigns/labels.js +169 -0
- package/dist/ui/campaigns/labels.js.map +1 -0
- package/dist/ui/campaigns/model.d.ts +99 -0
- package/dist/ui/campaigns/model.d.ts.map +1 -0
- package/dist/ui/campaigns/model.js +230 -0
- package/dist/ui/campaigns/model.js.map +1 -0
- package/dist/ui/campaigns/modes.d.ts +18 -0
- package/dist/ui/campaigns/modes.d.ts.map +1 -0
- package/dist/ui/campaigns/modes.js +7 -0
- package/dist/ui/campaigns/modes.js.map +1 -0
- package/dist/ui/index.d.ts +21 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +20 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/integrations/AccountPicker.d.ts +26 -0
- package/dist/ui/integrations/AccountPicker.d.ts.map +1 -0
- package/dist/ui/integrations/AccountPicker.js +101 -0
- package/dist/ui/integrations/AccountPicker.js.map +1 -0
- package/dist/ui/integrations/ClientCards.d.ts +17 -0
- package/dist/ui/integrations/ClientCards.d.ts.map +1 -0
- package/dist/ui/integrations/ClientCards.js +42 -0
- package/dist/ui/integrations/ClientCards.js.map +1 -0
- package/dist/ui/integrations/ClientsTable.d.ts +36 -0
- package/dist/ui/integrations/ClientsTable.d.ts.map +1 -0
- package/dist/ui/integrations/ClientsTable.js +143 -0
- package/dist/ui/integrations/ClientsTable.js.map +1 -0
- package/dist/ui/integrations/Connect.d.ts +35 -0
- package/dist/ui/integrations/Connect.d.ts.map +1 -0
- package/dist/ui/integrations/Connect.js +62 -0
- package/dist/ui/integrations/Connect.js.map +1 -0
- package/dist/ui/integrations/Connection.d.ts +37 -0
- package/dist/ui/integrations/Connection.d.ts.map +1 -0
- package/dist/ui/integrations/Connection.js +108 -0
- package/dist/ui/integrations/Connection.js.map +1 -0
- package/dist/ui/integrations/Dialogs.d.ts +21 -0
- package/dist/ui/integrations/Dialogs.d.ts.map +1 -0
- package/dist/ui/integrations/Dialogs.js +34 -0
- package/dist/ui/integrations/Dialogs.js.map +1 -0
- package/dist/ui/integrations/EventsFeed.d.ts +15 -0
- package/dist/ui/integrations/EventsFeed.d.ts.map +1 -0
- package/dist/ui/integrations/EventsFeed.js +61 -0
- package/dist/ui/integrations/EventsFeed.js.map +1 -0
- package/dist/ui/integrations/EventsSheet.d.ts +34 -0
- package/dist/ui/integrations/EventsSheet.d.ts.map +1 -0
- package/dist/ui/integrations/EventsSheet.js +136 -0
- package/dist/ui/integrations/EventsSheet.js.map +1 -0
- package/dist/ui/integrations/Icons.d.ts +38 -0
- package/dist/ui/integrations/Icons.d.ts.map +1 -0
- package/dist/ui/integrations/Icons.js +40 -0
- package/dist/ui/integrations/Icons.js.map +1 -0
- package/dist/ui/integrations/IntegrationsView.d.ts +15 -0
- package/dist/ui/integrations/IntegrationsView.d.ts.map +1 -0
- package/dist/ui/integrations/IntegrationsView.js +141 -0
- package/dist/ui/integrations/IntegrationsView.js.map +1 -0
- package/dist/ui/integrations/Overlay.d.ts +18 -0
- package/dist/ui/integrations/Overlay.d.ts.map +1 -0
- package/dist/ui/integrations/Overlay.js +36 -0
- package/dist/ui/integrations/Overlay.js.map +1 -0
- package/dist/ui/integrations/Partner.d.ts +14 -0
- package/dist/ui/integrations/Partner.d.ts.map +1 -0
- package/dist/ui/integrations/Partner.js +38 -0
- package/dist/ui/integrations/Partner.js.map +1 -0
- package/dist/ui/integrations/RowMenu.d.ts +15 -0
- package/dist/ui/integrations/RowMenu.d.ts.map +1 -0
- package/dist/ui/integrations/RowMenu.js +47 -0
- package/dist/ui/integrations/RowMenu.js.map +1 -0
- package/dist/ui/integrations/UnlinkDialog.d.ts +18 -0
- package/dist/ui/integrations/UnlinkDialog.d.ts.map +1 -0
- package/dist/ui/integrations/UnlinkDialog.js +29 -0
- package/dist/ui/integrations/UnlinkDialog.js.map +1 -0
- package/dist/ui/integrations/audience.d.ts +12 -0
- package/dist/ui/integrations/audience.d.ts.map +1 -0
- package/dist/ui/integrations/audience.js +12 -0
- package/dist/ui/integrations/audience.js.map +1 -0
- package/dist/ui/integrations/format.d.ts +28 -0
- package/dist/ui/integrations/format.d.ts.map +1 -0
- package/dist/ui/integrations/format.js +101 -0
- package/dist/ui/integrations/format.js.map +1 -0
- package/dist/ui/integrations/index.d.ts +5 -0
- package/dist/ui/integrations/index.d.ts.map +1 -0
- package/dist/ui/integrations/index.js +3 -0
- package/dist/ui/integrations/index.js.map +1 -0
- package/dist/ui/integrations/modal.d.ts +10 -0
- package/dist/ui/integrations/modal.d.ts.map +1 -0
- package/dist/ui/integrations/modal.js +77 -0
- package/dist/ui/integrations/modal.js.map +1 -0
- package/dist/ui/integrations/model.d.ts +99 -0
- package/dist/ui/integrations/model.d.ts.map +1 -0
- package/dist/ui/integrations/model.js +164 -0
- package/dist/ui/integrations/model.js.map +1 -0
- package/dist/ui/integrations/parts.d.ts +36 -0
- package/dist/ui/integrations/parts.d.ts.map +1 -0
- package/dist/ui/integrations/parts.js +85 -0
- package/dist/ui/integrations/parts.js.map +1 -0
- package/dist/ui/integrations/types.d.ts +146 -0
- package/dist/ui/integrations/types.d.ts.map +1 -0
- package/dist/ui/integrations/types.js +2 -0
- package/dist/ui/integrations/types.js.map +1 -0
- package/dist/ui/metrics.d.ts +106 -0
- package/dist/ui/metrics.d.ts.map +1 -0
- package/dist/ui/metrics.js +166 -0
- package/dist/ui/metrics.js.map +1 -0
- package/dist/ui/portfolio/PortfolioView.d.ts +26 -0
- package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -0
- package/dist/ui/portfolio/PortfolioView.js +216 -0
- package/dist/ui/portfolio/PortfolioView.js.map +1 -0
- package/dist/ui/portfolio/SpendChart.d.ts +10 -0
- package/dist/ui/portfolio/SpendChart.d.ts.map +1 -0
- package/dist/ui/portfolio/SpendChart.js +196 -0
- package/dist/ui/portfolio/SpendChart.js.map +1 -0
- package/dist/ui/portfolio/alerts.d.ts +74 -0
- package/dist/ui/portfolio/alerts.d.ts.map +1 -0
- package/dist/ui/portfolio/alerts.js +291 -0
- package/dist/ui/portfolio/alerts.js.map +1 -0
- package/dist/ui/portfolio/figures.d.ts +79 -0
- package/dist/ui/portfolio/figures.d.ts.map +1 -0
- package/dist/ui/portfolio/figures.js +103 -0
- package/dist/ui/portfolio/figures.js.map +1 -0
- package/dist/ui/portfolio/format.d.ts +8 -0
- package/dist/ui/portfolio/format.d.ts.map +1 -0
- package/dist/ui/portfolio/format.js +28 -0
- package/dist/ui/portfolio/format.js.map +1 -0
- package/dist/ui/sample.d.ts +536 -0
- package/dist/ui/sample.d.ts.map +1 -0
- package/dist/ui/sample.js +574 -0
- package/dist/ui/sample.js.map +1 -0
- package/dist/ui/seed.d.ts +188 -0
- package/dist/ui/seed.d.ts.map +1 -0
- package/dist/ui/seed.js +563 -0
- package/dist/ui/seed.js.map +1 -0
- package/dist/ui/ui.css +3424 -0
- package/docs/federation.md +46 -1
- package/docs/meta-ads.md +795 -0
- package/docs/upgrading.md +116 -0
- package/llms.txt +3 -0
- package/package.json +15 -3
- package/src/component/_generated/api.ts +14 -0
- package/src/component/_generated/component.ts +324 -1
- package/src/component/_generated/server.ts +4 -0
- package/src/component/constants.ts +10 -0
- package/src/component/convex.config.ts +9 -0
- package/src/component/errors.ts +5 -1
- package/src/component/leads.ts +517 -17
- package/src/component/meta.ts +1525 -0
- package/src/component/metaCapi.ts +921 -0
- package/src/component/metaFake.ts +277 -0
- package/src/component/metaGraph.ts +722 -0
- package/src/component/metaSync.ts +1164 -0
- package/src/component/pipeline.ts +410 -0
- package/src/component/schema.ts +197 -1
- package/src/component/secrets.ts +98 -0
- package/src/component/validators.ts +376 -3
- package/src/tracker/generated.ts +1 -1
- package/src/ui/seed.ts +755 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../../../src/ui/integrations/modal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The code a `lastError` starts with ("AD_ACCOUNT_NOT_GRANTED: grant it in
|
|
3
|
+
* Meta…" → "AD_ACCOUNT_NOT_GRANTED"); the host adds its explanation after it.
|
|
4
|
+
*/
|
|
5
|
+
export declare function errorCode(lastError: string | null | undefined): string | null;
|
|
6
|
+
import type { EventMap, IntegrationsAudience, IntegrationSite, IntegrationStatus, MetaConnection, SentCounts } from "./types.js";
|
|
7
|
+
type StatusSite = IntegrationStatus[number];
|
|
8
|
+
export type StatusAccount = StatusSite["adAccounts"][number];
|
|
9
|
+
/**
|
|
10
|
+
* - `offline`: the agency never connected Meta.
|
|
11
|
+
* - `unlinked`: connected, the client has no ad account yet.
|
|
12
|
+
* - `planB`: no account, but a pixel with the client's own token.
|
|
13
|
+
* - `live` / `syncing` / `error`: the linked account's sync.
|
|
14
|
+
* - `stopped`: the agency token was refused; the account waits for it.
|
|
15
|
+
*/
|
|
16
|
+
export type ClientState = "offline" | "unlinked" | "planB" | "live" | "syncing" | "error" | "stopped";
|
|
17
|
+
export interface ClientRow {
|
|
18
|
+
site: IntegrationSite;
|
|
19
|
+
state: ClientState;
|
|
20
|
+
account: StatusAccount | null;
|
|
21
|
+
/** The account's name in the connection's listing, when it has one. */
|
|
22
|
+
accountName: string | null;
|
|
23
|
+
pixel: {
|
|
24
|
+
pixelId: string;
|
|
25
|
+
name: string | null;
|
|
26
|
+
source: "connection" | "token" | null;
|
|
27
|
+
/** Set by another owner of the site ("uze.ai"): locked here. */
|
|
28
|
+
owner: string | null;
|
|
29
|
+
} | null;
|
|
30
|
+
/** The account was linked by another owner ("uze.ai"): locked here. */
|
|
31
|
+
accountOwner: string | null;
|
|
32
|
+
/**
|
|
33
|
+
* The site's pixel row is another owner's, even turned off (then `pixel`
|
|
34
|
+
* is null): its event map is theirs.
|
|
35
|
+
*/
|
|
36
|
+
pixelOwner: string | null;
|
|
37
|
+
pending: number;
|
|
38
|
+
sent: number;
|
|
39
|
+
failed: number;
|
|
40
|
+
eventMap: EventMap | undefined;
|
|
41
|
+
/** What the pixel got in 30 days, when the host says. */
|
|
42
|
+
sent30d: SentCounts | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* The Meta login no longer releases what the client uses: its account
|
|
45
|
+
* (`AD_ACCOUNT_NOT_GRANTED`) or its pixel (`PIXEL_NOT_GRANTED`).
|
|
46
|
+
*/
|
|
47
|
+
notGranted: "account" | "pixel" | null;
|
|
48
|
+
/**
|
|
49
|
+
* The pixel has a test event code: its sales reach only Meta's Test Events,
|
|
50
|
+
* never the ads' optimization.
|
|
51
|
+
*/
|
|
52
|
+
testMode: boolean;
|
|
53
|
+
/** Needs a hand: no account, or a sync that stopped. */
|
|
54
|
+
attention: boolean;
|
|
55
|
+
}
|
|
56
|
+
export declare function clientRows({ sites, connection, status, eventMaps, sentBySite, otherOwnerLabel, }: {
|
|
57
|
+
sites: readonly IntegrationSite[];
|
|
58
|
+
connection: MetaConnection | null;
|
|
59
|
+
status: IntegrationStatus | undefined;
|
|
60
|
+
eventMaps: Record<string, EventMap> | undefined;
|
|
61
|
+
sentBySite?: Record<string, SentCounts> | undefined;
|
|
62
|
+
/** Who `own: false` means: the site's other owner. */
|
|
63
|
+
otherOwnerLabel?: string;
|
|
64
|
+
}): ClientRow[];
|
|
65
|
+
/**
|
|
66
|
+
* What the host counted for the pixel: the last 30 UTC days by event and
|
|
67
|
+
* today. Absent from hosts before these counters, and null without `now`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function sentFromStatus(entry: IntegrationStatus[number] | undefined): SentCounts | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* The backfill's block in progress, "2 de 3": the blocks read plus the one
|
|
72
|
+
* running, never past the total.
|
|
73
|
+
*/
|
|
74
|
+
export declare function backfillStep(backfill: {
|
|
75
|
+
done: number;
|
|
76
|
+
total: number;
|
|
77
|
+
} | null | undefined): {
|
|
78
|
+
current: number;
|
|
79
|
+
total: number;
|
|
80
|
+
} | null;
|
|
81
|
+
/**
|
|
82
|
+
* "Usar o mesmo mapa nos outros clientes": the other clients the site's event
|
|
83
|
+
* map fits as is. Their board declares the same columns (a key it lacks would
|
|
84
|
+
* be refused), and their pixel is not another owner's (whoever linked the
|
|
85
|
+
* pixel decides its events).
|
|
86
|
+
*/
|
|
87
|
+
export declare function eventMapCopyTargets(rows: readonly ClientRow[], siteId: string): IntegrationSite[];
|
|
88
|
+
/** The account a client most likely owns: its name inside the account's. */
|
|
89
|
+
export declare function suggestedAccount(site: IntegrationSite, accounts: MetaConnection["adAccounts"]): string | null;
|
|
90
|
+
/**
|
|
91
|
+
* The header line: "3 de 4 clientes ligados", "3 clientes parados"; for one
|
|
92
|
+
* company (`business`), "Meta ligada", "Meta parada" or "Falta ligar a conta".
|
|
93
|
+
*/
|
|
94
|
+
export declare function integrationsHeadline(rows: readonly ClientRow[], connection: MetaConnection | null | undefined, audience?: IntegrationsAudience): {
|
|
95
|
+
tone: "ok" | "bad";
|
|
96
|
+
text: string;
|
|
97
|
+
} | null;
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where each client stands with Meta, read once from the connection, the
|
|
3
|
+
* status and the event maps, so the table, the phone cards and the summaries
|
|
4
|
+
* tell the same story.
|
|
5
|
+
*/
|
|
6
|
+
import { nameKey } from "./format.js";
|
|
7
|
+
/**
|
|
8
|
+
* The code a `lastError` starts with ("AD_ACCOUNT_NOT_GRANTED: grant it in
|
|
9
|
+
* Meta…" → "AD_ACCOUNT_NOT_GRANTED"); the host adds its explanation after it.
|
|
10
|
+
*/
|
|
11
|
+
export function errorCode(lastError) {
|
|
12
|
+
if (!lastError)
|
|
13
|
+
return null;
|
|
14
|
+
const match = /^([A-Z][A-Z0-9_]+)(?::|$)/.exec(lastError);
|
|
15
|
+
return match?.[1] ?? null;
|
|
16
|
+
}
|
|
17
|
+
function stateOf(connection, account, pixel) {
|
|
18
|
+
if (!account) {
|
|
19
|
+
if (pixel?.source === "token")
|
|
20
|
+
return "planB";
|
|
21
|
+
return connection ? "unlinked" : "offline";
|
|
22
|
+
}
|
|
23
|
+
if (connection?.status === "invalid")
|
|
24
|
+
return "stopped";
|
|
25
|
+
if (account.syncState === "error")
|
|
26
|
+
return "error";
|
|
27
|
+
if (account.syncState === "backfill" || account.lastSyncAt === null)
|
|
28
|
+
return "syncing";
|
|
29
|
+
return "live";
|
|
30
|
+
}
|
|
31
|
+
export function clientRows({ sites, connection, status, eventMaps, sentBySite, otherOwnerLabel = "uze.ai", }) {
|
|
32
|
+
const bySite = new Map((status ?? []).map((entry) => [entry.siteId, entry]));
|
|
33
|
+
const names = new Map((connection?.adAccounts ?? []).map((account) => [
|
|
34
|
+
account.adAccountId,
|
|
35
|
+
account.name,
|
|
36
|
+
]));
|
|
37
|
+
return sites.map((site) => {
|
|
38
|
+
const entry = bySite.get(site.siteId);
|
|
39
|
+
const account = entry?.adAccounts[0] ?? null;
|
|
40
|
+
const pixel = entry?.pixel.enabled && entry.pixel.pixelId
|
|
41
|
+
? {
|
|
42
|
+
pixelId: entry.pixel.pixelId,
|
|
43
|
+
name: entry.pixel.name ?? null,
|
|
44
|
+
source: entry.pixel.source ?? null,
|
|
45
|
+
// `own` is false only for another owner's pixel; a pixel set
|
|
46
|
+
// before owners were recorded counts as the host's.
|
|
47
|
+
owner: entry.pixel.own === false ? otherOwnerLabel : null,
|
|
48
|
+
}
|
|
49
|
+
: null;
|
|
50
|
+
const notGranted = errorCode(account?.lastError) === "AD_ACCOUNT_NOT_GRANTED"
|
|
51
|
+
? "account"
|
|
52
|
+
: errorCode(entry?.pixel.lastError) === "PIXEL_NOT_GRANTED"
|
|
53
|
+
? "pixel"
|
|
54
|
+
: null;
|
|
55
|
+
const state = notGranted ? "error" : stateOf(connection, account, pixel);
|
|
56
|
+
return {
|
|
57
|
+
site,
|
|
58
|
+
state,
|
|
59
|
+
account,
|
|
60
|
+
accountName: account
|
|
61
|
+
? (names.get(account.adAccountId) ?? account.name)
|
|
62
|
+
: null,
|
|
63
|
+
pixel,
|
|
64
|
+
accountOwner: account?.own === false ? otherOwnerLabel : null,
|
|
65
|
+
pixelOwner: entry?.pixel.own === false ? otherOwnerLabel : null,
|
|
66
|
+
notGranted,
|
|
67
|
+
testMode: pixel !== null && entry?.pixel.testMode === true,
|
|
68
|
+
pending: entry?.conversions.pending ?? 0,
|
|
69
|
+
sent: entry?.conversions.sent ?? 0,
|
|
70
|
+
failed: entry?.conversions.failed ?? 0,
|
|
71
|
+
eventMap: eventMaps?.[site.siteId],
|
|
72
|
+
sent30d: sentBySite?.[site.siteId] ?? sentFromStatus(entry),
|
|
73
|
+
attention: state === "unlinked" || state === "error" || state === "stopped",
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* What the host counted for the pixel: the last 30 UTC days by event and
|
|
79
|
+
* today. Absent from hosts before these counters, and null without `now`.
|
|
80
|
+
*/
|
|
81
|
+
export function sentFromStatus(entry) {
|
|
82
|
+
const last30d = entry?.conversions.last30d;
|
|
83
|
+
if (!last30d)
|
|
84
|
+
return undefined;
|
|
85
|
+
const sentToday = entry.conversions.sentToday;
|
|
86
|
+
return {
|
|
87
|
+
...last30d,
|
|
88
|
+
...(sentToday === null || sentToday === undefined
|
|
89
|
+
? {}
|
|
90
|
+
: { today: { sent: sentToday } }),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The backfill's block in progress, "2 de 3": the blocks read plus the one
|
|
95
|
+
* running, never past the total.
|
|
96
|
+
*/
|
|
97
|
+
export function backfillStep(backfill) {
|
|
98
|
+
if (!backfill || backfill.total <= 0)
|
|
99
|
+
return null;
|
|
100
|
+
return {
|
|
101
|
+
current: Math.min(backfill.done + 1, backfill.total),
|
|
102
|
+
total: backfill.total,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* "Usar o mesmo mapa nos outros clientes": the other clients the site's event
|
|
107
|
+
* map fits as is. Their board declares the same columns (a key it lacks would
|
|
108
|
+
* be refused), and their pixel is not another owner's (whoever linked the
|
|
109
|
+
* pixel decides its events).
|
|
110
|
+
*/
|
|
111
|
+
export function eventMapCopyTargets(rows, siteId) {
|
|
112
|
+
const source = rows.find((row) => row.site.siteId === siteId)?.eventMap;
|
|
113
|
+
const keys = new Set(source?.columns.map((column) => column.key));
|
|
114
|
+
if (keys.size === 0)
|
|
115
|
+
return [];
|
|
116
|
+
return rows
|
|
117
|
+
.filter((row) => row.site.siteId !== siteId &&
|
|
118
|
+
!row.pixelOwner &&
|
|
119
|
+
row.eventMap !== undefined &&
|
|
120
|
+
row.eventMap.columns.length === keys.size &&
|
|
121
|
+
row.eventMap.columns.every((column) => keys.has(column.key)))
|
|
122
|
+
.map((row) => row.site);
|
|
123
|
+
}
|
|
124
|
+
/** The account a client most likely owns: its name inside the account's. */
|
|
125
|
+
export function suggestedAccount(site, accounts) {
|
|
126
|
+
const key = nameKey(site.name);
|
|
127
|
+
if (!key)
|
|
128
|
+
return null;
|
|
129
|
+
const free = accounts.filter((account) => account.linkedSiteId === null && !account.linkedOutsideScope);
|
|
130
|
+
const match = free.find((account) => nameKey(account.name).startsWith(key)) ??
|
|
131
|
+
free.find((account) => nameKey(account.name).includes(key)) ??
|
|
132
|
+
free.find((account) => key.includes(nameKey(account.name)));
|
|
133
|
+
return match?.adAccountId ?? null;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The header line: "3 de 4 clientes ligados", "3 clientes parados"; for one
|
|
137
|
+
* company (`business`), "Meta ligada", "Meta parada" or "Falta ligar a conta".
|
|
138
|
+
*/
|
|
139
|
+
export function integrationsHeadline(rows, connection, audience = "agency") {
|
|
140
|
+
if (!connection || rows.length === 0)
|
|
141
|
+
return null;
|
|
142
|
+
const stopped = rows.filter((row) => row.state === "stopped" || row.state === "error").length;
|
|
143
|
+
if (audience === "business") {
|
|
144
|
+
if (stopped > 0)
|
|
145
|
+
return { tone: "bad", text: "Meta parada" };
|
|
146
|
+
if (rows.some((row) => row.account !== null))
|
|
147
|
+
return { tone: "ok", text: "Meta ligada" };
|
|
148
|
+
// Plan B alone sends the sales without reading spend.
|
|
149
|
+
return rows.some((row) => row.state === "planB")
|
|
150
|
+
? { tone: "ok", text: "Pixel ligado · plano B" }
|
|
151
|
+
: { tone: "ok", text: "Falta ligar a conta" };
|
|
152
|
+
}
|
|
153
|
+
if (stopped > 0)
|
|
154
|
+
return {
|
|
155
|
+
tone: "bad",
|
|
156
|
+
text: `${stopped} ${stopped === 1 ? "cliente parado" : "clientes parados"}`,
|
|
157
|
+
};
|
|
158
|
+
const linked = rows.filter((row) => row.account !== null).length;
|
|
159
|
+
return {
|
|
160
|
+
tone: "ok",
|
|
161
|
+
text: `${linked} de ${rows.length} ${rows.length === 1 ? "cliente ligado" : "clientes ligados"}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/ui/integrations/model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,SAAoC;IAC5D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AA+DD,SAAS,OAAO,CACd,UAAiC,EACjC,OAA6B,EAC7B,KAAyB;IAEzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,KAAK,EAAE,MAAM,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QAC9C,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IACD,IAAI,UAAU,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACvD,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAClD,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QACjE,OAAO,SAAS,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,UAAU,EACV,MAAM,EACN,SAAS,EACT,UAAU,EACV,eAAe,GAAG,QAAQ,GAS3B;IACC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,IAAI;KACb,CAAC,CACH,CAAC;IACF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC7C,MAAM,KAAK,GACT,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;YACzC,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;gBAC5B,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI;gBAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI;gBAClC,6DAA6D;gBAC7D,oDAAoD;gBACpD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;aAC1D;YACH,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,UAAU,GACd,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,wBAAwB;YACxD,CAAC,CAAE,SAAmB;YACtB,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,mBAAmB;gBACzD,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAC,IAAI,CAAC;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACzE,OAAO;YACL,IAAI;YACJ,KAAK;YACL,OAAO;YACP,WAAW,EAAE,OAAO;gBAClB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;gBAClD,CAAC,CAAC,IAAI;YACR,KAAK;YACL,YAAY,EAAE,OAAO,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAC7D,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;YAC/D,UAAU;YACV,QAAQ,EAAE,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI;YAC1D,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,IAAI,CAAC;YACxC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC;YAClC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC;YACtC,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC;YAC3D,SAAS,EACP,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS;SACnE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,KAA4C;IAE5C,MAAM,OAAO,GAAG,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;IAC9C,OAAO;QACL,GAAG,OAAO;QACV,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA4D;IAE5D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;QACpD,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA0B,EAC1B,MAAc;IAEd,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,IAAI;SACR,MAAM,CACL,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAC1B,CAAC,GAAG,CAAC,UAAU;QACf,GAAG,CAAC,QAAQ,KAAK,SAAS;QAC1B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI;QACzC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC/D;SACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB,CAC9B,IAAqB,EACrB,QAAsC;IAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAC1E,CAAC;IACF,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAA0B,EAC1B,UAA6C,EAC7C,QAAQ,GAAyB,QAAQ;IAEzC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CACzB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAC1D,CAAC,MAAM,CAAC;IACT,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC7D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC7C,sDAAsD;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,wBAAwB,EAAE;YAChD,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC;QACb,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,GAAG,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,EAAE;SAC5E,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO;QACL,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,EAAE;KACjG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type IconName } from "./Icons.js";
|
|
3
|
+
import { type ClientRow } from "./model.js";
|
|
4
|
+
export type PillTone = "ok" | "sync" | "bad" | "warn" | "ghost" | "plain";
|
|
5
|
+
/** A rounded status chip: a dot, a spinner or an icon, then its words. */
|
|
6
|
+
export declare function Pill({ tone, icon, children, }: {
|
|
7
|
+
tone: PillTone;
|
|
8
|
+
icon?: IconName | "dot" | "spin";
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
export declare const TEST_MODE_TEXT = "Modo de teste: as vendas v\u00E3o s\u00F3 para o Test Events da Meta";
|
|
12
|
+
/**
|
|
13
|
+
* The pixel has a test event code (`metaStatus.pixel.testMode`): what is sent
|
|
14
|
+
* shows up in Meta's Test Events and nowhere else. `line` is the client row's
|
|
15
|
+
* and the phone card's chip; the events sheet says it as a callout.
|
|
16
|
+
*/
|
|
17
|
+
export declare function TestModeNote({ variant }: {
|
|
18
|
+
variant: "line" | "callout";
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** A client's initials in its color slot (the order the agency lists them). */
|
|
21
|
+
export declare function Avatar({ name, slot, size, }: {
|
|
22
|
+
name: string;
|
|
23
|
+
slot: number;
|
|
24
|
+
size?: "sm" | "md" | "lg";
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
/** The Estado chip: how the client's account syncs. */
|
|
27
|
+
export declare function StateChip({ row, now, compact, }: {
|
|
28
|
+
row: ClientRow;
|
|
29
|
+
now: number;
|
|
30
|
+
compact?: boolean;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
/** "41 vendas · 118 qualificados": what the pixel got in 30 days. */
|
|
33
|
+
export declare function sentSummary(row: ClientRow, { compact }?: {
|
|
34
|
+
compact?: boolean | undefined;
|
|
35
|
+
}): string | null;
|
|
36
|
+
//# sourceMappingURL=parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E,0EAA0E;AAC1E,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAaA;AAED,eAAO,MAAM,cAAc,yEACmC,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,+BA6BxE;AAED,+EAA+E;AAC/E,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,IAAI,EACJ,IAAW,GACZ,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B,+BAWA;AAED,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,GAAG,EACH,OAAe,GAChB,EAAE;IACD,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BA6DA;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,OAAe,EAAE;;CAAK,iBAcnE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { initials } from "../portfolio/format.js";
|
|
3
|
+
import { agoLabel, plural } from "./format.js";
|
|
4
|
+
import { Icon } from "./Icons.js";
|
|
5
|
+
import { backfillStep } from "./model.js";
|
|
6
|
+
/** A rounded status chip: a dot, a spinner or an icon, then its words. */
|
|
7
|
+
export function Pill({ tone, icon, children, }) {
|
|
8
|
+
return (_jsxs("span", { className: "rastro-integrations__pill", "data-tone": tone, children: [icon === "dot" ? (_jsx("i", { className: "rastro-integrations__dot", "aria-hidden": "true" })) : icon === "spin" ? (_jsx("i", { className: "rastro-integrations__spin", "aria-hidden": "true" })) : icon ? (_jsx(Icon, { name: icon, size: 12 })) : null, children] }));
|
|
9
|
+
}
|
|
10
|
+
export const TEST_MODE_TEXT = "Modo de teste: as vendas vão só para o Test Events da Meta";
|
|
11
|
+
/**
|
|
12
|
+
* The pixel has a test event code (`metaStatus.pixel.testMode`): what is sent
|
|
13
|
+
* shows up in Meta's Test Events and nowhere else. `line` is the client row's
|
|
14
|
+
* and the phone card's chip; the events sheet says it as a callout.
|
|
15
|
+
*/
|
|
16
|
+
export function TestModeNote({ variant }) {
|
|
17
|
+
if (variant === "callout")
|
|
18
|
+
return (_jsxs("div", { className: "rastro-integrations__callout", "data-tone": "warn", role: "note", children: [_jsx(Icon, { name: "alert", size: 14 }), _jsxs("p", { children: [_jsx("b", { children: "Modo de teste:" }), " as vendas v\u00E3o s\u00F3 para o Test Events da Meta. Tire o c\u00F3digo de teste do pixel para elas contarem nos an\u00FAncios."] })] }));
|
|
19
|
+
return (_jsxs("span", { className: "rastro-integrations__test-mode", role: "note", title: TEST_MODE_TEXT, children: [_jsx(Pill, { tone: "warn", icon: "alert", children: "Modo de teste" }), _jsx("span", { className: "rastro-integrations__meta", children: "as vendas v\u00E3o s\u00F3 para o Test Events da Meta" })] }));
|
|
20
|
+
}
|
|
21
|
+
/** A client's initials in its color slot (the order the agency lists them). */
|
|
22
|
+
export function Avatar({ name, slot, size = "md", }) {
|
|
23
|
+
return (_jsx("span", { className: "rastro-integrations__avatar", "data-hue": slot % 6, "data-size": size, "aria-hidden": "true", children: initials(name) }));
|
|
24
|
+
}
|
|
25
|
+
/** The Estado chip: how the client's account syncs. */
|
|
26
|
+
export function StateChip({ row, now, compact = false, }) {
|
|
27
|
+
const step = backfillStep(row.account?.backfill);
|
|
28
|
+
const chunk = step ? `${step.current} de ${step.total}` : null;
|
|
29
|
+
switch (row.state) {
|
|
30
|
+
case "offline":
|
|
31
|
+
return _jsx(Pill, { tone: "ghost", children: "Meta n\u00E3o conectada" });
|
|
32
|
+
case "unlinked":
|
|
33
|
+
return _jsx(Pill, { tone: "ghost", children: "Sem conta de an\u00FAncio" });
|
|
34
|
+
case "planB":
|
|
35
|
+
return (_jsx(Pill, { tone: "ok", icon: "dot", children: "Pixel ok \u00B7 plano B" }));
|
|
36
|
+
case "syncing":
|
|
37
|
+
return (_jsx(Pill, { tone: "sync", icon: "spin", children: compact
|
|
38
|
+
? chunk
|
|
39
|
+
? `Sincronizando ${chunk}`
|
|
40
|
+
: "Sincronizando"
|
|
41
|
+
: chunk
|
|
42
|
+
? `Sincronizando 90 dias · ${chunk}`
|
|
43
|
+
: "Sincronizando 90 dias" }));
|
|
44
|
+
case "error":
|
|
45
|
+
return (_jsx(Pill, { tone: "bad", icon: "alert", children: row.notGranted === "account"
|
|
46
|
+
? compact
|
|
47
|
+
? "Conta não liberada"
|
|
48
|
+
: "Conta não liberada nesta conexão"
|
|
49
|
+
: row.notGranted === "pixel"
|
|
50
|
+
? compact
|
|
51
|
+
? "Pixel não liberado"
|
|
52
|
+
: "Pixel não liberado nesta conexão"
|
|
53
|
+
: compact
|
|
54
|
+
? "Erro"
|
|
55
|
+
: "Erro na leitura" }));
|
|
56
|
+
case "stopped":
|
|
57
|
+
return (_jsx(Pill, { tone: "bad", icon: "alert", children: row.account?.syncState === "backfill" && chunk
|
|
58
|
+
? `Parado no bloco ${chunk}`
|
|
59
|
+
: compact
|
|
60
|
+
? "Parado"
|
|
61
|
+
: "Parado · token recusado" }));
|
|
62
|
+
case "live":
|
|
63
|
+
return (_jsx(Pill, { tone: "ok", icon: "dot", children: compact
|
|
64
|
+
? `Ao vivo · ${agoLabel(row.account.lastSyncAt, now, { short: true })}`
|
|
65
|
+
: `Ao vivo · ${agoLabel(row.account.lastSyncAt, now)}` }));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** "41 vendas · 118 qualificados": what the pixel got in 30 days. */
|
|
69
|
+
export function sentSummary(row, { compact = false } = {}) {
|
|
70
|
+
const sent = row.sent30d;
|
|
71
|
+
if (!sent) {
|
|
72
|
+
return row.sent > 0 ? plural(row.sent, "enviado", "enviados") : null;
|
|
73
|
+
}
|
|
74
|
+
const sales = sent.Purchase ?? 0;
|
|
75
|
+
const qualified = sent.QualifiedLead ?? 0;
|
|
76
|
+
if (compact)
|
|
77
|
+
return plural(sales, "venda", "vendas");
|
|
78
|
+
return [
|
|
79
|
+
plural(sales, "venda", "vendas"),
|
|
80
|
+
qualified > 0 ? plural(qualified, "qualificado", "qualificados") : null,
|
|
81
|
+
]
|
|
82
|
+
.filter(Boolean)
|
|
83
|
+
.join(" · ");
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.js","sourceRoot":"","sources":["../../../src/ui/integrations/parts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shapes the Integrações screen reads: the component's Meta reads
|
|
3
|
+
* (contract §11.1) re-exported from the client, plus the optional fields the
|
|
4
|
+
* approved artboards draw beyond them (marked "screen"). A host that does not
|
|
5
|
+
* send a screen field gets a plainer line, never a wrong one.
|
|
6
|
+
*/
|
|
7
|
+
import type { EventMap, EventMapColumn, MetaColumnEvent, MetaConnection, MetaConnectionAdAccount, MetaConversion, MetaPixel, MetaPixelSource, MetaStatus, SetEventMapInput, UnlinkPreview } from "../../client/index.js";
|
|
8
|
+
export type { EventMap, EventMapColumn, MetaColumnEvent, MetaConnection, MetaConnectionAdAccount, MetaPixel, MetaPixelSource, SetEventMapInput, UnlinkPreview, };
|
|
9
|
+
/** Every event Meta receives: the columns' and the sale's Purchase. */
|
|
10
|
+
export type MetaEventName = MetaColumnEvent | "Purchase";
|
|
11
|
+
/**
|
|
12
|
+
* Screen: events the site's pixel got in the last 30 days, per name, and the
|
|
13
|
+
* failures ("41 vendas · 118 qualificados"). Not in §11.1 yet; without it the
|
|
14
|
+
* screen counts `meta.status` sends instead.
|
|
15
|
+
*/
|
|
16
|
+
export type SentCounts = Partial<Record<MetaEventName, number>> & {
|
|
17
|
+
failed?: number;
|
|
18
|
+
/** Today (UTC, as the host counts it): the feed's "60 enviados hoje". */
|
|
19
|
+
today?: {
|
|
20
|
+
sent: number;
|
|
21
|
+
failed?: number;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/** A site's Meta status (`meta.status`) with the fields §11.1 adds. */
|
|
25
|
+
export type IntegrationStatus = Array<Omit<MetaStatus[number], "pixel" | "adAccounts"> & {
|
|
26
|
+
adAccounts: MetaStatus[number]["adAccounts"];
|
|
27
|
+
pixel: MetaStatus[number]["pixel"];
|
|
28
|
+
}>;
|
|
29
|
+
/** A conversion with the event names §11.1 adds (Schedule). */
|
|
30
|
+
export type IntegrationConversion = Omit<MetaConversion, "eventName"> & {
|
|
31
|
+
eventName: MetaEventName;
|
|
32
|
+
};
|
|
33
|
+
export interface IntegrationSite {
|
|
34
|
+
siteId: string;
|
|
35
|
+
name: string;
|
|
36
|
+
segment?: string;
|
|
37
|
+
}
|
|
38
|
+
/** The pixel to set: one the connection lists, or plan B with its own token. */
|
|
39
|
+
export type PixelChoice = {
|
|
40
|
+
pixelId: string;
|
|
41
|
+
} | {
|
|
42
|
+
pixelId: string;
|
|
43
|
+
accessToken: string;
|
|
44
|
+
};
|
|
45
|
+
/** The write in flight, so its control can say so. */
|
|
46
|
+
export type IntegrationsBusy = "connect" | "disconnect" | "link" | "unlink" | "pixel" | "events" | null;
|
|
47
|
+
/**
|
|
48
|
+
* Who reads the screen:
|
|
49
|
+
* - `agency`: one Meta login for many clients, each tied to its account;
|
|
50
|
+
* - `business`: one company connecting its own Meta (the first site only).
|
|
51
|
+
*/
|
|
52
|
+
export type IntegrationsAudience = "agency" | "business";
|
|
53
|
+
/** What the events sheet saves for a site: the map without who saves it. */
|
|
54
|
+
export type EventMapChoice = Omit<SetEventMapInput, "siteId" | "ownerKey">;
|
|
55
|
+
/**
|
|
56
|
+
* Business: the partner (an agency) who runs the company's Meta, and whether
|
|
57
|
+
* the company lets them (B2). The locks read "Ligado pelo parceiro <name>".
|
|
58
|
+
*/
|
|
59
|
+
export interface IntegrationsPartner {
|
|
60
|
+
/** "Gio", as in "O parceiro Gio cuida dos seus anúncios na Meta". */
|
|
61
|
+
name: string;
|
|
62
|
+
/**
|
|
63
|
+
* The company's "Deixar Gio ver as campanhas": the partner sees the
|
|
64
|
+
* campaigns and links the account and the pixel. Unchecking takes out what
|
|
65
|
+
* the partner linked; the host does it in `onAllowedChange`.
|
|
66
|
+
*/
|
|
67
|
+
allowed: boolean;
|
|
68
|
+
/** Without it the checkbox is not drawn (only the partner's card). */
|
|
69
|
+
onAllowedChange?: (allowed: boolean) => void;
|
|
70
|
+
/** The change is on its way: the checkbox waits. */
|
|
71
|
+
busy?: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface IntegrationsViewProps {
|
|
74
|
+
/**
|
|
75
|
+
* `agency` by default. `business` speaks to the owner of one company: no
|
|
76
|
+
* "agência" or "clientes", the first site only, "Sua conta de anúncio".
|
|
77
|
+
*/
|
|
78
|
+
audience?: IntegrationsAudience;
|
|
79
|
+
/** Business: the partner who runs the company's Meta (B2's card). */
|
|
80
|
+
partner?: IntegrationsPartner | null;
|
|
81
|
+
/**
|
|
82
|
+
* Who reads the spend and sends the sales ("o uze lê o gasto e devolve as
|
|
83
|
+
* vendas", "o uze avisa o pixel"): "Rastro" by default. The agency's login
|
|
84
|
+
* card keeps "o Rastro", the name Meta shows for the app.
|
|
85
|
+
*/
|
|
86
|
+
productName?: string;
|
|
87
|
+
/** undefined while loading; null when the owner never connected Meta. */
|
|
88
|
+
connection: MetaConnection | null | undefined;
|
|
89
|
+
/** Agency: every client. Business: the company, `sites[0]`. */
|
|
90
|
+
sites: readonly IntegrationSite[];
|
|
91
|
+
/** `meta.status` for the sites; undefined while loading. */
|
|
92
|
+
status: IntegrationStatus | undefined;
|
|
93
|
+
/** The latest conversions per site (`meta.conversions`). */
|
|
94
|
+
conversions?: Record<string, readonly IntegrationConversion[]> | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Older pages of a site's conversions: whether the host has more past the
|
|
97
|
+
* last row loaded, and whether a page is on its way. The events sheet's
|
|
98
|
+
* "Ver mais" asks for the next one with `onLoadOlderConversions`.
|
|
99
|
+
*/
|
|
100
|
+
conversionPages?: Record<string, {
|
|
101
|
+
hasMore: boolean;
|
|
102
|
+
loading: boolean;
|
|
103
|
+
}> | undefined;
|
|
104
|
+
onLoadOlderConversions?: (siteId: string) => void;
|
|
105
|
+
/** Screen: ad names by id, for the feed's "Vídeo provador 15s". */
|
|
106
|
+
adNames?: Record<string, string> | undefined;
|
|
107
|
+
eventMaps?: Record<string, EventMap> | undefined;
|
|
108
|
+
/** Screen: 30-day sends per site (see `SentCounts`). */
|
|
109
|
+
sentBySite?: Record<string, SentCounts> | undefined;
|
|
110
|
+
/** Previews keyed `${siteId}:${adAccountId}`, asked for when the dialog opens. */
|
|
111
|
+
unlinkPreviews?: Record<string, UnlinkPreview | null | undefined> | undefined;
|
|
112
|
+
onRequestUnlinkPreview?: (siteId: string, adAccountId: string) => void;
|
|
113
|
+
/**
|
|
114
|
+
* Who links and sets what `metaStatus` marks `own: false` (another owner
|
|
115
|
+
* of the same site): "uze.ai" by default, as in "Ligado pelo uze.ai";
|
|
116
|
+
* with a `partner`, "parceiro <name>".
|
|
117
|
+
*/
|
|
118
|
+
otherOwnerLabel?: string;
|
|
119
|
+
/** False for a reader without configure: the same screen, read only. */
|
|
120
|
+
permitted: boolean;
|
|
121
|
+
busy?: IntegrationsBusy;
|
|
122
|
+
/** The last write's refusal, in pt-BR. */
|
|
123
|
+
error?: string | null;
|
|
124
|
+
/** The last write's good news ("Meta conectada: 4 contas e 3 pixels…"). */
|
|
125
|
+
notice?: string | null;
|
|
126
|
+
onConnect: () => void;
|
|
127
|
+
onReconnect: () => void;
|
|
128
|
+
onChooseAssets: () => void;
|
|
129
|
+
onDisconnect: () => void;
|
|
130
|
+
onLinkAccount: (siteId: string, adAccountId: string) => void;
|
|
131
|
+
onUnlinkAccount: (siteId: string, adAccountId: string, replaceWith?: string) => void;
|
|
132
|
+
onSetPixel: (siteId: string, pixel: PixelChoice) => void;
|
|
133
|
+
onSaveEventMap: (siteId: string, map: EventMapChoice) => void;
|
|
134
|
+
/**
|
|
135
|
+
* Agency: "Usar o mesmo mapa nos outros clientes" in the events sheet. Right
|
|
136
|
+
* after `onSaveEventMap`, the same map for the other clients whose board
|
|
137
|
+
* declares the same columns and whose pixel is not another owner's. Without
|
|
138
|
+
* it the sheet draws no such control.
|
|
139
|
+
*/
|
|
140
|
+
onCopyEventMap?: (siteIds: string[], map: EventMapChoice) => void;
|
|
141
|
+
/** How the host calls its board ("Kanban do uze"); "Kanban" by default. */
|
|
142
|
+
boardLabel?: string;
|
|
143
|
+
now: number;
|
|
144
|
+
loading?: boolean;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/integrations/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ui/integrations/types.ts"],"names":[],"mappings":""}
|