@arch-cadre/auth 0.0.1
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/actions/basic.cjs +46 -0
- package/dist/actions/basic.d.ts +14 -0
- package/dist/actions/basic.mjs +32 -0
- package/dist/actions/email.cjs +209 -0
- package/dist/actions/email.d.ts +7 -0
- package/dist/actions/email.mjs +186 -0
- package/dist/actions/index.cjs +27 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.mjs +2 -0
- package/dist/index.cjs +16 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.mjs +9 -0
- package/dist/intl.d.ts +13 -0
- package/dist/routes.cjs +46 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.mjs +48 -0
- package/dist/types.cjs +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.mjs +0 -0
- package/dist/ui/forgot-password/components.cjs +91 -0
- package/dist/ui/forgot-password/components.d.ts +2 -0
- package/dist/ui/forgot-password/components.mjs +63 -0
- package/dist/ui/forgot-password/page.cjs +13 -0
- package/dist/ui/forgot-password/page.d.ts +2 -0
- package/dist/ui/forgot-password/page.mjs +5 -0
- package/dist/ui/layout.cjs +39 -0
- package/dist/ui/layout.d.ts +4 -0
- package/dist/ui/layout.mjs +18 -0
- package/dist/ui/reset-password/components.cjs +109 -0
- package/dist/ui/reset-password/components.d.ts +2 -0
- package/dist/ui/reset-password/components.mjs +84 -0
- package/dist/ui/reset-password/page.cjs +29 -0
- package/dist/ui/reset-password/page.d.ts +2 -0
- package/dist/ui/reset-password/page.mjs +21 -0
- package/dist/ui/reset-password/verify-email/components.cjs +106 -0
- package/dist/ui/reset-password/verify-email/components.d.ts +4 -0
- package/dist/ui/reset-password/verify-email/components.mjs +62 -0
- package/dist/ui/reset-password/verify-email/page.cjs +31 -0
- package/dist/ui/reset-password/verify-email/page.d.ts +2 -0
- package/dist/ui/reset-password/verify-email/page.mjs +21 -0
- package/dist/ui/signin/components.cjs +172 -0
- package/dist/ui/signin/components.d.ts +11 -0
- package/dist/ui/signin/components.mjs +134 -0
- package/dist/ui/signin/page.cjs +41 -0
- package/dist/ui/signin/page.d.ts +2 -0
- package/dist/ui/signin/page.mjs +39 -0
- package/dist/ui/signup/components.cjs +193 -0
- package/dist/ui/signup/components.d.ts +11 -0
- package/dist/ui/signup/components.mjs +150 -0
- package/dist/ui/signup/page.cjs +36 -0
- package/dist/ui/signup/page.d.ts +2 -0
- package/dist/ui/signup/page.mjs +34 -0
- package/dist/ui/verify-email/components.cjs +129 -0
- package/dist/ui/verify-email/components.d.ts +4 -0
- package/dist/ui/verify-email/components.mjs +76 -0
- package/dist/ui/verify-email/page.cjs +29 -0
- package/dist/ui/verify-email/page.d.ts +2 -0
- package/dist/ui/verify-email/page.mjs +21 -0
- package/dist/validation.cjs +43 -0
- package/dist/validation.d.ts +97 -0
- package/dist/validation.mjs +37 -0
- package/locales/en/global.json +35 -0
- package/manifest.json +11 -0
- package/package.json +57 -0
package/dist/types.d.ts
ADDED
package/dist/types.mjs
ADDED
|
File without changes
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ForgotPasswordForm = ForgotPasswordForm;
|
|
8
|
+
var _intl = require("@arch-cadre/intl");
|
|
9
|
+
var _button = require("@arch-cadre/ui/components/button");
|
|
10
|
+
var _field = require("@arch-cadre/ui/components/field");
|
|
11
|
+
var _input = require("@arch-cadre/ui/components/input");
|
|
12
|
+
var _label = require("@arch-cadre/ui/components/label");
|
|
13
|
+
var _utils = require("@arch-cadre/ui/lib/utils");
|
|
14
|
+
var _loader = require("@arch-cadre/ui/shared/loader");
|
|
15
|
+
var _zod = require("@hookform/resolvers/zod");
|
|
16
|
+
var _lucideReact = require("lucide-react");
|
|
17
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
18
|
+
var React = _react;
|
|
19
|
+
var _reactHookForm = require("react-hook-form");
|
|
20
|
+
var _sonner = require("sonner");
|
|
21
|
+
var _index = require("../../actions/index.cjs");
|
|
22
|
+
var _validation = require("../../validation.cjs");
|
|
23
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
24
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
25
|
+
function ForgotPasswordForm() {
|
|
26
|
+
const [generalError, setGeneralError] = (0, _react.useState)("");
|
|
27
|
+
const {
|
|
28
|
+
t
|
|
29
|
+
} = (0, _intl.useTranslation)();
|
|
30
|
+
const form = (0, _reactHookForm.useForm)({
|
|
31
|
+
resolver: (0, _zod.zodResolver)(_validation.forgotPasswordSchema)
|
|
32
|
+
});
|
|
33
|
+
async function onSubmit(data) {
|
|
34
|
+
setGeneralError("");
|
|
35
|
+
try {
|
|
36
|
+
const response = await (0, _index.forgotPasswordAction)(data);
|
|
37
|
+
if (response.error) {
|
|
38
|
+
setGeneralError(response.message || t("error_occurred"));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
(0, _sonner.toast)(response.message);
|
|
42
|
+
} catch (_error) {
|
|
43
|
+
setGeneralError(t("error_occurred"));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return /* @__PURE__ */React.createElement("div", {
|
|
47
|
+
className: (0, _utils.cn)("flex flex-col space-y-6")
|
|
48
|
+
}, /* @__PURE__ */React.createElement("div", {
|
|
49
|
+
className: "space-y-2 text-center"
|
|
50
|
+
}, /* @__PURE__ */React.createElement("h1", {
|
|
51
|
+
className: "text-3xl font-semibold"
|
|
52
|
+
}, t("Forgot Password")), /* @__PURE__ */React.createElement("p", {
|
|
53
|
+
className: "text-muted-foreground"
|
|
54
|
+
}, t("Enter your email address and we'll send you a link to reset your password."))), /* @__PURE__ */React.createElement("div", {
|
|
55
|
+
className: "grid gap-5"
|
|
56
|
+
}, generalError && /* @__PURE__ */React.createElement("div", {
|
|
57
|
+
className: "flex gap-2 p-3 bg-red-50 border border-red-200 rounded-lg"
|
|
58
|
+
}, /* @__PURE__ */React.createElement(_lucideReact.AlertCircle, {
|
|
59
|
+
className: "w-4 h-4 text-red-600 flex-shrink-0 mt-0.5"
|
|
60
|
+
}), /* @__PURE__ */React.createElement("p", {
|
|
61
|
+
className: "text-sm text-red-600"
|
|
62
|
+
}, generalError)), /* @__PURE__ */React.createElement("form", {
|
|
63
|
+
onSubmit: form.handleSubmit(onSubmit),
|
|
64
|
+
className: "flex flex-col gap-4"
|
|
65
|
+
}, /* @__PURE__ */React.createElement(_field.FieldGroup, {
|
|
66
|
+
className: "w-full mx-auto"
|
|
67
|
+
}, /* @__PURE__ */React.createElement(_reactHookForm.Controller, {
|
|
68
|
+
name: "email",
|
|
69
|
+
control: form.control,
|
|
70
|
+
render: ({
|
|
71
|
+
field,
|
|
72
|
+
fieldState
|
|
73
|
+
}) => /* @__PURE__ */React.createElement(_field.Field, {
|
|
74
|
+
className: "w-full",
|
|
75
|
+
"data-invalid": fieldState.invalid
|
|
76
|
+
}, /* @__PURE__ */React.createElement(_label.Label, {
|
|
77
|
+
htmlFor: "email"
|
|
78
|
+
}, t("Email address")), /* @__PURE__ */React.createElement(_input.Input, {
|
|
79
|
+
...field,
|
|
80
|
+
placeholder: "m@example.com",
|
|
81
|
+
autoFocus: true
|
|
82
|
+
}), fieldState.invalid && /* @__PURE__ */React.createElement(_field.FieldError, {
|
|
83
|
+
errors: [fieldState.error]
|
|
84
|
+
}))
|
|
85
|
+
})), /* @__PURE__ */React.createElement(_button.Button, {
|
|
86
|
+
disabled: form.formState.isSubmitting,
|
|
87
|
+
className: "w-full"
|
|
88
|
+
}, form.formState.isSubmitting ? t("Please wait...") : t("Send reset link"), form.formState.isSubmitting && /* @__PURE__ */React.createElement(_loader.Loader, {
|
|
89
|
+
variant: "dark"
|
|
90
|
+
})))));
|
|
91
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useTranslation } from "@arch-cadre/intl";
|
|
3
|
+
import { Button } from "@arch-cadre/ui/components/button";
|
|
4
|
+
import { Field, FieldError, FieldGroup } from "@arch-cadre/ui/components/field";
|
|
5
|
+
import { Input } from "@arch-cadre/ui/components/input";
|
|
6
|
+
import { Label } from "@arch-cadre/ui/components/label";
|
|
7
|
+
import { cn } from "@arch-cadre/ui/lib/utils";
|
|
8
|
+
import { Loader } from "@arch-cadre/ui/shared/loader";
|
|
9
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
10
|
+
import { AlertCircle } from "lucide-react";
|
|
11
|
+
import * as React from "react";
|
|
12
|
+
import { useState } from "react";
|
|
13
|
+
import { Controller, useForm } from "react-hook-form";
|
|
14
|
+
import { toast } from "sonner";
|
|
15
|
+
import { forgotPasswordAction } from "../../actions/index.mjs";
|
|
16
|
+
import {
|
|
17
|
+
forgotPasswordSchema
|
|
18
|
+
} from "../../validation.mjs";
|
|
19
|
+
export function ForgotPasswordForm() {
|
|
20
|
+
const [generalError, setGeneralError] = useState("");
|
|
21
|
+
const { t } = useTranslation();
|
|
22
|
+
const form = useForm({
|
|
23
|
+
resolver: zodResolver(forgotPasswordSchema)
|
|
24
|
+
});
|
|
25
|
+
async function onSubmit(data) {
|
|
26
|
+
setGeneralError("");
|
|
27
|
+
try {
|
|
28
|
+
const response = await forgotPasswordAction(data);
|
|
29
|
+
if (response.error) {
|
|
30
|
+
setGeneralError(response.message || t("error_occurred"));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
toast(response.message);
|
|
34
|
+
} catch (_error) {
|
|
35
|
+
setGeneralError(t("error_occurred"));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col space-y-6") }, /* @__PURE__ */ React.createElement("div", { className: "space-y-2 text-center" }, /* @__PURE__ */ React.createElement("h1", { className: "text-3xl font-semibold" }, t("Forgot Password")), /* @__PURE__ */ React.createElement("p", { className: "text-muted-foreground" }, t(
|
|
39
|
+
"Enter your email address and we'll send you a link to reset your password."
|
|
40
|
+
))), /* @__PURE__ */ React.createElement("div", { className: "grid gap-5" }, generalError && /* @__PURE__ */ React.createElement("div", { className: "flex gap-2 p-3 bg-red-50 border border-red-200 rounded-lg" }, /* @__PURE__ */ React.createElement(AlertCircle, { className: "w-4 h-4 text-red-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-red-600" }, generalError)), /* @__PURE__ */ React.createElement(
|
|
41
|
+
"form",
|
|
42
|
+
{
|
|
43
|
+
onSubmit: form.handleSubmit(onSubmit),
|
|
44
|
+
className: "flex flex-col gap-4"
|
|
45
|
+
},
|
|
46
|
+
/* @__PURE__ */ React.createElement(FieldGroup, { className: "w-full mx-auto" }, /* @__PURE__ */ React.createElement(
|
|
47
|
+
Controller,
|
|
48
|
+
{
|
|
49
|
+
name: "email",
|
|
50
|
+
control: form.control,
|
|
51
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ React.createElement(Field, { className: "w-full", "data-invalid": fieldState.invalid }, /* @__PURE__ */ React.createElement(Label, { htmlFor: "email" }, t("Email address")), /* @__PURE__ */ React.createElement(
|
|
52
|
+
Input,
|
|
53
|
+
{
|
|
54
|
+
...field,
|
|
55
|
+
placeholder: "m@example.com",
|
|
56
|
+
autoFocus: true
|
|
57
|
+
}
|
|
58
|
+
), fieldState.invalid && /* @__PURE__ */ React.createElement(FieldError, { errors: [fieldState.error] }))
|
|
59
|
+
}
|
|
60
|
+
)),
|
|
61
|
+
/* @__PURE__ */ React.createElement(Button, { disabled: form.formState.isSubmitting, className: "w-full" }, form.formState.isSubmitting ? t("Please wait...") : t("Send reset link"), form.formState.isSubmitting && /* @__PURE__ */ React.createElement(Loader, { variant: "dark" }))
|
|
62
|
+
)));
|
|
63
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = Page;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _components = require("./components.cjs");
|
|
9
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
|
+
async function Page() {
|
|
12
|
+
return /* @__PURE__ */React.createElement(_components.ForgotPasswordForm, null);
|
|
13
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = RootLayout;
|
|
7
|
+
var _logo = require("@arch-cadre/ui/brand/logo");
|
|
8
|
+
var _image = _interopRequireDefault(require("next/image"));
|
|
9
|
+
var _link = _interopRequireDefault(require("next/link"));
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
12
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
function RootLayout({
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */React.createElement("div", {
|
|
18
|
+
className: "grid min-h-svh grid-cols-1 lg:grid-cols-2"
|
|
19
|
+
}, /* @__PURE__ */React.createElement("div", {
|
|
20
|
+
className: "flex flex-col gap-4 p-6 md:p-10"
|
|
21
|
+
}, /* @__PURE__ */React.createElement("div", {
|
|
22
|
+
className: "flex justify-center gap-2"
|
|
23
|
+
}, /* @__PURE__ */React.createElement(_link.default, {
|
|
24
|
+
href: "/",
|
|
25
|
+
className: "flex items-center gap-2 font-medium"
|
|
26
|
+
}, /* @__PURE__ */React.createElement(_logo.Logo, null))), /* @__PURE__ */React.createElement("div", {
|
|
27
|
+
className: "flex flex-1 items-center justify-center"
|
|
28
|
+
}, /* @__PURE__ */React.createElement("div", {
|
|
29
|
+
className: "w-full max-w-xs"
|
|
30
|
+
}, children))), /* @__PURE__ */React.createElement("div", {
|
|
31
|
+
className: "bg-muted relative hidden lg:block"
|
|
32
|
+
}, /* @__PURE__ */React.createElement(_image.default, {
|
|
33
|
+
width: 100,
|
|
34
|
+
height: 100,
|
|
35
|
+
src: "/placeholder.svg",
|
|
36
|
+
alt: "Image",
|
|
37
|
+
className: "absolute inset-0 h-full w-full object-cover dark:brightness-[0.2] dark:grayscale"
|
|
38
|
+
})));
|
|
39
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Logo } from "@arch-cadre/ui/brand/logo";
|
|
2
|
+
import Image from "next/image";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
export default function RootLayout({
|
|
6
|
+
children
|
|
7
|
+
}) {
|
|
8
|
+
return /* @__PURE__ */ React.createElement("div", { className: "grid min-h-svh grid-cols-1 lg:grid-cols-2" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-4 p-6 md:p-10" }, /* @__PURE__ */ React.createElement("div", { className: "flex justify-center gap-2" }, /* @__PURE__ */ React.createElement(Link, { href: "/", className: "flex items-center gap-2 font-medium" }, /* @__PURE__ */ React.createElement(Logo, null))), /* @__PURE__ */ React.createElement("div", { className: "flex flex-1 items-center justify-center" }, /* @__PURE__ */ React.createElement("div", { className: "w-full max-w-xs" }, children))), /* @__PURE__ */ React.createElement("div", { className: "bg-muted relative hidden lg:block" }, /* @__PURE__ */ React.createElement(
|
|
9
|
+
Image,
|
|
10
|
+
{
|
|
11
|
+
width: 100,
|
|
12
|
+
height: 100,
|
|
13
|
+
src: "/placeholder.svg",
|
|
14
|
+
alt: "Image",
|
|
15
|
+
className: "absolute inset-0 h-full w-full object-cover dark:brightness-[0.2] dark:grayscale"
|
|
16
|
+
}
|
|
17
|
+
)));
|
|
18
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ResetPasswordForm = ResetPasswordForm;
|
|
8
|
+
var _intl = require("@arch-cadre/intl");
|
|
9
|
+
var _button = require("@arch-cadre/ui/components/button");
|
|
10
|
+
var _card = require("@arch-cadre/ui/components/card");
|
|
11
|
+
var _field = require("@arch-cadre/ui/components/field");
|
|
12
|
+
var _input = require("@arch-cadre/ui/components/input");
|
|
13
|
+
var _label = require("@arch-cadre/ui/components/label");
|
|
14
|
+
var _utils = require("@arch-cadre/ui/lib/utils");
|
|
15
|
+
var _loader = require("@arch-cadre/ui/shared/loader");
|
|
16
|
+
var _zod = require("@hookform/resolvers/zod");
|
|
17
|
+
var _lucideReact = require("lucide-react");
|
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
19
|
+
var React = _react;
|
|
20
|
+
var _reactHookForm = require("react-hook-form");
|
|
21
|
+
var _sonner = require("sonner");
|
|
22
|
+
var _index = require("../../actions/index.cjs");
|
|
23
|
+
var _validation = require("../../validation.cjs");
|
|
24
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
25
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
26
|
+
function ResetPasswordForm() {
|
|
27
|
+
const [generalError, setGeneralError] = (0, _react.useState)("");
|
|
28
|
+
const {
|
|
29
|
+
t
|
|
30
|
+
} = (0, _intl.useTranslation)();
|
|
31
|
+
const form = (0, _reactHookForm.useForm)({
|
|
32
|
+
resolver: (0, _zod.zodResolver)(_validation.resetPasswordSchema)
|
|
33
|
+
});
|
|
34
|
+
async function onSubmit(data) {
|
|
35
|
+
setGeneralError("");
|
|
36
|
+
try {
|
|
37
|
+
const response = await (0, _index.resetPasswordAction)(data);
|
|
38
|
+
if (response.error) {
|
|
39
|
+
setGeneralError(response.message || t("error_occurred"));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
(0, _sonner.toast)(response.message);
|
|
43
|
+
} catch (_error) {}
|
|
44
|
+
}
|
|
45
|
+
return /* @__PURE__ */React.createElement("div", {
|
|
46
|
+
className: (0, _utils.cn)("flex flex-col space-y-3")
|
|
47
|
+
}, /* @__PURE__ */React.createElement(_card.CardHeader, {
|
|
48
|
+
className: "text-center"
|
|
49
|
+
}, /* @__PURE__ */React.createElement(_card.CardTitle, {
|
|
50
|
+
className: "text-xl"
|
|
51
|
+
}, t("Reset password")), /* @__PURE__ */React.createElement(_card.CardDescription, null, t("Enter your new password below."))), /* @__PURE__ */React.createElement("div", {
|
|
52
|
+
className: "flex flex-col gap-6"
|
|
53
|
+
}, generalError && /* @__PURE__ */React.createElement("div", {
|
|
54
|
+
className: "flex gap-2 p-3 bg-red-50 border border-red-200 rounded-lg"
|
|
55
|
+
}, /* @__PURE__ */React.createElement(_lucideReact.AlertCircle, {
|
|
56
|
+
className: "w-4 h-4 text-red-600 flex-shrink-0 mt-0.5"
|
|
57
|
+
}), /* @__PURE__ */React.createElement("p", {
|
|
58
|
+
className: "text-sm text-red-600"
|
|
59
|
+
}, generalError)), /* @__PURE__ */React.createElement("form", {
|
|
60
|
+
onSubmit: form.handleSubmit(onSubmit),
|
|
61
|
+
className: "flex flex-col gap-4"
|
|
62
|
+
}, /* @__PURE__ */React.createElement(_field.FieldGroup, {
|
|
63
|
+
className: "w-full mx-auto"
|
|
64
|
+
}, /* @__PURE__ */React.createElement(_reactHookForm.Controller, {
|
|
65
|
+
name: "password",
|
|
66
|
+
control: form.control,
|
|
67
|
+
render: ({
|
|
68
|
+
field,
|
|
69
|
+
fieldState
|
|
70
|
+
}) => /* @__PURE__ */React.createElement(_field.Field, {
|
|
71
|
+
className: "w-full",
|
|
72
|
+
"data-invalid": fieldState.invalid
|
|
73
|
+
}, /* @__PURE__ */React.createElement(_label.Label, {
|
|
74
|
+
htmlFor: "password"
|
|
75
|
+
}, t("New Password")), /* @__PURE__ */React.createElement(_input.Input, {
|
|
76
|
+
...field,
|
|
77
|
+
id: "password",
|
|
78
|
+
type: "password",
|
|
79
|
+
placeholder: "********",
|
|
80
|
+
autoFocus: true
|
|
81
|
+
}), fieldState.invalid && /* @__PURE__ */React.createElement(_field.FieldError, {
|
|
82
|
+
errors: [fieldState.error]
|
|
83
|
+
}))
|
|
84
|
+
}), /* @__PURE__ */React.createElement(_reactHookForm.Controller, {
|
|
85
|
+
name: "confirm",
|
|
86
|
+
control: form.control,
|
|
87
|
+
render: ({
|
|
88
|
+
field,
|
|
89
|
+
fieldState
|
|
90
|
+
}) => /* @__PURE__ */React.createElement(_field.Field, {
|
|
91
|
+
className: "w-full",
|
|
92
|
+
"data-invalid": fieldState.invalid
|
|
93
|
+
}, /* @__PURE__ */React.createElement(_label.Label, {
|
|
94
|
+
htmlFor: "confirm"
|
|
95
|
+
}, t("Confirm Password")), /* @__PURE__ */React.createElement(_input.Input, {
|
|
96
|
+
...field,
|
|
97
|
+
id: "confirm",
|
|
98
|
+
type: "password",
|
|
99
|
+
placeholder: "********"
|
|
100
|
+
}), fieldState.invalid && /* @__PURE__ */React.createElement(_field.FieldError, {
|
|
101
|
+
errors: [fieldState.error]
|
|
102
|
+
}))
|
|
103
|
+
})), /* @__PURE__ */React.createElement(_button.Button, {
|
|
104
|
+
disabled: form.formState.isSubmitting,
|
|
105
|
+
className: "w-full"
|
|
106
|
+
}, form.formState.isSubmitting ? t("Please wait...") : t("Reset password"), form.formState.isSubmitting && /* @__PURE__ */React.createElement(_loader.Loader, {
|
|
107
|
+
variant: "dark"
|
|
108
|
+
}), " "))));
|
|
109
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useTranslation } from "@arch-cadre/intl";
|
|
3
|
+
import { Button } from "@arch-cadre/ui/components/button";
|
|
4
|
+
import {
|
|
5
|
+
CardDescription,
|
|
6
|
+
CardHeader,
|
|
7
|
+
CardTitle
|
|
8
|
+
} from "@arch-cadre/ui/components/card";
|
|
9
|
+
import {
|
|
10
|
+
Field,
|
|
11
|
+
FieldError,
|
|
12
|
+
FieldGroup
|
|
13
|
+
} from "@arch-cadre/ui/components/field";
|
|
14
|
+
import { Input } from "@arch-cadre/ui/components/input";
|
|
15
|
+
import { Label } from "@arch-cadre/ui/components/label";
|
|
16
|
+
import { cn } from "@arch-cadre/ui/lib/utils";
|
|
17
|
+
import { Loader } from "@arch-cadre/ui/shared/loader";
|
|
18
|
+
import { zodResolver } from "@hookform/resolvers/zod";
|
|
19
|
+
import { AlertCircle } from "lucide-react";
|
|
20
|
+
import * as React from "react";
|
|
21
|
+
import { useState } from "react";
|
|
22
|
+
import { Controller, useForm } from "react-hook-form";
|
|
23
|
+
import { toast } from "sonner";
|
|
24
|
+
import { resetPasswordAction } from "../../actions/index.mjs";
|
|
25
|
+
import { resetPasswordSchema } from "../../validation.mjs";
|
|
26
|
+
export function ResetPasswordForm() {
|
|
27
|
+
const [generalError, setGeneralError] = useState("");
|
|
28
|
+
const { t } = useTranslation();
|
|
29
|
+
const form = useForm({
|
|
30
|
+
resolver: zodResolver(resetPasswordSchema)
|
|
31
|
+
});
|
|
32
|
+
async function onSubmit(data) {
|
|
33
|
+
setGeneralError("");
|
|
34
|
+
try {
|
|
35
|
+
const response = await resetPasswordAction(data);
|
|
36
|
+
if (response.error) {
|
|
37
|
+
setGeneralError(response.message || t("error_occurred"));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
toast(response.message);
|
|
41
|
+
} catch (_error) {
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col space-y-3") }, /* @__PURE__ */ React.createElement(CardHeader, { className: "text-center" }, /* @__PURE__ */ React.createElement(CardTitle, { className: "text-xl" }, t("Reset password")), /* @__PURE__ */ React.createElement(CardDescription, null, t("Enter your new password below."))), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-6" }, generalError && /* @__PURE__ */ React.createElement("div", { className: "flex gap-2 p-3 bg-red-50 border border-red-200 rounded-lg" }, /* @__PURE__ */ React.createElement(AlertCircle, { className: "w-4 h-4 text-red-600 flex-shrink-0 mt-0.5" }), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-red-600" }, generalError)), /* @__PURE__ */ React.createElement(
|
|
45
|
+
"form",
|
|
46
|
+
{
|
|
47
|
+
onSubmit: form.handleSubmit(onSubmit),
|
|
48
|
+
className: "flex flex-col gap-4"
|
|
49
|
+
},
|
|
50
|
+
/* @__PURE__ */ React.createElement(FieldGroup, { className: "w-full mx-auto" }, /* @__PURE__ */ React.createElement(
|
|
51
|
+
Controller,
|
|
52
|
+
{
|
|
53
|
+
name: "password",
|
|
54
|
+
control: form.control,
|
|
55
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ React.createElement(Field, { className: "w-full", "data-invalid": fieldState.invalid }, /* @__PURE__ */ React.createElement(Label, { htmlFor: "password" }, t("New Password")), /* @__PURE__ */ React.createElement(
|
|
56
|
+
Input,
|
|
57
|
+
{
|
|
58
|
+
...field,
|
|
59
|
+
id: "password",
|
|
60
|
+
type: "password",
|
|
61
|
+
placeholder: "********",
|
|
62
|
+
autoFocus: true
|
|
63
|
+
}
|
|
64
|
+
), fieldState.invalid && /* @__PURE__ */ React.createElement(FieldError, { errors: [fieldState.error] }))
|
|
65
|
+
}
|
|
66
|
+
), /* @__PURE__ */ React.createElement(
|
|
67
|
+
Controller,
|
|
68
|
+
{
|
|
69
|
+
name: "confirm",
|
|
70
|
+
control: form.control,
|
|
71
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ React.createElement(Field, { className: "w-full", "data-invalid": fieldState.invalid }, /* @__PURE__ */ React.createElement(Label, { htmlFor: "confirm" }, t("Confirm Password")), /* @__PURE__ */ React.createElement(
|
|
72
|
+
Input,
|
|
73
|
+
{
|
|
74
|
+
...field,
|
|
75
|
+
id: "confirm",
|
|
76
|
+
type: "password",
|
|
77
|
+
placeholder: "********"
|
|
78
|
+
}
|
|
79
|
+
), fieldState.invalid && /* @__PURE__ */ React.createElement(FieldError, { errors: [fieldState.error] }))
|
|
80
|
+
}
|
|
81
|
+
)),
|
|
82
|
+
/* @__PURE__ */ React.createElement(Button, { disabled: form.formState.isSubmitting, className: "w-full" }, form.formState.isSubmitting ? t("Please wait...") : t("Reset password"), form.formState.isSubmitting && /* @__PURE__ */ React.createElement(Loader, { variant: "dark" }), " ")
|
|
83
|
+
)));
|
|
84
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = Page;
|
|
7
|
+
var _server = require("@arch-cadre/core/server");
|
|
8
|
+
var _navigation = require("next/navigation");
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _components = require("./components.cjs");
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
12
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
13
|
+
async function Page() {
|
|
14
|
+
const {
|
|
15
|
+
session,
|
|
16
|
+
user
|
|
17
|
+
} = await (0, _server.getCurrentPasswordResetSession)();
|
|
18
|
+
if (session === null || user === null) {
|
|
19
|
+
return (0, _navigation.redirect)("/forgot-password");
|
|
20
|
+
}
|
|
21
|
+
if (!session.emailVerified) {
|
|
22
|
+
return (0, _navigation.redirect)("/reset-password/verify-email");
|
|
23
|
+
}
|
|
24
|
+
const security = await (0, _server.checkSecurity)(session, user);
|
|
25
|
+
if (!security.satisfied && security.redirect) {
|
|
26
|
+
return (0, _navigation.redirect)(security.redirect);
|
|
27
|
+
}
|
|
28
|
+
return /* @__PURE__ */React.createElement(_components.ResetPasswordForm, null);
|
|
29
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
checkSecurity,
|
|
3
|
+
getCurrentPasswordResetSession
|
|
4
|
+
} from "@arch-cadre/core/server";
|
|
5
|
+
import { redirect } from "next/navigation";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { ResetPasswordForm } from "./components.mjs";
|
|
8
|
+
export default async function Page() {
|
|
9
|
+
const { session, user } = await getCurrentPasswordResetSession();
|
|
10
|
+
if (session === null || user === null) {
|
|
11
|
+
return redirect("/forgot-password");
|
|
12
|
+
}
|
|
13
|
+
if (!session.emailVerified) {
|
|
14
|
+
return redirect("/reset-password/verify-email");
|
|
15
|
+
}
|
|
16
|
+
const security = await checkSecurity(session, user);
|
|
17
|
+
if (!security.satisfied && security.redirect) {
|
|
18
|
+
return redirect(security.redirect);
|
|
19
|
+
}
|
|
20
|
+
return /* @__PURE__ */ React.createElement(ResetPasswordForm, null);
|
|
21
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.PasswordResetEmailVerificationForm = PasswordResetEmailVerificationForm;
|
|
8
|
+
var _intl = require("@arch-cadre/intl");
|
|
9
|
+
var _button = require("@arch-cadre/ui/components/button");
|
|
10
|
+
var _field = require("@arch-cadre/ui/components/field");
|
|
11
|
+
var _inputOtp = require("@arch-cadre/ui/components/input-otp");
|
|
12
|
+
var _utils = require("@arch-cadre/ui/lib/utils");
|
|
13
|
+
var _loader = require("@arch-cadre/ui/shared/loader");
|
|
14
|
+
var _zod = require("@hookform/resolvers/zod");
|
|
15
|
+
var _lucideReact = require("lucide-react");
|
|
16
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
17
|
+
var React = _react;
|
|
18
|
+
var _reactHookForm = require("react-hook-form");
|
|
19
|
+
var _sonner = require("sonner");
|
|
20
|
+
var _index = require("../../../actions/index.cjs");
|
|
21
|
+
var _validation = require("../../../validation.cjs");
|
|
22
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
23
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
24
|
+
function PasswordResetEmailVerificationForm({
|
|
25
|
+
email = ""
|
|
26
|
+
}) {
|
|
27
|
+
const [generalError, setGeneralError] = (0, _react.useState)("");
|
|
28
|
+
const {
|
|
29
|
+
t
|
|
30
|
+
} = (0, _intl.useTranslation)();
|
|
31
|
+
const form = (0, _reactHookForm.useForm)({
|
|
32
|
+
resolver: (0, _zod.zodResolver)(_validation.verifyEmailSchema)
|
|
33
|
+
});
|
|
34
|
+
async function onSubmit(data) {
|
|
35
|
+
setGeneralError("");
|
|
36
|
+
try {
|
|
37
|
+
const response = await (0, _index.verifyPasswordResetEmailAction)(data);
|
|
38
|
+
if (response.error) {
|
|
39
|
+
setGeneralError(response.message || t("Verification failed. Please try again."));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
(0, _sonner.toast)(response.message);
|
|
43
|
+
} catch (_error) {}
|
|
44
|
+
}
|
|
45
|
+
return /* @__PURE__ */React.createElement("div", {
|
|
46
|
+
className: (0, _utils.cn)("flex flex-col space-y-3")
|
|
47
|
+
}, /* @__PURE__ */React.createElement("div", {
|
|
48
|
+
className: "space-y-2 text-center"
|
|
49
|
+
}, /* @__PURE__ */React.createElement("h1", {
|
|
50
|
+
className: "text-3xl font-semibold"
|
|
51
|
+
}, t("Verify your email address")), /* @__PURE__ */React.createElement("p", {
|
|
52
|
+
className: "text-muted-foreground"
|
|
53
|
+
}, t("We sent an 6-digit code to {email}.", {
|
|
54
|
+
email
|
|
55
|
+
}))), /* @__PURE__ */React.createElement("div", {
|
|
56
|
+
className: "grid gap-5"
|
|
57
|
+
}, generalError && /* @__PURE__ */React.createElement("div", {
|
|
58
|
+
className: "flex gap-2 p-3 bg-red-50 border border-red-200 rounded-lg"
|
|
59
|
+
}, /* @__PURE__ */React.createElement(_lucideReact.AlertCircle, {
|
|
60
|
+
className: "w-4 h-4 text-red-600 flex-shrink-0 mt-0.5"
|
|
61
|
+
}), /* @__PURE__ */React.createElement("p", {
|
|
62
|
+
className: "text-sm text-red-600"
|
|
63
|
+
}, generalError)), /* @__PURE__ */React.createElement("form", {
|
|
64
|
+
onSubmit: form.handleSubmit(onSubmit),
|
|
65
|
+
className: "grid gap-6"
|
|
66
|
+
}, /* @__PURE__ */React.createElement(_field.FieldGroup, {
|
|
67
|
+
className: "w-full mx-auto"
|
|
68
|
+
}, /* @__PURE__ */React.createElement(_reactHookForm.Controller, {
|
|
69
|
+
name: "code",
|
|
70
|
+
control: form.control,
|
|
71
|
+
render: ({
|
|
72
|
+
field,
|
|
73
|
+
fieldState
|
|
74
|
+
}) => /* @__PURE__ */React.createElement(_field.Field, {
|
|
75
|
+
className: "w-full",
|
|
76
|
+
"data-invalid": fieldState.invalid
|
|
77
|
+
}, /* @__PURE__ */React.createElement(_inputOtp.InputOTP, {
|
|
78
|
+
...field,
|
|
79
|
+
className: "mx-auto w-full",
|
|
80
|
+
maxLength: 6,
|
|
81
|
+
autoFocus: true,
|
|
82
|
+
inputMode: "text"
|
|
83
|
+
}, /* @__PURE__ */React.createElement(_inputOtp.InputOTPGroup, {
|
|
84
|
+
className: "mx-auto"
|
|
85
|
+
}, /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
86
|
+
index: 0
|
|
87
|
+
}), /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
88
|
+
index: 1
|
|
89
|
+
}), /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
90
|
+
index: 2
|
|
91
|
+
}), /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
92
|
+
index: 3
|
|
93
|
+
}), /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
94
|
+
index: 4
|
|
95
|
+
}), /* @__PURE__ */React.createElement(_inputOtp.InputOTPSlot, {
|
|
96
|
+
index: 5
|
|
97
|
+
}))), fieldState.invalid && /* @__PURE__ */React.createElement(_field.FieldError, {
|
|
98
|
+
errors: [fieldState.error]
|
|
99
|
+
}))
|
|
100
|
+
})), /* @__PURE__ */React.createElement(_button.Button, {
|
|
101
|
+
disabled: form.formState.isSubmitting,
|
|
102
|
+
className: "w-full"
|
|
103
|
+
}, form.formState.isSubmitting ? t("Please wait...") : t("Verify"), form.formState.isSubmitting && /* @__PURE__ */React.createElement(_loader.Loader, {
|
|
104
|
+
variant: "dark"
|
|
105
|
+
})))));
|
|
106
|
+
}
|