@ccatto/auth-ui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +62 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +63 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -142,9 +142,71 @@ var RegisterUserFormCatto = ({
|
|
|
142
142
|
] });
|
|
143
143
|
};
|
|
144
144
|
var RegisterUserFormCatto_default = RegisterUserFormCatto;
|
|
145
|
+
var UserProfileFormCatto = ({
|
|
146
|
+
initialValues,
|
|
147
|
+
onSubmit,
|
|
148
|
+
i18nNamespace = "auth"
|
|
149
|
+
}) => {
|
|
150
|
+
const t = nextIntl.useTranslations(i18nNamespace);
|
|
151
|
+
const [name, setName] = react.useState(initialValues.name);
|
|
152
|
+
const [email, setEmail] = react.useState(initialValues.email);
|
|
153
|
+
const [error, setError] = react.useState(null);
|
|
154
|
+
const [success, setSuccess] = react.useState(false);
|
|
155
|
+
const [submitting, setSubmitting] = react.useState(false);
|
|
156
|
+
react.useEffect(() => {
|
|
157
|
+
setName(initialValues.name);
|
|
158
|
+
setEmail(initialValues.email);
|
|
159
|
+
}, [initialValues.name, initialValues.email]);
|
|
160
|
+
const dirty = name.trim() !== initialValues.name.trim() || email.trim() !== initialValues.email.trim();
|
|
161
|
+
const canSubmit = dirty && name.trim().length > 0 && email.trim().length > 0 && !submitting;
|
|
162
|
+
const handleSubmit = async (e) => {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
setError(null);
|
|
165
|
+
setSuccess(false);
|
|
166
|
+
if (!canSubmit) return;
|
|
167
|
+
setSubmitting(true);
|
|
168
|
+
try {
|
|
169
|
+
await onSubmit({ name: name.trim(), email: email.trim() });
|
|
170
|
+
setSuccess(true);
|
|
171
|
+
} catch (err) {
|
|
172
|
+
setError(err instanceof Error ? err.message : t("profile.errorGeneric"));
|
|
173
|
+
} finally {
|
|
174
|
+
setSubmitting(false);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "flex flex-col gap-4 p-4", children: [
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
179
|
+
ui.InputCatto,
|
|
180
|
+
{
|
|
181
|
+
type: "text",
|
|
182
|
+
label: t("profile.nameLabel"),
|
|
183
|
+
value: name,
|
|
184
|
+
onChange: (value) => setName(value),
|
|
185
|
+
required: true,
|
|
186
|
+
autoComplete: "name"
|
|
187
|
+
}
|
|
188
|
+
),
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
190
|
+
ui.InputCatto,
|
|
191
|
+
{
|
|
192
|
+
type: "email",
|
|
193
|
+
label: t("profile.emailLabel"),
|
|
194
|
+
value: email,
|
|
195
|
+
onChange: (value) => setEmail(value),
|
|
196
|
+
required: true,
|
|
197
|
+
autoComplete: "email"
|
|
198
|
+
}
|
|
199
|
+
),
|
|
200
|
+
error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", children: error }),
|
|
201
|
+
success && !error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-green-600 dark:text-green-400", children: t("profile.successMessage") }),
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.ButtonCatto, { type: "submit", variant: "primary", disabled: !canSubmit, children: submitting ? t("profile.submitting") : t("profile.submit") })
|
|
203
|
+
] });
|
|
204
|
+
};
|
|
205
|
+
var UserProfileFormCatto_default = UserProfileFormCatto;
|
|
145
206
|
|
|
146
207
|
exports.LoginCatto = LoginCatto_default;
|
|
147
208
|
exports.RegisterUserFormCatto = RegisterUserFormCatto_default;
|
|
148
209
|
exports.SignInEmailPassFormCatto = SignInEmailPassFormCatto_default;
|
|
210
|
+
exports.UserProfileFormCatto = UserProfileFormCatto_default;
|
|
149
211
|
//# sourceMappingURL=index.cjs.map
|
|
150
212
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SignInEmailPassFormCatto.tsx","../src/LoginCatto.tsx","../src/RegisterUserFormCatto.tsx"],"names":["useTranslations","useState","jsxs","jsx","InputCatto","ButtonCatto","CardCatto"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface SignInValues {\n email: string;\n password: string;\n}\n\nexport interface SignInEmailPassFormCattoProps {\n /**\n * Called with `{ email, password }` when the user submits the form. Throw\n * (or reject) to surface an error message in the form. The component owns\n * its own loading + error UI; the caller owns the auth client and any\n * navigation that should happen on success.\n */\n onSubmit: (values: SignInValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `signIn.cardTitle`, `signIn.emailLabel`,\n * `signIn.passwordLabel`, `signIn.submit`, `signIn.submitting`,\n * `signIn.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst SignInEmailPassFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: SignInEmailPassFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('signIn.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"email\"\n label={t('signIn.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('signIn.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"current-password\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('signIn.submitting') : t('signIn.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default SignInEmailPassFormCatto;\n","'use client';\n\nimport { CardCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\nimport SignInEmailPassFormCatto, {\n type SignInEmailPassFormCattoProps,\n} from './SignInEmailPassFormCatto';\n\nexport interface LoginCattoProps extends SignInEmailPassFormCattoProps {\n /** CardCatto variant. Defaults to 'midnightEmber'. */\n cardVariant?: string;\n /** CardCatto width. Defaults to '5xl'. */\n cardWidth?: string;\n}\n\nconst LoginCatto = ({\n cardVariant = 'midnightEmber',\n cardWidth = '5xl',\n i18nNamespace = 'auth',\n ...formProps\n}: LoginCattoProps) => {\n const t = useTranslations(i18nNamespace);\n\n return (\n <div className=\"mt-6 h-full\">\n <CardCatto\n title={t('signIn.cardTitle')}\n // CardCatto's variant + width props are loosely typed here so consumers\n // can pass any of the package's themes without us having to track the\n // union in two places.\n variant={cardVariant as never}\n width={cardWidth as never}\n headerComponent={\n <SignInEmailPassFormCatto\n {...formProps}\n i18nNamespace={i18nNamespace}\n />\n }\n />\n </div>\n );\n};\n\nexport default LoginCatto;\n","'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface RegisterValues {\n name: string;\n email: string;\n password: string;\n}\n\nexport interface RegisterUserFormCattoProps {\n /**\n * Called with `{ name, email, password }` when the user submits the form.\n * Throw (or reject) to surface an error message. The component owns its\n * own loading + error UI; the caller owns the auth client and any\n * post-register navigation.\n */\n onSubmit: (values: RegisterValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `register.nameLabel`, `register.emailLabel`,\n * `register.passwordLabel`, `register.submit`, `register.submitting`,\n * `register.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst RegisterUserFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: RegisterUserFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ name, email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('register.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('register.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('register.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('register.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('register.submitting') : t('register.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default RegisterUserFormCatto;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/SignInEmailPassFormCatto.tsx","../src/LoginCatto.tsx","../src/RegisterUserFormCatto.tsx","../src/UserProfileFormCatto.tsx"],"names":["useTranslations","useState","jsxs","jsx","InputCatto","ButtonCatto","CardCatto","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface SignInValues {\n email: string;\n password: string;\n}\n\nexport interface SignInEmailPassFormCattoProps {\n /**\n * Called with `{ email, password }` when the user submits the form. Throw\n * (or reject) to surface an error message in the form. The component owns\n * its own loading + error UI; the caller owns the auth client and any\n * navigation that should happen on success.\n */\n onSubmit: (values: SignInValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `signIn.cardTitle`, `signIn.emailLabel`,\n * `signIn.passwordLabel`, `signIn.submit`, `signIn.submitting`,\n * `signIn.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst SignInEmailPassFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: SignInEmailPassFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('signIn.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"email\"\n label={t('signIn.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('signIn.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"current-password\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('signIn.submitting') : t('signIn.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default SignInEmailPassFormCatto;\n","'use client';\n\nimport { CardCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\nimport SignInEmailPassFormCatto, {\n type SignInEmailPassFormCattoProps,\n} from './SignInEmailPassFormCatto';\n\nexport interface LoginCattoProps extends SignInEmailPassFormCattoProps {\n /** CardCatto variant. Defaults to 'midnightEmber'. */\n cardVariant?: string;\n /** CardCatto width. Defaults to '5xl'. */\n cardWidth?: string;\n}\n\nconst LoginCatto = ({\n cardVariant = 'midnightEmber',\n cardWidth = '5xl',\n i18nNamespace = 'auth',\n ...formProps\n}: LoginCattoProps) => {\n const t = useTranslations(i18nNamespace);\n\n return (\n <div className=\"mt-6 h-full\">\n <CardCatto\n title={t('signIn.cardTitle')}\n // CardCatto's variant + width props are loosely typed here so consumers\n // can pass any of the package's themes without us having to track the\n // union in two places.\n variant={cardVariant as never}\n width={cardWidth as never}\n headerComponent={\n <SignInEmailPassFormCatto\n {...formProps}\n i18nNamespace={i18nNamespace}\n />\n }\n />\n </div>\n );\n};\n\nexport default LoginCatto;\n","'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface RegisterValues {\n name: string;\n email: string;\n password: string;\n}\n\nexport interface RegisterUserFormCattoProps {\n /**\n * Called with `{ name, email, password }` when the user submits the form.\n * Throw (or reject) to surface an error message. The component owns its\n * own loading + error UI; the caller owns the auth client and any\n * post-register navigation.\n */\n onSubmit: (values: RegisterValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `register.nameLabel`, `register.emailLabel`,\n * `register.passwordLabel`, `register.submit`, `register.submitting`,\n * `register.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst RegisterUserFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: RegisterUserFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ name, email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('register.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('register.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('register.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('register.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('register.submitting') : t('register.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default RegisterUserFormCatto;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface ProfileValues {\n name: string;\n email: string;\n}\n\nexport interface UserProfileFormCattoProps {\n /** Pre-fills the form. The component re-syncs if `initialValues` changes. */\n initialValues: ProfileValues;\n /**\n * Called with the edited `{ name, email }` when the user saves. Throw (or\n * reject) to surface an error in the form's red-text region. The form\n * shows a transient \"Saved\" confirmation on success and stays in place —\n * navigation, if any, is the caller's responsibility.\n */\n onSubmit: (values: ProfileValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `profile.cardTitle`, `profile.nameLabel`,\n * `profile.emailLabel`, `profile.submit`, `profile.submitting`,\n * `profile.errorGeneric`, `profile.successMessage`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst UserProfileFormCatto = ({\n initialValues,\n onSubmit,\n i18nNamespace = 'auth',\n}: UserProfileFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState(initialValues.name);\n const [email, setEmail] = useState(initialValues.email);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n // Re-sync if the parent provides a different initialValues (e.g. session\n // refetched after a save).\n useEffect(() => {\n setName(initialValues.name);\n setEmail(initialValues.email);\n }, [initialValues.name, initialValues.email]);\n\n const dirty =\n name.trim() !== initialValues.name.trim() ||\n email.trim() !== initialValues.email.trim();\n\n const canSubmit =\n dirty && name.trim().length > 0 && email.trim().length > 0 && !submitting;\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSuccess(false);\n if (!canSubmit) return;\n setSubmitting(true);\n try {\n await onSubmit({ name: name.trim(), email: email.trim() });\n setSuccess(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : t('profile.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('profile.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('profile.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {success && !error && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('profile.successMessage')}\n </p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={!canSubmit}>\n {submitting ? t('profile.submitting') : t('profile.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default UserProfileFormCatto;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -53,4 +53,28 @@ interface RegisterUserFormCattoProps {
|
|
|
53
53
|
}
|
|
54
54
|
declare const RegisterUserFormCatto: ({ onSubmit, i18nNamespace, }: RegisterUserFormCattoProps) => react_jsx_runtime.JSX.Element;
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
interface ProfileValues {
|
|
57
|
+
name: string;
|
|
58
|
+
email: string;
|
|
59
|
+
}
|
|
60
|
+
interface UserProfileFormCattoProps {
|
|
61
|
+
/** Pre-fills the form. The component re-syncs if `initialValues` changes. */
|
|
62
|
+
initialValues: ProfileValues;
|
|
63
|
+
/**
|
|
64
|
+
* Called with the edited `{ name, email }` when the user saves. Throw (or
|
|
65
|
+
* reject) to surface an error in the form's red-text region. The form
|
|
66
|
+
* shows a transient "Saved" confirmation on success and stays in place —
|
|
67
|
+
* navigation, if any, is the caller's responsibility.
|
|
68
|
+
*/
|
|
69
|
+
onSubmit: (values: ProfileValues) => Promise<void> | void;
|
|
70
|
+
/**
|
|
71
|
+
* next-intl namespace this form's labels are read from. The keys it expects
|
|
72
|
+
* inside the namespace are `profile.cardTitle`, `profile.nameLabel`,
|
|
73
|
+
* `profile.emailLabel`, `profile.submit`, `profile.submitting`,
|
|
74
|
+
* `profile.errorGeneric`, `profile.successMessage`. Defaults to `auth`.
|
|
75
|
+
*/
|
|
76
|
+
i18nNamespace?: string;
|
|
77
|
+
}
|
|
78
|
+
declare const UserProfileFormCatto: ({ initialValues, onSubmit, i18nNamespace, }: UserProfileFormCattoProps) => react_jsx_runtime.JSX.Element;
|
|
79
|
+
|
|
80
|
+
export { LoginCatto, type LoginCattoProps, type ProfileValues, RegisterUserFormCatto, type RegisterUserFormCattoProps, type RegisterValues, SignInEmailPassFormCatto, type SignInEmailPassFormCattoProps, type SignInValues, UserProfileFormCatto, type UserProfileFormCattoProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -53,4 +53,28 @@ interface RegisterUserFormCattoProps {
|
|
|
53
53
|
}
|
|
54
54
|
declare const RegisterUserFormCatto: ({ onSubmit, i18nNamespace, }: RegisterUserFormCattoProps) => react_jsx_runtime.JSX.Element;
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
interface ProfileValues {
|
|
57
|
+
name: string;
|
|
58
|
+
email: string;
|
|
59
|
+
}
|
|
60
|
+
interface UserProfileFormCattoProps {
|
|
61
|
+
/** Pre-fills the form. The component re-syncs if `initialValues` changes. */
|
|
62
|
+
initialValues: ProfileValues;
|
|
63
|
+
/**
|
|
64
|
+
* Called with the edited `{ name, email }` when the user saves. Throw (or
|
|
65
|
+
* reject) to surface an error in the form's red-text region. The form
|
|
66
|
+
* shows a transient "Saved" confirmation on success and stays in place —
|
|
67
|
+
* navigation, if any, is the caller's responsibility.
|
|
68
|
+
*/
|
|
69
|
+
onSubmit: (values: ProfileValues) => Promise<void> | void;
|
|
70
|
+
/**
|
|
71
|
+
* next-intl namespace this form's labels are read from. The keys it expects
|
|
72
|
+
* inside the namespace are `profile.cardTitle`, `profile.nameLabel`,
|
|
73
|
+
* `profile.emailLabel`, `profile.submit`, `profile.submitting`,
|
|
74
|
+
* `profile.errorGeneric`, `profile.successMessage`. Defaults to `auth`.
|
|
75
|
+
*/
|
|
76
|
+
i18nNamespace?: string;
|
|
77
|
+
}
|
|
78
|
+
declare const UserProfileFormCatto: ({ initialValues, onSubmit, i18nNamespace, }: UserProfileFormCattoProps) => react_jsx_runtime.JSX.Element;
|
|
79
|
+
|
|
80
|
+
export { LoginCatto, type LoginCattoProps, type ProfileValues, RegisterUserFormCatto, type RegisterUserFormCattoProps, type RegisterValues, SignInEmailPassFormCatto, type SignInEmailPassFormCattoProps, type SignInValues, UserProfileFormCatto, type UserProfileFormCattoProps };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { InputCatto, ButtonCatto, CardCatto } from '@ccatto/ui';
|
|
3
3
|
import { useTranslations } from 'next-intl';
|
|
4
|
-
import { useState } from 'react';
|
|
4
|
+
import { useState, useEffect } from 'react';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
7
|
// src/LoginCatto.tsx
|
|
@@ -140,7 +140,68 @@ var RegisterUserFormCatto = ({
|
|
|
140
140
|
] });
|
|
141
141
|
};
|
|
142
142
|
var RegisterUserFormCatto_default = RegisterUserFormCatto;
|
|
143
|
+
var UserProfileFormCatto = ({
|
|
144
|
+
initialValues,
|
|
145
|
+
onSubmit,
|
|
146
|
+
i18nNamespace = "auth"
|
|
147
|
+
}) => {
|
|
148
|
+
const t = useTranslations(i18nNamespace);
|
|
149
|
+
const [name, setName] = useState(initialValues.name);
|
|
150
|
+
const [email, setEmail] = useState(initialValues.email);
|
|
151
|
+
const [error, setError] = useState(null);
|
|
152
|
+
const [success, setSuccess] = useState(false);
|
|
153
|
+
const [submitting, setSubmitting] = useState(false);
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
setName(initialValues.name);
|
|
156
|
+
setEmail(initialValues.email);
|
|
157
|
+
}, [initialValues.name, initialValues.email]);
|
|
158
|
+
const dirty = name.trim() !== initialValues.name.trim() || email.trim() !== initialValues.email.trim();
|
|
159
|
+
const canSubmit = dirty && name.trim().length > 0 && email.trim().length > 0 && !submitting;
|
|
160
|
+
const handleSubmit = async (e) => {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
setError(null);
|
|
163
|
+
setSuccess(false);
|
|
164
|
+
if (!canSubmit) return;
|
|
165
|
+
setSubmitting(true);
|
|
166
|
+
try {
|
|
167
|
+
await onSubmit({ name: name.trim(), email: email.trim() });
|
|
168
|
+
setSuccess(true);
|
|
169
|
+
} catch (err) {
|
|
170
|
+
setError(err instanceof Error ? err.message : t("profile.errorGeneric"));
|
|
171
|
+
} finally {
|
|
172
|
+
setSubmitting(false);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
return /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "flex flex-col gap-4 p-4", children: [
|
|
176
|
+
/* @__PURE__ */ jsx(
|
|
177
|
+
InputCatto,
|
|
178
|
+
{
|
|
179
|
+
type: "text",
|
|
180
|
+
label: t("profile.nameLabel"),
|
|
181
|
+
value: name,
|
|
182
|
+
onChange: (value) => setName(value),
|
|
183
|
+
required: true,
|
|
184
|
+
autoComplete: "name"
|
|
185
|
+
}
|
|
186
|
+
),
|
|
187
|
+
/* @__PURE__ */ jsx(
|
|
188
|
+
InputCatto,
|
|
189
|
+
{
|
|
190
|
+
type: "email",
|
|
191
|
+
label: t("profile.emailLabel"),
|
|
192
|
+
value: email,
|
|
193
|
+
onChange: (value) => setEmail(value),
|
|
194
|
+
required: true,
|
|
195
|
+
autoComplete: "email"
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600 dark:text-red-400", children: error }),
|
|
199
|
+
success && !error && /* @__PURE__ */ jsx("p", { className: "text-sm text-green-600 dark:text-green-400", children: t("profile.successMessage") }),
|
|
200
|
+
/* @__PURE__ */ jsx(ButtonCatto, { type: "submit", variant: "primary", disabled: !canSubmit, children: submitting ? t("profile.submitting") : t("profile.submit") })
|
|
201
|
+
] });
|
|
202
|
+
};
|
|
203
|
+
var UserProfileFormCatto_default = UserProfileFormCatto;
|
|
143
204
|
|
|
144
|
-
export { LoginCatto_default as LoginCatto, RegisterUserFormCatto_default as RegisterUserFormCatto, SignInEmailPassFormCatto_default as SignInEmailPassFormCatto };
|
|
205
|
+
export { LoginCatto_default as LoginCatto, RegisterUserFormCatto_default as RegisterUserFormCatto, SignInEmailPassFormCatto_default as SignInEmailPassFormCatto, UserProfileFormCatto_default as UserProfileFormCatto };
|
|
145
206
|
//# sourceMappingURL=index.js.map
|
|
146
207
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SignInEmailPassFormCatto.tsx","../src/LoginCatto.tsx","../src/RegisterUserFormCatto.tsx"],"names":["useTranslations","jsx","useState","jsxs","InputCatto","ButtonCatto"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface SignInValues {\n email: string;\n password: string;\n}\n\nexport interface SignInEmailPassFormCattoProps {\n /**\n * Called with `{ email, password }` when the user submits the form. Throw\n * (or reject) to surface an error message in the form. The component owns\n * its own loading + error UI; the caller owns the auth client and any\n * navigation that should happen on success.\n */\n onSubmit: (values: SignInValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `signIn.cardTitle`, `signIn.emailLabel`,\n * `signIn.passwordLabel`, `signIn.submit`, `signIn.submitting`,\n * `signIn.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst SignInEmailPassFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: SignInEmailPassFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('signIn.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"email\"\n label={t('signIn.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('signIn.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"current-password\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('signIn.submitting') : t('signIn.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default SignInEmailPassFormCatto;\n","'use client';\n\nimport { CardCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\nimport SignInEmailPassFormCatto, {\n type SignInEmailPassFormCattoProps,\n} from './SignInEmailPassFormCatto';\n\nexport interface LoginCattoProps extends SignInEmailPassFormCattoProps {\n /** CardCatto variant. Defaults to 'midnightEmber'. */\n cardVariant?: string;\n /** CardCatto width. Defaults to '5xl'. */\n cardWidth?: string;\n}\n\nconst LoginCatto = ({\n cardVariant = 'midnightEmber',\n cardWidth = '5xl',\n i18nNamespace = 'auth',\n ...formProps\n}: LoginCattoProps) => {\n const t = useTranslations(i18nNamespace);\n\n return (\n <div className=\"mt-6 h-full\">\n <CardCatto\n title={t('signIn.cardTitle')}\n // CardCatto's variant + width props are loosely typed here so consumers\n // can pass any of the package's themes without us having to track the\n // union in two places.\n variant={cardVariant as never}\n width={cardWidth as never}\n headerComponent={\n <SignInEmailPassFormCatto\n {...formProps}\n i18nNamespace={i18nNamespace}\n />\n }\n />\n </div>\n );\n};\n\nexport default LoginCatto;\n","'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface RegisterValues {\n name: string;\n email: string;\n password: string;\n}\n\nexport interface RegisterUserFormCattoProps {\n /**\n * Called with `{ name, email, password }` when the user submits the form.\n * Throw (or reject) to surface an error message. The component owns its\n * own loading + error UI; the caller owns the auth client and any\n * post-register navigation.\n */\n onSubmit: (values: RegisterValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `register.nameLabel`, `register.emailLabel`,\n * `register.passwordLabel`, `register.submit`, `register.submitting`,\n * `register.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst RegisterUserFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: RegisterUserFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ name, email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('register.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('register.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('register.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('register.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('register.submitting') : t('register.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default RegisterUserFormCatto;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/SignInEmailPassFormCatto.tsx","../src/LoginCatto.tsx","../src/RegisterUserFormCatto.tsx","../src/UserProfileFormCatto.tsx"],"names":["useTranslations","jsx","useState","jsxs","InputCatto","ButtonCatto"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface SignInValues {\n email: string;\n password: string;\n}\n\nexport interface SignInEmailPassFormCattoProps {\n /**\n * Called with `{ email, password }` when the user submits the form. Throw\n * (or reject) to surface an error message in the form. The component owns\n * its own loading + error UI; the caller owns the auth client and any\n * navigation that should happen on success.\n */\n onSubmit: (values: SignInValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `signIn.cardTitle`, `signIn.emailLabel`,\n * `signIn.passwordLabel`, `signIn.submit`, `signIn.submitting`,\n * `signIn.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst SignInEmailPassFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: SignInEmailPassFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('signIn.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"email\"\n label={t('signIn.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('signIn.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"current-password\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('signIn.submitting') : t('signIn.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default SignInEmailPassFormCatto;\n","'use client';\n\nimport { CardCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\nimport SignInEmailPassFormCatto, {\n type SignInEmailPassFormCattoProps,\n} from './SignInEmailPassFormCatto';\n\nexport interface LoginCattoProps extends SignInEmailPassFormCattoProps {\n /** CardCatto variant. Defaults to 'midnightEmber'. */\n cardVariant?: string;\n /** CardCatto width. Defaults to '5xl'. */\n cardWidth?: string;\n}\n\nconst LoginCatto = ({\n cardVariant = 'midnightEmber',\n cardWidth = '5xl',\n i18nNamespace = 'auth',\n ...formProps\n}: LoginCattoProps) => {\n const t = useTranslations(i18nNamespace);\n\n return (\n <div className=\"mt-6 h-full\">\n <CardCatto\n title={t('signIn.cardTitle')}\n // CardCatto's variant + width props are loosely typed here so consumers\n // can pass any of the package's themes without us having to track the\n // union in two places.\n variant={cardVariant as never}\n width={cardWidth as never}\n headerComponent={\n <SignInEmailPassFormCatto\n {...formProps}\n i18nNamespace={i18nNamespace}\n />\n }\n />\n </div>\n );\n};\n\nexport default LoginCatto;\n","'use client';\n\nimport { useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface RegisterValues {\n name: string;\n email: string;\n password: string;\n}\n\nexport interface RegisterUserFormCattoProps {\n /**\n * Called with `{ name, email, password }` when the user submits the form.\n * Throw (or reject) to surface an error message. The component owns its\n * own loading + error UI; the caller owns the auth client and any\n * post-register navigation.\n */\n onSubmit: (values: RegisterValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `register.nameLabel`, `register.emailLabel`,\n * `register.passwordLabel`, `register.submit`, `register.submitting`,\n * `register.errorGeneric`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst RegisterUserFormCatto = ({\n onSubmit,\n i18nNamespace = 'auth',\n}: RegisterUserFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSubmitting(true);\n try {\n await onSubmit({ name, email, password });\n } catch (err) {\n setError(err instanceof Error ? err.message : t('register.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('register.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('register.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n <InputCatto\n type=\"password\"\n label={t('register.passwordLabel')}\n value={password}\n onChange={(value) => setPassword(value)}\n required\n autoComplete=\"new-password\"\n minLength={8}\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={submitting}>\n {submitting ? t('register.submitting') : t('register.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default RegisterUserFormCatto;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { ButtonCatto, InputCatto } from '@ccatto/ui';\nimport { useTranslations } from 'next-intl';\n\nexport interface ProfileValues {\n name: string;\n email: string;\n}\n\nexport interface UserProfileFormCattoProps {\n /** Pre-fills the form. The component re-syncs if `initialValues` changes. */\n initialValues: ProfileValues;\n /**\n * Called with the edited `{ name, email }` when the user saves. Throw (or\n * reject) to surface an error in the form's red-text region. The form\n * shows a transient \"Saved\" confirmation on success and stays in place —\n * navigation, if any, is the caller's responsibility.\n */\n onSubmit: (values: ProfileValues) => Promise<void> | void;\n /**\n * next-intl namespace this form's labels are read from. The keys it expects\n * inside the namespace are `profile.cardTitle`, `profile.nameLabel`,\n * `profile.emailLabel`, `profile.submit`, `profile.submitting`,\n * `profile.errorGeneric`, `profile.successMessage`. Defaults to `auth`.\n */\n i18nNamespace?: string;\n}\n\nconst UserProfileFormCatto = ({\n initialValues,\n onSubmit,\n i18nNamespace = 'auth',\n}: UserProfileFormCattoProps) => {\n const t = useTranslations(i18nNamespace);\n const [name, setName] = useState(initialValues.name);\n const [email, setEmail] = useState(initialValues.email);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n // Re-sync if the parent provides a different initialValues (e.g. session\n // refetched after a save).\n useEffect(() => {\n setName(initialValues.name);\n setEmail(initialValues.email);\n }, [initialValues.name, initialValues.email]);\n\n const dirty =\n name.trim() !== initialValues.name.trim() ||\n email.trim() !== initialValues.email.trim();\n\n const canSubmit =\n dirty && name.trim().length > 0 && email.trim().length > 0 && !submitting;\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setSuccess(false);\n if (!canSubmit) return;\n setSubmitting(true);\n try {\n await onSubmit({ name: name.trim(), email: email.trim() });\n setSuccess(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : t('profile.errorGeneric'));\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className=\"flex flex-col gap-4 p-4\">\n <InputCatto\n type=\"text\"\n label={t('profile.nameLabel')}\n value={name}\n onChange={(value) => setName(value)}\n required\n autoComplete=\"name\"\n />\n <InputCatto\n type=\"email\"\n label={t('profile.emailLabel')}\n value={email}\n onChange={(value) => setEmail(value)}\n required\n autoComplete=\"email\"\n />\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {success && !error && (\n <p className=\"text-sm text-green-600 dark:text-green-400\">\n {t('profile.successMessage')}\n </p>\n )}\n <ButtonCatto type=\"submit\" variant=\"primary\" disabled={!canSubmit}>\n {submitting ? t('profile.submitting') : t('profile.submit')}\n </ButtonCatto>\n </form>\n );\n};\n\nexport default UserProfileFormCatto;\n"]}
|
package/package.json
CHANGED