@joelbarron/react-web-dev-kit 0.1.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/README.md +236 -0
- package/dist/auth/client.d.ts +44 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +354 -0
- package/dist/auth/constants/countryCallingCodes.d.ts +9 -0
- package/dist/auth/constants/countryCallingCodes.d.ts.map +1 -0
- package/dist/auth/constants/countryCallingCodes.js +209 -0
- package/dist/auth/constants/gender.d.ts +9 -0
- package/dist/auth/constants/gender.d.ts.map +1 -0
- package/dist/auth/constants/gender.js +12 -0
- package/dist/auth/constants/index.d.ts +3 -0
- package/dist/auth/constants/index.d.ts.map +1 -0
- package/dist/auth/constants/index.js +2 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts +18 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.d.ts.map +1 -0
- package/dist/auth/forms/account/AuthAccountConfirmationForm.js +166 -0
- package/dist/auth/forms/account/index.d.ts +2 -0
- package/dist/auth/forms/account/index.d.ts.map +1 -0
- package/dist/auth/forms/account/index.js +1 -0
- package/dist/auth/forms/errorParser.d.ts +7 -0
- package/dist/auth/forms/errorParser.d.ts.map +1 -0
- package/dist/auth/forms/errorParser.js +65 -0
- package/dist/auth/forms/index.d.ts +6 -0
- package/dist/auth/forms/index.d.ts.map +1 -0
- package/dist/auth/forms/index.js +5 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts +12 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthForgotPasswordForm.js +71 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts +15 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthPasswordResetConfirmForm.js +88 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.d.ts +12 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.d.ts.map +1 -0
- package/dist/auth/forms/password/AuthResetPasswordForm.js +18 -0
- package/dist/auth/forms/password/index.d.ts +4 -0
- package/dist/auth/forms/password/index.d.ts.map +1 -0
- package/dist/auth/forms/password/index.js +3 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts +24 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/AuthOtpSignInForm.js +226 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts +21 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/AuthPasswordSignInForm.js +120 -0
- package/dist/auth/forms/sign-in/index.d.ts +3 -0
- package/dist/auth/forms/sign-in/index.d.ts.map +1 -0
- package/dist/auth/forms/sign-in/index.js +2 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts +36 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.d.ts.map +1 -0
- package/dist/auth/forms/sign-up/AuthSignUpForm.js +164 -0
- package/dist/auth/forms/sign-up/index.d.ts +2 -0
- package/dist/auth/forms/sign-up/index.d.ts.map +1 -0
- package/dist/auth/forms/sign-up/index.js +1 -0
- package/dist/auth/fuse/createFuseAuthViews.d.ts +24 -0
- package/dist/auth/fuse/createFuseAuthViews.d.ts.map +1 -0
- package/dist/auth/fuse/createFuseAuthViews.js +360 -0
- package/dist/auth/fuse/fuseAdapter.d.ts +40 -0
- package/dist/auth/fuse/fuseAdapter.d.ts.map +1 -0
- package/dist/auth/fuse/fuseAdapter.js +265 -0
- package/dist/auth/fuse/fuseIntegration.d.ts +59 -0
- package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -0
- package/dist/auth/fuse/fuseIntegration.js +85 -0
- package/dist/auth/fuse/index.d.ts +4 -0
- package/dist/auth/fuse/index.d.ts.map +1 -0
- package/dist/auth/fuse/index.js +3 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/provider.d.ts +35 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +133 -0
- package/dist/auth/query.d.ts +23 -0
- package/dist/auth/query.d.ts.map +1 -0
- package/dist/auth/query.js +103 -0
- package/dist/auth/routes.d.ts +37 -0
- package/dist/auth/routes.d.ts.map +1 -0
- package/dist/auth/routes.js +73 -0
- package/dist/auth/social/providerAuth.d.ts +76 -0
- package/dist/auth/social/providerAuth.d.ts.map +1 -0
- package/dist/auth/social/providerAuth.js +130 -0
- package/dist/auth/storage.d.ts +3 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +20 -0
- package/dist/auth/types.d.ts +208 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +1 -0
- package/dist/auth/ui/AuthPagesMessageSection.d.ts +3 -0
- package/dist/auth/ui/AuthPagesMessageSection.d.ts.map +1 -0
- package/dist/auth/ui/AuthPagesMessageSection.js +39 -0
- package/dist/auth/ui/AuthPrimaryButton.d.ts +9 -0
- package/dist/auth/ui/AuthPrimaryButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthPrimaryButton.js +19 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.d.ts +14 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.d.ts.map +1 -0
- package/dist/auth/ui/AuthRoleSelectionDialog.js +39 -0
- package/dist/auth/ui/AuthRoutePageWrapper.d.ts +12 -0
- package/dist/auth/ui/AuthRoutePageWrapper.d.ts.map +1 -0
- package/dist/auth/ui/AuthRoutePageWrapper.js +59 -0
- package/dist/auth/ui/AuthSecondaryButton.d.ts +7 -0
- package/dist/auth/ui/AuthSecondaryButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthSecondaryButton.js +18 -0
- package/dist/auth/ui/AuthSocialProviderButton.d.ts +11 -0
- package/dist/auth/ui/AuthSocialProviderButton.d.ts.map +1 -0
- package/dist/auth/ui/AuthSocialProviderButton.js +30 -0
- package/dist/auth/ui/SignInPageTitle.d.ts +6 -0
- package/dist/auth/ui/SignInPageTitle.d.ts.map +1 -0
- package/dist/auth/ui/SignInPageTitle.js +7 -0
- package/dist/auth/ui/SignOutPageTitle.d.ts +6 -0
- package/dist/auth/ui/SignOutPageTitle.d.ts.map +1 -0
- package/dist/auth/ui/SignOutPageTitle.js +7 -0
- package/dist/auth/ui/SignUpPageTitle.d.ts +6 -0
- package/dist/auth/ui/SignUpPageTitle.d.ts.map +1 -0
- package/dist/auth/ui/SignUpPageTitle.js +7 -0
- package/dist/auth/ui/index.d.ts +11 -0
- package/dist/auth/ui/index.d.ts.map +1 -0
- package/dist/auth/ui/index.js +10 -0
- package/dist/auth/ui/types.d.ts +15 -0
- package/dist/auth/ui/types.d.ts.map +1 -0
- package/dist/auth/ui/types.js +1 -0
- package/dist/config/createConfig.d.ts +13 -0
- package/dist/config/createConfig.d.ts.map +1 -0
- package/dist/config/createConfig.js +104 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +38 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/merge.d.ts +2 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +18 -0
- package/dist/config/types.d.ts +46 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/forms/JBCheckboxField.d.ts +12 -0
- package/dist/forms/JBCheckboxField.d.ts.map +1 -0
- package/dist/forms/JBCheckboxField.js +36 -0
- package/dist/forms/JBDatePickerField.d.ts +12 -0
- package/dist/forms/JBDatePickerField.d.ts.map +1 -0
- package/dist/forms/JBDatePickerField.js +14 -0
- package/dist/forms/JBRadioGroupField.d.ts +10 -0
- package/dist/forms/JBRadioGroupField.d.ts.map +1 -0
- package/dist/forms/JBRadioGroupField.js +8 -0
- package/dist/forms/JBSelectField.d.ts +9 -0
- package/dist/forms/JBSelectField.d.ts.map +1 -0
- package/dist/forms/JBSelectField.js +8 -0
- package/dist/forms/JBSwitchField.d.ts +11 -0
- package/dist/forms/JBSwitchField.d.ts.map +1 -0
- package/dist/forms/JBSwitchField.js +10 -0
- package/dist/forms/JBTextField.d.ts +6 -0
- package/dist/forms/JBTextField.d.ts.map +1 -0
- package/dist/forms/JBTextField.js +8 -0
- package/dist/forms/JBTimePickerField.d.ts +12 -0
- package/dist/forms/JBTimePickerField.d.ts.map +1 -0
- package/dist/forms/JBTimePickerField.js +14 -0
- package/dist/forms/index.d.ts +11 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +10 -0
- package/dist/forms/rules.d.ts +16 -0
- package/dist/forms/rules.d.ts.map +1 -0
- package/dist/forms/rules.js +21 -0
- package/dist/forms/types.d.ts +12 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +1 -0
- package/dist/forms/utils.d.ts +5 -0
- package/dist/forms/utils.d.ts.map +1 -0
- package/dist/forms/utils.js +7 -0
- package/dist/grid/JBGrid.d.ts +3 -0
- package/dist/grid/JBGrid.d.ts.map +1 -0
- package/dist/grid/JBGrid.js +89 -0
- package/dist/grid/JBGridHeader.d.ts +3 -0
- package/dist/grid/JBGridHeader.d.ts.map +1 -0
- package/dist/grid/JBGridHeader.js +22 -0
- package/dist/grid/JBGridProviders.d.ts +10 -0
- package/dist/grid/JBGridProviders.d.ts.map +1 -0
- package/dist/grid/JBGridProviders.js +31 -0
- package/dist/grid/index.d.ts +5 -0
- package/dist/grid/index.d.ts.map +1 -0
- package/dist/grid/index.js +4 -0
- package/dist/grid/types.d.ts +81 -0
- package/dist/grid/types.d.ts.map +1 -0
- package/dist/grid/types.js +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useJBDebouncedValue.d.ts +2 -0
- package/dist/hooks/useJBDebouncedValue.d.ts.map +1 -0
- package/dist/hooks/useJBDebouncedValue.js +11 -0
- package/dist/hooks/useJBRedirect.d.ts +10 -0
- package/dist/hooks/useJBRedirect.d.ts.map +1 -0
- package/dist/hooks/useJBRedirect.js +11 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/query/createQueryClient.d.ts +8 -0
- package/dist/query/createQueryClient.d.ts.map +1 -0
- package/dist/query/createQueryClient.js +25 -0
- package/dist/query/http.d.ts +3 -0
- package/dist/query/http.d.ts.map +1 -0
- package/dist/query/http.js +12 -0
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +2 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +28 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/query.d.ts +2 -0
- package/dist/utils/query.d.ts.map +1 -0
- package/dist/utils/query.js +4 -0
- package/dist/utils/regex.d.ts +7 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/regex.js +6 -0
- package/package.json +85 -0
|
@@ -0,0 +1,265 @@
|
|
|
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 signInOtp = useCallback(async (payload) => {
|
|
168
|
+
const session = normalizeSession(await authClient.verifyOtp({
|
|
169
|
+
...payload,
|
|
170
|
+
client: payload.client ?? 'web'
|
|
171
|
+
}));
|
|
172
|
+
setAuthState({
|
|
173
|
+
authStatus: 'authenticated',
|
|
174
|
+
isAuthenticated: true,
|
|
175
|
+
user: session.user
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
user: session.user,
|
|
179
|
+
accessToken: session.accessToken,
|
|
180
|
+
refreshToken: session.refreshToken,
|
|
181
|
+
access_token: session.accessToken,
|
|
182
|
+
refresh_token: session.refreshToken
|
|
183
|
+
};
|
|
184
|
+
}, []);
|
|
185
|
+
const signUp = useCallback(async (payload) => {
|
|
186
|
+
const response = await authClient.register(payload);
|
|
187
|
+
return response;
|
|
188
|
+
}, []);
|
|
189
|
+
const requestPasswordReset = useCallback(async (payload) => authClient.requestPasswordReset(payload), []);
|
|
190
|
+
const confirmAccountEmail = useCallback(async (payload) => authClient.confirmAccountEmail(payload), []);
|
|
191
|
+
const resendAccountConfirmation = useCallback(async (payload) => authClient.resendAccountConfirmation(payload), []);
|
|
192
|
+
const confirmPasswordReset = useCallback(async (payload) => authClient.confirmPasswordReset(payload), []);
|
|
193
|
+
const changePassword = useCallback(async (payload) => authClient.changePassword(payload), []);
|
|
194
|
+
const switchProfile = useCallback(async (profileId) => {
|
|
195
|
+
const session = normalizeSession(await authClient.switchProfile({
|
|
196
|
+
profile: profileId,
|
|
197
|
+
client: 'web'
|
|
198
|
+
}));
|
|
199
|
+
setAuthState({
|
|
200
|
+
authStatus: 'authenticated',
|
|
201
|
+
isAuthenticated: true,
|
|
202
|
+
user: session.user
|
|
203
|
+
});
|
|
204
|
+
return {
|
|
205
|
+
user: session.user,
|
|
206
|
+
accessToken: session.accessToken,
|
|
207
|
+
refreshToken: session.refreshToken,
|
|
208
|
+
access_token: session.accessToken,
|
|
209
|
+
refresh_token: session.refreshToken
|
|
210
|
+
};
|
|
211
|
+
}, []);
|
|
212
|
+
const getProfiles = useCallback(async () => {
|
|
213
|
+
const response = await authClient.getProfiles();
|
|
214
|
+
if (Array.isArray(response)) {
|
|
215
|
+
return response;
|
|
216
|
+
}
|
|
217
|
+
return (response.results ?? []);
|
|
218
|
+
}, []);
|
|
219
|
+
const contextValue = useMemo(() => ({
|
|
220
|
+
...authState,
|
|
221
|
+
signIn,
|
|
222
|
+
signInSocial,
|
|
223
|
+
requestOtp,
|
|
224
|
+
signInOtp,
|
|
225
|
+
signUp,
|
|
226
|
+
confirmAccountEmail,
|
|
227
|
+
resendAccountConfirmation,
|
|
228
|
+
requestPasswordReset,
|
|
229
|
+
confirmPasswordReset,
|
|
230
|
+
changePassword,
|
|
231
|
+
switchProfile,
|
|
232
|
+
getProfiles,
|
|
233
|
+
signOut,
|
|
234
|
+
refreshToken
|
|
235
|
+
}), [
|
|
236
|
+
authState,
|
|
237
|
+
signIn,
|
|
238
|
+
signInSocial,
|
|
239
|
+
requestOtp,
|
|
240
|
+
signInOtp,
|
|
241
|
+
signUp,
|
|
242
|
+
confirmAccountEmail,
|
|
243
|
+
resendAccountConfirmation,
|
|
244
|
+
requestPasswordReset,
|
|
245
|
+
confirmPasswordReset,
|
|
246
|
+
changePassword,
|
|
247
|
+
switchProfile,
|
|
248
|
+
getProfiles,
|
|
249
|
+
signOut,
|
|
250
|
+
refreshToken
|
|
251
|
+
]);
|
|
252
|
+
useImperativeHandle(ref, () => ({
|
|
253
|
+
signOut
|
|
254
|
+
}));
|
|
255
|
+
return _jsx(FuseJwtAuthContext.Provider, { value: contextValue, children: children });
|
|
256
|
+
}
|
|
257
|
+
return FuseJwtAuthProvider;
|
|
258
|
+
};
|
|
259
|
+
export const useFuseJwtAuth = () => {
|
|
260
|
+
const context = useContext(FuseJwtAuthContext);
|
|
261
|
+
if (!context) {
|
|
262
|
+
throw new Error('useFuseJwtAuth must be used within createFuseJwtAuthProvider provider');
|
|
263
|
+
}
|
|
264
|
+
return context;
|
|
265
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
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 declare function createFuseUserModel<TUser extends FuseUser>(): (data?: Partial<TUser>) => TUser;
|
|
20
|
+
type CreateFuseUseUserOptions<TUser extends FuseUser> = {
|
|
21
|
+
useAuth: () => {
|
|
22
|
+
authState: {
|
|
23
|
+
user: TUser | null;
|
|
24
|
+
} | null;
|
|
25
|
+
signOut: () => void;
|
|
26
|
+
updateUser: (updates: Partial<TUser>) => Promise<Response>;
|
|
27
|
+
};
|
|
28
|
+
setIn: (obj: unknown, path: string, value: unknown) => unknown;
|
|
29
|
+
};
|
|
30
|
+
export declare function createFuseUseUser<TUser extends FuseUser>(options: CreateFuseUseUserOptions<TUser>): () => {
|
|
31
|
+
data: TUser;
|
|
32
|
+
isGuest: boolean;
|
|
33
|
+
signOut: () => Promise<void>;
|
|
34
|
+
updateUser: (data: Partial<TUser>) => Promise<TUser>;
|
|
35
|
+
updateUserSettings: (newSettings: TUser["settings"]) => Promise<Record<string, unknown> | undefined>;
|
|
36
|
+
};
|
|
37
|
+
export declare function createWithUser<TProps extends object, TUserHookReturn>(useUserHook: () => TUserHookReturn): (Component: React.ComponentType<TProps & TUserHookReturn>) => (props: TProps) => import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
type CreateFuseAuthenticationOptions<TUser extends FuseUser> = {
|
|
39
|
+
authClient: AuthClient;
|
|
40
|
+
FuseAuthProvider: React.ComponentType<{
|
|
41
|
+
providers: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
Provider: React.ComponentType<any> | React.ForwardRefExoticComponent<any>;
|
|
44
|
+
}>;
|
|
45
|
+
children: (authState: {
|
|
46
|
+
user?: TUser | null;
|
|
47
|
+
} | null) => ReactNode;
|
|
48
|
+
}>;
|
|
49
|
+
FuseAuthorization: React.ComponentType<{
|
|
50
|
+
userRole: TUser['role'] | undefined;
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}>;
|
|
53
|
+
providerName?: string;
|
|
54
|
+
};
|
|
55
|
+
export declare function createFuseAuthentication<TUser extends FuseUser>(options: CreateFuseAuthenticationOptions<TUser>): (props: {
|
|
56
|
+
children: ReactNode;
|
|
57
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=fuseIntegration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuseIntegration.d.ts","sourceRoot":"","sources":["../../../src/auth/fuse/fuseIntegration.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAW,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAKvC,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,QAAQ,MAChD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAG,KAAK,CAetC;AAED,KAAK,wBAAwB,CAAC,KAAK,SAAS,QAAQ,IAAI;IACtD,OAAO,EAAE,MAAM;QACb,SAAS,EAAE;YAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,CAAC;QACzC,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC5D,CAAC;IACF,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAChE,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,QAAQ,EAAE,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC;;;;uBAQxD,OAAO,CAAC,KAAK,CAAC;sCAWC,KAAK,CAAC,UAAU,CAAC;EAuBzE;AAED,wBAAgB,cAAc,CAAC,MAAM,SAAS,MAAM,EAAE,eAAe,EACnE,WAAW,EAAE,MAAM,eAAe,IAET,WAAW,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,eAAe,CAAC,MAC9C,OAAO,MAAM,6CAUjD;AAED,KAAK,+BAA+B,CAAC,KAAK,SAAS,QAAQ,IAAI;IAC7D,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC;QACpC,SAAS,EAAE,KAAK,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;SAC3E,CAAC,CAAC;QACH,QAAQ,EAAE,CAAC,SAAS,EAAE;YAAE,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,KAAK,SAAS,CAAC;KACpE,CAAC,CAAC;IACH,iBAAiB,EAAE,KAAK,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QACpC,QAAQ,EAAE,SAAS,CAAC;KACrB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,QAAQ,EAAE,OAAO,EAAE,+BAA+B,CAAC,KAAK,CAAC,IAW/E,OAAO;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,6CAY9D"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 createFuseUserModel() {
|
|
12
|
+
return (data) => {
|
|
13
|
+
const userData = data || {};
|
|
14
|
+
return {
|
|
15
|
+
id: null,
|
|
16
|
+
role: null,
|
|
17
|
+
displayName: null,
|
|
18
|
+
photoURL: '',
|
|
19
|
+
email: '',
|
|
20
|
+
shortcuts: [],
|
|
21
|
+
settings: {},
|
|
22
|
+
loginRedirectUrl: '/',
|
|
23
|
+
...userData
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function createFuseUseUser(options) {
|
|
28
|
+
const { useAuth, setIn } = options;
|
|
29
|
+
return function useUser() {
|
|
30
|
+
const { authState, signOut, updateUser } = useAuth();
|
|
31
|
+
const user = authState?.user;
|
|
32
|
+
const isGuest = useMemo(() => !user?.role || user?.role?.length === 0, [user]);
|
|
33
|
+
async function handleUpdateUser(data) {
|
|
34
|
+
const response = await updateUser(data);
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
throw new Error('Failed to update user');
|
|
37
|
+
}
|
|
38
|
+
const updatedUser = (await response.json());
|
|
39
|
+
return updatedUser;
|
|
40
|
+
}
|
|
41
|
+
async function handleUpdateUserSettings(newSettings) {
|
|
42
|
+
const newUser = setIn(user, 'settings', newSettings);
|
|
43
|
+
if (isEqual(user, newUser)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const updatedUser = await handleUpdateUser(newUser);
|
|
47
|
+
return updatedUser?.settings;
|
|
48
|
+
}
|
|
49
|
+
async function handleSignOut() {
|
|
50
|
+
return signOut();
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
data: user,
|
|
54
|
+
isGuest,
|
|
55
|
+
signOut: handleSignOut,
|
|
56
|
+
updateUser: handleUpdateUser,
|
|
57
|
+
updateUserSettings: handleUpdateUserSettings
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function createWithUser(useUserHook) {
|
|
62
|
+
return function withUser(Component) {
|
|
63
|
+
return function WrappedComponent(props) {
|
|
64
|
+
const userProps = useUserHook();
|
|
65
|
+
return (_jsx(Component, { ...props, ...userProps }));
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function createFuseAuthentication(options) {
|
|
70
|
+
const { authClient, FuseAuthProvider, FuseAuthorization, providerName = 'jb-jwt' } = options;
|
|
71
|
+
const JwtProvider = createFuseJwtAuthProvider(authClient);
|
|
72
|
+
const providers = [
|
|
73
|
+
{
|
|
74
|
+
name: providerName,
|
|
75
|
+
Provider: JwtProvider
|
|
76
|
+
}
|
|
77
|
+
];
|
|
78
|
+
return function Authentication(props) {
|
|
79
|
+
const { children } = props;
|
|
80
|
+
return (_jsx(FuseAuthProvider, { providers: providers, children: (authState) => {
|
|
81
|
+
const userRole = authState?.user?.role;
|
|
82
|
+
return _jsx(FuseAuthorization, { userRole: userRole, children: children });
|
|
83
|
+
} }));
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -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,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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
const JBAuthContext = createContext(undefined);
|
|
4
|
+
const isTokenValid = (token) => {
|
|
5
|
+
if (!token)
|
|
6
|
+
return false;
|
|
7
|
+
try {
|
|
8
|
+
const payload = JSON.parse(atob(token.split('.')[1]));
|
|
9
|
+
const now = Date.now() / 1000;
|
|
10
|
+
return payload.exp > now;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export function JBAuthProvider(props) {
|
|
17
|
+
const { authClient, children, onAuthStateChanged } = props;
|
|
18
|
+
const [authStatus, setAuthStatus] = useState('configuring');
|
|
19
|
+
const [user, setUser] = useState(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
onAuthStateChanged?.({
|
|
22
|
+
authStatus,
|
|
23
|
+
isAuthenticated: authStatus === 'authenticated',
|
|
24
|
+
user
|
|
25
|
+
});
|
|
26
|
+
}, [authStatus, onAuthStateChanged, user]);
|
|
27
|
+
const setAuthenticatedSession = useCallback((authResponse) => {
|
|
28
|
+
setUser(authResponse.user ?? null);
|
|
29
|
+
setAuthStatus('authenticated');
|
|
30
|
+
return authResponse.user ?? null;
|
|
31
|
+
}, []);
|
|
32
|
+
const signIn = useCallback(async (payload) => {
|
|
33
|
+
const response = await authClient.loginBasic(payload);
|
|
34
|
+
return setAuthenticatedSession(response);
|
|
35
|
+
}, [authClient, setAuthenticatedSession]);
|
|
36
|
+
const signInOtp = useCallback(async (payload) => {
|
|
37
|
+
const response = await authClient.verifyOtp(payload);
|
|
38
|
+
return setAuthenticatedSession(response);
|
|
39
|
+
}, [authClient, setAuthenticatedSession]);
|
|
40
|
+
const signUp = useCallback(async (payload) => {
|
|
41
|
+
const response = await authClient.register(payload);
|
|
42
|
+
return response;
|
|
43
|
+
}, [authClient]);
|
|
44
|
+
const confirmAccountEmail = useCallback(async (payload) => authClient.confirmAccountEmail(payload), [authClient]);
|
|
45
|
+
const resendAccountConfirmation = useCallback(async (payload) => authClient.resendAccountConfirmation(payload), [authClient]);
|
|
46
|
+
const signOut = useCallback(() => {
|
|
47
|
+
authClient.logout();
|
|
48
|
+
setUser(null);
|
|
49
|
+
setAuthStatus('unauthenticated');
|
|
50
|
+
}, [authClient]);
|
|
51
|
+
const refreshToken = useCallback(async () => {
|
|
52
|
+
const response = await authClient.refreshToken();
|
|
53
|
+
return response.accessToken || null;
|
|
54
|
+
}, [authClient]);
|
|
55
|
+
const requestOtp = useCallback(async (payload) => authClient.requestOtp(payload), [authClient]);
|
|
56
|
+
const requestPasswordReset = useCallback(async (payload) => authClient.requestPasswordReset(payload), [authClient]);
|
|
57
|
+
const confirmPasswordReset = useCallback(async (payload) => authClient.confirmPasswordReset(payload), [authClient]);
|
|
58
|
+
const changePassword = useCallback(async (payload) => authClient.changePassword(payload), [authClient]);
|
|
59
|
+
const getProfiles = useCallback(async () => authClient.getProfiles(), [authClient]);
|
|
60
|
+
const switchProfile = useCallback(async (payload) => {
|
|
61
|
+
const response = await authClient.switchProfile(payload);
|
|
62
|
+
return setAuthenticatedSession(response);
|
|
63
|
+
}, [authClient, setAuthenticatedSession]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
let isMounted = true;
|
|
66
|
+
const bootstrapAuth = async () => {
|
|
67
|
+
const accessToken = authClient.getAccessToken();
|
|
68
|
+
if (!isTokenValid(accessToken)) {
|
|
69
|
+
setAuthStatus('unauthenticated');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const response = await authClient.getMe();
|
|
74
|
+
if (!isMounted)
|
|
75
|
+
return;
|
|
76
|
+
setAuthenticatedSession(response);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
if (!isMounted)
|
|
80
|
+
return;
|
|
81
|
+
authClient.logout();
|
|
82
|
+
setUser(null);
|
|
83
|
+
setAuthStatus('unauthenticated');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
bootstrapAuth();
|
|
87
|
+
return () => {
|
|
88
|
+
isMounted = false;
|
|
89
|
+
};
|
|
90
|
+
}, [authClient, setAuthenticatedSession]);
|
|
91
|
+
const contextValue = useMemo(() => ({
|
|
92
|
+
authStatus,
|
|
93
|
+
isAuthenticated: authStatus === 'authenticated',
|
|
94
|
+
user,
|
|
95
|
+
signIn,
|
|
96
|
+
signUp,
|
|
97
|
+
confirmAccountEmail,
|
|
98
|
+
resendAccountConfirmation,
|
|
99
|
+
signInOtp,
|
|
100
|
+
requestOtp,
|
|
101
|
+
requestPasswordReset,
|
|
102
|
+
confirmPasswordReset,
|
|
103
|
+
changePassword,
|
|
104
|
+
getProfiles,
|
|
105
|
+
switchProfile,
|
|
106
|
+
signOut,
|
|
107
|
+
refreshToken
|
|
108
|
+
}), [
|
|
109
|
+
authStatus,
|
|
110
|
+
user,
|
|
111
|
+
signIn,
|
|
112
|
+
signUp,
|
|
113
|
+
confirmAccountEmail,
|
|
114
|
+
resendAccountConfirmation,
|
|
115
|
+
signInOtp,
|
|
116
|
+
requestOtp,
|
|
117
|
+
requestPasswordReset,
|
|
118
|
+
confirmPasswordReset,
|
|
119
|
+
changePassword,
|
|
120
|
+
getProfiles,
|
|
121
|
+
switchProfile,
|
|
122
|
+
signOut,
|
|
123
|
+
refreshToken
|
|
124
|
+
]);
|
|
125
|
+
return _jsx(JBAuthContext.Provider, { value: contextValue, children: children });
|
|
126
|
+
}
|
|
127
|
+
export function useJBAuth() {
|
|
128
|
+
const context = useContext(JBAuthContext);
|
|
129
|
+
if (!context) {
|
|
130
|
+
throw new Error('useJBAuth must be used within JBAuthProvider');
|
|
131
|
+
}
|
|
132
|
+
return context;
|
|
133
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AuthClient } from './client';
|
|
2
|
+
import { AccountUpdatePayload, DeleteAccountPayload, JbDrfWebAuthResponse, LinkSocialPayload, LoginBasicPayload, LoginSocialPayload, SwitchProfilePayload, UnlinkSocialPayload } from './types';
|
|
3
|
+
export declare const authQueryKeys: {
|
|
4
|
+
all: readonly ["auth"];
|
|
5
|
+
me: () => readonly ["auth", "me"];
|
|
6
|
+
social: () => readonly ["auth", "social"];
|
|
7
|
+
account: () => readonly ["auth", "account"];
|
|
8
|
+
};
|
|
9
|
+
export declare const createAuthQueryHooks: (authClient: Pick<AuthClient, "getMe" | "loginBasic" | "loginSocial" | "linkSocial" | "unlinkSocial" | "updateAccount" | "deleteAccount" | "switchProfile" | "logout">) => {
|
|
10
|
+
useMeQuery: (enabled?: boolean) => import("@tanstack/react-query").UseQueryResult<JbDrfWebAuthResponse, Error>;
|
|
11
|
+
useLoginMutation: () => import("@tanstack/react-query").UseMutationResult<JbDrfWebAuthResponse, Error, LoginBasicPayload, unknown>;
|
|
12
|
+
useSocialLoginMutation: () => import("@tanstack/react-query").UseMutationResult<JbDrfWebAuthResponse, Error, LoginSocialPayload, unknown>;
|
|
13
|
+
useLinkSocialMutation: () => import("@tanstack/react-query").UseMutationResult<Record<string, unknown>, Error, LinkSocialPayload, unknown>;
|
|
14
|
+
useUnlinkSocialMutation: () => import("@tanstack/react-query").UseMutationResult<Record<string, unknown>, Error, UnlinkSocialPayload, unknown>;
|
|
15
|
+
useAccountUpdateMutation: () => import("@tanstack/react-query").UseMutationResult<Record<string, unknown>, Error, {
|
|
16
|
+
payload: AccountUpdatePayload;
|
|
17
|
+
method?: "PATCH" | "PUT";
|
|
18
|
+
}, unknown>;
|
|
19
|
+
useDeleteAccountMutation: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, DeleteAccountPayload, unknown>;
|
|
20
|
+
useSwitchProfileMutation: () => import("@tanstack/react-query").UseMutationResult<JbDrfWebAuthResponse, Error, SwitchProfilePayload, unknown>;
|
|
21
|
+
useLogoutMutation: () => import("@tanstack/react-query").UseMutationResult<void, Error, void, unknown>;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/auth/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,aAAa;;;;;CAKzB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,YAAY,IAAI,CACd,UAAU,EACR,OAAO,GACP,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,cAAc,GACd,eAAe,GACf,eAAe,GACf,eAAe,GACf,QAAQ,CACX;;;;;;;iBA8DgD,oBAAoB;iBAAW,OAAO,GAAG,KAAK;;;;;CA6ChG,CAAC"}
|