ProceedToCheckout.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. "use client";
  2. import LoadingDots from "@components/common/icons/LoadingDots";
  3. import clsx from "clsx";
  4. function SubmitButton({
  5. availableForSale,
  6. buttonName,
  7. className,
  8. pending,
  9. }: {
  10. availableForSale: boolean;
  11. buttonName: string;
  12. className?: string;
  13. pending: boolean;
  14. }) {
  15. const buttonClasses =
  16. "relative text-base w-fit cursor-pointer rounded-full px-8 py-3 font-bold border-white items-center justify-center bg-blue-600 tracking-wide text-white";
  17. const disabledClasses = "cursor-wait opacity-60 hover:opacity-60";
  18. if (!availableForSale) {
  19. return (
  20. <button
  21. type="button"
  22. aria-disabled
  23. disabled
  24. className={clsx(buttonClasses, disabledClasses)}
  25. >
  26. Processing...
  27. </button>
  28. );
  29. }
  30. return (
  31. <button
  32. type="submit"
  33. disabled={pending}
  34. aria-disabled={pending}
  35. aria-label="Proceed to checkout"
  36. className={clsx(
  37. buttonClasses,
  38. {
  39. "hover:opacity-90": !pending,
  40. [disabledClasses]: pending,
  41. },
  42. className,
  43. )}
  44. >
  45. <div className="absolute left-0 ml-4">
  46. {pending && <LoadingDots className="mb-3 bg-white" />}
  47. </div>
  48. {buttonName}
  49. </button>
  50. );
  51. }
  52. export function ProceedToCheckout({
  53. buttonName,
  54. className,
  55. pending = false,
  56. }: {
  57. buttonName: string;
  58. className?: string;
  59. pending: boolean;
  60. }) {
  61. return (
  62. <SubmitButton
  63. availableForSale={!pending}
  64. buttonName={buttonName}
  65. className={className}
  66. pending={pending}
  67. />
  68. );
  69. }