@propelauth/nextjs 0.0.60

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,543 @@
1
+ "use client";
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var __async = (__this, __arguments, generator) => {
31
+ return new Promise((resolve, reject) => {
32
+ var fulfilled = (value) => {
33
+ try {
34
+ step(generator.next(value));
35
+ } catch (e) {
36
+ reject(e);
37
+ }
38
+ };
39
+ var rejected = (value) => {
40
+ try {
41
+ step(generator.throw(value));
42
+ } catch (e) {
43
+ reject(e);
44
+ }
45
+ };
46
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
47
+ step((generator = generator.apply(__this, __arguments)).next());
48
+ });
49
+ };
50
+
51
+ // src/client/index.ts
52
+ var client_exports = {};
53
+ __export(client_exports, {
54
+ AuthProvider: () => AuthProvider,
55
+ RedirectToLogin: () => RedirectToLogin,
56
+ RedirectToSignup: () => RedirectToSignup,
57
+ useHostedPageUrls: () => useHostedPageUrls,
58
+ useLogoutFunction: () => useLogoutFunction,
59
+ useRedirectFunctions: () => useRedirectFunctions,
60
+ useRefreshAuth: () => useRefreshAuth,
61
+ useUser: () => useUser
62
+ });
63
+ module.exports = __toCommonJS(client_exports);
64
+
65
+ // src/client/AuthProvider.tsx
66
+ var import_react = __toESM(require("react"));
67
+
68
+ // src/user.ts
69
+ var User = class {
70
+ constructor(userId, email, orgIdToOrgMemberInfo, firstName, lastName, username, legacyUserId, impersonatorUserId) {
71
+ this.userId = userId;
72
+ this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo;
73
+ this.email = email;
74
+ this.firstName = firstName;
75
+ this.lastName = lastName;
76
+ this.username = username;
77
+ this.legacyUserId = legacyUserId;
78
+ this.impersonatorUserId = impersonatorUserId;
79
+ }
80
+ getOrg(orgId) {
81
+ if (!this.orgIdToOrgMemberInfo) {
82
+ return void 0;
83
+ }
84
+ return this.orgIdToOrgMemberInfo[orgId];
85
+ }
86
+ getOrgByName(orgName) {
87
+ if (!this.orgIdToOrgMemberInfo) {
88
+ return void 0;
89
+ }
90
+ const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, "-");
91
+ for (const orgId in this.orgIdToOrgMemberInfo) {
92
+ const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId];
93
+ if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {
94
+ return orgMemberInfo;
95
+ }
96
+ }
97
+ return void 0;
98
+ }
99
+ getOrgs() {
100
+ if (!this.orgIdToOrgMemberInfo) {
101
+ return [];
102
+ }
103
+ return Object.values(this.orgIdToOrgMemberInfo);
104
+ }
105
+ isImpersonating() {
106
+ return !!this.impersonatorUserId;
107
+ }
108
+ static fromJSON(json) {
109
+ const obj = JSON.parse(json);
110
+ const orgIdToOrgMemberInfo = {};
111
+ for (const orgId in obj.orgIdToOrgMemberInfo) {
112
+ orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(
113
+ JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])
114
+ );
115
+ }
116
+ return new User(
117
+ obj.userId,
118
+ obj.email,
119
+ orgIdToOrgMemberInfo,
120
+ obj.firstName,
121
+ obj.lastName,
122
+ obj.username,
123
+ obj.legacyUserId,
124
+ obj.impersonatorUserId
125
+ );
126
+ }
127
+ };
128
+ var OrgMemberInfo = class {
129
+ constructor(orgId, orgName, orgMetadata, urlSafeOrgName, userAssignedRole, userInheritedRolesPlusCurrentRole, userPermissions) {
130
+ this.orgId = orgId;
131
+ this.orgName = orgName;
132
+ this.orgMetadata = orgMetadata;
133
+ this.urlSafeOrgName = urlSafeOrgName;
134
+ this.userAssignedRole = userAssignedRole;
135
+ this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole;
136
+ this.userPermissions = userPermissions;
137
+ }
138
+ // validation methods
139
+ isRole(role) {
140
+ return this.userAssignedRole === role;
141
+ }
142
+ isAtLeastRole(role) {
143
+ return this.userInheritedRolesPlusCurrentRole.includes(role);
144
+ }
145
+ hasPermission(permission) {
146
+ return this.userPermissions.includes(permission);
147
+ }
148
+ hasAllPermissions(permissions) {
149
+ return permissions.every((permission) => this.hasPermission(permission));
150
+ }
151
+ static fromJSON(json) {
152
+ const obj = JSON.parse(json);
153
+ return new OrgMemberInfo(
154
+ obj.orgId,
155
+ obj.orgName,
156
+ obj.orgMetadata,
157
+ obj.urlSafeOrgName,
158
+ obj.userAssignedRole,
159
+ obj.userInheritedRolesPlusCurrentRole,
160
+ obj.userPermissions
161
+ );
162
+ }
163
+ // getters for the private fields
164
+ get assignedRole() {
165
+ return this.userAssignedRole;
166
+ }
167
+ get inheritedRolesPlusCurrentRole() {
168
+ return this.userInheritedRolesPlusCurrentRole;
169
+ }
170
+ get permissions() {
171
+ return this.userPermissions;
172
+ }
173
+ };
174
+
175
+ // src/client/utils.ts
176
+ var USER_INFO_KEY = "__PROPEL_AUTH_USER_INFO";
177
+ function hasWindow() {
178
+ return typeof window !== "undefined";
179
+ }
180
+ function saveUserToLocalStorage(user) {
181
+ if (user) {
182
+ localStorage.setItem(USER_INFO_KEY, JSON.stringify(user));
183
+ } else {
184
+ localStorage.setItem(USER_INFO_KEY, "{}");
185
+ }
186
+ }
187
+ function doesLocalStorageMatch(newValue, user) {
188
+ if (!newValue) {
189
+ return false;
190
+ } else if (!user) {
191
+ return newValue === "{}";
192
+ }
193
+ const parsed = JSON.parse(newValue);
194
+ if (!parsed) {
195
+ return false;
196
+ }
197
+ return isEqual(parsed, user);
198
+ }
199
+ function isEqual(a, b) {
200
+ if (typeof a !== typeof b) {
201
+ return false;
202
+ }
203
+ if (Array.isArray(a) !== Array.isArray(b)) {
204
+ return false;
205
+ }
206
+ if (Array.isArray(a)) {
207
+ const aArray = a;
208
+ const bArray = b;
209
+ if (aArray.length !== bArray.length) {
210
+ return false;
211
+ }
212
+ for (let i = 0; i < aArray.length; i++) {
213
+ if (!isEqual(aArray[i], bArray[i])) {
214
+ return false;
215
+ }
216
+ }
217
+ return true;
218
+ }
219
+ if (typeof a === "object") {
220
+ const aKeys = Object.keys(a);
221
+ const bKeys = Object.keys(b);
222
+ if (aKeys.length !== bKeys.length) {
223
+ return false;
224
+ }
225
+ for (const key of aKeys) {
226
+ if (!isEqual(a[key], b[key])) {
227
+ return false;
228
+ }
229
+ }
230
+ return true;
231
+ } else {
232
+ return a === b;
233
+ }
234
+ }
235
+
236
+ // src/client/AuthProvider.tsx
237
+ var import_navigation = require("next/navigation");
238
+ var AuthContext = import_react.default.createContext(void 0);
239
+ var initialAuthState = {
240
+ loading: true,
241
+ user: void 0,
242
+ authChangeDetected: false
243
+ };
244
+ function authStateReducer(_state, action) {
245
+ const authChangeDetected = !_state.loading && !isEqual(action.user, _state.user);
246
+ if (!action.user) {
247
+ return {
248
+ loading: false,
249
+ user: void 0,
250
+ authChangeDetected
251
+ };
252
+ } else if (_state.loading) {
253
+ return {
254
+ loading: false,
255
+ user: action.user,
256
+ authChangeDetected
257
+ };
258
+ } else {
259
+ return {
260
+ loading: false,
261
+ user: action.user,
262
+ authChangeDetected
263
+ };
264
+ }
265
+ }
266
+ var AuthProvider = (props) => {
267
+ const [authState, dispatchInner] = (0, import_react.useReducer)(authStateReducer, initialAuthState);
268
+ const router = (0, import_navigation.useRouter)();
269
+ const dispatch = (0, import_react.useCallback)((action) => {
270
+ dispatchInner(action);
271
+ saveUserToLocalStorage(action.user);
272
+ }, [dispatchInner]);
273
+ (0, import_react.useEffect)(() => {
274
+ if (authState.authChangeDetected) {
275
+ router.refresh();
276
+ }
277
+ }, [authState.authChangeDetected, router]);
278
+ (0, import_react.useEffect)(() => {
279
+ let didCancel = false;
280
+ function refreshAuthInfo2() {
281
+ return __async(this, null, function* () {
282
+ const { user } = yield apiGetUserInfo();
283
+ if (!didCancel) {
284
+ dispatch({ user });
285
+ }
286
+ });
287
+ }
288
+ refreshAuthInfo2();
289
+ return () => {
290
+ didCancel = true;
291
+ };
292
+ }, []);
293
+ (0, import_react.useEffect)(() => {
294
+ let didCancel = false;
295
+ function refreshToken() {
296
+ return __async(this, null, function* () {
297
+ const { user } = yield apiGetUserInfo();
298
+ if (!didCancel) {
299
+ dispatch({ user });
300
+ }
301
+ });
302
+ }
303
+ function onStorageEvent(event) {
304
+ return __async(this, null, function* () {
305
+ if (event.key === USER_INFO_KEY && !doesLocalStorageMatch(event.newValue, authState.user)) {
306
+ yield refreshToken();
307
+ }
308
+ });
309
+ }
310
+ const interval = setInterval(refreshToken, 5 * 60 * 1e3);
311
+ if (hasWindow()) {
312
+ window.addEventListener("storage", onStorageEvent);
313
+ window.addEventListener("online", refreshToken);
314
+ window.addEventListener("focus", refreshToken);
315
+ }
316
+ return () => {
317
+ didCancel = true;
318
+ clearInterval(interval);
319
+ if (hasWindow()) {
320
+ window.removeEventListener("storage", onStorageEvent);
321
+ window.removeEventListener("online", refreshToken);
322
+ window.removeEventListener("focus", refreshToken);
323
+ }
324
+ };
325
+ }, [dispatch, authState.user]);
326
+ const logout = (0, import_react.useCallback)(() => __async(void 0, null, function* () {
327
+ yield fetch("/api/auth/logout", {
328
+ method: "POST",
329
+ headers: {
330
+ "Content-Type": "application/json"
331
+ },
332
+ credentials: "include"
333
+ });
334
+ dispatch({ user: void 0 });
335
+ }), [dispatch]);
336
+ const getLoginPageUrl = () => "/api/auth/login";
337
+ const getSignupPageUrl = () => "/api/auth/signup";
338
+ const getAccountPageUrl = (0, import_react.useCallback)(() => {
339
+ return `${props.authUrl}/account`;
340
+ }, [props.authUrl]);
341
+ const getOrgPageUrl = (0, import_react.useCallback)(
342
+ (orgId) => {
343
+ if (orgId) {
344
+ return `${props.authUrl}/org?id=${orgId}`;
345
+ } else {
346
+ return `${props.authUrl}/org`;
347
+ }
348
+ },
349
+ [props.authUrl]
350
+ );
351
+ const getCreateOrgPageUrl = (0, import_react.useCallback)(() => {
352
+ return `${props.authUrl}/create_org`;
353
+ }, [props.authUrl]);
354
+ const getSetupSAMLPageUrl = (0, import_react.useCallback)(
355
+ (orgId) => {
356
+ return `${props.authUrl}/saml?id=${orgId}`;
357
+ },
358
+ [props.authUrl]
359
+ );
360
+ const redirectTo = (url) => {
361
+ window.location.href = url;
362
+ };
363
+ const redirectToLoginPage = () => redirectTo(getLoginPageUrl());
364
+ const redirectToSignupPage = () => redirectTo(getSignupPageUrl());
365
+ const redirectToAccountPage = () => redirectTo(getAccountPageUrl());
366
+ const redirectToOrgPage = (orgId) => redirectTo(getOrgPageUrl(orgId));
367
+ const redirectToCreateOrgPage = () => redirectTo(getCreateOrgPageUrl());
368
+ const redirectToSetupSAMLPage = (orgId) => redirectTo(getSetupSAMLPageUrl(orgId));
369
+ const refreshAuthInfo = () => __async(void 0, null, function* () {
370
+ const { user } = yield apiGetUserInfo();
371
+ dispatch({ user });
372
+ return user;
373
+ });
374
+ const value = {
375
+ loading: authState.loading,
376
+ user: authState.user,
377
+ logout,
378
+ redirectToLoginPage,
379
+ redirectToSignupPage,
380
+ redirectToAccountPage,
381
+ redirectToOrgPage,
382
+ redirectToCreateOrgPage,
383
+ redirectToSetupSAMLPage,
384
+ getLoginPageUrl,
385
+ getSignupPageUrl,
386
+ getAccountPageUrl,
387
+ getOrgPageUrl,
388
+ getCreateOrgPageUrl,
389
+ getSetupSAMLPageUrl,
390
+ refreshAuthInfo
391
+ };
392
+ return /* @__PURE__ */ import_react.default.createElement(AuthContext.Provider, { value }, props.children);
393
+ };
394
+ function apiGetUserInfo() {
395
+ return __async(this, null, function* () {
396
+ try {
397
+ const userInfoResponse = yield fetch("/api/auth/userinfo", {
398
+ method: "GET",
399
+ headers: {
400
+ "Content-Type": "application/json"
401
+ },
402
+ credentials: "include"
403
+ });
404
+ if (userInfoResponse.ok) {
405
+ const userJson = yield userInfoResponse.text();
406
+ const user = User.fromJSON(userJson);
407
+ return { user };
408
+ } else if (userInfoResponse.status === 401) {
409
+ return { user: void 0 };
410
+ } else {
411
+ console.log("Failed to refresh token", userInfoResponse);
412
+ }
413
+ } catch (e) {
414
+ console.log("Failed to refresh token", e);
415
+ }
416
+ throw new Error("Failed to refresh token");
417
+ });
418
+ }
419
+
420
+ // src/client/useUser.tsx
421
+ var import_react2 = require("react");
422
+ function useUser() {
423
+ const context = (0, import_react2.useContext)(AuthContext);
424
+ if (context === void 0) {
425
+ throw new Error("useUser must be used within an AuthProvider");
426
+ }
427
+ const { loading, user } = context;
428
+ if (loading) {
429
+ return {
430
+ loading: true,
431
+ isLoggedIn: void 0,
432
+ user: void 0
433
+ };
434
+ } else if (user) {
435
+ return {
436
+ loading: false,
437
+ isLoggedIn: true,
438
+ user
439
+ };
440
+ } else {
441
+ return {
442
+ loading: false,
443
+ isLoggedIn: false,
444
+ user: void 0
445
+ };
446
+ }
447
+ }
448
+
449
+ // src/client/useHostedPageUrls.tsx
450
+ var import_react3 = require("react");
451
+ function useHostedPageUrls() {
452
+ const context = (0, import_react3.useContext)(AuthContext);
453
+ if (context === void 0) {
454
+ throw new Error("useHostedPageUrls must be used within an AuthProvider");
455
+ }
456
+ const {
457
+ getLoginPageUrl,
458
+ getSignupPageUrl,
459
+ getAccountPageUrl,
460
+ getOrgPageUrl,
461
+ getCreateOrgPageUrl,
462
+ getSetupSAMLPageUrl
463
+ } = context;
464
+ return {
465
+ getLoginPageUrl,
466
+ getSignupPageUrl,
467
+ getAccountPageUrl,
468
+ getOrgPageUrl,
469
+ getCreateOrgPageUrl,
470
+ getSetupSAMLPageUrl
471
+ };
472
+ }
473
+
474
+ // src/client/useLogoutFunction.ts
475
+ var import_react4 = require("react");
476
+ function useLogoutFunction() {
477
+ const context = (0, import_react4.useContext)(AuthContext);
478
+ if (context === void 0) {
479
+ throw new Error("useLogoutFunction must be used within an AuthProvider");
480
+ }
481
+ const { logout } = context;
482
+ return logout;
483
+ }
484
+
485
+ // src/client/useRedirectFunctions.tsx
486
+ var import_react5 = __toESM(require("react"));
487
+ function useRedirectFunctions() {
488
+ const context = (0, import_react5.useContext)(AuthContext);
489
+ if (context === void 0) {
490
+ throw new Error("useRedirectFunctions must be used within an AuthProvider");
491
+ }
492
+ const {
493
+ redirectToAccountPage,
494
+ redirectToSignupPage,
495
+ redirectToLoginPage,
496
+ redirectToOrgPage,
497
+ redirectToCreateOrgPage
498
+ } = context;
499
+ return {
500
+ redirectToSignupPage,
501
+ redirectToLoginPage,
502
+ redirectToAccountPage,
503
+ redirectToOrgPage,
504
+ redirectToCreateOrgPage
505
+ };
506
+ }
507
+ function RedirectToSignup({ children }) {
508
+ const { redirectToSignupPage } = useRedirectFunctions();
509
+ (0, import_react5.useEffect)(() => {
510
+ redirectToSignupPage();
511
+ }, []);
512
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, children);
513
+ }
514
+ function RedirectToLogin({ children }) {
515
+ const { redirectToLoginPage } = useRedirectFunctions();
516
+ (0, import_react5.useEffect)(() => {
517
+ redirectToLoginPage();
518
+ }, []);
519
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, children);
520
+ }
521
+
522
+ // src/client/useRefreshAuth.ts
523
+ var import_react6 = require("react");
524
+ function useRefreshAuth() {
525
+ const context = (0, import_react6.useContext)(AuthContext);
526
+ if (context === void 0) {
527
+ throw new Error("useRefreshAuth must be used within an AuthProvider");
528
+ }
529
+ const { refreshAuthInfo } = context;
530
+ return refreshAuthInfo;
531
+ }
532
+ // Annotate the CommonJS export names for ESM import in node:
533
+ 0 && (module.exports = {
534
+ AuthProvider,
535
+ RedirectToLogin,
536
+ RedirectToSignup,
537
+ useHostedPageUrls,
538
+ useLogoutFunction,
539
+ useRedirectFunctions,
540
+ useRefreshAuth,
541
+ useUser
542
+ });
543
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/index.ts","../../src/client/AuthProvider.tsx","../../src/user.ts","../../src/client/utils.ts","../../src/client/useUser.tsx","../../src/client/useHostedPageUrls.tsx","../../src/client/useLogoutFunction.ts","../../src/client/useRedirectFunctions.tsx","../../src/client/useRefreshAuth.ts"],"sourcesContent":["export type {OrgIdToOrgMemberInfo, OrgMemberInfo, User} from \"../user\"\nexport {AuthProvider} from \"./AuthProvider\"\nexport type {AuthProviderProps} from \"./AuthProvider\"\nexport {useUser} from \"./useUser\"\nexport type {UseUser, UseUserLoading, UseUserLoggedIn, UseUserNotLoggedIn} from \"./useUser\"\nexport {useHostedPageUrls} from \"./useHostedPageUrls\"\nexport {useLogoutFunction} from \"./useLogoutFunction\"\nexport {useRedirectFunctions, RedirectToLogin, RedirectToSignup} from \"./useRedirectFunctions\"\nexport type {RedirectProps} from \"./useRedirectFunctions\"\nexport {useRefreshAuth} from \"./useRefreshAuth\"","'use client'\n\nimport React, {useCallback, useEffect, useReducer} from \"react\"\nimport {User} from \"../user\"\nimport {doesLocalStorageMatch, hasWindow, isEqual, saveUserToLocalStorage, USER_INFO_KEY} from \"./utils\";\nimport {useRouter} from \"next/navigation\";\n\ninterface InternalAuthState {\n loading: boolean\n user?: User\n\n logout: () => Promise<void>\n\n redirectToLoginPage: () => void\n redirectToSignupPage: () => void\n redirectToAccountPage: () => void\n redirectToOrgPage: (orgId?: string) => void\n redirectToCreateOrgPage: () => void\n redirectToSetupSAMLPage: (orgId: string) => void\n\n getSignupPageUrl(): string\n\n getLoginPageUrl(): string\n\n getAccountPageUrl(): string\n\n getOrgPageUrl(orgId?: string): string\n\n getCreateOrgPageUrl(): string\n\n getSetupSAMLPageUrl(orgId: string): string\n\n refreshAuthInfo: () => Promise<User | undefined>\n}\n\nexport type AuthProviderProps = {\n authUrl: string\n children?: React.ReactNode\n}\n\nexport const AuthContext = React.createContext<InternalAuthState | undefined>(undefined)\n\ntype AuthState = {\n loading: boolean\n user?: User\n\n // There's no good way to trigger server components to reload outside of router.refresh()\n // This is our workaround until the app router has something better\n authChangeDetected: boolean\n}\n\nconst initialAuthState = {\n loading: true,\n user: undefined,\n authChangeDetected: false,\n}\n\ntype AuthStateAction = {\n user?: User\n}\n\nfunction authStateReducer(_state: AuthState, action: AuthStateAction): AuthState {\n const authChangeDetected = !_state.loading && !isEqual(action.user, _state.user)\n\n if (!action.user) {\n return {\n loading: false,\n user: undefined,\n authChangeDetected,\n }\n } else if (_state.loading) {\n return {\n loading: false,\n user: action.user,\n authChangeDetected,\n }\n } else {\n return {\n loading: false,\n user: action.user,\n authChangeDetected\n }\n }\n}\n\nexport const AuthProvider = (props: AuthProviderProps) => {\n const [authState, dispatchInner] = useReducer(authStateReducer, initialAuthState)\n const router = useRouter()\n\n const dispatch = useCallback((action: AuthStateAction) => {\n dispatchInner(action)\n saveUserToLocalStorage(action.user)\n }, [dispatchInner])\n\n // This is because we don't have a good way to trigger server components to reload outside of router.refresh()\n // Once server actions isn't alpha, we can hopefully use that instead\n useEffect(() => {\n if (authState.authChangeDetected) {\n router.refresh()\n }\n }, [authState.authChangeDetected, router])\n\n // Trigger an initial refresh\n useEffect(() => {\n let didCancel = false\n\n async function refreshAuthInfo() {\n const {user} = await apiGetUserInfo()\n if (!didCancel) {\n dispatch({user})\n }\n }\n\n refreshAuthInfo()\n return () => {\n didCancel = true\n }\n }, [])\n\n\n // Periodically refresh the token\n useEffect(() => {\n let didCancel = false\n\n async function refreshToken() {\n const {user} = await apiGetUserInfo()\n if (!didCancel) {\n dispatch({user})\n }\n }\n\n async function onStorageEvent(event: StorageEvent) {\n if (event.key === USER_INFO_KEY && !doesLocalStorageMatch(event.newValue, authState.user)) {\n await refreshToken()\n }\n }\n\n // TODO: Retry logic if the request fails\n const interval = setInterval(refreshToken, 5 * 60 * 1000)\n\n if (hasWindow()) {\n window.addEventListener(\"storage\", onStorageEvent)\n window.addEventListener(\"online\", refreshToken)\n window.addEventListener(\"focus\", refreshToken)\n }\n\n return () => {\n didCancel = true\n clearInterval(interval)\n if (hasWindow()) {\n window.removeEventListener(\"storage\", onStorageEvent)\n window.removeEventListener(\"online\", refreshToken)\n window.removeEventListener(\"focus\", refreshToken)\n }\n }\n }, [dispatch, authState.user])\n\n\n const logout = useCallback(async () => {\n await fetch(\"/api/auth/logout\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n })\n dispatch({user: undefined})\n }, [dispatch])\n\n const getLoginPageUrl = () => \"/api/auth/login\"\n const getSignupPageUrl = () => \"/api/auth/signup\"\n const getAccountPageUrl = useCallback(() => {\n return `${props.authUrl}/account`\n }, [props.authUrl])\n const getOrgPageUrl = useCallback(\n (orgId?: string) => {\n if (orgId) {\n return `${props.authUrl}/org?id=${orgId}`\n } else {\n return `${props.authUrl}/org`\n }\n },\n [props.authUrl]\n )\n const getCreateOrgPageUrl = useCallback(() => {\n return `${props.authUrl}/create_org`\n }, [props.authUrl])\n\n const getSetupSAMLPageUrl = useCallback(\n (orgId: string) => {\n return `${props.authUrl}/saml?id=${orgId}`\n },\n [props.authUrl]\n )\n\n const redirectTo = (url: string) => {\n window.location.href = url\n }\n\n const redirectToLoginPage = () => redirectTo(getLoginPageUrl())\n const redirectToSignupPage = () => redirectTo(getSignupPageUrl())\n const redirectToAccountPage = () => redirectTo(getAccountPageUrl())\n const redirectToOrgPage = (orgId?: string) => redirectTo(getOrgPageUrl(orgId))\n const redirectToCreateOrgPage = () => redirectTo(getCreateOrgPageUrl())\n const redirectToSetupSAMLPage = (orgId: string) => redirectTo(getSetupSAMLPageUrl(orgId))\n\n const refreshAuthInfo = async () => {\n const {user} = await apiGetUserInfo()\n dispatch({user})\n return user\n }\n\n const value = {\n loading: authState.loading,\n user: authState.user,\n logout,\n redirectToLoginPage,\n redirectToSignupPage,\n redirectToAccountPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n redirectToSetupSAMLPage,\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n refreshAuthInfo,\n }\n return <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>\n}\n\ntype UserInfoResponse = { user?: User }\n\nasync function apiGetUserInfo(): Promise<UserInfoResponse> {\n try {\n const userInfoResponse = await fetch(\"/api/auth/userinfo\", {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n })\n\n if (userInfoResponse.ok) {\n const userJson = await userInfoResponse.text()\n const user = User.fromJSON(userJson)\n return {user}\n } else if (userInfoResponse.status === 401) {\n return {user: undefined}\n } else {\n console.log(\"Failed to refresh token\", userInfoResponse)\n }\n } catch (e) {\n console.log(\"Failed to refresh token\", e)\n }\n throw new Error(\"Failed to refresh token\")\n}\n","export class User {\n public userId: string\n public orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo\n\n // Metadata about the user\n public email: string\n public firstName?: string\n public lastName?: string\n public username?: string\n\n // If you used our migration APIs to migrate this user from a different system,\n // this is their original ID from that system.\n public legacyUserId?: string\n public impersonatorUserId?: string\n\n constructor(\n userId: string,\n email: string,\n orgIdToOrgMemberInfo?: OrgIdToOrgMemberInfo,\n firstName?: string,\n lastName?: string,\n username?: string,\n legacyUserId?: string,\n impersonatorUserId?: string\n ) {\n this.userId = userId\n this.orgIdToOrgMemberInfo = orgIdToOrgMemberInfo\n\n this.email = email\n this.firstName = firstName\n this.lastName = lastName\n this.username = username\n\n this.legacyUserId = legacyUserId\n this.impersonatorUserId = impersonatorUserId\n }\n\n public getOrg(orgId: string): OrgMemberInfo | undefined {\n if (!this.orgIdToOrgMemberInfo) {\n return undefined\n }\n\n return this.orgIdToOrgMemberInfo[orgId]\n }\n\n public getOrgByName(orgName: string): OrgMemberInfo | undefined {\n if (!this.orgIdToOrgMemberInfo) {\n return undefined\n }\n\n const urlSafeOrgName = orgName.toLowerCase().replace(/ /g, \"-\")\n for (const orgId in this.orgIdToOrgMemberInfo) {\n const orgMemberInfo = this.orgIdToOrgMemberInfo[orgId]\n if (orgMemberInfo.urlSafeOrgName === urlSafeOrgName) {\n return orgMemberInfo\n }\n }\n\n return undefined\n }\n\n public getOrgs(): OrgMemberInfo[] {\n if (!this.orgIdToOrgMemberInfo) {\n return []\n }\n\n return Object.values(this.orgIdToOrgMemberInfo)\n }\n\n public isImpersonating(): boolean {\n return !!this.impersonatorUserId\n }\n\n public static fromJSON(json: string): User {\n const obj = JSON.parse(json)\n const orgIdToOrgMemberInfo: OrgIdToOrgMemberInfo = {}\n for (const orgId in obj.orgIdToOrgMemberInfo) {\n orgIdToOrgMemberInfo[orgId] = OrgMemberInfo.fromJSON(\n JSON.stringify(obj.orgIdToOrgMemberInfo[orgId])\n )\n }\n return new User(\n obj.userId,\n obj.email,\n orgIdToOrgMemberInfo,\n obj.firstName,\n obj.lastName,\n obj.username,\n obj.legacyUserId,\n obj.impersonatorUserId\n )\n }\n}\n\nexport type OrgIdToOrgMemberInfo = {\n [orgId: string]: OrgMemberInfo\n}\n\nexport class OrgMemberInfo {\n public orgId: string\n public orgName: string\n public orgMetadata: { [key: string]: any }\n public urlSafeOrgName: string\n\n private userAssignedRole: string\n private userInheritedRolesPlusCurrentRole: string[]\n private userPermissions: string[]\n\n constructor(\n orgId: string,\n orgName: string,\n orgMetadata: { [key: string]: any },\n urlSafeOrgName: string,\n userAssignedRole: string,\n userInheritedRolesPlusCurrentRole: string[],\n userPermissions: string[]\n ) {\n this.orgId = orgId\n this.orgName = orgName\n this.orgMetadata = orgMetadata\n this.urlSafeOrgName = urlSafeOrgName\n\n this.userAssignedRole = userAssignedRole\n this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole\n this.userPermissions = userPermissions\n }\n\n // validation methods\n\n public isRole(role: string): boolean {\n return this.userAssignedRole === role\n }\n\n public isAtLeastRole(role: string): boolean {\n return this.userInheritedRolesPlusCurrentRole.includes(role)\n }\n\n public hasPermission(permission: string): boolean {\n return this.userPermissions.includes(permission)\n }\n\n public hasAllPermissions(permissions: string[]): boolean {\n return permissions.every((permission) => this.hasPermission(permission))\n }\n\n public static fromJSON(json: string): OrgMemberInfo {\n const obj = JSON.parse(json)\n return new OrgMemberInfo(\n obj.orgId,\n obj.orgName,\n obj.orgMetadata,\n obj.urlSafeOrgName,\n obj.userAssignedRole,\n obj.userInheritedRolesPlusCurrentRole,\n obj.userPermissions\n )\n }\n\n // getters for the private fields\n\n get assignedRole(): string {\n return this.userAssignedRole\n }\n\n get inheritedRolesPlusCurrentRole(): string[] {\n return this.userInheritedRolesPlusCurrentRole\n }\n\n get permissions(): string[] {\n return this.userPermissions\n }\n}\n\n// These Internal types exist since the server returns snake case, but typescript/javascript\n// convention is camelCase.\nexport type InternalOrgMemberInfo = {\n org_id: string\n org_name: string\n org_metadata: { [key: string]: any }\n url_safe_org_name: string\n user_role: string\n inherited_user_roles_plus_current_role: string[]\n user_permissions: string[]\n}\nexport type InternalUser = {\n user_id: string\n org_id_to_org_member_info?: { [org_id: string]: InternalOrgMemberInfo }\n\n email: string\n first_name?: string\n last_name?: string\n username?: string\n\n // If you used our migration APIs to migrate this user from a different system, this is their original ID from that system.\n legacy_user_id?: string\n impersonatorUserId?: string\n}\n\nexport function toUser(snake_case: InternalUser): User {\n return new User(\n snake_case.user_id,\n snake_case.email,\n toOrgIdToOrgMemberInfo(snake_case.org_id_to_org_member_info),\n snake_case.first_name,\n snake_case.last_name,\n snake_case.username,\n snake_case.legacy_user_id,\n snake_case.impersonatorUserId\n )\n}\n\nexport function toOrgIdToOrgMemberInfo(snake_case?: {\n [org_id: string]: InternalOrgMemberInfo\n}): OrgIdToOrgMemberInfo | undefined {\n if (snake_case === undefined) {\n return undefined\n }\n const camelCase: OrgIdToOrgMemberInfo = {}\n\n for (const key of Object.keys(snake_case)) {\n const snakeCaseValue = snake_case[key]\n if (snakeCaseValue) {\n camelCase[key] = new OrgMemberInfo(\n snakeCaseValue.org_id,\n snakeCaseValue.org_name,\n snakeCaseValue.org_metadata,\n snakeCaseValue.url_safe_org_name,\n snakeCaseValue.user_role,\n snakeCaseValue.inherited_user_roles_plus_current_role,\n snakeCaseValue.user_permissions\n )\n }\n }\n\n return camelCase\n}\n","import {User} from \"../user\";\n\nexport const USER_INFO_KEY = \"__PROPEL_AUTH_USER_INFO\"\n\nexport function hasWindow(): boolean {\n return typeof window !== \"undefined\"\n}\n\nexport function saveUserToLocalStorage(user: User | undefined) {\n if (user) {\n localStorage.setItem(USER_INFO_KEY, JSON.stringify(user))\n } else {\n localStorage.setItem(USER_INFO_KEY, \"{}\")\n }\n}\n\nexport function doesLocalStorageMatch(newValue: string | null, user: User | undefined): boolean {\n if (!newValue) {\n return false\n } else if (!user) {\n return newValue === \"{}\"\n }\n\n const parsed = JSON.parse(newValue)\n if (!parsed) {\n return false\n }\n\n return isEqual(parsed, user)\n}\n\n\nexport function isEqual(a: any, b: any): boolean {\n if (typeof a !== typeof b) {\n return false\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false\n }\n\n if (Array.isArray(a)) {\n const aArray = a as any[]\n const bArray = b as any[]\n if (aArray.length !== bArray.length) {\n return false\n }\n\n for (let i = 0; i < aArray.length; i++) {\n if (!isEqual(aArray[i], bArray[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (typeof a === \"object\") {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) {\n return false\n }\n\n for (const key of aKeys) {\n if (!isEqual(a[key], b[key])) {\n return false\n }\n }\n\n return true\n } else {\n return a === b\n }\n}","'use client'\n\nimport {useContext} from \"react\"\nimport {User} from \"../user\"\nimport {AuthContext} from \"./AuthProvider\"\n\nexport type UseUserLoading = {\n loading: true\n isLoggedIn: never\n user: never\n}\n\nexport type UseUserLoggedIn = {\n loading: false\n isLoggedIn: true\n user: User\n}\n\nexport type UseUserNotLoggedIn = {\n loading: false\n isLoggedIn: false\n user: undefined\n}\n\nexport type UseUser = UseUserLoading | UseUserLoggedIn | UseUserNotLoggedIn\n\nexport function useUser(): UseUser {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useUser must be used within an AuthProvider\")\n }\n\n const {loading, user} = context\n if (loading) {\n return {\n loading: true,\n isLoggedIn: undefined as never,\n user: undefined as never,\n }\n } else if (user) {\n return {\n loading: false,\n isLoggedIn: true,\n user,\n }\n } else {\n return {\n loading: false,\n isLoggedIn: false,\n user: undefined,\n }\n }\n}","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useHostedPageUrls() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useHostedPageUrls must be used within an AuthProvider\")\n }\n const {\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n } = context\n return {\n getLoginPageUrl,\n getSignupPageUrl,\n getAccountPageUrl,\n getOrgPageUrl,\n getCreateOrgPageUrl,\n getSetupSAMLPageUrl,\n }\n}\n","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useLogoutFunction() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useLogoutFunction must be used within an AuthProvider\")\n }\n const { logout } = context\n return logout\n}\n","import React, { useContext, useEffect } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useRedirectFunctions() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useRedirectFunctions must be used within an AuthProvider\")\n }\n const {\n redirectToAccountPage,\n redirectToSignupPage,\n redirectToLoginPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n } = context\n return {\n redirectToSignupPage,\n redirectToLoginPage,\n redirectToAccountPage,\n redirectToOrgPage,\n redirectToCreateOrgPage,\n }\n}\n\nexport interface RedirectProps {\n children?: React.ReactNode\n}\n\nexport function RedirectToSignup({ children }: RedirectProps) {\n const { redirectToSignupPage } = useRedirectFunctions()\n\n useEffect(() => {\n redirectToSignupPage()\n }, [])\n\n return <>{children}</>\n}\n\nexport function RedirectToLogin({ children }: RedirectProps) {\n const { redirectToLoginPage } = useRedirectFunctions()\n useEffect(() => {\n redirectToLoginPage()\n }, [])\n return <>{children}</>\n}\n","import { useContext } from \"react\"\nimport { AuthContext } from \"./AuthProvider\"\n\nexport function useRefreshAuth() {\n const context = useContext(AuthContext)\n if (context === undefined) {\n throw new Error(\"useRefreshAuth must be used within an AuthProvider\")\n }\n const { refreshAuthInfo } = context\n return refreshAuthInfo\n}\n"],"mappings":"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","names":["React","refreshAuthInfo","import_react","import_react","import_react","import_react","React","import_react"]}