File "Sidebar.tsx"
Full Path: /home/rattkxnv/byattorney.com/wp-content/plugins/everest-forms/src/templates/components/Sidebar.tsx
File size: 3.65 KB
MIME-type: text/x-java
Charset: utf-8
import React, { useState, useCallback } from "react";
import { Box, VStack, HStack, Text, Spacer, Input, InputLeftElement, InputGroup, Badge, CardHeader,CardFooter,Button,Card,Heading } from "@chakra-ui/react";
import { IoSearchOutline } from "react-icons/io5";
import debounce from "lodash.debounce";
import { __ } from '@wordpress/i18n';
interface SidebarProps {
categories: { name: string; count: number }[];
selectedCategory: string;
onCategorySelect: (category: string) => void;
onSearchChange: (searchTerm: string) => void;
}
const Sidebar: React.FC<SidebarProps> = React.memo(({ categories, selectedCategory, onCategorySelect, onSearchChange }) => {
const [searchTerm, setSearchTerm] = useState<string>("");
const debouncedSearchChange = useCallback(
debounce((value: string) => {
onSearchChange(value);
}, 300),
[onSearchChange]
);
const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setSearchTerm(value);
debouncedSearchChange(value);
};
const favorites = categories.find(cat => cat.name === 'Favorites');
const orderedCategories = favorites && favorites.count > 0
? [favorites, ...categories.filter(cat => cat.name !== 'Favorites')]
: categories;
return (
<Box>
<InputGroup mb="26px">
<InputLeftElement pointerEvents="none" padding="0px 0px 0px 8px" borderRadius="8px" borderColor="#B0B0B0">
<IoSearchOutline style={{ width: "18px", height: "18px" }} color="#737373" />
</InputLeftElement>
<Input
placeholder={__("Search Templates", "everest-forms")}
value={searchTerm}
onChange={handleSearchChange}
_focus={{
borderColor: "#7545BB",
outline: "none",
boxShadow: "none"
}}
/>
</InputGroup>
<VStack align="stretch" gap="2px">
{orderedCategories.map((category) => (
<HStack
key={category.name}
p="12px"
_hover={{
bg: "#F7F4FB",
"& > .badge": {
bg: selectedCategory === category.name ? "#FFFFFF" : "#FFFFFF"
}
}}
borderRadius="md"
cursor="pointer"
bg={selectedCategory === category.name ? "#F7F4FB" : "transparent"}
onClick={() => onCategorySelect(category.name)}
>
<Text color={selectedCategory === category.name ? "#7545BB" : ""} fontWeight="semibold" margin="0px">{category.name}</Text>
<Spacer />
<Badge className="badge" display="flex" alignItems="center" justifyContent="center" width="32px" height="32px" padding="0px" borderRadius="8px" color={selectedCategory === category.name ? "#7545BB" : ""} bg={selectedCategory === category.name ? "white" : "#F2F2F2"} >{category.count}</Badge>
</HStack>
))}
<Card
align='center'
bg="linear-gradient(90.62deg, rgba(76, 21, 155, 0.7) 0.2%, rgba(76, 21, 155, 0.7) 0.21%, rgba(140, 100, 198, 0.7) 99.25%)"
padding="40px 24px"
marginTop="26px"
>
<CardHeader padding="0px">
<Heading fontSize="18px" color="white" lineHeight="28px" padding="0px" margin="0px 0px 20px" textAlign="center">
{__("Can't Find The Form Template You Need?", "everest-forms")}
</Heading>
</CardHeader>
<CardFooter padding="0" width="100%">
<a
href="https://everestforms.net/request-template"
target="_blank"
rel="noopener noreferrer"
style={{ width: "inherit" }}
>
<Button
backgroundColor="#FFFFFF"
color="#7545BB"
padding="12px 10px"
borderRadius="4px"
width="inherit"
>
{__("Request Template","everest-forms")}
</Button>
</a>
</CardFooter>
</Card>
</VStack>
</Box>
);
});
export default Sidebar;