Skip to content

Instantly share code, notes, and snippets.

@tushar-rupani
Created July 29, 2023 12:56
Show Gist options
  • Save tushar-rupani/b59d30d82dfa248814739cb07291f94a to your computer and use it in GitHub Desktop.
Save tushar-rupani/b59d30d82dfa248814739cb07291f94a to your computer and use it in GitHub Desktop.
import { useState } from "react";
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger
} from "../shadcn/ui/dropdown-menu";
import { Button } from "../shadcn/ui/button";
interface ISelectProps {
values: {
key: string;
value: string;
}[];
}
const MultiSelect = ({ values }: ISelectProps) => {
const [selectedItems, setSelectedItems] = useState<string[]>([]);
const handleSelectChange = (value: string) => {
if (!selectedItems.includes(value)) {
setSelectedItems((prev) => [...prev, value]);
} else {
const referencedArray = [...selectedItems];
const indexOfItemToBeRemoved = referencedArray.indexOf(value);
referencedArray.splice(indexOfItemToBeRemoved, 1);
setSelectedItems(referencedArray);
}
};
const isOptionSelected = (value: string): boolean => {
return selectedItems.includes(value) ? true : false;
};
return (
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="flex gap-2 font-bold">
<span>Select Values</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56" onCloseAutoFocus={(e) => e.preventDefault()}>
<DropdownMenuLabel>Appearance</DropdownMenuLabel>
<DropdownMenuSeparator />
{values.map((value: ISelectProps["values"][0], index: number) => {
return (
<DropdownMenuCheckboxItem
onSelect={(e) => e.preventDefault()}
key={index}
checked={isOptionSelected(value.key)}
onCheckedChange={() => handleSelectChange(value.key)}
>
{value.value}
</DropdownMenuCheckboxItem>
);
})}
</DropdownMenuContent>
</DropdownMenu>
</>
);
};
export default MultiSelect;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment