@joelbarron/react-web-dev-kit 0.1.9 → 0.1.10

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 (271) hide show
  1. package/dist/auth/client.d.ts +46 -0
  2. package/dist/auth/client.d.ts.map +1 -0
  3. package/dist/auth/client.js +379 -0
  4. package/dist/auth/constants/countryCallingCodes.d.ts +9 -0
  5. package/dist/auth/constants/countryCallingCodes.d.ts.map +1 -0
  6. package/dist/auth/constants/countryCallingCodes.js +209 -0
  7. package/dist/auth/constants/gender.d.ts +9 -0
  8. package/dist/auth/constants/gender.d.ts.map +1 -0
  9. package/dist/auth/constants/gender.js +12 -0
  10. package/dist/auth/constants/index.d.ts +3 -0
  11. package/dist/auth/constants/index.d.ts.map +1 -0
  12. package/dist/auth/constants/index.js +2 -0
  13. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts +18 -0
  14. package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts.map +1 -0
  15. package/dist/auth/forms/account/AuthAccountConfirmationForm.js +167 -0
  16. package/dist/auth/forms/account/index.d.ts +2 -0
  17. package/dist/auth/forms/account/index.d.ts.map +1 -0
  18. package/dist/auth/forms/account/index.js +1 -0
  19. package/dist/auth/forms/errorParser.d.ts +7 -0
  20. package/dist/auth/forms/errorParser.d.ts.map +1 -0
  21. package/dist/auth/forms/errorParser.js +65 -0
  22. package/dist/auth/forms/index.d.ts +6 -0
  23. package/dist/auth/forms/index.d.ts.map +1 -0
  24. package/dist/auth/forms/index.js +5 -0
  25. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts +16 -0
  26. package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts.map +1 -0
  27. package/dist/auth/forms/password/AuthForgotPasswordForm.js +109 -0
  28. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts +17 -0
  29. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts.map +1 -0
  30. package/dist/auth/forms/password/AuthPasswordResetConfirmForm.js +163 -0
  31. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts +12 -0
  32. package/dist/auth/forms/password/AuthResetPasswordForm.d.ts.map +1 -0
  33. package/dist/auth/forms/password/AuthResetPasswordForm.js +22 -0
  34. package/dist/auth/forms/password/index.d.ts +4 -0
  35. package/dist/auth/forms/password/index.d.ts.map +1 -0
  36. package/dist/auth/forms/password/index.js +3 -0
  37. package/dist/auth/forms/password/passwordValidation.d.ts +3 -0
  38. package/dist/auth/forms/password/passwordValidation.d.ts.map +1 -0
  39. package/dist/auth/forms/password/passwordValidation.js +45 -0
  40. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts +24 -0
  41. package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts.map +1 -0
  42. package/dist/auth/forms/sign-in/AuthOtpSignInForm.js +227 -0
  43. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts +22 -0
  44. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts.map +1 -0
  45. package/dist/auth/forms/sign-in/AuthPasswordSignInForm.js +148 -0
  46. package/dist/auth/forms/sign-in/index.d.ts +3 -0
  47. package/dist/auth/forms/sign-in/index.d.ts.map +1 -0
  48. package/dist/auth/forms/sign-in/index.js +2 -0
  49. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts +37 -0
  50. package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts.map +1 -0
  51. package/dist/auth/forms/sign-up/AuthSignUpForm.js +193 -0
  52. package/dist/auth/forms/sign-up/index.d.ts +2 -0
  53. package/dist/auth/forms/sign-up/index.d.ts.map +1 -0
  54. package/dist/auth/forms/sign-up/index.js +1 -0
  55. package/dist/auth/fuse/createFuseAuthViews.d.ts +25 -0
  56. package/dist/auth/fuse/createFuseAuthViews.d.ts.map +1 -0
  57. package/dist/auth/fuse/createFuseAuthViews.js +510 -0
  58. package/dist/auth/fuse/fuseAdapter.d.ts +42 -0
  59. package/dist/auth/fuse/fuseAdapter.d.ts.map +1 -0
  60. package/dist/auth/fuse/fuseAdapter.js +291 -0
  61. package/dist/auth/fuse/fuseIntegration.d.ts +74 -0
  62. package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -0
  63. package/dist/auth/fuse/fuseIntegration.js +121 -0
  64. package/dist/auth/fuse/index.d.ts +4 -0
  65. package/dist/auth/fuse/index.d.ts.map +1 -0
  66. package/dist/auth/fuse/index.js +3 -0
  67. package/dist/auth/index.d.ts +11 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +10 -0
  70. package/dist/auth/provider.d.ts +35 -0
  71. package/dist/auth/provider.d.ts.map +1 -0
  72. package/dist/auth/provider.js +133 -0
  73. package/dist/auth/query.d.ts +23 -0
  74. package/dist/auth/query.d.ts.map +1 -0
  75. package/dist/auth/query.js +103 -0
  76. package/dist/auth/routes.d.ts +37 -0
  77. package/dist/auth/routes.d.ts.map +1 -0
  78. package/dist/auth/routes.js +75 -0
  79. package/dist/auth/social/providerAuth.d.ts +101 -0
  80. package/dist/auth/social/providerAuth.d.ts.map +1 -0
  81. package/dist/auth/social/providerAuth.js +207 -0
  82. package/dist/auth/storage.d.ts +3 -0
  83. package/dist/auth/storage.d.ts.map +1 -0
  84. package/dist/auth/storage.js +20 -0
  85. package/dist/auth/types.d.ts +238 -0
  86. package/dist/auth/types.d.ts.map +1 -0
  87. package/dist/auth/types.js +1 -0
  88. package/dist/auth/ui/AuthPageTitle.d.ts +7 -0
  89. package/dist/auth/ui/AuthPageTitle.d.ts.map +1 -0
  90. package/dist/auth/ui/AuthPageTitle.js +7 -0
  91. package/dist/auth/ui/AuthPagesMessageSection.d.ts +3 -0
  92. package/dist/auth/ui/AuthPagesMessageSection.d.ts.map +1 -0
  93. package/dist/auth/ui/AuthPagesMessageSection.js +39 -0
  94. package/dist/auth/ui/AuthPrimaryButton.d.ts +9 -0
  95. package/dist/auth/ui/AuthPrimaryButton.d.ts.map +1 -0
  96. package/dist/auth/ui/AuthPrimaryButton.js +19 -0
  97. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts +14 -0
  98. package/dist/auth/ui/AuthRoleSelectionDialog.d.ts.map +1 -0
  99. package/dist/auth/ui/AuthRoleSelectionDialog.js +39 -0
  100. package/dist/auth/ui/AuthRoutePageWrapper.d.ts +12 -0
  101. package/dist/auth/ui/AuthRoutePageWrapper.d.ts.map +1 -0
  102. package/dist/auth/ui/AuthRoutePageWrapper.js +61 -0
  103. package/dist/auth/ui/AuthSecondaryButton.d.ts +7 -0
  104. package/dist/auth/ui/AuthSecondaryButton.d.ts.map +1 -0
  105. package/dist/auth/ui/AuthSecondaryButton.js +18 -0
  106. package/dist/auth/ui/AuthSocialProviderButton.d.ts +11 -0
  107. package/dist/auth/ui/AuthSocialProviderButton.d.ts.map +1 -0
  108. package/dist/auth/ui/AuthSocialProviderButton.js +33 -0
  109. package/dist/auth/ui/index.d.ts +9 -0
  110. package/dist/auth/ui/index.d.ts.map +1 -0
  111. package/dist/auth/ui/index.js +8 -0
  112. package/dist/auth/ui/types.d.ts +15 -0
  113. package/dist/auth/ui/types.d.ts.map +1 -0
  114. package/dist/auth/ui/types.js +1 -0
  115. package/dist/config/createConfig.d.ts +14 -0
  116. package/dist/config/createConfig.d.ts.map +1 -0
  117. package/dist/config/createConfig.js +179 -0
  118. package/dist/config/defaults.d.ts +3 -0
  119. package/dist/config/defaults.d.ts.map +1 -0
  120. package/dist/config/defaults.js +39 -0
  121. package/dist/config/index.d.ts +5 -0
  122. package/dist/config/index.d.ts.map +1 -0
  123. package/dist/config/index.js +4 -0
  124. package/dist/config/merge.d.ts +2 -0
  125. package/dist/config/merge.d.ts.map +1 -0
  126. package/dist/config/merge.js +18 -0
  127. package/dist/config/types.d.ts +53 -0
  128. package/dist/config/types.d.ts.map +1 -0
  129. package/dist/config/types.js +1 -0
  130. package/dist/core/buttons/JBButton.d.ts +8 -0
  131. package/dist/core/buttons/JBButton.d.ts.map +1 -0
  132. package/dist/core/buttons/JBButton.js +55 -0
  133. package/dist/core/buttons/index.d.ts +2 -0
  134. package/dist/core/buttons/index.d.ts.map +1 -0
  135. package/dist/core/buttons/index.js +1 -0
  136. package/dist/core/dialogs/JBConfirmDialog.d.ts +15 -0
  137. package/dist/core/dialogs/JBConfirmDialog.d.ts.map +1 -0
  138. package/dist/core/dialogs/JBConfirmDialog.js +6 -0
  139. package/dist/core/dialogs/index.d.ts +2 -0
  140. package/dist/core/dialogs/index.d.ts.map +1 -0
  141. package/dist/core/dialogs/index.js +1 -0
  142. package/dist/core/index.d.ts +5 -0
  143. package/dist/core/index.d.ts.map +1 -0
  144. package/dist/core/index.js +4 -0
  145. package/dist/core/layout/JBContentContainer.d.ts +31 -0
  146. package/dist/core/layout/JBContentContainer.d.ts.map +1 -0
  147. package/dist/core/layout/JBContentContainer.js +50 -0
  148. package/dist/core/layout/JBFormHeader.d.ts +3 -0
  149. package/dist/core/layout/JBFormHeader.d.ts.map +1 -0
  150. package/dist/core/layout/JBFormHeader.js +131 -0
  151. package/dist/core/layout/index.d.ts +3 -0
  152. package/dist/core/layout/index.d.ts.map +1 -0
  153. package/dist/core/layout/index.js +2 -0
  154. package/dist/core/skeletons/JBFormContentSkeleton.d.ts +5 -0
  155. package/dist/core/skeletons/JBFormContentSkeleton.d.ts.map +1 -0
  156. package/dist/core/skeletons/JBFormContentSkeleton.js +12 -0
  157. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts +6 -0
  158. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts.map +1 -0
  159. package/dist/core/skeletons/JBFormHeaderSkeleton.js +19 -0
  160. package/dist/core/skeletons/index.d.ts +3 -0
  161. package/dist/core/skeletons/index.d.ts.map +1 -0
  162. package/dist/core/skeletons/index.js +2 -0
  163. package/dist/forms/JBAutocompleteField.d.ts +12 -0
  164. package/dist/forms/JBAutocompleteField.d.ts.map +1 -0
  165. package/dist/forms/JBAutocompleteField.js +20 -0
  166. package/dist/forms/JBCheckboxField.d.ts +12 -0
  167. package/dist/forms/JBCheckboxField.d.ts.map +1 -0
  168. package/dist/forms/JBCheckboxField.js +36 -0
  169. package/dist/forms/JBDatePickerField.d.ts +13 -0
  170. package/dist/forms/JBDatePickerField.d.ts.map +1 -0
  171. package/dist/forms/JBDatePickerField.js +67 -0
  172. package/dist/forms/JBRadioGroupField.d.ts +10 -0
  173. package/dist/forms/JBRadioGroupField.d.ts.map +1 -0
  174. package/dist/forms/JBRadioGroupField.js +8 -0
  175. package/dist/forms/JBSelectField.d.ts +9 -0
  176. package/dist/forms/JBSelectField.d.ts.map +1 -0
  177. package/dist/forms/JBSelectField.js +8 -0
  178. package/dist/forms/JBSwitchField.d.ts +11 -0
  179. package/dist/forms/JBSwitchField.d.ts.map +1 -0
  180. package/dist/forms/JBSwitchField.js +10 -0
  181. package/dist/forms/JBTextField.d.ts +6 -0
  182. package/dist/forms/JBTextField.d.ts.map +1 -0
  183. package/dist/forms/JBTextField.js +8 -0
  184. package/dist/forms/JBTimePickerField.d.ts +12 -0
  185. package/dist/forms/JBTimePickerField.d.ts.map +1 -0
  186. package/dist/forms/JBTimePickerField.js +35 -0
  187. package/dist/forms/index.d.ts +13 -0
  188. package/dist/forms/index.d.ts.map +1 -0
  189. package/dist/forms/index.js +12 -0
  190. package/dist/forms/rules.d.ts +16 -0
  191. package/dist/forms/rules.d.ts.map +1 -0
  192. package/dist/forms/rules.js +21 -0
  193. package/dist/forms/types.d.ts +12 -0
  194. package/dist/forms/types.d.ts.map +1 -0
  195. package/dist/forms/types.js +1 -0
  196. package/dist/forms/utils.d.ts +5 -0
  197. package/dist/forms/utils.d.ts.map +1 -0
  198. package/dist/forms/utils.js +7 -0
  199. package/dist/forms/zod.d.ts +4 -0
  200. package/dist/forms/zod.d.ts.map +1 -0
  201. package/dist/forms/zod.js +9 -0
  202. package/dist/grid/JBGrid.d.ts +3 -0
  203. package/dist/grid/JBGrid.d.ts.map +1 -0
  204. package/dist/grid/JBGrid.js +338 -0
  205. package/dist/grid/JBGridHeader.d.ts +3 -0
  206. package/dist/grid/JBGridHeader.d.ts.map +1 -0
  207. package/dist/grid/JBGridHeader.js +93 -0
  208. package/dist/grid/JBGridLoading.d.ts +9 -0
  209. package/dist/grid/JBGridLoading.d.ts.map +1 -0
  210. package/dist/grid/JBGridLoading.js +14 -0
  211. package/dist/grid/JBGridProviders.d.ts +13 -0
  212. package/dist/grid/JBGridProviders.d.ts.map +1 -0
  213. package/dist/grid/JBGridProviders.js +54 -0
  214. package/dist/grid/JBGridSkeleton.d.ts +7 -0
  215. package/dist/grid/JBGridSkeleton.d.ts.map +1 -0
  216. package/dist/grid/JBGridSkeleton.js +6 -0
  217. package/dist/grid/defaults.d.ts +4 -0
  218. package/dist/grid/defaults.d.ts.map +1 -0
  219. package/dist/grid/defaults.js +29 -0
  220. package/dist/grid/index.d.ts +8 -0
  221. package/dist/grid/index.d.ts.map +1 -0
  222. package/dist/grid/index.js +7 -0
  223. package/dist/grid/types.d.ts +197 -0
  224. package/dist/grid/types.d.ts.map +1 -0
  225. package/dist/grid/types.js +1 -0
  226. package/dist/hooks/index.d.ts +4 -0
  227. package/dist/hooks/index.d.ts.map +1 -0
  228. package/dist/hooks/index.js +3 -0
  229. package/dist/hooks/useJBDebouncedValue.d.ts +2 -0
  230. package/dist/hooks/useJBDebouncedValue.d.ts.map +1 -0
  231. package/dist/hooks/useJBDebouncedValue.js +11 -0
  232. package/dist/hooks/useJBEntityFormController.d.ts +54 -0
  233. package/dist/hooks/useJBEntityFormController.d.ts.map +1 -0
  234. package/dist/hooks/useJBEntityFormController.js +156 -0
  235. package/dist/hooks/useJBRedirect.d.ts +10 -0
  236. package/dist/hooks/useJBRedirect.d.ts.map +1 -0
  237. package/dist/hooks/useJBRedirect.js +11 -0
  238. package/dist/index.d.ts +9 -0
  239. package/dist/index.d.ts.map +1 -0
  240. package/dist/index.js +8 -0
  241. package/dist/query/createQueryClient.d.ts +8 -0
  242. package/dist/query/createQueryClient.d.ts.map +1 -0
  243. package/dist/query/createQueryClient.js +25 -0
  244. package/dist/query/http.d.ts +3 -0
  245. package/dist/query/http.d.ts.map +1 -0
  246. package/dist/query/http.js +12 -0
  247. package/dist/query/index.d.ts +4 -0
  248. package/dist/query/index.d.ts.map +1 -0
  249. package/dist/query/index.js +3 -0
  250. package/dist/query/types.d.ts +7 -0
  251. package/dist/query/types.d.ts.map +1 -0
  252. package/dist/query/types.js +1 -0
  253. package/dist/utils/errors.d.ts +10 -0
  254. package/dist/utils/errors.d.ts.map +1 -0
  255. package/dist/utils/errors.js +55 -0
  256. package/dist/utils/format.d.ts +4 -0
  257. package/dist/utils/format.d.ts.map +1 -0
  258. package/dist/utils/format.js +28 -0
  259. package/dist/utils/geo.d.ts +9 -0
  260. package/dist/utils/geo.d.ts.map +1 -0
  261. package/dist/utils/geo.js +186 -0
  262. package/dist/utils/index.d.ts +6 -0
  263. package/dist/utils/index.d.ts.map +1 -0
  264. package/dist/utils/index.js +5 -0
  265. package/dist/utils/query.d.ts +2 -0
  266. package/dist/utils/query.d.ts.map +1 -0
  267. package/dist/utils/query.js +4 -0
  268. package/dist/utils/regex.d.ts +7 -0
  269. package/dist/utils/regex.d.ts.map +1 -0
  270. package/dist/utils/regex.js +6 -0
  271. package/package.json +3 -1
