|
1 | | -import { useState, MouseEvent } from "react"; |
| 1 | +import { useState, MouseEvent, memo } from "react"; |
2 | 2 | import { CheckButton } from "./CheckButton"; |
3 | 3 | import { ImageExtended, ImageProps } from "./types"; |
4 | 4 | import * as styles from "./styles"; |
5 | 5 | import { getStyle } from "./styles"; |
6 | 6 |
|
7 | | -export const Image = <T extends ImageExtended>({ |
| 7 | +const imagePropsAreEqual = (prevProps: ImageProps, currProps: ImageProps) => { |
| 8 | + // states are the same iff the props are the same |
| 9 | + |
| 10 | + const { |
| 11 | + item: prevItem, |
| 12 | + index: prevIndex, |
| 13 | + margin: prevMargin, |
| 14 | + height: prevHeight, |
| 15 | + isSelectable: prevIsSelectable, |
| 16 | + } = prevProps; |
| 17 | + |
| 18 | + const { |
| 19 | + item: currItem, |
| 20 | + index: currIndex, |
| 21 | + margin: currMargin, |
| 22 | + height: currHeight, |
| 23 | + isSelectable: currIsSelectable, |
| 24 | + } = currProps; |
| 25 | + |
| 26 | + return ( |
| 27 | + prevItem.src === currItem.src && |
| 28 | + prevItem.width === currItem.width && |
| 29 | + prevItem.height === currItem.height && |
| 30 | + prevItem.scaledHeight === currItem.scaledHeight && |
| 31 | + prevItem.scaledWidth === currItem.scaledWidth && |
| 32 | + prevItem.viewportWidth === currItem.viewportWidth && |
| 33 | + prevItem.marginLeft === currItem.marginLeft && |
| 34 | + prevIndex === currIndex && |
| 35 | + prevMargin === currMargin && |
| 36 | + prevHeight === currHeight && |
| 37 | + prevIsSelectable === currIsSelectable |
| 38 | + ); |
| 39 | +}; |
| 40 | + |
| 41 | +const ImageBase = <T extends ImageExtended>({ |
8 | 42 | item, |
9 | 43 | thumbnailImageComponent: ThumbnailImageComponent, |
10 | 44 | isSelectable = true, |
@@ -132,3 +166,5 @@ export const Image = <T extends ImageExtended>({ |
132 | 166 | </div> |
133 | 167 | ); |
134 | 168 | }; |
| 169 | + |
| 170 | +export const Image = memo(ImageBase, imagePropsAreEqual); |
0 commit comments