import sanitizeHtml from "sanitize-html"; import { Fragment, useMemo, useState } from "react"; import { FiChevronUp as CollapseIcon, FiChevronDown as ExpandIcon } from "react-icons/fi"; import { Button } from "@nextui-org/button"; import { Link } from "@nextui-org/link"; import formatDuration from "@/utils/formatDuration"; import { highlight, ItemType } from "@/utils/highlight"; import { Component } from "@/typings/component"; const shortenedDescriptionLength = 200; export const Description: Component<{ data: string }> = ({ data }) => { const [expandedDescription, setExpandedDescription] = useState(false); const sanitizedDescription = useMemo( () => sanitizeHtml(data, { allowedTags: ["a", "br"], allowedAttributes: { a: ["href"] } }), [data] ); const descriptionCut = useMemo( () => expandedDescription ? sanitizedDescription : sanitizedDescription.substring(0, shortenedDescriptionLength) + "...", [sanitizedDescription, expandedDescription] ); const description = useMemo( () => highlight(descriptionCut), [descriptionCut] ); return (

{description.map((item) => { switch (item.type) { case ItemType.Tokens: return {item.content}; case ItemType.Link: return ( {item.text ?? item.href} ); case ItemType.Timestamp: return ( {formatDuration(item.duration * 1000)} ); case ItemType.Linebreak: return
; } })}

); };