import React, { useEffect, useState } from "react"; import { json } from "@remix-run/node"; import { useLoaderData, Form, useActionData } from "@remix-run/react"; import { Page, Layout, IndexTable, Card, Thumbnail, TextContainer, Spinner, Button, TextField, Banner, } from "@shopify/polaris"; import { authenticate } from "../shopify.server"; import { TitleBar } from "@shopify/app-bridge-react"; export const loader = async ({ request }) => { const { admin } = await authenticate.admin(request); const { getTurn14AccessTokenFromMetafield } = await import("../utils/turn14Token.server"); const accessToken = await getTurn14AccessTokenFromMetafield(request); const res = await admin.graphql(`{ shop { metafield(namespace: "turn14", key: "selected_brands") { value } } }`); const data = await res.json(); const rawValue = data?.data?.shop?.metafield?.value; let brands = []; try { brands = JSON.parse(rawValue); } catch (err) { console.error("❌ Failed to parse metafield value:", err); } return json({ brands, accessToken }); }; export default function ManageBrandProducts() { const actionData = useActionData(); const { brands, accessToken } = useLoaderData(); const [expandedBrand, setExpandedBrand] = useState(null); const [itemsMap, setItemsMap] = useState({}); const [loadingMap, setLoadingMap] = useState({}); const [productCount, setProductCount] = useState("0"); const [initialLoad, setInitialLoad] = useState(true); // Function to toggle all brands const toggleAllBrands = async () => { for (const brand of brands) { await toggleBrandItems(brand.id); } }; // Run on initial load useEffect(() => { if (initialLoad && brands.length > 0) { toggleAllBrands(); setInitialLoad(false); } }, [brands, initialLoad]); const toggleBrandItems = async (brandId) => { const isExpanded = expandedBrand === brandId; if (isExpanded) { setExpandedBrand(null); } else { setExpandedBrand(brandId); if (!itemsMap[brandId]) { setLoadingMap((prev) => ({ ...prev, [brandId]: true })); try { // const res = await fetch(`https://turn14.data4autos.com/v1/items/brand/${brandId}?page=1`, { const res = await fetch(`https://turn14.data4autos.com/v1/items/brandallitems/${brandId}`, { headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); const data = await res.json(); setProductCount(data.length) setItemsMap((prev) => ({ ...prev, [brandId]: data })); } catch (err) { console.error("Error fetching items:", err); } setLoadingMap((prev) => ({ ...prev, [brandId]: false })); } else { setProductCount(itemsMap[brandId].length) } } }; return ( {brands.length === 0 ? (

No brands selected yet.

) : ( {brands.map((brand, index) => ( {brand.id} {itemsMap[brand.id]?.length || 0} ))} )} {brands.map( (brand) => expandedBrand === brand.id && ( {actionData?.success && (

{actionData.results.map((r) => ( Product {r.productId} – Variant {r.variant.id} @ ${r.variant.price} (SKU: {r.variant.sku})
))}

)}
{loadingMap[brand.id] ? ( ) : (
Total Products Count : {(itemsMap[brand.id] || []).length} {( itemsMap[brand.id] && itemsMap[brand.id].length > 0 ? itemsMap[brand.id] : [] ).map((item) => (

Part Number: {item?.attributes.part_number}

Category: {item?.attributes.category} > {item?.attributes.subcategory}

))}
)}
) )}
); }