diff options
Diffstat (limited to 'src/components/PollsList/RenderItem.tsx')
-rw-r--r-- | src/components/PollsList/RenderItem.tsx | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/components/PollsList/RenderItem.tsx b/src/components/PollsList/RenderItem.tsx new file mode 100644 index 0000000..900dae6 --- /dev/null +++ b/src/components/PollsList/RenderItem.tsx @@ -0,0 +1,47 @@ +import React, { useCallback } from 'react'; +import { Poll } from 'which-types'; +import PollCard from '../PollCard/PollCard'; + + +interface PropTypes { + polls: Poll[]; + mutate: (polls: Poll[], refetch: boolean) => void; + index: number; + style: React.CSSProperties; + key: string; +} + +const compareProps = (oldProps: PropTypes, newProps: PropTypes) => { + if (oldProps.key !== newProps.key) return false; + if (oldProps.index !== newProps.index) return false; + if (oldProps.polls !== newProps.polls) return false; + // TODO: uncomment line below to listen to style updates + // if (JSON.stringify(oldProps.style)!== JSON.stringify(newProps.style)) return false; + return true; +}; + +const RenderItem: React.FC<PropTypes> = React.memo(({ + polls, mutate, index, style, key +}) => { + const poll = polls[index]; + + const setPoll = useCallback((newPoll: Poll) => { + const newPolls = [...polls]; + newPolls[index] = newPoll; + + // Force-update list-size so everything re-renders + mutate([], false); + mutate(newPolls, false); + }, [mutate, index, polls]); + + 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> + ); +}, compareProps); + + +export default RenderItem; + |