import React, { useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react"; import { AppCircle, AppCircleContainer, AppCircleLabel, AppLibrarySubTitle, AppsContainer, AppsLibraryContainer, AppsParent, AppsSearchContainer, AppsSearchLeft, AppsSearchRight, AppsWidthLimiter, PublishQAppCTAButton, PublishQAppCTALeft, PublishQAppCTAParent, PublishQAppCTARight, PublishQAppDotsBG, } from "./Apps-styles"; import { Avatar, Box, ButtonBase, InputBase, styled } from "@mui/material"; import { Add } from "@mui/icons-material"; import { MyContext, getBaseApiReact } from "../../App"; import LogoSelected from "../../assets/svgs/LogoSelected.svg"; import IconSearch from "../../assets/svgs/Search.svg"; import IconClearInput from "../../assets/svgs/ClearInput.svg"; import qappDevelopText from "../../assets/svgs/qappDevelopText.svg"; import qappLibraryText from "../../assets/svgs/qappLibraryText.svg"; import qappDots from "../../assets/svgs/qappDots.svg"; import { Spacer } from "../../common/Spacer"; import { AppInfoSnippet } from "./AppInfoSnippet"; import { Virtuoso } from "react-virtuoso"; import { executeEvent } from "../../utils/events"; import { AppsDesktopLibraryBody, AppsDesktopLibraryHeader, } from "./AppsDesktop-styles"; import { AppsNavBarDesktop } from "./AppsNavBarDesktop"; import ReturnSVG from '../../assets/svgs/Return.svg' import { ComposeP, MailIconImg, ShowMessageReturnButton } from "../Group/Forum/Mail-styles"; const officialAppList = [ "q-tube", "q-blog", "q-share", "q-support", "q-mail", "qombo", "q-fund", "q-shop", "q-manager", "q-mintership" ]; const ScrollerStyled = styled("div")({ // Hide scrollbar for WebKit browsers (Chrome, Safari) "::-webkit-scrollbar": { width: "0px", height: "0px", }, // Hide scrollbar for Firefox scrollbarWidth: "none", // Hide scrollbar for IE and older Edge "-ms-overflow-style": "none", }); const StyledVirtuosoContainer = styled("div")({ position: "relative", width: "100%", display: "flex", flexDirection: "column", // Hide scrollbar for WebKit browsers (Chrome, Safari) "::-webkit-scrollbar": { width: "0px", height: "0px", }, // Hide scrollbar for Firefox scrollbarWidth: "none", // Hide scrollbar for IE and older Edge "-ms-overflow-style": "none", }); export const AppsLibraryDesktop = ({ availableQapps, setMode, myName, hasPublishApp, isShow, categories = { categories }, }) => { const [searchValue, setSearchValue] = useState(""); const virtuosoRef = useRef(); const officialApps = useMemo(() => { return availableQapps.filter( (app) => app.service === "APP" && officialAppList.includes(app?.name?.toLowerCase()) ); }, [availableQapps]); const [debouncedValue, setDebouncedValue] = useState(""); // Debounced value // Debounce logic useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(searchValue); }, 350); // Cleanup timeout if searchValue changes before the timeout completes return () => { clearTimeout(handler); }; }, [searchValue]); // Runs effect when searchValue changes // Example: Perform search or other actions based on debouncedValue const searchedList = useMemo(() => { if (!debouncedValue) return []; return availableQapps.filter((app) => app.name.toLowerCase().includes(debouncedValue.toLowerCase()) ); }, [debouncedValue]); const rowRenderer = (index) => { let app = searchedList[index]; return ( ); }; return ( setSearchValue(e.target.value)} sx={{ ml: 1, flex: 1 }} placeholder="Search for apps" inputProps={{ "aria-label": "Search for apps", fontSize: "16px", fontWeight: 400, }} /> {searchValue && ( { setSearchValue(""); }} > )} { executeEvent("navigateBack", {}); }}> Return to Apps Dashboard {searchedList?.length > 0 ? ( ) : ( <> Official Apps {officialApps?.map((qapp) => { return ( { // executeEvent("addTab", { // data: qapp // }) executeEvent("selectedAppInfo", { data: qapp, }); }} > center-icon {qapp?.metadata?.title || qapp?.name} ); })} {hasPublishApp ? "Update Apps!" : "Create Apps!"} { setMode("publish"); }} > {hasPublishApp ? "Update" : "Publish"} Categories {categories?.map((category) => { return ( { executeEvent("selectedCategory", { data: category, }); }} > {category?.name} ); })} )} ); };