Skip to content

Instantly share code, notes, and snippets.

@SPavelV
Forked from mrhat24/ListPenalties.js
Created May 25, 2022 14:21
Show Gist options
  • Select an option

  • Save SPavelV/65dca1e774108f7e01a1922ba234522b to your computer and use it in GitHub Desktop.

Select an option

Save SPavelV/65dca1e774108f7e01a1922ba234522b to your computer and use it in GitHub Desktop.
Smart/dump components after
import {useState} from 'react';
import {useDispatch} from "react-redux";
import update from "immutability-helper";
import {
useGetFiltersPenalties,
useGetListPenalties
} from "../../hooks/";
import {penaltiesActions} from "../../Store/Redux/Penalties/actions";
import { Filters } from '../Filters/';
import { CardForList } from './CardForList';
import { Pagination } from 'uiKit/Pagination';
import './Penalties.scss';
const useSetScrollTop = (el, getScrollTop) => {
return () => {
const scrollTop = getScrollTop();
if (scrollTop > 0) {
el.scrollBy({top: -scrollTop, behavior: 'smooth'});
}
};
};
export const ListPenalties = (props) => {
const {
listSettings,
listOptions
} = props;
const dispatch = useDispatch();
const [paramsFilter, updateParamsFilter] = useState({ page: 1 });
const setScrollTop = useSetScrollTop(
window,
() => {
return window.scrollY ? window.scrollY : document.documentElement.scrollTop;
},
);
const { data: listFilters } = useGetFiltersPenalties();
const { data: listPenalties, isLoading: isLoadingList } = useGetListPenalties(paramsFilter, setScrollTop);
const onChangeFilter = (params) => {
const result = {...params, page: 1};
updateParamsFilter(result);
dispatch(penaltiesActions.setFilters(result));
};
const paginationProps = {
initialPage: paramsFilter?.page,
forcePage: paramsFilter?.page,
itemsPerPage: listPenalties.per_page,
totalPages: listPenalties.total_pages,
onChange: (currPage) => {
if (currPage.value !== paramsFilter?.page) {
const result = update(paramsFilter, {
page: {
$set: currPage.value ? currPage.value : 1
}
});
updateParamsFilter(result);
dispatch(penaltiesActions.setFilters(result));
}
},
};
const isPaginationVisible = listPenalties && listPenalties?.total_pages > 1;
return View({
listFilters,
listOptions,
listSettings,
isLoadingList,
onChangeFilter,
paginationProps,
penalties: listPenalties?.data ?? [],
isPaginationVisible,
});
};
const View = (props) => {
const {
penalties,
listOptions,
listFilters,
listSettings,
isLoadingList,
onChangeFilter,
paginationProps,
isPaginationVisible,
} = props;
return (
<div className='list-penalties'>
<div className='filters-list-penalties'>
<Filters
className='filters-list-penalties__content'
data={listFilters}
dataTemplate={listSettings?.filters}
listOptions={listOptions}
onChange={onChangeFilter}
/>
</div>
{
!isLoadingList &&
<>
<div className='list-penalties__content'>
{penalties.map((item) => (
<CardForList
key={item.id}
id={item.id}
data={item}
dataTemplate={listSettings?.card}
/>
))}
</div>
{
isPaginationVisible &&
<Pagination
className="list-polls__pagination"
{...paginationProps}
/>
}
</>
}
</div>
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment