@manta-eu/react 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/components/button/index.d.ts +1 -0
  2. package/dist/components/button/index.d.ts.map +1 -1
  3. package/dist/components/button/index.js +17 -1
  4. package/dist/components/button/index.js.map +1 -1
  5. package/dist/components/chat-view/ToolApprovalPart.d.ts +12 -0
  6. package/dist/components/chat-view/ToolApprovalPart.d.ts.map +1 -0
  7. package/dist/components/chat-view/ToolApprovalPart.js +12 -0
  8. package/dist/components/chat-view/ToolApprovalPart.js.map +1 -0
  9. package/dist/components/chat-view/ToolMessagePart.d.ts.map +1 -1
  10. package/dist/components/chat-view/ToolMessagePart.js +7 -15
  11. package/dist/components/chat-view/ToolMessagePart.js.map +1 -1
  12. package/dist/components/chat-view/tool-part-rendering.js +1 -1
  13. package/dist/components/chat-view/tool-part-rendering.js.map +1 -1
  14. package/dist/components/modal/index.d.ts +4 -0
  15. package/dist/components/modal/index.d.ts.map +1 -1
  16. package/dist/components/modal/index.js +11 -3
  17. package/dist/components/modal/index.js.map +1 -1
  18. package/dist/components/planning/ActionPlanDetailView.d.ts +1 -0
  19. package/dist/components/planning/ActionPlanDetailView.d.ts.map +1 -1
  20. package/dist/components/planning/ActionPlanDetailView.js +2 -2
  21. package/dist/components/planning/ActionPlanDetailView.js.map +1 -1
  22. package/dist/components/planning/ConnectedPlanDetailView.d.ts +1 -0
  23. package/dist/components/planning/ConnectedPlanDetailView.d.ts.map +1 -1
  24. package/dist/components/planning/ConnectedPlanDetailView.js.map +1 -1
  25. package/dist/components/planning/TopBar.d.ts +1 -0
  26. package/dist/components/planning/TopBar.d.ts.map +1 -1
  27. package/dist/components/planning/TopBar.js +7 -4
  28. package/dist/components/planning/TopBar.js.map +1 -1
  29. package/dist/components/planning/plan-detail-utils.d.ts +1 -0
  30. package/dist/components/planning/plan-detail-utils.d.ts.map +1 -1
  31. package/dist/components/planning/plan-detail-utils.js +4 -1
  32. package/dist/components/planning/plan-detail-utils.js.map +1 -1
  33. package/dist/components/sheet/index.d.ts +13 -19
  34. package/dist/components/sheet/index.d.ts.map +1 -1
  35. package/dist/components/sheet/index.js +8 -2
  36. package/dist/components/sheet/index.js.map +1 -1
  37. package/dist/components/table/index.d.ts +7 -1
  38. package/dist/components/table/index.d.ts.map +1 -1
  39. package/dist/components/table/index.js +18 -12
  40. package/dist/components/table/index.js.map +1 -1
  41. package/dist/components/tool-invocation-card/ToolActions.d.ts +2 -4
  42. package/dist/components/tool-invocation-card/ToolActions.d.ts.map +1 -1
  43. package/dist/components/tool-invocation-card/ToolActions.js +2 -9
  44. package/dist/components/tool-invocation-card/ToolActions.js.map +1 -1
  45. package/dist/components/tool-invocation-card/ToolHeader.d.ts +0 -1
  46. package/dist/components/tool-invocation-card/ToolHeader.d.ts.map +1 -1
  47. package/dist/components/tool-invocation-card/ToolHeader.js +11 -4
  48. package/dist/components/tool-invocation-card/ToolHeader.js.map +1 -1
  49. package/dist/components/tool-invocation-card/ToolInvocationCard.d.ts +0 -7
  50. package/dist/components/tool-invocation-card/ToolInvocationCard.d.ts.map +1 -1
  51. package/dist/components/tool-invocation-card/ToolInvocationCard.js +6 -8
  52. package/dist/components/tool-invocation-card/ToolInvocationCard.js.map +1 -1
  53. package/dist/globals.css +1526 -2772
  54. package/dist/hooks/use-connection-problems.d.ts.map +1 -1
  55. package/dist/hooks/useActionGraph.d.ts +7 -0
  56. package/dist/hooks/useActionGraph.d.ts.map +1 -0
  57. package/dist/hooks/useActionGraph.js +23 -0
  58. package/dist/hooks/useActionGraph.js.map +1 -0
  59. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  60. package/dist/lib/tool-icons.d.ts.map +1 -1
  61. package/dist/lib/tool-icons.js +1 -0
  62. package/dist/lib/tool-icons.js.map +1 -1
  63. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts +1 -1
  64. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.d.ts.map +1 -1
  65. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js +64 -11
  66. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js.map +1 -1
  67. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
  68. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +8 -2
  69. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
  70. package/dist/routes/integrations/components/connect-forms/meta-page-tree.d.ts +5 -0
  71. package/dist/routes/integrations/components/connect-forms/meta-page-tree.d.ts.map +1 -0
  72. package/dist/routes/integrations/components/connect-forms/meta-page-tree.js +16 -0
  73. package/dist/routes/integrations/components/connect-forms/meta-page-tree.js.map +1 -0
  74. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts +2 -1
  75. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.d.ts.map +1 -1
  76. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.js +4 -1
  77. package/dist/routes/integrations/components/connect-forms/oauth-setup-phase.js.map +1 -1
  78. package/dist/routes/integrations/connection-view.d.ts.map +1 -1
  79. package/dist/routes/integrations/connection-view.js +1 -0
  80. package/dist/routes/integrations/connection-view.js.map +1 -1
  81. package/dist/routes/plans/components/ActionPlansPage.d.ts.map +1 -1
  82. package/dist/routes/plans/components/ActionPlansPage.js +3 -3
  83. package/dist/routes/plans/components/ActionPlansPage.js.map +1 -1
  84. package/dist/routes/plans/components/PlanDetailRouteContent.d.ts.map +1 -1
  85. package/dist/routes/plans/components/PlanDetailRouteContent.js +3 -1
  86. package/dist/routes/plans/components/PlanDetailRouteContent.js.map +1 -1
  87. package/package.json +20 -15
  88. package/src/app-subpaths.json +1 -0
  89. package/src/components/button/index.tsx +17 -1
  90. package/src/components/chat-view/ToolApprovalPart.tsx +27 -0
  91. package/src/components/chat-view/ToolMessagePart.tsx +8 -25
  92. package/src/components/chat-view/tool-part-rendering.ts +1 -1
  93. package/src/components/modal/index.tsx +17 -2
  94. package/src/components/planning/ActionPlanDetailView.tsx +3 -0
  95. package/src/components/planning/ConnectedPlanDetailView.tsx +1 -0
  96. package/src/components/planning/TopBar.tsx +14 -3
  97. package/src/components/planning/plan-detail-utils.tsx +5 -1
  98. package/src/components/sheet/index.tsx +29 -6
  99. package/src/components/table/index.tsx +42 -12
  100. package/src/components/tool-invocation-card/ToolActions.tsx +5 -16
  101. package/src/components/tool-invocation-card/ToolHeader.tsx +13 -6
  102. package/src/components/tool-invocation-card/ToolInvocationCard.tsx +6 -23
  103. package/src/hooks/useActionGraph.ts +41 -0
  104. package/src/lib/tool-icons.ts +1 -0
  105. package/src/routes/integrations/components/connect-forms/MetaAdsConnectForm.tsx +131 -15
  106. package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +8 -2
  107. package/src/routes/integrations/components/connect-forms/meta-page-tree.ts +17 -0
  108. package/src/routes/integrations/components/connect-forms/oauth-setup-phase.ts +6 -0
  109. package/src/routes/integrations/connection-view.ts +1 -0
  110. package/src/routes/plans/components/ActionPlansPage.tsx +4 -4
  111. package/src/routes/plans/components/PlanDetailRouteContent.tsx +3 -0
