From 4a6895aca4d1d5be3021cc582e50d2f6b12ed2d6 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 22 Aug 2025 17:48:59 +0530 Subject: [PATCH 1/3] signature-modal-mobile-view-V2 --- .../DocumentCompletionScreen.tsx | 10 ++++----- src/components/setting/AsideSection.tsx | 2 +- src/components/setting/ContactForm.tsx | 2 +- src/components/setting/CreateAndInvite.tsx | 6 ++--- src/components/setting/Setting.tsx | 10 ++++----- .../setting/Signature/DrawSignatureCanvas.tsx | 22 ++++++++++--------- src/components/setting/UserProfile.tsx | 2 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/components/process/CompletionScreen/DocumentCompletionScreen.tsx b/src/components/process/CompletionScreen/DocumentCompletionScreen.tsx index 496b4e4..39166aa 100644 --- a/src/components/process/CompletionScreen/DocumentCompletionScreen.tsx +++ b/src/components/process/CompletionScreen/DocumentCompletionScreen.tsx @@ -535,13 +535,13 @@ const DocumentSubmissionOptions = () => { */} -
-
+
+
-
-

Document Send Successfully!

-
+
+
+

Document Send Successfully!

diff --git a/src/components/setting/AsideSection.tsx b/src/components/setting/AsideSection.tsx index 0cf696e..cd20e24 100644 --- a/src/components/setting/AsideSection.tsx +++ b/src/components/setting/AsideSection.tsx @@ -37,7 +37,7 @@ const AsideSection = ({ e.preventDefault(); // Prevent default anchor behavior onSubSectionClick(subSection.id); }} - className={`block w-full text-left px-3 py-2 rounded-md text-sm font-medium transition-all duration-200 hover:bg-gray-50 cursor-pointer no-underline ${ + className={`block w-full text-left px-3 py-2.5 rounded-md text-sm font-medium transition-all duration-200 hover:bg-gray-50 cursor-pointer no-underline ${ activeSubSection === subSection.id ? "bg-blue-50 text-blue-600 border-l-4 border-blue-600 shadow-sm" : "text-gray-600 hover:text-gray-800 hover:bg-gray-50" diff --git a/src/components/setting/ContactForm.tsx b/src/components/setting/ContactForm.tsx index dbf5e01..e81732c 100644 --- a/src/components/setting/ContactForm.tsx +++ b/src/components/setting/ContactForm.tsx @@ -130,7 +130,7 @@ const ContactForm = ({ onSubmit, loading }: Props) => { }; return ( -
+

Add Contact

diff --git a/src/components/setting/CreateAndInvite.tsx b/src/components/setting/CreateAndInvite.tsx index 7925a26..5ec4561 100644 --- a/src/components/setting/CreateAndInvite.tsx +++ b/src/components/setting/CreateAndInvite.tsx @@ -158,9 +158,9 @@ const CreateAndInvite = ({ ); return ( -
+
{/* Create Section */} -
+

Create Account

{/* Invite Section */} -
+

Invite

{/* Account Name Dropdown */} diff --git a/src/components/setting/Setting.tsx b/src/components/setting/Setting.tsx index 806c5d2..c479cb0 100644 --- a/src/components/setting/Setting.tsx +++ b/src/components/setting/Setting.tsx @@ -226,7 +226,7 @@ const Setting = () => { } return ( -
+
{currentSubSections.map((subSection) => (
{
{/* Tabs */}
-
+
{tabs.map((tab) => tab.type === page1 && (
{/* Responsive Layout */} -
+
{/* Sidebar (hidden on small, shown on lg) */} {activeTab === 'userProfile' && ( @@ -455,8 +455,8 @@ const Setting = () => { {/* Sidebar as horizontal nav (only on mobile) */} {activeTab === 'userProfile' && ( -
-
+
+
{getSubSections(activeTab).map((sub) => (
@@ -253,10 +254,11 @@ const DrawSignatureCanvas: React.FC = ({ onSignatureChange, initialSignat
diff --git a/src/components/setting/UserProfile.tsx b/src/components/setting/UserProfile.tsx index 1b8e654..cbbe56a 100644 --- a/src/components/setting/UserProfile.tsx +++ b/src/components/setting/UserProfile.tsx @@ -20,7 +20,7 @@ interface UserProfileProps { const UserProfile: React.FC = ({ userData }) => { return ( -
+
{/* Profile Picture */}
From 16befeb71cf2bbac5cd4faa2876a0dd8c74fe107 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Mon, 25 Aug 2025 19:23:23 +0530 Subject: [PATCH 2/3] self-sign-modal-signature --- .../process/processStepOne/ProcessStepOne.tsx | 2 +- src/components/signature/SignCon.tsx | 785 +++++++++++++----- 2 files changed, 585 insertions(+), 202 deletions(-) diff --git a/src/components/process/processStepOne/ProcessStepOne.tsx b/src/components/process/processStepOne/ProcessStepOne.tsx index b67ea7a..12fdb01 100644 --- a/src/components/process/processStepOne/ProcessStepOne.tsx +++ b/src/components/process/processStepOne/ProcessStepOne.tsx @@ -398,7 +398,7 @@ const ProcessStepOne = () => { className='flex items-center gap-3'> {transactionTemplateToggle === TRANSACTION_TEMPLATE_TOGGLE.TEMPLATES && + ))} + +
+
+ + {/* Main Content */} +
+
+ {renderContent()} +
+
-
-
- - {/* Form Inputs */} -
-
-
-
-
- - {/* Navigation Menu */} -
-
*/} + + {/* Footer Buttons - Fixed */} +
- ))} - + +
+
+ + + {/* Desktop Sidebar Navigation */} +
+ {/* Header - Fixed */} +
+

+ Add Signature +

+

+ Create your digital signature +

+
+ + {/* Form Inputs - Fixed */} +
+
+
+ + setFullName(e.target.value)} + placeholder="Enter full name" + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500" + /> +
+
+ + setInitials(e.target.value)} + placeholder="Enter initials" + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500" + /> +
+
+
+ + {/* Navigation Menu - Fixed */} +
+ +
+ + {/* Spacer for desktop */} +
+
+ + {/* Main Content Area */} +
+ {/* Content - Scrollable */} +
+
+ {renderContent()} +
+
+ + {/* Checkbox - Fixed */} + {/*
+ +
*/} + + {/* Footer Buttons - Fixed */} +
+ + +
+
-
- - {/* Main Content Area */} -
- {/* Header with close button */} - - {/* Content */} -
- {/* */} - {renderContent()} -
- - {/* Footer Buttons in Main Area */} -
- - -
- -
-
-
); }; From d9f8cd58b0ef08f7390e251e29d573943e49386b Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Thu, 28 Aug 2025 17:22:27 +0530 Subject: [PATCH 3/3] login and register page functionality and the new ui update --- src/assets/illustration_1_.png | Bin 0 -> 66544 bytes src/components/auth/LoginForm.tsx | 450 ++++++++++------ src/components/auth/RegisterForm.tsx | 506 +++++++++++++----- src/components/auth/UsertAuthUI.tsx | 127 +++-- src/components/login/Login.tsx | 2 +- .../processStepOne/SelectedDocuments.tsx | 108 +++- src/components/register/Register.tsx | 2 +- src/components/styles/style.css | 6 +- 8 files changed, 835 insertions(+), 366 deletions(-) create mode 100644 src/assets/illustration_1_.png diff --git a/src/assets/illustration_1_.png b/src/assets/illustration_1_.png new file mode 100644 index 0000000000000000000000000000000000000000..b81f51dc9f9f0dc82bf7e8dc9bdb506abb9df51b GIT binary patch literal 66544 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 email: "", password: "" }); - const [cacheKey, setCacheKey] = useState(''); - const [nextClick, setNextClick] = useState(false); - const dispatch = useDispatch(); - const navigate = useNavigate(); +const LoginForm = ({ onSwitchToRegister }) => { + const [formData, setForm] = useState({ email: "", password: "" }); + const [cacheKey, setCacheKey] = useState(""); + const [nextClick, setNextClick] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const [errors, setErrors] = useState({ email: "", password: "" }); + const [isLoading, setIsLoading] = useState(false); + const navigate = useNavigate() + const validateEmail = (email) => { + const trimmedEmail = email.trim(); - const handleNextClick = () => { - - // Validation Starts - if (formData.email === "") { - return; + if (!trimmedEmail) { + return "Email address is required"; + } + + if (trimmedEmail.length > 254) { + return "Email address is too long"; } - // Validate Email Format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(formData.email)) { + if (!emailRegex.test(trimmedEmail)) { + return "Please enter a valid email address"; + } + + // Check for common typos + const commonDomains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com']; + const domain = trimmedEmail.split('@')[1]; + const commonTypos = { + 'gmial.com': 'gmail.com', + 'gmai.com': 'gmail.com', + 'yahooo.com': 'yahoo.com', + 'hotmial.com': 'hotmail.com' + }; + + if (commonTypos[domain]) { + return `Did you mean ${trimmedEmail.replace(domain, commonTypos[domain])}?`; + } + + return ""; + }; + + const validatePassword = (password) => { + if (!password) { + return "Password is required"; + } + + // if (password.length < 6) { + // return "Password must be at least 6 characters long"; + // } + + // if (password.length > 128) { + // return "Password is too long"; + // } + + return ""; + }; + + const handleEmailChange = (e) => { + const email = e.target.value; + setForm({ ...formData, email }); + + // Clear error when user starts typing + if (errors.email) { + setErrors({ ...errors, email: "" }); + } + }; + + const handlePasswordChange = (e) => { + const password = e.target.value; + setForm({ ...formData, password }); + + // Clear error when user starts typing + if (errors.password) { + setErrors({ ...errors, password: "" }); + } + }; + + const handleNextClick = async () => { + const emailError = validateEmail(formData.email); + + if (emailError) { + setErrors({ ...errors, email: emailError }); return; } - // Validation Ends - // Checking user exists getting cacheKey - axios.get(`${import.meta.env.VITE_BASE_URI}/api/auth/user?email=${formData.email}`, { headers: { "ngrok-skip-browser-warning": "69420" } }) - .then((res) => { + setIsLoading(true); - - if (res.status === 200) { - toast.dismiss(); - setCacheKey(res.data); - setNextClick(true); + try { + const res = await axios.get( + `${import.meta.env.VITE_BASE_URI}/api/auth/user?email=${formData.email}`, + { + headers: { + "ngrok-skip-browser-warning": "69420", + } } - }) - .catch((err) => { + ); + + if (res.status === 200) { toast.dismiss(); - toast.error("User Does Not Exists", { + setCacheKey(res.data); + setNextClick(true); + } + } catch (err: any) { + toast.dismiss(); + toast.error("User Does Not Exist", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + theme: "light", + transition: Bounce, + }); + } finally { + setIsLoading(false); + } + }; + + + const handleFormLoginClick = async () => { + const emailError = validateEmail(formData.email); + const passwordError = validatePassword(formData.password); + + if (emailError || passwordError) { + setErrors({ email: emailError, password: passwordError }); + return; + } + + setIsLoading(true); + setErrors({ email: "", password: "" }); + + try { + const res = await axios.post( + `${import.meta.env.VITE_BASE_URI}/api/auth/login`, + { email: formData.email, password: formData.password }, + { + withCredentials: true, + headers: { + "ngrok-skip-browser-warning": "69420", + "Access-Control-Allow-Origin": "*", + }, + } + ); + + if (res.status === 200) { + toast.dismiss(); + + // Example if you want cookies / redux: + // Cookies.set("authorization", res.headers.authorization, { + // path: "/", + // secure: true, + // sameSite: "Lax", + // }); + // dispatch(updateUser({ ...res.data, authorized: true, accessToken: res.headers.authorization })); + + navigate("/"); // Redirect after 1 second + + toast.success("Login Successful", { position: "top-center", autoClose: 5000, hideProgressBar: false, @@ -63,140 +190,157 @@ function LoginForm() { theme: "light", transition: Bounce, }); - }); - - } - - const handleFormLoginClick = () => { - - // Validation Starts - if (formData.email === "" || formData.password === "") { - return; - } - - // Validate Email Format - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(formData.email)) { - return; - } - // Validation Ends - - // Login API Call - axios.post(`${import.meta.env.VITE_BASE_URI}/api/auth/login`, - { cacheKey: cacheKey, password: formData.password }, - { - withCredentials: true, - headers: { - "ngrok-skip-browser-warning": "69420", - "Access-Control-Allow-Origin": "*" - } } - ) - .then((res) => { - if (res.status === 200) { - - toast.dismiss(); - // Cookies.set("authorization", res.headers.authorization, { - // path: "/", - // secure: true, // Required for HTTPS - // sameSite: "Lax", // Required for cross-origin requests - // }); + } catch (err) { + toast.dismiss(); - // dispatch(updateUser({ ...res.data, authorized: true, accessToken: res.headers.authorization })); - setTimeout(() => navigate('/'), 1000); // Redirect after 1 second - toast.success("Login Successful", { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: false, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); - } - }) - .catch((err) => { - if (err.status === 401) { - toast.dismiss(); - toast.error("Credentials Not Match", { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: false, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); - } else { - toast.dismiss(); - toast.error("Some Error Occurred", { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: false, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); - } - }); - } + if (err.response?.status === 400 || err.response?.status === 401) { + toast.error("Credentials Not Match", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } else { + toast.error("Some Error Occurred", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } + } finally { + setIsLoading(false); + } + }; + + + const handleGoogleLogin = () => { + // Your Google OAuth logic here + console.log("Google login clicked"); + }; return ( -
-

Login

- - -
{ - e.preventDefault(); - }}> - -
-
- setForm({ ...formData, email: e.target.value })} /> - -
- -
-
- - -
{ - e.preventDefault(); - handleFormLoginClick(); - }}> -
-
- setForm({ ...formData, password: e.target.value })} - /> - -
- - -
-
- -

or login with social platforms

- -
- +
+
+ WELCOME BACK 👋 +

Login to your Account

-
-

Create an Account. Register

+
+ +
+ +
+
+ or +
+
+ +
+
+ + + {errors.email && ( +

{errors.email}

+ )} +
+ + {/* {nextClick && ( */} +
+ +
+ + +
+ {errors.password && ( +

{errors.password}

+ )} + {/* */} +
+ {/* )} */} + + {/* {!nextClick ? ( + + ) : ( */} + + {/* )} */} + +
+ Create an Account?{" "} + +
- ) -} + ); +}; -export default LoginForm +export default LoginForm \ No newline at end of file diff --git a/src/components/auth/RegisterForm.tsx b/src/components/auth/RegisterForm.tsx index 6e02a69..67656c4 100644 --- a/src/components/auth/RegisterForm.tsx +++ b/src/components/auth/RegisterForm.tsx @@ -10,6 +10,8 @@ import { Bounce, toast } from "react-toastify"; import { updateUser, UserState } from "../../store/slices/userSlice"; import { useDispatch, useSelector } from "react-redux"; import { AppDispatch, RootState } from "../../store/store"; +import { BsEye } from "react-icons/bs"; +import { FiEyeOff } from "react-icons/fi"; // import api from "../../config/api"; interface FormDataState { @@ -21,158 +23,410 @@ interface FormDataState { } -function RegisterForm() { - const [formData, setForm] = useState({ email: "", password: "", confirmPassword: "", firstName: "", lastName: "" }); +const RegisterForm = ({ onSwitchToLogin }) => { + const [formData, setForm] = useState({ + email: "", + password: "", + confirmPassword: "", + firstName: "", + lastName: "" + }); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + const [errors, setErrors] = useState({ + firstName: "", + lastName: "", + email: "", + password: "", + confirmPassword: "" + }); + const [isLoading, setIsLoading] = useState(false); + const navigate = useNavigate() - const dispatch = useDispatch(); - const navigate = useNavigate(); + const validateFirstName = (name) => { + const trimmedName = name.trim(); - const handleFormRegisterClick = () => { - formData.firstName = formData.firstName.trim(); - formData.lastName = formData.lastName.trim(); - // Validation Starts - if (formData.email === "" || formData.password === "" || formData.confirmPassword === "" || formData.firstName === "" || formData.lastName === "") { - console.log('All Fields are Required'); - return; + if (!trimmedName) { + return "First name is required"; + } + + if (trimmedName.length < 2) { + return "First name must be at least 2 characters long"; + } + + if (trimmedName.length > 50) { + return "First name is too long"; + } + + const nameRegex = /^[a-zA-Z\s'-]+$/; + if (!nameRegex.test(trimmedName)) { + return "First name can only contain letters, spaces, hyphens, and apostrophes"; + } + + return ""; + }; + + const validateLastName = (name) => { + const trimmedName = name.trim(); + + if (!trimmedName) { + return "Last name is required"; + } + + if (trimmedName.length < 2) { + return "Last name must be at least 2 characters long"; + } + + if (trimmedName.length > 50) { + return "Last name is too long"; + } + + const nameRegex = /^[a-zA-Z\s'-]+$/; + if (!nameRegex.test(trimmedName)) { + return "Last name can only contain letters, spaces, hyphens, and apostrophes"; + } + + return ""; + }; + + const validateEmail = (email) => { + const trimmedEmail = email.trim(); + + if (!trimmedEmail) { + return "Email address is required"; + } + + if (trimmedEmail.length > 254) { + return "Email address is too long"; } - // Validate Email Format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(formData.email)) { - console.log("Invalid email format"); - return; + if (!emailRegex.test(trimmedEmail)) { + return "Please enter a valid email address"; } - // Validation Ends + return ""; + }; - // Register API Call - console.dir(formData); + const validatePassword = (password) => { + if (!password) { + return "Password is required"; + } - axios.post(`${import.meta.env.VITE_BASE_URI}/api/auth/signup`, { firstName: formData.firstName, lastName: formData.lastName, email: formData.email, password: formData.password }, { - withCredentials: true, - headers: { - "ngrok-skip-browser-warning": "69420", - "Access-Control-Allow-Origin": "*" + if (password.length < 8) { + return "Password must be at least 8 characters long"; + } + + if (password.length > 128) { + return "Password is too long"; + } + + const hasUpperCase = /[A-Z]/.test(password); + const hasLowerCase = /[a-z]/.test(password); + const hasNumbers = /\d/.test(password); + // const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password); + + // if (!hasUpperCase) { + // return "Password must contain at least one uppercase letter"; + // } + + // if (!hasLowerCase) { + // return "Password must contain at least one lowercase letter"; + // } + + // if (!hasNumbers) { + // return "Password must contain at least one number"; + // } + + // if (!hasSpecialChar) { + // return "Password must contain at least one special character"; + // } + + return ""; + }; + + const validateConfirmPassword = (confirmPassword, password) => { + if (!confirmPassword) { + return "Please confirm your password"; + } + + if (confirmPassword !== password) { + return "Passwords do not match"; + } + + return ""; + }; + + const handleInputChange = (field, value) => { + setForm({ ...formData, [field]: value }); + + // Clear error when user starts typing + if (errors[field]) { + setErrors({ ...errors, [field]: "" }); + } + + // If confirming password, also check if it matches + if (field === "password" && formData.confirmPassword && errors.confirmPassword) { + const confirmError = validateConfirmPassword(formData.confirmPassword, value); + if (!confirmError) { + setErrors({ ...errors, [field]: "", confirmPassword: "" }); } - }) - .then((res) => { - if (res.status === 201) { + } + }; - toast.dismiss(); - // dispatch(updateUser({ ...res.data, authorized: true, accessToken: res.headers.authorization })); - // dispatch(updateUser({ ...res.data, authorized: true })); - navigate('/') - } - }) - .catch((err) => { - if (err.status === 409) { - toast.dismiss(); - toast.error("User Already Exists", { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: false, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); - } else { - toast.dismiss(); - toast.error("Some Error Occurred", { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: false, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); - } - }); + const handleFormRegisterClick = async () => { + const firstNameError = validateFirstName(formData.firstName); + const lastNameError = validateLastName(formData.lastName); + const emailError = validateEmail(formData.email); + const passwordError = validatePassword(formData.password); + const confirmPasswordError = validateConfirmPassword(formData.confirmPassword, formData.password); + + const newErrors = { + firstName: firstNameError, + lastName: lastNameError, + email: emailError, + password: passwordError, + confirmPassword: confirmPasswordError, + }; + + setErrors(newErrors); + + // If any errors exist, stop + if (Object.values(newErrors).some((error) => error !== "")) { + return; + } + + setIsLoading(true); + + const trimmedData = { + firstName: formData.firstName.trim(), + lastName: formData.lastName.trim(), + email: formData.email.trim(), + password: formData.password, + confirmPassword: formData.confirmPassword, + }; + + try { + const res = await axios.post( + `${import.meta.env.VITE_BASE_URI}/api/auth/signup`, + { + firstName: trimmedData.firstName, + lastName: trimmedData.lastName, + email: trimmedData.email, + password: trimmedData.password, + }, + { + withCredentials: true, + headers: { + "ngrok-skip-browser-warning": "69420", + "Access-Control-Allow-Origin": "*", + }, + } + ); + + if (res.status === 201) { + toast.dismiss(); + // dispatch(updateUser({ ...res.data, authorized: true, accessToken: res.headers.authorization })); + // dispatch(updateUser({ ...res.data, authorized: true })); + navigate("/"); } + } catch (err: any) { + toast.dismiss(); + + if (err.response?.status === 409) { + toast.error("User Already Exists", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + theme: "light", + transition: Bounce, + }); + } else { + toast.error("Some Error Occurred", { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: false, + pauseOnHover: true, + draggable: true, + theme: "light", + transition: Bounce, + }); + } + } finally { + setIsLoading(false); + } +}; + + + const handleGoogleLogin = () => { + // Your Google OAuth logic here + console.log("Google signup clicked"); + }; return ( -
-
{ - e.preventDefault(); - handleFormRegisterClick(); - }}> -

Registration

- {/*
- - -
*/} -
-
- setForm({ ...formData, firstName: e.target.value })} - type="text" placeholder="First Name" pattern="^(?!\s*$).+" - required - title="Input cannot be empty or just spaces" - /> - -
+
+
+

Create an Account

+
-
- setForm({ ...formData, lastName: e.target.value })} - type="text" - placeholder="Last Name" - pattern="^(?!\s*$).+" - required - title="Input cannot be empty or just spaces" /> - +
+ +
+ +
+
+ or +
+
+ +
+
+ +
+
+ handleInputChange("firstName", e.target.value)} + placeholder="First name" + className={`w-full px-4 py-1.5 border rounded-lg focus:ring-2 focus:border-transparent outline-none ${errors.firstName + ? "border-red-500 focus:ring-red-500" + : "border-gray-300 focus:ring-blue-500" + }`} + disabled={isLoading} + /> + {errors.firstName && ( +

{errors.firstName}

+ )} +
+
+ handleInputChange("lastName", e.target.value)} + placeholder="Last name" + className={`w-full px-4 py-1.5 border rounded-lg focus:ring-2 focus:border-transparent outline-none ${errors.lastName + ? "border-red-500 focus:ring-red-500" + : "border-gray-300 focus:ring-blue-500" + }`} + disabled={isLoading} + /> + {errors.lastName && ( +

{errors.lastName}

+ )} +
-
+
+ setForm({ ...formData, email: e.target.value })} - type="email" placeholder="Email" required /> - -
-
- setForm({ ...formData, password: e.target.value })} - type="password" placeholder="Password" - pattern="^.{8,}$" - title="Password must be at least 8 digits" - required /> - -
-
- setForm({ ...formData, confirmPassword: e.target.value })} - type="password" - placeholder="Confirm Password" - style={{ - border: (formData.confirmPassword != "" && formData.password !== formData.confirmPassword) ? "1px solid red" : "none" - }} - required + type="email" + value={formData.email} + onChange={(e) => handleInputChange("email", e.target.value)} + placeholder="Enter your email" + className={`w-full px-4 py-1.5 border rounded-lg focus:ring-2 focus:border-transparent outline-none ${errors.email + ? "border-red-500 focus:ring-red-500" + : "border-gray-300 focus:ring-blue-500" + }`} + disabled={isLoading} /> - + {errors.email && ( +

{errors.email}

+ )}
- +
+ {errors.password && ( +

{errors.password}

+ )} +
+ +
+ +
+ handleInputChange("confirmPassword", e.target.value)} + placeholder="Confirm your password" + className={`w-full px-4 py-1.5 border rounded-lg focus:ring-2 focus:border-transparent outline-none pr-12 ${errors.confirmPassword + ? "border-red-500 focus:ring-red-500" + : "border-gray-300 focus:ring-blue-500" + }`} + disabled={isLoading} + /> + +
+ {errors.confirmPassword && ( +

{errors.confirmPassword}

+ )} +
+ + -

