LostInsurance.tsx 3.4 KB

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