react-oauth-providers 1.0.0 → 1.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.
@@ -0,0 +1,45 @@
1
+ import * as react from 'react';
2
+ import react__default, { ReactNode } from 'react';
3
+
4
+ interface IAuthContext {
5
+ loginInProgress: boolean;
6
+ signinWithGoogle: () => Promise<void>;
7
+ logOut: ILogoutFunc;
8
+ user?: any;
9
+ error?: string | null;
10
+ }
11
+ interface IAuthProvider {
12
+ authConfig: IAuthConfig;
13
+ children: ReactNode;
14
+ }
15
+ type IAuthStorageType = "session" | "local";
16
+ type IAuthGoogleProviderType = "spa";
17
+ interface IAuthGoogleProvider {
18
+ clientId: string;
19
+ type?: IAuthGoogleProviderType;
20
+ scope?: string;
21
+ }
22
+ type IAuthConfig = {
23
+ googleProvider?: IAuthGoogleProvider;
24
+ spaCallbackUri?: string;
25
+ logoutRedirect?: string;
26
+ preLogin?: () => void;
27
+ postLogin?: () => void;
28
+ onLogInError?: (err: any) => void;
29
+ storageKeyPrefix?: string;
30
+ storage?: IAuthStorageType;
31
+ error?: string | null;
32
+ };
33
+ type ILogoutFunc = (args?: {
34
+ logoutHint?: string;
35
+ redirect?: boolean;
36
+ redirectUri?: string;
37
+ }) => void;
38
+
39
+ declare const AuthContext: react.Context<IAuthContext>;
40
+
41
+ declare const AuthProvider: react__default.FC<IAuthProvider>;
42
+
43
+ declare function useAuth(): IAuthContext;
44
+
45
+ export { AuthContext, AuthProvider, IAuthConfig, IAuthContext, IAuthProvider, useAuth };
@@ -0,0 +1,45 @@
1
+ import * as react from 'react';
2
+ import react__default, { ReactNode } from 'react';
3
+
4
+ interface IAuthContext {
5
+ loginInProgress: boolean;
6
+ signinWithGoogle: () => Promise<void>;
7
+ logOut: ILogoutFunc;
8
+ user?: any;
9
+ error?: string | null;
10
+ }
11
+ interface IAuthProvider {
12
+ authConfig: IAuthConfig;
13
+ children: ReactNode;
14
+ }
15
+ type IAuthStorageType = "session" | "local";
16
+ type IAuthGoogleProviderType = "spa";
17
+ interface IAuthGoogleProvider {
18
+ clientId: string;
19
+ type?: IAuthGoogleProviderType;
20
+ scope?: string;
21
+ }
22
+ type IAuthConfig = {
23
+ googleProvider?: IAuthGoogleProvider;
24
+ spaCallbackUri?: string;
25
+ logoutRedirect?: string;
26
+ preLogin?: () => void;
27
+ postLogin?: () => void;
28
+ onLogInError?: (err: any) => void;
29
+ storageKeyPrefix?: string;
30
+ storage?: IAuthStorageType;
31
+ error?: string | null;
32
+ };
33
+ type ILogoutFunc = (args?: {
34
+ logoutHint?: string;
35
+ redirect?: boolean;
36
+ redirectUri?: string;
37
+ }) => void;
38
+
39
+ declare const AuthContext: react.Context<IAuthContext>;
40
+
41
+ declare const AuthProvider: react__default.FC<IAuthProvider>;
42
+
43
+ declare function useAuth(): IAuthContext;
44
+
45
+ export { AuthContext, AuthProvider, IAuthConfig, IAuthContext, IAuthProvider, useAuth };
package/dist/index.js ADDED
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+ var __async = (__this, __arguments, generator) => {
47
+ return new Promise((resolve, reject) => {
48
+ var fulfilled = (value) => {
49
+ try {
50
+ step(generator.next(value));
51
+ } catch (e) {
52
+ reject(e);
53
+ }
54
+ };
55
+ var rejected = (value) => {
56
+ try {
57
+ step(generator.throw(value));
58
+ } catch (e) {
59
+ reject(e);
60
+ }
61
+ };
62
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
63
+ step((generator = generator.apply(__this, __arguments)).next());
64
+ });
65
+ };
66
+
67
+ // src/index.ts
68
+ var src_exports = {};
69
+ __export(src_exports, {
70
+ AuthContext: () => AuthContext,
71
+ AuthProvider: () => AuthProvider,
72
+ useAuth: () => useAuth
73
+ });
74
+ module.exports = __toCommonJS(src_exports);
75
+
76
+ // src/AuthContext.tsx
77
+ var import_react = require("react");
78
+ var AuthContext = (0, import_react.createContext)({});
79
+
80
+ // src/AuthProvider.tsx
81
+ var import_react2 = __toESM(require("react"));
82
+
83
+ // src/utils/session.ts
84
+ function setSessionItem(key, value, ttlMs) {
85
+ const data = {
86
+ value,
87
+ expires: Date.now() + ttlMs
88
+ };
89
+ sessionStorage.setItem(key, JSON.stringify(data));
90
+ }
91
+ function getSessionItem(key) {
92
+ const dataStr = sessionStorage.getItem(key);
93
+ if (!dataStr)
94
+ return null;
95
+ try {
96
+ const data = JSON.parse(dataStr);
97
+ if (Date.now() > data.expires) {
98
+ sessionStorage.removeItem(key);
99
+ return null;
100
+ }
101
+ return data.value;
102
+ } catch (e) {
103
+ return null;
104
+ }
105
+ }
106
+ function removeSessionItem(key) {
107
+ try {
108
+ sessionStorage.removeItem(key);
109
+ } catch (error) {
110
+ return null;
111
+ }
112
+ }
113
+
114
+ // src/utils/http.ts
115
+ function request(url, options) {
116
+ return __async(this, null, function* () {
117
+ var _a;
118
+ let body;
119
+ const headers = __spreadValues({}, (_a = options.headers) != null ? _a : {});
120
+ try {
121
+ body = options.body;
122
+ headers["Content-Type"] = headers["Content-Type"] || "application/json";
123
+ const response = yield fetch(url, {
124
+ method: options.method,
125
+ headers,
126
+ body
127
+ });
128
+ if (!response.ok) {
129
+ const error = yield response.json().catch(() => ({}));
130
+ const expectedError = response.status >= 400 && response.status < 500;
131
+ if (!expectedError) {
132
+ console.log({ error });
133
+ console.log("Unexpected error occurs");
134
+ }
135
+ return Promise.reject(__spreadValues({ status: response.status }, error));
136
+ }
137
+ return { data: yield response.json() };
138
+ } catch (error) {
139
+ console.log("Network or unexpected error:", error);
140
+ return Promise.reject(error);
141
+ }
142
+ });
143
+ }
144
+ var http_default = {
145
+ get: (url, options) => request(url, __spreadProps(__spreadValues({}, options), { method: "GET" })),
146
+ post: (url, body, options) => request(url, __spreadProps(__spreadValues({}, options), { method: "POST", body })),
147
+ put: (url, body, options) => request(url, __spreadProps(__spreadValues({}, options), { method: "PUT", body })),
148
+ delete: (url, options) => request(url, __spreadProps(__spreadValues({}, options), { method: "DELETE" }))
149
+ };
150
+
151
+ // src/utils/pkce.ts
152
+ var import_oauth_pkce = __toESM(require("oauth-pkce"));
153
+ var generatePkce = () => __async(void 0, null, function* () {
154
+ return new Promise((resolve, reject) => {
155
+ (0, import_oauth_pkce.default)(50, (error, { verifier, challenge }) => {
156
+ if (error)
157
+ reject(error);
158
+ resolve({ verifier, challenge, algorithm: "S256" });
159
+ });
160
+ });
161
+ });
162
+
163
+ // src/utils/others.ts
164
+ var toURL = (input) => {
165
+ try {
166
+ return new URL(input);
167
+ } catch (e) {
168
+ return new URL(input, window.location.origin);
169
+ }
170
+ };
171
+ var makeKey = (key, prefix) => {
172
+ return prefix ? `${prefix}_${key}` : key;
173
+ };
174
+
175
+ // src/authConfig.ts
176
+ var config = null;
177
+ var getConfig = () => config;
178
+ function createInternalConfig(passedConfig) {
179
+ const {
180
+ preLogin = () => null,
181
+ postLogin = () => null,
182
+ onLogInError = () => null,
183
+ storage = "local",
184
+ spaCallbackUri = passedConfig.spaCallbackUri ? toURL(passedConfig.spaCallbackUri).toString() : window.location.origin,
185
+ logoutRedirect = passedConfig.logoutRedirect ? toURL(passedConfig.logoutRedirect).toString() : window.location.origin,
186
+ storageKeyPrefix = "auth_",
187
+ googleProvider
188
+ } = passedConfig;
189
+ config = __spreadProps(__spreadValues({}, passedConfig), {
190
+ preLogin,
191
+ postLogin,
192
+ onLogInError,
193
+ storage,
194
+ storageKeyPrefix,
195
+ spaCallbackUri,
196
+ logoutRedirect,
197
+ keys: createAuthKeys(storageKeyPrefix),
198
+ googleProvider: googleProvider ? __spreadValues({ type: "spa", scope: "openid email profile" }, googleProvider) : void 0
199
+ });
200
+ return config;
201
+ }
202
+ function createAuthKeys(prefix) {
203
+ return {
204
+ PROVIDER_TYPE: makeKey("provider_type", prefix),
205
+ PROVIDER: makeKey("provider", prefix),
206
+ VERIFIER: makeKey("verifier", prefix),
207
+ ACCESS_TOKEN: makeKey("access_token", prefix),
208
+ EXPIRES_IN: makeKey("expires_in", prefix),
209
+ REFRESH_TOKEN: makeKey("refresh_token", prefix),
210
+ TOKEN_TYPE: makeKey("token_type", prefix),
211
+ ID_TOKEN: makeKey("id_token", prefix)
212
+ };
213
+ }
214
+
215
+ // src/utils/constants.ts
216
+ var AUTH_PROVIDERS = { google: "google" };
217
+
218
+ // src/utils/storage.ts
219
+ var keepToStorage = (type, key, value) => {
220
+ if (type === "local")
221
+ localStorage.setItem(key, value);
222
+ else if (type === "session")
223
+ sessionStorage.setItem(key, value);
224
+ };
225
+ var removeFromStorage = (type, key) => {
226
+ if (type === "local")
227
+ localStorage.removeItem(key);
228
+ else if (type === "session")
229
+ sessionStorage.removeItem(key);
230
+ };
231
+ var getFromStorage = (type, key) => {
232
+ var _a, _b;
233
+ if (type === "local")
234
+ return (_a = localStorage.getItem(key)) != null ? _a : "";
235
+ else if (type === "session")
236
+ return (_b = sessionStorage.getItem(key)) != null ? _b : "";
237
+ return "";
238
+ };
239
+
240
+ // src/google/index.ts
241
+ var signinWithGoogleSpa = () => __async(void 0, null, function* () {
242
+ const config2 = getConfig();
243
+ if (!config2)
244
+ return;
245
+ const { googleProvider, keys } = config2;
246
+ const { verifier, challenge, algorithm } = yield generatePkce();
247
+ setSessionItem(keys.VERIFIER, verifier, 3 * 60 * 1e3);
248
+ setSessionItem(keys.PROVIDER, AUTH_PROVIDERS.google, 3 * 60 * 1e3);
249
+ setSessionItem(keys.PROVIDER_TYPE, googleProvider == null ? void 0 : googleProvider.type, 3 * 60 * 1e3);
250
+ const params = new URLSearchParams({
251
+ client_id: googleProvider == null ? void 0 : googleProvider.clientId,
252
+ redirect_uri: config2 == null ? void 0 : config2.spaCallbackUri,
253
+ response_type: "code",
254
+ scope: (googleProvider == null ? void 0 : googleProvider.scope) || "",
255
+ code_challenge: challenge,
256
+ code_challenge_method: algorithm,
257
+ access_type: "offline",
258
+ prompt: "consent"
259
+ });
260
+ window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;
261
+ });
262
+ var signinWithGoogleCallback = (code, verifier) => __async(void 0, null, function* () {
263
+ if (!code || !verifier)
264
+ return;
265
+ const config2 = getConfig();
266
+ if (!config2)
267
+ return;
268
+ const { googleProvider, keys } = config2;
269
+ const type = "spa";
270
+ try {
271
+ const data = new URLSearchParams({
272
+ client_id: googleProvider == null ? void 0 : googleProvider.clientId,
273
+ grant_type: "authorization_code",
274
+ code,
275
+ redirect_uri: config2 == null ? void 0 : config2.spaCallbackUri,
276
+ code_verifier: verifier
277
+ });
278
+ const res = yield http_default.post(
279
+ "https://oauth2.googleapis.com/token",
280
+ data.toString(),
281
+ {
282
+ headers: { "Content-Type": "application/x-www-form-urlencoded" }
283
+ }
284
+ );
285
+ const tokens = res.data;
286
+ if (tokens == null ? void 0 : tokens.access_token) {
287
+ removeSessionItem(keys.PROVIDER);
288
+ removeSessionItem(keys.VERIFIER);
289
+ removeSessionItem(keys.PROVIDER_TYPE);
290
+ keepToStorage(config2.storage, keys.PROVIDER, AUTH_PROVIDERS.google);
291
+ keepToStorage(config2.storage, keys.PROVIDER_TYPE, type);
292
+ keepToStorage(config2.storage, keys.ACCESS_TOKEN, tokens.access_token);
293
+ keepToStorage(
294
+ config2.storage,
295
+ keys.EXPIRES_IN,
296
+ String(Date.now() + tokens.expires_in * 1e3)
297
+ );
298
+ keepToStorage(config2.storage, keys.REFRESH_TOKEN, tokens.refresh_token);
299
+ keepToStorage(config2.storage, keys.TOKEN_TYPE, tokens.token_type);
300
+ keepToStorage(config2.storage, keys.ID_TOKEN, tokens.id_token);
301
+ }
302
+ } catch (error) {
303
+ return Promise.reject(error);
304
+ }
305
+ });
306
+ var getGoogleSessionUser = () => __async(void 0, null, function* () {
307
+ const config2 = getConfig();
308
+ if (!config2)
309
+ return;
310
+ const { keys } = config2;
311
+ try {
312
+ const accessToken = getFromStorage(config2.storage, keys.ACCESS_TOKEN);
313
+ if (!accessToken)
314
+ return;
315
+ const res = yield http_default.get(
316
+ `https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${accessToken}`
317
+ );
318
+ const user = res.data;
319
+ return user;
320
+ } catch (error) {
321
+ return Promise.reject(error);
322
+ }
323
+ });
324
+ var refreshGoogleAccessToken = () => __async(void 0, null, function* () {
325
+ const config2 = getConfig();
326
+ if (!config2)
327
+ return;
328
+ const { googleProvider, keys } = config2;
329
+ const refreshToken = getFromStorage(config2.storage, keys.REFRESH_TOKEN);
330
+ if (!refreshToken)
331
+ return;
332
+ try {
333
+ const data = new URLSearchParams({
334
+ client_id: googleProvider == null ? void 0 : googleProvider.clientId,
335
+ grant_type: "refresh_token",
336
+ refresh_token: refreshToken
337
+ });
338
+ const res = yield http_default.post(
339
+ "https://oauth2.googleapis.com/token",
340
+ data.toString(),
341
+ {
342
+ headers: { "Content-Type": "application/x-www-form-urlencoded" }
343
+ }
344
+ );
345
+ const tokens = res.data;
346
+ if (!tokens.access_token) {
347
+ console.error("Failed to refresh access token", tokens);
348
+ return null;
349
+ }
350
+ keepToStorage(config2.storage, keys.ACCESS_TOKEN, tokens.access_token);
351
+ if (tokens.expires_in) {
352
+ keepToStorage(
353
+ config2.storage,
354
+ keys.EXPIRES_IN,
355
+ String(Date.now() + tokens.expires_in * 1e3)
356
+ );
357
+ }
358
+ if (tokens.id_token)
359
+ keepToStorage(config2.storage, keys.ID_TOKEN, tokens.id_token);
360
+ if (tokens.token_type)
361
+ keepToStorage(config2.storage, keys.TOKEN_TYPE, tokens.token_type);
362
+ } catch (error) {
363
+ return Promise.reject(error);
364
+ }
365
+ });
366
+
367
+ // src/actions.ts
368
+ var refreshTimeout = null;
369
+ var handleCallback = () => __async(void 0, null, function* () {
370
+ const config2 = getConfig();
371
+ if (!config2)
372
+ return;
373
+ const keys = config2 == null ? void 0 : config2.keys;
374
+ const authMode = getSessionItem(keys.PROVIDER);
375
+ const verifier = getSessionItem(keys.VERIFIER);
376
+ if (!authMode || !verifier)
377
+ return;
378
+ try {
379
+ switch (authMode) {
380
+ case AUTH_PROVIDERS.google: {
381
+ const searchQuery = new URLSearchParams(window.location.search);
382
+ const code = searchQuery.get("code");
383
+ if (!code)
384
+ return;
385
+ yield signinWithGoogleCallback(code, verifier);
386
+ break;
387
+ }
388
+ default:
389
+ break;
390
+ }
391
+ } catch (error) {
392
+ return Promise.reject(error);
393
+ }
394
+ });
395
+ var handleFetchSessionUser = (retry = true) => __async(void 0, null, function* () {
396
+ const config2 = getConfig();
397
+ if (!config2)
398
+ return;
399
+ const keys = config2 == null ? void 0 : config2.keys;
400
+ const authMode = getFromStorage(config2.storage, keys.PROVIDER);
401
+ if (!authMode)
402
+ return;
403
+ let sessionUser = null;
404
+ try {
405
+ switch (authMode) {
406
+ case AUTH_PROVIDERS.google: {
407
+ sessionUser = yield getGoogleSessionUser();
408
+ break;
409
+ }
410
+ default:
411
+ break;
412
+ }
413
+ if (sessionUser)
414
+ handleScheduleTokenRefresh();
415
+ return sessionUser;
416
+ } catch (error) {
417
+ console.log("Fetch Session User Error:", error);
418
+ if (!retry)
419
+ return null;
420
+ switch (authMode) {
421
+ case AUTH_PROVIDERS.google: {
422
+ yield refreshGoogleAccessToken();
423
+ yield handleFetchSessionUser(false);
424
+ break;
425
+ }
426
+ default:
427
+ break;
428
+ }
429
+ return null;
430
+ }
431
+ });
432
+ var handleScheduleTokenRefresh = () => {
433
+ var _a;
434
+ const config2 = getConfig();
435
+ if (!config2)
436
+ return;
437
+ const keys = config2 == null ? void 0 : config2.keys;
438
+ const authMode = getFromStorage(config2.storage, keys.PROVIDER);
439
+ if (!authMode)
440
+ return;
441
+ const expiresIn = Number(
442
+ (_a = getFromStorage(config2.storage, keys.EXPIRES_IN)) != null ? _a : 0
443
+ );
444
+ if (!expiresIn)
445
+ return;
446
+ clearTokenRefresh();
447
+ const refreshTime = expiresIn - 60 * 1e3;
448
+ refreshTimeout = setTimeout(() => __async(void 0, null, function* () {
449
+ switch (authMode) {
450
+ case AUTH_PROVIDERS.google: {
451
+ yield refreshGoogleAccessToken();
452
+ break;
453
+ }
454
+ default:
455
+ break;
456
+ }
457
+ }), refreshTime);
458
+ };
459
+ var clearTokenRefresh = () => {
460
+ if (refreshTimeout) {
461
+ clearTimeout(refreshTimeout);
462
+ refreshTimeout = null;
463
+ }
464
+ };
465
+ var logout = () => {
466
+ clearTokens();
467
+ clearTokenRefresh();
468
+ };
469
+ var clearTokens = () => {
470
+ const config2 = getConfig();
471
+ if (!config2)
472
+ return;
473
+ const keys = config2 == null ? void 0 : config2.keys;
474
+ const {
475
+ PROVIDER,
476
+ ACCESS_TOKEN,
477
+ EXPIRES_IN,
478
+ REFRESH_TOKEN,
479
+ TOKEN_TYPE,
480
+ ID_TOKEN,
481
+ PROVIDER_TYPE
482
+ } = keys;
483
+ removeFromStorage(config2.storage, PROVIDER);
484
+ removeFromStorage(config2.storage, PROVIDER_TYPE);
485
+ removeFromStorage(config2.storage, ACCESS_TOKEN);
486
+ removeFromStorage(config2.storage, EXPIRES_IN);
487
+ removeFromStorage(config2.storage, REFRESH_TOKEN);
488
+ removeFromStorage(config2.storage, TOKEN_TYPE);
489
+ removeFromStorage(config2.storage, ID_TOKEN);
490
+ };
491
+
492
+ // src/AuthProvider.tsx
493
+ var AuthProvider = ({
494
+ authConfig,
495
+ children
496
+ }) => {
497
+ const config2 = (0, import_react2.useMemo)(
498
+ () => createInternalConfig(authConfig),
499
+ [authConfig]
500
+ );
501
+ const tmpAuthProviderType = (0, import_react2.useMemo)(
502
+ () => getSessionItem(config2.keys.PROVIDER_TYPE),
503
+ [config2]
504
+ );
505
+ const [loginInProgress, setLoginInProgress] = (0, import_react2.useState)(true);
506
+ const [user, setUser] = (0, import_react2.useState)();
507
+ (0, import_react2.useEffect)(() => {
508
+ handleFetchSessionUser().then((user2) => {
509
+ setUser(user2);
510
+ setLoginInProgress(false);
511
+ });
512
+ }, []);
513
+ const signinWithGoogle = (0, import_react2.useCallback)(() => __async(void 0, null, function* () {
514
+ var _a, _b, _c;
515
+ if (!((_a = config2.googleProvider) == null ? void 0 : _a.clientId)) {
516
+ throw Error(
517
+ "'clientId' must be set in the 'googleProvider' object in the AuthProvider Config"
518
+ );
519
+ }
520
+ (_b = config2.preLogin) == null ? void 0 : _b.call(config2);
521
+ try {
522
+ if (config2.googleProvider.type === "spa") {
523
+ yield signinWithGoogleSpa();
524
+ }
525
+ } catch (error) {
526
+ (_c = config2.onLogInError) == null ? void 0 : _c.call(config2, error);
527
+ }
528
+ }), []);
529
+ (0, import_react2.useEffect)(() => {
530
+ if (!config2 || !tmpAuthProviderType)
531
+ return;
532
+ if (window.location.pathname !== new URL(config2.spaCallbackUri).pathname) {
533
+ return;
534
+ }
535
+ const callback = () => __async(void 0, null, function* () {
536
+ var _a, _b;
537
+ try {
538
+ yield handleCallback();
539
+ (_a = config2.postLogin) == null ? void 0 : _a.call(config2);
540
+ } catch (error) {
541
+ (_b = config2.onLogInError) == null ? void 0 : _b.call(config2, error);
542
+ }
543
+ });
544
+ callback();
545
+ }, [tmpAuthProviderType, config2]);
546
+ const logOut = (0, import_react2.useCallback)(
547
+ ({ logoutHint, redirect = true, redirectUri } = {}) => {
548
+ logout();
549
+ if (!redirect)
550
+ return;
551
+ const baseUrl = redirectUri || config2.logoutRedirect || "/";
552
+ const params = new URLSearchParams();
553
+ if (logoutHint)
554
+ params.append("logout_hint", logoutHint);
555
+ const url = params.toString() ? `${baseUrl}?${params.toString()}` : baseUrl;
556
+ window.location.assign(url);
557
+ },
558
+ []
559
+ );
560
+ return /* @__PURE__ */ import_react2.default.createElement(
561
+ AuthContext.Provider,
562
+ {
563
+ value: {
564
+ loginInProgress,
565
+ signinWithGoogle,
566
+ user,
567
+ logOut
568
+ }
569
+ },
570
+ children
571
+ );
572
+ };
573
+
574
+ // src/useAuth.tsx
575
+ var import_react3 = require("react");
576
+ function useAuth() {
577
+ const ctx = (0, import_react3.useContext)(AuthContext);
578
+ if (!ctx) {
579
+ throw new Error("useAuth must be used within an AuthProvider");
580
+ }
581
+ return ctx;
582
+ }
583
+ // Annotate the CommonJS export names for ESM import in node:
584
+ 0 && (module.exports = {
585
+ AuthContext,
586
+ AuthProvider,
587
+ useAuth
588
+ });