diff --git a/app/components/product/ProductDetailView.tsx b/app/components/product/ProductDetailView.tsx index 25fa53c..b2fbf04 100644 --- a/app/components/product/ProductDetailView.tsx +++ b/app/components/product/ProductDetailView.tsx @@ -11,12 +11,37 @@ import { BottomBar, } from "./index"; import { ProductDetail as ProductDetailType } from "../../../src/api/types"; -import { Eye, EyeOff } from "lucide-react"; +import { + Eye, + EyeOff, + Heart, + Sparkles, + Star, + ShoppingCart, + Truck, + RotateCcw, + ShieldCheck, + MessageCircle, +} from "lucide-react"; import { Button } from "../ui/button"; import { useNavigate, Link } from "@remix-run/react"; import { useSimilarProductsInfinite } from "~/requestHandler/use-product-hooks"; import MondrianProductList from "../MondrianProductList"; import SellerLogo from "../SellerLogo"; +import { + useServiceGetProductRating, + useServiceGetComments, + useServiceCheckBookmark, + useServiceBookmarkProduct, + useServiceDeleteBookmark, +} from "~/utils/RequestHandler"; +import { useAddToCart } from "~/requestHandler/use-cart-hooks"; +import { useCreateChatThread } from "~/requestHandler/use-chat-hooks"; +import { findVariantId, formatPrice } from "~/utils/helpers"; +import { useToast } from "~/hooks/use-toast"; +import { useRootData } from "~/hooks/use-root-data"; +import { LoginRequiredDialog } from "../LoginRequiredDialog"; +import AIPromoteModal from "../AIPromoteModal"; interface ProductDetailViewProps { product: ProductDetailType; @@ -194,6 +219,83 @@ export const ProductDetailView = memo(function ProductDetailView({ ]); const navigate = useNavigate(); + + // --- Desktop buy/actions state & data (overlays + info column) --- + const { user } = useRootData(); + const { toast } = useToast(); + const [qty, setQty] = useState(1); + const [isAIOpen, setIsAIOpen] = useState(false); + const [isLoginOpen, setIsLoginOpen] = useState(false); + + const { data: ratingData } = useServiceGetProductRating(product.id || ""); + const { data: commentsData } = useServiceGetComments(1, product.id || ""); + const { data: bookmarkData } = useServiceCheckBookmark(product.id || ""); + const { mutate: bookmarkProduct } = useServiceBookmarkProduct(); + const { mutate: deleteBookmark } = useServiceDeleteBookmark(); + const addToCartMutation = useAddToCart(); + const { mutate: createChatThread } = useCreateChatThread(); + + const isBookmarked = bookmarkData?.bookmarked === true; + const avgRating = ratingData?.averageRating || 0; + const reviewCount = commentsData?.count || 0; + const isOutOfStock = currentStock === null || currentStock <= 0; + + const selectedColorValue = + inStockColors.find( + (color) => + (color.info as unknown as { detail: string })?.detail === selectedColor + )?.value || null; + + const handleToggleBookmark = () => { + if (!user?.access_token) { + setIsLoginOpen(true); + return; + } + if (isBookmarked) deleteBookmark(product.id || ""); + else bookmarkProduct(product.id || ""); + }; + + const handleDesktopAddToCart = async () => { + if (!user?.access_token) { + setIsLoginOpen(true); + return; + } + if (isOutOfStock) return; + const variantId = findVariantId(product, selectedColorValue, selectedSize); + if (!variantId) { + toast({ + title: "خطا", + description: "محصول با ویژگیهای انتخابی شما یافت نشد", + variant: "destructive", + }); + return; + } + try { + await addToCartMutation.mutateAsync({ variantId, quantity: qty }); + toast({ + title: "سبد خرید", + description: "محصول با موفقیت به سبد خرید اضافه شد", + }); + } catch (e) { + toast({ + title: "خطا", + description: "افزودن به سبد خرید با مشکل مواجه شد", + variant: "destructive", + }); + } + }; + + const handleChat = () => { + if (!user?.access_token) { + setIsLoginOpen(true); + return; + } + if (!product.seller?.id) return; + createChatThread(product.seller.id, { + onSuccess: (t) => navigate(`/profile/threads/${t.id}`), + }); + }; + return (