@atomsolution/sdk-merchant 1.8.6 → 1.8.7
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/digistore/NewAccountCreate/index.d.ts +2 -1
- package/dist/digistore/services/createDigistoreAccountService.d.ts +1 -0
- package/dist/digistore.cjs +64 -59
- package/dist/digistore.cjs.map +1 -1
- package/dist/digistore.esm.js +64 -59
- package/dist/digistore.esm.js.map +1 -1
- package/dist/digistore.js +64 -59
- package/dist/digistore.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ interface NewAccountCreate {
|
|
|
3
3
|
username: string;
|
|
4
4
|
userPassword: string;
|
|
5
5
|
redirectFunction?: () => void;
|
|
6
|
+
apiUrl: string;
|
|
6
7
|
}
|
|
7
|
-
export declare function NewAccountCreate({ username, userPassword, logo, redirectFunction, }: NewAccountCreate): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function NewAccountCreate({ apiUrl, username, userPassword, logo, redirectFunction, }: NewAccountCreate): import("react/jsx-runtime").JSX.Element;
|
|
8
9
|
export {};
|
package/dist/digistore.cjs
CHANGED
|
@@ -21,10 +21,70 @@ var __async = (__this, __arguments, generator) => {
|
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
23
23
|
const jsxRuntime = require("./jsx-runtime-DV8UmLi4.cjs");
|
|
24
|
-
const React = require("react");
|
|
25
|
-
const useTranslation = require("./use-translation-m-_wCmHs.cjs");
|
|
26
24
|
const index = require("./index-Ozgk-K52.cjs");
|
|
25
|
+
const useTranslation = require("./use-translation-m-_wCmHs.cjs");
|
|
26
|
+
const React = require("react");
|
|
27
27
|
const axios = require("axios");
|
|
28
|
+
const regex = {
|
|
29
|
+
length: /^.{8,35}$/,
|
|
30
|
+
upper: /^(?=.*[A-Z]).*$/,
|
|
31
|
+
lower: /^(?=.*[a-z]).*$/,
|
|
32
|
+
number: /^(?=.*\d).+$/,
|
|
33
|
+
no_vietnamese: /^[\x21-\x7E]+$/
|
|
34
|
+
};
|
|
35
|
+
function usePasswordValidation(password) {
|
|
36
|
+
const requirements = React.useMemo(() => {
|
|
37
|
+
return Object.keys(regex).reduce((acc, key) => {
|
|
38
|
+
acc[key] = regex[key].test(password);
|
|
39
|
+
return acc;
|
|
40
|
+
}, {});
|
|
41
|
+
}, [password]);
|
|
42
|
+
const isValid = React.useMemo(
|
|
43
|
+
() => Object.values(requirements).every((req) => req),
|
|
44
|
+
[requirements]
|
|
45
|
+
);
|
|
46
|
+
const validate = React.useCallback(
|
|
47
|
+
(_password = password) => {
|
|
48
|
+
let isValid2 = true;
|
|
49
|
+
const errors = Object.keys(regex).filter((key) => {
|
|
50
|
+
if (!regex[key].test(_password)) {
|
|
51
|
+
isValid2 = false;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return { isValid: isValid2, errors };
|
|
56
|
+
},
|
|
57
|
+
[password]
|
|
58
|
+
);
|
|
59
|
+
return { requirements, isValid, validate };
|
|
60
|
+
}
|
|
61
|
+
const forgotPassword = (payload) => __async(exports, null, function* () {
|
|
62
|
+
var _a;
|
|
63
|
+
try {
|
|
64
|
+
const response = yield axios.put(
|
|
65
|
+
`${payload.apiUrl}/reset-password`,
|
|
66
|
+
payload,
|
|
67
|
+
{
|
|
68
|
+
headers: {
|
|
69
|
+
"Content-Type": "application/json",
|
|
70
|
+
// Authorization: `Bearer ${accessToken}`,
|
|
71
|
+
Origin: "http://localhost:3000",
|
|
72
|
+
Referer: "http://localhost:3000/"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
return response.data;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
function FormHeader({ logoSrc, title, description }) {
|
|
82
|
+
return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsxs(jsxRuntime.jsxRuntimeExports.Fragment, { children: [
|
|
83
|
+
/* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
85
|
+
description && /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
28
88
|
const EyeIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsxs(
|
|
29
89
|
"svg",
|
|
30
90
|
{
|
|
@@ -177,13 +237,6 @@ function PasswordRequirements({
|
|
|
177
237
|
] })
|
|
178
238
|
] });
|
|
179
239
|
}
|
|
180
|
-
function FormHeader({ logoSrc, title, description }) {
|
|
181
|
-
return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsxs(jsxRuntime.jsxRuntimeExports.Fragment, { children: [
|
|
182
|
-
/* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
183
|
-
/* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
184
|
-
description && /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
185
|
-
] });
|
|
186
|
-
}
|
|
187
240
|
function SubmitButton({
|
|
188
241
|
onClick,
|
|
189
242
|
disabled = false,
|
|
@@ -206,57 +259,8 @@ function SubmitButton({
|
|
|
206
259
|
}
|
|
207
260
|
);
|
|
208
261
|
}
|
|
209
|
-
const regex = {
|
|
210
|
-
length: /^.{8,35}$/,
|
|
211
|
-
upper: /^(?=.*[A-Z]).*$/,
|
|
212
|
-
lower: /^(?=.*[a-z]).*$/,
|
|
213
|
-
number: /^(?=.*\d).+$/,
|
|
214
|
-
no_vietnamese: /^[\x21-\x7E]+$/
|
|
215
|
-
};
|
|
216
|
-
function usePasswordValidation(password) {
|
|
217
|
-
const requirements = React.useMemo(() => {
|
|
218
|
-
return Object.keys(regex).reduce((acc, key) => {
|
|
219
|
-
acc[key] = regex[key].test(password);
|
|
220
|
-
return acc;
|
|
221
|
-
}, {});
|
|
222
|
-
}, [password]);
|
|
223
|
-
const isValid = React.useMemo(
|
|
224
|
-
() => Object.values(requirements).every((req) => req),
|
|
225
|
-
[requirements]
|
|
226
|
-
);
|
|
227
|
-
const validate = React.useCallback(
|
|
228
|
-
(_password = password) => {
|
|
229
|
-
let isValid2 = true;
|
|
230
|
-
const errors = Object.keys(regex).filter((key) => {
|
|
231
|
-
if (!regex[key].test(_password)) {
|
|
232
|
-
isValid2 = false;
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
return { isValid: isValid2, errors };
|
|
237
|
-
},
|
|
238
|
-
[password]
|
|
239
|
-
);
|
|
240
|
-
return { requirements, isValid, validate };
|
|
241
|
-
}
|
|
242
|
-
const API_URL = "https://bvbank-stag.atomsolution.vn/v1/portal/user";
|
|
243
|
-
const forgotPassword = (payload) => __async(exports, null, function* () {
|
|
244
|
-
var _a;
|
|
245
|
-
try {
|
|
246
|
-
const response = yield axios.put(`${API_URL}/reset-password`, payload, {
|
|
247
|
-
headers: {
|
|
248
|
-
"Content-Type": "application/json",
|
|
249
|
-
// Authorization: `Bearer ${accessToken}`,
|
|
250
|
-
Origin: "http://localhost:3000",
|
|
251
|
-
Referer: "http://localhost:3000/"
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
return response.data;
|
|
255
|
-
} catch (error) {
|
|
256
|
-
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
262
|
function NewAccountCreate({
|
|
263
|
+
apiUrl,
|
|
260
264
|
username,
|
|
261
265
|
userPassword,
|
|
262
266
|
logo,
|
|
@@ -274,6 +278,7 @@ function NewAccountCreate({
|
|
|
274
278
|
setIsSubmitting(true);
|
|
275
279
|
try {
|
|
276
280
|
yield forgotPassword({
|
|
281
|
+
apiUrl,
|
|
277
282
|
email,
|
|
278
283
|
new_password: password,
|
|
279
284
|
current_password: userPassword || void 0
|
package/dist/digistore.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digistore.cjs","sources":["../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\nconst API_URL = \"https://bvbank-stag.atomsolution.vn/v1/portal/user\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string //props có password thì là current password, email = username, new_password là cho người dùng nhập\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(`${API_URL}/reset-password`, payload, {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n });\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { useState } from 'react';\nimport { InputField } from './InputField';\nimport { PasswordRequirements } from './PasswordRequirements';\nimport { FormHeader } from './FormHeader';\nimport { SubmitButton } from './SubmitButton';\nimport { useTranslation } from '@/hooks/use-translation';\nimport { CustomToast } from '@/components/common/custom-toast';\nimport { usePasswordValidation } from '../hooks/usePasswordValidation';\nimport { forgotPassword } from '../services/createDigistoreAccountService';\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n}\n\nexport function NewAccountCreate({\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation('digistore-id');\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || '');\n const [confirmPassword, setConfirmPassword] = useState(userPassword || '');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState('');\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate('success_toast_title'),\n translate('success_toast_des'),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate('error_toast_title'),\n translate('error_toast_des'),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate('note_login_success_with')}{' '}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate('note_desc')}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate('note_from_date')}{' '}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{' '}\n {translate('note_use_digis_acc_to_access')}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate('title')}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate('form_email_label')}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate('form_email_placeholder')}\n required\n disabled\n />\n\n <InputField\n label={translate('form_pwd_label')}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate('form_pwd_err_required'));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate('form_pwd_err_invalid'));\n } else {\n setPasswordError('');\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_pwd_placeholder')}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate('form_confirm_pwd_label')}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_required'),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_confirm_pwd_placeholder')}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate('form_submit_btn')}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["jsxs","jsx","useState","useTranslation","Fragment","useMemo","useCallback","isValid","CustomToast"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAM,UAAU,CAAC,EAAE,UAAA,MACxBA,2BAAAA,kBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC;AAAA,IACA,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IAEN,UAAA;AAAA,MAAAC,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAa;AAAA,UACb,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MAEJA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAa;AAAA,UACb,GAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AACF;AAIK,MAAM,eAAe,CAAC,EAAE,UAAA,MAC7BD,2BAAAA,kBAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,IAEf,UAAA;AAAA,MAAAC,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,GAAE,mFAAA,CAAmF;AAAA,MAC3FA,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,MACrBA,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,GAAE,iCAAA,CAAiC;AAAA,MACzCA,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,GAAE,mEAAA,CAAmE;AAAA,IAAA;AAAA,EAAA;AAC7E;AChBK,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AACV,GAAoB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAIC,MAAAA,SAAS,KAAK;AAEtD,QAAM,YAAY,qBACd,eACE,SACA,aACF;AAEJ,SACEF,kDAAC,SAAI,WACH,UAAA;AAAA,IAAAA,2BAAAA,kBAAAA,KAAC,SAAA,EAAM,WAAU,0DACd,UAAA;AAAA,MAAA;AAAA,MAAM;AAAA,MAAE,YAAYC,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,IAAA,CAAC;AAAA,IAAA,GACvD;AAAA,IACAD,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAAC,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UAGV;AAAA,UACA;AAAA,QAAA;AAAA,MAAA;AAAA,MAED,sBACCA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,UAE3C,UAAA,gEACE,cAAA,EAAa,WAAU,WAAU,IAElCA,2BAAAA,kBAAAA,IAAC,SAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAEjC,GAEJ;AAAA,qDAEC,OAAA,EAAI,WAAW,qBAAqB,QAAQ,oBAAoB,iBAAiB,IAChF,UAAAA,2BAAAA,kBAAAA,IAAC,OAAA,EAAI,WAAU,mBACb,UAAAA,2BAAAA,kBAAAA,IAAC,KAAA,EAAE,WAAU,yCAAyC,UAAA,MAAA,CAAM,GAC9D,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AC/EA,MAAM,kBAAkB,CAAC,EAAE,KAAK,WAC9BD,kDAAC,MAAA,EAAG,WAAU,qEACZ,UAAA;AAAA,EAAAC,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,WAAU,mDACb,UAAA;AAAA;AAAA,IAECA,2BAAAA,kBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,WAAU;AAAA,QAEV,UAAAA,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,GAAE,kBAAA,CAAkB;AAAA,MAAA;AAAA,IAAA;AAAA;AAAA;AAAA,IAI5BA,2BAAAA,kBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,WAAU;AAAA,QAEV,2DAAC,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,IAAA,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA,KAGlC;AAAA,mDACC,QAAA,EAAK,WAAW,MAAM,+BAA+B,gBACnD,UAAA,KAAA,CACH;AAAA,GACF;AC5BK,SAAS,qBAAqB;AAAA,EACnC;AACF,GAA8B;AAC5B,QAAM,EAAE,UAAA,IAAcE,eAAAA,eAAe,cAAc;AAEnD,SACEH,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,IAAAC,iDAAC,OAAA,EAAI,WAAU,8BAA8B,UAAA,UAAU,uBAAuB,GAAE;AAAA,IAChFD,2BAAAA,kBAAAA,KAAC,MAAA,EAAG,WAAU,eACZ,UAAA;AAAA,MAAAC,iDAAC,mBAAgB,KAAK,aAAa,QAAQ,MAAM,UAAU,wBAAwB,GAAG;AAAA,MACtFA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK,aAAa;AAAA,UAClB,MAAM,UAAU,2BAA2B;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7CA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK,aAAa;AAAA,UAClB,MAAM,UAAU,2BAA2B;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7CA,iDAAC,mBAAgB,KAAK,aAAa,QAAQ,MAAM,UAAU,wBAAwB,GAAG;AAAA,MACtFA,iDAAC,mBAAgB,KAAK,aAAa,eAAe,MAAM,UAAU,+BAA+B,EAAA,CAAG;AAAA,IAAA,EAAA,CACtG;AAAA,EAAA,GACF;AAEJ;ACvBO,SAAS,WAAW,EAAE,SAAS,OAAO,eAAgC;AAC3E,SACED,2BAAAA,kBAAAA,KAAAI,uCAAA,EACE,UAAA;AAAA,IAAAH,2BAAAA,kBAAAA,IAAC,OAAA,EAAI,WAAU,8BACb,UAAAA,2BAAAA,kBAAAA,IAAC,OAAA,EAAI,KAAK,SAAS,KAAI,eAAc,WAAU,cAAA,CAAc,GAC/D;AAAA,IACAA,2BAAAA,kBAAAA,IAAC,MAAA,EAAG,WAAU,4DACX,UAAA,OACH;AAAA,IACC,eACCA,2BAAAA,kBAAAA,IAAC,OAAA,EAAI,WAAU,6DACZ,UAAA,YAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;ACbO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AACd,GAAsB;AACpB,SACEA,2BAAAA,kBAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA;AAAA;AAAA;AAAA,yEAIwD,SAAS;AAAA,MAE3E,sBAAY,cAAc;AAAA,IAAA;AAAA,EAAA;AAGjC;AC7BA,MAAM,QAAQ;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AACjB;AAIO,SAAS,sBAAsB,UAAkB;AACtD,QAAM,eAAeI,MAAAA,QAAQ,MAAM;AACjC,WAAO,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ;AAC7C,UAAI,GAAgB,IAAI,MAAM,GAAgB,EAAE,KAAK,QAAQ;AAC7D,aAAO;AAAA,IACT,GAAG,CAAA,CAA0B;AAAA,EAC/B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,UAAUA,MAAAA;AAAAA,IACd,MAAM,OAAO,OAAO,YAAY,EAAE,MAAM,CAAC,QAAQ,GAAG;AAAA,IACpD,CAAC,YAAY;AAAA,EAAA;AAGf,QAAM,WAAWC,MAAAA;AAAAA,IACf,CAAC,YAAoB,aAAa;AAChC,UAAIC,WAAU;AACd,YAAM,SAAS,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ;AAChD,YAAI,CAAC,MAAM,GAAyB,EAAE,KAAK,SAAS,GAAG;AACrDA,qBAAU;AACV,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAED,aAAO,EAAE,SAAAA,UAAS,OAAA;AAAA,IACpB;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAGX,SAAO,EAAE,cAAc,SAAS,SAAA;AAClC;ACxCA,MAAM,UAAU;AAQT,MAAM,iBAAiB,CAC5B,YAEG;;AACH,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,IAAI,GAAG,OAAO,mBAAmB,SAAS;AAAA,MACrE,SAAS;AAAA,QACP,gBAAgB;AAAA;AAAA,QAEhB,QAAQ;AAAA,QACR,SAAS;AAAA,MAAA;AAAA,IACX,CACD;AACD,WAAO,SAAS;AAAA,EAClB,SAAS,OAAY;AACnB,YAAM,WAAM,aAAN,mBAAgB,SAAQ;AAAA,EAChC;AACF;ACVO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,UAAA,IAAcJ,eAAAA,eAAe,cAAc;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAID,MAAAA,SAAS,QAAQ;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,gBAAgB,EAAE;AAC3D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAS,gBAAgB,EAAE;AACzE,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,KAAK;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAAS,EAAE;AACrD,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,MAAAA,SAAS,EAAE;AAEnE,QAAM,EAAE,cAAc,aAAa,sBAAsB,QAAQ;AAEjE,QAAM,eAAe,MAAY;AAC/B,oBAAgB,IAAI;AACpB,QAAI;AACF,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,cAAc;AAAA,QACd,kBAAkB,gBAAgB;AAAA,MAAA,CACnC;AACDM,YAAAA,YAAY;AAAA,QACV,UAAU,qBAAqB;AAAA,QAC/B,UAAU,mBAAmB;AAAA,MAAA;AAG/B;AAAA,IACF,SAAS,OAAY;AACnB,cAAQ,MAAM,KAAK;AACnBA,YAAAA,YAAY;AAAA,QACV,UAAU,mBAAmB;AAAA,QAC7B,UAAU,iBAAiB;AAAA,MAAA;AAAA,IAG/B,UAAA;AACE,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,oBACJR,2BAAAA,kBAAAA,KAAAI,WAAAA,kBAAAA,UAAA,EACE,UAAA;AAAA,IAAAJ,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,+CACZ,UAAA;AAAA,MAAA,UAAU,yBAAyB;AAAA,MAAG;AAAA,MACvCC,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,WAAU,gCAAgC,UAAA,OAAM;AAAA,uDACrD,MAAA,EAAG;AAAA,MACH,UAAU,WAAW;AAAA,IAAA,GACxB;AAAA,IAEAD,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,MAAA,UAAU,gBAAgB;AAAA,MAAG;AAAA,MAC9BC,2BAAAA,kBAAAA,IAAC,QAAA,EAAK,WAAU,gCAA+B,UAAA,cAAU;AAAA,MAAO;AAAA,MAAE;AAAA,MACjE,UAAU,8BAA8B;AAAA,IAAA,EAAA,CAC3C;AAAA,EAAA,GACF;AAGF,SACED,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,kFACb,UAAA;AAAA,IAAAC,2BAAAA,kBAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,OAAO,UAAU,OAAO;AAAA,QACxB,aAAa;AAAA,MAAA;AAAA,IAAA;AAAA,IAGfD,2BAAAA,kBAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAAC,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,UAAU,kBAAkB;AAAA,UACnC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAa,UAAU,wBAAwB;AAAA,UAC/C,UAAQ;AAAA,UACR,UAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,MAGVA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,UAAU,gBAAgB;AAAA,UACjC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM;AACf,kBAAM,cAAc,EAAE,OAAO;AAC7B,wBAAY,WAAW;AAEvB,gBAAI,CAAC,aAAa;AAChB,+BAAiB,UAAU,uBAAuB,CAAC;AAAA,YACrD,WAAW,CAAC,SAAS,WAAW,EAAE,SAAS;AACzC,+BAAiB,UAAU,sBAAsB,CAAC;AAAA,YACpD,OAAO;AACL,+BAAiB,EAAE;AAAA,YACrB;AAEA,gBAAI,mBAAmB,oBAAoB,aAAa;AACtD;AAAA,gBACE,UAAU,+BAA+B;AAAA,cAAA;AAAA,YAE7C,OAAO;AACL,sCAAwB,EAAE;AAAA,YAC5B;AAAA,UACF;AAAA,UACA,aAAa,UAAU,sBAAsB;AAAA,UAC7C,UAAQ;AAAA,UACR,oBAAkB;AAAA,UAClB,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAGTA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,UAAU,wBAAwB;AAAA,UACzC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM;AACf,kBAAM,aAAa,EAAE,OAAO;AAC5B,+BAAmB,UAAU;AAE7B,gBAAI,CAAC,YAAY;AACf;AAAA,gBACE,UAAU,+BAA+B;AAAA,cAAA;AAAA,YAE7C,WAAW,eAAe,UAAU;AAClC;AAAA,gBACE,UAAU,+BAA+B;AAAA,cAAA;AAAA,YAE7C,OAAO;AACL,sCAAwB,EAAE;AAAA,YAC5B;AAAA,UACF;AAAA,UACA,aAAa,UAAU,8BAA8B;AAAA,UACrD,UAAQ;AAAA,UACR,oBAAkB;AAAA,UAClB,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAGTA,iDAAC,wBAAqB,cAA4B;AAAA,MAElDA,2BAAAA,kBAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,UACE,gBACA,CAAC,YACD,CAAC,mBACD,CAAC,CAAC,iBACF,CAAC,CAAC;AAAA,UAEJ,WAAW;AAAA,UAEV,oBAAU,iBAAiB;AAAA,QAAA;AAAA,MAAA;AAAA,IAC9B,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;;"}
|
|
1
|
+
{"version":3,"file":"digistore.cjs","sources":["../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string; //props có password thì là current password, email = username, new_password là cho người dùng nhập\n apiUrl: string;\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(\n `${payload.apiUrl}/reset-password`,\n payload,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n },\n );\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { CustomToast } from \"@/components/common/custom-toast\";\nimport { useTranslation } from \"@/hooks/use-translation\";\nimport { useState } from \"react\";\nimport { usePasswordValidation } from \"../hooks/usePasswordValidation\";\nimport { forgotPassword } from \"../services/createDigistoreAccountService\";\nimport { FormHeader } from \"./FormHeader\";\nimport { InputField } from \"./InputField\";\nimport { PasswordRequirements } from \"./PasswordRequirements\";\nimport { SubmitButton } from \"./SubmitButton\";\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n apiUrl: string;\n}\n\nexport function NewAccountCreate({\n apiUrl,\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation(\"digistore-id\");\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || \"\");\n const [confirmPassword, setConfirmPassword] = useState(userPassword || \"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState(\"\");\n const [confirmPasswordError, setConfirmPasswordError] = useState(\"\");\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n apiUrl,\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate(\"success_toast_title\"),\n translate(\"success_toast_des\"),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate(\"error_toast_title\"),\n translate(\"error_toast_des\"),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate(\"note_login_success_with\")}{\" \"}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate(\"note_desc\")}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate(\"note_from_date\")}{\" \"}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{\" \"}\n {translate(\"note_use_digis_acc_to_access\")}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate(\"title\")}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate(\"form_email_label\")}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate(\"form_email_placeholder\")}\n required\n disabled\n />\n\n <InputField\n label={translate(\"form_pwd_label\")}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate(\"form_pwd_err_required\"));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate(\"form_pwd_err_invalid\"));\n } else {\n setPasswordError(\"\");\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_pwd_placeholder\")}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate(\"form_confirm_pwd_label\")}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_required\"),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_confirm_pwd_placeholder\")}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate(\"form_submit_btn\")}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["useMemo","useCallback","isValid","jsxs","Fragment","jsx","useState","useTranslation","CustomToast"],"mappings":"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"}
|
package/dist/digistore.esm.js
CHANGED
|
@@ -19,10 +19,70 @@ var __async = (__this, __arguments, generator) => {
|
|
|
19
19
|
});
|
|
20
20
|
};
|
|
21
21
|
import { j as jsxRuntimeExports } from "./jsx-runtime-ClP9nxnW.js";
|
|
22
|
-
import { useState, useMemo, useCallback } from "react";
|
|
23
|
-
import { u as useTranslation } from "./use-translation-CPJMFAae.js";
|
|
24
22
|
import { C as CustomToast } from "./index-ChOpfqCh.js";
|
|
23
|
+
import { u as useTranslation } from "./use-translation-CPJMFAae.js";
|
|
24
|
+
import { useMemo, useCallback, useState } from "react";
|
|
25
25
|
import axios from "axios";
|
|
26
|
+
const regex = {
|
|
27
|
+
length: /^.{8,35}$/,
|
|
28
|
+
upper: /^(?=.*[A-Z]).*$/,
|
|
29
|
+
lower: /^(?=.*[a-z]).*$/,
|
|
30
|
+
number: /^(?=.*\d).+$/,
|
|
31
|
+
no_vietnamese: /^[\x21-\x7E]+$/
|
|
32
|
+
};
|
|
33
|
+
function usePasswordValidation(password) {
|
|
34
|
+
const requirements = useMemo(() => {
|
|
35
|
+
return Object.keys(regex).reduce((acc, key) => {
|
|
36
|
+
acc[key] = regex[key].test(password);
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
39
|
+
}, [password]);
|
|
40
|
+
const isValid = useMemo(
|
|
41
|
+
() => Object.values(requirements).every((req) => req),
|
|
42
|
+
[requirements]
|
|
43
|
+
);
|
|
44
|
+
const validate = useCallback(
|
|
45
|
+
(_password = password) => {
|
|
46
|
+
let isValid2 = true;
|
|
47
|
+
const errors = Object.keys(regex).filter((key) => {
|
|
48
|
+
if (!regex[key].test(_password)) {
|
|
49
|
+
isValid2 = false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return { isValid: isValid2, errors };
|
|
54
|
+
},
|
|
55
|
+
[password]
|
|
56
|
+
);
|
|
57
|
+
return { requirements, isValid, validate };
|
|
58
|
+
}
|
|
59
|
+
const forgotPassword = (payload) => __async(void 0, null, function* () {
|
|
60
|
+
var _a;
|
|
61
|
+
try {
|
|
62
|
+
const response = yield axios.put(
|
|
63
|
+
`${payload.apiUrl}/reset-password`,
|
|
64
|
+
payload,
|
|
65
|
+
{
|
|
66
|
+
headers: {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
// Authorization: `Bearer ${accessToken}`,
|
|
69
|
+
Origin: "http://localhost:3000",
|
|
70
|
+
Referer: "http://localhost:3000/"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
return response.data;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
function FormHeader({ logoSrc, title, description }) {
|
|
80
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
82
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
83
|
+
description && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
26
86
|
const EyeIcon = ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
27
87
|
"svg",
|
|
28
88
|
{
|
|
@@ -175,13 +235,6 @@ function PasswordRequirements({
|
|
|
175
235
|
] })
|
|
176
236
|
] });
|
|
177
237
|
}
|
|
178
|
-
function FormHeader({ logoSrc, title, description }) {
|
|
179
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
180
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
181
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
182
|
-
description && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
183
|
-
] });
|
|
184
|
-
}
|
|
185
238
|
function SubmitButton({
|
|
186
239
|
onClick,
|
|
187
240
|
disabled = false,
|
|
@@ -204,57 +257,8 @@ function SubmitButton({
|
|
|
204
257
|
}
|
|
205
258
|
);
|
|
206
259
|
}
|
|
207
|
-
const regex = {
|
|
208
|
-
length: /^.{8,35}$/,
|
|
209
|
-
upper: /^(?=.*[A-Z]).*$/,
|
|
210
|
-
lower: /^(?=.*[a-z]).*$/,
|
|
211
|
-
number: /^(?=.*\d).+$/,
|
|
212
|
-
no_vietnamese: /^[\x21-\x7E]+$/
|
|
213
|
-
};
|
|
214
|
-
function usePasswordValidation(password) {
|
|
215
|
-
const requirements = useMemo(() => {
|
|
216
|
-
return Object.keys(regex).reduce((acc, key) => {
|
|
217
|
-
acc[key] = regex[key].test(password);
|
|
218
|
-
return acc;
|
|
219
|
-
}, {});
|
|
220
|
-
}, [password]);
|
|
221
|
-
const isValid = useMemo(
|
|
222
|
-
() => Object.values(requirements).every((req) => req),
|
|
223
|
-
[requirements]
|
|
224
|
-
);
|
|
225
|
-
const validate = useCallback(
|
|
226
|
-
(_password = password) => {
|
|
227
|
-
let isValid2 = true;
|
|
228
|
-
const errors = Object.keys(regex).filter((key) => {
|
|
229
|
-
if (!regex[key].test(_password)) {
|
|
230
|
-
isValid2 = false;
|
|
231
|
-
return true;
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
return { isValid: isValid2, errors };
|
|
235
|
-
},
|
|
236
|
-
[password]
|
|
237
|
-
);
|
|
238
|
-
return { requirements, isValid, validate };
|
|
239
|
-
}
|
|
240
|
-
const API_URL = "https://bvbank-stag.atomsolution.vn/v1/portal/user";
|
|
241
|
-
const forgotPassword = (payload) => __async(void 0, null, function* () {
|
|
242
|
-
var _a;
|
|
243
|
-
try {
|
|
244
|
-
const response = yield axios.put(`${API_URL}/reset-password`, payload, {
|
|
245
|
-
headers: {
|
|
246
|
-
"Content-Type": "application/json",
|
|
247
|
-
// Authorization: `Bearer ${accessToken}`,
|
|
248
|
-
Origin: "http://localhost:3000",
|
|
249
|
-
Referer: "http://localhost:3000/"
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
return response.data;
|
|
253
|
-
} catch (error) {
|
|
254
|
-
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
260
|
function NewAccountCreate({
|
|
261
|
+
apiUrl,
|
|
258
262
|
username,
|
|
259
263
|
userPassword,
|
|
260
264
|
logo,
|
|
@@ -272,6 +276,7 @@ function NewAccountCreate({
|
|
|
272
276
|
setIsSubmitting(true);
|
|
273
277
|
try {
|
|
274
278
|
yield forgotPassword({
|
|
279
|
+
apiUrl,
|
|
275
280
|
email,
|
|
276
281
|
new_password: password,
|
|
277
282
|
current_password: userPassword || void 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digistore.esm.js","sources":["../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\nconst API_URL = \"https://bvbank-stag.atomsolution.vn/v1/portal/user\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string //props có password thì là current password, email = username, new_password là cho người dùng nhập\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(`${API_URL}/reset-password`, payload, {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n });\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { useState } from 'react';\nimport { InputField } from './InputField';\nimport { PasswordRequirements } from './PasswordRequirements';\nimport { FormHeader } from './FormHeader';\nimport { SubmitButton } from './SubmitButton';\nimport { useTranslation } from '@/hooks/use-translation';\nimport { CustomToast } from '@/components/common/custom-toast';\nimport { usePasswordValidation } from '../hooks/usePasswordValidation';\nimport { forgotPassword } from '../services/createDigistoreAccountService';\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n}\n\nexport function NewAccountCreate({\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation('digistore-id');\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || '');\n const [confirmPassword, setConfirmPassword] = useState(userPassword || '');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState('');\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate('success_toast_title'),\n translate('success_toast_des'),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate('error_toast_title'),\n translate('error_toast_des'),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate('note_login_success_with')}{' '}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate('note_desc')}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate('note_from_date')}{' '}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{' '}\n {translate('note_use_digis_acc_to_access')}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate('title')}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate('form_email_label')}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate('form_email_placeholder')}\n required\n disabled\n />\n\n <InputField\n label={translate('form_pwd_label')}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate('form_pwd_err_required'));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate('form_pwd_err_invalid'));\n } else {\n setPasswordError('');\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_pwd_placeholder')}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate('form_confirm_pwd_label')}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_required'),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_confirm_pwd_placeholder')}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate('form_submit_btn')}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["jsxs","jsx","Fragment","isValid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"digistore.esm.js","sources":["../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string; //props có password thì là current password, email = username, new_password là cho người dùng nhập\n apiUrl: string;\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(\n `${payload.apiUrl}/reset-password`,\n payload,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n },\n );\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { CustomToast } from \"@/components/common/custom-toast\";\nimport { useTranslation } from \"@/hooks/use-translation\";\nimport { useState } from \"react\";\nimport { usePasswordValidation } from \"../hooks/usePasswordValidation\";\nimport { forgotPassword } from \"../services/createDigistoreAccountService\";\nimport { FormHeader } from \"./FormHeader\";\nimport { InputField } from \"./InputField\";\nimport { PasswordRequirements } from \"./PasswordRequirements\";\nimport { SubmitButton } from \"./SubmitButton\";\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n apiUrl: string;\n}\n\nexport function NewAccountCreate({\n apiUrl,\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation(\"digistore-id\");\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || \"\");\n const [confirmPassword, setConfirmPassword] = useState(userPassword || \"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState(\"\");\n const [confirmPasswordError, setConfirmPasswordError] = useState(\"\");\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n apiUrl,\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate(\"success_toast_title\"),\n translate(\"success_toast_des\"),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate(\"error_toast_title\"),\n translate(\"error_toast_des\"),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate(\"note_login_success_with\")}{\" \"}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate(\"note_desc\")}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate(\"note_from_date\")}{\" \"}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{\" \"}\n {translate(\"note_use_digis_acc_to_access\")}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate(\"title\")}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate(\"form_email_label\")}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate(\"form_email_placeholder\")}\n required\n disabled\n />\n\n <InputField\n label={translate(\"form_pwd_label\")}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate(\"form_pwd_err_required\"));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate(\"form_pwd_err_invalid\"));\n } else {\n setPasswordError(\"\");\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_pwd_placeholder\")}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate(\"form_confirm_pwd_label\")}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_required\"),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_confirm_pwd_placeholder\")}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate(\"form_submit_btn\")}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["isValid","jsxs","Fragment","jsx"],"mappings":"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"}
|
package/dist/digistore.js
CHANGED
|
@@ -19,10 +19,70 @@ var __async = (__this, __arguments, generator) => {
|
|
|
19
19
|
});
|
|
20
20
|
};
|
|
21
21
|
import { j as jsxRuntimeExports } from "./jsx-runtime-ClP9nxnW.js";
|
|
22
|
-
import { useState, useMemo, useCallback } from "react";
|
|
23
|
-
import { u as useTranslation } from "./use-translation-CPJMFAae.js";
|
|
24
22
|
import { C as CustomToast } from "./index-ChOpfqCh.js";
|
|
23
|
+
import { u as useTranslation } from "./use-translation-CPJMFAae.js";
|
|
24
|
+
import { useMemo, useCallback, useState } from "react";
|
|
25
25
|
import axios from "axios";
|
|
26
|
+
const regex = {
|
|
27
|
+
length: /^.{8,35}$/,
|
|
28
|
+
upper: /^(?=.*[A-Z]).*$/,
|
|
29
|
+
lower: /^(?=.*[a-z]).*$/,
|
|
30
|
+
number: /^(?=.*\d).+$/,
|
|
31
|
+
no_vietnamese: /^[\x21-\x7E]+$/
|
|
32
|
+
};
|
|
33
|
+
function usePasswordValidation(password) {
|
|
34
|
+
const requirements = useMemo(() => {
|
|
35
|
+
return Object.keys(regex).reduce((acc, key) => {
|
|
36
|
+
acc[key] = regex[key].test(password);
|
|
37
|
+
return acc;
|
|
38
|
+
}, {});
|
|
39
|
+
}, [password]);
|
|
40
|
+
const isValid = useMemo(
|
|
41
|
+
() => Object.values(requirements).every((req) => req),
|
|
42
|
+
[requirements]
|
|
43
|
+
);
|
|
44
|
+
const validate = useCallback(
|
|
45
|
+
(_password = password) => {
|
|
46
|
+
let isValid2 = true;
|
|
47
|
+
const errors = Object.keys(regex).filter((key) => {
|
|
48
|
+
if (!regex[key].test(_password)) {
|
|
49
|
+
isValid2 = false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return { isValid: isValid2, errors };
|
|
54
|
+
},
|
|
55
|
+
[password]
|
|
56
|
+
);
|
|
57
|
+
return { requirements, isValid, validate };
|
|
58
|
+
}
|
|
59
|
+
const forgotPassword = (payload) => __async(void 0, null, function* () {
|
|
60
|
+
var _a;
|
|
61
|
+
try {
|
|
62
|
+
const response = yield axios.put(
|
|
63
|
+
`${payload.apiUrl}/reset-password`,
|
|
64
|
+
payload,
|
|
65
|
+
{
|
|
66
|
+
headers: {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
// Authorization: `Bearer ${accessToken}`,
|
|
69
|
+
Origin: "http://localhost:3000",
|
|
70
|
+
Referer: "http://localhost:3000/"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
return response.data;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
function FormHeader({ logoSrc, title, description }) {
|
|
80
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
82
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
83
|
+
description && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
26
86
|
const EyeIcon = ({ className }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
27
87
|
"svg",
|
|
28
88
|
{
|
|
@@ -175,13 +235,6 @@ function PasswordRequirements({
|
|
|
175
235
|
] })
|
|
176
236
|
] });
|
|
177
237
|
}
|
|
178
|
-
function FormHeader({ logoSrc, title, description }) {
|
|
179
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
180
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-1.5 justify-self-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logoSrc, alt: "BVBank Logo", className: "h-10 w-auto" }) }),
|
|
181
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-base font-semibold text-gray-900 text-center mb-1.5", children: title }),
|
|
182
|
-
description && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]", children: description })
|
|
183
|
-
] });
|
|
184
|
-
}
|
|
185
238
|
function SubmitButton({
|
|
186
239
|
onClick,
|
|
187
240
|
disabled = false,
|
|
@@ -204,57 +257,8 @@ function SubmitButton({
|
|
|
204
257
|
}
|
|
205
258
|
);
|
|
206
259
|
}
|
|
207
|
-
const regex = {
|
|
208
|
-
length: /^.{8,35}$/,
|
|
209
|
-
upper: /^(?=.*[A-Z]).*$/,
|
|
210
|
-
lower: /^(?=.*[a-z]).*$/,
|
|
211
|
-
number: /^(?=.*\d).+$/,
|
|
212
|
-
no_vietnamese: /^[\x21-\x7E]+$/
|
|
213
|
-
};
|
|
214
|
-
function usePasswordValidation(password) {
|
|
215
|
-
const requirements = useMemo(() => {
|
|
216
|
-
return Object.keys(regex).reduce((acc, key) => {
|
|
217
|
-
acc[key] = regex[key].test(password);
|
|
218
|
-
return acc;
|
|
219
|
-
}, {});
|
|
220
|
-
}, [password]);
|
|
221
|
-
const isValid = useMemo(
|
|
222
|
-
() => Object.values(requirements).every((req) => req),
|
|
223
|
-
[requirements]
|
|
224
|
-
);
|
|
225
|
-
const validate = useCallback(
|
|
226
|
-
(_password = password) => {
|
|
227
|
-
let isValid2 = true;
|
|
228
|
-
const errors = Object.keys(regex).filter((key) => {
|
|
229
|
-
if (!regex[key].test(_password)) {
|
|
230
|
-
isValid2 = false;
|
|
231
|
-
return true;
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
return { isValid: isValid2, errors };
|
|
235
|
-
},
|
|
236
|
-
[password]
|
|
237
|
-
);
|
|
238
|
-
return { requirements, isValid, validate };
|
|
239
|
-
}
|
|
240
|
-
const API_URL = "https://bvbank-stag.atomsolution.vn/v1/portal/user";
|
|
241
|
-
const forgotPassword = (payload) => __async(void 0, null, function* () {
|
|
242
|
-
var _a;
|
|
243
|
-
try {
|
|
244
|
-
const response = yield axios.put(`${API_URL}/reset-password`, payload, {
|
|
245
|
-
headers: {
|
|
246
|
-
"Content-Type": "application/json",
|
|
247
|
-
// Authorization: `Bearer ${accessToken}`,
|
|
248
|
-
Origin: "http://localhost:3000",
|
|
249
|
-
Referer: "http://localhost:3000/"
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
return response.data;
|
|
253
|
-
} catch (error) {
|
|
254
|
-
throw ((_a = error.response) == null ? void 0 : _a.data) || error;
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
260
|
function NewAccountCreate({
|
|
261
|
+
apiUrl,
|
|
258
262
|
username,
|
|
259
263
|
userPassword,
|
|
260
264
|
logo,
|
|
@@ -272,6 +276,7 @@ function NewAccountCreate({
|
|
|
272
276
|
setIsSubmitting(true);
|
|
273
277
|
try {
|
|
274
278
|
yield forgotPassword({
|
|
279
|
+
apiUrl,
|
|
275
280
|
email,
|
|
276
281
|
new_password: password,
|
|
277
282
|
current_password: userPassword || void 0
|
package/dist/digistore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digistore.js","sources":["../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\nconst API_URL = \"https://bvbank-stag.atomsolution.vn/v1/portal/user\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string //props có password thì là current password, email = username, new_password là cho người dùng nhập\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(`${API_URL}/reset-password`, payload, {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n });\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { useState } from 'react';\nimport { InputField } from './InputField';\nimport { PasswordRequirements } from './PasswordRequirements';\nimport { FormHeader } from './FormHeader';\nimport { SubmitButton } from './SubmitButton';\nimport { useTranslation } from '@/hooks/use-translation';\nimport { CustomToast } from '@/components/common/custom-toast';\nimport { usePasswordValidation } from '../hooks/usePasswordValidation';\nimport { forgotPassword } from '../services/createDigistoreAccountService';\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n}\n\nexport function NewAccountCreate({\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation('digistore-id');\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || '');\n const [confirmPassword, setConfirmPassword] = useState(userPassword || '');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState('');\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate('success_toast_title'),\n translate('success_toast_des'),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate('error_toast_title'),\n translate('error_toast_des'),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate('note_login_success_with')}{' '}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate('note_desc')}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate('note_from_date')}{' '}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{' '}\n {translate('note_use_digis_acc_to_access')}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate('title')}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate('form_email_label')}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate('form_email_placeholder')}\n required\n disabled\n />\n\n <InputField\n label={translate('form_pwd_label')}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate('form_pwd_err_required'));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate('form_pwd_err_invalid'));\n } else {\n setPasswordError('');\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_pwd_placeholder')}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate('form_confirm_pwd_label')}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_required'),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate('form_confirm_pwd_err_no_match'),\n );\n } else {\n setConfirmPasswordError('');\n }\n }}\n placeholder={translate('form_confirm_pwd_placeholder')}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate('form_submit_btn')}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["jsxs","jsx","Fragment","isValid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"digistore.js","sources":["../src/digistore/hooks/usePasswordValidation.ts","../src/digistore/services/createDigistoreAccountService.ts","../src/digistore/NewAccountCreate/FormHeader.tsx","../src/digistore/NewAccountCreate/Icon.tsx","../src/digistore/NewAccountCreate/InputField.tsx","../src/digistore/NewAccountCreate/RequirementItem.tsx","../src/digistore/NewAccountCreate/PasswordRequirements.tsx","../src/digistore/NewAccountCreate/SubmitButton.tsx","../src/digistore/NewAccountCreate/index.tsx"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { PasswordRequirements } from \"../NewAccountCreate/types\";\n\nconst regex = {\n length: /^.{8,35}$/,\n upper: /^(?=.*[A-Z]).*$/,\n lower: /^(?=.*[a-z]).*$/,\n number: /^(?=.*\\d).+$/,\n no_vietnamese: /^[\\x21-\\x7E]+$/,\n};\n\ntype TRegexKey = keyof typeof regex;\n\nexport function usePasswordValidation(password: string) {\n const requirements = useMemo(() => {\n return Object.keys(regex).reduce((acc, key) => {\n acc[key as TRegexKey] = regex[key as TRegexKey].test(password);\n return acc;\n }, {} as PasswordRequirements);\n }, [password]);\n\n const isValid = useMemo(\n () => Object.values(requirements).every((req) => req),\n [requirements]\n );\n\n const validate = useCallback(\n (_password: string = password) => {\n let isValid = true;\n const errors = Object.keys(regex).filter((key) => {\n if (!regex[key as keyof typeof regex].test(_password)) {\n isValid = false;\n return true;\n }\n });\n\n return { isValid, errors };\n },\n [password]\n );\n\n return { requirements, isValid, validate };\n}\n","import axios from \"axios\";\n\ninterface ForgotPasswordPayload {\n new_password: string;\n email: string;\n current_password?: string; //props có password thì là current password, email = username, new_password là cho người dùng nhập\n apiUrl: string;\n}\n\nexport const forgotPassword = async (\n payload: ForgotPasswordPayload,\n // accessToken: string\n) => {\n try {\n const response = await axios.put(\n `${payload.apiUrl}/reset-password`,\n payload,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n // Authorization: `Bearer ${accessToken}`,\n Origin: \"http://localhost:3000\",\n Referer: \"http://localhost:3000/\",\n },\n },\n );\n return response.data;\n } catch (error: any) {\n throw error.response?.data || error;\n }\n};\n","import { ReactNode } from \"react\";\n\ninterface FormHeaderProps {\n logoSrc: string;\n title: string;\n description?: ReactNode;\n}\n\nexport function FormHeader({ logoSrc, title, description }: FormHeaderProps) {\n return (\n <>\n <div className=\"mb-1.5 justify-self-center\">\n <img src={logoSrc} alt=\"BVBank Logo\" className=\"h-10 w-auto\" />\n </div>\n <h1 className=\"text-base font-semibold text-gray-900 text-center mb-1.5\">\n {title}\n </h1>\n {description && (\n <div className=\"p-2 md:px-3 md:py-2 rounded-xl bg-[#EBF1FF] text-[0.6rem]\">\n {description}\n </div>\n )}\n </>\n );\n}\n","interface IconProps {\n className: string;\n}\nexport const EyeIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\"\n />\n </svg>\n);\n\n// Eye Slash Icon Component\nexport const EyeSlashIcon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20c-5 0-9.27-3.11-11-8a11.66 11.66 0 012.39-4.27\" />\n <path d=\"M3 3l18 18\" />\n <path d=\"M9.53 9.53A3 3 0 0114.47 14.47\" />\n <path d=\"M21 12a11.66 11.66 0 00-3.06-4.94M12 5a10.94 10.94 0 016.06 1.94\" />\n </svg>\n);\n","// types.ts - Type definitions\nexport interface PasswordRequirements {\n length: boolean;\n special: boolean;\n upper: boolean;\n lower: boolean;\n number: boolean;\n}\n\n// InputField.tsx - Component tái sử dụng cho input\nimport { useState } from \"react\";\nimport { EyeIcon, EyeSlashIcon } from \"./Icon\";\n\ninterface InputFieldProps {\n label: string;\n type?: string;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: string;\n required?: boolean;\n showPasswordToggle?: boolean;\n className?: string;\n disabled?: boolean;\n error?: string\n}\n\nexport function InputField({\n label,\n type = \"text\",\n value,\n onChange,\n placeholder,\n required = false,\n showPasswordToggle = false,\n className = \"\",\n disabled = false,\n error = ''\n}: InputFieldProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n const inputType = showPasswordToggle\n ? showPassword\n ? \"text\"\n : \"password\"\n : type;\n\n return (\n <div className={className}>\n <label className=\"block text-[0.685rem] font-semibold text-gray-700 mb-1\">\n {label} {required && <span className=\"text-red-500\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={value}\n onChange={onChange}\n className=\"w-full px-4 py-2 pr-12 border-2 border-gray-200 rounded-lg text-xs\n focus:outline-none focus:border-blue-500 focus:bg-white focus:ring-3\n focus:ring-blue-100 transition-all disabled:bg-gray-200\"\n placeholder={placeholder}\n disabled={disabled}\n />\n {showPasswordToggle && (\n <button\n type=\"button\"\n className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 p-1\"\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"w-5 h-5\" />\n ) : (\n <EyeIcon className=\"w-5 h-5\" />\n )}\n </button>\n )}\n </div>\n\n <div className={`grid duration-200 ${error ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'}`}>\n <div className=\"overflow-hidden\">\n <p className=\"text-red-500 text-xs font-normal mt-2\">{error}</p>\n </div>\n </div>\n </div>\n );\n}\n","interface RequirementItemProps {\n met: boolean;\n text: string;\n}\n\nconst RequirementItem = ({ met, text }: RequirementItemProps) => (\n <li className=\"flex items-center gap-2 text-[0.65rem] leading-none text-gray-700\">\n <span className=\"mt-0.5 w-4 h-4 flex items-center justify-center\">\n {met ? (\n // Check SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-4 h-4 text-green-600\"\n >\n <path d=\"M20 6L9 17l-5-5\" />\n </svg>\n ) : (\n // Dot SVG\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 8 8\"\n className=\"w-2 h-2 text-gray-400 fill-current\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n )}\n </span>\n <span className={met ? \"text-gray-800 leading-none\" : \"leading-none\"}>\n {text}\n </span>\n </li>\n);\n\nexport default RequirementItem;\n","import { useTranslation } from \"@/hooks/use-translation\";\nimport RequirementItem from \"./RequirementItem\";\nimport { PasswordRequirements as PasswordRequirementsType } from \"./types\";\n\ninterface PasswordRequirementsProps {\n requirements: PasswordRequirementsType;\n}\n\nexport function PasswordRequirements({\n requirements,\n}: PasswordRequirementsProps) {\n const { translate } = useTranslation('digistore-id')\n\n return (\n <div className=\"bg-gray-50 rounded-lg px-4 py-2 mt-2\">\n <div className=\"text-xs font-semibold mb-2\">{translate(\"pwd_requirement_title\")}</div>\n <ul className=\"space-y-0.5\">\n <RequirementItem met={requirements.length} text={translate(\"pwd_requirement_length\")} />\n <RequirementItem\n met={requirements.upper}\n text={translate(\"pwd_requirement_uppercase\")}\n />\n <RequirementItem\n met={requirements.lower}\n text={translate(\"pwd_requirement_lowercase\")}\n />\n <RequirementItem met={requirements.number} text={translate(\"pwd_requirement_number\")} />\n <RequirementItem met={requirements.no_vietnamese} text={translate(\"pwd_requirement_no_vietnamese\")} />\n </ul>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\n\ninterface SubmitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isLoading?: boolean;\n children: ReactNode;\n loadingText?: string;\n className?: string;\n}\n\nexport function SubmitButton({\n onClick,\n disabled = false,\n isLoading = false,\n children,\n loadingText = \"Đang xử lý...\",\n className = \"\",\n}: SubmitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full bg-[#1F2B7B] text-white border-none \n py-2.5 rounded-lg text-xs font-semibold cursor-pointer \n hover:from-blue-700 hover:to-blue-800 hover:shadow-lg hover:-translate-y-0.5 \n active:translate-y-0 transition-all mt-6 disabled:opacity-75 \n disabled:cursor-not-allowed disabled:transform-none ${className}`}\n >\n {isLoading ? loadingText : children}\n </button>\n );\n}\n","import { CustomToast } from \"@/components/common/custom-toast\";\nimport { useTranslation } from \"@/hooks/use-translation\";\nimport { useState } from \"react\";\nimport { usePasswordValidation } from \"../hooks/usePasswordValidation\";\nimport { forgotPassword } from \"../services/createDigistoreAccountService\";\nimport { FormHeader } from \"./FormHeader\";\nimport { InputField } from \"./InputField\";\nimport { PasswordRequirements } from \"./PasswordRequirements\";\nimport { SubmitButton } from \"./SubmitButton\";\n\ninterface NewAccountCreate {\n logo: string;\n username: string;\n userPassword: string;\n redirectFunction?: () => void;\n apiUrl: string;\n}\n\nexport function NewAccountCreate({\n apiUrl,\n username,\n userPassword,\n logo,\n redirectFunction,\n}: NewAccountCreate) {\n const { translate } = useTranslation(\"digistore-id\");\n const [email, setEmail] = useState(username);\n const [password, setPassword] = useState(userPassword || \"\");\n const [confirmPassword, setConfirmPassword] = useState(userPassword || \"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [passwordError, setPasswordError] = useState(\"\");\n const [confirmPasswordError, setConfirmPasswordError] = useState(\"\");\n\n const { requirements, validate } = usePasswordValidation(password);\n\n const handleSubmit = async () => {\n setIsSubmitting(true);\n try {\n await forgotPassword({\n apiUrl,\n email,\n new_password: password,\n current_password: userPassword || undefined,\n });\n CustomToast.success(\n translate(\"success_toast_title\"),\n translate(\"success_toast_des\"),\n );\n // alert('Tài khoản đã được tạo thành công!');\n redirectFunction?.();\n } catch (error: any) {\n console.error(error);\n CustomToast.error(\n translate(\"error_toast_title\"),\n translate(\"error_toast_des\"),\n );\n // alert('Tạo tài khoản thất bại!');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const headerDescription = (\n <>\n <div className=\"text-xs text-primary leading-relaxed mb-0.5\">\n {translate(\"note_login_success_with\")}{\" \"}\n <span className=\"text-[#335CFF] font-semibold\">{email}</span>\n <br />\n {translate(\"note_desc\")}\n </div>\n\n <div className=\"text-xs text-primary leading-relaxed\">\n {translate(\"note_from_date\")}{\" \"}\n <span className=\"font-semibold text-[#335CFF]\">01/08/2025</span>,{\" \"}\n {translate(\"note_use_digis_acc_to_access\")}\n </div>\n </>\n );\n\n return (\n <div className=\"bg-white rounded-2xl shadow-2xl max-w-[550px] w-full px-8 pb-3.5 pt-3 relative\">\n <FormHeader\n logoSrc={logo}\n title={translate(\"title\")}\n description={headerDescription}\n />\n\n <div className=\"mt-2 space-y-3\">\n <InputField\n label={translate(\"form_email_label\")}\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={translate(\"form_email_placeholder\")}\n required\n disabled\n />\n\n <InputField\n label={translate(\"form_pwd_label\")}\n value={password}\n onChange={(e) => {\n const newPassword = e.target.value;\n setPassword(newPassword);\n\n if (!newPassword) {\n setPasswordError(translate(\"form_pwd_err_required\"));\n } else if (!validate(newPassword).isValid) {\n setPasswordError(translate(\"form_pwd_err_invalid\"));\n } else {\n setPasswordError(\"\");\n }\n\n if (confirmPassword && confirmPassword !== newPassword) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_pwd_placeholder\")}\n required\n showPasswordToggle\n error={passwordError}\n />\n\n <InputField\n label={translate(\"form_confirm_pwd_label\")}\n value={confirmPassword}\n onChange={(e) => {\n const newConfirm = e.target.value;\n setConfirmPassword(newConfirm);\n\n if (!newConfirm) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_required\"),\n );\n } else if (newConfirm !== password) {\n setConfirmPasswordError(\n translate(\"form_confirm_pwd_err_no_match\"),\n );\n } else {\n setConfirmPasswordError(\"\");\n }\n }}\n placeholder={translate(\"form_confirm_pwd_placeholder\")}\n required\n showPasswordToggle\n error={confirmPasswordError}\n />\n\n <PasswordRequirements requirements={requirements} />\n\n <SubmitButton\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !password ||\n !confirmPassword ||\n !!passwordError ||\n !!confirmPasswordError\n }\n isLoading={isSubmitting}\n >\n {translate(\"form_submit_btn\")}\n </SubmitButton>\n </div>\n </div>\n );\n}\n"],"names":["isValid","jsxs","Fragment","jsx"],"mappings":"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"}
|