import { cn } from '~web/utils/helpers'; import { NotificationEvent, useNotificationsContext } from './data'; import { useLayoutEffect, useState } from 'preact/hooks'; import { ArrowLeft, CloseIcon } from './icons'; import { getIsProduction } from '~core/index'; export const RenderExplanation = ({ selectedEvent: _, selectedFiber, }: { selectedFiber: NotificationEvent['groupedFiberRenders'][number]; selectedEvent: NotificationEvent; }) => { const { setRoute } = useNotificationsContext(); const [tipisShown, setTipIsShown] = useState(true); const [isProduction] = useState(getIsProduction()); useLayoutEffect(() => { const res = localStorage.getItem('react-scan-tip-shown'); const asBool = res === 'true' ? true : res === 'false' ? false : null; if (asBool === null) { setTipIsShown(true); localStorage.setItem('react-scan-tip-is-shown', 'true'); return; } if (!asBool) { setTipIsShown(false); } }, []); const isMemoizable = selectedFiber.changes.context.length === 0 && selectedFiber.changes.props.length === 0 && selectedFiber.changes.state.length === 0; return (
{selectedFiber.name}
{!isProduction && ( <>
• Render time: {selectedFiber.totalTime.toFixed(0)}ms
)}
• Renders: {selectedFiber.count}x
{tipisShown && !isMemoizable && (
How to stop renders
Stop the following props, state and context from changing between renders, and wrap the component in React.memo if not already
)} {isMemoizable && (
No changes detected
This component would not have rendered if it was memoized
)}
Changed Props
{selectedFiber.changes.props.length > 0 ? ( selectedFiber.changes.props .toSorted((a, b) => b.count - a.count) .map((change) => (
{change.name}
{change.count}/{selectedFiber.count}x
)) ) : (
No changes
)}
Changed State
{selectedFiber.changes.state.length > 0 ? ( selectedFiber.changes.state .toSorted((a, b) => b.count - a.count) .map((change) => (
index {change.index}
{change.count}/{selectedFiber.count}x
)) ) : (
No changes
)}
Changed Context
{selectedFiber.changes.context.length > 0 ? ( selectedFiber.changes.context .toSorted((a, b) => b.count - a.count) .map((change) => (
{change.name}
{change.count}/{selectedFiber.count}x
)) ) : (
No changes
)}
); };