addProductToCartAction.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. const responseCartId = responseData.id;
  36. const responseCartToken = responseData.cartToken;
  37. if(!accessToken && responseCartId !== responseCartToken) {
  38. await setGuestCookie({
  39. guestCartId: responseCartId,
  40. guestToken: responseCartToken,
  41. isGuest: true
  42. });
  43. }
  44. /** 兜底代码 end*/
  45. return {
  46. success: true,
  47. msg: '',
  48. cartData: response.data
  49. }
  50. } else {
  51. return {
  52. success: false,
  53. msg: response.error.message,
  54. cartData: null
  55. }
  56. }
  57. } catch(error) {
  58. return {
  59. success: false,
  60. msg: error instanceof Error ? error.message : 'Add product to cart failed!',
  61. cartData: null
  62. }
  63. }
  64. };