import React, { useEffect, useRef, useState } from "react"; import { SkeletonProps } from "./Skeleton.types"; const Skeleton: React.FC = ({ hasImage = true, hasText = true, }) => { const defaultRow = 5; const lineHeight = 2; const skeletonImageDiv = useRef(null); const skeletonTextDiv = useRef(null); const [numberOfTextLine, setNumberOfTextLine] = useState(defaultRow); const [numberOfImageTextLine, setNumberOfImageTextLine] = useState( defaultRow ); const getNumberOfLine = (element: HTMLDivElement) => { return Math.ceil(element.offsetHeight / (lineHeight + 1) / 10); }; useEffect(() => { if (skeletonTextDiv.current) { setNumberOfTextLine(getNumberOfLine(skeletonTextDiv.current)); } if (skeletonImageDiv.current) { setNumberOfImageTextLine(getNumberOfLine(skeletonImageDiv.current)); } }, []); return (
{hasImage && (
{Array(numberOfImageTextLine) .fill(null) .map((_, index) => { return (
); })}
)} {hasText && (
{Array(numberOfTextLine) .fill(null) .map((_, index) => { return (
); })}
)}
); }; export default Skeleton;