@enadhq/enad-react-sdk 0.0.6
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/client/cart/components/cart-drawer.d.mts +19 -0
- package/dist/client/cart/components/cart-drawer.mjs +180 -0
- package/dist/client/cart/components/cart-drawer.mjs.map +1 -0
- package/dist/client/cart/components/cart-trigger.d.mts +5 -0
- package/dist/client/cart/components/cart-trigger.mjs +18 -0
- package/dist/client/cart/components/cart-trigger.mjs.map +1 -0
- package/dist/client/cart/constants/session.d.mts +3 -0
- package/dist/client/cart/constants/session.mjs +5 -0
- package/dist/client/cart/constants/session.mjs.map +1 -0
- package/dist/client/cart/contexts/cart.d.mts +27 -0
- package/dist/client/cart/contexts/cart.mjs +22 -0
- package/dist/client/cart/contexts/cart.mjs.map +1 -0
- package/dist/client/cart/hooks/useCart.d.mts +29 -0
- package/dist/client/cart/hooks/useCart.mjs +26 -0
- package/dist/client/cart/hooks/useCart.mjs.map +1 -0
- package/dist/client/cart/hooks/useCartActions.d.mts +26 -0
- package/dist/client/cart/hooks/useCartActions.mjs +58 -0
- package/dist/client/cart/hooks/useCartActions.mjs.map +1 -0
- package/dist/client/cart/queries/addToCartQueryFn.d.mts +10 -0
- package/dist/client/cart/queries/addToCartQueryFn.mjs +27 -0
- package/dist/client/cart/queries/addToCartQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/getCartQueryFn.d.mts +7 -0
- package/dist/client/cart/queries/getCartQueryFn.mjs +34 -0
- package/dist/client/cart/queries/getCartQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.d.mts +9 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.mjs +24 -0
- package/dist/client/cart/queries/removeCartItemQueryFn.mjs.map +1 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.d.mts +10 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.mjs +27 -0
- package/dist/client/cart/queries/updateCartItemQueryFn.mjs.map +1 -0
- package/dist/client/cart/types/cart.d.mts +36 -0
- package/dist/client/cart/types/cart.mjs +1 -0
- package/dist/client/cart/types/cart.mjs.map +1 -0
- package/dist/client/cart/utils/session.d.mts +6 -0
- package/dist/client/cart/utils/session.mjs +21 -0
- package/dist/client/cart/utils/session.mjs.map +1 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.d.mts +6 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.mjs +24 -0
- package/dist/client/cms/storyblok/preview/registerStoryblokBridge.mjs.map +1 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.d.mts +22 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.mjs +79 -0
- package/dist/client/cms/storyblok/preview/storyblok-preview-syncer.mjs.map +1 -0
- package/dist/client/global/auth/withAuth.d.mts +6 -0
- package/dist/client/global/auth/withAuth.mjs +25 -0
- package/dist/client/global/auth/withAuth.mjs.map +1 -0
- package/dist/client/global/config/index.d.mts +17 -0
- package/dist/client/global/config/index.mjs +34 -0
- package/dist/client/global/config/index.mjs.map +1 -0
- package/dist/client/global/constants/tags.d.mts +16 -0
- package/dist/client/global/constants/tags.mjs +18 -0
- package/dist/client/global/constants/tags.mjs.map +1 -0
- package/dist/client/global/providers/enad-provider.d.mts +23 -0
- package/dist/client/global/providers/enad-provider.mjs +11 -0
- package/dist/client/global/providers/enad-provider.mjs.map +1 -0
- package/dist/client/search/actions/searchAction.d.mts +5 -0
- package/dist/client/search/actions/searchAction.mjs +18 -0
- package/dist/client/search/actions/searchAction.mjs.map +1 -0
- package/dist/client/search/components/search-bar.d.mts +2 -0
- package/dist/client/search/components/search-bar.mjs +1 -0
- package/dist/client/search/components/search-bar.mjs.map +1 -0
- package/dist/client/search/hooks/useSearch.d.mts +18 -0
- package/dist/client/search/hooks/useSearch.mjs +37 -0
- package/dist/client/search/hooks/useSearch.mjs.map +1 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.d.mts +14 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.mjs +30 -0
- package/dist/client/user/actions/createResetPasswordLinkAction.mjs.map +1 -0
- package/dist/client/user/actions/getUserAction.d.mts +5 -0
- package/dist/client/user/actions/getUserAction.mjs +19 -0
- package/dist/client/user/actions/getUserAction.mjs.map +1 -0
- package/dist/client/user/actions/logInUserAction.d.mts +15 -0
- package/dist/client/user/actions/logInUserAction.mjs +34 -0
- package/dist/client/user/actions/logInUserAction.mjs.map +1 -0
- package/dist/client/user/actions/logoutUserAction.d.mts +3 -0
- package/dist/client/user/actions/logoutUserAction.mjs +10 -0
- package/dist/client/user/actions/logoutUserAction.mjs.map +1 -0
- package/dist/client/user/actions/registerOrganisationAction.d.mts +12 -0
- package/dist/client/user/actions/registerOrganisationAction.mjs +18 -0
- package/dist/client/user/actions/registerOrganisationAction.mjs.map +1 -0
- package/dist/client/user/actions/registerUserAction.d.mts +18 -0
- package/dist/client/user/actions/registerUserAction.mjs +42 -0
- package/dist/client/user/actions/registerUserAction.mjs.map +1 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.d.mts +44 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.mjs +58 -0
- package/dist/client/user/actions/registerUserWithoutRedirectAction.mjs.map +1 -0
- package/dist/client/user/actions/updatePasswordAction.d.mts +21 -0
- package/dist/client/user/actions/updatePasswordAction.mjs +37 -0
- package/dist/client/user/actions/updatePasswordAction.mjs.map +1 -0
- package/dist/client/user/api/userRoute.d.mts +9 -0
- package/dist/client/user/api/userRoute.mjs +65 -0
- package/dist/client/user/api/userRoute.mjs.map +1 -0
- package/dist/client/user/clients/enad.d.mts +6 -0
- package/dist/client/user/clients/enad.mjs +19 -0
- package/dist/client/user/clients/enad.mjs.map +1 -0
- package/dist/client/user/components/login-form.d.mts +20 -0
- package/dist/client/user/components/login-form.mjs +113 -0
- package/dist/client/user/components/login-form.mjs.map +1 -0
- package/dist/client/user/components/reset-password-form.d.mts +15 -0
- package/dist/client/user/components/reset-password-form.mjs +86 -0
- package/dist/client/user/components/reset-password-form.mjs.map +1 -0
- package/dist/client/user/components/sign-out.d.mts +5 -0
- package/dist/client/user/components/sign-out.mjs +23 -0
- package/dist/client/user/components/sign-out.mjs.map +1 -0
- package/dist/client/user/components/signup-form.d.mts +15 -0
- package/dist/client/user/components/signup-form.mjs +155 -0
- package/dist/client/user/components/signup-form.mjs.map +1 -0
- package/dist/client/user/components/signup-organisation-form.d.mts +20 -0
- package/dist/client/user/components/signup-organisation-form.mjs +813 -0
- package/dist/client/user/components/signup-organisation-form.mjs.map +1 -0
- package/dist/client/user/components/update-password-form.d.mts +11 -0
- package/dist/client/user/components/update-password-form.mjs +69 -0
- package/dist/client/user/components/update-password-form.mjs.map +1 -0
- package/dist/client/user/hooks/index.d.mts +3 -0
- package/dist/client/user/hooks/index.mjs +2 -0
- package/dist/client/user/hooks/index.mjs.map +1 -0
- package/dist/client/user/hooks/useUser.d.mts +16 -0
- package/dist/client/user/hooks/useUser.mjs +32 -0
- package/dist/client/user/hooks/useUser.mjs.map +1 -0
- package/dist/client/user/types/user.d.mts +202 -0
- package/dist/client/user/types/user.mjs +1 -0
- package/dist/client/user/types/user.mjs.map +1 -0
- package/dist/client/user/utils/userCookieService.d.mts +20 -0
- package/dist/client/user/utils/userCookieService.mjs +51 -0
- package/dist/client/user/utils/userCookieService.mjs.map +1 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.d.mts +7 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/addItemsToWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.d.mts +6 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.mjs +20 -0
- package/dist/client/wishlist/actions/createOrGetShareTokenAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/createWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/createWishlistAction.mjs +16 -0
- package/dist/client/wishlist/actions/createWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.d.mts +7 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/deleteItemsFromWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.d.mts +5 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.mjs +16 -0
- package/dist/client/wishlist/actions/deleteWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/getSharedWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/getSpecificWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/getUserWishlists.d.mts +7 -0
- package/dist/client/wishlist/actions/getUserWishlists.mjs +25 -0
- package/dist/client/wishlist/actions/getUserWishlists.mjs.map +1 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.d.mts +5 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.mjs +20 -0
- package/dist/client/wishlist/actions/revokeShareTokenAction.mjs.map +1 -0
- package/dist/client/wishlist/actions/updateWishlistAction.d.mts +6 -0
- package/dist/client/wishlist/actions/updateWishlistAction.mjs +20 -0
- package/dist/client/wishlist/actions/updateWishlistAction.mjs.map +1 -0
- package/dist/client/wishlist/hooks/index.d.mts +3 -0
- package/dist/client/wishlist/hooks/index.mjs +2 -0
- package/dist/client/wishlist/hooks/index.mjs.map +1 -0
- package/dist/client/wishlist/hooks/useWishlist.d.mts +98 -0
- package/dist/client/wishlist/hooks/useWishlist.mjs +66 -0
- package/dist/client/wishlist/hooks/useWishlist.mjs.map +1 -0
- package/dist/client/wishlist/hooks/useWishlistActions.d.mts +48 -0
- package/dist/client/wishlist/hooks/useWishlistActions.mjs +101 -0
- package/dist/client/wishlist/hooks/useWishlistActions.mjs.map +1 -0
- package/dist/client/wishlist/wishlist-drawer.d.mts +19 -0
- package/dist/client/wishlist/wishlist-drawer.mjs +180 -0
- package/dist/client/wishlist/wishlist-drawer.mjs.map +1 -0
- package/dist/styles.css +959 -0
- package/package.json +64 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { logInUserAction } from "../actions/logInUserAction";
|
|
5
|
+
const LoginForm = ({
|
|
6
|
+
title = "Welcome back",
|
|
7
|
+
subtitle = "Sign in to access your account",
|
|
8
|
+
emailLabel = "Email address",
|
|
9
|
+
emailPlaceholder = "you@example.com",
|
|
10
|
+
passwordLabel = "Password",
|
|
11
|
+
passwordPlaceholder = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
12
|
+
forgotPasswordLink = "/reset-password/start",
|
|
13
|
+
submitText = "Sign In",
|
|
14
|
+
signup = { href: "/signup", label: "Sign up" },
|
|
15
|
+
successRedirect = "/"
|
|
16
|
+
}) => {
|
|
17
|
+
const [errors, setErrors] = useState({});
|
|
18
|
+
const [isPending, setIsPending] = useState(false);
|
|
19
|
+
const action = async (formData) => {
|
|
20
|
+
setIsPending(true);
|
|
21
|
+
setErrors({});
|
|
22
|
+
const res = await logInUserAction(formData, { redirectPath: successRedirect });
|
|
23
|
+
if (res?.errors) {
|
|
24
|
+
setErrors(res.errors);
|
|
25
|
+
}
|
|
26
|
+
setIsPending(false);
|
|
27
|
+
};
|
|
28
|
+
const handleSubmit = async (e) => {
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
const formData = new FormData(e.currentTarget);
|
|
31
|
+
await action(formData);
|
|
32
|
+
};
|
|
33
|
+
return /* @__PURE__ */ jsx("main", { className: "flex items-center justify-center px-4 font-enad", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md bg-(--enad-surface) border border-(--enad-border-color) shadow-lg rounded-(--enad-border-radius) p-8", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold text-(--enad-text-primary-color) mb-2 text-center", children: title }),
|
|
35
|
+
/* @__PURE__ */ jsx("p", { className: "text-(--enad-text-muted-color) text-sm text-center mb-8", children: subtitle }),
|
|
36
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
37
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"label",
|
|
40
|
+
{
|
|
41
|
+
htmlFor: "email",
|
|
42
|
+
className: "block text-sm font-medium text-(--enad-text-primary-color) mb-1",
|
|
43
|
+
children: emailLabel
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
"input",
|
|
48
|
+
{
|
|
49
|
+
type: "email",
|
|
50
|
+
id: "email",
|
|
51
|
+
name: "email",
|
|
52
|
+
required: true,
|
|
53
|
+
placeholder: emailPlaceholder,
|
|
54
|
+
className: "w-full px-4 py-2.5 border border-(--enad-border-color) rounded-(--enad-border-radius) focus:ring-2 focus:ring-(--enad-button-bg) focus:border-(--enad-button-bg) outline-none transition text-(--enad-text-primary-color) bg-(--enad-background)"
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
errors.email && /* @__PURE__ */ jsx("p", { className: "text-(--enad-error-color) text-sm mt-1", children: errors.email.join(", ") })
|
|
58
|
+
] }),
|
|
59
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"label",
|
|
62
|
+
{
|
|
63
|
+
htmlFor: "password",
|
|
64
|
+
className: "block text-sm font-medium text-(--enad-text-primary-color) mb-1",
|
|
65
|
+
children: passwordLabel
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ jsx(
|
|
69
|
+
"input",
|
|
70
|
+
{
|
|
71
|
+
type: "password",
|
|
72
|
+
id: "password",
|
|
73
|
+
name: "password",
|
|
74
|
+
required: true,
|
|
75
|
+
placeholder: passwordPlaceholder,
|
|
76
|
+
className: "w-full px-4 py-2.5 border border-(--enad-border-color) rounded-(--enad-border-radius) focus:ring-2 focus:ring-(--enad-button-bg) focus:border-(--enad-button-bg) outline-none transition text-(--enad-text-primary-color) bg-(--enad-background)"
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
errors.password && /* @__PURE__ */ jsx("p", { className: "text-(--enad-error-color) text-sm mt-1", children: errors.password.join(", ") })
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-start text-sm", children: /* @__PURE__ */ jsx(
|
|
82
|
+
"a",
|
|
83
|
+
{
|
|
84
|
+
href: forgotPasswordLink,
|
|
85
|
+
className: "text-(--enad-link-color) hover:text-(--enad-link-hover-color) transition",
|
|
86
|
+
children: "Forgot password?"
|
|
87
|
+
}
|
|
88
|
+
) }),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
type: "submit",
|
|
93
|
+
disabled: isPending,
|
|
94
|
+
className: "w-full py-2.5 bg-(--enad-button-bg) hover:bg-(--enad-button-hover-bg) text-(--enad-button-color) font-medium rounded-(--enad-border-radius) transition shadow-sm hover:shadow",
|
|
95
|
+
children: isPending ? "Signing in..." : submitText
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
errors.general && /* @__PURE__ */ jsx("p", { className: "text-(--enad-error-color) text-sm mt-2 text-center", children: errors.general.join(", ") })
|
|
99
|
+
] }),
|
|
100
|
+
signup && /* @__PURE__ */ jsx("p", { className: "text-sm text-(--enad-text-muted-color) text-center mt-2", children: /* @__PURE__ */ jsx(
|
|
101
|
+
"a",
|
|
102
|
+
{
|
|
103
|
+
href: signup.href,
|
|
104
|
+
className: "text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium",
|
|
105
|
+
children: signup.label
|
|
106
|
+
}
|
|
107
|
+
) })
|
|
108
|
+
] }) });
|
|
109
|
+
};
|
|
110
|
+
export {
|
|
111
|
+
LoginForm
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=login-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/user/components/login-form.tsx"],"sourcesContent":["\"use client\"\n\nimport React, { useState, FormEvent } from \"react\"\nimport { logInUserAction } from \"../actions/logInUserAction\"\n\ninterface LoginFormProps {\n title?: string\n subtitle?: string\n emailLabel?: string\n emailPlaceholder?: string\n passwordLabel?: string\n passwordPlaceholder?: string\n forgotPasswordLink?: string\n submitText?: string\n signup?: {\n href: string\n label: string\n }\n successRedirect?: string\n}\n\ninterface FormErrors {\n email?: string[]\n password?: string[]\n general?: string[]\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n title = \"Welcome back\",\n subtitle = \"Sign in to access your account\",\n emailLabel = \"Email address\",\n emailPlaceholder = \"you@example.com\",\n passwordLabel = \"Password\",\n passwordPlaceholder = \"••••••••\",\n forgotPasswordLink = \"/reset-password/start\",\n submitText = \"Sign In\",\n signup = { href: \"/signup\", label: \"Sign up\" },\n successRedirect = \"/\",\n}) => {\n const [errors, setErrors] = useState<FormErrors>({})\n const [isPending, setIsPending] = useState(false)\n\n const action = async (formData: FormData): Promise<void> => {\n setIsPending(true)\n setErrors({})\n\n const res = await logInUserAction(formData, { redirectPath: successRedirect })\n\n if (res?.errors) {\n setErrors(res.errors)\n }\n\n setIsPending(false)\n }\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n await action(formData)\n }\n\n return (\n <main className=\"flex items-center justify-center px-4 font-enad\">\n <div className=\"w-full max-w-md bg-(--enad-surface) border border-(--enad-border-color) shadow-lg rounded-(--enad-border-radius) p-8\">\n <h2 className=\"text-2xl font-semibold text-(--enad-text-primary-color) mb-2 text-center\">\n {title}\n </h2>\n <p className=\"text-(--enad-text-muted-color) text-sm text-center mb-8\">{subtitle}</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {/* Email */}\n <div>\n <label\n htmlFor=\"email\"\n className=\"block text-sm font-medium text-(--enad-text-primary-color) mb-1\"\n >\n {emailLabel}\n </label>\n <input\n type=\"email\"\n id=\"email\"\n name=\"email\"\n required\n placeholder={emailPlaceholder}\n className=\"w-full px-4 py-2.5 border border-(--enad-border-color) rounded-(--enad-border-radius) focus:ring-2 focus:ring-(--enad-button-bg) focus:border-(--enad-button-bg) outline-none transition text-(--enad-text-primary-color) bg-(--enad-background)\"\n />\n {errors.email && (\n <p className=\"text-(--enad-error-color) text-sm mt-1\">{errors.email.join(\", \")}</p>\n )}\n </div>\n\n {/* Password */}\n <div>\n <label\n htmlFor=\"password\"\n className=\"block text-sm font-medium text-(--enad-text-primary-color) mb-1\"\n >\n {passwordLabel}\n </label>\n <input\n type=\"password\"\n id=\"password\"\n name=\"password\"\n required\n placeholder={passwordPlaceholder}\n className=\"w-full px-4 py-2.5 border border-(--enad-border-color) rounded-(--enad-border-radius) focus:ring-2 focus:ring-(--enad-button-bg) focus:border-(--enad-button-bg) outline-none transition text-(--enad-text-primary-color) bg-(--enad-background)\"\n />\n {errors.password && (\n <p className=\"text-(--enad-error-color) text-sm mt-1\">{errors.password.join(\", \")}</p>\n )}\n </div>\n\n {/* Forgot password */}\n <div className=\"flex justify-start text-sm\">\n <a\n href={forgotPasswordLink}\n className=\"text-(--enad-link-color) hover:text-(--enad-link-hover-color) transition\"\n >\n Forgot password?\n </a>\n </div>\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={isPending}\n className=\"w-full py-2.5 bg-(--enad-button-bg) hover:bg-(--enad-button-hover-bg) text-(--enad-button-color) font-medium rounded-(--enad-border-radius) transition shadow-sm hover:shadow\"\n >\n {isPending ? \"Signing in...\" : submitText}\n </button>\n\n {/* General errors */}\n {errors.general && (\n <p className=\"text-(--enad-error-color) text-sm mt-2 text-center\">\n {errors.general.join(\", \")}\n </p>\n )}\n </form>\n\n {/* Signup link */}\n {signup && (\n <p className=\"text-sm text-(--enad-text-muted-color) text-center mt-2\">\n <a\n href={signup.href}\n className=\"text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium\"\n >\n {signup.label}\n </a>\n </p>\n )}\n </div>\n </main>\n )\n}\n"],"mappings":";AAgEQ,cAOE,YAPF;AA9DR,SAAgB,gBAA2B;AAC3C,SAAS,uBAAuB;AAwBzB,MAAM,YAAsC,CAAC;AAAA,EAClD,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,SAAS,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,EAC7C,kBAAkB;AACpB,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAqB,CAAC,CAAC;AACnD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,SAAS,OAAO,aAAsC;AAC1D,iBAAa,IAAI;AACjB,cAAU,CAAC,CAAC;AAEZ,UAAM,MAAM,MAAM,gBAAgB,UAAU,EAAE,cAAc,gBAAgB,CAAC;AAE7E,QAAI,KAAK,QAAQ;AACf,gBAAU,IAAI,MAAM;AAAA,IACtB;AAEA,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,eAAe,OAAO,MAAkC;AAC5D,MAAE,eAAe;AACjB,UAAM,WAAW,IAAI,SAAS,EAAE,aAAa;AAC7C,UAAM,OAAO,QAAQ;AAAA,EACvB;AAEA,SACE,oBAAC,UAAK,WAAU,mDACd,+BAAC,SAAI,WAAU,wHACb;AAAA,wBAAC,QAAG,WAAU,4EACX,iBACH;AAAA,IACA,oBAAC,OAAE,WAAU,2DAA2D,oBAAS;AAAA,IAEjF,qBAAC,UAAK,UAAU,cAAc,WAAU,aAEtC;AAAA,2BAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,IAAG;AAAA,YACH,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,aAAa;AAAA,YACb,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,OAAO,SACN,oBAAC,OAAE,WAAU,0CAA0C,iBAAO,MAAM,KAAK,IAAI,GAAE;AAAA,SAEnF;AAAA,MAGA,qBAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YAET;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,IAAG;AAAA,YACH,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,aAAa;AAAA,YACb,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,OAAO,YACN,oBAAC,OAAE,WAAU,0CAA0C,iBAAO,SAAS,KAAK,IAAI,GAAE;AAAA,SAEtF;AAAA,MAGA,oBAAC,SAAI,WAAU,8BACb;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACX;AAAA;AAAA,MAED,GACF;AAAA,MAGA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,WAAU;AAAA,UAET,sBAAY,kBAAkB;AAAA;AAAA,MACjC;AAAA,MAGC,OAAO,WACN,oBAAC,OAAE,WAAU,sDACV,iBAAO,QAAQ,KAAK,IAAI,GAC3B;AAAA,OAEJ;AAAA,IAGC,UACC,oBAAC,OAAE,WAAU,2DACX;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,OAAO;AAAA,QACb,WAAU;AAAA,QAET,iBAAO;AAAA;AAAA,IACV,GACF;AAAA,KAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface ResetPasswordFormProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
submitText?: string;
|
|
7
|
+
extraLink?: {
|
|
8
|
+
href: string;
|
|
9
|
+
text: string;
|
|
10
|
+
};
|
|
11
|
+
successRedirect?: string;
|
|
12
|
+
}
|
|
13
|
+
declare const ResetPasswordForm: React__default.FC<ResetPasswordFormProps>;
|
|
14
|
+
|
|
15
|
+
export { ResetPasswordForm };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { createPasswordResetLinkAction } from "../actions/createResetPasswordLinkAction";
|
|
5
|
+
const ResetPasswordForm = ({
|
|
6
|
+
title = "Reset your password",
|
|
7
|
+
subtitle = "Enter your email to receive reset instructions",
|
|
8
|
+
submitText = "Send Reset Link",
|
|
9
|
+
extraLink = { href: "/login", text: "Back to sign in" },
|
|
10
|
+
successRedirect = "/login"
|
|
11
|
+
}) => {
|
|
12
|
+
const [errors, setErrors] = useState({});
|
|
13
|
+
const [isPending, setIsPending] = useState(false);
|
|
14
|
+
const [successMessage, setSuccessMessage] = useState("");
|
|
15
|
+
const action = async (formData) => {
|
|
16
|
+
setIsPending(true);
|
|
17
|
+
setErrors({});
|
|
18
|
+
setSuccessMessage("");
|
|
19
|
+
const res = await createPasswordResetLinkAction(formData, { redirectPath: successRedirect });
|
|
20
|
+
if (res?.errors) {
|
|
21
|
+
setErrors(res.errors);
|
|
22
|
+
} else {
|
|
23
|
+
setSuccessMessage("Check your email for reset instructions.");
|
|
24
|
+
}
|
|
25
|
+
setIsPending(false);
|
|
26
|
+
};
|
|
27
|
+
const handleSubmit = async (e) => {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
const formData = new FormData(e.currentTarget);
|
|
30
|
+
await action(formData);
|
|
31
|
+
};
|
|
32
|
+
const inputClasses = `
|
|
33
|
+
w-full px-4 py-2.5 border border-(--enad-border-color)
|
|
34
|
+
rounded-(--enad-border-radius)
|
|
35
|
+
focus:ring-2 focus:ring-(--enad-button-bg)
|
|
36
|
+
focus:border-(--enad-button-bg)
|
|
37
|
+
outline-none transition
|
|
38
|
+
bg-(--enad-background) text-(--enad-text-primary-color)
|
|
39
|
+
`;
|
|
40
|
+
const buttonClasses = `
|
|
41
|
+
w-full py-2.5 bg-(--enad-button-bg)
|
|
42
|
+
hover:bg-(--enad-button-hover-bg)
|
|
43
|
+
text-(--enad-button-color)
|
|
44
|
+
font-medium rounded-(--enad-border-radius)
|
|
45
|
+
transition shadow-sm hover:shadow
|
|
46
|
+
`;
|
|
47
|
+
const labelClasses = `block text-sm font-medium text-(--enad-text-primary-color) mb-1`;
|
|
48
|
+
const errorClasses = `text-(--enad-error-color) text-sm mt-1`;
|
|
49
|
+
const successClasses = `text-(--enad-success-color) text-sm mt-2 text-center`;
|
|
50
|
+
return /* @__PURE__ */ jsx("main", { className: "flex items-center justify-center px-4 font-enad", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md bg-(--enad-surface) shadow-lg p-8 border border-(--enad-border-color) rounded-(--enad-border-radius)", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold text-(--enad-text-primary-color) mb-2 text-center", children: title }),
|
|
52
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-(--enad-text-muted-color) mb-8 text-center", children: subtitle }),
|
|
53
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
54
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
55
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "email", className: labelClasses, children: "Email" }),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
"input",
|
|
58
|
+
{
|
|
59
|
+
type: "email",
|
|
60
|
+
id: "email",
|
|
61
|
+
name: "email",
|
|
62
|
+
required: true,
|
|
63
|
+
placeholder: "you@example.com",
|
|
64
|
+
className: inputClasses
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
errors.email && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.email.join(", ") })
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ jsx("button", { type: "submit", disabled: isPending, className: buttonClasses, children: isPending ? "Sending..." : submitText }),
|
|
70
|
+
errors.general && /* @__PURE__ */ jsx("p", { className: errorClasses + " text-center", children: errors.general.join(", ") }),
|
|
71
|
+
successMessage && /* @__PURE__ */ jsx("p", { className: successClasses, children: successMessage })
|
|
72
|
+
] }),
|
|
73
|
+
extraLink && /* @__PURE__ */ jsx("p", { className: "text-sm text-(--enad-text-muted-color) text-center mt-4", children: /* @__PURE__ */ jsx(
|
|
74
|
+
"a",
|
|
75
|
+
{
|
|
76
|
+
href: extraLink.href,
|
|
77
|
+
className: "text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium",
|
|
78
|
+
children: extraLink.text
|
|
79
|
+
}
|
|
80
|
+
) })
|
|
81
|
+
] }) });
|
|
82
|
+
};
|
|
83
|
+
export {
|
|
84
|
+
ResetPasswordForm
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=reset-password-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/user/components/reset-password-form.tsx"],"sourcesContent":["\"use client\"\n\nimport React, { useState, FormEvent } from \"react\"\nimport { createPasswordResetLinkAction } from \"../actions/createResetPasswordLinkAction\"\n\ninterface ResetPasswordFormProps {\n title?: string\n subtitle?: string\n submitText?: string\n extraLink?: {\n href: string\n text: string\n }\n successRedirect?: string\n}\n\ninterface FormErrors {\n email?: string[]\n general?: string[]\n}\n\nexport const ResetPasswordForm: React.FC<ResetPasswordFormProps> = ({\n title = \"Reset your password\",\n subtitle = \"Enter your email to receive reset instructions\",\n submitText = \"Send Reset Link\",\n extraLink = { href: \"/login\", text: \"Back to sign in\" },\n successRedirect = \"/login\",\n}) => {\n const [errors, setErrors] = useState<FormErrors>({})\n const [isPending, setIsPending] = useState(false)\n const [successMessage, setSuccessMessage] = useState(\"\")\n\n const action = async (formData: FormData) => {\n setIsPending(true)\n setErrors({})\n setSuccessMessage(\"\")\n\n const res = await createPasswordResetLinkAction(formData, { redirectPath: successRedirect })\n\n if (res?.errors) {\n setErrors(res.errors)\n } else {\n setSuccessMessage(\"Check your email for reset instructions.\")\n }\n\n setIsPending(false)\n }\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n await action(formData)\n }\n\n const inputClasses = `\n w-full px-4 py-2.5 border border-(--enad-border-color)\n rounded-(--enad-border-radius)\n focus:ring-2 focus:ring-(--enad-button-bg)\n focus:border-(--enad-button-bg)\n outline-none transition\n bg-(--enad-background) text-(--enad-text-primary-color)\n `\n\n const buttonClasses = `\n w-full py-2.5 bg-(--enad-button-bg)\n hover:bg-(--enad-button-hover-bg)\n text-(--enad-button-color)\n font-medium rounded-(--enad-border-radius)\n transition shadow-sm hover:shadow\n `\n\n const labelClasses = `block text-sm font-medium text-(--enad-text-primary-color) mb-1`\n const errorClasses = `text-(--enad-error-color) text-sm mt-1`\n const successClasses = `text-(--enad-success-color) text-sm mt-2 text-center`\n\n return (\n <main className=\"flex items-center justify-center px-4 font-enad\">\n <div className=\"w-full max-w-md bg-(--enad-surface) shadow-lg p-8 border border-(--enad-border-color) rounded-(--enad-border-radius)\">\n <h2 className=\"text-2xl font-semibold text-(--enad-text-primary-color) mb-2 text-center\">\n {title}\n </h2>\n <p className=\"text-sm text-(--enad-text-muted-color) mb-8 text-center\">{subtitle}</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {/* Email */}\n <div>\n <label htmlFor=\"email\" className={labelClasses}>\n Email\n </label>\n <input\n type=\"email\"\n id=\"email\"\n name=\"email\"\n required\n placeholder=\"you@example.com\"\n className={inputClasses}\n />\n {errors.email && <p className={errorClasses}>{errors.email.join(\", \")}</p>}\n </div>\n\n {/* Submit */}\n <button type=\"submit\" disabled={isPending} className={buttonClasses}>\n {isPending ? \"Sending...\" : submitText}\n </button>\n\n {/* General error */}\n {errors.general && (\n <p className={errorClasses + \" text-center\"}>{errors.general.join(\", \")}</p>\n )}\n\n {/* Success message */}\n {successMessage && <p className={successClasses}>{successMessage}</p>}\n </form>\n\n {/* Extra Link */}\n {extraLink && (\n <p className=\"text-sm text-(--enad-text-muted-color) text-center mt-4\">\n <a\n href={extraLink.href}\n className=\"text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium\"\n >\n {extraLink.text}\n </a>\n </p>\n )}\n </div>\n </main>\n )\n}\n"],"mappings":";AA8EQ,cAOE,YAPF;AA5ER,SAAgB,gBAA2B;AAC3C,SAAS,qCAAqC;AAkBvC,MAAM,oBAAsD,CAAC;AAAA,EAClE,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY,EAAE,MAAM,UAAU,MAAM,kBAAkB;AAAA,EACtD,kBAAkB;AACpB,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAqB,CAAC,CAAC;AACnD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,EAAE;AAEvD,QAAM,SAAS,OAAO,aAAuB;AAC3C,iBAAa,IAAI;AACjB,cAAU,CAAC,CAAC;AACZ,sBAAkB,EAAE;AAEpB,UAAM,MAAM,MAAM,8BAA8B,UAAU,EAAE,cAAc,gBAAgB,CAAC;AAE3F,QAAI,KAAK,QAAQ;AACf,gBAAU,IAAI,MAAM;AAAA,IACtB,OAAO;AACL,wBAAkB,0CAA0C;AAAA,IAC9D;AAEA,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,eAAe,OAAO,MAAkC;AAC5D,MAAE,eAAe;AACjB,UAAM,WAAW,IAAI,SAAS,EAAE,aAAa;AAC7C,UAAM,OAAO,QAAQ;AAAA,EACvB;AAEA,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASrB,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQtB,QAAM,eAAe;AACrB,QAAM,eAAe;AACrB,QAAM,iBAAiB;AAEvB,SACE,oBAAC,UAAK,WAAU,mDACd,+BAAC,SAAI,WAAU,wHACb;AAAA,wBAAC,QAAG,WAAU,4EACX,iBACH;AAAA,IACA,oBAAC,OAAE,WAAU,2DAA2D,oBAAS;AAAA,IAEjF,qBAAC,UAAK,UAAU,cAAc,WAAU,aAEtC;AAAA,2BAAC,SACC;AAAA,4BAAC,WAAM,SAAQ,SAAQ,WAAW,cAAc,mBAEhD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,IAAG;AAAA,YACH,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,aAAY;AAAA,YACZ,WAAW;AAAA;AAAA,QACb;AAAA,QACC,OAAO,SAAS,oBAAC,OAAE,WAAW,cAAe,iBAAO,MAAM,KAAK,IAAI,GAAE;AAAA,SACxE;AAAA,MAGA,oBAAC,YAAO,MAAK,UAAS,UAAU,WAAW,WAAW,eACnD,sBAAY,eAAe,YAC9B;AAAA,MAGC,OAAO,WACN,oBAAC,OAAE,WAAW,eAAe,gBAAiB,iBAAO,QAAQ,KAAK,IAAI,GAAE;AAAA,MAIzE,kBAAkB,oBAAC,OAAE,WAAW,gBAAiB,0BAAe;AAAA,OACnE;AAAA,IAGC,aACC,oBAAC,OAAE,WAAU,2DACX;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,UAAU;AAAA,QAChB,WAAU;AAAA,QAET,oBAAU;AAAA;AAAA,IACb,GACF;AAAA,KAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { logOutUserAction } from "../actions/logoutUserAction";
|
|
5
|
+
const SignOut = () => {
|
|
6
|
+
const queryClient = useQueryClient();
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
"button",
|
|
9
|
+
{
|
|
10
|
+
onClick: async () => {
|
|
11
|
+
const success = await logOutUserAction();
|
|
12
|
+
if (success) {
|
|
13
|
+
queryClient.setQueryData(["user"], null);
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
children: "Sign out"
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
SignOut
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=sign-out.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/user/components/sign-out.tsx"],"sourcesContent":["\"use client\"\n\nimport { useQueryClient } from \"@tanstack/react-query\"\nimport { logOutUserAction } from \"../actions/logoutUserAction\"\n\nexport const SignOut = () => {\n const queryClient = useQueryClient()\n\n return (\n <button\n onClick={async () => {\n const success = await logOutUserAction()\n\n if (success) {\n queryClient.setQueryData([\"user\"], null)\n }\n }}\n >\n Sign out\n </button>\n )\n}\n"],"mappings":";AASI;AAPJ,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAE1B,MAAM,UAAU,MAAM;AAC3B,QAAM,cAAc,eAAe;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,YAAY;AACnB,cAAM,UAAU,MAAM,iBAAiB;AAEvC,YAAI,SAAS;AACX,sBAAY,aAAa,CAAC,MAAM,GAAG,IAAI;AAAA,QACzC;AAAA,MACF;AAAA,MACD;AAAA;AAAA,EAED;AAEJ;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface SignupFormProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
submitText?: string;
|
|
7
|
+
extraLink?: {
|
|
8
|
+
href: string;
|
|
9
|
+
text: string;
|
|
10
|
+
};
|
|
11
|
+
successRedirect: string;
|
|
12
|
+
}
|
|
13
|
+
declare const SignupForm: React__default.FC<SignupFormProps>;
|
|
14
|
+
|
|
15
|
+
export { SignupForm };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { registerUserAction } from "../actions/registerUserAction";
|
|
5
|
+
const SignupForm = ({
|
|
6
|
+
title = "Create your account",
|
|
7
|
+
subtitle = "Sign up to get started",
|
|
8
|
+
submitText = "Sign Up",
|
|
9
|
+
extraLink = { href: "/login", text: "Already have an account? Sign in" },
|
|
10
|
+
successRedirect = "/"
|
|
11
|
+
}) => {
|
|
12
|
+
const [errors, setErrors] = useState({});
|
|
13
|
+
const [isPending, setIsPending] = useState(false);
|
|
14
|
+
const action = async (formData) => {
|
|
15
|
+
setIsPending(true);
|
|
16
|
+
setErrors({});
|
|
17
|
+
const res = await registerUserAction(formData, { redirectPath: successRedirect });
|
|
18
|
+
if (res?.errors) {
|
|
19
|
+
setErrors(res.errors);
|
|
20
|
+
}
|
|
21
|
+
setIsPending(false);
|
|
22
|
+
};
|
|
23
|
+
const handleSubmit = async (e) => {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
const formData = new FormData(e.currentTarget);
|
|
26
|
+
await action(formData);
|
|
27
|
+
};
|
|
28
|
+
const inputBaseClasses = `
|
|
29
|
+
w-full px-4 py-2.5
|
|
30
|
+
border border-(--enad-border-color)
|
|
31
|
+
rounded-(--enad-border-radius)
|
|
32
|
+
focus:ring-2 focus:ring-(--enad-button-bg)
|
|
33
|
+
focus:border-(--enad-button-bg)
|
|
34
|
+
outline-none transition
|
|
35
|
+
bg-(--enad-background)
|
|
36
|
+
text-(--enad-text-primary-color)
|
|
37
|
+
`;
|
|
38
|
+
const buttonBaseClasses = `
|
|
39
|
+
w-full py-2.5
|
|
40
|
+
bg-(--enad-button-bg)
|
|
41
|
+
hover:bg-(--enad-button-hover-bg)
|
|
42
|
+
text-(--enad-button-color)
|
|
43
|
+
font-medium rounded-(--enad-border-radius)
|
|
44
|
+
transition shadow-sm hover:shadow
|
|
45
|
+
`;
|
|
46
|
+
const labelClasses = `block text-sm font-medium text-(--enad-text-primary-color) mb-1`;
|
|
47
|
+
const checkboxLabelClasses = `ml-2 text-sm text-(--enad-text-primary-color)`;
|
|
48
|
+
const errorClasses = `text-(--enad-error-color) text-sm mt-1`;
|
|
49
|
+
return /* @__PURE__ */ jsx("main", { className: "flex items-center justify-center px-4", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md bg-(--enad-surface) shadow-lg p-8 border border-(--enad-border-color) rounded-(--enad-border-radius)", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold mb-2 text-center text-(--enad-text-primary-color)", children: title }),
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm mb-8 text-center text-(--enad-text-muted-color)", children: subtitle }),
|
|
52
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
53
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
54
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "firstName", className: labelClasses, children: "First Name" }),
|
|
55
|
+
/* @__PURE__ */ jsx(
|
|
56
|
+
"input",
|
|
57
|
+
{
|
|
58
|
+
type: "text",
|
|
59
|
+
id: "firstName",
|
|
60
|
+
name: "firstName",
|
|
61
|
+
required: true,
|
|
62
|
+
placeholder: "John",
|
|
63
|
+
className: inputBaseClasses
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
errors.firstName && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.firstName.join(", ") })
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
69
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "lastName", className: labelClasses, children: "Last Name" }),
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
"input",
|
|
72
|
+
{
|
|
73
|
+
type: "text",
|
|
74
|
+
id: "lastName",
|
|
75
|
+
name: "lastName",
|
|
76
|
+
required: true,
|
|
77
|
+
placeholder: "Doe",
|
|
78
|
+
className: inputBaseClasses
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
errors.lastName && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.lastName.join(", ") })
|
|
82
|
+
] }),
|
|
83
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
84
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "email", className: labelClasses, children: "Email" }),
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
"input",
|
|
87
|
+
{
|
|
88
|
+
type: "email",
|
|
89
|
+
id: "email",
|
|
90
|
+
name: "email",
|
|
91
|
+
required: true,
|
|
92
|
+
placeholder: "you@example.com",
|
|
93
|
+
className: inputBaseClasses
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
errors.email && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.email.join(", ") })
|
|
97
|
+
] }),
|
|
98
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
99
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "password", className: labelClasses, children: "Password" }),
|
|
100
|
+
/* @__PURE__ */ jsx(
|
|
101
|
+
"input",
|
|
102
|
+
{
|
|
103
|
+
type: "password",
|
|
104
|
+
id: "password",
|
|
105
|
+
name: "password",
|
|
106
|
+
required: true,
|
|
107
|
+
placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
108
|
+
className: inputBaseClasses
|
|
109
|
+
}
|
|
110
|
+
),
|
|
111
|
+
errors.password && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.password.join(", ") })
|
|
112
|
+
] }),
|
|
113
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
114
|
+
/* @__PURE__ */ jsx(
|
|
115
|
+
"input",
|
|
116
|
+
{
|
|
117
|
+
type: "checkbox",
|
|
118
|
+
id: "acceptTerms",
|
|
119
|
+
name: "acceptTerms",
|
|
120
|
+
required: true,
|
|
121
|
+
className: "h-4 w-4 text-(--enad-button-bg) focus:ring-2 focus:ring-(--enad-button-bg) border border-(--enad-border-color) rounded transition"
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
/* @__PURE__ */ jsxs("label", { htmlFor: "acceptTerms", className: checkboxLabelClasses, children: [
|
|
125
|
+
"I accept the",
|
|
126
|
+
" ",
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
"a",
|
|
129
|
+
{
|
|
130
|
+
href: "/terms",
|
|
131
|
+
target: "_blank",
|
|
132
|
+
className: "text-(--enad-link-color) hover:text-(--enad-link-hover-color) hover:underline",
|
|
133
|
+
children: "terms and conditions"
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
] })
|
|
137
|
+
] }),
|
|
138
|
+
errors.acceptTerms && /* @__PURE__ */ jsx("p", { className: errorClasses, children: errors.acceptTerms.join(", ") }),
|
|
139
|
+
/* @__PURE__ */ jsx("button", { type: "submit", disabled: isPending, className: buttonBaseClasses, children: isPending ? "Signing up..." : submitText }),
|
|
140
|
+
errors.general && /* @__PURE__ */ jsx("p", { className: errorClasses + " mt-2 text-center", children: errors.general.join(", ") })
|
|
141
|
+
] }),
|
|
142
|
+
extraLink && /* @__PURE__ */ jsx("p", { className: "text-sm text-(--enad-text-muted-color) text-center mt-2", children: /* @__PURE__ */ jsx(
|
|
143
|
+
"a",
|
|
144
|
+
{
|
|
145
|
+
href: extraLink.href,
|
|
146
|
+
className: "text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium",
|
|
147
|
+
children: extraLink.text
|
|
148
|
+
}
|
|
149
|
+
) })
|
|
150
|
+
] }) });
|
|
151
|
+
};
|
|
152
|
+
export {
|
|
153
|
+
SignupForm
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=signup-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/user/components/signup-form.tsx"],"sourcesContent":["\"use client\"\n\nimport React, { useState, FormEvent } from \"react\"\nimport { registerUserAction } from \"../actions/registerUserAction\"\n\ninterface SignupFormProps {\n title?: string\n subtitle?: string\n submitText?: string\n extraLink?: {\n href: string\n text: string\n }\n successRedirect: string\n}\n\ninterface FormErrors {\n firstName?: string[]\n lastName?: string[]\n email?: string[]\n password?: string[]\n acceptTerms?: string[]\n general?: string[]\n}\n\nexport const SignupForm: React.FC<SignupFormProps> = ({\n title = \"Create your account\",\n subtitle = \"Sign up to get started\",\n submitText = \"Sign Up\",\n extraLink = { href: \"/login\", text: \"Already have an account? Sign in\" },\n successRedirect = \"/\",\n}) => {\n const [errors, setErrors] = useState<FormErrors>({})\n const [isPending, setIsPending] = useState(false)\n\n const action = async (formData: FormData) => {\n setIsPending(true)\n setErrors({})\n\n const res = await registerUserAction(formData, { redirectPath: successRedirect })\n\n if (res?.errors) {\n setErrors(res.errors)\n }\n\n setIsPending(false)\n }\n\n const handleSubmit = async (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n await action(formData)\n }\n\n const inputBaseClasses = `\n w-full px-4 py-2.5\n border border-(--enad-border-color) \n rounded-(--enad-border-radius)\n focus:ring-2 focus:ring-(--enad-button-bg)\n focus:border-(--enad-button-bg)\n outline-none transition\n bg-(--enad-background)\n text-(--enad-text-primary-color)\n `\n\n const buttonBaseClasses = `\n w-full py-2.5\n bg-(--enad-button-bg)\n hover:bg-(--enad-button-hover-bg)\n text-(--enad-button-color)\n font-medium rounded-(--enad-border-radius)\n transition shadow-sm hover:shadow\n `\n\n const labelClasses = `block text-sm font-medium text-(--enad-text-primary-color) mb-1`\n const checkboxLabelClasses = `ml-2 text-sm text-(--enad-text-primary-color)`\n const errorClasses = `text-(--enad-error-color) text-sm mt-1`\n\n return (\n <main className=\"flex items-center justify-center px-4\">\n <div className=\"w-full max-w-md bg-(--enad-surface) shadow-lg p-8 border border-(--enad-border-color) rounded-(--enad-border-radius)\">\n <h2 className=\"text-2xl font-semibold mb-2 text-center text-(--enad-text-primary-color)\">\n {title}\n </h2>\n <p className=\"text-sm mb-8 text-center text-(--enad-text-muted-color)\">{subtitle}</p>\n\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {/* First Name */}\n <div>\n <label htmlFor=\"firstName\" className={labelClasses}>\n First Name\n </label>\n <input\n type=\"text\"\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"John\"\n className={inputBaseClasses}\n />\n {errors.firstName && <p className={errorClasses}>{errors.firstName.join(\", \")}</p>}\n </div>\n\n {/* Last Name */}\n <div>\n <label htmlFor=\"lastName\" className={labelClasses}>\n Last Name\n </label>\n <input\n type=\"text\"\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Doe\"\n className={inputBaseClasses}\n />\n {errors.lastName && <p className={errorClasses}>{errors.lastName.join(\", \")}</p>}\n </div>\n\n {/* Email */}\n <div>\n <label htmlFor=\"email\" className={labelClasses}>\n Email\n </label>\n <input\n type=\"email\"\n id=\"email\"\n name=\"email\"\n required\n placeholder=\"you@example.com\"\n className={inputBaseClasses}\n />\n {errors.email && <p className={errorClasses}>{errors.email.join(\", \")}</p>}\n </div>\n\n {/* Password */}\n <div>\n <label htmlFor=\"password\" className={labelClasses}>\n Password\n </label>\n <input\n type=\"password\"\n id=\"password\"\n name=\"password\"\n required\n placeholder=\"••••••••\"\n className={inputBaseClasses}\n />\n {errors.password && <p className={errorClasses}>{errors.password.join(\", \")}</p>}\n </div>\n\n {/* Accept Terms */}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n id=\"acceptTerms\"\n name=\"acceptTerms\"\n required\n className=\"h-4 w-4 text-(--enad-button-bg) focus:ring-2 focus:ring-(--enad-button-bg) border border-(--enad-border-color) rounded transition\"\n />\n <label htmlFor=\"acceptTerms\" className={checkboxLabelClasses}>\n I accept the{\" \"}\n <a\n href=\"/terms\"\n target=\"_blank\"\n className=\"text-(--enad-link-color) hover:text-(--enad-link-hover-color) hover:underline\"\n >\n terms and conditions\n </a>\n </label>\n </div>\n {errors.acceptTerms && <p className={errorClasses}>{errors.acceptTerms.join(\", \")}</p>}\n\n {/* Submit */}\n <button type=\"submit\" disabled={isPending} className={buttonBaseClasses}>\n {isPending ? \"Signing up...\" : submitText}\n </button>\n\n {/* General errors */}\n {errors.general && (\n <p className={errorClasses + \" mt-2 text-center\"}>{errors.general.join(\", \")}</p>\n )}\n </form>\n\n {/* Extra Link */}\n {extraLink && (\n <p className=\"text-sm text-(--enad-text-muted-color) text-center mt-2\">\n <a\n href={extraLink.href}\n className=\"text-(--enad-link-color) hover:text-(--enad-link-hover-color) font-medium\"\n >\n {extraLink.text}\n </a>\n </p>\n )}\n </div>\n </main>\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
interface SignupOrganisationFormProps {
|
|
4
|
+
title?: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
submitText?: string;
|
|
7
|
+
extraLink?: {
|
|
8
|
+
href: string;
|
|
9
|
+
text: string;
|
|
10
|
+
};
|
|
11
|
+
successRedirect?: string;
|
|
12
|
+
organisationStatus?: "active" | "pending";
|
|
13
|
+
defaultMarket?: string;
|
|
14
|
+
defaultLanguage?: string;
|
|
15
|
+
defaultCountry?: string;
|
|
16
|
+
defaultStoreGroup?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const SignupOrganisationForm: React__default.FC<SignupOrganisationFormProps>;
|
|
19
|
+
|
|
20
|
+
export { SignupOrganisationForm };
|