import React, { useEffect, useState } from "react"; import Search from "../../ui/inputs/Search"; import { getCategoryAsset } from "../../../services/factoryBuilder/asset/assets/getCategoryAsset"; import { fetchAssets } from "../../../services/marketplace/fetchAssets"; import { useDecalStore, useSelectedItem } from "../../../store/builder/store"; // images ------------------- import vehicle from "../../../assets/image/categories/vehicles.png"; import workStation from "../../../assets/image/categories/workStation.png"; import machines from "../../../assets/image/categories/machines.png"; import worker from "../../../assets/image/categories/worker.png"; import storage from "../../../assets/image/categories/storage.png"; import office from "../../../assets/image/categories/office.png"; import safety from "../../../assets/image/categories/safety.png"; import feneration from "../../../assets/image/categories/feneration.png"; import decal from "../../../assets/image/categories/decal.png"; import SkeletonUI from "../../templates/SkeletonUI"; import { AlertIcon, DecalInfoIcon, HangTagIcon, NavigationIcon, } from "../../icons/ExportCommonIcons"; import { assert } from "console"; import { getCategoryDecals } from "../../../services/factoryBuilder/asset/decals/getCategoryDecals"; // ------------------------------------- interface AssetProp { filename: string; thumbnail?: string; category: string; description?: string; tags: string; url?: string; uploadDate?: number; isArchieve?: boolean; animated?: boolean; price?: number; CreatedBy?: string; } interface CategoryListProp { assetImage?: string; assetName?: string; categoryImage: string; category: string; } const Assets: React.FC = () => { const { setSelectedItem } = useSelectedItem(); const [searchValue, setSearchValue] = useState(""); const [selectedCategory, setSelectedCategory] = useState(null); const [categoryAssets, setCategoryAssets] = useState([]); const [decalAsset, setDecalAsset] = useState(); const [filtereredAssets, setFiltereredAssets] = useState( [] ); const [categoryList, setCategoryList] = useState([]); const [isLoading, setisLoading] = useState(false); // Loading state for assets const { selectedSubCategory, setSelectedSubCategory } = useDecalStore(); const handleSearchChange = (value: string) => { const searchTerm = searchValue ? searchValue.toLowerCase() : value.toLowerCase(); setSearchValue(value); if (searchTerm.trim() === "" && !selectedCategory) { setCategoryAssets([]); return; } if (selectedCategory === "Decals" || selectedSubCategory) { const filteredModels = decalAsset?.filter((model: any) => model.decalName?.toLowerCase().includes(searchTerm.toLowerCase()) ); setCategoryAssets(filteredModels); } else { const filteredModels = filtereredAssets?.filter((model) => { if (!model?.tags || !model?.filename || !model?.category) return false; if (searchTerm.startsWith(":") && searchTerm.length > 1) { const tagSearchTerm = searchTerm.slice(1); return model.tags.toLowerCase().includes(tagSearchTerm); } else if (selectedCategory) { return ( model.category .toLowerCase() .includes(selectedCategory.toLowerCase()) && model.filename.toLowerCase().includes(searchTerm) ); } else { return model.filename.toLowerCase().includes(searchTerm); } }); setCategoryAssets(filteredModels); } }; useEffect(() => { if (selectedCategory === "Decals") return; const filteredAssets = async () => { try { const filt = await fetchAssets(); setFiltereredAssets(filt); } catch { echo.error("Filter asset not found"); } }; filteredAssets(); }, [categoryAssets, selectedCategory]); useEffect(() => { if ( (searchValue.trim() === "" && selectedCategory === "Decals") || selectedSubCategory ) { const filteredModels = decalAsset?.filter((model: any) => model.decalName?.toLowerCase().includes(searchValue.toLowerCase()) ); setCategoryAssets(filteredModels); } }, [selectedSubCategory, decalAsset, searchValue]); useEffect(() => { setCategoryList([ { category: "Fenestration", categoryImage: feneration }, { category: "Decals", categoryImage: decal }, { category: "Vehicles", categoryImage: vehicle }, { category: "Workstation", categoryImage: workStation }, { category: "Machines", categoryImage: machines }, { category: "Workers", categoryImage: worker }, { category: "Storage", categoryImage: storage }, { category: "Safety", categoryImage: safety }, { category: "Office", categoryImage: office }, ]); }, []); const fetchCategoryAssets = async (asset: any) => { setisLoading(true); setSelectedCategory(asset); try { const res = await getCategoryAsset(asset); setCategoryAssets(res); setFiltereredAssets(res); setisLoading(false); // End loading // eslint-disable-next-line } catch (error) { echo.error("failed to fetch assets"); setisLoading(false); } }; const fetchCategoryDecals = async (asset: any) => { setisLoading(true); // setSelectedCategory(asset); try { const res = await getCategoryDecals(asset); setCategoryAssets(res); setFiltereredAssets(res); setDecalAsset(res); setisLoading(false); // End loading // eslint-disable-next-line } catch (error) { echo.error("failed to fetch assets"); setisLoading(false); } }; const activeSubcategories = [ { name: "Safety", icon: }, { name: "Navigation", icon: }, { name: "Branding", icon: }, { name: "Informational", icon: }, ]; return (
{(() => { if (isLoading) { return ; // Show skeleton when loading } if (searchValue) { return (

Results for {searchValue}

{selectedCategory == "Decals" ? ( <>
{activeSubcategories.map((cat, index) => (
{ fetchCategoryDecals(cat.name); setSelectedSubCategory(cat.name); }} >
{cat.icon}
{cat.name}
))}
{categoryAssets?.map((asset: any, index: number) => (
{asset.decalName} { setSelectedItem({ name: asset.decalName, id: asset.id, type: asset.type === "undefined" ? undefined : asset.type, category: asset.category, // subType: asset.subType, }); }} />
{asset.decalName .split("_") .map( (word: any) => word.charAt(0).toUpperCase() + word.slice(1) ) .join(" ")}
))} ) : ( categoryAssets?.map((asset: any, index: number) => (
{asset.filename} { setSelectedItem({ name: asset.filename, id: asset.AssetID, type: asset.type === "undefined" ? undefined : asset.type, }); }} />
{asset.filename .split("_") .map( (word: any) => word.charAt(0).toUpperCase() + word.slice(1) ) .join(" ")}
)) )}
); } if (selectedCategory) { return (

{selectedCategory}

{selectedCategory === "Decals" && ( <>
{activeSubcategories.map((cat, index) => (
{ fetchCategoryDecals(cat.name); setSelectedSubCategory(cat.name); }} >
{cat.icon}
{cat.name}
))}
)} {selectedCategory !== "Decals" && !selectedSubCategory ? (
{categoryAssets?.map((asset: any, index: number) => (
{asset.filename} { setSelectedItem({ name: asset.filename, id: asset.AssetID, type: asset.type === "undefined" ? undefined : asset.type, category: asset.category, subType: asset.subType, }); }} />
{asset.filename .split("_") .map( (word: any) => word.charAt(0).toUpperCase() + word.slice(1) ) .join(" ")}
))} {categoryAssets.length === 0 && (
🚧 The asset shelf is empty. We're working on filling it up!
)}
) : (
{categoryAssets?.map((asset: any, index: number) => (
{asset.decalName} { setSelectedItem({ name: asset.decalName, id: asset.id, type: asset.type === "undefined" ? undefined : asset.type, category: asset.category, // subType: asset.subType, }); }} />
{asset.decalName .split("_") .map( (word: any) => word.charAt(0).toUpperCase() + word.slice(1) ) .join(" ")}
))} {categoryAssets.length === 0 && (
🚧 The asset shelf is empty. We're working on filling it up!
)}
)}
); } return (

Categories

{Array.from( new Set(categoryList.map((asset) => asset.category)) ).map((category, index) => { const categoryInfo = categoryList.find( (asset) => asset.category === category ); return (
{ fetchCategoryAssets(category); }} > {category}
{category}
); })}
); })()}
); }; export default Assets;