@burdenoff/microfe-brainyrich 2026.1025.1 → 2026.1028.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.
@@ -1 +1 @@
1
- {"version":3,"file":"AggregationPanel.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/components/AggregationPanel.tsx"],"names":[],"mappings":"AA+CA,wBAAgB,gBAAgB,4CA+M/B"}
1
+ {"version":3,"file":"AggregationPanel.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/components/AggregationPanel.tsx"],"names":[],"mappings":"AA4DA,wBAAgB,gBAAgB,4CA8R/B"}
@@ -2,172 +2,214 @@ import { errorMessage as e, notify as t } from "./notify.js";
2
2
  import { ConfirmDialog as n } from "./ConfirmDialog.js";
3
3
  import { useTr as r } from "../hooks/useTr.js";
4
4
  import { ErrorState as i, LoadingState as a, formatDate as o } from "../pages/_shared.js";
5
- import { useAggregationLinks as s, useAggregationProviders as c, useCreatePlaidLinkToken as l, useExchangePlaidPublicToken as u, useRevokeAggregationLink as d, useSyncAggregationLink as f } from "../hooks/useAggregation.js";
6
- import { openPlaidLink as p } from "../utils/plaidLink.js";
7
- import { useState as m } from "react";
8
- import { Building2 as h, Link2 as g, RefreshCw as _, ShieldCheck as v, Unlink as y } from "lucide-react";
9
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
10
- import { Badge as S, Button as C, Card as w, CardContent as T, CardDescription as E, CardHeader as D, CardTitle as O } from "@burdenoff/fe-libs/ui";
5
+ import { useAggregationLinks as s, useAggregationProviders as c, useCompletePlaidReauthentication as l, useCreatePlaidLinkToken as u, useCreatePlaidUpdateLinkToken as d, useExchangePlaidPublicToken as f, useRevokeAggregationLink as p, useSyncAggregationLink as m } from "../hooks/useAggregation.js";
6
+ import { openPlaidLink as h } from "../utils/plaidLink.js";
7
+ import { useState as g } from "react";
8
+ import { AlertTriangle as _, Building2 as v, KeyRound as y, Link2 as b, RefreshCw as x, ShieldCheck as S, Unlink as C } from "lucide-react";
9
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
10
+ import { Badge as E, Button as D, Card as O, CardContent as k, CardDescription as ee, CardHeader as A, CardTitle as j } from "@burdenoff/fe-libs/ui";
11
11
  //#region src/brainyrich/components/AggregationPanel.tsx
