addProductToCartAction.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use server";
  2. import {cookies} from "next/headers";
  3. import { GUEST_CART_TOKEN } from "@/utils/constants";
  4. import { CREATE_ADD_PRODUCT_IN_CART } from "@/graphql";
  5. import { auth } from "@/utils/auth/auth-helper";
  6. import { serverGraphqlFetch } from "@utils/bagisto";
  7. import {createGuestCartToken,setGuestCookie} from "@/server-service/guestCartTokenService";
  8. import { AddToCartData,AddToCartVariables } from "@/types/cart/type";
  9. export async function addProductToCartAction(param:AddToCartVariables) {
  10. const authSession = await auth();
  11. const accessToken = authSession?.user?.accessToken;
  12. const cookieStore = await cookies();
  13. const guestCartToken = cookieStore.get(GUEST_CART_TOKEN)?.value;
  14. if(!accessToken && !guestCartToken) {
  15. const createRes = await createGuestCartToken();
  16. if(!createRes.success) {
  17. return {
  18. success: false,
  19. msg: createRes.msg,
  20. cartData: null
  21. }
  22. }
  23. }
  24. try{
  25. const response = await serverGraphqlFetch<AddToCartData,AddToCartVariables>({
  26. query: CREATE_ADD_PRODUCT_IN_CART,
  27. variables: param,
  28. cache: "no-store",
  29. });
  30. if(!response.error) {
  31. const responseData = response.data?.createAddProductInCart?.addProductInCart;
  32. /** 兜底代码 start*/
  33. // 游客加购,然后清空购物车,然后刷新页面,然后再加购,然后再刷新页面,购物车会失效,所以添加兜底代码
  34. // 如果之前的cartToken有效,responseCartId和responseCartToken的值是一样的都是cart id; 否则两者不相等
  35. if(responseData) {
  36. const responseCartId = responseData.id;
  37. const responseCartToken = responseData.cartToken;
  38. if(!accessToken && responseCartId !== responseCartToken) {
  39. await setGuestCookie({
  40. guestCartId: responseCartId,
  41. guestToken: responseCartToken,
  42. isGuest: true
  43. });
  44. }
  45. }
  46. /** 兜底代码 end*/
  47. return {
  48. success: true,
  49. msg: '',
  50. cartData: response.data
  51. }
  52. } else {
  53. return {
  54. success: false,
  55. msg: response.error.message,
  56. cartData: null
  57. }
  58. }
  59. } catch(error) {
  60. return {
  61. success: false,
  62. msg: error instanceof Error ? error.message : 'Add product to cart failed!',
  63. cartData: null
  64. }
  65. }
  66. };