Reduce rerenders on some components (#10068)

* Remove direct callback

* don't rerender for callback

* Move websocket to top level events

* Be smarter about updating timeago

* Cleanup
This commit is contained in:
Nicolas Mowen
2024-02-26 15:08:55 -07:00
committed by GitHub
parent e9076c0213
commit 849f343b25
5 changed files with 141 additions and 49 deletions

View File

@@ -26,8 +26,8 @@ type PreviewPlayerProps = {
review: ReviewSegment;
relevantPreview?: Preview;
autoPlayback?: boolean;
setReviewed?: () => void;
onClick?: () => void;
setReviewed?: (reviewId: string) => void;
onClick?: (reviewId: string) => void;
};
type Preview = {
@@ -53,6 +53,22 @@ export default function PreviewThumbnailPlayer({
const [progress, setProgress] = useState(0);
const [imgRef, imgLoaded, onImgLoad] = useImageLoaded();
// interaction
const handleOnClick = useCallback(() => {
if (onClick) {
onClick(review.id);
}
}, [review, onClick]);
const handleSetReviewed = useCallback(() => {
if (setReviewed) {
setReviewed(review.id);
}
}, [review, setReviewed]);
// playback
const playingBack = useMemo(() => playback, [playback, autoPlayback]);
useEffect(() => {
@@ -110,7 +126,7 @@ export default function PreviewThumbnailPlayer({
className="relative w-full h-full cursor-pointer"
onMouseEnter={isMobile ? undefined : () => onPlayback(true)}
onMouseLeave={isMobile ? undefined : () => onPlayback(false)}
onClick={onClick}
onClick={handleOnClick}
>
{playingBack && (
<div className="absolute left-0 top-0 right-0 bottom-0 animate-in fade-in">
@@ -118,7 +134,7 @@ export default function PreviewThumbnailPlayer({
review={review}
relevantPreview={relevantPreview}
setProgress={setProgress}
setReviewed={setReviewed}
setReviewed={handleSetReviewed}
/>
</div>
)}
@@ -184,7 +200,7 @@ export default function PreviewThumbnailPlayer({
)}
</div>
</ContextMenuTrigger>
<PreviewContextItems review={review} setReviewed={setReviewed} />
<PreviewContextItems review={review} setReviewed={handleSetReviewed} />
</ContextMenu>
);
}
@@ -321,7 +337,7 @@ const MIN_LOAD_TIMEOUT_MS = 200;
type InProgressPreviewProps = {
review: ReviewSegment;
setProgress?: (progress: number) => void;
setReviewed?: () => void;
setReviewed?: (reviewId: string) => void;
};
function InProgressPreview({
review,
@@ -355,7 +371,7 @@ function InProgressPreview({
}
if (setReviewed && key == Math.floor(previewFrames.length / 2)) {
setReviewed();
setReviewed(review.id);
}
setKey(key + 1);