@workos-inc/widgets 1.1.5 → 1.2.0
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/dist/cjs/lib/organization-switcher.d.ts +10 -1
- package/dist/cjs/lib/organization-switcher.d.ts.map +1 -1
- package/dist/cjs/lib/organization-switcher.js +31 -3
- package/dist/cjs/lib/organization-switcher.js.map +1 -1
- package/dist/cjs/workos-widgets.client.d.ts +6 -0
- package/dist/cjs/workos-widgets.client.d.ts.map +1 -1
- package/dist/cjs/workos-widgets.client.js +23 -3
- package/dist/cjs/workos-widgets.client.js.map +1 -1
- package/dist/esm/lib/organization-switcher.d.ts +10 -1
- package/dist/esm/lib/organization-switcher.d.ts.map +1 -1
- package/dist/esm/lib/organization-switcher.js +31 -3
- package/dist/esm/lib/organization-switcher.js.map +1 -1
- package/dist/esm/workos-widgets.client.d.ts +6 -0
- package/dist/esm/workos-widgets.client.d.ts.map +1 -1
- package/dist/esm/workos-widgets.client.js +25 -5
- package/dist/esm/workos-widgets.client.js.map +1 -1
- package/package.json +8 -9
- package/src/api/api-provider.tsx +0 -158
- package/src/api/constants.ts +0 -1
- package/src/api/endpoint.ts +0 -3097
- package/src/api/errors.ts +0 -48
- package/src/api/index.ts +0 -2
- package/src/api/utils.ts +0 -42
- package/src/api/widgets-api-client.ts +0 -87
- package/src/card-list.tsx +0 -26
- package/src/index.ts +0 -9
- package/src/lib/add-mfa-dialog.tsx +0 -379
- package/src/lib/api/config.ts +0 -9
- package/src/lib/api/user.ts +0 -98
- package/src/lib/change-password-dialog.tsx +0 -290
- package/src/lib/constants.ts +0 -3
- package/src/lib/copy-button.tsx +0 -53
- package/src/lib/delete-user-dialog.tsx +0 -110
- package/src/lib/edit-user-profile-dialog.tsx +0 -181
- package/src/lib/edit-user-role-dialog.tsx +0 -178
- package/src/lib/elements.tsx +0 -428
- package/src/lib/elevated-access.tsx +0 -261
- package/src/lib/error-boundary.tsx +0 -166
- package/src/lib/errors.ts +0 -49
- package/src/lib/generic-error.tsx +0 -70
- package/src/lib/icon-panel.tsx +0 -26
- package/src/lib/icons.tsx +0 -21
- package/src/lib/invite-user-dialog.tsx +0 -327
- package/src/lib/logout-all-sessions-dialog.tsx +0 -82
- package/src/lib/logout-dialog.tsx +0 -85
- package/src/lib/marker.tsx +0 -39
- package/src/lib/oauth-icons.tsx +0 -138
- package/src/lib/organization-switcher.tsx +0 -156
- package/src/lib/otp-input.tsx +0 -276
- package/src/lib/resend-invite-dialog.tsx +0 -145
- package/src/lib/reset-mfa-dialog.tsx +0 -104
- package/src/lib/revoke-invite-dialog.tsx +0 -111
- package/src/lib/save-button.tsx +0 -113
- package/src/lib/search-provider.tsx +0 -51
- package/src/lib/set-password-dialog.tsx +0 -204
- package/src/lib/use-dialog-close.tsx +0 -19
- package/src/lib/use-is-hydrated.ts +0 -13
- package/src/lib/use-layout-effect.ts +0 -6
- package/src/lib/use-security-settings.tsx +0 -49
- package/src/lib/user-actions-dropdown.tsx +0 -157
- package/src/lib/user-profile.tsx +0 -227
- package/src/lib/user-security.tsx +0 -187
- package/src/lib/user-sessions.tsx +0 -204
- package/src/lib/users-filter.tsx +0 -62
- package/src/lib/users-management-context.tsx +0 -74
- package/src/lib/users-management-state.ts +0 -165
- package/src/lib/users-management.tsx +0 -594
- package/src/lib/users-search.tsx +0 -73
- package/src/lib/utils.ts +0 -131
- package/src/lib/widgets-context.ts +0 -29
- package/src/organization-switcher.client.tsx +0 -81
- package/src/user-profile.client.tsx +0 -55
- package/src/user-security.client.tsx +0 -55
- package/src/user-sessions.client.tsx +0 -100
- package/src/users-management.client.tsx +0 -73
- package/src/workos-widgets.client.tsx +0 -75
- /package/{src → dist/css}/base.css +0 -0
- /package/{src → dist/css}/lib/card-list.css +0 -0
- /package/{src → dist/css}/lib/marker.css +0 -0
- /package/{src → dist/css}/lib/save-button.css +0 -0
- /package/{src → dist/css}/styles.css +0 -0
- /package/{src → dist/css}/users-management.css +0 -0
|
@@ -7,11 +7,20 @@ export type OrganizationSwitcherPassthroughProps = {
|
|
|
7
7
|
variant?: OrganizationSwitcherVariant;
|
|
8
8
|
organizationLabel?: string | null;
|
|
9
9
|
children?: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Choose where to truncate organization name in the trigger and dropdown
|
|
12
|
+
* items.
|
|
13
|
+
*
|
|
14
|
+
* - `right`: Truncate the right side of the organization name
|
|
15
|
+
* - `middle`: Truncate the middle of the organization name, trying to keep
|
|
16
|
+
* words whole
|
|
17
|
+
*/
|
|
18
|
+
truncateBehavior?: "right" | "middle";
|
|
10
19
|
};
|
|
11
20
|
export interface OrganizationSwitcherProps extends OrganizationSwitcherPassthroughProps {
|
|
12
21
|
organizations: OrganizationInfo[];
|
|
13
22
|
}
|
|
14
|
-
export declare const OrganizationSwitcher: ({ organizations, switchToOrganization, variant, organizationLabel, children, }: OrganizationSwitcherProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
23
|
+
export declare const OrganizationSwitcher: ({ organizations, switchToOrganization, variant, organizationLabel, truncateBehavior, children, }: OrganizationSwitcherProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
15
24
|
export declare function OrganizationSwitcherLoading({ variant, organizations, }: {
|
|
16
25
|
variant?: OrganizationSwitcherVariant;
|
|
17
26
|
organizations: OrganizationInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-switcher.d.ts","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE9E,KAAK,2BAA2B,GAAG,OAAO,GAAG,SAAS,CAAC;AAGvD,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,CAAC,EACrB,cAAc,GACf,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,IAAI,CAAC;IAEX,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"organization-switcher.d.ts","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE9E,KAAK,2BAA2B,GAAG,OAAO,GAAG,SAAS,CAAC;AAGvD,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,CAAC,EACrB,cAAc,GACf,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,IAAI,CAAC;IAEX,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,yBACf,SAAQ,oCAAoC;IAC5C,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,oBAAoB,qGAO9B,yBAAyB,mDA8F3B,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EAC1C,OAAmB,EACnB,aAAa,GACd,EAAE;IACD,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC,2CAgBA;AAED,UAAU,8BAA8B;IACtC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;CAC5C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,8BAA8B,QAG1E"}
|
|
@@ -7,17 +7,17 @@ exports.OrganizationSwitcherError = OrganizationSwitcherError;
|
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const react_icons_1 = require("@radix-ui/react-icons");
|
|
9
9
|
const themes_1 = require("@radix-ui/themes");
|
|
10
|
-
const OrganizationSwitcher = ({ organizations, switchToOrganization, variant = "outline", organizationLabel = "Organizations", children, }) => {
|
|
10
|
+
const OrganizationSwitcher = ({ organizations, switchToOrganization, variant = "outline", organizationLabel = "Organizations", truncateBehavior = "right", children, }) => {
|
|
11
11
|
const currentOrganization = organizations.find((organization) => organization.current);
|
|
12
12
|
// Possible if the user has no organizations - we should figure out what to do in this case
|
|
13
13
|
if (!currentOrganization) {
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
|
-
return ((0, jsx_runtime_1.jsxs)(themes_1.DropdownMenu.Root, { children: [(0, jsx_runtime_1.jsx)(themes_1.DropdownMenu.Trigger, { children: (0, jsx_runtime_1.jsx)(themes_1.Button, { color: "gray", variant: variant, className: "OrganizationSwitcherTrigger", children: (0, jsx_runtime_1.jsxs)(themes_1.Flex, { align: "center", justify: "between", gap: "2", flexGrow: "1", children: [(0, jsx_runtime_1.jsx)(
|
|
16
|
+
return ((0, jsx_runtime_1.jsxs)(themes_1.DropdownMenu.Root, { children: [(0, jsx_runtime_1.jsx)(themes_1.DropdownMenu.Trigger, { children: (0, jsx_runtime_1.jsx)(themes_1.Button, { color: "gray", variant: variant, className: "OrganizationSwitcherTrigger", children: (0, jsx_runtime_1.jsxs)(themes_1.Flex, { align: "center", justify: "between", gap: "2", flexGrow: "1", overflow: "hidden", minWidth: "0", children: [(0, jsx_runtime_1.jsx)(TruncatedOrganizationName, { organizationName: currentOrganization.name, truncateBehavior: truncateBehavior }), (0, jsx_runtime_1.jsx)(themes_1.Flex, { asChild: true, flexShrink: "0", children: (0, jsx_runtime_1.jsx)(themes_1.DropdownMenu.TriggerIcon, {}) })] }) }) }), (0, jsx_runtime_1.jsxs)(themes_1.DropdownMenu.Content, { children: [(0, jsx_runtime_1.jsxs)(themes_1.DropdownMenu.Group, { children: [organizationLabel ? ((0, jsx_runtime_1.jsx)(themes_1.DropdownMenu.Label, { children: (0, jsx_runtime_1.jsx)(themes_1.Text, { children: organizationLabel }) })) : null, organizations.map((organization) => ((0, jsx_runtime_1.jsx)(themes_1.Flex, { asChild: true, pr: "2", maxWidth: "280px", minWidth: "180px", children: (0, jsx_runtime_1.jsx)(themes_1.DropdownMenu.Item, { onClick: () => {
|
|
17
17
|
if (organization.id !== currentOrganization.id) {
|
|
18
18
|
switchToOrganization({ organizationId: organization.id });
|
|
19
19
|
}
|
|
20
|
-
}, children: (0, jsx_runtime_1.jsxs)(themes_1.Flex, { justify: "between", align: "center", gap: "4", flexGrow: "1", overflow: "hidden", children: [(0, jsx_runtime_1.
|
|
20
|
+
}, children: (0, jsx_runtime_1.jsxs)(themes_1.Flex, { justify: "between", align: "center", gap: "4", flexGrow: "1", overflow: "hidden", children: [(0, jsx_runtime_1.jsx)(TruncatedOrganizationName, { organizationName: organization.name, truncateBehavior: truncateBehavior }), organization.current && ((0, jsx_runtime_1.jsx)(themes_1.VisuallyHidden, { children: " (current)" })), (0, jsx_runtime_1.jsx)(themes_1.Flex, { "aria-hidden": true, align: "center", justify: "center", flexShrink: "0", children: organization.current ? ((0, jsx_runtime_1.jsx)(react_icons_1.CheckIcon, { width: "18px", height: "18px" })) : (
|
|
21
21
|
// make the extra space for
|
|
22
22
|
(0, jsx_runtime_1.jsx)(themes_1.Box, { width: "18px", height: "18px" })) })] }) }) }, organization.id)))] }), children] })] }));
|
|
23
23
|
};
|
|
@@ -32,4 +32,32 @@ function OrganizationSwitcherError(_) {
|
|
|
32
32
|
// TODO: consider other error state options
|
|
33
33
|
return null;
|
|
34
34
|
}
|
|
35
|
+
const MAX_TRUNCATED_SUFFIX_LENGTH = 10;
|
|
36
|
+
const MIN_TRUNCATED_SUFFIX_LENGTH = 3;
|
|
37
|
+
const WHITE_SPACE_REGEX = /\s/;
|
|
38
|
+
const getSplitPosition = (organizationName) => {
|
|
39
|
+
if (organizationName.length <= MAX_TRUNCATED_SUFFIX_LENGTH) {
|
|
40
|
+
return organizationName.length;
|
|
41
|
+
}
|
|
42
|
+
for (let i = organizationName.length - MAX_TRUNCATED_SUFFIX_LENGTH; i < organizationName.length - MIN_TRUNCATED_SUFFIX_LENGTH; i++) {
|
|
43
|
+
if (WHITE_SPACE_REGEX.test(organizationName[i - 1])) {
|
|
44
|
+
return i;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return organizationName.length - MAX_TRUNCATED_SUFFIX_LENGTH;
|
|
48
|
+
};
|
|
49
|
+
const splitOrganizationName = (organizationName) => {
|
|
50
|
+
const splitPosition = getSplitPosition(organizationName);
|
|
51
|
+
return [
|
|
52
|
+
organizationName.slice(0, splitPosition),
|
|
53
|
+
organizationName.slice(splitPosition),
|
|
54
|
+
];
|
|
55
|
+
};
|
|
56
|
+
const TruncatedOrganizationName = ({ organizationName, truncateBehavior, }) => {
|
|
57
|
+
if (truncateBehavior === "right") {
|
|
58
|
+
return (0, jsx_runtime_1.jsx)(themes_1.Text, { truncate: true, children: organizationName });
|
|
59
|
+
}
|
|
60
|
+
const [organizationNameLeft, organizationNameRight] = splitOrganizationName(organizationName);
|
|
61
|
+
return ((0, jsx_runtime_1.jsxs)(themes_1.Flex, { overflow: "hidden", children: [(0, jsx_runtime_1.jsx)(themes_1.VisuallyHidden, { children: (0, jsx_runtime_1.jsx)(themes_1.Text, { children: organizationName }) }), (0, jsx_runtime_1.jsx)(themes_1.Text, { "aria-hidden": true, truncate: true, style: { whiteSpace: "pre" }, children: organizationNameLeft }), (0, jsx_runtime_1.jsx)(themes_1.Text, { "aria-hidden": true, children: organizationNameRight })] }));
|
|
62
|
+
};
|
|
35
63
|
//# sourceMappingURL=organization-switcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-switcher.js","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;
|
|
1
|
+
{"version":3,"file":"organization-switcher.js","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GetPropDefTypes, themePropDefs } from "@radix-ui/themes/props";
|
|
2
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
2
3
|
import * as React from "react";
|
|
3
4
|
import type { Elements } from "./lib/elements";
|
|
4
5
|
export interface WorkOsWidgetsProps {
|
|
@@ -12,6 +13,11 @@ export interface WorkOsWidgetsProps {
|
|
|
12
13
|
apiHostname?: string;
|
|
13
14
|
port?: number | null;
|
|
14
15
|
https?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Optional query client for users who are already using Tanstack Query. If
|
|
18
|
+
* not provided, a new query client will be created and mounted internally.
|
|
19
|
+
*/
|
|
20
|
+
queryClient?: QueryClient;
|
|
15
21
|
}
|
|
16
22
|
export declare const WorkOsWidgets: React.FC<WorkOsWidgetsProps>;
|
|
17
23
|
//# sourceMappingURL=workos-widgets.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workos-widgets.client.d.ts","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"workos-widgets.client.d.ts","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACL,WAAW,EAGZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,aAAa,CAAC,EAAE,SAAS,CAAC,GAAG;QAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAgDtD,CAAC"}
|
|
@@ -36,8 +36,8 @@ const React = __importStar(require("react"));
|
|
|
36
36
|
const utils_1 = require("./lib/utils");
|
|
37
37
|
const config_1 = require("./lib/api/config");
|
|
38
38
|
const widgets_context_1 = require("./lib/widgets-context");
|
|
39
|
-
|
|
40
|
-
const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, ...radixThemesProps } = {}, style = {}, children, apiHostname = config_1.DEFAULT_API_HOSTNAME, port = null, https = true, }) => {
|
|
39
|
+
let queryClientInternal;
|
|
40
|
+
const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, ...radixThemesProps } = {}, style = {}, children, apiHostname = config_1.DEFAULT_API_HOSTNAME, port = null, https = true, queryClient, }) => {
|
|
41
41
|
const customStyle = (fontFamily
|
|
42
42
|
? {
|
|
43
43
|
"--default-font-family": fontFamily,
|
|
@@ -54,7 +54,27 @@ const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, ...radix
|
|
|
54
54
|
return `https://${config_1.DEFAULT_API_HOSTNAME}`;
|
|
55
55
|
}
|
|
56
56
|
}, [apiHostname, https, port]);
|
|
57
|
-
return ((0, jsx_runtime_1.jsx)(
|
|
57
|
+
return ((0, jsx_runtime_1.jsx)(QueryClientProviderImpl, { client: queryClient, children: (0, jsx_runtime_1.jsx)(themes_1.Theme, { ...radixThemesProps, style: customStyle, className: (0, clsx_1.default)((0, utils_1.namespaceClassNames)("root"), className), children: (0, jsx_runtime_1.jsx)(widgets_context_1.WidgetsContext.Provider, { value: { elements, apiBaseUrl }, children: children }) }) }));
|
|
58
58
|
};
|
|
59
59
|
exports.WorkOsWidgets = WorkOsWidgets;
|
|
60
|
+
const QueryClientProviderImpl = ({ client: providedClient, children, }) => {
|
|
61
|
+
let queryClient;
|
|
62
|
+
if (providedClient) {
|
|
63
|
+
queryClient = providedClient;
|
|
64
|
+
}
|
|
65
|
+
else if (queryClientInternal) {
|
|
66
|
+
queryClient = queryClientInternal;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
queryClientInternal = new react_query_1.QueryClient();
|
|
70
|
+
queryClient = queryClientInternal;
|
|
71
|
+
}
|
|
72
|
+
const client = (0, react_query_1.useQueryClient)(queryClient);
|
|
73
|
+
if (Object.is(client, providedClient)) {
|
|
74
|
+
// No need for a new context provider if the user provided the client to
|
|
75
|
+
// their own provider, which has already mounted the client.
|
|
76
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
|
|
77
|
+
}
|
|
78
|
+
return (0, jsx_runtime_1.jsx)(react_query_1.QueryClientProvider, { client: client, children: children });
|
|
79
|
+
};
|
|
60
80
|
//# sourceMappingURL=workos-widgets.client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workos-widgets.client.js","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,6CAAwD;AAExD,
|
|
1
|
+
{"version":3,"file":"workos-widgets.client.js","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,6CAAwD;AAExD,uDAI+B;AAC/B,gDAAsB;AACtB,6CAA+B;AAC/B,uCAAkD;AAClD,6CAAwD;AAExD,2DAAuD;AAEvD,IAAI,mBAA4C,CAAC;AAoB1C,MAAM,aAAa,GAAiC,CAAC,EAC1D,QAAQ,GAAG,EAAE,EACb,SAAS,EACT,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,GAAG,EAAE,EAC/C,KAAK,GAAG,EAAE,EACV,QAAQ,EACR,WAAW,GAAG,6BAAoB,EAClC,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,IAAI,EACZ,WAAW,GACZ,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,CAClB,UAAU;QACR,CAAC,CAAC;YACE,uBAAuB,EAAE,UAAU;YACnC,GAAG,KAAK;SACT;QACH,CAAC,CAAC,KAAK,CACa,CAAC;IAEzB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,GAAG,EACH,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACxE,CAAC;YACF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACX,8HAA8H,CAC/H,CAAC;YACF,OAAO,WAAW,6BAAoB,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,OAAO,CACL,uBAAC,uBAAuB,IAAC,MAAM,EAAE,WAAW,YAC1C,uBAAC,cAAW,OACN,gBAAgB,EACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,IAAA,cAAE,EAAC,IAAA,2BAAmB,EAAC,MAAM,CAAC,EAAE,SAAS,CAAC,YAErD,uBAAC,gCAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,YACrD,QAAQ,GACe,GACd,GACU,CAC3B,CAAC;AACJ,CAAC,CAAC;AAhDW,QAAA,aAAa,iBAgDxB;AAEF,MAAM,uBAAuB,GAAG,CAAC,EAC/B,MAAM,EAAE,cAAc,EACtB,QAAQ,GAIT,EAAE,EAAE;IACH,IAAI,WAAwB,CAAC;IAC7B,IAAI,cAAc,EAAE,CAAC;QACnB,WAAW,GAAG,cAAc,CAAC;IAC/B,CAAC;SAAM,IAAI,mBAAmB,EAAE,CAAC;QAC/B,WAAW,GAAG,mBAAmB,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,mBAAmB,GAAG,IAAI,yBAAW,EAAE,CAAC;QACxC,WAAW,GAAG,mBAAmB,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,4BAAc,EAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;QACtC,wEAAwE;QACxE,4DAA4D;QAC5D,OAAO,2DAAG,QAAQ,GAAI,CAAC;IACzB,CAAC;IAED,OAAO,uBAAC,iCAAmB,IAAC,MAAM,EAAE,MAAM,YAAG,QAAQ,GAAuB,CAAC;AAC/E,CAAC,CAAC"}
|
|
@@ -7,11 +7,20 @@ export type OrganizationSwitcherPassthroughProps = {
|
|
|
7
7
|
variant?: OrganizationSwitcherVariant;
|
|
8
8
|
organizationLabel?: string | null;
|
|
9
9
|
children?: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Choose where to truncate organization name in the trigger and dropdown
|
|
12
|
+
* items.
|
|
13
|
+
*
|
|
14
|
+
* - `right`: Truncate the right side of the organization name
|
|
15
|
+
* - `middle`: Truncate the middle of the organization name, trying to keep
|
|
16
|
+
* words whole
|
|
17
|
+
*/
|
|
18
|
+
truncateBehavior?: "right" | "middle";
|
|
10
19
|
};
|
|
11
20
|
export interface OrganizationSwitcherProps extends OrganizationSwitcherPassthroughProps {
|
|
12
21
|
organizations: OrganizationInfo[];
|
|
13
22
|
}
|
|
14
|
-
export declare const OrganizationSwitcher: ({ organizations, switchToOrganization, variant, organizationLabel, children, }: OrganizationSwitcherProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
23
|
+
export declare const OrganizationSwitcher: ({ organizations, switchToOrganization, variant, organizationLabel, truncateBehavior, children, }: OrganizationSwitcherProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
15
24
|
export declare function OrganizationSwitcherLoading({ variant, organizations, }: {
|
|
16
25
|
variant?: OrganizationSwitcherVariant;
|
|
17
26
|
organizations: OrganizationInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-switcher.d.ts","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE9E,KAAK,2BAA2B,GAAG,OAAO,GAAG,SAAS,CAAC;AAGvD,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,CAAC,EACrB,cAAc,GACf,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,IAAI,CAAC;IAEX,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"organization-switcher.d.ts","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE9E,KAAK,2BAA2B,GAAG,OAAO,GAAG,SAAS,CAAC;AAGvD,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,CAAC,EACrB,cAAc,GACf,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;KACxB,KAAK,IAAI,CAAC;IAEX,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,yBACf,SAAQ,oCAAoC;IAC5C,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,oBAAoB,qGAO9B,yBAAyB,mDA8F3B,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EAC1C,OAAmB,EACnB,aAAa,GACd,EAAE;IACD,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC,2CAgBA;AAED,UAAU,8BAA8B;IACtC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;CAC5C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,8BAA8B,QAG1E"}
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { CheckIcon } from "@radix-ui/react-icons";
|
|
4
4
|
import { Box, Button, ChevronDownIcon, DropdownMenu, Flex, Skeleton, Text, VisuallyHidden, } from "@radix-ui/themes";
|
|
5
|
-
export const OrganizationSwitcher = ({ organizations, switchToOrganization, variant = "outline", organizationLabel = "Organizations", children, }) => {
|
|
5
|
+
export const OrganizationSwitcher = ({ organizations, switchToOrganization, variant = "outline", organizationLabel = "Organizations", truncateBehavior = "right", children, }) => {
|
|
6
6
|
const currentOrganization = organizations.find((organization) => organization.current);
|
|
7
7
|
// Possible if the user has no organizations - we should figure out what to do in this case
|
|
8
8
|
if (!currentOrganization) {
|
|
9
9
|
return null;
|
|
10
10
|
}
|
|
11
|
-
return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { children: _jsx(Button, { color: "gray", variant: variant, className: "OrganizationSwitcherTrigger", children: _jsxs(Flex, { align: "center", justify: "between", gap: "2", flexGrow: "1", children: [_jsx(
|
|
11
|
+
return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { children: _jsx(Button, { color: "gray", variant: variant, className: "OrganizationSwitcherTrigger", children: _jsxs(Flex, { align: "center", justify: "between", gap: "2", flexGrow: "1", overflow: "hidden", minWidth: "0", children: [_jsx(TruncatedOrganizationName, { organizationName: currentOrganization.name, truncateBehavior: truncateBehavior }), _jsx(Flex, { asChild: true, flexShrink: "0", children: _jsx(DropdownMenu.TriggerIcon, {}) })] }) }) }), _jsxs(DropdownMenu.Content, { children: [_jsxs(DropdownMenu.Group, { children: [organizationLabel ? (_jsx(DropdownMenu.Label, { children: _jsx(Text, { children: organizationLabel }) })) : null, organizations.map((organization) => (_jsx(Flex, { asChild: true, pr: "2", maxWidth: "280px", minWidth: "180px", children: _jsx(DropdownMenu.Item, { onClick: () => {
|
|
12
12
|
if (organization.id !== currentOrganization.id) {
|
|
13
13
|
switchToOrganization({ organizationId: organization.id });
|
|
14
14
|
}
|
|
15
|
-
}, children: _jsxs(Flex, { justify: "between", align: "center", gap: "4", flexGrow: "1", overflow: "hidden", children: [
|
|
15
|
+
}, children: _jsxs(Flex, { justify: "between", align: "center", gap: "4", flexGrow: "1", overflow: "hidden", children: [_jsx(TruncatedOrganizationName, { organizationName: organization.name, truncateBehavior: truncateBehavior }), organization.current && (_jsx(VisuallyHidden, { children: " (current)" })), _jsx(Flex, { "aria-hidden": true, align: "center", justify: "center", flexShrink: "0", children: organization.current ? (_jsx(CheckIcon, { width: "18px", height: "18px" })) : (
|
|
16
16
|
// make the extra space for
|
|
17
17
|
_jsx(Box, { width: "18px", height: "18px" })) })] }) }) }, organization.id)))] }), children] })] }));
|
|
18
18
|
};
|
|
@@ -26,4 +26,32 @@ export function OrganizationSwitcherError(_) {
|
|
|
26
26
|
// TODO: consider other error state options
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
|
+
const MAX_TRUNCATED_SUFFIX_LENGTH = 10;
|
|
30
|
+
const MIN_TRUNCATED_SUFFIX_LENGTH = 3;
|
|
31
|
+
const WHITE_SPACE_REGEX = /\s/;
|
|
32
|
+
const getSplitPosition = (organizationName) => {
|
|
33
|
+
if (organizationName.length <= MAX_TRUNCATED_SUFFIX_LENGTH) {
|
|
34
|
+
return organizationName.length;
|
|
35
|
+
}
|
|
36
|
+
for (let i = organizationName.length - MAX_TRUNCATED_SUFFIX_LENGTH; i < organizationName.length - MIN_TRUNCATED_SUFFIX_LENGTH; i++) {
|
|
37
|
+
if (WHITE_SPACE_REGEX.test(organizationName[i - 1])) {
|
|
38
|
+
return i;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return organizationName.length - MAX_TRUNCATED_SUFFIX_LENGTH;
|
|
42
|
+
};
|
|
43
|
+
const splitOrganizationName = (organizationName) => {
|
|
44
|
+
const splitPosition = getSplitPosition(organizationName);
|
|
45
|
+
return [
|
|
46
|
+
organizationName.slice(0, splitPosition),
|
|
47
|
+
organizationName.slice(splitPosition),
|
|
48
|
+
];
|
|
49
|
+
};
|
|
50
|
+
const TruncatedOrganizationName = ({ organizationName, truncateBehavior, }) => {
|
|
51
|
+
if (truncateBehavior === "right") {
|
|
52
|
+
return _jsx(Text, { truncate: true, children: organizationName });
|
|
53
|
+
}
|
|
54
|
+
const [organizationNameLeft, organizationNameRight] = splitOrganizationName(organizationName);
|
|
55
|
+
return (_jsxs(Flex, { overflow: "hidden", children: [_jsx(VisuallyHidden, { children: _jsx(Text, { children: organizationName }) }), _jsx(Text, { "aria-hidden": true, truncate: true, style: { whiteSpace: "pre" }, children: organizationNameLeft }), _jsx(Text, { "aria-hidden": true, children: organizationNameRight })] }));
|
|
56
|
+
};
|
|
29
57
|
//# sourceMappingURL=organization-switcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-switcher.js","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EACL,GAAG,EACH,MAAM,EACN,eAAe,EACf,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,cAAc,GACf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"organization-switcher.js","sourceRoot":"","sources":["../../../src/lib/organization-switcher.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GetPropDefTypes, themePropDefs } from "@radix-ui/themes/props";
|
|
2
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
2
3
|
import * as React from "react";
|
|
3
4
|
import type { Elements } from "./lib/elements";
|
|
4
5
|
export interface WorkOsWidgetsProps {
|
|
@@ -12,6 +13,11 @@ export interface WorkOsWidgetsProps {
|
|
|
12
13
|
apiHostname?: string;
|
|
13
14
|
port?: number | null;
|
|
14
15
|
https?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Optional query client for users who are already using Tanstack Query. If
|
|
18
|
+
* not provided, a new query client will be created and mounted internally.
|
|
19
|
+
*/
|
|
20
|
+
queryClient?: QueryClient;
|
|
15
21
|
}
|
|
16
22
|
export declare const WorkOsWidgets: React.FC<WorkOsWidgetsProps>;
|
|
17
23
|
//# sourceMappingURL=workos-widgets.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workos-widgets.client.d.ts","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"workos-widgets.client.d.ts","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACL,WAAW,EAGZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,aAAa,CAAC,EAAE,SAAS,CAAC,GAAG;QAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAgDtD,CAAC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { Theme as RadixThemes } from "@radix-ui/themes";
|
|
4
|
-
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
4
|
+
import { QueryClient, QueryClientProvider, useQueryClient, } from "@tanstack/react-query";
|
|
5
5
|
import cx from "clsx";
|
|
6
6
|
import * as React from "react";
|
|
7
7
|
import { namespaceClassNames } from "./lib/utils";
|
|
8
8
|
import { DEFAULT_API_HOSTNAME } from "./lib/api/config";
|
|
9
9
|
import { WidgetsContext } from "./lib/widgets-context";
|
|
10
|
-
|
|
11
|
-
export const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, ...radixThemesProps } = {}, style = {}, children, apiHostname = DEFAULT_API_HOSTNAME, port = null, https = true, }) => {
|
|
10
|
+
let queryClientInternal;
|
|
11
|
+
export const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, ...radixThemesProps } = {}, style = {}, children, apiHostname = DEFAULT_API_HOSTNAME, port = null, https = true, queryClient, }) => {
|
|
12
12
|
const customStyle = (fontFamily
|
|
13
13
|
? {
|
|
14
14
|
"--default-font-family": fontFamily,
|
|
@@ -25,6 +25,26 @@ export const WorkOsWidgets = ({ elements = {}, className, theme: { fontFamily, .
|
|
|
25
25
|
return `https://${DEFAULT_API_HOSTNAME}`;
|
|
26
26
|
}
|
|
27
27
|
}, [apiHostname, https, port]);
|
|
28
|
-
return (_jsx(
|
|
28
|
+
return (_jsx(QueryClientProviderImpl, { client: queryClient, children: _jsx(RadixThemes, { ...radixThemesProps, style: customStyle, className: cx(namespaceClassNames("root"), className), children: _jsx(WidgetsContext.Provider, { value: { elements, apiBaseUrl }, children: children }) }) }));
|
|
29
|
+
};
|
|
30
|
+
const QueryClientProviderImpl = ({ client: providedClient, children, }) => {
|
|
31
|
+
let queryClient;
|
|
32
|
+
if (providedClient) {
|
|
33
|
+
queryClient = providedClient;
|
|
34
|
+
}
|
|
35
|
+
else if (queryClientInternal) {
|
|
36
|
+
queryClient = queryClientInternal;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
queryClientInternal = new QueryClient();
|
|
40
|
+
queryClient = queryClientInternal;
|
|
41
|
+
}
|
|
42
|
+
const client = useQueryClient(queryClient);
|
|
43
|
+
if (Object.is(client, providedClient)) {
|
|
44
|
+
// No need for a new context provider if the user provided the client to
|
|
45
|
+
// their own provider, which has already mounted the client.
|
|
46
|
+
return _jsx(_Fragment, { children: children });
|
|
47
|
+
}
|
|
48
|
+
return _jsx(QueryClientProvider, { client: client, children: children });
|
|
29
49
|
};
|
|
30
50
|
//# sourceMappingURL=workos-widgets.client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workos-widgets.client.js","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,
|
|
1
|
+
{"version":3,"file":"workos-widgets.client.js","sourceRoot":"","sources":["../../src/workos-widgets.client.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workos-inc/widgets",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -24,14 +24,10 @@
|
|
|
24
24
|
"default": "./dist/cjs/*.client.js"
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
|
-
"./*.css":
|
|
28
|
-
"import": "./src/*.css",
|
|
29
|
-
"require": "./src/*.css"
|
|
30
|
-
}
|
|
27
|
+
"./*.css": "./dist/css/*.css"
|
|
31
28
|
},
|
|
32
29
|
"files": [
|
|
33
30
|
"dist",
|
|
34
|
-
"src",
|
|
35
31
|
"CHANGELOG.md",
|
|
36
32
|
"LICENSE",
|
|
37
33
|
"README.md"
|
|
@@ -62,6 +58,7 @@
|
|
|
62
58
|
"@types/node": "^20.16.6",
|
|
63
59
|
"@types/react": "^18.3.12",
|
|
64
60
|
"@types/react-dom": "^18.3.1",
|
|
61
|
+
"fast-glob": "^3.3.3",
|
|
65
62
|
"orval": "^7.5.0",
|
|
66
63
|
"react": "^18.3.1",
|
|
67
64
|
"react-dom": "^18.3.1",
|
|
@@ -76,9 +73,11 @@
|
|
|
76
73
|
}
|
|
77
74
|
},
|
|
78
75
|
"scripts": {
|
|
79
|
-
"build": "
|
|
80
|
-
"build:
|
|
81
|
-
"
|
|
76
|
+
"build": "pnpm build:js && pnpm build:css",
|
|
77
|
+
"build:js": "pnpm clean:dist && tsc -b ./tsconfig.cjs.json ./tsconfig.esm.json",
|
|
78
|
+
"build:css": "node ./scripts/build-css.js",
|
|
79
|
+
"build:ci": "pnpm build:css && tsc --noEmit",
|
|
80
|
+
"clean": "rm -rf .turbo && rm -rf node_modules && pnpm clean:dist",
|
|
82
81
|
"clean:dist": "rm -rf dist",
|
|
83
82
|
"generate-api": "orval --config ./orval.config.ts"
|
|
84
83
|
},
|
package/src/api/api-provider.tsx
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
export type WidgetType =
|
|
4
|
-
| "user-management"
|
|
5
|
-
| "organization-switcher"
|
|
6
|
-
| "user-sessions"
|
|
7
|
-
| "user-security"
|
|
8
|
-
| "user-profile";
|
|
9
|
-
|
|
10
|
-
export type AuthToken = string | (() => Promise<string>);
|
|
11
|
-
|
|
12
|
-
interface ElevatedAccess {
|
|
13
|
-
token: string;
|
|
14
|
-
expiresAt: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface ApiConfig {
|
|
18
|
-
authToken: Promise<string> | string;
|
|
19
|
-
authTokenQueryKey: string;
|
|
20
|
-
baseUrl: string;
|
|
21
|
-
widgetType: WidgetType;
|
|
22
|
-
elevatedAccess?: ElevatedAccess;
|
|
23
|
-
setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const ApiContext = React.createContext<ApiConfig | undefined>(undefined);
|
|
27
|
-
|
|
28
|
-
interface ApiProviderProps {
|
|
29
|
-
authToken: AuthToken;
|
|
30
|
-
baseUrl: string;
|
|
31
|
-
children: React.ReactNode;
|
|
32
|
-
widgetType: WidgetType;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export const ApiProvider = ({
|
|
36
|
-
authToken,
|
|
37
|
-
baseUrl,
|
|
38
|
-
children,
|
|
39
|
-
widgetType,
|
|
40
|
-
}: ApiProviderProps) => {
|
|
41
|
-
const authTokenPromiseOrString =
|
|
42
|
-
typeof authToken === "string" ? authToken : authToken();
|
|
43
|
-
const [elevatedAccess, setElevatedAccess] = React.useState<ElevatedAccess>();
|
|
44
|
-
const elevatedAccessTimeout = React.useRef<NodeJS.Timeout>();
|
|
45
|
-
|
|
46
|
-
// This effect manages the expiration of elevated access tokens
|
|
47
|
-
// When an elevated access token is present, it checks every 30 seconds if the token has expired
|
|
48
|
-
// If the token has expired (current time > expiration time), it clears the elevated access
|
|
49
|
-
React.useEffect(() => {
|
|
50
|
-
if (elevatedAccessTimeout.current) {
|
|
51
|
-
clearInterval(elevatedAccessTimeout.current);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (elevatedAccess) {
|
|
55
|
-
elevatedAccessTimeout.current = setInterval(() => {
|
|
56
|
-
const now = new Date();
|
|
57
|
-
const expiresAtDate = new Date(elevatedAccess.expiresAt);
|
|
58
|
-
|
|
59
|
-
// Reset the elevated access if it has expired
|
|
60
|
-
if (now > expiresAtDate) {
|
|
61
|
-
setElevatedAccess(undefined);
|
|
62
|
-
}
|
|
63
|
-
}, 30_000); // every 30 seconds
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return () => {
|
|
67
|
-
if (elevatedAccessTimeout.current) {
|
|
68
|
-
clearInterval(elevatedAccessTimeout.current);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
}, [elevatedAccess]);
|
|
72
|
-
|
|
73
|
-
const value = React.useMemo(
|
|
74
|
-
() => ({
|
|
75
|
-
authToken: authTokenPromiseOrString,
|
|
76
|
-
authTokenQueryKey: getAuthTokenQueryKey(authTokenPromiseOrString),
|
|
77
|
-
baseUrl,
|
|
78
|
-
elevatedAccess,
|
|
79
|
-
setElevatedAccess,
|
|
80
|
-
widgetType,
|
|
81
|
-
}),
|
|
82
|
-
[
|
|
83
|
-
authTokenPromiseOrString,
|
|
84
|
-
baseUrl,
|
|
85
|
-
elevatedAccess,
|
|
86
|
-
setElevatedAccess,
|
|
87
|
-
widgetType,
|
|
88
|
-
],
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export const useApi = () => {
|
|
95
|
-
const context = React.useContext(ApiContext);
|
|
96
|
-
|
|
97
|
-
if (context === undefined) {
|
|
98
|
-
throw new Error("useApi must be used within an ApiProvider");
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return context;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
export const useElevatedAccessToken = () => {
|
|
105
|
-
const { elevatedAccess, setElevatedAccess } = useApi();
|
|
106
|
-
|
|
107
|
-
return { elevatedAccess, setElevatedAccess };
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
// Map promises to a UUID that they can be identified by
|
|
111
|
-
const PromiseKey = new WeakMap<Promise<string>, string>();
|
|
112
|
-
/*
|
|
113
|
-
*
|
|
114
|
-
* @param getAccessToken - Async function that returns a promise that resolves to a string
|
|
115
|
-
* @returns a resolved string or null from the access token promise
|
|
116
|
-
*/
|
|
117
|
-
function getAuthTokenQueryKey(
|
|
118
|
-
authTokenPromiseOrString: Promise<string> | string,
|
|
119
|
-
): string {
|
|
120
|
-
// Need to go by equality of the promise to avoid scenarios where
|
|
121
|
-
// 1. The promise is the same, but the function changes
|
|
122
|
-
// 2. The function is the same, but the promise is different ⚠️
|
|
123
|
-
//
|
|
124
|
-
// This does have the unfortunate side effect where if the function result
|
|
125
|
-
// isn't memoized somehow, then it will invalidate the query on every render.
|
|
126
|
-
// This doesn't occur with the current use case of getAccessToken from
|
|
127
|
-
// useAuth, but could in a custom implementation.
|
|
128
|
-
//
|
|
129
|
-
// Other things I explored:
|
|
130
|
-
// 1. Removing promise api, and force user to resolve the promise
|
|
131
|
-
// themselves. The user can already do this with the string API, so
|
|
132
|
-
// it's not necessary, and they could run into issues 1, or 2 if
|
|
133
|
-
// implemented wrong.
|
|
134
|
-
// 2. Memoizing the function - this results in issue 2, where the function
|
|
135
|
-
// is static, but the promise changes. I believe this actually is the
|
|
136
|
-
// case with useAuth since it only sets the client once on initialization,
|
|
137
|
-
// and binds the function to the client after that promise resolves.
|
|
138
|
-
|
|
139
|
-
if (typeof authTokenPromiseOrString === "string") {
|
|
140
|
-
return authTokenPromiseOrString;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const authTokenPromise = authTokenPromiseOrString;
|
|
144
|
-
|
|
145
|
-
// Cannot memoize on the function because it could remain the same while
|
|
146
|
-
// returning a different promise (and useAuth behaves this way).
|
|
147
|
-
|
|
148
|
-
const promiseKey = PromiseKey.get(authTokenPromise);
|
|
149
|
-
|
|
150
|
-
// Side effect, but we we're using a weak map, so it should be pretty safe
|
|
151
|
-
if (!promiseKey) {
|
|
152
|
-
const newPromiseKey = `${Math.random()}`;
|
|
153
|
-
PromiseKey.set(authTokenPromise, newPromiseKey);
|
|
154
|
-
return newPromiseKey;
|
|
155
|
-
} else {
|
|
156
|
-
return promiseKey;
|
|
157
|
-
}
|
|
158
|
-
}
|
package/src/api/constants.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const WIDGETS_API_VERSION = "1";
|