"use client"; import { ColumnDef } from "@tanstack/react-table"; import { useTranslations } from "next-intl"; import { useMemo } from "react"; import { Badge, Link } from "../../../../shadcnui"; import { Modules } from "../../../../core"; import { registerTableGenerator, TableContent, usePageUrlGenerator, UseTableStructureHook } from "../../../../hooks"; import { StripeProductFields } from "../data/stripe-product.fields"; import { StripeProductInterface } from "../data/stripe-product.interface"; export const useStripeProductTableStructure: UseTableStructureHook = ( params, ) => { const t = useTranslations(); const generateUrl = usePageUrlGenerator(); const tableData = useMemo(() => { return params.data.map((product: StripeProductInterface) => { const entry: TableContent = { jsonApiData: product }; entry[StripeProductFields.stripeProductId] = product.id; params.fields.forEach((field) => { entry[field] = (product as any)[field as keyof StripeProductInterface]; }); return entry; }); }, [params.data, params.fields]); const fieldColumnMap: Partial any>> = { [StripeProductFields.name]: () => ({ id: "name", accessorKey: "name", header: t("billing.admin.products.fields.name"), cell: ({ row }: { row: TableContent }) => { const product: StripeProductInterface = row.original.jsonApiData; return {product.name}; }, enableSorting: false, enableHiding: false, }), [StripeProductFields.status]: () => ({ id: "status", accessorKey: "status", header: t("billing.admin.products.fields.status"), cell: ({ row }: { row: TableContent }) => { const product: StripeProductInterface = row.original.jsonApiData; return product.active ? ( {t("billing.admin.products.status.active")} ) : ( {t("billing.admin.products.status.archived")} ); }, enableSorting: false, enableHiding: false, }), [StripeProductFields.prices]: () => ({ id: "prices", accessorKey: "prices", header: t("billing.admin.products.fields.prices"), cell: ({ row }: { row: TableContent }) => { const product: StripeProductInterface = row.original.jsonApiData; // Typography role 15 (numeric): tabular-nums, right-aligned. NEVER // font-mono — no monospace font is loaded in these apps. return {product.stripePrices.length}; }, enableSorting: false, enableHiding: false, }), }; const columns = useMemo(() => { return params.fields.map((field) => fieldColumnMap[field]?.()).filter((col) => col !== undefined) as ColumnDef< TableContent >[]; }, [params.fields, fieldColumnMap, t, generateUrl]); return useMemo(() => ({ data: tableData, columns: columns }), [tableData, columns]); }; registerTableGenerator("stripe-products", useStripeProductTableStructure);