@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.
- package/LICENSE.md +1 -0
- package/README.md +208 -4
- package/dist/cjs/components.js +501 -0
- package/dist/cjs/components.js.map +1 -0
- package/dist/cjs/connect.js +2 -1
- package/dist/cjs/connect.js.map +1 -0
- package/dist/cjs/elements.js +2 -1
- package/dist/cjs/elements.js.map +1 -0
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/p-DVWbg8if.js +292 -0
- package/dist/cjs/p-DVWbg8if.js.map +1 -0
- package/dist/cjs/utils.js +2 -1
- package/dist/cjs/utils.js.map +1 -0
- package/dist/connect.d.ts +1 -1
- package/dist/elements.d.ts +1 -1
- package/dist/es/components.js +40349 -0
- package/dist/es/components.js.map +1 -0
- package/dist/es/connect.js +241 -157
- package/dist/es/connect.js.map +1 -0
- package/dist/es/elements.js +134 -1317
- package/dist/es/elements.js.map +1 -0
- package/dist/es/index.js +137 -279
- package/dist/es/index.js.map +1 -0
- package/dist/es/p-DVWbg8if.js +18604 -0
- package/dist/es/p-DVWbg8if.js.map +1 -0
- package/dist/es/utils.js +6 -2
- package/dist/es/utils.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/src/connect/NylasConnectButton.d.ts +42 -0
- package/dist/src/connect/NylasConnectButton.d.ts.map +1 -0
- package/dist/src/connect/NylasConnectButton.test.d.ts +2 -0
- package/dist/src/connect/NylasConnectButton.test.d.ts.map +1 -0
- package/dist/src/connect/index.d.ts +9 -0
- package/dist/src/connect/index.d.ts.map +1 -0
- package/dist/{lib → src}/connect/types.d.ts +3 -2
- package/dist/src/connect/types.d.ts.map +1 -0
- package/dist/{lib → src}/connect/useNylasConnect.d.ts +11 -5
- package/dist/src/connect/useNylasConnect.d.ts.map +1 -0
- package/dist/src/connect/useNylasConnect.test.d.ts +2 -0
- package/dist/src/connect/useNylasConnect.test.d.ts.map +1 -0
- package/dist/src/connect.d.ts +2 -0
- package/dist/src/connect.d.ts.map +1 -0
- package/dist/{lib → src}/elements/components.d.ts +145 -143
- package/dist/src/elements/components.d.ts.map +1 -0
- package/dist/src/elements.d.ts +2 -0
- package/dist/src/elements.d.ts.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/utils.d.ts +3 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/style.css +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/vitest.setup.d.ts +2 -0
- package/dist/vitest.setup.d.ts.map +1 -0
- package/package.json +32 -24
- package/dist/cjs/notetaker.js +0 -62
- package/dist/es/notetaker.js +0 -5784
- package/dist/lib/connect/index.d.ts +0 -6
- package/dist/lib/connect/useNylasConnect.test.d.ts +0 -1
- package/dist/lib/connect.d.ts +0 -1
- package/dist/lib/elements.d.ts +0 -1
- package/dist/lib/index.d.ts +0 -3
- package/dist/lib/main.d.ts +0 -0
- package/dist/lib/notetaker/CalendarSync/CalendarSync.d.ts +0 -37
- package/dist/lib/notetaker/CalendarSync/CalendarSync.spec.d.ts +0 -0
- package/dist/lib/notetaker/SendNotetaker/SendNotetaker.d.ts +0 -32
- package/dist/lib/notetaker/SendNotetaker/SendNotetaker.spec.d.ts +0 -1
- package/dist/lib/notetaker/Transcript/Transcript.d.ts +0 -23
- package/dist/lib/notetaker/Transcript/Transcript.spec.d.ts +0 -0
- package/dist/lib/notetaker/VideoPlayer/VideoPlayer.d.ts +0 -24
- package/dist/lib/notetaker/VideoPlayer/VideoPlayer.spec.d.ts +0 -1
- package/dist/lib/notetaker/index.d.ts +0 -9
- package/dist/lib/notetaker/lib/constants.d.ts +0 -12
- package/dist/lib/notetaker/lib/http-client.d.ts +0 -2
- package/dist/lib/notetaker/lib/primitives.d.ts +0 -66
- package/dist/lib/notetaker/lib/store.d.ts +0 -6
- package/dist/lib/notetaker/types.d.ts +0 -42
- package/dist/lib/notetaker.d.ts +0 -1
- package/dist/lib/utils.d.ts +0 -2
- package/dist/notetaker.d.ts +0 -1
- package/dist/test/vitest.setup.d.ts +0 -0
package/dist/es/connect.js
CHANGED
|
@@ -1,138 +1,137 @@
|
|
|
1
|
-
import { useRef as
|
|
2
|
-
import { NylasConnect as
|
|
3
|
-
import { BrowserTokenStorage as
|
|
4
|
-
|
|
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:
|
|
7
|
-
initialLoadingState:
|
|
8
|
-
retryAttempts:
|
|
9
|
-
enableAutoRecovery:
|
|
10
|
-
...
|
|
11
|
-
} =
|
|
12
|
-
|
|
13
|
-
const
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
25
|
+
const r = C;
|
|
26
26
|
return (async () => {
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
32
|
-
e.hasProcessed = !0, e.processedUrl =
|
|
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 =
|
|
36
|
+
e.isProcessing = !0, e.processedUrl = t;
|
|
38
37
|
try {
|
|
39
|
-
if (await
|
|
40
|
-
const
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}),
|
|
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
|
-
|
|
46
|
+
n.toString()
|
|
48
47
|
);
|
|
49
48
|
}
|
|
50
|
-
} catch (
|
|
51
|
-
console.log("callback error",
|
|
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
|
|
58
|
-
|
|
56
|
+
const t = r.current;
|
|
57
|
+
t?.isProcessing || (t.processedUrl = null, t.hasProcessed = !1);
|
|
59
58
|
};
|
|
60
|
-
}, [
|
|
61
|
-
const [
|
|
59
|
+
}, [s]);
|
|
60
|
+
const [m, c] = M({
|
|
62
61
|
isConnected: !1,
|
|
63
62
|
grant: null,
|
|
64
|
-
isLoading:
|
|
63
|
+
isLoading: k,
|
|
65
64
|
error: null
|
|
66
65
|
});
|
|
67
|
-
|
|
68
|
-
let
|
|
66
|
+
b(() => {
|
|
67
|
+
let r = !0;
|
|
69
68
|
return (async () => {
|
|
70
69
|
try {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
...
|
|
74
|
-
isConnected:
|
|
75
|
-
grant:
|
|
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 (
|
|
80
|
-
|
|
78
|
+
} catch (t) {
|
|
79
|
+
r && c((e) => ({
|
|
81
80
|
...e,
|
|
82
81
|
isConnected: !1,
|
|
83
82
|
grant: null,
|
|
84
83
|
isLoading: !1,
|
|
85
|
-
error:
|
|
84
|
+
error: t
|
|
86
85
|
}));
|
|
87
86
|
}
|
|
88
87
|
})(), () => {
|
|
89
|
-
|
|
88
|
+
r = !1;
|
|
90
89
|
};
|
|
91
|
-
}, [
|
|
92
|
-
if (!
|
|
90
|
+
}, [s]), b(() => {
|
|
91
|
+
if (!u || u <= 0)
|
|
93
92
|
return;
|
|
94
|
-
const
|
|
93
|
+
const r = setInterval(async () => {
|
|
95
94
|
try {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
...
|
|
99
|
-
isConnected:
|
|
100
|
-
grant:
|
|
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 (
|
|
104
|
-
|
|
102
|
+
} catch (o) {
|
|
103
|
+
y ? console.debug(
|
|
105
104
|
"Auto-refresh failed, will retry next interval:",
|
|
106
|
-
|
|
107
|
-
) :
|
|
108
|
-
...
|
|
109
|
-
error:
|
|
105
|
+
o
|
|
106
|
+
) : c((t) => ({
|
|
107
|
+
...t,
|
|
108
|
+
error: o
|
|
110
109
|
}));
|
|
111
110
|
}
|
|
112
|
-
},
|
|
113
|
-
return () => clearInterval(
|
|
114
|
-
}, [
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
switch (
|
|
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
|
-
...
|
|
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
|
-
...
|
|
126
|
+
...n,
|
|
128
127
|
isConnected: !0,
|
|
129
|
-
grant:
|
|
128
|
+
grant: e?.grantInfo || null,
|
|
130
129
|
isLoading: !1,
|
|
131
130
|
error: null
|
|
132
131
|
};
|
|
133
132
|
case "SIGNED_OUT":
|
|
134
133
|
return {
|
|
135
|
-
...
|
|
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
|
-
...
|
|
144
|
+
...n,
|
|
146
145
|
isLoading: !1,
|
|
147
|
-
error:
|
|
146
|
+
error: a?.error || new Error("Authentication error")
|
|
148
147
|
};
|
|
149
148
|
case "CONNECT_CANCELLED":
|
|
150
149
|
return {
|
|
151
|
-
...
|
|
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
|
-
...
|
|
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
|
|
164
|
+
return n;
|
|
166
165
|
}
|
|
167
166
|
});
|
|
168
167
|
};
|
|
169
|
-
return
|
|
170
|
-
|
|
168
|
+
return s.onConnectStateChange(
|
|
169
|
+
r
|
|
171
170
|
);
|
|
172
|
-
}, [
|
|
173
|
-
const N =
|
|
174
|
-
async (
|
|
175
|
-
|
|
176
|
-
let
|
|
177
|
-
const
|
|
178
|
-
for (let e = 1; 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
|
|
179
|
+
return await s.connect(r);
|
|
181
180
|
} catch (a) {
|
|
182
|
-
if (
|
|
183
|
-
const
|
|
184
|
-
await new Promise((
|
|
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
|
|
186
|
+
throw o;
|
|
188
187
|
},
|
|
189
|
-
[
|
|
190
|
-
),
|
|
191
|
-
async (
|
|
192
|
-
|
|
193
|
-
let
|
|
194
|
-
const
|
|
195
|
-
for (let e = 1; 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
|
|
196
|
+
await s.logout(r);
|
|
198
197
|
return;
|
|
199
198
|
} catch (a) {
|
|
200
|
-
if (
|
|
201
|
-
const
|
|
202
|
-
await new Promise((
|
|
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
|
|
204
|
+
throw c((e) => ({
|
|
206
205
|
...e,
|
|
207
206
|
isLoading: !1,
|
|
208
|
-
error:
|
|
209
|
-
})),
|
|
207
|
+
error: o
|
|
208
|
+
})), o;
|
|
210
209
|
},
|
|
211
|
-
[
|
|
212
|
-
),
|
|
213
|
-
|
|
214
|
-
let
|
|
215
|
-
const
|
|
216
|
-
for (let
|
|
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
|
|
219
|
-
|
|
220
|
-
...
|
|
221
|
-
isConnected:
|
|
222
|
-
grant:
|
|
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 (
|
|
229
|
-
const a = Math.min(1e3 * Math.pow(2,
|
|
230
|
-
await new Promise((
|
|
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
|
|
234
|
-
...
|
|
232
|
+
throw c((t) => ({
|
|
233
|
+
...t,
|
|
235
234
|
isConnected: !1,
|
|
236
235
|
grant: null,
|
|
237
236
|
isLoading: !1,
|
|
238
|
-
error:
|
|
239
|
-
})),
|
|
240
|
-
}, [
|
|
241
|
-
(
|
|
242
|
-
[
|
|
243
|
-
),
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
[
|
|
246
|
+
[s]
|
|
252
247
|
);
|
|
253
248
|
return {
|
|
254
249
|
// State
|
|
255
|
-
...
|
|
250
|
+
...m,
|
|
256
251
|
// Actions
|
|
257
252
|
connect: N,
|
|
258
|
-
logout:
|
|
259
|
-
refreshSession:
|
|
260
|
-
subscribe:
|
|
253
|
+
logout: E,
|
|
254
|
+
refreshSession: L,
|
|
255
|
+
subscribe: T,
|
|
261
256
|
// Logger controls
|
|
262
|
-
|
|
263
|
-
disableDebug: A,
|
|
264
|
-
setLogLevel: O,
|
|
257
|
+
setLogLevel: R,
|
|
265
258
|
// Direct access
|
|
266
|
-
connectClient:
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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":"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"}
|