@workos-inc/widgets 0.0.0-pre.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.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/index.d.ts +3 -0
  4. package/dist/cjs/index.d.ts.map +1 -0
  5. package/dist/cjs/index.js +8 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/lib/api/config.d.ts +9 -0
  8. package/dist/cjs/lib/api/config.d.ts.map +1 -0
  9. package/dist/cjs/lib/api/config.js +12 -0
  10. package/dist/cjs/lib/api/config.js.map +1 -0
  11. package/dist/cjs/lib/api/role.d.ts +9 -0
  12. package/dist/cjs/lib/api/role.d.ts.map +1 -0
  13. package/dist/cjs/lib/api/role.js +94 -0
  14. package/dist/cjs/lib/api/role.js.map +1 -0
  15. package/dist/cjs/lib/api/user.d.ts +61 -0
  16. package/dist/cjs/lib/api/user.d.ts.map +1 -0
  17. package/dist/cjs/lib/api/user.js +312 -0
  18. package/dist/cjs/lib/api/user.js.map +1 -0
  19. package/dist/cjs/lib/constants.d.ts +3 -0
  20. package/dist/cjs/lib/constants.d.ts.map +1 -0
  21. package/dist/cjs/lib/constants.js +6 -0
  22. package/dist/cjs/lib/constants.js.map +1 -0
  23. package/dist/cjs/lib/delete-user-dialog.d.ts +12 -0
  24. package/dist/cjs/lib/delete-user-dialog.d.ts.map +1 -0
  25. package/dist/cjs/lib/delete-user-dialog.js +37 -0
  26. package/dist/cjs/lib/delete-user-dialog.js.map +1 -0
  27. package/dist/cjs/lib/edit-user-details-dialog.d.ts +12 -0
  28. package/dist/cjs/lib/edit-user-details-dialog.d.ts.map +1 -0
  29. package/dist/cjs/lib/edit-user-details-dialog.js +81 -0
  30. package/dist/cjs/lib/edit-user-details-dialog.js.map +1 -0
  31. package/dist/cjs/lib/elements.d.ts +32 -0
  32. package/dist/cjs/lib/elements.d.ts.map +1 -0
  33. package/dist/cjs/lib/elements.js +57 -0
  34. package/dist/cjs/lib/elements.js.map +1 -0
  35. package/dist/cjs/lib/invite-user-dialog.d.ts +7 -0
  36. package/dist/cjs/lib/invite-user-dialog.d.ts.map +1 -0
  37. package/dist/cjs/lib/invite-user-dialog.js +167 -0
  38. package/dist/cjs/lib/invite-user-dialog.js.map +1 -0
  39. package/dist/cjs/lib/label.d.ts +7 -0
  40. package/dist/cjs/lib/label.d.ts.map +1 -0
  41. package/dist/cjs/lib/label.js +9 -0
  42. package/dist/cjs/lib/label.js.map +1 -0
  43. package/dist/cjs/lib/pagination.d.ts +8 -0
  44. package/dist/cjs/lib/pagination.d.ts.map +1 -0
  45. package/dist/cjs/lib/pagination.js +67 -0
  46. package/dist/cjs/lib/pagination.js.map +1 -0
  47. package/dist/cjs/lib/resend-invite-dialog.d.ts +10 -0
  48. package/dist/cjs/lib/resend-invite-dialog.d.ts.map +1 -0
  49. package/dist/cjs/lib/resend-invite-dialog.js +71 -0
  50. package/dist/cjs/lib/resend-invite-dialog.js.map +1 -0
  51. package/dist/cjs/lib/revoke-invite-dialog.d.ts +10 -0
  52. package/dist/cjs/lib/revoke-invite-dialog.d.ts.map +1 -0
  53. package/dist/cjs/lib/revoke-invite-dialog.js +37 -0
  54. package/dist/cjs/lib/revoke-invite-dialog.js.map +1 -0
  55. package/dist/cjs/lib/search-provider.d.ts +11 -0
  56. package/dist/cjs/lib/search-provider.d.ts.map +1 -0
  57. package/dist/cjs/lib/search-provider.js +55 -0
  58. package/dist/cjs/lib/search-provider.js.map +1 -0
  59. package/dist/cjs/lib/use-is-hydrated.d.ts +2 -0
  60. package/dist/cjs/lib/use-is-hydrated.d.ts.map +1 -0
  61. package/dist/cjs/lib/use-is-hydrated.js +34 -0
  62. package/dist/cjs/lib/use-is-hydrated.js.map +1 -0
  63. package/dist/cjs/lib/user-actions-dropdown.d.ts +9 -0
  64. package/dist/cjs/lib/user-actions-dropdown.d.ts.map +1 -0
  65. package/dist/cjs/lib/user-actions-dropdown.js +83 -0
  66. package/dist/cjs/lib/user-actions-dropdown.js.map +1 -0
  67. package/dist/cjs/lib/users-filter.d.ts +9 -0
  68. package/dist/cjs/lib/users-filter.d.ts.map +1 -0
  69. package/dist/cjs/lib/users-filter.js +63 -0
  70. package/dist/cjs/lib/users-filter.js.map +1 -0
  71. package/dist/cjs/lib/users-management-context.d.ts +23 -0
  72. package/dist/cjs/lib/users-management-context.d.ts.map +1 -0
  73. package/dist/cjs/lib/users-management-context.js +83 -0
  74. package/dist/cjs/lib/users-management-context.js.map +1 -0
  75. package/dist/cjs/lib/users-management-state.d.ts +22 -0
  76. package/dist/cjs/lib/users-management-state.d.ts.map +1 -0
  77. package/dist/cjs/lib/users-management-state.js +143 -0
  78. package/dist/cjs/lib/users-management-state.js.map +1 -0
  79. package/dist/cjs/lib/users-management.d.ts +12 -0
  80. package/dist/cjs/lib/users-management.d.ts.map +1 -0
  81. package/dist/cjs/lib/users-management.js +141 -0
  82. package/dist/cjs/lib/users-management.js.map +1 -0
  83. package/dist/cjs/lib/users-search.d.ts +3 -0
  84. package/dist/cjs/lib/users-search.d.ts.map +1 -0
  85. package/dist/cjs/lib/users-search.js +65 -0
  86. package/dist/cjs/lib/users-search.js.map +1 -0
  87. package/dist/cjs/lib/utils.d.ts +15 -0
  88. package/dist/cjs/lib/utils.d.ts.map +1 -0
  89. package/dist/cjs/lib/utils.js +78 -0
  90. package/dist/cjs/lib/utils.js.map +1 -0
  91. package/dist/cjs/lib/widgets-context.d.ts +11 -0
  92. package/dist/cjs/lib/widgets-context.d.ts.map +1 -0
  93. package/dist/cjs/lib/widgets-context.js +45 -0
  94. package/dist/cjs/lib/widgets-context.js.map +1 -0
  95. package/dist/cjs/users-management.client.d.ts +6 -0
  96. package/dist/cjs/users-management.client.d.ts.map +1 -0
  97. package/dist/cjs/users-management.client.js +57 -0
  98. package/dist/cjs/users-management.client.js.map +1 -0
  99. package/dist/cjs/workos-widgets.client.d.ts +17 -0
  100. package/dist/cjs/workos-widgets.client.d.ts.map +1 -0
  101. package/dist/cjs/workos-widgets.client.js +55 -0
  102. package/dist/cjs/workos-widgets.client.js.map +1 -0
  103. package/dist/esm/index.d.ts +3 -0
  104. package/dist/esm/index.d.ts.map +1 -0
  105. package/dist/esm/index.js +3 -0
  106. package/dist/esm/index.js.map +1 -0
  107. package/dist/esm/lib/api/config.d.ts +9 -0
  108. package/dist/esm/lib/api/config.d.ts.map +1 -0
  109. package/dist/esm/lib/api/config.js +9 -0
  110. package/dist/esm/lib/api/config.js.map +1 -0
  111. package/dist/esm/lib/api/role.d.ts +9 -0
  112. package/dist/esm/lib/api/role.d.ts.map +1 -0
  113. package/dist/esm/lib/api/role.js +89 -0
  114. package/dist/esm/lib/api/role.js.map +1 -0
  115. package/dist/esm/lib/api/user.d.ts +61 -0
  116. package/dist/esm/lib/api/user.d.ts.map +1 -0
  117. package/dist/esm/lib/api/user.js +302 -0
  118. package/dist/esm/lib/api/user.js.map +1 -0
  119. package/dist/esm/lib/constants.d.ts +3 -0
  120. package/dist/esm/lib/constants.d.ts.map +1 -0
  121. package/dist/esm/lib/constants.js +3 -0
  122. package/dist/esm/lib/constants.js.map +1 -0
  123. package/dist/esm/lib/delete-user-dialog.d.ts +12 -0
  124. package/dist/esm/lib/delete-user-dialog.d.ts.map +1 -0
  125. package/dist/esm/lib/delete-user-dialog.js +33 -0
  126. package/dist/esm/lib/delete-user-dialog.js.map +1 -0
  127. package/dist/esm/lib/edit-user-details-dialog.d.ts +12 -0
  128. package/dist/esm/lib/edit-user-details-dialog.d.ts.map +1 -0
  129. package/dist/esm/lib/edit-user-details-dialog.js +54 -0
  130. package/dist/esm/lib/edit-user-details-dialog.js.map +1 -0
  131. package/dist/esm/lib/elements.d.ts +32 -0
  132. package/dist/esm/lib/elements.d.ts.map +1 -0
  133. package/dist/esm/lib/elements.js +54 -0
  134. package/dist/esm/lib/elements.js.map +1 -0
  135. package/dist/esm/lib/invite-user-dialog.d.ts +7 -0
  136. package/dist/esm/lib/invite-user-dialog.d.ts.map +1 -0
  137. package/dist/esm/lib/invite-user-dialog.js +140 -0
  138. package/dist/esm/lib/invite-user-dialog.js.map +1 -0
  139. package/dist/esm/lib/label.d.ts +7 -0
  140. package/dist/esm/lib/label.d.ts.map +1 -0
  141. package/dist/esm/lib/label.js +6 -0
  142. package/dist/esm/lib/label.js.map +1 -0
  143. package/dist/esm/lib/pagination.d.ts +8 -0
  144. package/dist/esm/lib/pagination.d.ts.map +1 -0
  145. package/dist/esm/lib/pagination.js +40 -0
  146. package/dist/esm/lib/pagination.js.map +1 -0
  147. package/dist/esm/lib/resend-invite-dialog.d.ts +10 -0
  148. package/dist/esm/lib/resend-invite-dialog.d.ts.map +1 -0
  149. package/dist/esm/lib/resend-invite-dialog.js +44 -0
  150. package/dist/esm/lib/resend-invite-dialog.js.map +1 -0
  151. package/dist/esm/lib/revoke-invite-dialog.d.ts +10 -0
  152. package/dist/esm/lib/revoke-invite-dialog.d.ts.map +1 -0
  153. package/dist/esm/lib/revoke-invite-dialog.js +33 -0
  154. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -0
  155. package/dist/esm/lib/search-provider.d.ts +11 -0
  156. package/dist/esm/lib/search-provider.d.ts.map +1 -0
  157. package/dist/esm/lib/search-provider.js +27 -0
  158. package/dist/esm/lib/search-provider.js.map +1 -0
  159. package/dist/esm/lib/use-is-hydrated.d.ts +2 -0
  160. package/dist/esm/lib/use-is-hydrated.d.ts.map +1 -0
  161. package/dist/esm/lib/use-is-hydrated.js +8 -0
  162. package/dist/esm/lib/use-is-hydrated.js.map +1 -0
  163. package/dist/esm/lib/user-actions-dropdown.d.ts +9 -0
  164. package/dist/esm/lib/user-actions-dropdown.d.ts.map +1 -0
  165. package/dist/esm/lib/user-actions-dropdown.js +56 -0
  166. package/dist/esm/lib/user-actions-dropdown.js.map +1 -0
  167. package/dist/esm/lib/users-filter.d.ts +9 -0
  168. package/dist/esm/lib/users-filter.d.ts.map +1 -0
  169. package/dist/esm/lib/users-filter.js +36 -0
  170. package/dist/esm/lib/users-filter.js.map +1 -0
  171. package/dist/esm/lib/users-management-context.d.ts +23 -0
  172. package/dist/esm/lib/users-management-context.d.ts.map +1 -0
  173. package/dist/esm/lib/users-management-context.js +54 -0
  174. package/dist/esm/lib/users-management-context.js.map +1 -0
  175. package/dist/esm/lib/users-management-state.d.ts +22 -0
  176. package/dist/esm/lib/users-management-state.d.ts.map +1 -0
  177. package/dist/esm/lib/users-management-state.js +117 -0
  178. package/dist/esm/lib/users-management-state.js.map +1 -0
  179. package/dist/esm/lib/users-management.d.ts +12 -0
  180. package/dist/esm/lib/users-management.d.ts.map +1 -0
  181. package/dist/esm/lib/users-management.js +114 -0
  182. package/dist/esm/lib/users-management.js.map +1 -0
  183. package/dist/esm/lib/users-search.d.ts +3 -0
  184. package/dist/esm/lib/users-search.d.ts.map +1 -0
  185. package/dist/esm/lib/users-search.js +39 -0
  186. package/dist/esm/lib/users-search.js.map +1 -0
  187. package/dist/esm/lib/utils.d.ts +15 -0
  188. package/dist/esm/lib/utils.d.ts.map +1 -0
  189. package/dist/esm/lib/utils.js +70 -0
  190. package/dist/esm/lib/utils.js.map +1 -0
  191. package/dist/esm/lib/widgets-context.d.ts +11 -0
  192. package/dist/esm/lib/widgets-context.d.ts.map +1 -0
  193. package/dist/esm/lib/widgets-context.js +17 -0
  194. package/dist/esm/lib/widgets-context.js.map +1 -0
  195. package/dist/esm/users-management.client.d.ts +6 -0
  196. package/dist/esm/users-management.client.d.ts.map +1 -0
  197. package/dist/esm/users-management.client.js +30 -0
  198. package/dist/esm/users-management.client.js.map +1 -0
  199. package/dist/esm/workos-widgets.client.d.ts +17 -0
  200. package/dist/esm/workos-widgets.client.d.ts.map +1 -0
  201. package/dist/esm/workos-widgets.client.js +28 -0
  202. package/dist/esm/workos-widgets.client.js.map +1 -0
  203. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  204. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  205. package/package.json +69 -0
  206. package/src/index.ts +5 -0
  207. package/src/lib/api/config.ts +9 -0
  208. package/src/lib/api/role.ts +124 -0
  209. package/src/lib/api/user.ts +458 -0
  210. package/src/lib/constants.ts +2 -0
  211. package/src/lib/delete-user-dialog.tsx +103 -0
  212. package/src/lib/edit-user-details-dialog.tsx +170 -0
  213. package/src/lib/elements.tsx +175 -0
  214. package/src/lib/invite-user-dialog.tsx +319 -0
  215. package/src/lib/label.tsx +14 -0
  216. package/src/lib/pagination.tsx +69 -0
  217. package/src/lib/resend-invite-dialog.tsx +136 -0
  218. package/src/lib/revoke-invite-dialog.tsx +104 -0
  219. package/src/lib/search-provider.tsx +51 -0
  220. package/src/lib/use-is-hydrated.ts +13 -0
  221. package/src/lib/user-actions-dropdown.tsx +161 -0
  222. package/src/lib/users-filter.tsx +122 -0
  223. package/src/lib/users-management-context.tsx +89 -0
  224. package/src/lib/users-management-state.ts +165 -0
  225. package/src/lib/users-management.tsx +461 -0
  226. package/src/lib/users-search.tsx +130 -0
  227. package/src/lib/utils.ts +94 -0
  228. package/src/lib/widgets-context.ts +29 -0
  229. package/src/users-management.client.tsx +59 -0
  230. package/src/workos-widgets.client.tsx +73 -0