or register with social platforms

-
- +
+ Already have an Account?{" "} +
- - -
-

Already! have an Account. Login

- ) -} + ); +}; export default RegisterForm diff --git a/src/components/auth/UsertAuthUI.tsx b/src/components/auth/UsertAuthUI.tsx index 12693ff..44224dc 100644 --- a/src/components/auth/UsertAuthUI.tsx +++ b/src/components/auth/UsertAuthUI.tsx @@ -1,87 +1,82 @@ -import { useEffect, useLayoutEffect, useRef } from "react"; - -import "../styles/style.css" -import { useNavigate } from "react-router-dom"; +import { useEffect, useState } from "react"; +import "../styles/style.css"; +import { useNavigate, useLocation } from "react-router-dom"; import LoginForm from "./LoginForm"; import RegisterForm from "./RegisterForm"; import { useDispatch } from "react-redux"; import { AppDispatch } from "../../store/store"; import { fetchUserDetails } from "../../store/slices/userSlice"; +import LoginRegisterImg from "../../assets/illustration_1_.png"; +import SMELogo from "../../assets/SMELogo.png"; -function UserAuthUI({ pg }: { pg: string }) { +function UserAuthUI() { + const [isLogin, setIsLogin] = useState(true); const navigate = useNavigate(); + const location = useLocation(); // Hook to get the current URL path - useLayoutEffect(() => { - dispatch(fetchUserDetails()); - }, []); - - const dispatch = useDispatch(); - const elementRef = useRef(null); - + // Sync isLogin state with the current route useEffect(() => { - if (pg === 'login') { - elementRef.current?.classList.add('active') - setTimeout(() => { - elementRef.current?.classList.remove('active') - }, 0) - } else { - setTimeout(() => { - elementRef.current?.classList.add('active') - }, 0) + const path = location.pathname; + if (path === "/login") { + setIsLogin(true); + } else if (path === "/register") { + setIsLogin(false); } - }, []) + }, [location.pathname]); - // const [activeToggle, setActiveToggle] = useState(''); + const handleLogin = (loginData) => { + console.log("Login data:", loginData); + // Your login API call logic here + }; - // const [page, setPage] = useState(pg || 'login'); - function handleToggleForm(val: string) { - navigate(`/${val}`); - // setPage((prev) => prev === "login" ? "register" : "login") - } - - // const user: UserState = useSelector((state: RootState) => state.user); - - // useEffect(() => { - // if (page === 'register') { - // setActiveToggle('active') - // } else { - // setActiveToggle('') - // } - // }, [page]) - - // useEffect(() => { - // setPage(pg); - // }, [pg]) + const handleRegister = (registerData) => { + console.log("Register data:", registerData); + // Your register API call logic here + }; return ( - <> -
-
-
- +
+ {/* Left Side - Branding */} +
+
+ {/* Logos */} +
+ SME Logo + Illustration
-
- -
- -
-
-

Sign Made Easy

-

Don't have an account?

- -
- -
-

Welcome Back!

-

Already have an account?

- -
+ {/* Text Section */} +
+

Create, eSign, and Connect!

+

+ A Powerful eSign solution for Salesforce, powered by Adobe Advanced + Trust List (AATL), to elevate your digital signature experience and + foster agreements closures. +

- - ) + + {/* Right Side - Form */} +
+ {isLogin ? ( + navigate("/register")} // Navigate to /register + /> + ) : ( + navigate("/login")} // Navigate to /login + /> + )} +
+
+ ); } -export default UserAuthUI +export default UserAuthUI; \ No newline at end of file diff --git a/src/components/login/Login.tsx b/src/components/login/Login.tsx index ddf7096..3ab73e6 100644 --- a/src/components/login/Login.tsx +++ b/src/components/login/Login.tsx @@ -3,7 +3,7 @@ import UserAuthUI from "../auth/UsertAuthUI" function Login() { return ( <> -
+
diff --git a/src/components/process/processStepOne/SelectedDocuments.tsx b/src/components/process/processStepOne/SelectedDocuments.tsx index b78a6ea..b479bb1 100644 --- a/src/components/process/processStepOne/SelectedDocuments.tsx +++ b/src/components/process/processStepOne/SelectedDocuments.tsx @@ -14,16 +14,17 @@ import { useParams } from 'react-router-dom'; import { toggleToTemplates, TRANSACTION_TEMPLATE_TOGGLE } from '../../../store/slices/selectedRecipientsSlice'; -const SelectedDocuments = ({transactionTemplateToggle}) => { +const SelectedDocuments = ({ transactionTemplateToggle }) => { // let transactionTemplateToggle = TRANSACTION_TEMPLATE_TOGGLE.TRANSACTIONS; // const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); // await sleep(5000); const documents = useSelector((state: RootState) => state.documents.documents); + const docCount = documents.length; useEffect(() => { - + console.log("Documents updated:", documents); }, [documents]); @@ -50,7 +51,7 @@ const SelectedDocuments = ({transactionTemplateToggle}) => { { name: 'Dropbox', icon: }, ]; - const handleUpload = (filesToUpload: File[]) => { + const handleUpload = (filesToUpload: File[]) => { const formData = new FormData(); filesToUpload.forEach(file => { @@ -87,39 +88,110 @@ const SelectedDocuments = ({transactionTemplateToggle}) => { } }; + // Get proper Tailwind class names for upload card span + const getUploadCardSpanClass = () => { + switch (docCount) { + case 0: return 'col-span-5'; // Full width when no docs + case 1: return 'col-span-4'; // 4 cols for upload, 1 for doc + case 2: return 'col-span-3'; // 3 cols for upload, 2 for docs + case 3: return 'col-span-2'; // 2 cols for upload, 3 for docs + case 4: return 'col-span-1'; // 1 col for upload, 4 for docs + default: return 'col-span-1'; // 1 col for upload, rest for docs + } + }; + + // Calculate how many documents should be in the first row + const getFirstRowDocCount = () => { + if (docCount === 0) return 0; + if (docCount <= 4) return docCount; // All docs fit in first row + return 4; // Max 4 docs in first row when upload card takes 1 column + }; + + const firstRowDocCount = getFirstRowDocCount(); + const remainingDocs = Math.max(0, docCount - firstRowDocCount); + return ( <> {/* Upload Card First */} -
- {/* Uploaded documents */} +
+
+ {/* Upload Document Card - Always First */}
setModalOpen(true)} - className="cursor-pointer w-[160px] h-[170px] flex flex-col items-center justify-center border-2 border-dashed border-gray-300 rounded-xl bg-white hover:bg-gray-50 transition shadow-sm hover:shadow-md" + className={`${getUploadCardSpanClass()} cursor-pointer h-[170px] flex flex-col items-center justify-center border-2 border-dashed border-gray-300 rounded-xl bg-white hover:bg-gray-50 transition shadow-sm hover:shadow-md`} >

Upload Document

- {/* Document Show */} + {/* First Row Documents */} ({ ...doc }))} - setList={(newState) => dispatch(setDocuments(newState))} + className="contents" // Use 'contents' to make children participate in parent grid + list={documents.slice(0, firstRowDocCount).map(doc => ({ ...doc }))} + setList={(newState) => { + const updatedDocs = [ + ...newState, + ...documents.slice(firstRowDocCount) + ]; + dispatch(setDocuments(updatedDocs)); + }} handle=".drag-handle" animation={200} ghostClass="sortable-ghost" disabled={false} > - {documents.map((doc) => ( - + {documents.slice(0, firstRowDocCount).map((doc) => ( +
+ +
))}
- -
+ {/* Additional Rows - Remaining Documents (5th, 6th, 7th, etc.) */} + {remainingDocs > 0 && ( + ({ ...doc }))} + setList={(newState) => { + const updatedDocs = [ + ...documents.slice(0, firstRowDocCount), + ...newState + ]; + dispatch(setDocuments(updatedDocs)); + }} + handle=".drag-handle" + animation={200} + ghostClass="sortable-ghost" + disabled={false} + > + {documents.slice(firstRowDocCount).map((doc) => ( +
+ +
+ ))} +
+ )} + + {/* Modal */} {isModalOpen && (
@@ -181,6 +253,10 @@ const SelectedDocuments = ({transactionTemplateToggle}) => {
)} + +
+ + ); }; diff --git a/src/components/register/Register.tsx b/src/components/register/Register.tsx index adb8365..fe9ae53 100644 --- a/src/components/register/Register.tsx +++ b/src/components/register/Register.tsx @@ -3,7 +3,7 @@ import UserAuthUI from "../auth/UsertAuthUI" function Register() { return ( <> -
+
diff --git a/src/components/styles/style.css b/src/components/styles/style.css index 21f3e0e..310944f 100644 --- a/src/components/styles/style.css +++ b/src/components/styles/style.css @@ -30,13 +30,13 @@ html { .auth-ui-con .container-l { position: relative; - width: 850px; - height: 550px; + width: 1280px; + height: 599px; background: #fff; /* margin-top: 20px; */ margin-left: 50%; transform: translateX(-50%); - border-radius: 30px; + /* border-radius: 30px; */ box-shadow: 0 0 30px rgba(0, 0, 0, .2); overflow-y: auto; overflow-x: hidden;