export const useDropdownFilter = <
IDefaultFilter extends { [key: string]: string | IDateString | IListBuilderItem[] },
IDefaultSort extends { [key: string]: ISortStatus }
>(
defaultFilter: IDefaultFilter,
defaultSort: IDefaultSort,
handelFilterApply: () => void
) => {
const [editedFilter, setEditedFilter] = useState<IDefaultFilter>(defaultFilter);
const [editedSort, setEditedSort] = useState<IDefaultSort>(defaultSort);
const handelFilterChange =
(name: keyof IDefaultFilter) => (value: string | IDateString | IListBuilderItem[]) => {
setEditedFilter(f => ({ ...f, [name]: value }));
};
const handelSortChange = (name: keyof IDefaultSort) => (value: ISortStatus) => {
setEditedSort(f => ({ ...f, [name]: value }));
};
const inputDropdownFilter = (
filterKey: keyof IDefaultFilter,
label: string,
position?: "left" | "right" | undefined
) => (
<>
{label}
<InputDropdownFilter
position={position}
value={editedFilter[filterKey] as string}
onValueChange={handelFilterChange(filterKey)}
onSortChange={handelSortChange(filterKey as keyof IDefaultSort)}
sortStatus={editedSort[filterKey as keyof IDefaultSort]}
onApply={handelFilterApply}
onClean={() => setEditedFilter(f => ({ ...f, [filterKey]: "" }))}
/>
</>
);
const timeDropdownFilter = (filterKey: keyof IDefaultFilter, label: string) => (
<>
{label}
<TimeDropdownFilter
dateString={editedFilter[filterKey] as IDateString}
onValueChange={handelFilterChange(filterKey)}
onSortChange={handelSortChange(filterKey as keyof IDefaultSort)}
sortStatus={editedSort[filterKey as keyof IDefaultSort]}
onApply={handelFilterApply}
onClean={() => setEditedFilter(f => ({ ...f, [filterKey]: { from: "", to: "" } }))}
/>
</>
);
const listDropdownFilter = (
filterKey: keyof IDefaultFilter,
label: string,
item: IListBuilderItem[]
) => (
<>
{label}
<ListDropdownFilter
selectedItem={editedFilter[filterKey] as IListBuilderItem[]}
item={item}
onValueChange={handelFilterChange(filterKey)}
onSortChange={handelSortChange(filterKey as keyof IDefaultSort)}
sortStatus={editedSort[filterKey as keyof IDefaultSort]}
onApply={handelFilterApply}
onClean={() => setEditedFilter(f => ({ ...f, [filterKey]: defaultFilter[filterKey] }))}
/>
</>
);
return {
inputDropdownFilter,
timeDropdownFilter,
listDropdownFilter,
editedFilter,
editedSort
};
};