import React, { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; import WidgetCard from "./WidgetCard"; import { getWidgetCards } from "selectors/editorSelectors"; import ExplorerSearch from "./Explorer/ExplorerSearch"; import { debounce } from "lodash"; import { createMessage, WIDGET_SIDEBAR_CAPTION, } from "@appsmith/constants/messages"; import Fuse from "fuse.js"; import { WidgetCardProps } from "widgets/BaseWidget"; function WidgetSidebar({ isActive }: { isActive: boolean }) { const cards = useSelector(getWidgetCards); const [filteredCards, setFilteredCards] = useState(cards); const searchInputRef = useRef(null); let fuse: Fuse>; useEffect(() => { fuse = new Fuse(cards, { keys: ["displayName", "searchTags"], threshold: 0.5, distance: 20, }); }, [cards]); const filterCards = (keyword: string) => { if (keyword.trim().length > 0) { const searchResult = fuse.search(keyword); setFilteredCards(searchResult as WidgetCardProps[]); } else { setFilteredCards(cards); } }; useEffect(() => { if (isActive) searchInputRef.current?.focus(); }, [isActive]); /** * filter widgets */ const search = debounce((e: any) => { filterCards(e.target.value.toLowerCase()); }, 300); /** * clear the search input */ const clearSearchInput = () => { if (searchInputRef.current) { searchInputRef.current.value = ""; } filterCards(""); searchInputRef.current?.focus(); }; return (

{createMessage(WIDGET_SIDEBAR_CAPTION)}

{filteredCards.map((card) => ( ))}
); } WidgetSidebar.displayName = "WidgetSidebar"; export default WidgetSidebar;