@nylas/react 2.2.4 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE.md +1 -0
  2. package/README.md +208 -4
  3. package/dist/cjs/components.js +501 -0
  4. package/dist/cjs/components.js.map +1 -0
  5. package/dist/cjs/connect.js +2 -1
  6. package/dist/cjs/connect.js.map +1 -0
  7. package/dist/cjs/elements.js +2 -1
  8. package/dist/cjs/elements.js.map +1 -0
  9. package/dist/cjs/index.js +2 -1
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/p-DVWbg8if.js +292 -0
  12. package/dist/cjs/p-DVWbg8if.js.map +1 -0
  13. package/dist/cjs/utils.js +2 -1
  14. package/dist/cjs/utils.js.map +1 -0
  15. package/dist/connect.d.ts +1 -1
  16. package/dist/elements.d.ts +1 -1
  17. package/dist/es/components.js +40349 -0
  18. package/dist/es/components.js.map +1 -0
  19. package/dist/es/connect.js +241 -157
  20. package/dist/es/connect.js.map +1 -0
  21. package/dist/es/elements.js +134 -1317
  22. package/dist/es/elements.js.map +1 -0
  23. package/dist/es/index.js +137 -279
  24. package/dist/es/index.js.map +1 -0
  25. package/dist/es/p-DVWbg8if.js +18604 -0
  26. package/dist/es/p-DVWbg8if.js.map +1 -0
  27. package/dist/es/utils.js +6 -2
  28. package/dist/es/utils.js.map +1 -0
  29. package/dist/index.d.ts +1 -1
  30. package/dist/src/connect/NylasConnectButton.d.ts +42 -0
  31. package/dist/src/connect/NylasConnectButton.d.ts.map +1 -0
  32. package/dist/src/connect/NylasConnectButton.test.d.ts +2 -0
  33. package/dist/src/connect/NylasConnectButton.test.d.ts.map +1 -0
  34. package/dist/src/connect/index.d.ts +9 -0
  35. package/dist/src/connect/index.d.ts.map +1 -0
  36. package/dist/{lib → src}/connect/types.d.ts +3 -2
  37. package/dist/src/connect/types.d.ts.map +1 -0
  38. package/dist/{lib → src}/connect/useNylasConnect.d.ts +11 -5
  39. package/dist/src/connect/useNylasConnect.d.ts.map +1 -0
  40. package/dist/src/connect/useNylasConnect.test.d.ts +2 -0
  41. package/dist/src/connect/useNylasConnect.test.d.ts.map +1 -0
  42. package/dist/src/connect.d.ts +2 -0
  43. package/dist/src/connect.d.ts.map +1 -0
  44. package/dist/{lib → src}/elements/components.d.ts +145 -143
  45. package/dist/src/elements/components.d.ts.map +1 -0
  46. package/dist/src/elements.d.ts +2 -0
  47. package/dist/src/elements.d.ts.map +1 -0
  48. package/dist/src/index.d.ts +3 -0
  49. package/dist/src/index.d.ts.map +1 -0
  50. package/dist/src/main.d.ts +2 -0
  51. package/dist/src/main.d.ts.map +1 -0
  52. package/dist/src/utils.d.ts +3 -0
  53. package/dist/src/utils.d.ts.map +1 -0
  54. package/dist/style.css +1 -1
  55. package/dist/utils.d.ts +1 -1
  56. package/dist/vitest.setup.d.ts +2 -0
  57. package/dist/vitest.setup.d.ts.map +1 -0
  58. package/package.json +32 -24
  59. package/dist/cjs/notetaker.js +0 -62
  60. package/dist/es/notetaker.js +0 -5784
  61. package/dist/lib/connect/index.d.ts +0 -6
  62. package/dist/lib/connect/useNylasConnect.test.d.ts +0 -1
  63. package/dist/lib/connect.d.ts +0 -1
  64. package/dist/lib/elements.d.ts +0 -1
  65. package/dist/lib/index.d.ts +0 -3
  66. package/dist/lib/main.d.ts +0 -0
  67. package/dist/lib/notetaker/CalendarSync/CalendarSync.d.ts +0 -37
  68. package/dist/lib/notetaker/CalendarSync/CalendarSync.spec.d.ts +0 -0
  69. package/dist/lib/notetaker/SendNotetaker/SendNotetaker.d.ts +0 -32
  70. package/dist/lib/notetaker/SendNotetaker/SendNotetaker.spec.d.ts +0 -1
  71. package/dist/lib/notetaker/Transcript/Transcript.d.ts +0 -23
  72. package/dist/lib/notetaker/Transcript/Transcript.spec.d.ts +0 -0
  73. package/dist/lib/notetaker/VideoPlayer/VideoPlayer.d.ts +0 -24
  74. package/dist/lib/notetaker/VideoPlayer/VideoPlayer.spec.d.ts +0 -1
  75. package/dist/lib/notetaker/index.d.ts +0 -9
  76. package/dist/lib/notetaker/lib/constants.d.ts +0 -12
  77. package/dist/lib/notetaker/lib/http-client.d.ts +0 -2
  78. package/dist/lib/notetaker/lib/primitives.d.ts +0 -66
  79. package/dist/lib/notetaker/lib/store.d.ts +0 -6
  80. package/dist/lib/notetaker/types.d.ts +0 -42
  81. package/dist/lib/notetaker.d.ts +0 -1
  82. package/dist/lib/utils.d.ts +0 -2
  83. package/dist/notetaker.d.ts +0 -1
  84. package/dist/test/vitest.setup.d.ts +0 -0
