ExpandableText Components

import { Typography } from "@mui/material";
import { useEffect, useRef, useState } from "react"; interface ExpandableTextProps { text: string; extendedText: string; numberOfLine: number;
} const ExpandableText: React.FC<ExpandableTextProps> = ({ text, extendedText = "Description", numberOfLine = 3 }) => { const [expanded, setExpanded] = useState(false); const [maxHeight, setMaxHeight] = useState<string | number>('none'); const contentRef = useRef<HTMLDivElement>(null); useEffect(() => { if (contentRef.current) { setMaxHeight(expanded ? contentRef.current.scrollHeight : `${numberOfLine * 1.5}em`); } }, [expanded, numberOfLine]) const toggleExpand = () => { setExpanded((prev) => !prev); }; return ( <> <div ref={contentRef} style={{ overflow: 'hidden', maxHeight: maxHeight, transition: 'max-height 0.3s ease-in-out', }} > <Typography component="p" sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.5, display: '-webkit-box', WebkitBoxOrient: 'vertical', WebkitLineClamp: expanded ? 'unset' : numberOfLine, textOverflow: 'ellipsis', mt: 1, }} > {text} </Typography> </div> <span style={{ color: "blue", cursor: "pointer" }} onClick={toggleExpand}> {expanded ? `Collapse ${extendedText}` : `Expand ${extendedText}`} </span> </> );
}; export default ExpandableText;
Enter fullscreen mode
Exit fullscreen mode

Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top
Mastering mysql : your ultimate guide to getting started in database management web develop mentor. Manage your data invogue nexus web design. Keyword optimized heading : top 5 seo friendly wordpress themes for business.