don't rerender for callback

This commit is contained in:
Nicolas Mowen 2024-02-26 13:21:46 -07:00
parent 12f9c13a23
commit 44fa0805f0
3 changed files with 27 additions and 11 deletions

View File

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

View File

@ -304,8 +304,8 @@ export default function DesktopEventView({
<PreviewThumbnailPlayer <PreviewThumbnailPlayer
review={value} review={value}
relevantPreview={relevantPreview} relevantPreview={relevantPreview}
setReviewed={() => markItemAsReviewed(value.id)} setReviewed={markItemAsReviewed}
onClick={() => onSelectReview(value.id)} onClick={onSelectReview(value.id}
/> />
</div> </div>
{lastRow && !reachedEnd && <ActivityIndicator />} {lastRow && !reachedEnd && <ActivityIndicator />}

View File

@ -223,7 +223,7 @@ export default function MobileEventView({
review={value} review={value}
relevantPreview={relevantPreview} relevantPreview={relevantPreview}
autoPlayback={minimapBounds.end == value.start_time} autoPlayback={minimapBounds.end == value.start_time}
setReviewed={() => markItemAsReviewed(value.id)} setReviewed={markItemAsReviewed}
/> />
</div> </div>
{lastRow && !reachedEnd && <ActivityIndicator />} {lastRow && !reachedEnd && <ActivityIndicator />}