@@ -1,138 +1,137 @@
1
- import { useRef as m, useEffect as f, useState as _, useCallback as i } from "react";
2
- import { NylasConnect as U } from "@nylas/connect";
3
- import { BrowserTokenStorage as K, ConfigError as V, MemoryTokenStorage as B, NetworkError as W, NylasConnect as X, NylasConnectError as j, OAuthError as q, PopupError as F, TokenError as H, isConnectCallback as J, logger as Q, parseConnectCallback as Y } from "@nylas/connect";
4
- function v(y) {
1
+ import { useRef as A, useEffect as b, useState as M, useCallback as g } from "react";
2
+ import { NylasConnect as B } from "@nylas/connect";
3
+ import { BrowserTokenStorage as X, ConfigError as q, MemoryTokenStorage as F, NetworkError as H, NylasConnect as J, NylasConnectError as Q, OAuthError as Y, PopupError as Z, TokenError as ee, isConnectCallback as te, logger as ne, parseConnectCallback as re } from "@nylas/connect";
4
+ import { jsx as j } from "react/jsx-runtime";
5
+ function v(P) {
5
6
  const {
6
- autoRefreshInterval: d,
7
- initialLoadingState: P = !0,
8
- retryAttempts: u = 0,
9
- enableAutoRecovery: C = !1,
10
- ...L
11
- } = y, h = m(null);
12
- h.current || (h.current = new U(L));
13
- const t = h.current, w = m({
7
+ autoRefreshInterval: u,
8
+ initialLoadingState: k = !0,
9
+ retryAttempts: i = 0,
10
+ enableAutoRecovery: y = !1,
11
+ ...h
12
+ } = P, d = A(null);
13
+ d.current || (d.current = new B(h));
14
+ const s = d.current, C = A({
14
15
  isProcessing: !1,
15
16
  processedUrl: null,
16
17
  hasProcessed: !1
17
18
  });
18
- f(() => {
19
- var e;
20
- const n = ((e = globalThis.window) == null ? void 0 : e.location.href) || "", s = w.current;
21
- !(n.includes("code=") && n.includes("state=")) && s.hasProcessed && (s.hasProcessed = !1, s.processedUrl = null);
22
- }), f(() => {
23
- if (!t.isAutoCallbackEnabled())
19
+ b(() => {
20
+ const r = globalThis.window?.location.href || "", o = C.current;
21
+ !(r.includes("code=") && r.includes("state=")) && o.hasProcessed && (o.hasProcessed = !1, o.processedUrl = null);
22
+ }), b(() => {
23
+ if (!h.autoHandleCallback)
24
24
  return;
25
- const n = w;
25
+ const r = C;
26
26
  return (async () => {
27
- var o, g, b;
28
- const r = ((o = globalThis.window) == null ? void 0 : o.location.href) || "", e = n.current;
29
- if (!(e.isProcessing || e.processedUrl === r || e.hasProcessed || !(r.includes("code=") && r.includes("state=")))) {
27
+ const t = globalThis.window?.location.href || "", e = r.current;
28
+ if (!(e.isProcessing || e.processedUrl === t || e.hasProcessed || !(t.includes("code=") && t.includes("state=")))) {
30
29
  try {
31
- if (await t.getSession()) {
32
- e.hasProcessed = !0, e.processedUrl = r;
30
+ if (await s.getSession()) {
31
+ e.hasProcessed = !0, e.processedUrl = t;
33
32
  return;
34
33
  }
35
34
  } catch {
36
35
  }
37
- e.isProcessing = !0, e.processedUrl = r;
36
+ e.isProcessing = !0, e.processedUrl = t;
38
37
  try {
39
- if (await t.callback(), e.hasProcessed = !0, (b = (g = globalThis.window) == null ? void 0 : g.history) != null && b.replaceState) {
40
- const c = new URL(globalThis.window.location.href), D = ["code", "state", "error", "error_description"];
41
- let E = !1;
42
- D.forEach((S) => {
43
- c.searchParams.has(S) && (c.searchParams.delete(S), E = !0);
44
- }), E && globalThis.window.history.replaceState(
38
+ if (await s.callback(), e.hasProcessed = !0, globalThis.window?.history?.replaceState) {
39
+ const n = new URL(globalThis.window.location.href), l = ["code", "state", "error", "error_description"];
40
+ let w = !1;
41
+ l.forEach((S) => {
42
+ n.searchParams.has(S) && (n.searchParams.delete(S), w = !0);
43
+ }), w && globalThis.window.history.replaceState(
45
44
  globalThis.window.history.state,
46
45
  document.title,
47
- c.toString()
46
+ n.toString()
48
47
  );
49
48
  }
50
- } catch (c) {
51
- console.log("callback error", c), e.isProcessing = !1, e.processedUrl = null;
49
+ } catch (n) {
50
+ console.log("callback error", n), e.isProcessing = !1, e.processedUrl = null;
52
51
  } finally {
53
52
  e.isProcessing = !1;
54
53
  }
55
54
  }
56
55
  })(), () => {
57
- const r = n.current;
58
- r != null && r.isProcessing || (r.processedUrl = null, r.hasProcessed = !1);
56
+ const t = r.current;
57
+ t?.isProcessing || (t.processedUrl = null, t.hasProcessed = !1);
59
58
  };
60
- }, [t]);
61
- const [p, l] = _({
59
+ }, [s]);
60
+ const [m, c] = M({
62
61
  isConnected: !1,
63
62
  grant: null,
64
- isLoading: P,
63
+ isLoading: k,
65
64
  error: null
66
65
  });
67
- f(() => {
68
- let n = !0;
66
+ b(() => {
67
+ let r = !0;
69
68
  return (async () => {
70
69
  try {
71
- const r = await t.getSession(), e = await t.isConnected();
72
- n && l((a) => ({
73
- ...a,
74
- isConnected: e,
75
- grant: (r == null ? void 0 : r.grantInfo) || null,
70
+ const t = await s.getSession(), a = await s.getConnectionStatus() === "connected";
71
+ r && c((n) => ({
72
+ ...n,
73
+ isConnected: a,
74
+ grant: t?.grantInfo || null,
76
75
  isLoading: !1,
77
76
  error: null
78
77
  }));
79
- } catch (r) {
80
- n && l((e) => ({
78
+ } catch (t) {
79
+ r && c((e) => ({
81
80
  ...e,
82
81
  isConnected: !1,
83
82
  grant: null,
84
83
  isLoading: !1,
85
- error: r
84
+ error: t
86
85
  }));
87
86
  }
88
87
  })(), () => {
89
- n = !1;
88
+ r = !1;
90
89
  };
91
- }, [t]), f(() => {
92
- if (!d || d <= 0)
90
+ }, [s]), b(() => {
91
+ if (!u || u <= 0)
93
92
  return;
94
- const n = setInterval(async () => {
93
+ const r = setInterval(async () => {
95
94
  try {
96
- const s = await t.getSession(), r = await t.isConnected();
97
- l((e) => ({
98
- ...e,
99
- isConnected: r,
100
- grant: (s == null ? void 0 : s.grantInfo) || null,
95
+ const o = await s.getSession(), e = await s.getConnectionStatus() === "connected";
96
+ c((a) => ({
97
+ ...a,
98
+ isConnected: e,
99
+ grant: o?.grantInfo || null,
101
100
  error: null
102
101
  }));
103
- } catch (s) {
104
- C ? console.debug(
102
+ } catch (o) {
103
+ y ? console.debug(
105
104
  "Auto-refresh failed, will retry next interval:",
106
- s
107
- ) : l((r) => ({
108
- ...r,
109
- error: s
105
+ o
106
+ ) : c((t) => ({
107
+ ...t,
108
+ error: o
110
109
  }));
111
110
  }
112
- }, d);
113
- return () => clearInterval(n);
114
- }, [t, d, C]), f(() => {
115
- const n = (r, e, a) => {
116
- l((o) => {
117
- switch (r) {
111
+ }, u);
112
+ return () => clearInterval(r);
113
+ }, [s, u, y]), b(() => {
114
+ const r = (t, e, a) => {
115
+ c((n) => {
116
+ switch (t) {
118
117
  case "CONNECT_STARTED":
119
118
  return {
120
- ...o,
119
+ ...n,
121
120
  isLoading: !0,
122
121
  error: null
123
122
  };
124
123
  case "SIGNED_IN":
125
124
  case "SESSION_RESTORED":
126
125
  return {
127
- ...o,
126
+ ...n,
128
127
  isConnected: !0,
129
- grant: (e == null ? void 0 : e.grantInfo) || null,
128
+ grant: e?.grantInfo || null,
130
129
  isLoading: !1,
131
130
  error: null
132
131
  };
133
132
  case "SIGNED_OUT":
134
133
  return {
135
- ...o,
134
+ ...n,
136
135
  isConnected: !1,
137
136
  grant: null,
138
137
  isLoading: !1,
@@ -142,143 +141,228 @@ function v(y) {
142
141
  case "NETWORK_ERROR":
143
142
  case "TOKEN_VALIDATION_ERROR":
144
143
  return {
145
- ...o,
144
+ ...n,
146
145
  isLoading: !1,
147
- error: (a == null ? void 0 : a.error) || new Error("Authentication error")
146
+ error: a?.error || new Error("Authentication error")
148
147
  };
149
148
  case "CONNECT_CANCELLED":
150
149
  return {
151
- ...o,
150
+ ...n,
152
151
  isLoading: !1,
153
152
  error: null
154
153
  };
155
154
  case "SESSION_EXPIRED":
156
155
  case "SESSION_INVALID":
157
156
  return {
158
- ...o,
157
+ ...n,
159
158
  isConnected: !1,
160
159
  grant: null,
161
160
  isLoading: !1,
162
161
  error: null
163
162
  };
164
163
  default:
165
- return o;
164
+ return n;
166
165
  }
167
166
  });
168
167
  };
169
- return t.onConnectStateChange(
170
- n
168
+ return s.onConnectStateChange(
169
+ r
171
170
  );
172
- }, [t]);
173
- const N = i(
174
- async (n = {}) => {
175
- l((e) => ({ ...e, isLoading: !0, error: null }));
176
- let s;
177
- const r = u + 1;
178
- for (let e = 1; e <= r; e++)
171
+ }, [s]);
172
+ const N = g(
173
+ async (r = {}) => {
174
+ c((e) => ({ ...e, isLoading: !0, error: null }));
175
+ let o;
176
+ const t = i + 1;
177
+ for (let e = 1; e <= t; e++)
179
178
  try {
180
- return await t.connect(n);
179
+ return await s.connect(r);
181
180
  } catch (a) {
182
- if (s = a, e < r) {
183
- const o = Math.min(1e3 * Math.pow(2, e - 1), 5e3);
184
- await new Promise((g) => setTimeout(g, o));
181
+ if (o = a, e < t) {
182
+ const n = Math.min(1e3 * Math.pow(2, e - 1), 5e3);
183
+ await new Promise((l) => setTimeout(l, n));
185
184
  }
186
185
  }
187
- throw s;
186
+ throw o;
188
187
  },
189
- [t, u]
190
- ), T = i(
191
- async (n) => {
192
- l((e) => ({ ...e, isLoading: !0, error: null }));
193
- let s;
194
- const r = u + 1;
195
- for (let e = 1; e <= r; e++)
188
+ [s, i]
189
+ ), E = g(
190
+ async (r) => {
191
+ c((e) => ({ ...e, isLoading: !0, error: null }));
192
+ let o;
193
+ const t = i + 1;
194
+ for (let e = 1; e <= t; e++)
196
195
  try {
197
- await t.logout(n);
196
+ await s.logout(r);
198
197
  return;
199
198
  } catch (a) {
200
- if (s = a, e < r) {
201
- const o = Math.min(1e3 * Math.pow(2, e - 1), 3e3);
202
- await new Promise((g) => setTimeout(g, o));
199
+ if (o = a, e < t) {
200
+ const n = Math.min(1e3 * Math.pow(2, e - 1), 3e3);
201
+ await new Promise((l) => setTimeout(l, n));
203
202
  }
204
203
  }
205
- throw l((e) => ({
204
+ throw c((e) => ({
206
205
  ...e,
207
206
  isLoading: !1,
208
- error: s
209
- })), s;
207
+ error: o
208
+ })), o;
210
209
  },
211
- [t, u]
212
- ), R = i(async () => {
213
- l((r) => ({ ...r, isLoading: !0, error: null }));
214
- let n;
215
- const s = u + 1;
216
- for (let r = 1; r <= s; r++)
210
+ [s, i]
211
+ ), L = g(async () => {
212
+ c((t) => ({ ...t, isLoading: !0, error: null }));
213
+ let r;
214
+ const o = i + 1;
215
+ for (let t = 1; t <= o; t++)
217
216
  try {
218
- const e = await t.getSession(), a = await t.isConnected();
219
- l((o) => ({
220
- ...o,
221
- isConnected: a,
222
- grant: (e == null ? void 0 : e.grantInfo) || null,
217
+ const e = await s.getSession(), n = await s.getConnectionStatus() === "connected";
218
+ c((l) => ({
219
+ ...l,
220
+ isConnected: n,
221
+ grant: e?.grantInfo || null,
223
222
  isLoading: !1,
224
223
  error: null
225
224
  }));
226
225
  return;
227
226
  } catch (e) {
228
- if (n = e, r < s) {
229
- const a = Math.min(1e3 * Math.pow(2, r - 1), 3e3);
230
- await new Promise((o) => setTimeout(o, a));
227
+ if (r = e, t < o) {
228
+ const a = Math.min(1e3 * Math.pow(2, t - 1), 3e3);
229
+ await new Promise((n) => setTimeout(n, a));
231
230
  }
232
231
  }
233
- throw l((r) => ({
234
- ...r,
232
+ throw c((t) => ({
233
+ ...t,
235
234
  isConnected: !1,
236
235
  grant: null,
237
236
  isLoading: !1,
238
- error: n
239
- })), n;
240
- }, [t, u]), k = i(
241
- (n) => t.onConnectStateChange(n),
242
- [t]
243
- ), I = i(() => {
244
- t.enableDebug();
245
- }, [t]), A = i(() => {
246
- t.disableDebug();
247
- }, [t]), O = i(
248
- (n) => {
249
- t.setLogLevel(n);
237
+ error: r
238
+ })), r;
239
+ }, [s, i]), T = g(
240
+ (r) => s.onConnectStateChange(r),
241
+ [s]
242
+ ), R = g(
243
+ (r) => {
244
+ s.setLogLevel(r);
250
245
  },
251
- [t]
246
+ [s]
252
247
  );
253
248
  return {
254
249
  // State
255
- ...p,
250
+ ...m,
256
251
  // Actions
257
252
  connect: N,
258
- logout: T,
259
- refreshSession: R,
260
- subscribe: k,
253
+ logout: E,
254
+ refreshSession: L,
255
+ subscribe: T,
261
256
  // Logger controls
262
- enableDebug: I,
263
- disableDebug: A,
264
- setLogLevel: O,
257
+ setLogLevel: R,
265
258
  // Direct access
266
- connectClient: t,
267
- logger: t.logger
259
+ connectClient: s
268
260
  };
269
261
  }
262
+ function V({
263
+ clientId: P,
264
+ redirectUri: u,
265
+ apiUrl: k,
266
+ defaultScopes: i,
267
+ persistTokens: y,
268
+ method: h = "inline",
269
+ provider: d,
270
+ scopes: s,
271
+ loginHint: C,
272
+ popupWidth: m,
273
+ popupHeight: c,
274
+ text: N = "Connect your inbox",
275
+ className: E,
276
+ style: L,
277
+ disabled: T,
278
+ // styling
279
+ variant: R = "primary",
280
+ size: r = "md",
281
+ unstyled: o = !1,
282
+ cssVars: t,
283
+ // advanced config
284
+ identityProviderToken: e,
285
+ codeExchange: a,
286
+ onStart: n,
287
+ onSuccess: l,
288
+ onError: w,
289
+ onCancel: S,
290
+ children: U
291
+ }) {
292
+ const { connect: p, isLoading: O } = v({
293
+ clientId: P,
294
+ redirectUri: u,
295
+ apiUrl: k,
296
+ // Only pass defaultScopes if caller provides it to override defaults
297
+ ...i ? { defaultScopes: i } : {},
298
+ persistTokens: y,
299
+ autoHandleCallback: !0,
300
+ identityProviderToken: e,
301
+ codeExchange: a
302
+ }), _ = g(async () => {
303
+ try {
304
+ n?.();
305
+ const f = await p({
306
+ method: h,
307
+ provider: d,
308
+ scopes: s,
309
+ loginHint: C,
310
+ popupWidth: m,
311
+ popupHeight: c
312
+ });
313
+ if (typeof f == "string") {
314
+ window.location.assign(f);
315
+ return;
316
+ }
317
+ l?.(f);
318
+ } catch (f) {
319
+ const I = f?.message || "";
320
+ if (I.includes("closed") || I.includes("cancelled")) {
321
+ S?.(I);
322
+ return;
323
+ }
324
+ w?.(f);
325
+ }
326
+ }, [
327
+ p,
328
+ h,
329
+ d,
330
+ s,
331
+ C,
332
+ m,
333
+ c,
334
+ n,
335
+ l,
336
+ S,
337
+ w
338
+ ]), x = o ? E : ["nylas-btn", `nylas-btn--${R}`, `nylas-btn--${r}`, E].filter(Boolean).join(" "), D = t ? { ...t, ...L } : L;
339
+ return /* @__PURE__ */ j(
340
+ "button",
341
+ {
342
+ type: "button",
343
+ className: x,
344
+ style: D,
345
+ disabled: T || O,
346
+ "aria-busy": O || void 0,
347
+ onClick: _,
348
+ children: U ?? N
349
+ }
350
+ );
351
+ }
270
352
  export {
271
- K as BrowserTokenStorage,
272
- V as ConfigError,
273
- B as MemoryTokenStorage,
274
- W as NetworkError,
275
- X as NylasConnect,
276
- j as NylasConnectError,
277
- q as OAuthError,
278
- F as PopupError,
279
- H as TokenError,
280
- J as isConnectCallback,
281
- Q as logger,
282
- Y as parseConnectCallback,
353
+ X as BrowserTokenStorage,
354
+ q as ConfigError,
355
+ F as MemoryTokenStorage,
356
+ H as NetworkError,
357
+ J as NylasConnect,
358
+ V as NylasConnectButton,
359
+ Q as NylasConnectError,
360
+ Y as OAuthError,
361
+ Z as PopupError,
362
+ ee as TokenError,
363
+ te as isConnectCallback,
364
+ ne as logger,
365
+ re as parseConnectCallback,
283
366
  v as useNylasConnect
284
367
  };
368
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sources":["../../src/connect/useNylasConnect.ts","../../src/connect/NylasConnectButton.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { NylasConnect } from \"@nylas/connect\";\nimport type {\n ConnectConfig as AuthConfig,\n ConnectOptions as AuthOptions,\n ConnectResult as AuthResult,\n GrantInfo,\n ConnectEvent as AuthEvent,\n ConnectEventData as AuthEventData,\n ConnectStateChangeCallback as AuthStateChangeCallback,\n} from \"@nylas/connect\";\nimport { LogLevel } from \"@nylas/connect\";\n\n/**\n * Configuration for the useNylasConnect React hook\n * Extends AuthConfig with connection-specific properties\n */\nexport interface UseNylasConnectConfig extends AuthConfig {\n /** Auto-refresh session interval in milliseconds (default: disabled) */\n autoRefreshInterval?: number;\n /** Initial loading state when hook mounts (default: true) */\n initialLoadingState?: boolean;\n /** Number of retry attempts for failed operations (default: 0) */\n retryAttempts?: number;\n /** Enable automatic error recovery for network errors (default: false) */\n enableAutoRecovery?: boolean;\n}\n\nexport interface UseNylasConnectState {\n isConnected: boolean;\n grant: GrantInfo | null;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport interface UseNylasConnectActions {\n connect: (options?: AuthOptions) => Promise<AuthResult | string>;\n logout: (grantId?: string) => Promise<void>;\n refreshSession: () => Promise<void>;\n subscribe: (callback: AuthStateChangeCallback) => () => void;\n setLogLevel: (level: LogLevel | \"off\") => void;\n}\n\nexport interface UseNylasConnectReturn\n extends UseNylasConnectState,\n UseNylasConnectActions {\n connectClient: NylasConnect;\n}\n\nexport function useNylasConnect(\n config: UseNylasConnectConfig,\n): UseNylasConnectReturn {\n // Extract hook-specific config\n const {\n autoRefreshInterval,\n initialLoadingState = true,\n retryAttempts = 0,\n enableAutoRecovery = false,\n ...connectionConfig\n } = config;\n\n // Create connect client instance (stable reference)\n const connectClientRef = useRef<NylasConnect | null>(null);\n if (!connectClientRef.current) {\n connectClientRef.current = new NylasConnect(connectionConfig);\n }\n const connectClient = connectClientRef.current;\n\n // Track callback processing state to prevent duplicates\n // This prevents React Strict Mode double-invocation and component re-mount issues\n // that cause multiple POST requests to /connect/token with the same auth code\n const callbackProcessingRef = useRef<{\n isProcessing: boolean; // Currently processing a callback\n processedUrl: string | null; // URL that was already processed\n hasProcessed: boolean; // Has successfully processed any callback\n }>({\n isProcessing: false,\n processedUrl: null,\n hasProcessed: false,\n });\n\n // Reset callback state when URL changes significantly (navigation away from callback)\n useEffect(() => {\n const currentUrl = globalThis.window?.location.href || \"\";\n const callbackState = callbackProcessingRef.current;\n\n // If URL no longer contains callback parameters and we've processed before, reset state\n const hasCallbackParams =\n currentUrl.includes(\"code=\") && currentUrl.includes(\"state=\");\n if (!hasCallbackParams && callbackState.hasProcessed) {\n callbackState.hasProcessed = false;\n callbackState.processedUrl = null;\n }\n });\n\n // Handle callback on app load (if enabled)\n useEffect(() => {\n if (!connectionConfig.autoHandleCallback) {\n return;\n }\n\n // Capture the callback state ref at effect creation time\n const callbackStateRef = callbackProcessingRef;\n\n const processCallback = async () => {\n const currentUrl = globalThis.window?.location.href || \"\";\n const callbackState = callbackStateRef.current;\n\n // Skip if already processing, processed this URL, or no callback params\n if (\n callbackState.isProcessing ||\n callbackState.processedUrl === currentUrl ||\n callbackState.hasProcessed\n ) {\n return;\n }\n\n // Check if URL contains OAuth callback parameters\n const hasCallbackParams =\n currentUrl.includes(\"code=\") && currentUrl.includes(\"state=\");\n if (!hasCallbackParams) {\n return;\n }\n\n // Check if we already have a valid session to avoid unnecessary processing\n try {\n const existingSession = await connectClient.getSession();\n if (existingSession) {\n // Mark as processed to prevent future attempts\n callbackState.hasProcessed = true;\n callbackState.processedUrl = currentUrl;\n return;\n }\n } catch (e) {\n // Continue with callback processing if session check fails\n }\n\n // Mark as processing to prevent concurrent attempts\n callbackState.isProcessing = true;\n callbackState.processedUrl = currentUrl;\n\n try {\n await connectClient.callback();\n callbackState.hasProcessed = true;\n\n // Additional URL cleanup as a safeguard (client should handle this)\n // but we ensure it's cleaned in case something went wrong\n if (globalThis.window?.history?.replaceState) {\n const url = new URL(globalThis.window.location.href);\n const authParams = [\"code\", \"state\", \"error\", \"error_description\"];\n let needsCleaning = false;\n\n authParams.forEach((param) => {\n if (url.searchParams.has(param)) {\n url.searchParams.delete(param);\n needsCleaning = true;\n }\n });\n\n if (needsCleaning) {\n globalThis.window.history.replaceState(\n globalThis.window.history.state,\n document.title,\n url.toString(),\n );\n }\n }\n } catch (e) {\n console.log(\"callback error\", e);\n // Reset processing state on error to allow retry if needed\n callbackState.isProcessing = false;\n callbackState.processedUrl = null;\n } finally {\n callbackState.isProcessing = false;\n }\n };\n\n processCallback();\n\n // Cleanup function to reset state if component unmounts\n return () => {\n // Use the captured ref from effect scope\n const callbackState = callbackStateRef.current;\n // Only reset if we're not currently processing to avoid interrupting ongoing operations\n if (!callbackState?.isProcessing) {\n callbackState.processedUrl = null;\n callbackState.hasProcessed = false;\n }\n };\n }, [connectClient]);\n\n // Connection state\n const [state, setState] = useState<UseNylasConnectState>({\n isConnected: false,\n grant: null,\n isLoading: initialLoadingState,\n error: null,\n });\n\n // Initialize connection state on mount\n useEffect(() => {\n let isMounted = true;\n\n const initializeAuth = async () => {\n try {\n const session = await connectClient.getSession();\n const connectionStatus = await connectClient.getConnectionStatus();\n const isConnected = connectionStatus === \"connected\";\n\n if (isMounted) {\n setState((prev) => ({\n ...prev,\n isConnected,\n grant: session?.grantInfo || null,\n isLoading: false,\n error: null,\n }));\n }\n } catch (error) {\n if (isMounted) {\n setState((prev) => ({\n ...prev,\n isConnected: false,\n grant: null,\n isLoading: false,\n error: error as Error,\n }));\n }\n }\n };\n\n initializeAuth();\n\n return () => {\n isMounted = false;\n };\n }, [connectClient]);\n\n // Auto-refresh session at specified interval\n useEffect(() => {\n if (!autoRefreshInterval || autoRefreshInterval <= 0) {\n return;\n }\n\n const intervalId = setInterval(async () => {\n try {\n const session = await connectClient.getSession();\n const connectionStatus = await connectClient.getConnectionStatus();\n const isConnected = connectionStatus === \"connected\";\n\n setState((prev) => ({\n ...prev,\n isConnected,\n grant: session?.grantInfo || null,\n error: null,\n }));\n } catch (error) {\n if (enableAutoRecovery) {\n // Attempt to recover from network errors silently\n console.debug(\n \"Auto-refresh failed, will retry next interval:\",\n error,\n );\n } else {\n setState((prev) => ({\n ...prev,\n error: error as Error,\n }));\n }\n }\n }, autoRefreshInterval);\n\n return () => clearInterval(intervalId);\n }, [connectClient, autoRefreshInterval, enableAutoRecovery]);\n\n // Subscribe to connection state changes\n useEffect(() => {\n const handleConnectionStateChange = (\n event: AuthEvent,\n session: AuthResult | null,\n data?: AuthEventData[AuthEvent],\n ) => {\n setState((prev) => {\n switch (event) {\n case \"CONNECT_STARTED\":\n return {\n ...prev,\n isLoading: true,\n error: null,\n };\n\n case \"SIGNED_IN\":\n case \"SESSION_RESTORED\":\n return {\n ...prev,\n isConnected: true,\n grant: session?.grantInfo || null,\n isLoading: false,\n error: null,\n };\n\n case \"SIGNED_OUT\":\n return {\n ...prev,\n isConnected: false,\n grant: null,\n isLoading: false,\n error: null,\n };\n\n case \"CONNECT_ERROR\":\n case \"NETWORK_ERROR\":\n case \"TOKEN_VALIDATION_ERROR\":\n return {\n ...prev,\n isLoading: false,\n error: (data as any)?.error || new Error(\"Authentication error\"),\n };\n\n case \"CONNECT_CANCELLED\":\n return {\n ...prev,\n isLoading: false,\n error: null,\n };\n\n case \"SESSION_EXPIRED\":\n case \"SESSION_INVALID\":\n return {\n ...prev,\n isConnected: false,\n grant: null,\n isLoading: false,\n error: null,\n };\n\n default:\n return prev;\n }\n });\n };\n\n const unsubscribe = connectClient.onConnectStateChange(\n handleConnectionStateChange,\n );\n\n return unsubscribe;\n }, [connectClient]);\n\n // Wrapped connect method with retry logic\n const connect = useCallback(\n async (options: AuthOptions = {}) => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n let lastError: Error;\n const maxAttempts = retryAttempts + 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await connectClient.connect(options);\n return result;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n // Wait before retry (exponential backoff)\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n // All attempts failed\n throw lastError!;\n },\n [connectClient, retryAttempts],\n );\n\n // Wrapped logout method with retry logic\n const logout = useCallback(\n async (grantId?: string) => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n let lastError: Error;\n const maxAttempts = retryAttempts + 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await connectClient.logout(grantId);\n return;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n // Wait before retry\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 3000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n // All attempts failed\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: lastError!,\n }));\n throw lastError!;\n },\n [connectClient, retryAttempts],\n );\n\n // Refresh session method with retry logic\n const refreshSession = useCallback(async () => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n let lastError: Error;\n const maxAttempts = retryAttempts + 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const session = await connectClient.getSession();\n const connectionStatus = await connectClient.getConnectionStatus();\n const isConnected = connectionStatus === \"connected\";\n\n setState((prev) => ({\n ...prev,\n isConnected,\n grant: session?.grantInfo || null,\n isLoading: false,\n error: null,\n }));\n return;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n // Wait before retry\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 3000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n // All attempts failed\n setState((prev) => ({\n ...prev,\n isConnected: false,\n grant: null,\n isLoading: false,\n error: lastError!,\n }));\n throw lastError!;\n }, [connectClient, retryAttempts]);\n\n // Subscribe method for listening to connection events\n const subscribe = useCallback(\n (callback: AuthStateChangeCallback) => {\n return connectClient.onConnectStateChange(callback);\n },\n [connectClient],\n );\n\n const setLogLevel = useCallback(\n (level: LogLevel | \"off\") => {\n connectClient.setLogLevel(level);\n },\n [connectClient],\n );\n\n return {\n // State\n ...state,\n\n // Actions\n connect,\n logout,\n refreshSession,\n subscribe,\n\n // Logger controls\n setLogLevel,\n\n // Direct access\n connectClient,\n };\n}\n","import React, { useCallback } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport type {\n Provider,\n NylasScope,\n ConnectResult as AuthResult,\n IdentityProviderTokenCallback,\n CodeExchangeMethod,\n} from \"@nylas/connect\";\nimport { useNylasConnect } from \"./useNylasConnect\";\n\nexport type NylasConnectButtonProps = {\n clientId: string;\n redirectUri?: string;\n apiUrl?: string;\n defaultScopes?: NylasScope[]; // optional override\n persistTokens?: boolean;\n\n method?: \"popup\" | \"inline\";\n provider?: Provider;\n scopes?: NylasScope[];\n loginHint?: string;\n popupWidth?: number;\n popupHeight?: number;\n\n text?: string;\n className?: string;\n style?: CSSProperties;\n disabled?: boolean;\n\n // Styling controls\n variant?: \"primary\" | \"outline\";\n size?: \"sm\" | \"md\" | \"lg\";\n unstyled?: boolean;\n cssVars?: Partial<\n Record<\n | \"--nylas-btn-bg\"\n | \"--nylas-btn-fg\"\n | \"--nylas-btn-border\"\n | \"--nylas-btn-bg-hover\",\n string\n >\n >;\n\n // Advanced configuration\n /**\n * Optional callback to provide external identity provider JWT token.\n * Called during token exchange to include IDP claims.\n * Return null to skip IDP claims, or throw to fail authentication.\n */\n identityProviderToken?: IdentityProviderTokenCallback;\n\n /**\n * Custom code exchange method for backend-based token exchange.\n * Allows handling OAuth code exchange on your server instead of the browser.\n */\n codeExchange?: CodeExchangeMethod;\n\n onStart?: () => void;\n onSuccess?: (result: AuthResult) => void;\n onError?: (error: Error) => void;\n onCancel?: (reason: string) => void;\n children?: ReactNode;\n};\n\nexport function NylasConnectButton({\n clientId,\n redirectUri,\n apiUrl,\n defaultScopes,\n persistTokens,\n\n method = \"inline\",\n provider,\n scopes,\n loginHint,\n popupWidth,\n popupHeight,\n\n text = \"Connect your inbox\",\n className,\n style,\n disabled,\n // styling\n variant = \"primary\",\n size = \"md\",\n unstyled = false,\n cssVars,\n\n // advanced config\n identityProviderToken,\n codeExchange,\n\n onStart,\n onSuccess,\n onError,\n onCancel,\n children,\n}: NylasConnectButtonProps) {\n const { connect, isLoading } = useNylasConnect({\n clientId,\n redirectUri,\n apiUrl,\n // Only pass defaultScopes if caller provides it to override defaults\n ...(defaultScopes ? { defaultScopes } : {}),\n persistTokens,\n autoHandleCallback: true,\n identityProviderToken,\n codeExchange,\n });\n\n const handleClick = useCallback(async () => {\n try {\n onStart?.();\n const resultOrUrl = await connect({\n method,\n provider,\n scopes,\n loginHint,\n popupWidth,\n popupHeight,\n });\n\n if (typeof resultOrUrl === \"string\") {\n window.location.assign(resultOrUrl);\n return;\n }\n\n onSuccess?.(resultOrUrl);\n } catch (err) {\n const message = (err as Error)?.message || \"\";\n if (message.includes(\"closed\") || message.includes(\"cancelled\")) {\n onCancel?.(message);\n return;\n }\n onError?.(err as Error);\n }\n }, [\n connect,\n method,\n provider,\n scopes,\n loginHint,\n popupWidth,\n popupHeight,\n onStart,\n onSuccess,\n onCancel,\n onError,\n ]);\n\n const rootClassName = unstyled\n ? className\n : [\"nylas-btn\", `nylas-btn--${variant}`, `nylas-btn--${size}`, className]\n .filter(Boolean)\n .join(\" \");\n\n const styleWithVars: CSSProperties | undefined = cssVars\n ? { ...(cssVars as CSSProperties), ...style }\n : style;\n\n return (\n <button\n type=\"button\"\n className={rootClassName}\n style={styleWithVars}\n disabled={disabled || isLoading}\n aria-busy={isLoading || undefined}\n onClick={handleClick}\n >\n {children ?? text}\n </button>\n );\n}\n"],"names":["useNylasConnect","config","autoRefreshInterval","initialLoadingState","retryAttempts","enableAutoRecovery","connectionConfig","connectClientRef","useRef","NylasConnect","connectClient","callbackProcessingRef","useEffect","currentUrl","callbackState","callbackStateRef","url","authParams","needsCleaning","param","e","state","setState","useState","isMounted","session","isConnected","prev","error","intervalId","handleConnectionStateChange","event","data","connect","useCallback","options","lastError","maxAttempts","attempt","delay","resolve","logout","grantId","refreshSession","subscribe","callback","setLogLevel","level","NylasConnectButton","clientId","redirectUri","apiUrl","defaultScopes","persistTokens","method","provider","scopes","loginHint","popupWidth","popupHeight","text","className","style","disabled","variant","size","unstyled","cssVars","identityProviderToken","codeExchange","onStart","onSuccess","onError","onCancel","children","isLoading","handleClick","resultOrUrl","err","message","rootClassName","styleWithVars","jsx"],"mappings":";;;;AAiDO,SAASA,EACdC,GACuB;AAEvB,QAAM;AAAA,IACJ,qBAAAC;AAAA,IACA,qBAAAC,IAAsB;AAAA,IACtB,eAAAC,IAAgB;AAAA,IAChB,oBAAAC,IAAqB;AAAA,IACrB,GAAGC;AAAA,EAAA,IACDL,GAGEM,IAAmBC,EAA4B,IAAI;AACzD,EAAKD,EAAiB,YACpBA,EAAiB,UAAU,IAAIE,EAAaH,CAAgB;AAE9D,QAAMI,IAAgBH,EAAiB,SAKjCI,IAAwBH,EAI3B;AAAA,IACD,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,EAAA,CACf;AAGD,EAAAI,EAAU,MAAM;AACd,UAAMC,IAAa,WAAW,QAAQ,SAAS,QAAQ,IACjDC,IAAgBH,EAAsB;AAK5C,IAAI,EADFE,EAAW,SAAS,OAAO,KAAKA,EAAW,SAAS,QAAQ,MACpCC,EAAc,iBACtCA,EAAc,eAAe,IAC7BA,EAAc,eAAe;AAAA,EAEjC,CAAC,GAGDF,EAAU,MAAM;AACd,QAAI,CAACN,EAAiB;AACpB;AAIF,UAAMS,IAAmBJ;AA2EzB,YAzEwB,YAAY;AAClC,YAAME,IAAa,WAAW,QAAQ,SAAS,QAAQ,IACjDC,IAAgBC,EAAiB;AAcvC,UAVE,EAAAD,EAAc,gBACdA,EAAc,iBAAiBD,KAC/BC,EAAc,gBAQZ,EADFD,EAAW,SAAS,OAAO,KAAKA,EAAW,SAAS,QAAQ,KAM9D;AAAA,YAAI;AAEF,cADwB,MAAMH,EAAc,WAAA,GACvB;AAEnB,YAAAI,EAAc,eAAe,IAC7BA,EAAc,eAAeD;AAC7B;AAAA,UACF;AAAA,QACF,QAAY;AAAA,QAEZ;AAGA,QAAAC,EAAc,eAAe,IAC7BA,EAAc,eAAeD;AAE7B,YAAI;AAMF,cALA,MAAMH,EAAc,SAAA,GACpBI,EAAc,eAAe,IAIzB,WAAW,QAAQ,SAAS,cAAc;AAC5C,kBAAME,IAAM,IAAI,IAAI,WAAW,OAAO,SAAS,IAAI,GAC7CC,IAAa,CAAC,QAAQ,SAAS,SAAS,mBAAmB;AACjE,gBAAIC,IAAgB;AAEpB,YAAAD,EAAW,QAAQ,CAACE,MAAU;AAC5B,cAAIH,EAAI,aAAa,IAAIG,CAAK,MAC5BH,EAAI,aAAa,OAAOG,CAAK,GAC7BD,IAAgB;AAAA,YAEpB,CAAC,GAEGA,KACF,WAAW,OAAO,QAAQ;AAAA,cACxB,WAAW,OAAO,QAAQ;AAAA,cAC1B,SAAS;AAAA,cACTF,EAAI,SAAA;AAAA,YAAS;AAAA,UAGnB;AAAA,QACF,SAASI,GAAG;AACV,kBAAQ,IAAI,kBAAkBA,CAAC,GAE/BN,EAAc,eAAe,IAC7BA,EAAc,eAAe;AAAA,QAC/B,UAAA;AACE,UAAAA,EAAc,eAAe;AAAA,QAC/B;AAAA;AAAA,IACF,GAEA,GAGO,MAAM;AAEX,YAAMA,IAAgBC,EAAiB;AAEvC,MAAKD,GAAe,iBAClBA,EAAc,eAAe,MAC7BA,EAAc,eAAe;AAAA,IAEjC;AAAA,EACF,GAAG,CAACJ,CAAa,CAAC;AAGlB,QAAM,CAACW,GAAOC,CAAQ,IAAIC,EAA+B;AAAA,IACvD,aAAa;AAAA,IACb,OAAO;AAAA,IACP,WAAWpB;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAGD,EAAAS,EAAU,MAAM;AACd,QAAIY,IAAY;AA8BhB,YA5BuB,YAAY;AACjC,UAAI;AACF,cAAMC,IAAU,MAAMf,EAAc,WAAA,GAE9BgB,IADmB,MAAMhB,EAAc,oBAAA,MACJ;AAEzC,QAAIc,KACFF,EAAS,CAACK,OAAU;AAAA,UAClB,GAAGA;AAAA,UACH,aAAAD;AAAA,UACA,OAAOD,GAAS,aAAa;AAAA,UAC7B,WAAW;AAAA,UACX,OAAO;AAAA,QAAA,EACP;AAAA,MAEN,SAASG,GAAO;AACd,QAAIJ,KACFF,EAAS,CAACK,OAAU;AAAA,UAClB,GAAGA;AAAA,UACH,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,UACX,OAAAC;AAAA,QAAA,EACA;AAAA,MAEN;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAJ,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACd,CAAa,CAAC,GAGlBE,EAAU,MAAM;AACd,QAAI,CAACV,KAAuBA,KAAuB;AACjD;AAGF,UAAM2B,IAAa,YAAY,YAAY;AACzC,UAAI;AACF,cAAMJ,IAAU,MAAMf,EAAc,WAAA,GAE9BgB,IADmB,MAAMhB,EAAc,oBAAA,MACJ;AAEzC,QAAAY,EAAS,CAACK,OAAU;AAAA,UAClB,GAAGA;AAAA,UACH,aAAAD;AAAA,UACA,OAAOD,GAAS,aAAa;AAAA,UAC7B,OAAO;AAAA,QAAA,EACP;AAAA,MACJ,SAASG,GAAO;AACd,QAAIvB,IAEF,QAAQ;AAAA,UACN;AAAA,UACAuB;AAAA,QAAA,IAGFN,EAAS,CAACK,OAAU;AAAA,UAClB,GAAGA;AAAA,UACH,OAAAC;AAAA,QAAA,EACA;AAAA,MAEN;AAAA,IACF,GAAG1B,CAAmB;AAEtB,WAAO,MAAM,cAAc2B,CAAU;AAAA,EACvC,GAAG,CAACnB,GAAeR,GAAqBG,CAAkB,CAAC,GAG3DO,EAAU,MAAM;AACd,UAAMkB,IAA8B,CAClCC,GACAN,GACAO,MACG;AACH,MAAAV,EAAS,CAACK,MAAS;AACjB,gBAAQI,GAAA;AAAA,UACN,KAAK;AACH,mBAAO;AAAA,cACL,GAAGJ;AAAA,cACH,WAAW;AAAA,cACX,OAAO;AAAA,YAAA;AAAA,UAGX,KAAK;AAAA,UACL,KAAK;AACH,mBAAO;AAAA,cACL,GAAGA;AAAA,cACH,aAAa;AAAA,cACb,OAAOF,GAAS,aAAa;AAAA,cAC7B,WAAW;AAAA,cACX,OAAO;AAAA,YAAA;AAAA,UAGX,KAAK;AACH,mBAAO;AAAA,cACL,GAAGE;AAAA,cACH,aAAa;AAAA,cACb,OAAO;AAAA,cACP,WAAW;AAAA,cACX,OAAO;AAAA,YAAA;AAAA,UAGX,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,mBAAO;AAAA,cACL,GAAGA;AAAA,cACH,WAAW;AAAA,cACX,OAAQK,GAAc,SAAS,IAAI,MAAM,sBAAsB;AAAA,YAAA;AAAA,UAGnE,KAAK;AACH,mBAAO;AAAA,cACL,GAAGL;AAAA,cACH,WAAW;AAAA,cACX,OAAO;AAAA,YAAA;AAAA,UAGX,KAAK;AAAA,UACL,KAAK;AACH,mBAAO;AAAA,cACL,GAAGA;AAAA,cACH,aAAa;AAAA,cACb,OAAO;AAAA,cACP,WAAW;AAAA,cACX,OAAO;AAAA,YAAA;AAAA,UAGX;AACE,mBAAOA;AAAA,QAAA;AAAA,MAEb,CAAC;AAAA,IACH;AAMA,WAJoBjB,EAAc;AAAA,MAChCoB;AAAA,IAAA;AAAA,EAIJ,GAAG,CAACpB,CAAa,CAAC;AAGlB,QAAMuB,IAAUC;AAAA,IACd,OAAOC,IAAuB,CAAA,MAAO;AACnC,MAAAb,EAAS,CAACK,OAAU,EAAE,GAAGA,GAAM,WAAW,IAAM,OAAO,KAAA,EAAO;AAE9D,UAAIS;AACJ,YAAMC,IAAcjC,IAAgB;AAEpC,eAASkC,IAAU,GAAGA,KAAWD,GAAaC;AAC5C,YAAI;AAEF,iBADe,MAAM5B,EAAc,QAAQyB,CAAO;AAAA,QAEpD,SAASP,GAAO;AAGd,cAFAQ,IAAYR,GAERU,IAAUD,GAAa;AAEzB,kBAAME,IAAQ,KAAK,IAAI,MAAO,KAAK,IAAI,GAAGD,IAAU,CAAC,GAAG,GAAI;AAC5D,kBAAM,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAASD,CAAK,CAAC;AAAA,UAC3D;AAAA,QACF;AAIF,YAAMH;AAAA,IACR;AAAA,IACA,CAAC1B,GAAeN,CAAa;AAAA,EAAA,GAIzBqC,IAASP;AAAA,IACb,OAAOQ,MAAqB;AAC1B,MAAApB,EAAS,CAACK,OAAU,EAAE,GAAGA,GAAM,WAAW,IAAM,OAAO,KAAA,EAAO;AAE9D,UAAIS;AACJ,YAAMC,IAAcjC,IAAgB;AAEpC,eAASkC,IAAU,GAAGA,KAAWD,GAAaC;AAC5C,YAAI;AACF,gBAAM5B,EAAc,OAAOgC,CAAO;AAClC;AAAA,QACF,SAASd,GAAO;AAGd,cAFAQ,IAAYR,GAERU,IAAUD,GAAa;AAEzB,kBAAME,IAAQ,KAAK,IAAI,MAAO,KAAK,IAAI,GAAGD,IAAU,CAAC,GAAG,GAAI;AAC5D,kBAAM,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAASD,CAAK,CAAC;AAAA,UAC3D;AAAA,QACF;AAIF,YAAAjB,EAAS,CAACK,OAAU;AAAA,QAClB,GAAGA;AAAA,QACH,WAAW;AAAA,QACX,OAAOS;AAAA,MAAA,EACP,GACIA;AAAA,IACR;AAAA,IACA,CAAC1B,GAAeN,CAAa;AAAA,EAAA,GAIzBuC,IAAiBT,EAAY,YAAY;AAC7C,IAAAZ,EAAS,CAACK,OAAU,EAAE,GAAGA,GAAM,WAAW,IAAM,OAAO,KAAA,EAAO;AAE9D,QAAIS;AACJ,UAAMC,IAAcjC,IAAgB;AAEpC,aAASkC,IAAU,GAAGA,KAAWD,GAAaC;AAC5C,UAAI;AACF,cAAMb,IAAU,MAAMf,EAAc,WAAA,GAE9BgB,IADmB,MAAMhB,EAAc,oBAAA,MACJ;AAEzC,QAAAY,EAAS,CAACK,OAAU;AAAA,UAClB,GAAGA;AAAA,UACH,aAAAD;AAAA,UACA,OAAOD,GAAS,aAAa;AAAA,UAC7B,WAAW;AAAA,UACX,OAAO;AAAA,QAAA,EACP;AACF;AAAA,MACF,SAASG,GAAO;AAGd,YAFAQ,IAAYR,GAERU,IAAUD,GAAa;AAEzB,gBAAME,IAAQ,KAAK,IAAI,MAAO,KAAK,IAAI,GAAGD,IAAU,CAAC,GAAG,GAAI;AAC5D,gBAAM,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAASD,CAAK,CAAC;AAAA,QAC3D;AAAA,MACF;AAIF,UAAAjB,EAAS,CAACK,OAAU;AAAA,MAClB,GAAGA;AAAA,MACH,aAAa;AAAA,MACb,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAOS;AAAA,IAAA,EACP,GACIA;AAAA,EACR,GAAG,CAAC1B,GAAeN,CAAa,CAAC,GAG3BwC,IAAYV;AAAA,IAChB,CAACW,MACQnC,EAAc,qBAAqBmC,CAAQ;AAAA,IAEpD,CAACnC,CAAa;AAAA,EAAA,GAGVoC,IAAcZ;AAAA,IAClB,CAACa,MAA4B;AAC3B,MAAArC,EAAc,YAAYqC,CAAK;AAAA,IACjC;AAAA,IACA,CAACrC,CAAa;AAAA,EAAA;AAGhB,SAAO;AAAA;AAAA,IAEL,GAAGW;AAAA;AAAA,IAGH,SAAAY;AAAA,IACA,QAAAQ;AAAA,IACA,gBAAAE;AAAA,IACA,WAAAC;AAAA;AAAA,IAGA,aAAAE;AAAA;AAAA,IAGA,eAAApC;AAAA,EAAA;AAEJ;ACraO,SAASsC,EAAmB;AAAA,EACjC,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EAEA,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EAEA,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA;AAAA,EAEA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,SAAAC;AAAA;AAAA,EAGA,uBAAAC;AAAA,EACA,cAAAC;AAAA,EAEA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AACF,GAA4B;AAC1B,QAAM,EAAE,SAAAzC,GAAS,WAAA0C,EAAA,IAAc3E,EAAgB;AAAA,IAC7C,UAAAiD;AAAA,IACA,aAAAC;AAAA,IACA,QAAAC;AAAA;AAAA,IAEA,GAAIC,IAAgB,EAAE,eAAAA,EAAA,IAAkB,CAAA;AAAA,IACxC,eAAAC;AAAA,IACA,oBAAoB;AAAA,IACpB,uBAAAe;AAAA,IACA,cAAAC;AAAA,EAAA,CACD,GAEKO,IAAc1C,EAAY,YAAY;AAC1C,QAAI;AACF,MAAAoC,IAAA;AACA,YAAMO,IAAc,MAAM5C,EAAQ;AAAA,QAChC,QAAAqB;AAAA,QACA,UAAAC;AAAA,QACA,QAAAC;AAAA,QACA,WAAAC;AAAA,QACA,YAAAC;AAAA,QACA,aAAAC;AAAA,MAAA,CACD;AAED,UAAI,OAAOkB,KAAgB,UAAU;AACnC,eAAO,SAAS,OAAOA,CAAW;AAClC;AAAA,MACF;AAEA,MAAAN,IAAYM,CAAW;AAAA,IACzB,SAASC,GAAK;AACZ,YAAMC,IAAWD,GAAe,WAAW;AAC3C,UAAIC,EAAQ,SAAS,QAAQ,KAAKA,EAAQ,SAAS,WAAW,GAAG;AAC/D,QAAAN,IAAWM,CAAO;AAClB;AAAA,MACF;AACA,MAAAP,IAAUM,CAAY;AAAA,IACxB;AAAA,EACF,GAAG;AAAA,IACD7C;AAAA,IACAqB;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAW;AAAA,IACAC;AAAA,IACAE;AAAA,IACAD;AAAA,EAAA,CACD,GAEKQ,IAAgBd,IAClBL,IACA,CAAC,aAAa,cAAcG,CAAO,IAAI,cAAcC,CAAI,IAAIJ,CAAS,EACnE,OAAO,OAAO,EACd,KAAK,GAAG,GAEToB,IAA2Cd,IAC7C,EAAE,GAAIA,GAA2B,GAAGL,MACpCA;AAEJ,SACE,gBAAAoB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWF;AAAA,MACX,OAAOC;AAAA,MACP,UAAUlB,KAAYY;AAAA,MACtB,aAAWA,KAAa;AAAA,MACxB,SAASC;AAAA,MAER,UAAAF,KAAYd;AAAA,IAAA;AAAA,EAAA;AAGnB;"}