react-unified-auth 1.0.1 → 1.0.3
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 +91 -23
- package/dist/components/Button.d.ts +8 -0
- package/dist/components/DynamicForm.d.ts +9 -0
- package/dist/components/LoginForm.d.ts +6 -0
- package/dist/components/SocialLogin.d.ts +15 -0
- package/dist/components/UserInfoBox.d.ts +8 -0
- package/dist/context/AuthContext.d.ts +8 -0
- package/dist/hooks/useAuth.d.ts +10 -0
- package/dist/hooks/useDynamicForm.d.ts +6 -0
- package/dist/index.css +438 -0
- package/dist/index.d.ts +18 -158
- package/dist/index.esm.css +1 -0
- package/dist/index.esm.js +23 -28
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +35 -40
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +59 -0
- package/dist/utils/api-client.d.ts +14 -0
- package/dist/utils/validation.d.ts +9 -0
- package/package.json +6 -7
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var
|
|
4
|
+
var react = require('react');
|
|
5
5
|
|
|
6
|
-
const AuthContext =
|
|
6
|
+
const AuthContext = react.createContext(undefined);
|
|
7
7
|
function AuthProvider({ config, children }) {
|
|
8
8
|
return (jsxRuntime.jsx(AuthContext.Provider, { value: { config }, children: children }));
|
|
9
9
|
}
|
|
10
10
|
function useAuthConfig() {
|
|
11
|
-
const context =
|
|
11
|
+
const context = react.useContext(AuthContext);
|
|
12
12
|
if (!context) {
|
|
13
13
|
throw new Error('useAuthConfig must be used within an AuthProvider');
|
|
14
14
|
}
|
|
@@ -3957,9 +3957,9 @@ class ApiClient {
|
|
|
3957
3957
|
|
|
3958
3958
|
function useAuth() {
|
|
3959
3959
|
const config = useAuthConfig();
|
|
3960
|
-
const [user, setUser] =
|
|
3961
|
-
const [loading, setLoading] =
|
|
3962
|
-
const [error, setError] =
|
|
3960
|
+
const [user, setUser] = react.useState(null);
|
|
3961
|
+
const [loading, setLoading] = react.useState(false);
|
|
3962
|
+
const [error, setError] = react.useState(null);
|
|
3963
3963
|
const login = async (credentials) => {
|
|
3964
3964
|
setLoading(true);
|
|
3965
3965
|
setError(null);
|
|
@@ -4035,10 +4035,10 @@ function useAuth() {
|
|
|
4035
4035
|
|
|
4036
4036
|
function useDynamicForm(formId) {
|
|
4037
4037
|
const config = useAuthConfig();
|
|
4038
|
-
const [formConfig, setFormConfig] =
|
|
4039
|
-
const [loading, setLoading] =
|
|
4040
|
-
const [error, setError] =
|
|
4041
|
-
|
|
4038
|
+
const [formConfig, setFormConfig] = react.useState(null);
|
|
4039
|
+
const [loading, setLoading] = react.useState(false);
|
|
4040
|
+
const [error, setError] = react.useState(null);
|
|
4041
|
+
react.useEffect(() => {
|
|
4042
4042
|
const fetchFormConfig = async () => {
|
|
4043
4043
|
setLoading(true);
|
|
4044
4044
|
setError(null);
|
|
@@ -4064,19 +4064,14 @@ function useDynamicForm(formId) {
|
|
|
4064
4064
|
}
|
|
4065
4065
|
|
|
4066
4066
|
function Button({ variant = 'primary', size = 'md', loading = false, fullWidth = false, children, disabled, className = '', ...props }) {
|
|
4067
|
-
const
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
md: 'px-4 py-2 text-base',
|
|
4076
|
-
lg: 'px-6 py-3 text-lg',
|
|
4077
|
-
};
|
|
4078
|
-
const widthStyles = fullWidth ? 'w-full' : '';
|
|
4079
|
-
return (jsxRuntime.jsxs("button", { className: `${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${widthStyles} ${className}`, disabled: disabled || loading, ...props, children: [loading && (jsxRuntime.jsxs("svg", { className: "animate-spin -ml-1 mr-2 h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [jsxRuntime.jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), jsxRuntime.jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] })), children] }));
|
|
4067
|
+
const buttonClasses = [
|
|
4068
|
+
'usa-button',
|
|
4069
|
+
`usa-button--${variant}`,
|
|
4070
|
+
`usa-button--${size}`,
|
|
4071
|
+
fullWidth ? 'usa-button--full-width' : '',
|
|
4072
|
+
className
|
|
4073
|
+
].filter(Boolean).join(' ');
|
|
4074
|
+
return (jsxRuntime.jsxs("button", { className: buttonClasses, disabled: disabled || loading, ...props, children: [loading && (jsxRuntime.jsxs("svg", { className: "usa-loading-spinner", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [jsxRuntime.jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), jsxRuntime.jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] })), children] }));
|
|
4080
4075
|
}
|
|
4081
4076
|
|
|
4082
4077
|
function validateField(field, value) {
|
|
@@ -4124,9 +4119,9 @@ function validateForm(fields, values) {
|
|
|
4124
4119
|
}
|
|
4125
4120
|
|
|
4126
4121
|
function DynamicForm({ fields, onSubmit, submitText = 'Submit', submitVariant = 'primary', loading = false, }) {
|
|
4127
|
-
const [values, setValues] =
|
|
4128
|
-
const [errors, setErrors] =
|
|
4129
|
-
const [touched, setTouched] =
|
|
4122
|
+
const [values, setValues] = react.useState({});
|
|
4123
|
+
const [errors, setErrors] = react.useState({});
|
|
4124
|
+
const [touched, setTouched] = react.useState({});
|
|
4130
4125
|
const handleChange = (name, value) => {
|
|
4131
4126
|
setValues((prev) => ({ ...prev, [name]: value }));
|
|
4132
4127
|
if (touched[name]) {
|
|
@@ -4165,8 +4160,8 @@ function DynamicForm({ fields, onSubmit, submitText = 'Submit', submitVariant =
|
|
|
4165
4160
|
const renderField = (field) => {
|
|
4166
4161
|
const error = touched[field.name] ? errors[field.name] : '';
|
|
4167
4162
|
const hasError = !!error;
|
|
4168
|
-
const baseInputStyles = '
|
|
4169
|
-
const errorStyles = hasError ? '
|
|
4163
|
+
const baseInputStyles = 'usa-form__input';
|
|
4164
|
+
const errorStyles = hasError ? 'usa-form__input--error' : '';
|
|
4170
4165
|
switch (field.type) {
|
|
4171
4166
|
case 'text':
|
|
4172
4167
|
case 'email':
|
|
@@ -4174,24 +4169,24 @@ function DynamicForm({ fields, onSubmit, submitText = 'Submit', submitVariant =
|
|
|
4174
4169
|
case 'number':
|
|
4175
4170
|
return (jsxRuntime.jsx("input", { type: field.type, name: field.name, value: values[field.name] || '', onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), placeholder: field.placeholder, className: `${baseInputStyles} ${errorStyles}`, disabled: loading }));
|
|
4176
4171
|
case 'textarea':
|
|
4177
|
-
return (jsxRuntime.jsx("textarea", { name: field.name, value: values[field.name] || '', onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), placeholder: field.placeholder, rows: 4, className:
|
|
4172
|
+
return (jsxRuntime.jsx("textarea", { name: field.name, value: values[field.name] || '', onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), placeholder: field.placeholder, rows: 4, className: "usa-form__textarea", disabled: loading }));
|
|
4178
4173
|
case 'select':
|
|
4179
|
-
return (jsxRuntime.jsxs("select", { name: field.name, value: values[field.name] || '', onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), className:
|
|
4174
|
+
return (jsxRuntime.jsxs("select", { name: field.name, value: values[field.name] || '', onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), className: "usa-form__select", disabled: loading, children: [jsxRuntime.jsx("option", { value: "", children: "Select an option" }), field.options?.map((option) => (jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value)))] }));
|
|
4180
4175
|
case 'checkbox':
|
|
4181
|
-
return (jsxRuntime.jsx("input", { type: "checkbox", name: field.name, checked: values[field.name] || false, onChange: (e) => handleChange(field.name, e.target.checked), onBlur: () => handleBlur(field.name), className: "
|
|
4176
|
+
return (jsxRuntime.jsx("input", { type: "checkbox", name: field.name, checked: values[field.name] || false, onChange: (e) => handleChange(field.name, e.target.checked), onBlur: () => handleBlur(field.name), className: "usa-form__checkbox", disabled: loading }));
|
|
4182
4177
|
case 'radio':
|
|
4183
|
-
return (jsxRuntime.jsx("div", { className: "
|
|
4178
|
+
return (jsxRuntime.jsx("div", { className: "usa-form__radio-group", children: field.options?.map((option) => (jsxRuntime.jsxs("label", { className: "usa-form__radio-label", children: [jsxRuntime.jsx("input", { type: "radio", name: field.name, value: option.value, checked: values[field.name] === option.value, onChange: (e) => handleChange(field.name, e.target.value), onBlur: () => handleBlur(field.name), className: "usa-form__radio", disabled: loading }), jsxRuntime.jsx("span", { children: option.label })] }, option.value))) }));
|
|
4184
4179
|
default:
|
|
4185
4180
|
return null;
|
|
4186
4181
|
}
|
|
4187
4182
|
};
|
|
4188
|
-
return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "
|
|
4183
|
+
return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "usa-form", children: [fields.map((field) => (jsxRuntime.jsxs("div", { className: "usa-form__field-group", children: [jsxRuntime.jsx("label", { className: `usa-form__label ${field.required ? 'usa-form__label--required' : ''}`, children: field.label }), renderField(field), touched[field.name] && errors[field.name] && (jsxRuntime.jsx("p", { className: "usa-form__error", children: errors[field.name] }))] }, field.name))), jsxRuntime.jsx(Button, { type: "submit", variant: submitVariant, loading: loading, fullWidth: true, children: submitText })] }));
|
|
4189
4184
|
}
|
|
4190
4185
|
|
|
4191
4186
|
function LoginForm({ formId, onSuccess, onError }) {
|
|
4192
4187
|
const config = useAuthConfig();
|
|
4193
4188
|
const { formConfig, loading: formLoading, error: formError } = useDynamicForm(formId);
|
|
4194
|
-
const [submitting, setSubmitting] =
|
|
4189
|
+
const [submitting, setSubmitting] = react.useState(false);
|
|
4195
4190
|
const handleSubmit = async (values) => {
|
|
4196
4191
|
if (!formConfig)
|
|
4197
4192
|
return;
|
|
@@ -4218,32 +4213,32 @@ function LoginForm({ formId, onSuccess, onError }) {
|
|
|
4218
4213
|
}
|
|
4219
4214
|
};
|
|
4220
4215
|
if (formLoading) {
|
|
4221
|
-
return (jsxRuntime.jsx("div", { className: "
|
|
4216
|
+
return (jsxRuntime.jsx("div", { className: "usa-login-form__loading", children: jsxRuntime.jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }) }));
|
|
4222
4217
|
}
|
|
4223
4218
|
if (formError) {
|
|
4224
|
-
return (jsxRuntime.jsx("div", { className: "
|
|
4219
|
+
return (jsxRuntime.jsx("div", { className: "usa-login-form__error", children: jsxRuntime.jsx("p", { className: "text-red-600", children: formError }) }));
|
|
4225
4220
|
}
|
|
4226
4221
|
if (!formConfig) {
|
|
4227
4222
|
return null;
|
|
4228
4223
|
}
|
|
4229
|
-
return (jsxRuntime.jsx("div", { className: "
|
|
4224
|
+
return (jsxRuntime.jsx("div", { className: "usa-login-form", children: jsxRuntime.jsx(DynamicForm, { fields: formConfig.fields, onSubmit: handleSubmit, submitText: formConfig.submitButton?.text || 'Login', submitVariant: formConfig.submitButton?.variant || 'primary', loading: submitting }) }));
|
|
4230
4225
|
}
|
|
4231
4226
|
|
|
4232
4227
|
function UserInfoBox({ user, onLogout, loading = false, className = '' }) {
|
|
4233
|
-
return (jsxRuntime.jsxs("div", { className: `
|
|
4228
|
+
return (jsxRuntime.jsxs("div", { className: `usa-user-info-box ${className}`, children: [jsxRuntime.jsxs("div", { className: "usa-user-info-box__header", children: [user.avatar && (jsxRuntime.jsx("img", { src: user.avatar, alt: user.name, className: "usa-user-info-box__avatar" })), jsxRuntime.jsxs("div", { className: "usa-user-info-box__details", children: [jsxRuntime.jsx("h3", { className: "usa-user-info-box__name", children: user.name }), user.email && (jsxRuntime.jsx("p", { className: "usa-user-info-box__email", children: user.email }))] })] }), onLogout && (jsxRuntime.jsx("div", { className: "mt-4", children: jsxRuntime.jsx(Button, { variant: "outline", size: "sm", onClick: onLogout, loading: loading, fullWidth: true, children: "Logout" }) }))] }));
|
|
4234
4229
|
}
|
|
4235
4230
|
|
|
4236
4231
|
function SocialLoginButton({ provider, onClick, loading = false, className = '' }) {
|
|
4237
4232
|
const handleClick = () => {
|
|
4238
4233
|
onClick(provider);
|
|
4239
4234
|
};
|
|
4240
|
-
return (jsxRuntime.jsxs(Button, { variant: "outline", onClick: handleClick, loading: loading, fullWidth: true, className: `
|
|
4235
|
+
return (jsxRuntime.jsxs(Button, { variant: "outline", onClick: handleClick, loading: loading, fullWidth: true, className: `usa-social-login-button ${className}`, children: [provider.icon && (jsxRuntime.jsx("img", { src: provider.icon, alt: provider.name, className: "usa-social-login-button__icon" })), jsxRuntime.jsxs("span", { children: ["Continue with ", provider.name] })] }));
|
|
4241
4236
|
}
|
|
4242
4237
|
function SocialLogin({ providers, onLogin, loading = false, className = '' }) {
|
|
4243
4238
|
if (providers.length === 0) {
|
|
4244
4239
|
return null;
|
|
4245
4240
|
}
|
|
4246
|
-
return (jsxRuntime.jsx("div", { className: `
|
|
4241
|
+
return (jsxRuntime.jsx("div", { className: `usa-social-login ${className}`, children: providers.map((provider) => (jsxRuntime.jsx(SocialLoginButton, { provider: provider, onClick: onLogin, loading: loading }, provider.id))) }));
|
|
4247
4242
|
}
|
|
4248
4243
|
|
|
4249
4244
|
exports.ApiClient = ApiClient;
|