@@ -0,0 +1,89 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import type { PaginationData } from "./api/user";
5
+ import {
6
+ UsersManagementAction,
7
+ UsersManagementState,
8
+ } from "./users-management-state";
9
+
10
+ export interface UsersManagementContextType {
11
+ authToken: string | null;
12
+ state: UsersManagementState;
13
+ dispatch: React.Dispatch<UsersManagementAction>;
14
+ }
15
+
16
+ const UsersManagementContext = React.createContext<
17
+ UsersManagementContextType | undefined
18
+ >(undefined);
19
+ UsersManagementContext.displayName = "UsersManagementContext";
20
+
21
+ export const UsersManagementContextProvider: React.FC<{
22
+ children?: React.ReactNode;
23
+ value: UsersManagementContextType;
24
+ }> = ({ children, value }) => {
25
+ return (
26
+ <UsersManagementContext.Provider value={value}>
27
+ {children}
28
+ </UsersManagementContext.Provider>
29
+ );
30
+ };
31
+
32
+ const NOOP = () => void 0;
33
+ const EMPTY_PAGINATION: PaginationData = {};
34
+
35
+ /**
36
+ * The context may be provided if it is instantiated in the tree above the user.
37
+ */
38
+ export function useUsersManagementContext(
39
+ initialContext?: UsersManagementContextType | null,
40
+ ): UsersManagementContextType {
41
+ const context = React.useContext(UsersManagementContext);
42
+ const providedToken = initialContext?.authToken ?? null;
43
+ const hasContext = !!context;
44
+ React.useEffect(() => {
45
+ if (!providedToken && !hasContext) {
46
+ console.error(
47
+ "useUsersManagementContext was called from a component outside of the UsersManagementContext provider without providing an authToken directly. Resulting queries may not run as expected.",
48
+ );
49
+ }
50
+ }, [providedToken, hasContext]);
51
+
52
+ if (context) {
53
+ return context;
54
+ }
55
+
56
+ if (initialContext) {
57
+ return initialContext;
58
+ }
59
+
60
+ return {
61
+ authToken: null,
62
+ dispatch: NOOP,
63
+ state: {
64
+ pagination: EMPTY_PAGINATION,
65
+ role: null,
66
+ searchQuery: null,
67
+ },
68
+ };
69
+ }
70
+
71
+ /**
72
+ * The auth token may be provided if it is instantiated in the tree above the
73
+ * user management context. Otherwise we'll use the context value if it exists.
74
+ */
75
+ export function useUsersManagementPagniatoin(
76
+ args: { authToken?: string | null } | undefined | null,
77
+ ) {
78
+ const context = React.useContext(UsersManagementContext);
79
+ const providedToken = args?.authToken;
80
+ const hasContext = !!context;
81
+ React.useEffect(() => {
82
+ if (!providedToken && !hasContext) {
83
+ console.error(
84
+ "useUsersManagementAuthToken was called from a component outside of the UsersManagementContext provider without providing an authToken directly. Resulting queries may not run as expected.",
85
+ );
86
+ }
87
+ }, [providedToken, hasContext]);
88
+ return providedToken || context?.authToken || null;
89
+ }
@@ -0,0 +1,165 @@
1
+ import * as React from "react";
2
+ import type { PaginationData } from "./api/user";
3
+ import { canUseDOM } from "./utils";
4
+
5
+ export function useUsersManagementState(initialState: UsersManagementState) {
6
+ const [[state, effects], dispatch] = React.useReducer(reducer, [
7
+ initialState,
8
+ [],
9
+ ]);
10
+
11
+ React.useEffect(() => {
12
+ if (window !== window.top) {
13
+ // do not use query params if widget is rendered in an iframe
14
+ return;
15
+ }
16
+ const params = new URLSearchParams(window.location.search);
17
+ dispatch({ type: "INIT", params });
18
+ }, []);
19
+
20
+ React.useEffect(() => {
21
+ for (const effect of effects) {
22
+ effect();
23
+ }
24
+ }, [effects]);
25
+
26
+ return [state, dispatch] as const;
27
+ }
28
+
29
+ function reducer(
30
+ current: StateWithEffects<UsersManagementState>,
31
+ action: UsersManagementAction,
32
+ ): StateWithEffects<UsersManagementState> {
33
+ const effects: EffectFn[] = [];
34
+ const exec = (fn: () => void) => {
35
+ const effect = () => {
36
+ if (!effect.disposed) {
37
+ effect.disposed = true;
38
+ fn();
39
+ }
40
+ };
41
+ effect.disposed = false;
42
+ effects.push(effect);
43
+ };
44
+
45
+ const [currentState] = current;
46
+ switch (action.type) {
47
+ case "INIT": {
48
+ const { params } = action;
49
+ let role, searchQuery;
50
+ if ((role = params.get("ak_role"))) {
51
+ return [{ ...currentState, searchQuery: null, role }, effects];
52
+ }
53
+ if ((searchQuery = params.get("ak_q"))) {
54
+ return [{ ...currentState, searchQuery, role: null }, effects];
55
+ }
56
+ return current;
57
+ }
58
+ case "SET_PAGINATION": {
59
+ const { pagination } = action;
60
+ if (
61
+ (pagination.after &&
62
+ pagination.after === currentState.pagination?.after) ||
63
+ (pagination.before &&
64
+ pagination.before === currentState.pagination?.before)
65
+ ) {
66
+ return current;
67
+ }
68
+
69
+ return [{ ...currentState, pagination }, effects];
70
+ }
71
+ case "FILTER_BY_ROLE": {
72
+ if (action.role === currentState.role) {
73
+ return current;
74
+ }
75
+ const { role } = action;
76
+ exec(() =>
77
+ updateQueryParams(
78
+ { ak_role: role, ak_q: null },
79
+ { replaceState: true },
80
+ ),
81
+ );
82
+ return [
83
+ { ...currentState, pagination: null, role, searchQuery: null },
84
+ effects,
85
+ ];
86
+ }
87
+ case "FILTER_BY_SEARCH": {
88
+ if (action.searchQuery === currentState.searchQuery) {
89
+ return current;
90
+ }
91
+ const { searchQuery } = action;
92
+ exec(() =>
93
+ updateQueryParams(
94
+ { ak_role: null, ak_q: searchQuery },
95
+ { replaceState: true },
96
+ ),
97
+ );
98
+ return [
99
+ { ...currentState, pagination: null, role: null, searchQuery },
100
+ effects,
101
+ ];
102
+ //
103
+ break;
104
+ }
105
+ default:
106
+ return current;
107
+ }
108
+ }
109
+
110
+ export interface UsersManagementState {
111
+ searchQuery: string | null;
112
+ role: string | null;
113
+ pagination: PaginationData | null;
114
+ }
115
+
116
+ export type UsersManagementAction =
117
+ | { type: "INIT"; params: URLSearchParams }
118
+ | { type: "FILTER_BY_SEARCH"; searchQuery: string | null }
119
+ | { type: "FILTER_BY_ROLE"; role: string | null }
120
+ | { type: "SET_PAGINATION"; pagination: PaginationData };
121
+
122
+ type EffectFn = {
123
+ (): void;
124
+ disposed: boolean;
125
+ };
126
+
127
+ type StateWithEffects<State> = [State, EffectFn[]];
128
+
129
+ function updateQueryParams(
130
+ newParams: { [key: string]: { toString(): string } | null },
131
+ args: { replaceState?: boolean } = {},
132
+ ) {
133
+ if (!canUseDOM) {
134
+ throw new Error("Cannot update query params on the server");
135
+ }
136
+
137
+ if (window !== window.top) {
138
+ // do not update query params if widget is rendered in an iframe
139
+ return;
140
+ }
141
+
142
+ const initialSearch = window.location.search;
143
+ const params = new URLSearchParams(initialSearch);
144
+ Object.entries(newParams).forEach(([key, value]) => {
145
+ if (value != null && value !== "") {
146
+ params.set(key, String(value));
147
+ } else {
148
+ params.delete(key);
149
+ }
150
+ });
151
+
152
+ if (initialSearch === `?${params.toString()}`) {
153
+ return;
154
+ }
155
+
156
+ const newUrl = params.toString()
157
+ ? `${window.location.pathname}?${params}`
158
+ : window.location.pathname;
159
+
160
+ if (args.replaceState) {
161
+ window.history.replaceState({}, "", newUrl);
162
+ } else {
163
+ window.history.pushState({}, "", newUrl);
164
+ }
165
+ }