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 (
{!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
)}
);
};