diff options
author | Eugene Sokolov <eug-vs@keemail.me> | 2020-08-10 13:51:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-10 13:51:11 +0300 |
commit | 823c82383424616bc7c2562e2a763321edb6050c (patch) | |
tree | 1d5220d68ab8ebb392c87038f2fc24cc72b28775 /src/components/PollsList | |
parent | 70d20b76f042a519e8e164279dfa31b5ce027d44 (diff) | |
parent | 78218c0f3427ad79de003ac59cffb99b08f0ae7d (diff) | |
download | which-ui-823c82383424616bc7c2562e2a763321edb6050c.tar.gz |
Merge pull request #74 from which-ecosystem/fetching
SWR feat. crazy refactor
Diffstat (limited to 'src/components/PollsList')
-rw-r--r-- | src/components/PollsList/PollsList.tsx | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/components/PollsList/PollsList.tsx b/src/components/PollsList/PollsList.tsx new file mode 100644 index 0000000..c95bfde --- /dev/null +++ b/src/components/PollsList/PollsList.tsx @@ -0,0 +1,74 @@ +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 = (newPoll: Poll) => { + const newPolls = [...polls]; + newPolls[index] = newPoll; + + // 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; + |