Email.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. "use client";
  2. import { useForm } from "react-hook-form";
  3. import { useRouter } from "next/navigation";
  4. import { useState } from "react";
  5. import { EMAIL, getLocalStorage, setLocalStorage } from "@/store/local-storage";
  6. import Link from "next/link";
  7. import InputText from "@components/common/form/Input";
  8. import { ProceedToCheckout } from "./ProceedToCheckout";
  9. import { delay } from "@utils/helper";
  10. import { EmailFormProps, EmailFormValues } from "../type";
  11. import { EMAIL_REGEX } from "@utils/constants";
  12. const Email = () => {
  13. const email = getLocalStorage(EMAIL);
  14. const [isOpen, setIsOpen] = useState(false);
  15. const router = useRouter();
  16. const isGuest = true;
  17. const {
  18. register,
  19. handleSubmit,
  20. formState: { errors, isSubmitting },
  21. } = useForm<EmailFormValues>({
  22. defaultValues: { email },
  23. });
  24. const onSubmit = async (data: EmailFormValues) => {
  25. setLocalStorage(EMAIL, data?.email);
  26. await delay(200);
  27. router.push("/checkout?step=address");
  28. };
  29. return (
  30. <>
  31. {email === "" || typeof email === "object" ? (
  32. <form className="mt-5" onSubmit={handleSubmit(onSubmit)}>
  33. <EmailForm
  34. register={register}
  35. errors={errors}
  36. isSubmitting={isSubmitting}
  37. isGuest={isGuest}
  38. />
  39. </form>
  40. ) : isOpen ? (
  41. <form className="mt-5" onSubmit={handleSubmit(onSubmit)}>
  42. <EmailForm
  43. register={register}
  44. errors={errors}
  45. isSubmitting={isSubmitting}
  46. isGuest={isGuest}
  47. />
  48. </form>
  49. ) : (
  50. <>
  51. <div className="mt-4 flex gap-2 justify-between hidden sm:flex">
  52. <div className="flex">
  53. <p className="w-auto text-base font-normal text-black/60 dark:text-white/60 sm:w-[180px]">
  54. Email Address
  55. </p>
  56. <p className="font-normal block text-base text-black/60 dark:text-white/60">{email}</p>
  57. </div>
  58. <div>
  59. <button
  60. onClick={() => setIsOpen(!isOpen)}
  61. className="cursor-pointer text-base font-normal text-black/[60%] underline dark:text-neutral-300"
  62. >
  63. Change
  64. </button>
  65. </div>
  66. </div>
  67. <div className=" relative mt-4 flex sm:hidden flex-col justify-end gap-y-2 sm:flex-row sm:justify-between sm:gap-y-0">
  68. <div className="flex justify-between flex-1 flex-wrap">
  69. <p className="w-auto text-base font-normal text-black/60 dark:text-white/60 sm:w-[192px]">
  70. Email Address
  71. </p>
  72. <p className="font-normal block text-base text-black/60 dark:text-white/60">{email}</p>
  73. </div>
  74. <button
  75. onClick={() => setIsOpen(!isOpen)}
  76. className="cursor-pointer absolute right-0 text-base font-normal text-black/[60%] underline dark:text-neutral-300"
  77. style={{ top: "-36px" }}
  78. >
  79. Change
  80. </button>
  81. </div>
  82. </>
  83. )}
  84. </>
  85. );
  86. };
  87. export default Email;
  88. function EmailForm({
  89. register,
  90. errors,
  91. isSubmitting,
  92. isGuest,
  93. }: EmailFormProps) {
  94. return (
  95. <div>
  96. <InputText
  97. className="max-w-full"
  98. id="email"
  99. size="md"
  100. {...register("email", {
  101. required: "Email is required",
  102. pattern: {
  103. value: EMAIL_REGEX,
  104. message: "Please enter a valid email address",
  105. }
  106. })}
  107. errorMsg={errors?.email?.message as string}
  108. label="Enter Email *"
  109. placeholder="example@gmail.com"
  110. readOnly={!isGuest}
  111. />
  112. {isGuest && (
  113. <p className="mb-4 mt-6 font-outfit text-base font-normal text-black/[60%] dark:text-neutral-300">
  114. Already have an account? No worries, just{" "}
  115. <br className="block sm:hidden" />
  116. <Link
  117. aria-label="Go to Login Page"
  118. className="text-base font-normal text-primary"
  119. href="/customer/login"
  120. >
  121. log in.
  122. </Link>
  123. </p>
  124. )}
  125. <div className="mt-6 justify-self-end">
  126. <ProceedToCheckout buttonName="Next" pending={isSubmitting} />
  127. </div>
  128. </div>
  129. );
  130. }