OpenAddToCartModalButton.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use client";
  2. import { FC, ReactNode } from "react";
  3. import { useAppDispatch } from "@/store/hooks";
  4. import { openAddToCartDialog } from '@/store/slices/addToCartDialogSlice';
  5. import { GET_PRODUCT_BY_URL_KEY } from "@/graphql";
  6. import { useLazyQuery } from '@apollo/client/react';
  7. import { SingleProductResponse } from "@/components/catalog/type";
  8. import { LoadingSpinner } from "@components/common/LoadingSpinner";
  9. import ShoppingCartIcon from "@components/common/icons/ShoppingCartIcon";
  10. import { useCustomToast } from "@utils/hooks/useToast";
  11. interface OpenAddToCartModalButtonProps {
  12. productUrlKey: string;
  13. icon?: ReactNode;
  14. }
  15. export const OpenAddToCartModalButton: FC<OpenAddToCartModalButtonProps> = ({
  16. productUrlKey,
  17. icon,
  18. }) => {
  19. const dispatch = useAppDispatch();
  20. // const [loading, setLoading] = useState(false);
  21. const { showToast } = useCustomToast();
  22. const [getContent, { loading }] = useLazyQuery<SingleProductResponse>(GET_PRODUCT_BY_URL_KEY,{
  23. fetchPolicy: 'network-only'
  24. });
  25. const openDialog = async () => {
  26. if( loading) return;
  27. try {
  28. const result = await getContent({
  29. variables: { urlKey: productUrlKey }
  30. });
  31. console.log('product ----- ', result);// 返回的数据中有__typename,如何过滤 @todo
  32. const productData = result?.data?.product;
  33. if(result.error) {
  34. showToast(result.error.message, "danger");
  35. } else {
  36. if(productData) {
  37. dispatch(openAddToCartDialog(productData));
  38. } else {
  39. //提示产品数据为空
  40. showToast('Product data is null', "danger");
  41. }
  42. }
  43. } catch (error) {
  44. console.log('error ----- ', error);
  45. let errorMessage = "Network Error";
  46. if (error instanceof Error) {
  47. errorMessage = error.message;
  48. } else if (typeof error === 'object' && error !== null && 'message' in error) {
  49. errorMessage = String((error as any).message);
  50. }
  51. showToast(errorMessage, "danger");
  52. }
  53. }
  54. return (
  55. <button onClick={openDialog} disabled={loading}>
  56. { loading ? <LoadingSpinner colorClassName={"text-ly-green"} /> : <ShoppingCartIcon icon={icon} />}
  57. </button>
  58. );
  59. };