useCheckoutAddress.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. "use client";
  2. import { GET_CHECKOUT_ADDRESSES, CREATE_CHECKOUT_ADDRESS } from "@/graphql";
  3. import {useApolloClient} from "@apollo/client/react";
  4. import {
  5. CheckoutAddressNode,
  6. ShipAddressFormData,
  7. BillAddressFormData,
  8. CreateCheckoutAddressVariables
  9. } from "@/types/checkout/type";
  10. import {normalizePhoneForForm} from "@/utils/phoneNumberTools";
  11. /**
  12. * 对比shipping address与billing address的数据是否完全相同
  13. */
  14. export function addressIsSame(billAddress: BillAddressFormData | null, shipAddress: ShipAddressFormData | null) {
  15. if(billAddress === null && shipAddress === null) {
  16. return true;
  17. } else if(billAddress !== null && shipAddress !== null) {
  18. return (
  19. billAddress.billingEmail === shipAddress.shippingEmail &&
  20. billAddress.billingFirstName === shipAddress.shippingFirstName &&
  21. billAddress.billingLastName === shipAddress.shippingLastName &&
  22. billAddress.billingCompanyName === shipAddress.shippingCompanyName &&
  23. billAddress.billingAddress === shipAddress.shippingAddress &&
  24. billAddress.billingCity === shipAddress.shippingCity &&
  25. billAddress.billingState === shipAddress.shippingState &&
  26. billAddress.billingCountry === shipAddress.shippingCountry &&
  27. billAddress.billingPostcode === shipAddress.shippingPostcode &&
  28. billAddress.billingPhoneNumber === shipAddress.shippingPhoneNumber
  29. );
  30. } else {
  31. return false;
  32. }
  33. }
  34. export function useCheckoutAddress(loginEmail: string) {
  35. const apolloClient = useApolloClient();
  36. const getCheckoutAddress = () => {
  37. return apolloClient.query({
  38. query: GET_CHECKOUT_ADDRESSES,
  39. fetchPolicy: "no-cache",
  40. context: {
  41. fetchOptions: {
  42. cache: 'no-store',
  43. },
  44. }
  45. }).then((res) => {
  46. const address = res.data?.collectionGetCheckoutAddresses?.edges?.map(
  47. (edge: { node: CheckoutAddressNode }) => edge.node
  48. ) || [];
  49. const billAddress = address.find((a: CheckoutAddressNode) => a?.addressType === "cart_billing") || null;
  50. const shipAddress = address.find((a: CheckoutAddressNode) => a?.addressType === "cart_shipping") || null;
  51. const shipCountry = shipAddress?.country || "US";
  52. const billCountry = billAddress?.country || "US";
  53. const defaultBillAddress: BillAddressFormData = {
  54. billingAddressId: billAddress?._id || "",
  55. billingEmail: billAddress?.email ?? loginEmail ?? "",
  56. billingFirstName: billAddress?.firstName || "",
  57. billingLastName: billAddress?.lastName || "",
  58. billingCompanyName: billAddress?.companyName || "",
  59. billingAddress: billAddress?.address || "",
  60. billingCountry: billCountry,
  61. billingState: billAddress?.state || "",
  62. billingCity: billAddress?.city || "",
  63. billingPostcode: billAddress?.postcode || "",
  64. billingPhoneNumber: normalizePhoneForForm(billAddress?.phone, billCountry) || "",
  65. billingSameAsShipping: true, // 这个字段前端维护,不传给后端(bagisto是以billing address为准,但是运营要以shipping address为准,所以前端自己维护billing address与shipping address 同步)
  66. };
  67. const defaultShipAddress: ShipAddressFormData = {
  68. shippingAddressId: shipAddress?._id || "",
  69. shippingEmail: shipAddress?.email ?? loginEmail ?? "",
  70. shippingFirstName: shipAddress?.firstName || "",
  71. shippingLastName: shipAddress?.lastName || "",
  72. shippingCompanyName: shipAddress?.companyName || "",
  73. shippingAddress: shipAddress?.address || "",
  74. shippingCountry: shipCountry,
  75. shippingState: shipAddress?.state || "",
  76. shippingCity: shipAddress?.city || "",
  77. shippingPostcode: shipAddress?.postcode || "",
  78. shippingPhoneNumber: normalizePhoneForForm(shipAddress?.phone, shipCountry) || "",
  79. };
  80. const billSameAsShip = addressIsSame(defaultBillAddress, defaultShipAddress);
  81. defaultBillAddress.billingSameAsShipping = billSameAsShip;
  82. console.log('GET_CHECKOUT_ADDRESSES res ---- ',defaultShipAddress,defaultBillAddress);
  83. return {
  84. shippingAddress: defaultShipAddress,
  85. billingAddress: defaultBillAddress
  86. }
  87. }).catch((err) => {
  88. console.error('GET_CHECKOUT_ADDRESSES error ---- ',err);
  89. return null;
  90. });
  91. };
  92. const saveCheckoutAddress = (saveAddressParam: CreateCheckoutAddressVariables) => {
  93. return apolloClient.mutate({
  94. mutation: CREATE_CHECKOUT_ADDRESS,
  95. variables:saveAddressParam,
  96. }).then((res) => {
  97. const resData = res.data?.createCheckoutAddress.checkoutAddress ?? null;
  98. const result = {
  99. error: false,
  100. msg: '',
  101. data: resData
  102. };
  103. return result;
  104. }).catch((err) => {
  105. const result = {
  106. error: true,
  107. msg: err.message,
  108. data: null,
  109. };
  110. return result;
  111. });
  112. }
  113. return {
  114. getCheckoutAddress,
  115. saveCheckoutAddress,
  116. };
  117. }