OpenAddToCartModalButton.tsx 2.2 KB

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