Vitron-Front/app/components/product/ProductDescription.tsx
fazli 56fcce35c8 feat(product-detail): ProductDescription section + strict discount guard + category types
- app/components/product/ProductDescription.tsx: new below-fold section
  with a "توضیحات محصول" heading, whitespace-pre-line so multi-line seller
  copy (Instagram scrapes, victorwear WooCommerce imports) renders with
  its bullet-list line breaks preserved. Renders on both mobile and
  desktop; nothing shown when the product has no description.
- app/components/product/ProductInfo.tsx: removed the collapsed
  single-<p> mobile description; the new section replaces it.
- app/components/product/ProductDetailView.tsx: pricingOf now hides the
  discount when discount_price >= price (was only hiding when equal),
  so a stale row where the discount price accidentally matches or
  exceeds the base can never render as a fake promo. Mounts
  ProductDescription just above the mobile Contact button and reviews.
- app/components/product/index.ts: export ProductDescription.
- src/api/types/models/index.ts: ProductCategory now carries readonly
  parentId / parentName so the two-step category picker can build the
  parent→sub tree from a flat category list without an extra fetch.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-18 13:19:27 +00:00

34 lines
1.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { AlignRight } from "lucide-react";
interface ProductDescriptionProps {
description?: string | null;
}
/**
* Full product description block. Preserves the seller's line breaks (bullet
* lists from Instagram/WooCommerce imports come in as `\n`-separated lines),
* with a proper heading so it reads as its own section on the detail page.
*
* Renders nothing when no description is set — the section header shouldn't
* appear on products the seller hasn't filled out yet.
*/
export function ProductDescription({ description }: ProductDescriptionProps) {
const body = (description || "").trim();
if (!body) return null;
return (
<section className="w-full px-4 lg:px-0 my-6">
<div className="flex items-center gap-2 mb-3">
<AlignRight size={18} className="text-BLACK" />
<h2 className="text-B16 lg:text-B20 font-bold">توضیحات محصول</h2>
</div>
<div
className="text-R14 lg:text-[15px] leading-8 text-BLACK2 whitespace-pre-line"
dir="rtl"
>
{body}
</div>
</section>
);
}