12
- var k = {
12
+ var M = {
13
13
  ACTIVE: "default",
14
14
  PENDING: "secondary",
15
15
  ERROR: "destructive",
16
16
  REVOKED: "outline"
17
17
  };
18
- function A() {
19
- let A = r(), j = c(), M = s(), N = l(), P = u(), F = f(), I = d(), [L, R] = m(!1), [z, B] = m(null), V = j.data.find((e) => e.provider === "PLAID"), H = !!V?.configured, U = L || N.isPending || P.isPending, W = async () => {
20
- R(!0);
18
+ function N() {
19
+ let N = r(), P = c(), F = s(), I = u(), L = f(), R = m(), z = p(), B = d(), V = l(), [H, U] = g(!1), [W, G] = g(null), [K, q] = g(null), J = P.data.find((e) => e.provider === "PLAID"), Y = !!J?.configured, X = H || I.isPending || L.isPending, Z = async () => {
20
+ U(!0);
21
21
  try {
22
- let n = await N.mutateAsync().catch(() => null);
22
+ let n = await I.mutateAsync().catch(() => null);
23
23
  if (!n) return;
24
24
  let r;
25
25
  try {
26
- r = await p(n.linkToken);
26
+ r = await h(n.linkToken);
27
27
  } catch (n) {
28
28
  t.error(e(n));
29
29
  return;
30
30
  }
31
- r.kind === "success" ? await P.mutateAsync({
31
+ r.kind === "success" ? await L.mutateAsync({
32
32
  publicToken: r.publicToken,
33
33
  institutionId: r.institutionId,
34
34
  institutionName: r.institutionName
35
- }).catch(() => void 0) : r.message && t.info(A("brainyrich.aggregation.linkCancelled", "Linking was not completed"), r.message);
35
+ }).catch(() => void 0) : r.message && t.info(N("brainyrich.aggregation.linkCancelled", "Linking was not completed"), r.message);
36
36
  } finally {
37
- R(!1);
37
+ U(!1);
38
38
  }
39
- }, G = () => {
40
- z && I.mutate(z.id, { onSettled: () => B(null) });
41
- }, K = M.data;
42
- return /* @__PURE__ */ x(w, {
39
+ }, Q = async (n) => {
40
+ G(n.id);
41
+ try {
42
+ let r = await B.mutateAsync(n.id).catch(() => null);
43
+ if (!r) return;
44
+ let i;
45
+ try {
46
+ i = await h(r.linkToken);
47
+ } catch (n) {
48
+ t.error(e(n));
49
+ return;
50
+ }
51
+ i.kind === "success" ? await V.mutateAsync(n.id).catch(() => void 0) : i.message && t.info(N("brainyrich.aggregation.reconnectCancelled", "Reconnecting was not completed"), i.message);
52
+ } finally {
53
+ G(null);
54
+ }
55
+ }, te = () => {
56
+ K && z.mutate(K.id, { onSettled: () => q(null) });
57
+ }, $ = F.data;
58
+ return /* @__PURE__ */ T(O, {
43
59
  "data-testid": "brainyrich-aggregation-panel",
44
60
  children: [
45
- /* @__PURE__ */ x(D, {
61
+ /* @__PURE__ */ T(A, {
46
62
  className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
47
- children: [/* @__PURE__ */ x("div", {
63
+ children: [/* @__PURE__ */ T("div", {
48
64
  className: "space-y-1.5",
49
- children: [/* @__PURE__ */ x(O, {
65
+ children: [/* @__PURE__ */ T(j, {
50
66
  className: "flex items-center gap-2",
51
67
  children: [
52
- /* @__PURE__ */ b(g, {
68
+ /* @__PURE__ */ w(b, {
53
69
  className: "h-5 w-5",
54
70
  "aria-hidden": "true"
55
71
  }),
56
- A("brainyrich.aggregation.title", "Automatic account linking"),
57
- H && V?.environment === "sandbox" ? /* @__PURE__ */ b(S, {
72
+ N("brainyrich.aggregation.title", "Automatic account linking"),
73
+ Y && J?.environment === "sandbox" ? /* @__PURE__ */ w(E, {
58
74
  variant: "secondary",
59
75
  "data-testid": "brainyrich-aggregation-sandbox-badge",
60
- children: A("brainyrich.aggregation.sandbox", "Sandbox")
76
+ children: N("brainyrich.aggregation.sandbox", "Sandbox")
61
77
  }) : null
62
78
  ]
63
- }), /* @__PURE__ */ b(E, { children: A("brainyrich.aggregation.description", "Connect a bank or brokerage through Plaid to sync balances and transactions automatically. You sign in on your bank’s own screen; BrainyRich never sees your bank password.") })]
64
- }), H ? /* @__PURE__ */ x(C, {
79
+ }), /* @__PURE__ */ w(ee, { children: N("brainyrich.aggregation.description", "Connect a bank or brokerage through Plaid to sync balances and transactions automatically. You sign in on your bank’s own screen; BrainyRich never sees your bank password.") })]
80
+ }), Y ? /* @__PURE__ */ T(D, {
65
81
  size: "sm",
66
- onClick: W,
67
- disabled: U,
68
- "aria-busy": U,
82
+ onClick: Z,
83
+ disabled: X,
84
+ "aria-busy": X,
69
85
  "data-testid": "brainyrich-aggregation-link-button",
70
- children: [/* @__PURE__ */ b(g, {
86
+ children: [/* @__PURE__ */ w(b, {
71
87
  className: "size-4",
72
88
  "aria-hidden": "true"
73
- }), U ? A("brainyrich.aggregation.linking", "Linking…") : A("brainyrich.aggregation.link", "Link an institution")]
89
+ }), X ? N("brainyrich.aggregation.linking", "Linking…") : N("brainyrich.aggregation.link", "Link an institution")]
74
90
  }) : null]
75
91
  }),
76
- /* @__PURE__ */ x(T, {
92
+ /* @__PURE__ */ T(k, {
77
93
  className: "space-y-4",
78
- children: [j.isLoading ? /* @__PURE__ */ b(a, { rows: 1 }) : j.isError ? /* @__PURE__ */ b(i, {
79
- description: A("brainyrich.aggregation.providersError", "We could not check whether automatic linking is available. Please try again."),
80
- onRetry: () => j.refetch()
81
- }) : H ? null : /* @__PURE__ */ x("div", {
94
+ children: [P.isLoading ? /* @__PURE__ */ w(a, { rows: 1 }) : P.isError ? /* @__PURE__ */ w(i, {
95
+ description: N("brainyrich.aggregation.providersError", "We could not check whether automatic linking is available. Please try again."),
96
+ onRetry: () => P.refetch()
97
+ }) : Y ? null : /* @__PURE__ */ T("div", {
82
98
  className: "flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-4 text-sm",
83
99
  "data-testid": "brainyrich-aggregation-unavailable",
84
- children: [/* @__PURE__ */ b(v, {
100
+ children: [/* @__PURE__ */ w(S, {
85
101
  className: "mt-0.5 size-4 shrink-0 text-text-secondary",
86
102
  "aria-hidden": "true"
87
- }), /* @__PURE__ */ b("p", {
103
+ }), /* @__PURE__ */ w("p", {
88
104
  className: "text-text-secondary",
89
- children: A("brainyrich.aggregation.unavailable", "Automatic linking is not switched on for this workspace yet. Add accounts with “New account” — balances and transactions you enter count everywhere synced data does.")
105
+ children: N("brainyrich.aggregation.unavailable", "Automatic linking is not switched on for this workspace yet. Add accounts with “New account” — balances and transactions you enter count everywhere synced data does.")
90
106
  })]
91
- }), M.isLoading ? null : M.isError ? /* @__PURE__ */ b(i, { onRetry: () => M.refetch() }) : K.length > 0 ? /* @__PURE__ */ b("ul", {
107
+ }), F.isLoading ? null : F.isError ? /* @__PURE__ */ w(i, { onRetry: () => F.refetch() }) : $.length > 0 ? /* @__PURE__ */ w("ul", {
92
108
  className: "divide-y divide-border-subtle rounded-lg border border-border-subtle",
93
109
  "data-testid": "brainyrich-aggregation-links",
94
- children: K.map((e) => {
95
- let t = e.status === "REVOKED", n = F.isPending && F.variables === e.id;
96
- return /* @__PURE__ */ x("li", {
110
+ children: $.map((e) => {
111
+ let t = e.status === "REVOKED", n = R.isPending && R.variables === e.id, r = !(e.status === "ERROR" && e.needsReauthentication);
112
+ return /* @__PURE__ */ T("li", {
97
113
  className: "flex flex-col gap-3 p-4 sm:flex-row sm:items-center sm:justify-between",
98
114
  "data-testid": "brainyrich-aggregation-link-row",
99
- children: [/* @__PURE__ */ x("div", {
115
+ children: [/* @__PURE__ */ T("div", {
100
116
  className: "flex min-w-0 items-start gap-3",
101
- children: [/* @__PURE__ */ b("div", {
117
+ children: [/* @__PURE__ */ w("div", {
102
118
  className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary",
103
- children: /* @__PURE__ */ b(h, {
119
+ children: /* @__PURE__ */ w(v, {
104
120
  className: "size-4",
105
121
  "aria-hidden": "true"
106
122
  })
107
- }), /* @__PURE__ */ x("div", {
123
+ }), /* @__PURE__ */ T("div", {
108
124
  className: "min-w-0 space-y-1",
109
125
  children: [
110
- /* @__PURE__ */ x("div", {
126
+ /* @__PURE__ */ T("div", {
111
127
  className: "flex flex-wrap items-center gap-2",
112
- children: [/* @__PURE__ */ b("span", {
128
+ children: [/* @__PURE__ */ w("span", {
113
129
  className: "font-medium text-text-primary",
114
- children: e.institutionName ?? A("brainyrich.aggregation.unnamed", "Linked institution")
115
- }), /* @__PURE__ */ b(S, {
116
- variant: k[e.status],
130
+ children: e.institutionName ?? N("brainyrich.aggregation.unnamed", "Linked institution")
131
+ }), /* @__PURE__ */ w(E, {
132
+ variant: M[e.status],
117
133
  children: e.status
118
134
  })]
119
135
  }),
120
- /* @__PURE__ */ b("p", {
136
+ /* @__PURE__ */ w("p", {
121
137
  className: "text-xs text-text-secondary",
122
- children: e.lastSyncedAt ? A("brainyrich.aggregation.lastSynced", "Last synced {{date}}", { date: o(e.lastSyncedAt) }) : A("brainyrich.aggregation.neverSynced", "Not synced yet")
138
+ children: e.lastSyncedAt ? N("brainyrich.aggregation.lastSynced", "Last synced {{date}}", { date: o(e.lastSyncedAt) }) : N("brainyrich.aggregation.neverSynced", "Not synced yet")
123
139
  }),
124
- e.status === "ERROR" && e.lastSyncError ? /* @__PURE__ */ b("p", {
140
+ !t && e.needsReauthentication ? /* @__PURE__ */ T("p", {
141
+ className: "flex items-start gap-1.5 text-xs text-status-warning-text",
142
+ "data-testid": "brainyrich-aggregation-reauth-notice",
143
+ children: [/* @__PURE__ */ w(_, {
144
+ className: "mt-0.5 size-3.5 shrink-0",
145
+ "aria-hidden": "true"
146
+ }), /* @__PURE__ */ w("span", { children: e.consentExpiresAt && e.status !== "ERROR" ? N("brainyrich.aggregation.consentExpiring", "Access to this institution expires on {{date}}. Reconnect to keep it syncing.", { date: o(e.consentExpiresAt) }) : N("brainyrich.aggregation.reauthRequired", "The institution needs you to sign in again before it can sync.") })]
147
+ }) : null,
148
+ e.status === "ERROR" && e.lastSyncError && !e.needsReauthentication ? /* @__PURE__ */ w("p", {
125
149
  className: "break-words text-xs text-status-error-text",
126
150
  children: e.lastSyncError
151
+ }) : null,
152
+ e.status === "ACTIVE" && e.nextSyncAt ? /* @__PURE__ */ w("p", {
153
+ className: "text-xs text-text-muted",
154
+ children: N("brainyrich.aggregation.nextSync", "Next automatic sync {{date}}", { date: o(e.nextSyncAt) })
127
155
  }) : null
128
156
  ]
129
157
  })]
130
- }), t ? null : /* @__PURE__ */ x("div", {
131
- className: "flex shrink-0 gap-2",
132
- children: [/* @__PURE__ */ x(C, {
133
- size: "sm",
134
- variant: "outline",
135
- onClick: () => F.mutate(e.id),
136
- disabled: F.isPending,
137
- "aria-busy": n,
138
- children: [/* @__PURE__ */ b(_, {
139
- className: "size-4",
140
- "aria-hidden": "true"
141
- }), n ? A("brainyrich.aggregation.syncing", "Syncing…") : A("brainyrich.aggregation.sync", "Sync now")]
142
- }), /* @__PURE__ */ x(C, {
143
- size: "sm",
144
- variant: "outline",
145
- onClick: () => B(e),
146
- children: [/* @__PURE__ */ b(y, {
147
- className: "size-4",
148
- "aria-hidden": "true"
149
- }), A("brainyrich.aggregation.disconnect", "Disconnect")]
150
- })]
158
+ }), t ? null : /* @__PURE__ */ T("div", {
159
+ className: "flex shrink-0 flex-wrap gap-2",
160
+ children: [
161
+ e.needsReauthentication ? /* @__PURE__ */ T(D, {
162
+ size: "sm",
163
+ onClick: () => void Q(e),
164
+ disabled: W !== null || !Y,
165
+ "aria-busy": W === e.id,
166
+ "data-testid": "brainyrich-aggregation-reconnect-button",
167
+ children: [/* @__PURE__ */ w(y, {
168
+ className: "size-4",
169
+ "aria-hidden": "true"
170
+ }), W === e.id ? N("brainyrich.aggregation.reconnecting", "Reconnecting…") : N("brainyrich.aggregation.reconnect", "Reconnect")]
171
+ }) : null,
172
+ r ? /* @__PURE__ */ T(D, {
173
+ size: "sm",
174
+ variant: "outline",
175
+ onClick: () => R.mutate(e.id),
176
+ disabled: R.isPending,
177
+ "aria-busy": n,
178
+ children: [/* @__PURE__ */ w(x, {
179
+ className: "size-4",
180
+ "aria-hidden": "true"
181
+ }), n ? N("brainyrich.aggregation.syncing", "Syncing…") : N("brainyrich.aggregation.sync", "Sync now")]
182
+ }) : null,
183
+ /* @__PURE__ */ T(D, {
184
+ size: "sm",
185
+ variant: "outline",
186
+ onClick: () => q(e),
187
+ children: [/* @__PURE__ */ w(C, {
188
+ className: "size-4",
189
+ "aria-hidden": "true"
190
+ }), N("brainyrich.aggregation.disconnect", "Disconnect")]
191
+ })
192
+ ]
151
193
  })]
152
194
  }, e.id);
153
195
  })
154
196
  }) : null]
155
197
  }),
156
- /* @__PURE__ */ b(n, {
157
- open: z !== null,
158
- onOpenChange: (e) => !e && B(null),
159
- title: A("brainyrich.aggregation.disconnectTitle", "Disconnect this institution?"),
160
- description: A("brainyrich.aggregation.disconnectDescription", "BrainyRich stops syncing and revokes its access at the provider. Accounts synced from it are marked closed; their history stays."),
161
- confirmLabel: A("brainyrich.aggregation.disconnect", "Disconnect"),
162
- pendingLabel: A("brainyrich.aggregation.disconnecting", "Disconnecting…"),
198
+ /* @__PURE__ */ w(n, {
199
+ open: K !== null,
200
+ onOpenChange: (e) => !e && q(null),
201
+ title: N("brainyrich.aggregation.disconnectTitle", "Disconnect this institution?"),
202
+ description: N("brainyrich.aggregation.disconnectDescription", "BrainyRich stops syncing and revokes its access at the provider. Accounts synced from it are marked closed; their history stays."),
203
+ confirmLabel: N("brainyrich.aggregation.disconnect", "Disconnect"),
204
+ pendingLabel: N("brainyrich.aggregation.disconnecting", "Disconnecting…"),
163
205
  destructive: !0,
164
- pending: I.isPending,
165
- onConfirm: G
206
+ pending: z.isPending,
207
+ onConfirm: te
166
208
  })
167
209
  ]
168
210
  });
169
211
  }
170
212
  //#endregion
171
- export { A as AggregationPanel };
213
+ export { N as AggregationPanel };
172
214
 
173
215
  //# sourceMappingURL=AggregationPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AggregationPanel.js","names":[],"sources":["../../../src/brainyrich/components/AggregationPanel.tsx"],"sourcesContent":["/**\n * AggregationPanel — \"Automatic account linking\" card on the Accounts page\n * (BOFF-4234).\n *\n * Offers \"Link an institution\" only when the backend reports a configured\n * provider (`braAggregationProviders`). Otherwise it says plainly that\n * accounts are added manually today, so the page never presents a button that\n * cannot work. Linked institutions are listed with their sync status and can\n * be re-synced or disconnected.\n */\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, Link2, RefreshCw, ShieldCheck, Unlink } from 'lucide-react';\n\nimport {\n useAggregationLinks,\n useAggregationProviders,\n useCreatePlaidLinkToken,\n useExchangePlaidPublicToken,\n useRevokeAggregationLink,\n useSyncAggregationLink,\n} from '../hooks/useAggregation';\nimport { useTr } from '../hooks/useTr';\nimport type { BraAggregationLink, BraAggregationLinkStatus } from '../types/bra';\nimport { openPlaidLink, type PlaidLinkOutcome } from '../utils/plaidLink';\nimport { ErrorState, LoadingState, formatDate } from '../pages/_shared';\nimport { ConfirmDialog } from './ConfirmDialog';\nimport { errorMessage, notify } from './notify';\n\nconst STATUS_VARIANT: Record<\n BraAggregationLinkStatus,\n 'default' | 'secondary' | 'destructive' | 'outline'\n> = {\n ACTIVE: 'default',\n PENDING: 'secondary',\n ERROR: 'destructive',\n REVOKED: 'outline',\n};\n\nexport function AggregationPanel() {\n const tr = useTr();\n const providers = useAggregationProviders();\n const links = useAggregationLinks();\n const createToken = useCreatePlaidLinkToken();\n const exchange = useExchangePlaidPublicToken();\n const sync = useSyncAggregationLink();\n const revoke = useRevokeAggregationLink();\n\n const [linking, setLinking] = useState(false);\n const [revokeTarget, setRevokeTarget] = useState<BraAggregationLink | null>(null);\n\n const plaid = providers.data.find((p) => p.provider === 'PLAID');\n const canLink = Boolean(plaid?.configured);\n const busy = linking || createToken.isPending || exchange.isPending;\n\n const startLinking = async () => {\n setLinking(true);\n try {\n // Failures of the two backend calls are toasted by the hooks' own\n // feedback handlers, so they are only caught here to end the flow.\n const token = await createToken.mutateAsync().catch(() => null);\n if (!token) return;\n\n let outcome: PlaidLinkOutcome;\n try {\n outcome = await openPlaidLink(token.linkToken);\n } catch (err: unknown) {\n notify.error(errorMessage(err));\n return;\n }\n\n if (outcome.kind === 'success') {\n await exchange\n .mutateAsync({\n publicToken: outcome.publicToken,\n institutionId: outcome.institutionId,\n institutionName: outcome.institutionName,\n })\n .catch(() => undefined);\n } else if (outcome.message) {\n notify.info(\n tr('brainyrich.aggregation.linkCancelled', 'Linking was not completed'),\n outcome.message\n );\n }\n } finally {\n setLinking(false);\n }\n };\n\n const confirmRevoke = () => {\n if (!revokeTarget) return;\n revoke.mutate(revokeTarget.id, { onSettled: () => setRevokeTarget(null) });\n };\n\n const visibleLinks = links.data;\n\n return (\n <Card data-testid=\"brainyrich-aggregation-panel\">\n <CardHeader className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1.5\">\n <CardTitle className=\"flex items-center gap-2\">\n <Link2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n {tr('brainyrich.aggregation.title', 'Automatic account linking')}\n {canLink && plaid?.environment === 'sandbox' ? (\n <Badge variant=\"secondary\" data-testid=\"brainyrich-aggregation-sandbox-badge\">\n {tr('brainyrich.aggregation.sandbox', 'Sandbox')}\n </Badge>\n ) : null}\n </CardTitle>\n <CardDescription>\n {tr(\n 'brainyrich.aggregation.description',\n 'Connect a bank or brokerage through Plaid to sync balances and transactions automatically. You sign in on your bank’s own screen; BrainyRich never sees your bank password.'\n )}\n </CardDescription>\n </div>\n {canLink ? (\n <Button\n size=\"sm\"\n onClick={startLinking}\n disabled={busy}\n aria-busy={busy}\n data-testid=\"brainyrich-aggregation-link-button\"\n >\n <Link2 className=\"size-4\" aria-hidden=\"true\" />\n {busy\n ? tr('brainyrich.aggregation.linking', 'Linking…')\n : tr('brainyrich.aggregation.link', 'Link an institution')}\n </Button>\n ) : null}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers.isLoading ? (\n <LoadingState rows={1} />\n ) : providers.isError ? (\n <ErrorState\n description={tr(\n 'brainyrich.aggregation.providersError',\n 'We could not check whether automatic linking is available. Please try again.'\n )}\n onRetry={() => providers.refetch()}\n />\n ) : !canLink ? (\n <div\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-4 text-sm\"\n data-testid=\"brainyrich-aggregation-unavailable\"\n >\n <ShieldCheck\n className=\"mt-0.5 size-4 shrink-0 text-text-secondary\"\n aria-hidden=\"true\"\n />\n <p className=\"text-text-secondary\">\n {tr(\n 'brainyrich.aggregation.unavailable',\n 'Automatic linking is not switched on for this workspace yet. Add accounts with “New account” — balances and transactions you enter count everywhere synced data does.'\n )}\n </p>\n </div>\n ) : null}\n\n {links.isLoading ? null : links.isError ? (\n <ErrorState onRetry={() => links.refetch()} />\n ) : visibleLinks.length > 0 ? (\n <ul\n className=\"divide-y divide-border-subtle rounded-lg border border-border-subtle\"\n data-testid=\"brainyrich-aggregation-links\"\n >\n {visibleLinks.map((link) => {\n const revoked = link.status === 'REVOKED';\n const syncingThis = sync.isPending && sync.variables === link.id;\n return (\n <li\n key={link.id}\n className=\"flex flex-col gap-3 p-4 sm:flex-row sm:items-center sm:justify-between\"\n data-testid=\"brainyrich-aggregation-link-row\"\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <div className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <Building2 className=\"size-4\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text-primary\">\n {link.institutionName ??\n tr('brainyrich.aggregation.unnamed', 'Linked institution')}\n </span>\n <Badge variant={STATUS_VARIANT[link.status]}>{link.status}</Badge>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {link.lastSyncedAt\n ? tr('brainyrich.aggregation.lastSynced', 'Last synced {{date}}', {\n date: formatDate(link.lastSyncedAt),\n })\n : tr('brainyrich.aggregation.neverSynced', 'Not synced yet')}\n </p>\n {link.status === 'ERROR' && link.lastSyncError ? (\n <p className=\"break-words text-xs text-status-error-text\">\n {link.lastSyncError}\n </p>\n ) : null}\n </div>\n </div>\n {revoked ? null : (\n <div className=\"flex shrink-0 gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => sync.mutate(link.id)}\n disabled={sync.isPending}\n aria-busy={syncingThis}\n >\n <RefreshCw className=\"size-4\" aria-hidden=\"true\" />\n {syncingThis\n ? tr('brainyrich.aggregation.syncing', 'Syncing…')\n : tr('brainyrich.aggregation.sync', 'Sync now')}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setRevokeTarget(link)}>\n <Unlink className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.aggregation.disconnect', 'Disconnect')}\n </Button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n ) : null}\n </CardContent>\n\n <ConfirmDialog\n open={revokeTarget !== null}\n onOpenChange={(open) => !open && setRevokeTarget(null)}\n title={tr('brainyrich.aggregation.disconnectTitle', 'Disconnect this institution?')}\n description={tr(\n 'brainyrich.aggregation.disconnectDescription',\n 'BrainyRich stops syncing and revokes its access at the provider. Accounts synced from it are marked closed; their history stays.'\n )}\n confirmLabel={tr('brainyrich.aggregation.disconnect', 'Disconnect')}\n pendingLabel={tr('brainyrich.aggregation.disconnecting', 'Disconnecting…')}\n destructive\n pending={revoke.isPending}\n onConfirm={confirmRevoke}\n />\n </Card>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AggregationPanel.js","names":[],"sources":["../../../src/brainyrich/components/AggregationPanel.tsx"],"sourcesContent":["/**\n * AggregationPanel — \"Automatic account linking\" card on the Accounts page\n * (BOFF-4234, BOFF-9677).\n *\n * Offers \"Link an institution\" only when the backend reports a configured\n * provider (`braAggregationProviders`). Otherwise it says plainly that\n * accounts are added manually today, so the page never presents a button that\n * cannot work. Linked institutions are listed with their sync status and can\n * be re-synced or disconnected. Links also re-sync on their own (Plaid\n * webhooks and a daily schedule); a link whose login broke or whose consent is\n * about to expire offers \"Reconnect\", which opens Plaid Link in update mode for\n * the same institution instead of creating a second link.\n */\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport {\n AlertTriangle,\n Building2,\n KeyRound,\n Link2,\n RefreshCw,\n ShieldCheck,\n Unlink,\n} from 'lucide-react';\n\nimport {\n useAggregationLinks,\n useAggregationProviders,\n useCompletePlaidReauthentication,\n useCreatePlaidLinkToken,\n useCreatePlaidUpdateLinkToken,\n useExchangePlaidPublicToken,\n useRevokeAggregationLink,\n useSyncAggregationLink,\n} from '../hooks/useAggregation';\nimport { useTr } from '../hooks/useTr';\nimport type { BraAggregationLink, BraAggregationLinkStatus } from '../types/bra';\nimport { openPlaidLink, type PlaidLinkOutcome } from '../utils/plaidLink';\nimport { ErrorState, LoadingState, formatDate } from '../pages/_shared';\nimport { ConfirmDialog } from './ConfirmDialog';\nimport { errorMessage, notify } from './notify';\n\nconst STATUS_VARIANT: Record<\n BraAggregationLinkStatus,\n 'default' | 'secondary' | 'destructive' | 'outline'\n> = {\n ACTIVE: 'default',\n PENDING: 'secondary',\n ERROR: 'destructive',\n REVOKED: 'outline',\n};\n\nexport function AggregationPanel() {\n const tr = useTr();\n const providers = useAggregationProviders();\n const links = useAggregationLinks();\n const createToken = useCreatePlaidLinkToken();\n const exchange = useExchangePlaidPublicToken();\n const sync = useSyncAggregationLink();\n const revoke = useRevokeAggregationLink();\n const createUpdateToken = useCreatePlaidUpdateLinkToken();\n const completeReauth = useCompletePlaidReauthentication();\n\n const [linking, setLinking] = useState(false);\n const [reconnectingId, setReconnectingId] = useState<string | null>(null);\n const [revokeTarget, setRevokeTarget] = useState<BraAggregationLink | null>(null);\n\n const plaid = providers.data.find((p) => p.provider === 'PLAID');\n const canLink = Boolean(plaid?.configured);\n const busy = linking || createToken.isPending || exchange.isPending;\n\n const startLinking = async () => {\n setLinking(true);\n try {\n // Failures of the two backend calls are toasted by the hooks' own\n // feedback handlers, so they are only caught here to end the flow.\n const token = await createToken.mutateAsync().catch(() => null);\n if (!token) return;\n\n let outcome: PlaidLinkOutcome;\n try {\n outcome = await openPlaidLink(token.linkToken);\n } catch (err: unknown) {\n notify.error(errorMessage(err));\n return;\n }\n\n if (outcome.kind === 'success') {\n await exchange\n .mutateAsync({\n publicToken: outcome.publicToken,\n institutionId: outcome.institutionId,\n institutionName: outcome.institutionName,\n })\n .catch(() => undefined);\n } else if (outcome.message) {\n notify.info(\n tr('brainyrich.aggregation.linkCancelled', 'Linking was not completed'),\n outcome.message\n );\n }\n } finally {\n setLinking(false);\n }\n };\n\n /** Plaid Link update mode: re-authenticate the same Item, then clear its error and re-sync. */\n const reconnect = async (link: BraAggregationLink) => {\n setReconnectingId(link.id);\n try {\n const token = await createUpdateToken.mutateAsync(link.id).catch(() => null);\n if (!token) return;\n\n let outcome: PlaidLinkOutcome;\n try {\n outcome = await openPlaidLink(token.linkToken);\n } catch (err: unknown) {\n notify.error(errorMessage(err));\n return;\n }\n\n if (outcome.kind === 'success') {\n // Update mode needs no token exchange: the existing access token is valid again.\n await completeReauth.mutateAsync(link.id).catch(() => undefined);\n } else if (outcome.message) {\n notify.info(\n tr('brainyrich.aggregation.reconnectCancelled', 'Reconnecting was not completed'),\n outcome.message\n );\n }\n } finally {\n setReconnectingId(null);\n }\n };\n\n const confirmRevoke = () => {\n if (!revokeTarget) return;\n revoke.mutate(revokeTarget.id, { onSettled: () => setRevokeTarget(null) });\n };\n\n const visibleLinks = links.data;\n\n return (\n <Card data-testid=\"brainyrich-aggregation-panel\">\n <CardHeader className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1.5\">\n <CardTitle className=\"flex items-center gap-2\">\n <Link2 className=\"h-5 w-5\" aria-hidden=\"true\" />\n {tr('brainyrich.aggregation.title', 'Automatic account linking')}\n {canLink && plaid?.environment === 'sandbox' ? (\n <Badge variant=\"secondary\" data-testid=\"brainyrich-aggregation-sandbox-badge\">\n {tr('brainyrich.aggregation.sandbox', 'Sandbox')}\n </Badge>\n ) : null}\n </CardTitle>\n <CardDescription>\n {tr(\n 'brainyrich.aggregation.description',\n 'Connect a bank or brokerage through Plaid to sync balances and transactions automatically. You sign in on your bank’s own screen; BrainyRich never sees your bank password.'\n )}\n </CardDescription>\n </div>\n {canLink ? (\n <Button\n size=\"sm\"\n onClick={startLinking}\n disabled={busy}\n aria-busy={busy}\n data-testid=\"brainyrich-aggregation-link-button\"\n >\n <Link2 className=\"size-4\" aria-hidden=\"true\" />\n {busy\n ? tr('brainyrich.aggregation.linking', 'Linking…')\n : tr('brainyrich.aggregation.link', 'Link an institution')}\n </Button>\n ) : null}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers.isLoading ? (\n <LoadingState rows={1} />\n ) : providers.isError ? (\n <ErrorState\n description={tr(\n 'brainyrich.aggregation.providersError',\n 'We could not check whether automatic linking is available. Please try again.'\n )}\n onRetry={() => providers.refetch()}\n />\n ) : !canLink ? (\n <div\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-4 text-sm\"\n data-testid=\"brainyrich-aggregation-unavailable\"\n >\n <ShieldCheck\n className=\"mt-0.5 size-4 shrink-0 text-text-secondary\"\n aria-hidden=\"true\"\n />\n <p className=\"text-text-secondary\">\n {tr(\n 'brainyrich.aggregation.unavailable',\n 'Automatic linking is not switched on for this workspace yet. Add accounts with “New account” — balances and transactions you enter count everywhere synced data does.'\n )}\n </p>\n </div>\n ) : null}\n\n {links.isLoading ? null : links.isError ? (\n <ErrorState onRetry={() => links.refetch()} />\n ) : visibleLinks.length > 0 ? (\n <ul\n className=\"divide-y divide-border-subtle rounded-lg border border-border-subtle\"\n data-testid=\"brainyrich-aggregation-links\"\n >\n {visibleLinks.map((link) => {\n const revoked = link.status === 'REVOKED';\n const syncingThis = sync.isPending && sync.variables === link.id;\n // A broken login cannot be fixed by re-syncing; only Reconnect helps.\n const canSync = !(link.status === 'ERROR' && link.needsReauthentication);\n return (\n <li\n key={link.id}\n className=\"flex flex-col gap-3 p-4 sm:flex-row sm:items-center sm:justify-between\"\n data-testid=\"brainyrich-aggregation-link-row\"\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <div className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <Building2 className=\"size-4\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-text-primary\">\n {link.institutionName ??\n tr('brainyrich.aggregation.unnamed', 'Linked institution')}\n </span>\n <Badge variant={STATUS_VARIANT[link.status]}>{link.status}</Badge>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {link.lastSyncedAt\n ? tr('brainyrich.aggregation.lastSynced', 'Last synced {{date}}', {\n date: formatDate(link.lastSyncedAt),\n })\n : tr('brainyrich.aggregation.neverSynced', 'Not synced yet')}\n </p>\n {!revoked && link.needsReauthentication ? (\n <p\n className=\"flex items-start gap-1.5 text-xs text-status-warning-text\"\n data-testid=\"brainyrich-aggregation-reauth-notice\"\n >\n <AlertTriangle className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>\n {link.consentExpiresAt && link.status !== 'ERROR'\n ? tr(\n 'brainyrich.aggregation.consentExpiring',\n 'Access to this institution expires on {{date}}. Reconnect to keep it syncing.',\n { date: formatDate(link.consentExpiresAt) }\n )\n : tr(\n 'brainyrich.aggregation.reauthRequired',\n 'The institution needs you to sign in again before it can sync.'\n )}\n </span>\n </p>\n ) : null}\n {link.status === 'ERROR' &&\n link.lastSyncError &&\n !link.needsReauthentication ? (\n <p className=\"break-words text-xs text-status-error-text\">\n {link.lastSyncError}\n </p>\n ) : null}\n {link.status === 'ACTIVE' && link.nextSyncAt ? (\n <p className=\"text-xs text-text-muted\">\n {tr('brainyrich.aggregation.nextSync', 'Next automatic sync {{date}}', {\n date: formatDate(link.nextSyncAt),\n })}\n </p>\n ) : null}\n </div>\n </div>\n {revoked ? null : (\n <div className=\"flex shrink-0 flex-wrap gap-2\">\n {link.needsReauthentication ? (\n <Button\n size=\"sm\"\n onClick={() => void reconnect(link)}\n disabled={reconnectingId !== null || !canLink}\n aria-busy={reconnectingId === link.id}\n data-testid=\"brainyrich-aggregation-reconnect-button\"\n >\n <KeyRound className=\"size-4\" aria-hidden=\"true\" />\n {reconnectingId === link.id\n ? tr('brainyrich.aggregation.reconnecting', 'Reconnecting…')\n : tr('brainyrich.aggregation.reconnect', 'Reconnect')}\n </Button>\n ) : null}\n {canSync ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => sync.mutate(link.id)}\n disabled={sync.isPending}\n aria-busy={syncingThis}\n >\n <RefreshCw className=\"size-4\" aria-hidden=\"true\" />\n {syncingThis\n ? tr('brainyrich.aggregation.syncing', 'Syncing…')\n : tr('brainyrich.aggregation.sync', 'Sync now')}\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"outline\" onClick={() => setRevokeTarget(link)}>\n <Unlink className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.aggregation.disconnect', 'Disconnect')}\n </Button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n ) : null}\n </CardContent>\n\n <ConfirmDialog\n open={revokeTarget !== null}\n onOpenChange={(open) => !open && setRevokeTarget(null)}\n title={tr('brainyrich.aggregation.disconnectTitle', 'Disconnect this institution?')}\n description={tr(\n 'brainyrich.aggregation.disconnectDescription',\n 'BrainyRich stops syncing and revokes its access at the provider. Accounts synced from it are marked closed; their history stays.'\n )}\n confirmLabel={tr('brainyrich.aggregation.disconnect', 'Disconnect')}\n pendingLabel={tr('brainyrich.aggregation.disconnecting', 'Disconnecting…')}\n destructive\n pending={revoke.isPending}\n onConfirm={confirmRevoke}\n />\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { toast as e } from "../../node_modules/sonner/dist/index.js";
1
+ import { toast as e } from "sonner";
2
2
  import { extractBackendError as t } from "@burdenoff/fe-libs/shared/utils";
3
3
  //#region src/brainyrich/components/notify.ts
4
4
  var n = {
@@ -329,6 +329,7 @@ export declare const useAggregationLinks: () => {
329
329
  };
330
330
  /** Mints a short-lived Plaid Link token. Imperative: only called when the user starts linking. */
331
331
  export declare const useCreatePlaidLinkToken: () => import('@tanstack/react-query').UseMutationResult<BraPlaidLinkToken, unknown, void, unknown>;
332
+ export declare function syncSummary(result: BraAggregationSyncResult): string;
332
333
  export interface ExchangePlaidPublicTokenVars {
333
334
  publicToken: string;
334
335
  institutionId: string | null;
@@ -338,4 +339,11 @@ export interface ExchangePlaidPublicTokenVars {
338
339
  export declare const useExchangePlaidPublicToken: () => import('@tanstack/react-query').UseMutationResult<BraAggregationSyncResult, unknown, ExchangePlaidPublicTokenVars, unknown>;
339
340
  export declare const useSyncAggregationLink: () => import('@tanstack/react-query').UseMutationResult<BraAggregationSyncResult, unknown, string, unknown>;
340
341
  export declare const useRevokeAggregationLink: () => import('@tanstack/react-query').UseMutationResult<boolean, unknown, string, unknown>;
342
+ /**
343
+ * Mints a Plaid Link token in update mode for an existing link, so the user
344
+ * re-authenticates that same institution instead of linking it twice.
345
+ */
346
+ export declare const useCreatePlaidUpdateLinkToken: () => import('@tanstack/react-query').UseMutationResult<BraPlaidLinkToken, unknown, string, unknown>;
347
+ /** Called once Plaid Link update mode succeeds: clears the link's error and re-syncs it. */
348
+ export declare const useCompletePlaidReauthentication: () => import('@tanstack/react-query').UseMutationResult<BraAggregationSyncResult, unknown, string, unknown>;
341
349
  //# sourceMappingURL=useAggregation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAggregation.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/hooks/useAggregation.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EACxB,iBAAiB,EACjB,UAAU,EACX,MAAM,cAAc,CAAC;AAkBtB,4FAA4F;AAC5F,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkBnC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,uBAAuB,oGAkBnC,CAAC;AAkBF,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,mIAuBvC,CAAC;AAEF,eAAO,MAAM,sBAAsB,6GAqBlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,4FAmBpC,CAAC"}
1
+ {"version":3,"file":"useAggregation.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/hooks/useAggregation.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EACxB,iBAAiB,EACjB,UAAU,EACX,MAAM,cAAc,CAAC;AAoBtB,4FAA4F;AAC5F,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkBnC,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,uBAAuB,oGAkBnC,CAAC;AAiBF,wBAAgB,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAQpE;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,mIAuBvC,CAAC;AAEF,eAAO,MAAM,sBAAsB,6GAqBlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,4FAmBpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,6BAA6B,sGAezC,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,gCAAgC,6GAqB5C,CAAC"}
@@ -13,9 +13,10 @@ var c = {
13
13
  "aggregation",
14
14
  "links"
15
15
  ]
16
- }, l = "\n id workspaceId ownerId provider status institutionId institutionName\n lastSyncedAt lastSyncError createdAt updatedAt\n", u = `
16
+ }, l = "\n id workspaceId ownerId provider status institutionId institutionName\n lastSyncedAt lastSyncError errorCode consentExpiresAt needsReauthentication nextSyncAt\n createdAt updatedAt\n", u = `
17
17
  link { ${l} }
18
18
  accountsSynced transactionsSynced addedTransactions modifiedTransactions removedTransactions
19
+ holdingsSynced
19
20
  `, d = () => {
20
21
  let { apiGatewayUrl: t } = e(), n = o({
21
22
  queryKey: c.providers,
@@ -50,13 +51,19 @@ var c = {
50
51
  function m() {
51
52
  let e = s();
52
53
  return () => {
53
- e.invalidateQueries({ queryKey: c.links }), e.invalidateQueries({ queryKey: t.accounts }), e.invalidateQueries({ queryKey: t.transactions }), e.invalidateQueries({ queryKey: t.netWorth });
54
+ e.invalidateQueries({ queryKey: c.links }), e.invalidateQueries({ queryKey: t.accounts }), e.invalidateQueries({ queryKey: t.holdings }), e.invalidateQueries({ queryKey: t.transactions }), e.invalidateQueries({ queryKey: t.netWorth });
54
55
  };
55
56
  }
56
- function h(e) {
57
- return `Synced ${`${e.accountsSynced} account${e.accountsSynced === 1 ? "" : "s"}`} and ${`${e.transactionsSynced} transaction${e.transactionsSynced === 1 ? "" : "s"}`}`;
57
+ function h(e, t) {
58
+ return `${e} ${t}${e === 1 ? "" : "s"}`;
58
59
  }
59
- var g = () => {
60
+ function g(e) {
61
+ let t = [h(e.accountsSynced, "account"), h(e.transactionsSynced, "transaction")];
62
+ e.holdingsSynced > 0 && t.push(h(e.holdingsSynced, "holding"));
63
+ let n = t.pop();
64
+ return `Synced ${t.length > 0 ? `${t.join(", ")} and ${n}` : n}`;
65
+ }
66
+ var _ = () => {
60
67
  let { apiGatewayUrl: t } = e();
61
68
  return a({
62
69
  mutationFn: async (e) => (await n(`mutation BraExchangePlaidPublicToken(
@@ -67,20 +74,20 @@ var g = () => {
67
74
  ) { ${u} }
68
75
  }`, { ...e }, t)).braExchangePlaidPublicToken,
69
76
  ...i({
70
- success: (e) => `Institution linked. ${h(e)}.`,
77
+ success: (e) => `Institution linked. ${g(e)}.`,
71
78
  onSuccess: m()
72
79
  })
73
80
  });
74
- }, _ = () => {
81
+ }, v = () => {
75
82
  let { apiGatewayUrl: t } = e(), r = m();
76
83
  return a({
77
84
  mutationFn: async (e) => (await n(`mutation BraSyncAggregationLink($id: ID!) {
78
85
  braSyncAggregationLink(id: $id) { ${u} }
79
86
  }`, { id: e }, t)).braSyncAggregationLink,
80
- ...i({ success: (e) => `${h(e)}.` }),
87
+ ...i({ success: (e) => `${g(e)}.` }),
81
88
  onSettled: () => r()
82
89
  });
83
- }, v = () => {
90
+ }, y = () => {
84
91
  let { apiGatewayUrl: t } = e();
85
92
  return a({
86
93
  mutationFn: async (e) => (await n("mutation BraRevokeAggregationLink($id: ID!) {\n braRevokeAggregationLink(id: $id)\n }", { id: e }, t)).braRevokeAggregationLink,
@@ -89,8 +96,23 @@ var g = () => {
89
96
  onSuccess: m()
90
97
  })
91
98
  });
99
+ }, b = () => {
100
+ let { apiGatewayUrl: t } = e();
101
+ return a({
102
+ mutationFn: async (e) => (await n("mutation BraCreatePlaidUpdateLinkToken($id: ID!) {\n braCreatePlaidUpdateLinkToken(id: $id) { linkToken expiration requestId }\n }", { id: e }, t)).braCreatePlaidUpdateLinkToken,
103
+ ...i({})
104
+ });
105
+ }, x = () => {
106
+ let { apiGatewayUrl: t } = e(), r = m();
107
+ return a({
108
+ mutationFn: async (e) => (await n(`mutation BraCompletePlaidReauthentication($id: ID!) {
109
+ braCompletePlaidReauthentication(id: $id) { ${u} }
110
+ }`, { id: e }, t)).braCompletePlaidReauthentication,
111
+ ...i({ success: (e) => `Institution reconnected. ${g(e)}.` }),
112
+ onSettled: () => r()
113
+ });
92
114
  };
93
115
  //#endregion
94
- export { f as useAggregationLinks, d as useAggregationProviders, p as useCreatePlaidLinkToken, g as useExchangePlaidPublicToken, v as useRevokeAggregationLink, _ as useSyncAggregationLink };
116
+ export { f as useAggregationLinks, d as useAggregationProviders, x as useCompletePlaidReauthentication, p as useCreatePlaidLinkToken, b as useCreatePlaidUpdateLinkToken, _ as useExchangePlaidPublicToken, y as useRevokeAggregationLink, v as useSyncAggregationLink };
95
117
 
96
118
  //# sourceMappingURL=useAggregation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAggregation.js","names":[],"sources":["../../../src/brainyrich/hooks/useAggregation.ts"],"sourcesContent":["/**\n * Automatic account aggregation hooks (BOFF-4234).\n *\n * Wired to the `wspace-brainyrich-svc` aggregation module\n * (`src/modules/aggregation/schema/aggregation.gql`). Synced accounts land in\n * the same `BraAccount`/`BraTransaction` rows as manual entry, so every\n * successful link/sync/revoke also invalidates the accounts, transactions and\n * net-worth caches.\n */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport type {\n BraAggregationLink,\n BraAggregationProviderStatus,\n BraAggregationSyncResult,\n BraPlaidLinkToken,\n Connection,\n} from '../types/bra';\nimport { KEY, braMutate, braQuery, mutationFeedback } from './useBrainyRichApi';\n\nconst AGG_KEY = {\n providers: ['brainyrich', 'aggregation', 'providers'] as const,\n links: ['brainyrich', 'aggregation', 'links'] as const,\n};\n\nconst LINK_FIELDS = `\n id workspaceId ownerId provider status institutionId institutionName\n lastSyncedAt lastSyncError createdAt updatedAt\n`;\n\nconst SYNC_RESULT_FIELDS = `\n link { ${LINK_FIELDS} }\n accountsSynced transactionsSynced addedTransactions modifiedTransactions removedTransactions\n`;\n\n/** Provider availability for this deployment — drives whether linking is offered at all. */\nexport const useAggregationProviders = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: AGG_KEY.providers,\n // Configuration only changes on a deploy; no need to refetch per mount.\n staleTime: 5 * 60_000,\n queryFn: async () => {\n const result = await braQuery<{ braAggregationProviders: BraAggregationProviderStatus[] }>(\n `query BraAggregationProviders {\n braAggregationProviders { provider configured environment countryCodes }\n }`,\n {},\n apiGatewayUrl\n );\n return result.braAggregationProviders;\n },\n });\n return { ...query, data: query.data ?? [] };\n};\n\n/** The caller's own linked institutions (links are personal, never shared). */\nexport const useAggregationLinks = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: AGG_KEY.links,\n queryFn: async () => {\n const result = await braQuery<{ braListAggregationLinks: Connection<BraAggregationLink> }>(\n `query BraListAggregationLinks($pagination: PaginationInput) {\n braListAggregationLinks(pagination: $pagination) {\n items { ${LINK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { pagination: { limit: 50 } },\n apiGatewayUrl\n );\n return result.braListAggregationLinks;\n },\n });\n return { ...query, data: query.data?.items ?? [] };\n};\n\n/** Mints a short-lived Plaid Link token. Imperative: only called when the user starts linking. */\nexport const useCreatePlaidLinkToken = () => {\n const { apiGatewayUrl } = useBrainyRich();\n return useMutation({\n mutationFn: async () => {\n // `braCreatePlaidLinkToken` is a Query field on the schema; it is\n // issued through the mutation transport so it never hits the read cache\n // (every Link session needs a fresh token).\n const result = await braMutate<{ braCreatePlaidLinkToken: BraPlaidLinkToken }>(\n `query BraCreatePlaidLinkToken {\n braCreatePlaidLinkToken { linkToken expiration requestId }\n }`,\n {},\n apiGatewayUrl\n );\n return result.braCreatePlaidLinkToken;\n },\n ...mutationFeedback<BraPlaidLinkToken, void>({}),\n });\n};\n\nfunction useInvalidateSyncedData() {\n const qc = useQueryClient();\n return () => {\n qc.invalidateQueries({ queryKey: AGG_KEY.links });\n qc.invalidateQueries({ queryKey: KEY.accounts });\n qc.invalidateQueries({ queryKey: KEY.transactions });\n qc.invalidateQueries({ queryKey: KEY.netWorth });\n };\n}\n\nfunction syncSummary(result: BraAggregationSyncResult): string {\n const accounts = `${result.accountsSynced} account${result.accountsSynced === 1 ? '' : 's'}`;\n const txns = `${result.transactionsSynced} transaction${result.transactionsSynced === 1 ? '' : 's'}`;\n return `Synced ${accounts} and ${txns}`;\n}\n\nexport interface ExchangePlaidPublicTokenVars {\n publicToken: string;\n institutionId: string | null;\n institutionName: string | null;\n}\n\n/** Exchanges the Plaid Link `public_token` server-side and runs the first sync. */\nexport const useExchangePlaidPublicToken = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (vars: ExchangePlaidPublicTokenVars) => {\n const result = await braMutate<{ braExchangePlaidPublicToken: BraAggregationSyncResult }>(\n `mutation BraExchangePlaidPublicToken(\n $publicToken: String!, $institutionId: String, $institutionName: String\n ) {\n braExchangePlaidPublicToken(\n publicToken: $publicToken, institutionId: $institutionId, institutionName: $institutionName\n ) { ${SYNC_RESULT_FIELDS} }\n }`,\n { ...vars },\n apiGatewayUrl\n );\n return result.braExchangePlaidPublicToken;\n },\n ...mutationFeedback<BraAggregationSyncResult, ExchangePlaidPublicTokenVars>({\n success: (data) => `Institution linked. ${syncSummary(data)}.`,\n onSuccess: invalidate,\n }),\n });\n};\n\nexport const useSyncAggregationLink = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{ braSyncAggregationLink: BraAggregationSyncResult }>(\n `mutation BraSyncAggregationLink($id: ID!) {\n braSyncAggregationLink(id: $id) { ${SYNC_RESULT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braSyncAggregationLink;\n },\n ...mutationFeedback<BraAggregationSyncResult, string>({\n success: (data) => `${syncSummary(data)}.`,\n }),\n // Invalidate on success AND failure: a failed sync flips the link to ERROR server-side; refresh so the\n // status badge and error text reflect it.\n onSettled: () => invalidate(),\n });\n};\n\nexport const useRevokeAggregationLink = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{ braRevokeAggregationLink: boolean }>(\n `mutation BraRevokeAggregationLink($id: ID!) {\n braRevokeAggregationLink(id: $id)\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braRevokeAggregationLink;\n },\n ...mutationFeedback<boolean, string>({\n success: 'Institution disconnected. Its synced accounts are now closed.',\n onSuccess: invalidate,\n }),\n });\n};\n"],"mappings":";;;;AAqBA,IAAM,IAAU;CACd,WAAW;EAAC;EAAc;EAAe;CAAW;CACpD,OAAO;EAAC;EAAc;EAAe;CAAO;AAC9C,GAEM,IAAc,gIAKd,IAAqB;WAChB,EAAY;;GAKV,UAAgC;CAC3C,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAQ,EAAS;EACrB,UAAU,EAAQ;EAElB,WAAW,IAAI;EACf,SAAS,aAQA,MAPc,EACnB,kIAGA,CAAC,GACD,CACF,GACc;CAElB,CAAC;CACD,OAAO;EAAE,GAAG;EAAO,MAAM,EAAM,QAAQ,CAAC;CAAE;AAC5C,GAGa,UAA4B;CACvC,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAQ,EAAS;EACrB,UAAU,EAAQ;EAClB,SAAS,aAWA,MAVc,EACnB;;sBAEc,EAAY;;;YAI1B,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,GAC5B,CACF,GACc;CAElB,CAAC;CACD,OAAO;EAAE,GAAG;EAAO,MAAM,EAAM,MAAM,SAAS,CAAC;CAAE;AACnD,GAGa,UAAgC;CAC3C,IAAM,EAAE,qBAAkB,EAAc;CACxC,OAAO,EAAY;EACjB,YAAY,aAWH,MAPc,EACnB,oHAGA,CAAC,GACD,CACF,GACc;EAEhB,GAAG,EAA0C,CAAC,CAAC;CACjD,CAAC;AACH;AAEA,SAAS,IAA0B;CACjC,IAAM,IAAK,EAAe;CAC1B,aAAa;EAIX,AAHA,EAAG,kBAAkB,EAAE,UAAU,EAAQ,MAAM,CAAC,GAChD,EAAG,kBAAkB,EAAE,UAAU,EAAI,SAAS,CAAC,GAC/C,EAAG,kBAAkB,EAAE,UAAU,EAAI,aAAa,CAAC,GACnD,EAAG,kBAAkB,EAAE,UAAU,EAAI,SAAS,CAAC;CACjD;AACF;AAEA,SAAS,EAAY,GAA0C;CAG7D,OAAO,UAAU,GAFG,EAAO,eAAe,UAAU,EAAO,mBAAmB,IAAI,KAAK,MAE7D,OAAO,GADjB,EAAO,mBAAmB,cAAc,EAAO,uBAAuB,IAAI,KAAK;AAEjG;AASA,IAAa,UAAoC;CAC/C,IAAM,EAAE,qBAAkB,EAAc;CAExC,OAAO,EAAY;EACjB,YAAY,OAAO,OAYV,MAXc,EACnB;;;;;gBAKQ,EAAmB;YAE3B,EAAE,GAAG,EAAK,GACV,CACF,GACc;EAEhB,GAAG,EAAyE;GAC1E,UAAU,MAAS,uBAAuB,EAAY,CAAI,EAAE;GAC5D,WAlBe,EAkBJ;EACb,CAAC;CACH,CAAC;AACH,GAEa,UAA+B;CAC1C,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAa,EAAwB;CAC3C,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPc,EACnB;8CACsC,EAAmB;YAEzD,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAAmD,EACpD,UAAU,MAAS,GAAG,EAAY,CAAI,EAAE,GAC1C,CAAC;EAGD,iBAAiB,EAAW;CAC9B,CAAC;AACH,GAEa,UAAiC;CAC5C,IAAM,EAAE,qBAAkB,EAAc;CAExC,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPc,EACnB,yGAGA,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAAkC;GACnC,SAAS;GACT,WAde,EAcJ;EACb,CAAC;CACH,CAAC;AACH"}
1
+ {"version":3,"file":"useAggregation.js","names":[],"sources":["../../../src/brainyrich/hooks/useAggregation.ts"],"sourcesContent":["/**\n * Automatic account aggregation hooks (BOFF-4234, BOFF-9677).\n *\n * Wired to the `wspace-brainyrich-svc` aggregation module\n * (`src/modules/aggregation/schema/aggregation.gql`). Synced accounts land in\n * the same `BraAccount`/`BraTransaction` rows as manual entry, so every\n * successful link/sync/revoke also invalidates the accounts, transactions and\n * net-worth caches.\n */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { useBrainyRich } from '../providers/BrainyRichProvider';\nimport type {\n BraAggregationLink,\n BraAggregationProviderStatus,\n BraAggregationSyncResult,\n BraPlaidLinkToken,\n Connection,\n} from '../types/bra';\nimport { KEY, braMutate, braQuery, mutationFeedback } from './useBrainyRichApi';\n\nconst AGG_KEY = {\n providers: ['brainyrich', 'aggregation', 'providers'] as const,\n links: ['brainyrich', 'aggregation', 'links'] as const,\n};\n\nconst LINK_FIELDS = `\n id workspaceId ownerId provider status institutionId institutionName\n lastSyncedAt lastSyncError errorCode consentExpiresAt needsReauthentication nextSyncAt\n createdAt updatedAt\n`;\n\nconst SYNC_RESULT_FIELDS = `\n link { ${LINK_FIELDS} }\n accountsSynced transactionsSynced addedTransactions modifiedTransactions removedTransactions\n holdingsSynced\n`;\n\n/** Provider availability for this deployment — drives whether linking is offered at all. */\nexport const useAggregationProviders = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: AGG_KEY.providers,\n // Configuration only changes on a deploy; no need to refetch per mount.\n staleTime: 5 * 60_000,\n queryFn: async () => {\n const result = await braQuery<{ braAggregationProviders: BraAggregationProviderStatus[] }>(\n `query BraAggregationProviders {\n braAggregationProviders { provider configured environment countryCodes }\n }`,\n {},\n apiGatewayUrl\n );\n return result.braAggregationProviders;\n },\n });\n return { ...query, data: query.data ?? [] };\n};\n\n/** The caller's own linked institutions (links are personal, never shared). */\nexport const useAggregationLinks = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const query = useQuery({\n queryKey: AGG_KEY.links,\n queryFn: async () => {\n const result = await braQuery<{ braListAggregationLinks: Connection<BraAggregationLink> }>(\n `query BraListAggregationLinks($pagination: PaginationInput) {\n braListAggregationLinks(pagination: $pagination) {\n items { ${LINK_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { pagination: { limit: 50 } },\n apiGatewayUrl\n );\n return result.braListAggregationLinks;\n },\n });\n return { ...query, data: query.data?.items ?? [] };\n};\n\n/** Mints a short-lived Plaid Link token. Imperative: only called when the user starts linking. */\nexport const useCreatePlaidLinkToken = () => {\n const { apiGatewayUrl } = useBrainyRich();\n return useMutation({\n mutationFn: async () => {\n // `braCreatePlaidLinkToken` is a Query field on the schema; it is\n // issued through the mutation transport so it never hits the read cache\n // (every Link session needs a fresh token).\n const result = await braMutate<{ braCreatePlaidLinkToken: BraPlaidLinkToken }>(\n `query BraCreatePlaidLinkToken {\n braCreatePlaidLinkToken { linkToken expiration requestId }\n }`,\n {},\n apiGatewayUrl\n );\n return result.braCreatePlaidLinkToken;\n },\n ...mutationFeedback<BraPlaidLinkToken, void>({}),\n });\n};\n\nfunction useInvalidateSyncedData() {\n const qc = useQueryClient();\n return () => {\n qc.invalidateQueries({ queryKey: AGG_KEY.links });\n qc.invalidateQueries({ queryKey: KEY.accounts });\n qc.invalidateQueries({ queryKey: KEY.holdings });\n qc.invalidateQueries({ queryKey: KEY.transactions });\n qc.invalidateQueries({ queryKey: KEY.netWorth });\n };\n}\n\nfunction plural(count: number, noun: string): string {\n return `${count} ${noun}${count === 1 ? '' : 's'}`;\n}\n\nexport function syncSummary(result: BraAggregationSyncResult): string {\n const parts = [\n plural(result.accountsSynced, 'account'),\n plural(result.transactionsSynced, 'transaction'),\n ];\n if (result.holdingsSynced > 0) parts.push(plural(result.holdingsSynced, 'holding'));\n const last = parts.pop();\n return `Synced ${parts.length > 0 ? `${parts.join(', ')} and ${last}` : last}`;\n}\n\nexport interface ExchangePlaidPublicTokenVars {\n publicToken: string;\n institutionId: string | null;\n institutionName: string | null;\n}\n\n/** Exchanges the Plaid Link `public_token` server-side and runs the first sync. */\nexport const useExchangePlaidPublicToken = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (vars: ExchangePlaidPublicTokenVars) => {\n const result = await braMutate<{ braExchangePlaidPublicToken: BraAggregationSyncResult }>(\n `mutation BraExchangePlaidPublicToken(\n $publicToken: String!, $institutionId: String, $institutionName: String\n ) {\n braExchangePlaidPublicToken(\n publicToken: $publicToken, institutionId: $institutionId, institutionName: $institutionName\n ) { ${SYNC_RESULT_FIELDS} }\n }`,\n { ...vars },\n apiGatewayUrl\n );\n return result.braExchangePlaidPublicToken;\n },\n ...mutationFeedback<BraAggregationSyncResult, ExchangePlaidPublicTokenVars>({\n success: (data) => `Institution linked. ${syncSummary(data)}.`,\n onSuccess: invalidate,\n }),\n });\n};\n\nexport const useSyncAggregationLink = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{ braSyncAggregationLink: BraAggregationSyncResult }>(\n `mutation BraSyncAggregationLink($id: ID!) {\n braSyncAggregationLink(id: $id) { ${SYNC_RESULT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braSyncAggregationLink;\n },\n ...mutationFeedback<BraAggregationSyncResult, string>({\n success: (data) => `${syncSummary(data)}.`,\n }),\n // Invalidate on success AND failure: a failed sync flips the link to ERROR server-side; refresh so the\n // status badge and error text reflect it.\n onSettled: () => invalidate(),\n });\n};\n\nexport const useRevokeAggregationLink = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{ braRevokeAggregationLink: boolean }>(\n `mutation BraRevokeAggregationLink($id: ID!) {\n braRevokeAggregationLink(id: $id)\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braRevokeAggregationLink;\n },\n ...mutationFeedback<boolean, string>({\n success: 'Institution disconnected. Its synced accounts are now closed.',\n onSuccess: invalidate,\n }),\n });\n};\n\n/**\n * Mints a Plaid Link token in update mode for an existing link, so the user\n * re-authenticates that same institution instead of linking it twice.\n */\nexport const useCreatePlaidUpdateLinkToken = () => {\n const { apiGatewayUrl } = useBrainyRich();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{ braCreatePlaidUpdateLinkToken: BraPlaidLinkToken }>(\n `mutation BraCreatePlaidUpdateLinkToken($id: ID!) {\n braCreatePlaidUpdateLinkToken(id: $id) { linkToken expiration requestId }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braCreatePlaidUpdateLinkToken;\n },\n ...mutationFeedback<BraPlaidLinkToken, string>({}),\n });\n};\n\n/** Called once Plaid Link update mode succeeds: clears the link's error and re-syncs it. */\nexport const useCompletePlaidReauthentication = () => {\n const { apiGatewayUrl } = useBrainyRich();\n const invalidate = useInvalidateSyncedData();\n return useMutation({\n mutationFn: async (id: string) => {\n const result = await braMutate<{\n braCompletePlaidReauthentication: BraAggregationSyncResult;\n }>(\n `mutation BraCompletePlaidReauthentication($id: ID!) {\n braCompletePlaidReauthentication(id: $id) { ${SYNC_RESULT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return result.braCompletePlaidReauthentication;\n },\n ...mutationFeedback<BraAggregationSyncResult, string>({\n success: (data) => `Institution reconnected. ${syncSummary(data)}.`,\n }),\n onSettled: () => invalidate(),\n });\n};\n"],"mappings":";;;;AAqBA,IAAM,IAAU;CACd,WAAW;EAAC;EAAc;EAAe;CAAW;CACpD,OAAO;EAAC;EAAc;EAAe;CAAO;AAC9C,GAEM,IAAc,+LAMd,IAAqB;WAChB,EAAY;;;GAMV,UAAgC;CAC3C,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAQ,EAAS;EACrB,UAAU,EAAQ;EAElB,WAAW,IAAI;EACf,SAAS,aAQA,MAPc,EACnB,kIAGA,CAAC,GACD,CACF,GACc;CAElB,CAAC;CACD,OAAO;EAAE,GAAG;EAAO,MAAM,EAAM,QAAQ,CAAC;CAAE;AAC5C,GAGa,UAA4B;CACvC,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAQ,EAAS;EACrB,UAAU,EAAQ;EAClB,SAAS,aAWA,MAVc,EACnB;;sBAEc,EAAY;;;YAI1B,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,GAC5B,CACF,GACc;CAElB,CAAC;CACD,OAAO;EAAE,GAAG;EAAO,MAAM,EAAM,MAAM,SAAS,CAAC;CAAE;AACnD,GAGa,UAAgC;CAC3C,IAAM,EAAE,qBAAkB,EAAc;CACxC,OAAO,EAAY;EACjB,YAAY,aAWH,MAPc,EACnB,oHAGA,CAAC,GACD,CACF,GACc;EAEhB,GAAG,EAA0C,CAAC,CAAC;CACjD,CAAC;AACH;AAEA,SAAS,IAA0B;CACjC,IAAM,IAAK,EAAe;CAC1B,aAAa;EAKX,AAJA,EAAG,kBAAkB,EAAE,UAAU,EAAQ,MAAM,CAAC,GAChD,EAAG,kBAAkB,EAAE,UAAU,EAAI,SAAS,CAAC,GAC/C,EAAG,kBAAkB,EAAE,UAAU,EAAI,SAAS,CAAC,GAC/C,EAAG,kBAAkB,EAAE,UAAU,EAAI,aAAa,CAAC,GACnD,EAAG,kBAAkB,EAAE,UAAU,EAAI,SAAS,CAAC;CACjD;AACF;AAEA,SAAS,EAAO,GAAe,GAAsB;CACnD,OAAO,GAAG,EAAM,GAAG,IAAO,MAAU,IAAI,KAAK;AAC/C;AAEA,SAAgB,EAAY,GAA0C;CACpE,IAAM,IAAQ,CACZ,EAAO,EAAO,gBAAgB,SAAS,GACvC,EAAO,EAAO,oBAAoB,aAAa,CACjD;CACA,AAAI,EAAO,iBAAiB,KAAG,EAAM,KAAK,EAAO,EAAO,gBAAgB,SAAS,CAAC;CAClF,IAAM,IAAO,EAAM,IAAI;CACvB,OAAO,UAAU,EAAM,SAAS,IAAI,GAAG,EAAM,KAAK,IAAI,EAAE,OAAO,MAAS;AAC1E;AASA,IAAa,UAAoC;CAC/C,IAAM,EAAE,qBAAkB,EAAc;CAExC,OAAO,EAAY;EACjB,YAAY,OAAO,OAYV,MAXc,EACnB;;;;;gBAKQ,EAAmB;YAE3B,EAAE,GAAG,EAAK,GACV,CACF,GACc;EAEhB,GAAG,EAAyE;GAC1E,UAAU,MAAS,uBAAuB,EAAY,CAAI,EAAE;GAC5D,WAlBe,EAkBJ;EACb,CAAC;CACH,CAAC;AACH,GAEa,UAA+B;CAC1C,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAa,EAAwB;CAC3C,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPc,EACnB;8CACsC,EAAmB;YAEzD,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAAmD,EACpD,UAAU,MAAS,GAAG,EAAY,CAAI,EAAE,GAC1C,CAAC;EAGD,iBAAiB,EAAW;CAC9B,CAAC;AACH,GAEa,UAAiC;CAC5C,IAAM,EAAE,qBAAkB,EAAc;CAExC,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPc,EACnB,yGAGA,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAAkC;GACnC,SAAS;GACT,WAde,EAcJ;EACb,CAAC;CACH,CAAC;AACH,GAMa,UAAsC;CACjD,IAAM,EAAE,qBAAkB,EAAc;CACxC,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPc,EACnB,sJAGA,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAA4C,CAAC,CAAC;CACnD,CAAC;AACH,GAGa,UAAyC;CACpD,IAAM,EAAE,qBAAkB,EAAc,GAClC,IAAa,EAAwB;CAC3C,OAAO,EAAY;EACjB,YAAY,OAAO,OAUV,MATc,EAGnB;wDACgD,EAAmB;YAEnE,EAAE,MAAG,GACL,CACF,GACc;EAEhB,GAAG,EAAmD,EACpD,UAAU,MAAS,4BAA4B,EAAY,CAAI,EAAE,GACnE,CAAC;EACD,iBAAiB,EAAW;CAC9B,CAAC;AACH"}
@@ -639,6 +639,14 @@ export interface BraAggregationLink {
639
639
  institutionName: string | null;
640
640
  lastSyncedAt: string | null;
641
641
  lastSyncError: string | null;
642
+ /** Plaid error code from the last failed sync or item webhook, e.g. `ITEM_LOGIN_REQUIRED`. */
643
+ errorCode: string | null;
644
+ /** When the institution's consent expires, if Plaid has warned that it will. */
645
+ consentExpiresAt: string | null;
646
+ /** True when only re-authenticating in Plaid Link update mode can repair the link. */
647
+ needsReauthentication: boolean;
648
+ /** When the scheduled daily re-sync next picks this link up. */
649
+ nextSyncAt: string | null;
642
650
  createdAt: string;
643
651
  updatedAt: string;
644
652
  }
@@ -654,5 +662,7 @@ export interface BraAggregationSyncResult {
654
662
  addedTransactions: number;
655
663
  modifiedTransactions: number;
656
664
  removedTransactions: number;
665
+ /** Investment positions written as holdings (0 when the institution shares none). */
666
+ holdingsSynced: number;
657
667
  }
658
668
  //# sourceMappingURL=bra.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bra.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/types/bra.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bra.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/types/bra.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-brainyrich",
3
- "version": "2026.1025.1",
3
+ "version": "2026.1028.1",
4
4
  "description": "Burdenoff BrainyRich Microfrontend",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,163 +0,0 @@
1
- "use client";
2
- import e from "react";
3
- import "react-dom";
4
- //#region node_modules/sonner/dist/index.mjs
5
- function t(e) {
6
- if (!e || typeof document > "u") return;
7
- let t = document.head || document.getElementsByTagName("head")[0], n = document.createElement("style");
8
- n.type = "text/css", t.appendChild(n), n.styleSheet ? n.styleSheet.cssText = e : n.appendChild(document.createTextNode(e));
9
- }
10
- Array(12).fill(0);
11
- var n = 1, r = new class {
12
- constructor() {
13
- this.subscribe = (e) => (this.subscribers.push(e), () => {
14
- let t = this.subscribers.indexOf(e);
15
- this.subscribers.splice(t, 1);
16
- }), this.publish = (e) => {
17
- this.subscribers.forEach((t) => t(e));
18
- }, this.addToast = (e) => {
19
- this.publish(e), this.toasts = [...this.toasts, e];
20
- }, this.create = (e) => {
21
- let { message: t, ...r } = e, i = typeof e?.id == "number" || e.id?.length > 0 ? e.id : n++, a = this.toasts.find((e) => e.id === i), o = e.dismissible === void 0 ? !0 : e.dismissible;
22
- return this.dismissedToasts.has(i) && this.dismissedToasts.delete(i), a ? this.toasts = this.toasts.map((n) => n.id === i ? (this.publish({
23
- ...n,
24
- ...e,
25
- id: i,
26
- title: t
27
- }), {
28
- ...n,
29
- ...e,
30
- id: i,
31
- dismissible: o,
32
- title: t
33
- }) : n) : this.addToast({
34
- title: t,
35
- ...r,
36
- dismissible: o,
37
- id: i
38
- }), i;
39
- }, this.dismiss = (e) => (e ? (this.dismissedToasts.add(e), requestAnimationFrame(() => this.subscribers.forEach((t) => t({
40
- id: e,
41
- dismiss: !0
42
- })))) : this.toasts.forEach((e) => {
43
- this.subscribers.forEach((t) => t({
44
- id: e.id,
45
- dismiss: !0
46
- }));
47
- }), e), this.message = (e, t) => this.create({
48
- ...t,
49
- message: e
50
- }), this.error = (e, t) => this.create({
51
- ...t,
52
- message: e,
53
- type: "error"
54
- }), this.success = (e, t) => this.create({
55
- ...t,
56
- type: "success",
57
- message: e
58
- }), this.info = (e, t) => this.create({
59
- ...t,
60
- type: "info",
61
- message: e
62
- }), this.warning = (e, t) => this.create({
63
- ...t,
64
- type: "warning",
65
- message: e
66
- }), this.loading = (e, t) => this.create({
67
- ...t,
68
- type: "loading",
69
- message: e
70
- }), this.promise = (t, n) => {
71
- if (!n) return;
72
- let r;
73
- n.loading !== void 0 && (r = this.create({
74
- ...n,
75
- promise: t,
76
- type: "loading",
77
- message: n.loading,
78
- description: typeof n.description == "function" ? void 0 : n.description
79
- }));
80
- let i = Promise.resolve(t instanceof Function ? t() : t), o = r !== void 0, s, c = i.then(async (t) => {
81
- if (s = ["resolve", t], e.isValidElement(t)) o = !1, this.create({
82
- id: r,
83
- type: "default",
84
- message: t
85
- });
86
- else if (a(t) && !t.ok) {
87
- o = !1;
88
- let i = typeof n.error == "function" ? await n.error(`HTTP error! status: ${t.status}`) : n.error, a = typeof n.description == "function" ? await n.description(`HTTP error! status: ${t.status}`) : n.description, s = typeof i == "object" && !e.isValidElement(i) ? i : { message: i };
89
- this.create({
90
- id: r,
91
- type: "error",
92
- description: a,
93
- ...s
94
- });
95
- } else if (t instanceof Error) {
96
- o = !1;
97
- let i = typeof n.error == "function" ? await n.error(t) : n.error, a = typeof n.description == "function" ? await n.description(t) : n.description, s = typeof i == "object" && !e.isValidElement(i) ? i : { message: i };
98
- this.create({
99
- id: r,
100
- type: "error",
101
- description: a,
102
- ...s
103
- });
104
- } else if (n.success !== void 0) {
105
- o = !1;
106
- let i = typeof n.success == "function" ? await n.success(t) : n.success, a = typeof n.description == "function" ? await n.description(t) : n.description, s = typeof i == "object" && !e.isValidElement(i) ? i : { message: i };
107
- this.create({
108
- id: r,
109
- type: "success",
110
- description: a,
111
- ...s
112
- });
113
- }
114
- }).catch(async (t) => {
115
- if (s = ["reject", t], n.error !== void 0) {
116
- o = !1;
117
- let i = typeof n.error == "function" ? await n.error(t) : n.error, a = typeof n.description == "function" ? await n.description(t) : n.description, s = typeof i == "object" && !e.isValidElement(i) ? i : { message: i };
118
- this.create({
119
- id: r,
120
- type: "error",
121
- description: a,
122
- ...s
123
- });
124
- }
125
- }).finally(() => {
126
- o && (this.dismiss(r), r = void 0), n.finally == null || n.finally.call(n);
127
- }), l = () => new Promise((e, t) => c.then(() => s[0] === "reject" ? t(s[1]) : e(s[1])).catch(t));
128
- return typeof r != "string" && typeof r != "number" ? { unwrap: l } : Object.assign(r, { unwrap: l });
129
- }, this.custom = (e, t) => {
130
- let r = t?.id || n++;
131
- return this.create({
132
- jsx: e(r),
133
- id: r,
134
- ...t
135
- }), r;
136
- }, this.getActiveToasts = () => this.toasts.filter((e) => !this.dismissedToasts.has(e.id)), this.subscribers = [], this.toasts = [], this.dismissedToasts = /* @__PURE__ */ new Set();
137
- }
138
- }(), i = (e, t) => {
139
- let i = t?.id || n++;
140
- return r.addToast({
141
- title: e,
142
- ...t,
143
- id: i
144
- }), i;
145
- }, a = (e) => e && typeof e == "object" && "ok" in e && typeof e.ok == "boolean" && "status" in e && typeof e.status == "number", o = Object.assign(i, {
146
- success: r.success,
147
- info: r.info,
148
- warning: r.warning,
149
- error: r.error,
150
- custom: r.custom,
151
- message: r.message,
152
- promise: r.promise,
153
- dismiss: r.dismiss,
154
- loading: r.loading
155
- }, {
156
- getHistory: () => r.toasts,
157
- getToasts: () => r.getActiveToasts()
158
- });
159
- t("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");
160
- //#endregion
161
- export { o as toast };
162
-
163
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../node_modules/sonner/dist/index.mjs"],"sourcesContent":["'use client';\nfunction __insertCSS(code) {\n if (!code || typeof document == 'undefined') return\n let head = document.head || document.getElementsByTagName('head')[0]\n let style = document.createElement('style')\n style.type = 'text/css'\n head.appendChild(style)\n ;style.styleSheet ? (style.styleSheet.cssText = code) : style.appendChild(document.createTextNode(code))\n}\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nconst getAsset = (type)=>{\n switch(type){\n case 'success':\n return SuccessIcon;\n case 'info':\n return InfoIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n default:\n return null;\n }\n};\nconst bars = Array(12).fill(0);\nconst Loader = ({ visible, className })=>{\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: [\n 'sonner-loading-wrapper',\n className\n ].filter(Boolean).join(' '),\n \"data-visible\": visible\n }, /*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-spinner\"\n }, bars.map((_, i)=>/*#__PURE__*/ React.createElement(\"div\", {\n className: \"sonner-loading-bar\",\n key: `spinner-bar-${i}`\n }))));\n};\nconst SuccessIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n height: \"20\",\n width: \"20\"\n}, /*#__PURE__*/ React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ React.createElement(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"12\",\n height: \"12\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n}, /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"18\",\n y1: \"6\",\n x2: \"6\",\n y2: \"18\"\n}), /*#__PURE__*/ React.createElement(\"line\", {\n x1: \"6\",\n y1: \"6\",\n x2: \"18\",\n y2: \"18\"\n}));\n\nconst useIsDocumentHidden = ()=>{\n const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);\n React.useEffect(()=>{\n const callback = ()=>{\n setIsDocumentHidden(document.hidden);\n };\n document.addEventListener('visibilitychange', callback);\n return ()=>window.removeEventListener('visibilitychange', callback);\n }, []);\n return isDocumentHidden;\n};\n\nlet toastsCounter = 1;\nclass Observer {\n constructor(){\n // We use arrow functions to maintain the correct `this` reference\n this.subscribe = (subscriber)=>{\n this.subscribers.push(subscriber);\n return ()=>{\n const index = this.subscribers.indexOf(subscriber);\n this.subscribers.splice(index, 1);\n };\n };\n this.publish = (data)=>{\n this.subscribers.forEach((subscriber)=>subscriber(data));\n };\n this.addToast = (data)=>{\n this.publish(data);\n this.toasts = [\n ...this.toasts,\n data\n ];\n };\n this.create = (data)=>{\n var _data_id;\n const { message, ...rest } = data;\n const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n const alreadyExists = this.toasts.find((toast)=>{\n return toast.id === id;\n });\n const dismissible = data.dismissible === undefined ? true : data.dismissible;\n if (this.dismissedToasts.has(id)) {\n this.dismissedToasts.delete(id);\n }\n if (alreadyExists) {\n this.toasts = this.toasts.map((toast)=>{\n if (toast.id === id) {\n this.publish({\n ...toast,\n ...data,\n id,\n title: message\n });\n return {\n ...toast,\n ...data,\n id,\n dismissible,\n title: message\n };\n }\n return toast;\n });\n } else {\n this.addToast({\n title: message,\n ...rest,\n dismissible,\n id\n });\n }\n return id;\n };\n this.dismiss = (id)=>{\n if (id) {\n this.dismissedToasts.add(id);\n requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n id,\n dismiss: true\n })));\n } else {\n this.toasts.forEach((toast)=>{\n this.subscribers.forEach((subscriber)=>subscriber({\n id: toast.id,\n dismiss: true\n }));\n });\n }\n return id;\n };\n this.message = (message, data)=>{\n return this.create({\n ...data,\n message\n });\n };\n this.error = (message, data)=>{\n return this.create({\n ...data,\n message,\n type: 'error'\n });\n };\n this.success = (message, data)=>{\n return this.create({\n ...data,\n type: 'success',\n message\n });\n };\n this.info = (message, data)=>{\n return this.create({\n ...data,\n type: 'info',\n message\n });\n };\n this.warning = (message, data)=>{\n return this.create({\n ...data,\n type: 'warning',\n message\n });\n };\n this.loading = (message, data)=>{\n return this.create({\n ...data,\n type: 'loading',\n message\n });\n };\n this.promise = (promise, data)=>{\n if (!data) {\n // Nothing to show\n return;\n }\n let id = undefined;\n if (data.loading !== undefined) {\n id = this.create({\n ...data,\n promise,\n type: 'loading',\n message: data.loading,\n description: typeof data.description !== 'function' ? data.description : undefined\n });\n }\n const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n let shouldDismiss = id !== undefined;\n let result;\n const originalPromise = p.then(async (response)=>{\n result = [\n 'resolve',\n response\n ];\n const isReactElementResponse = React.isValidElement(response);\n if (isReactElementResponse) {\n shouldDismiss = false;\n this.create({\n id,\n type: 'default',\n message: response\n });\n } else if (isHttpResponse(response) && !response.ok) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(`HTTP error! status: ${response.status}`) : data.error;\n const description = typeof data.description === 'function' ? await data.description(`HTTP error! status: ${response.status}`) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (response instanceof Error) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n } else if (data.success !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'success',\n description,\n ...toastSettings\n });\n }\n }).catch(async (error)=>{\n result = [\n 'reject',\n error\n ];\n if (data.error !== undefined) {\n shouldDismiss = false;\n const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n const isExtendedResult = typeof promiseData === 'object' && !React.isValidElement(promiseData);\n const toastSettings = isExtendedResult ? promiseData : {\n message: promiseData\n };\n this.create({\n id,\n type: 'error',\n description,\n ...toastSettings\n });\n }\n }).finally(()=>{\n if (shouldDismiss) {\n // Toast is still in load state (and will be indefinitely — dismiss it)\n this.dismiss(id);\n id = undefined;\n }\n data.finally == null ? void 0 : data.finally.call(data);\n });\n const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n if (typeof id !== 'string' && typeof id !== 'number') {\n // cannot Object.assign on undefined\n return {\n unwrap\n };\n } else {\n return Object.assign(id, {\n unwrap\n });\n }\n };\n this.custom = (jsx, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n this.create({\n jsx: jsx(id),\n id,\n ...data\n });\n return id;\n };\n this.getActiveToasts = ()=>{\n return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n };\n this.subscribers = [];\n this.toasts = [];\n this.dismissedToasts = new Set();\n }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n const id = (data == null ? void 0 : data.id) || toastsCounter++;\n ToastState.addToast({\n title: message,\n ...data,\n id\n });\n return id;\n};\nconst isHttpResponse = (data)=>{\n return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n success: ToastState.success,\n info: ToastState.info,\n warning: ToastState.warning,\n error: ToastState.error,\n custom: ToastState.custom,\n message: ToastState.message,\n promise: ToastState.promise,\n dismiss: ToastState.dismiss,\n loading: ToastState.loading\n}, {\n getHistory,\n getToasts\n});\n\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\n\nfunction isAction(action) {\n return action.label !== undefined;\n}\n\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n const [y, x] = position.split('-');\n const directions = [];\n if (y) {\n directions.push(y);\n }\n if (x) {\n directions.push(x);\n }\n return directions;\n}\nconst Toast = (props)=>{\n var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n const [swipeDirection, setSwipeDirection] = React.useState(null);\n const [swipeOutDirection, setSwipeOutDirection] = React.useState(null);\n const [mounted, setMounted] = React.useState(false);\n const [removed, setRemoved] = React.useState(false);\n const [swiping, setSwiping] = React.useState(false);\n const [swipeOut, setSwipeOut] = React.useState(false);\n const [isSwiped, setIsSwiped] = React.useState(false);\n const [offsetBeforeRemove, setOffsetBeforeRemove] = React.useState(0);\n const [initialHeight, setInitialHeight] = React.useState(0);\n const remainingTime = React.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n const dragStartTime = React.useRef(null);\n const toastRef = React.useRef(null);\n const isFront = index === 0;\n const isVisible = index + 1 <= visibleToasts;\n const toastType = toast.type;\n const dismissible = toast.dismissible !== false;\n const toastClassname = toast.className || '';\n const toastDescriptionClassname = toast.descriptionClassName || '';\n // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n const heightIndex = React.useMemo(()=>heights.findIndex((height)=>height.toastId === toast.id) || 0, [\n heights,\n toast.id\n ]);\n const closeButton = React.useMemo(()=>{\n var _toast_closeButton;\n return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n }, [\n toast.closeButton,\n closeButtonFromToaster\n ]);\n const duration = React.useMemo(()=>toast.duration || durationFromToaster || TOAST_LIFETIME, [\n toast.duration,\n durationFromToaster\n ]);\n const closeTimerStartTimeRef = React.useRef(0);\n const offset = React.useRef(0);\n const lastCloseTimerStartTimeRef = React.useRef(0);\n const pointerStartRef = React.useRef(null);\n const [y, x] = position.split('-');\n const toastsHeightBefore = React.useMemo(()=>{\n return heights.reduce((prev, curr, reducerIndex)=>{\n // Calculate offset up until current toast\n if (reducerIndex >= heightIndex) {\n return prev;\n }\n return prev + curr.height;\n }, 0);\n }, [\n heights,\n heightIndex\n ]);\n const isDocumentHidden = useIsDocumentHidden();\n const invert = toast.invert || ToasterInvert;\n const disabled = toastType === 'loading';\n offset.current = React.useMemo(()=>heightIndex * gap + toastsHeightBefore, [\n heightIndex,\n toastsHeightBefore\n ]);\n React.useEffect(()=>{\n remainingTime.current = duration;\n }, [\n duration\n ]);\n React.useEffect(()=>{\n // Trigger enter animation without using CSS animation\n setMounted(true);\n }, []);\n React.useEffect(()=>{\n const toastNode = toastRef.current;\n if (toastNode) {\n const height = toastNode.getBoundingClientRect().height;\n // Add toast height to heights array after the toast is mounted\n setInitialHeight(height);\n setHeights((h)=>[\n {\n toastId: toast.id,\n height,\n position: toast.position\n },\n ...h\n ]);\n return ()=>setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n }\n }, [\n setHeights,\n toast.id\n ]);\n React.useLayoutEffect(()=>{\n // Keep height up to date with the content in case it updates\n if (!mounted) return;\n const toastNode = toastRef.current;\n const originalHeight = toastNode.style.height;\n toastNode.style.height = 'auto';\n const newHeight = toastNode.getBoundingClientRect().height;\n toastNode.style.height = originalHeight;\n setInitialHeight(newHeight);\n setHeights((heights)=>{\n const alreadyExists = heights.find((height)=>height.toastId === toast.id);\n if (!alreadyExists) {\n return [\n {\n toastId: toast.id,\n height: newHeight,\n position: toast.position\n },\n ...heights\n ];\n } else {\n return heights.map((height)=>height.toastId === toast.id ? {\n ...height,\n height: newHeight\n } : height);\n }\n });\n }, [\n mounted,\n toast.title,\n toast.description,\n setHeights,\n toast.id,\n toast.jsx,\n toast.action,\n toast.cancel\n ]);\n const deleteToast = React.useCallback(()=>{\n // Save the offset for the exit swipe animation\n setRemoved(true);\n setOffsetBeforeRemove(offset.current);\n setHeights((h)=>h.filter((height)=>height.toastId !== toast.id));\n setTimeout(()=>{\n removeToast(toast);\n }, TIME_BEFORE_UNMOUNT);\n }, [\n toast,\n removeToast,\n setHeights,\n offset\n ]);\n React.useEffect(()=>{\n if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n let timeoutId;\n // Pause the timer on each hover\n const pauseTimer = ()=>{\n if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n // Get the elapsed time since the timer started\n const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n remainingTime.current = remainingTime.current - elapsedTime;\n }\n lastCloseTimerStartTimeRef.current = new Date().getTime();\n };\n const startTimer = ()=>{\n // setTimeout(, Infinity) behaves as if the delay is 0.\n // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n if (remainingTime.current === Infinity) return;\n closeTimerStartTimeRef.current = new Date().getTime();\n // Let the toast know it has started\n timeoutId = setTimeout(()=>{\n toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n deleteToast();\n }, remainingTime.current);\n };\n if (expanded || interacting || isDocumentHidden) {\n pauseTimer();\n } else {\n startTimer();\n }\n return ()=>clearTimeout(timeoutId);\n }, [\n expanded,\n interacting,\n toast,\n toastType,\n isDocumentHidden,\n deleteToast\n ]);\n React.useEffect(()=>{\n if (toast.delete) {\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n }\n }, [\n deleteToast,\n toast.delete\n ]);\n function getLoadingIcon() {\n var _toast_classNames;\n if (icons == null ? void 0 : icons.loading) {\n var _toast_classNames1;\n return /*#__PURE__*/ React.createElement(\"div\", {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n \"data-visible\": toastType === 'loading'\n }, icons.loading);\n }\n return /*#__PURE__*/ React.createElement(Loader, {\n className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n visible: toastType === 'loading'\n });\n }\n const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n var _toast_richColors, _icons_close;\n return /*#__PURE__*/ React.createElement(\"li\", {\n tabIndex: 0,\n ref: toastRef,\n className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n \"data-sonner-toast\": \"\",\n \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n \"data-mounted\": mounted,\n \"data-promise\": Boolean(toast.promise),\n \"data-swiped\": isSwiped,\n \"data-removed\": removed,\n \"data-visible\": isVisible,\n \"data-y-position\": y,\n \"data-x-position\": x,\n \"data-index\": index,\n \"data-front\": isFront,\n \"data-swiping\": swiping,\n \"data-dismissible\": dismissible,\n \"data-type\": toastType,\n \"data-invert\": invert,\n \"data-swipe-out\": swipeOut,\n \"data-swipe-direction\": swipeOutDirection,\n \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n \"data-testid\": toast.testId,\n style: {\n '--index': index,\n '--toasts-before': index,\n '--z-index': toasts.length - index,\n '--offset': `${removed ? offsetBeforeRemove : offset.current}px`,\n '--initial-height': expandByDefault ? 'auto' : `${initialHeight}px`,\n ...style,\n ...toast.style\n },\n onDragEnd: ()=>{\n setSwiping(false);\n setSwipeDirection(null);\n pointerStartRef.current = null;\n },\n onPointerDown: (event)=>{\n if (event.button === 2) return; // Return early on right click\n if (disabled || !dismissible) return;\n dragStartTime.current = new Date();\n setOffsetBeforeRemove(offset.current);\n // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n event.target.setPointerCapture(event.pointerId);\n if (event.target.tagName === 'BUTTON') return;\n setSwiping(true);\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY\n };\n },\n onPointerUp: ()=>{\n var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n if (swipeOut || !dismissible) return;\n pointerStartRef.current = null;\n const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n const velocity = Math.abs(swipeAmount) / timeTaken;\n if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n setOffsetBeforeRemove(offset.current);\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n if (swipeDirection === 'x') {\n setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n } else {\n setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n }\n deleteToast();\n setSwipeOut(true);\n return;\n } else {\n var _toastRef_current2, _toastRef_current3;\n (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', `0px`);\n (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', `0px`);\n }\n setIsSwiped(false);\n setSwiping(false);\n setSwipeDirection(null);\n },\n onPointerMove: (event)=>{\n var _window_getSelection, // Apply transform using both x and y values\n _toastRef_current, _toastRef_current1;\n if (!pointerStartRef.current || !dismissible) return;\n const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n if (isHighlighted) return;\n const yDelta = event.clientY - pointerStartRef.current.y;\n const xDelta = event.clientX - pointerStartRef.current.x;\n var _props_swipeDirections;\n const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n // Determine swipe direction if not already locked\n if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n }\n let swipeAmount = {\n x: 0,\n y: 0\n };\n const getDampening = (delta)=>{\n const factor = Math.abs(delta) / 20;\n return 1 / (1.5 + factor);\n };\n // Only apply swipe in the locked direction\n if (swipeDirection === 'y') {\n // Handle vertical swipes\n if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n swipeAmount.y = yDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = yDelta * getDampening(yDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n }\n }\n } else if (swipeDirection === 'x') {\n // Handle horizontal swipes\n if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n swipeAmount.x = xDelta;\n } else {\n // Smoothly transition to dampened movement\n const dampenedDelta = xDelta * getDampening(xDelta);\n // Ensure we don't jump when transitioning to dampened movement\n swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n }\n }\n }\n if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n setIsSwiped(true);\n }\n (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', `${swipeAmount.x}px`);\n (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', `${swipeAmount.y}px`);\n }\n }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ React.createElement(\"button\", {\n \"aria-label\": closeButtonAriaLabel,\n \"data-disabled\": disabled,\n \"data-close-button\": true,\n onClick: disabled || !dismissible ? ()=>{} : ()=>{\n deleteToast();\n toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n },\n className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-icon\": \"\",\n className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-content\": \"\",\n className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n }, /*#__PURE__*/ React.createElement(\"div\", {\n \"data-title\": \"\",\n className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ React.createElement(\"div\", {\n \"data-description\": \"\",\n className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ React.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-cancel\": true,\n style: toast.cancelButtonStyle || cancelButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.cancel)) return;\n if (!dismissible) return;\n toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n }, toast.cancel.label) : null, /*#__PURE__*/ React.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ React.createElement(\"button\", {\n \"data-button\": true,\n \"data-action\": true,\n style: toast.actionButtonStyle || actionButtonStyle,\n onClick: (event)=>{\n // We need to check twice because typescript\n if (!isAction(toast.action)) return;\n toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n if (event.defaultPrevented) return;\n deleteToast();\n },\n className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n }, toast.action.label) : null);\n};\nfunction getDocumentDirection() {\n if (typeof window === 'undefined') return 'ltr';\n if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n const dirAttribute = document.documentElement.getAttribute('dir');\n if (dirAttribute === 'auto' || !dirAttribute) {\n return window.getComputedStyle(document.documentElement).direction;\n }\n return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n const styles = {};\n [\n defaultOffset,\n mobileOffset\n ].forEach((offset, index)=>{\n const isMobile = index === 1;\n const prefix = isMobile ? '--mobile-offset' : '--offset';\n const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n function assignAll(offset) {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n styles[`${prefix}-${key}`] = typeof offset === 'number' ? `${offset}px` : offset;\n });\n }\n if (typeof offset === 'number' || typeof offset === 'string') {\n assignAll(offset);\n } else if (typeof offset === 'object') {\n [\n 'top',\n 'right',\n 'bottom',\n 'left'\n ].forEach((key)=>{\n if (offset[key] === undefined) {\n styles[`${prefix}-${key}`] = defaultValue;\n } else {\n styles[`${prefix}-${key}`] = typeof offset[key] === 'number' ? `${offset[key]}px` : offset[key];\n }\n });\n } else {\n assignAll(defaultValue);\n }\n });\n return styles;\n}\nfunction useSonner() {\n const [activeToasts, setActiveToasts] = React.useState([]);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>toasts.filter((t)=>t.id !== toast.id));\n });\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setActiveToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, []);\n return {\n toasts: activeToasts\n };\n}\nconst Toaster = /*#__PURE__*/ React.forwardRef(function Toaster(props, ref) {\n const { id, invert, position = 'bottom-right', hotkey = [\n 'altKey',\n 'KeyT'\n ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n const [toasts, setToasts] = React.useState([]);\n const filteredToasts = React.useMemo(()=>{\n if (id) {\n return toasts.filter((toast)=>toast.toasterId === id);\n }\n return toasts.filter((toast)=>!toast.toasterId);\n }, [\n toasts,\n id\n ]);\n const possiblePositions = React.useMemo(()=>{\n return Array.from(new Set([\n position\n ].concat(filteredToasts.filter((toast)=>toast.position).map((toast)=>toast.position))));\n }, [\n filteredToasts,\n position\n ]);\n const [heights, setHeights] = React.useState([]);\n const [expanded, setExpanded] = React.useState(false);\n const [interacting, setInteracting] = React.useState(false);\n const [actualTheme, setActualTheme] = React.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n const listRef = React.useRef(null);\n const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n const lastFocusedElementRef = React.useRef(null);\n const isFocusWithinRef = React.useRef(false);\n const removeToast = React.useCallback((toastToRemove)=>{\n setToasts((toasts)=>{\n var _toasts_find;\n if (!((_toasts_find = toasts.find((toast)=>toast.id === toastToRemove.id)) == null ? void 0 : _toasts_find.delete)) {\n ToastState.dismiss(toastToRemove.id);\n }\n return toasts.filter(({ id })=>id !== toastToRemove.id);\n });\n }, []);\n React.useEffect(()=>{\n return ToastState.subscribe((toast)=>{\n if (toast.dismiss) {\n // Prevent batching of other state updates\n requestAnimationFrame(()=>{\n setToasts((toasts)=>toasts.map((t)=>t.id === toast.id ? {\n ...t,\n delete: true\n } : t));\n });\n return;\n }\n // Prevent batching, temp solution.\n setTimeout(()=>{\n ReactDOM.flushSync(()=>{\n setToasts((toasts)=>{\n const indexOfExistingToast = toasts.findIndex((t)=>t.id === toast.id);\n // Update the toast if it already exists\n if (indexOfExistingToast !== -1) {\n return [\n ...toasts.slice(0, indexOfExistingToast),\n {\n ...toasts[indexOfExistingToast],\n ...toast\n },\n ...toasts.slice(indexOfExistingToast + 1)\n ];\n }\n return [\n toast,\n ...toasts\n ];\n });\n });\n });\n });\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n if (theme !== 'system') {\n setActualTheme(theme);\n return;\n }\n if (theme === 'system') {\n // check if current preference is dark\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n // it's currently dark\n setActualTheme('dark');\n } else {\n // it's not dark\n setActualTheme('light');\n }\n }\n if (typeof window === 'undefined') return;\n const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n try {\n // Chrome & Firefox\n darkMediaQuery.addEventListener('change', ({ matches })=>{\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n });\n } catch (error) {\n // Safari < 14\n darkMediaQuery.addListener(({ matches })=>{\n try {\n if (matches) {\n setActualTheme('dark');\n } else {\n setActualTheme('light');\n }\n } catch (e) {\n console.error(e);\n }\n });\n }\n }, [\n theme\n ]);\n React.useEffect(()=>{\n // Ensure expanded is always false when no toasts are present / only one left\n if (toasts.length <= 1) {\n setExpanded(false);\n }\n }, [\n toasts\n ]);\n React.useEffect(()=>{\n const handleKeyDown = (event)=>{\n var _listRef_current;\n const isHotkeyPressed = hotkey.every((key)=>event[key] || event.code === key);\n if (isHotkeyPressed) {\n var _listRef_current1;\n setExpanded(true);\n (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n }\n if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n setExpanded(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return ()=>document.removeEventListener('keydown', handleKeyDown);\n }, [\n hotkey\n ]);\n React.useEffect(()=>{\n if (listRef.current) {\n return ()=>{\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n isFocusWithinRef.current = false;\n }\n };\n }\n }, [\n listRef.current\n ]);\n return(// Remove item from normal navigation flow, only available via hotkey\n /*#__PURE__*/ React.createElement(\"section\", {\n ref: ref,\n \"aria-label\": `${containerAriaLabel} ${hotkeyLabel}`,\n tabIndex: -1,\n \"aria-live\": \"polite\",\n \"aria-relevant\": \"additions text\",\n \"aria-atomic\": \"false\",\n suppressHydrationWarning: true\n }, possiblePositions.map((position, index)=>{\n var _heights_;\n const [y, x] = position.split('-');\n if (!filteredToasts.length) return null;\n return /*#__PURE__*/ React.createElement(\"ol\", {\n key: position,\n dir: dir === 'auto' ? getDocumentDirection() : dir,\n tabIndex: -1,\n ref: listRef,\n className: className,\n \"data-sonner-toaster\": true,\n \"data-sonner-theme\": actualTheme,\n \"data-y-position\": y,\n \"data-x-position\": x,\n style: {\n '--front-toast-height': `${((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0}px`,\n '--width': `${TOAST_WIDTH}px`,\n '--gap': `${gap}px`,\n ...style,\n ...assignOffset(offset, mobileOffset)\n },\n onBlur: (event)=>{\n if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n isFocusWithinRef.current = false;\n if (lastFocusedElementRef.current) {\n lastFocusedElementRef.current.focus({\n preventScroll: true\n });\n lastFocusedElementRef.current = null;\n }\n }\n },\n onFocus: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n if (!isFocusWithinRef.current) {\n isFocusWithinRef.current = true;\n lastFocusedElementRef.current = event.relatedTarget;\n }\n },\n onMouseEnter: ()=>setExpanded(true),\n onMouseMove: ()=>setExpanded(true),\n onMouseLeave: ()=>{\n // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n if (!interacting) {\n setExpanded(false);\n }\n },\n onDragEnd: ()=>setExpanded(false),\n onPointerDown: (event)=>{\n const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n if (isNotDismissible) return;\n setInteracting(true);\n },\n onPointerUp: ()=>setInteracting(false)\n }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n var _toastOptions_duration, _toastOptions_closeButton;\n return /*#__PURE__*/ React.createElement(Toast, {\n key: toast.id,\n icons: icons,\n index: index,\n toast: toast,\n defaultRichColors: richColors,\n duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n className: toastOptions == null ? void 0 : toastOptions.className,\n descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n invert: invert,\n visibleToasts: visibleToasts,\n closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n interacting: interacting,\n position: position,\n style: toastOptions == null ? void 0 : toastOptions.style,\n unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n removeToast: removeToast,\n toasts: filteredToasts.filter((t)=>t.position == toast.position),\n heights: heights.filter((h)=>h.position == toast.position),\n setHeights: setHeights,\n expandByDefault: expand,\n gap: gap,\n expanded: expanded,\n swipeDirections: props.swipeDirections\n });\n }));\n })));\n});\n\nexport { Toaster, toast, useSonner };\n"],"x_google_ignoreList":[0],"mappings":"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"}