diff --git a/src/components/drop-down-list/Filter.tsx b/src/components/drop-down-list/Filter.tsx index a3816c2..d0d47f8 100644 --- a/src/components/drop-down-list/Filter.tsx +++ b/src/components/drop-down-list/Filter.tsx @@ -1,124 +1,120 @@ import React from 'react'; import { cn } from '../../lib/cn'; -import { checkMark, chevroneDropDownList } from '../../assets/icons/input'; +import { checkMark } from '../../assets/icons/input'; import { useClickOutside } from '../../hooks/useClickOutside'; +import { Sort, SortActive } from '../../assets/icons/filters'; export interface FilterItem { - text: string; - value: string; + text: string; + value: string; } interface FilterProps { - disabled?: boolean; - className?: string; - onChange: (state: string[]) => void; // теперь массив выбранных значений - defaultState?: FilterItem[]; - items: FilterItem[]; + disabled?: boolean; + className?: string; + onChange: (items: FilterItem[]) => void; + defaultState?: FilterItem[]; + items: FilterItem[]; } export const Filter: React.FC = ({ - className = '', - onChange, - defaultState = [], - items = [{ text: '', value: '' }], + disabled = false, + className = '', + onChange, + defaultState = [], + items = [], }) => { - if (items.length === 0) items.push({ text: '', value: '' }); + const [value, setValue] = React.useState(defaultState); + const [active, setActive] = React.useState(false); - const [selectedValues, setSelectedValues] = - React.useState(defaultState); - const [active, setActive] = React.useState(false); + const ref = React.useRef(null); - React.useEffect(() => { - onChange(selectedValues.map((v) => v.value)); - }, [selectedValues]); + useClickOutside(ref, () => { + setActive(false); + }); - const ref = React.useRef(null); - useClickOutside(ref, () => setActive(false)); + React.useEffect(() => { + onChange(value); + }, [value]); - const toggleItem = (item: FilterItem) => { - const exists = selectedValues.some((v) => v.value === item.value); - if (exists) { - setSelectedValues( - selectedValues.filter((v) => v.value !== item.value), - ); - } else { - setSelectedValues([...selectedValues, item]); - } - }; + const toggleItem = (item: FilterItem) => { + const exists = value.some((val) => val.value === item.value); + if (exists) { + setValue(value.filter((val) => val.value !== item.value)); + } else { + setValue([...value, item]); + } + }; - const displayText = - selectedValues.length > 0 - ? selectedValues.map((v) => v.text).join(', ') - : 'Выберите...'; - - return ( -
-
setActive(!active)} - title={displayText} - > - {displayText} -
- - - -
-
-
- {items.map((v, i) => { - const isSelected = selectedValues.some( - (sel) => sel.value === v.value, - ); - return ( -
toggleItem(v)} - > - {v.text} - - {isSelected && ( - - )} -
- ); - })} -
-
-
+ return ( +
+
0) && 'w-fit border-liquid-brightmain border-[1px] border-solid', + )} + onClick={() => { + if (!disabled) setActive(!active); + }} + > +
+ {value.length}
- ); +
+ + {/* Sort icons */} + + 0) && 'opacity-100', + )} + /> + + {/* Dropdown */} +
+
+
+ {items.map((v) => { + const selected = value.some((val) => val.value === v.value); + return ( +
toggleItem(v)} + > + {v.text} + {selected && ( + + )} +
+ ); + })} +
+
+
+
+ ); }; diff --git a/src/components/drop-down-list/Sorter.tsx b/src/components/drop-down-list/Sorter.tsx index 8c1e14d..7ce3b85 100644 --- a/src/components/drop-down-list/Sorter.tsx +++ b/src/components/drop-down-list/Sorter.tsx @@ -45,8 +45,8 @@ export const Sorter: React.FC = ({ className={cn( 'grid items-center h-[40px] rounded-full bg-liquid-lighter grid-cols-[40px]', 'text-[18px] font-bold cursor-pointer select-none', - 'transitin-all active:scale-95 duration-300 overflow-hidden', - active && ' grid-cols-[1fr]', + 'overflow-hidden', + active && ' grid-cols-[1fr] border-liquid-brightmain border-[1px] border-solid', )} onClick={() => { setActive(!active); @@ -54,7 +54,7 @@ export const Sorter: React.FC = ({ >
@@ -63,7 +63,7 @@ export const Sorter: React.FC = ({
-
+
{ ]; return ( -
+
{ onChange={(v) => console.log(v)} /> - {/* console.log(values)} // обработчик изменения - className="w-[240px]" - /> */} + defaultState={[]} + onChange={(values) => console.log(values)} + />
); };