LostInsurance.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. "use client";
  2. import { useCustomToast } from "@/utils/hooks/useToast";
  3. import {useSaveCheckoutCart} from "@/utils/hooks/useSaveCheckoutCart";
  4. import { formatCartDetail } from "@/utils/cartDetailTools";
  5. import { overlayLoading } from "@/components/theme/ui/kernel/loading/api";
  6. import type {CartDetail} from "@/types/cart/type";
  7. /**
  8. * 先通过 shippingInsuranceEnabled 判断网站是否开通丢件险功能
  9. * 再通过 useShippingInsurance 判断用户是否勾选丢件险
  10. */
  11. export default function LostInsurance({
  12. cartData,
  13. onSwitchInsurance
  14. }: {
  15. cartData: CartDetail
  16. onSwitchInsurance: (payload:CartDetail) => void;
  17. }) {
  18. const { showToast } = useCustomToast();
  19. const {saveCheckoutCart} = useSaveCheckoutCart();
  20. const clickSwitchButton = async (bool: boolean) => {
  21. const isInsurance = bool ? '1' : '';
  22. await setInsurance(isInsurance);
  23. };
  24. const setInsurance = async (insurance: string) => {
  25. overlayLoading.start();
  26. const saveRes = await saveCheckoutCart({
  27. useShippingInsurance: insurance
  28. });
  29. overlayLoading.stop();
  30. if(!saveRes.error) {
  31. if(saveRes.data) {
  32. const newCartDetail = formatCartDetail(saveRes.data);
  33. onSwitchInsurance(newCartDetail);
  34. }
  35. return true;
  36. } else {
  37. showToast(saveRes.msg, 'danger');
  38. return false;
  39. }
  40. };
  41. let title = "";
  42. if(cartData.shippingInsuranceType === "percentage") {
  43. title = `${cartData.shippingInsuranceValue}% Package Insurance`;
  44. } else if(cartData.shippingInsuranceType === "fixed") {
  45. //title = `${currencySymbol}${cartData.shippingInsuranceAmount} Package Insurance`;
  46. title = `Fixed $${cartData.shippingInsuranceValue} Package Insurance`;
  47. }
  48. return (<>
  49. <div className="relative box-border w-full bg-[#ECF7F4] px-4 py-3">
  50. <div className="flex justify-between items-center">
  51. <span className="text-ly-14">
  52. {title}
  53. </span>
  54. <span className="text-ly-14">
  55. {cartData.formattedShippingInsuranceAmount}
  56. </span>
  57. </div>
  58. <div className="flex items-center justify-between mt-3">
  59. <div className="text-ly-12 text-ly-placeholder">
  60. Increased compensation for courier packages issued within 30 days.
  61. </div>
  62. <div className="flex justify-between items-center">
  63. <label className="group relative w-9 h-5.5 flex-none">
  64. <input className="absolute w-full h-full top-0 left-0 opacity-0 z-10"
  65. type="checkbox" checked={cartData.useShippingInsurance}
  66. onChange={(e) => clickSwitchButton(e.target.checked)}
  67. />
  68. <span className="transition-all box-border block px-0.5 w-full h-full rounded-full flex items-center bg-[#c2c2c2] group-has-[:checked]:bg-[#363636]">
  69. <span className="transition-all block w-4.5 h-4.5 rounded-full bg-white group-has-[:checked]:ml-3.5"></span>
  70. </span>
  71. </label>
  72. </div>
  73. </div>
  74. </div>
  75. </>);
  76. }