diff options
author | eug-vs <eug-vs@keemail.me> | 2020-08-10 11:12:06 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2020-08-10 11:12:06 +0300 |
commit | cab8de5c6b246e1aa1376fa2b8666f09b44b6469 (patch) | |
tree | 5e6c1105455bf3aadd1b987680a2814d8ce6ef07 /src/components/PollsList/PollsList.tsx | |
parent | 08e9e3abb9830b6c46f46aacb6a40ba32c4c665f (diff) | |
download | which-ui-cab8de5c6b246e1aa1376fa2b8666f09b44b6469.tar.gz |
refator: Feed -> PollList
Diffstat (limited to 'src/components/PollsList/PollsList.tsx')
-rw-r--r-- | src/components/PollsList/PollsList.tsx | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/components/PollsList/PollsList.tsx b/src/components/PollsList/PollsList.tsx new file mode 100644 index 0000000..0fd8fa4 --- /dev/null +++ b/src/components/PollsList/PollsList.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { Poll } from 'which-types'; +import { WindowScroller, AutoSizer, List } from 'react-virtualized'; +import PollCard from '../PollCard/PollCard'; + + +interface PropTypes { + polls: Poll[]; + mutate: (polls: Poll[], refetch: boolean) => void; +} + +interface RenderPropTypes { + index: number; + key: string; + style: React.CSSProperties; +} + + +const PollsList: React.FC<PropTypes> = ({ polls, mutate }) => { + + const RenderItem: React.FC<RenderPropTypes> = ({ index, style, key }) => { + const poll = polls[index]; + + const setPoll = (poll: Poll) => { + const newPolls = [...polls]; + newPolls[index] = poll; + + // Force-update list-size so everything re-renders + mutate([], false); + mutate(newPolls, false); + }; + + return ( + // To re-render on list resize, add this info to key + <div key={`${key}-${poll._id}-${polls.length}`} style={style}> + <PollCard poll={poll} setPoll={setPoll} /> + </div> + ); + }; + + return ( + <WindowScroller> + {({ + height, + isScrolling, + registerChild, + onChildScroll, + scrollTop + }) => ( + <AutoSizer disableHeight> + {({ width }) => ( + <div ref={registerChild}> + <List + autoHeight + height={height} + isScrolling={isScrolling} + onScroll={onChildScroll} + rowCount={polls.length} + rowHeight={550} + rowRenderer={RenderItem} + scrollTop={scrollTop} + width={width} + containerStyle={{ pointerEvents: 'auto' }} + overscanRowCount={1} + /> + </div> + )} + </AutoSizer> + )} + </WindowScroller> + ); +}; + +export default PollsList; + |