@@ -0,0 +1,291 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useImperativeHandle, useMemo, useState } from 'react';
3
+ const FuseJwtAuthContext = createContext(undefined);
4
+ const asRecord = (value) => (value ?? {});
5
+ const isTokenValid = (token) => {
6
+ if (!token) {
7
+ return false;
8
+ }
9
+ try {
10
+ const payload = JSON.parse(atob(token.split('.')[1]));
11
+ return payload.exp > Date.now() / 1000;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ };
17
+ const normalizeUserShape = (userInput) => {
18
+ const user = asRecord(userInput);
19
+ const userData = asRecord(user.data);
20
+ const displayName = user.displayName ||
21
+ userData.displayName ||
22
+ [userData.firstName, userData.middleName, userData.lastName].filter(Boolean).join(' ') ||
23
+ 'User';
24
+ return {
25
+ id: (user.id || user.user_id || user.pk || userData.id || userData.user_id || userData.pk || '0'),
26
+ role: (user.role || user.roles || userData.role || userData.roles || ['admin']),
27
+ displayName,
28
+ photoURL: (user.photoURL || user.photoUrl || userData.photoURL || userData.photoUrl || ''),
29
+ email: (user.email || userData.email || ''),
30
+ shortcuts: (user.shortcuts || userData.shortcuts || []) || [],
31
+ settings: (user.settings || userData.settings || {}),
32
+ loginRedirectUrl: (user.loginRedirectUrl || userData.loginRedirectUrl || '/')
33
+ };
34
+ };
35
+ const getTokens = (data) => {
36
+ const tokens = asRecord(data.tokens);
37
+ const accessToken = (data.access_token || tokens.accessToken || tokens.access_token || data.access);
38
+ const refreshToken = (data.refresh_token || tokens.refreshToken || tokens.refresh_token || data.refresh || null);
39
+ return { accessToken, refreshToken };
40
+ };
41
+ const normalizeSession = (response) => {
42
+ const data = asRecord(response);
43
+ const { accessToken, refreshToken } = getTokens(data);
44
+ const user = normalizeUserShape(data.user);
45
+ if (!accessToken) {
46
+ throw new Error('Invalid auth response: missing access token');
47
+ }
48
+ return {
49
+ user,
50
+ accessToken,
51
+ refreshToken
52
+ };
53
+ };
54
+ export const createFuseJwtAuthProvider = (authClient) => {
55
+ function FuseJwtAuthProvider(props) {
56
+ const { ref, children, onAuthStateChanged } = props;
57
+ const [authState, setAuthState] = useState({
58
+ authStatus: 'configuring',
59
+ isAuthenticated: false,
60
+ user: null
61
+ });
62
+ useEffect(() => {
63
+ if (onAuthStateChanged) {
64
+ onAuthStateChanged(authState);
65
+ }
66
+ }, [authState, onAuthStateChanged]);
67
+ const signOut = useCallback(() => {
68
+ authClient.logout();
69
+ setAuthState({
70
+ authStatus: 'unauthenticated',
71
+ isAuthenticated: false,
72
+ user: null
73
+ });
74
+ }, []);
75
+ const refreshToken = useCallback(async () => {
76
+ try {
77
+ const response = await authClient.refreshToken();
78
+ return response.accessToken || null;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }, []);
84
+ useEffect(() => {
85
+ let isMounted = true;
86
+ const attemptAutoLogin = async () => {
87
+ let token = authClient.getAccessToken();
88
+ if (!isTokenValid(token)) {
89
+ token = await refreshToken();
90
+ }
91
+ if (!isTokenValid(token)) {
92
+ return false;
93
+ }
94
+ try {
95
+ authClient.setAccessToken(token);
96
+ const response = await authClient.getMe();
97
+ return normalizeUserShape(response.user);
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ };
103
+ if (!authState.isAuthenticated) {
104
+ attemptAutoLogin().then((userData) => {
105
+ if (!isMounted) {
106
+ return;
107
+ }
108
+ if (userData) {
109
+ setAuthState({
110
+ authStatus: 'authenticated',
111
+ isAuthenticated: true,
112
+ user: userData
113
+ });
114
+ }
115
+ else {
116
+ authClient.logout();
117
+ setAuthState({
118
+ authStatus: 'unauthenticated',
119
+ isAuthenticated: false,
120
+ user: null
121
+ });
122
+ }
123
+ });
124
+ }
125
+ return () => {
126
+ isMounted = false;
127
+ };
128
+ }, [authState.isAuthenticated, refreshToken]);
129
+ const signIn = useCallback(async (credentials) => {
130
+ const session = normalizeSession(await authClient.loginBasic({
131
+ login: credentials.login || credentials.username || '',
132
+ password: credentials.password,
133
+ client: 'web'
134
+ }));
135
+ setAuthState({
136
+ authStatus: 'authenticated',
137
+ isAuthenticated: true,
138
+ user: session.user
139
+ });
140
+ return {
141
+ user: session.user,
142
+ accessToken: session.accessToken,
143
+ refreshToken: session.refreshToken,
144
+ access_token: session.accessToken,
145
+ refresh_token: session.refreshToken
146
+ };
147
+ }, []);
148
+ const requestOtp = useCallback(async (payload) => authClient.requestOtp(payload), []);
149
+ const signInSocial = useCallback(async (payload) => {
150
+ const session = normalizeSession(await authClient.loginSocial({
151
+ ...payload,
152
+ client: payload.client ?? 'web'
153
+ }));
154
+ setAuthState({
155
+ authStatus: 'authenticated',
156
+ isAuthenticated: true,
157
+ user: session.user
158
+ });
159
+ return {
160
+ user: session.user,
161
+ accessToken: session.accessToken,
162
+ refreshToken: session.refreshToken,
163
+ access_token: session.accessToken,
164
+ refresh_token: session.refreshToken
165
+ };
166
+ }, []);
167
+ const signInSocialPrecheck = useCallback(async (payload) => authClient.loginSocialPrecheck({
168
+ ...payload,
169
+ client: payload.client ?? 'web'
170
+ }), []);
171
+ const signInOtp = useCallback(async (payload) => {
172
+ const session = normalizeSession(await authClient.verifyOtp({
173
+ ...payload,
174
+ client: payload.client ?? 'web'
175
+ }));
176
+ setAuthState({
177
+ authStatus: 'authenticated',
178
+ isAuthenticated: true,
179
+ user: session.user
180
+ });
181
+ return {
182
+ user: session.user,
183
+ accessToken: session.accessToken,
184
+ refreshToken: session.refreshToken,
185
+ access_token: session.accessToken,
186
+ refresh_token: session.refreshToken
187
+ };
188
+ }, []);
189
+ const signInMagicLink = useCallback(async (payload) => {
190
+ const session = normalizeSession(await authClient.consumeMagicLink({
191
+ ...payload,
192
+ client: payload.client ?? 'web'
193
+ }));
194
+ setAuthState({
195
+ authStatus: 'authenticated',
196
+ isAuthenticated: true,
197
+ user: session.user
198
+ });
199
+ return {
200
+ user: session.user,
201
+ accessToken: session.accessToken,
202
+ refreshToken: session.refreshToken,
203
+ access_token: session.accessToken,
204
+ refresh_token: session.refreshToken
205
+ };
206
+ }, []);
207
+ const signUp = useCallback(async (payload) => {
208
+ const response = await authClient.register(payload);
209
+ return response;
210
+ }, []);
211
+ const requestPasswordReset = useCallback(async (payload) => authClient.requestPasswordReset(payload), []);
212
+ const confirmAccountEmail = useCallback(async (payload) => authClient.confirmAccountEmail(payload), []);
213
+ const resendAccountConfirmation = useCallback(async (payload) => authClient.resendAccountConfirmation(payload), []);
214
+ const confirmPasswordReset = useCallback(async (payload) => authClient.confirmPasswordReset(payload), []);
215
+ const changePassword = useCallback(async (payload) => authClient.changePassword(payload), []);
216
+ const switchProfile = useCallback(async (profileId) => {
217
+ const session = normalizeSession(await authClient.switchProfile({
218
+ profile: profileId,
219
+ client: 'web'
220
+ }));
221
+ setAuthState({
222
+ authStatus: 'authenticated',
223
+ isAuthenticated: true,
224
+ user: session.user
225
+ });
226
+ return {
227
+ user: session.user,
228
+ accessToken: session.accessToken,
229
+ refreshToken: session.refreshToken,
230
+ access_token: session.accessToken,
231
+ refresh_token: session.refreshToken
232
+ };
233
+ }, []);
234
+ const getProfiles = useCallback(async () => {
235
+ const response = await authClient.getProfiles();
236
+ if (Array.isArray(response)) {
237
+ return response;
238
+ }
239
+ return (response.results ?? []);
240
+ }, []);
241
+ const contextValue = useMemo(() => ({
242
+ ...authState,
243
+ signIn,
244
+ signInSocial,
245
+ signInSocialPrecheck,
246
+ requestOtp,
247
+ signInOtp,
248
+ signInMagicLink,
249
+ signUp,
250
+ confirmAccountEmail,
251
+ resendAccountConfirmation,
252
+ requestPasswordReset,
253
+ confirmPasswordReset,
254
+ changePassword,
255
+ switchProfile,
256
+ getProfiles,
257
+ signOut,
258
+ refreshToken
259
+ }), [
260
+ authState,
261
+ signIn,
262
+ signInSocial,
263
+ signInSocialPrecheck,
264
+ requestOtp,
265
+ signInOtp,
266
+ signInMagicLink,
267
+ signUp,
268
+ confirmAccountEmail,
269
+ resendAccountConfirmation,
270
+ requestPasswordReset,
271
+ confirmPasswordReset,
272
+ changePassword,
273
+ switchProfile,
274
+ getProfiles,
275
+ signOut,
276
+ refreshToken
277
+ ]);
278
+ useImperativeHandle(ref, () => ({
279
+ signOut
280
+ }));
281
+ return _jsx(FuseJwtAuthContext.Provider, { value: contextValue, children: children });
282
+ }
283
+ return FuseJwtAuthProvider;
284
+ };
285
+ export const useFuseJwtAuth = () => {
286
+ const context = useContext(FuseJwtAuthContext);
287
+ if (!context) {
288
+ throw new Error('useFuseJwtAuth must be used within createFuseJwtAuthProvider provider');
289
+ }
290
+ return context;
291
+ };
@@ -0,0 +1,74 @@
1
+ import React, { ReactNode } from 'react';
2
+ import { AuthClient } from '../client';
3
+ export type FuseUser = {
4
+ id: string;
5
+ role: string[] | string | null;
6
+ displayName: string;
7
+ photoURL?: string;
8
+ email?: string;
9
+ shortcuts?: string[];
10
+ settings?: Record<string, unknown>;
11
+ loginRedirectUrl?: string;
12
+ };
13
+ export declare const fuseAuthRoles: {
14
+ readonly admin: readonly ["admin"];
15
+ readonly staff: readonly ["admin", "staff"];
16
+ readonly user: readonly ["admin", "staff", "user"];
17
+ readonly onlyGuest: readonly [];
18
+ };
19
+ export type FuseAuthRolesMap = Record<string, string[]>;
20
+ type FuseProfileRoleLike = {
21
+ value?: string | null;
22
+ };
23
+ type FuseJBWebConfigLike = {
24
+ auth?: {
25
+ profileRoles?: FuseProfileRoleLike[] | null;
26
+ } | null;
27
+ };
28
+ export declare function createFuseAuthRoles(customRoles?: FuseAuthRolesMap): FuseAuthRolesMap;
29
+ export declare function resolveAuthenticatedAuthRoles(jbWebConfig?: FuseJBWebConfigLike, fallbackAuthenticatedRoles?: string[]): string[];
30
+ export declare function createFuseAuthRolesFromJBWebConfig(jbWebConfig?: FuseJBWebConfigLike, customRoles?: FuseAuthRolesMap, options?: {
31
+ authenticatedRoleKey?: string;
32
+ fallbackAuthenticatedRoles?: string[];
33
+ }): FuseAuthRolesMap;
34
+ export declare function createFuseUserModel<TUser extends FuseUser>(): (data?: Partial<TUser>) => TUser;
35
+ type CreateFuseUseUserOptions<TUser extends FuseUser> = {
36
+ useAuth: () => {
37
+ authState: {
38
+ user: TUser | null;
39
+ } | null;
40
+ signOut: () => void;
41
+ updateUser: (updates: Partial<TUser>) => Promise<Response>;
42
+ };
43
+ setIn: (obj: unknown, path: string, value: unknown) => unknown;
44
+ };
45
+ export declare function createFuseUseUser<TUser extends FuseUser>(options: CreateFuseUseUserOptions<TUser>): () => {
46
+ data: TUser;
47
+ isGuest: boolean;
48
+ signOut: () => Promise<void>;
49
+ updateUser: (data: Partial<TUser>) => Promise<TUser>;
50
+ updateUserSettings: (newSettings: TUser["settings"]) => Promise<Record<string, unknown> | undefined>;
51
+ };
52
+ export declare function createWithUser<TProps extends object, TUserHookReturn>(useUserHook: () => TUserHookReturn): (Component: React.ComponentType<TProps & TUserHookReturn>) => (props: TProps) => import("react/jsx-runtime").JSX.Element;
53
+ type CreateFuseAuthenticationOptions<TUser extends FuseUser> = {
54
+ authClient: AuthClient;
55
+ FuseAuthProvider: React.ComponentType<{
56
+ providers: Array<{
57
+ name: string;
58
+ Provider: React.ComponentType<any> | React.ForwardRefExoticComponent<any>;
59
+ }>;
60
+ children: (authState: {
61
+ user?: TUser | null;
62
+ } | null) => ReactNode;
63
+ }>;
64
+ FuseAuthorization: React.ComponentType<{
65
+ userRole: TUser['role'] | undefined;
66
+ children: ReactNode;
67
+ }>;
68
+ providerName?: string;
69
+ };
70
+ export declare function createFuseAuthentication<TUser extends FuseUser>(options: CreateFuseAuthenticationOptions<TUser>): (props: {
71
+ children: ReactNode;
72
+ }) => import("react/jsx-runtime").JSX.Element;
73
+ export {};
74
+ //# sourceMappingURL=fuseIntegration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuseIntegration.d.ts","sourceRoot":"","sources":["../../../src/auth/fuse/fuseIntegration.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { createFuseJwtAuthProvider } from './fuseAdapter';
4
+ const isEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
5
+ export const fuseAuthRoles = {
6
+ admin: ['admin'],
7
+ staff: ['admin', 'staff'],
8
+ user: ['admin', 'staff', 'user'],
9
+ onlyGuest: []
10
+ };
11
+ export function createFuseAuthRoles(customRoles) {
12
+ const mergedRoles = Object.entries(fuseAuthRoles).reduce((accumulator, [roleKey, roleValues]) => {
13
+ accumulator[roleKey] = [...roleValues];
14
+ return accumulator;
15
+ }, {});
16
+ if (!customRoles) {
17
+ return mergedRoles;
18
+ }
19
+ Object.entries(customRoles).forEach(([roleKey, roleValues]) => {
20
+ const normalizedRoleValues = Array.from(new Set(roleValues ?? []));
21
+ if (!mergedRoles[roleKey]) {
22
+ mergedRoles[roleKey] = normalizedRoleValues;
23
+ return;
24
+ }
25
+ mergedRoles[roleKey] = Array.from(new Set([...mergedRoles[roleKey], ...normalizedRoleValues]));
26
+ });
27
+ return mergedRoles;
28
+ }
29
+ export function resolveAuthenticatedAuthRoles(jbWebConfig, fallbackAuthenticatedRoles = ['admin', 'staff', 'doctor', 'patient']) {
30
+ const configuredAuthenticatedAuthRoles = (jbWebConfig?.auth?.profileRoles ?? [])
31
+ .map((profileRole) => String(profileRole?.value ?? '').trim().toLowerCase())
32
+ .filter(Boolean);
33
+ const source = configuredAuthenticatedAuthRoles.length
34
+ ? configuredAuthenticatedAuthRoles
35
+ : fallbackAuthenticatedRoles;
36
+ return Array.from(new Set(source));
37
+ }
38
+ export function createFuseAuthRolesFromJBWebConfig(jbWebConfig, customRoles, options) {
39
+ const authenticatedRoleKey = options?.authenticatedRoleKey ?? 'authenticated';
40
+ const fallbackAuthenticatedRoles = options?.fallbackAuthenticatedRoles ?? ['admin', 'staff', 'doctor', 'patient'];
41
+ const authenticatedAuthRoles = resolveAuthenticatedAuthRoles(jbWebConfig, fallbackAuthenticatedRoles);
42
+ return createFuseAuthRoles({
43
+ ...(customRoles ?? {}),
44
+ [authenticatedRoleKey]: authenticatedAuthRoles
45
+ });
46
+ }
47
+ export function createFuseUserModel() {
48
+ return (data) => {
49
+ const userData = data || {};
50
+ return {
51
+ id: null,
52
+ role: null,
53
+ displayName: null,
54
+ photoURL: '',
55
+ email: '',
56
+ shortcuts: [],
57
+ settings: {},
58
+ loginRedirectUrl: '/',
59
+ ...userData
60
+ };
61
+ };
62
+ }
63
+ export function createFuseUseUser(options) {
64
+ const { useAuth, setIn } = options;
65
+ return function useUser() {
66
+ const { authState, signOut, updateUser } = useAuth();
67
+ const user = authState?.user;
68
+ const isGuest = useMemo(() => !user?.role || user?.role?.length === 0, [user]);
69
+ async function handleUpdateUser(data) {
70
+ const response = await updateUser(data);
71
+ if (!response.ok) {
72
+ throw new Error('Failed to update user');
73
+ }
74
+ const updatedUser = (await response.json());
75
+ return updatedUser;
76
+ }
77
+ async function handleUpdateUserSettings(newSettings) {
78
+ const newUser = setIn(user, 'settings', newSettings);
79
+ if (isEqual(user, newUser)) {
80
+ return undefined;
81
+ }
82
+ const updatedUser = await handleUpdateUser(newUser);
83
+ return updatedUser?.settings;
84
+ }
85
+ async function handleSignOut() {
86
+ return signOut();
87
+ }
88
+ return {
89
+ data: user,
90
+ isGuest,
91
+ signOut: handleSignOut,
92
+ updateUser: handleUpdateUser,
93
+ updateUserSettings: handleUpdateUserSettings
94
+ };
95
+ };
96
+ }
97
+ export function createWithUser(useUserHook) {
98
+ return function withUser(Component) {
99
+ return function WrappedComponent(props) {
100
+ const userProps = useUserHook();
101
+ return (_jsx(Component, { ...props, ...userProps }));
102
+ };
103
+ };
104
+ }
105
+ export function createFuseAuthentication(options) {
106
+ const { authClient, FuseAuthProvider, FuseAuthorization, providerName = 'jb-jwt' } = options;
107
+ const JwtProvider = createFuseJwtAuthProvider(authClient);
108
+ const providers = [
109
+ {
110
+ name: providerName,
111
+ Provider: JwtProvider
112
+ }
113
+ ];
114
+ return function Authentication(props) {
115
+ const { children } = props;
116
+ return (_jsx(FuseAuthProvider, { providers: providers, children: (authState) => {
117
+ const userRole = authState?.user?.role;
118
+ return _jsx(FuseAuthorization, { userRole: userRole, children: children });
119
+ } }));
120
+ };
121
+ }
@@ -0,0 +1,4 @@
1
+ export * from './createFuseAuthViews';
2
+ export * from './fuseAdapter';
3
+ export * from './fuseIntegration';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/fuse/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './createFuseAuthViews';
2
+ export * from './fuseAdapter';
3
+ export * from './fuseIntegration';
@@ -0,0 +1,11 @@
1
+ export * from './types';
2
+ export * from './storage';
3
+ export * from './client';
4
+ export * from './provider';
5
+ export * from './routes';
6
+ export * from './fuse';
7
+ export * from './ui';
8
+ export * from './query';
9
+ export * from './forms';
10
+ export * from './constants';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './types';
2
+ export * from './storage';
3
+ export * from './client';
4
+ export * from './provider';
5
+ export * from './routes';
6
+ export * from './fuse';
7
+ export * from './ui';
8
+ export * from './query';
9
+ export * from './forms';
10
+ export * from './constants';
@@ -0,0 +1,35 @@
1
+ import { ReactNode } from 'react';
2
+ import { AuthClient } from './client';
3
+ import { AccountConfirmationPayload, AccountConfirmationResendPayload, ApiDetailResponse, LoginBasicPayload, PasswordChangePayload, PasswordResetConfirmPayload, PasswordResetRequestPayload, ProfilesResponse, RegisterPayload, RequestOtpPayload, SwitchProfilePayload, VerifyOtpPayload } from './types';
4
+ export type JBAuthStatus = 'configuring' | 'authenticated' | 'unauthenticated';
5
+ export type JBAuthContextValue = {
6
+ authStatus: JBAuthStatus;
7
+ isAuthenticated: boolean;
8
+ user: unknown | null;
9
+ signIn: (payload: LoginBasicPayload) => Promise<unknown>;
10
+ signUp: (payload: RegisterPayload) => Promise<ApiDetailResponse>;
11
+ confirmAccountEmail: (payload: AccountConfirmationPayload) => Promise<ApiDetailResponse>;
12
+ resendAccountConfirmation: (payload: AccountConfirmationResendPayload) => Promise<ApiDetailResponse>;
13
+ signInOtp: (payload: VerifyOtpPayload) => Promise<unknown>;
14
+ requestOtp: (payload: RequestOtpPayload) => Promise<Record<string, unknown>>;
15
+ requestPasswordReset: (payload: PasswordResetRequestPayload) => Promise<Record<string, unknown>>;
16
+ confirmPasswordReset: (payload: PasswordResetConfirmPayload) => Promise<Record<string, unknown>>;
17
+ changePassword: (payload: PasswordChangePayload) => Promise<Record<string, unknown>>;
18
+ getProfiles: () => Promise<ProfilesResponse>;
19
+ switchProfile: (payload: SwitchProfilePayload) => Promise<unknown>;
20
+ signOut: () => void;
21
+ refreshToken: () => Promise<string | null>;
22
+ };
23
+ type JBAuthProviderProps = {
24
+ authClient: AuthClient;
25
+ children: ReactNode;
26
+ onAuthStateChanged?: (state: {
27
+ authStatus: JBAuthStatus;
28
+ isAuthenticated: boolean;
29
+ user: unknown | null;
30
+ }) => void;
31
+ };
32
+ export declare function JBAuthProvider(props: JBAuthProviderProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function useJBAuth(): JBAuthContextValue;
34
+ export {};
35
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/auth/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAyD,MAAM,OAAO,CAAC;AAExG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAE/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,YAAY,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjE,mBAAmB,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzF,yBAAyB,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrG,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,UAAU,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7E,oBAAoB,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjG,oBAAoB,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjG,cAAc,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrF,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5C,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC3B,UAAU,EAAE,YAAY,CAAC;QACzB,eAAe,EAAE,OAAO,CAAC;QACzB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ,CAAC;AAeF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAmKxD;AAED,wBAAgB,SAAS,uBAMxB"}