@@ -85,11 +85,12 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
85
85
  const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set());
86
86
  const hasDismissedRef = useRef(false);
87
87
  const [connectionExpired, setConnectionExpired] = useState(false);
88
+ const [submitted, setSubmitted] = useState(false);
88
89
 
89
90
  const states = setup.progress?.state;
90
91
  const phase = connectionExpired
91
92
  ? "failed"
92
- : derivePhase({ states, hasStartedOAuth, hasSeenActiveState, resumesUnfinishedSetup });
93
+ : derivePhase({ states, hasStartedOAuth, hasSeenActiveState, resumesUnfinishedSetup, submitted });
93
94
 
94
95
  useWindowFocusPoll(setup.refetchProgress, { enabled: activePhases.includes(phase), intervalMs: pollIntervalMs });
95
96
 
@@ -114,6 +115,7 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
114
115
 
115
116
  function handleOpened() {
116
117
  setConnectionExpired(false);
118
+ setSubmitted(false);
117
119
  setSelectedIds(new Set());
118
120
  setup.resetProgress();
119
121
  setHasSeenActiveState(false);
@@ -131,21 +133,25 @@ export function OAuthSetupConnectForm<Row extends SetupRow>(props: OAuthSetupCon
131
133
 
132
134
  async function handleSubmit() {
133
135
  if (selectedIds.size === 0) return;
136
+ setSubmitted(true);
134
137
  try {
135
138
  const result = await setup.connect([...selectedIds]);
136
139
  if (result.state.includes(GQLGoogleSetupStateEnum.NotFound)) {
140
+ setSubmitted(false);
137
141
  setConnectionExpired(true);
138
142
  setSelectedIds(new Set());
139
143
  return;
140
144
  }
141
145
  await setup.refetchProgress();
142
146
  } catch (err) {
147
+ setSubmitted(false);
143
148
  const info = parseError(err, `Failed to connect ${providerName}`);
144
149
  toast.error(info.message, { description: info.description });
145
150
  }
146
151
  }
147
152
 
148
153
  function handleRetry() {
154
+ setSubmitted(false);
149
155
  setSelectedIds(new Set());
150
156
  hasDismissedRef.current = false;
151
157
  setup.resetProgress();
@@ -343,7 +349,7 @@ function SubmittingView(props: CopyProps) {
343
349
  <div className="grid gap-4">
344
350
  <div className="grid gap-1">
345
351
  <h2 className="typography-large-body-semibold text-default-foreground">Connecting your {copy.entityPlural}</h2>
346
- <p className="typography-caption text-muted-foreground">Hold tight — this usually takes a few seconds.</p>
352
+ <p className="typography-caption text-muted-foreground">This can take a minute. Keep this window open.</p>
347
353
  </div>
348
354
  <StatusLine label="Provisioning…" />
349
355
  </div>
@@ -0,0 +1,17 @@
1
+ import { GQLMetaPageKind, type GQLMetaPage } from "@manta-eu/client";
2
+ import { buildTreeRows, type TreeSelectItem } from "#components/tree-multi-select/index";
3
+
4
+ // Each Instagram account sits under the Page it is linked to, and is picked on its own.
5
+ export function metaPageTreeItems(pages: readonly GQLMetaPage[]): TreeSelectItem[] {
6
+ return buildTreeRows(pages).map(({ node, depth }) => ({
7
+ id: node.id,
8
+ label: node.name ?? (node.kind === GQLMetaPageKind.Instagram ? `Instagram account ${node.id}` : node.id),
9
+ caption: node.kind === GQLMetaPageKind.Instagram ? "Instagram" : undefined,
10
+ selectable: true,
11
+ depth,
12
+ }));
13
+ }
14
+
15
+ export function picksAPage(pages: readonly GQLMetaPage[], selectedIds: ReadonlySet<string>): boolean {
16
+ return pages.some((page) => page.kind === GQLMetaPageKind.Page && selectedIds.has(page.id));
17
+ }
@@ -9,6 +9,8 @@ export type DerivePhaseInput = {
9
9
  hasSeenActiveState: boolean;
10
10
  // Off when the account is connected before its picker, so a leftover setup cannot stand in for a new sign-in.
11
11
  resumesUnfinishedSetup?: boolean;
12
+ // Connect was sent: progress reads the old state until the connect has run, so only an outcome ends it.
13
+ submitted?: boolean;
12
14
  };
13
15
 
14
16
  const statePriority: readonly GQLGoogleSetupStateEnum[] = [
@@ -34,10 +36,14 @@ export function derivePhase({
34
36
  hasStartedOAuth,
35
37
  hasSeenActiveState,
36
38
  resumesUnfinishedSetup = true,
39
+ submitted = false,
37
40
  }: DerivePhaseInput): Phase {
38
41
  const defaultPhase: Phase = hasStartedOAuth ? "awaitingOAuth" : "idle";
39
42
  if (!hasStartedOAuth && !resumesUnfinishedSetup) return defaultPhase;
40
43
  const dominant = statePriority.find((state) => states?.includes(state));
44
+ const settled =
45
+ states?.includes(GQLGoogleSetupStateEnum.NotFound) || (dominant !== undefined && terminalStates.includes(dominant));
46
+ if (submitted && !settled) return "submitting";
41
47
  if (dominant && terminalStates.includes(dominant) && !hasSeenActiveState) return defaultPhase;
42
48
  return match(dominant)
43
49
  .returnType<Phase>()
@@ -87,6 +87,7 @@ const grantExpiryWarningDays = 14;
87
87
  // Integrations whose account is limited to what was picked at connect time, so an empty pick reads nothing.
88
88
  const oauthIncludedResourcesLabels: Partial<Record<GQLIntegration, { label: string; noneLabel: string }>> = {
89
89
  [GQLIntegration.Dash]: { label: "Folders", noneLabel: "No folders selected" },
90
+ [GQLIntegration.Meta]: { label: "Pages", noneLabel: "No Pages picked, reconnect to pick them" },
90
91
  };
91
92
 
92
93
  function timeAgoLabel(event: string, at: string | null | undefined): string | undefined {
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
 
3
- import { GQLActionPlanState } from "@manta-eu/client";
4
3
  import { buildPlanHref as defaultBuildPlanHref } from "@manta-eu/client/shared/agent-mode";
5
4
  import { isPresent } from "@manta-eu/lib/present";
6
5
  import type { SortingState } from "@tanstack/react-table";
@@ -32,6 +31,7 @@ import {
32
31
  } from "./actionPlansTableConfig";
33
32
  import { renderDefaultActionPlansFrame, type ActionPlansFrameProps } from "./frame";
34
33
  import { ExecutePlanDialog } from "#components/planning/ExecutePlanDialog";
34
+ import { canNeedApproval } from "#components/planning/plan-detail-utils";
35
35
  import { createTableConfig, useTableState } from "#components/table/index";
36
36
  import { useActionPlans } from "#hooks/useActionPlans";
37
37
  import { useFittedPagination } from "#hooks/useFittedPagination";
@@ -168,13 +168,13 @@ export function ActionPlansPage(props: ActionPlansPageProps) {
168
168
  }
169
169
  }, [count, isLoading, pageIndex, totalPages]);
170
170
 
171
- const runningPlanIris = useMemo(
172
- () => plans.filter((plan) => plan.state === GQLActionPlanState.Running).map((plan) => plan.iri),
171
+ const approvablePlanIris = useMemo(
172
+ () => plans.filter((plan) => canNeedApproval(plan.state)).map((plan) => plan.iri),
173
173
  [plans],
174
174
  );
175
175
 
176
176
  const { data: manualActionsByPlan } = useManualActionsForPlans({
177
- planGraphIris: runningPlanIris,
177
+ planGraphIris: approvablePlanIris,
178
178
  refetchIntervalMs: 10000,
179
179
  });
180
180
 
@@ -21,6 +21,7 @@ import type { PlanViewMode } from "#components/planning/TopBar";
21
21
  import { useActionPlanDetail } from "#hooks/useActionPlanDetail";
22
22
  import { useActionPlanExecution } from "#hooks/useActionPlanExecution";
23
23
  import { ActionPlanChangesTable, useActionPlanExecutionProvenance, useManualActions } from "#ldo-ui";
24
+ import { getPendingManualActions } from "#lib/manual-actions";
24
25
  import { useMantaClient } from "#providers/MantaClientProvider";
25
26
  import { ActivityDetail } from "#routes/activity/detail/ActivityDetail";
26
27
  import { invalidateActionPlanQueries } from "#shared/query-keys";
@@ -138,6 +139,7 @@ export function PlanDetailRouteContent(props: PlanDetailRouteContentProps) {
138
139
  triggeredAtMs: executionControl.triggeredAtMs,
139
140
  isRunningOverride: hasConfirmedExecution || hasExecutionEvidence,
140
141
  });
142
+ const pendingApprovalCount = getPendingManualActions(manualActions).length;
141
143
  const { triggeredAtMs, dryRun } = executionControl;
142
144
  const isDryRun = deriveIsDryRun({ provenance: executionProvenance ?? null, triggeredAtMs, dryRun });
143
145
  const shouldShowActioningSurface =
@@ -180,6 +182,7 @@ export function PlanDetailRouteContent(props: PlanDetailRouteContentProps) {
180
182
  viewMode={activeViewMode}
181
183
  stateOverride={derivedPlanState}
182
184
  isDryRun={isDryRun}
185
+ pendingApprovalCount={pendingApprovalCount}
183
186
  onViewModeChange={setViewMode}
184
187
  onExecute={detailExecuteAction}
185
188
  onCancel={detailCancelAction}