From a4ae8660f7fe344fcfa386b327a1c02d19818b77 Mon Sep 17 00:00:00 2001 From: siam Date: Thu, 27 Feb 2025 11:54:29 +0800 Subject: [PATCH] perf: render tooltip when text is overflow --- .../initial-sheet-view/InitialSheetView.tsx | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/ui/components/initial-sheet-view/InitialSheetView.tsx b/packages/ui/components/initial-sheet-view/InitialSheetView.tsx index cc1d27a..50d4f7c 100644 --- a/packages/ui/components/initial-sheet-view/InitialSheetView.tsx +++ b/packages/ui/components/initial-sheet-view/InitialSheetView.tsx @@ -1,6 +1,6 @@ import { type IInitialSheet, Sheet_Cell_Type_Enum } from '@univer-clipsheet-core/table'; import clsx from 'clsx'; -import { useCallback, useMemo } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { t } from '@univer-clipsheet-core/locale'; import type { TableProps } from '@components/table'; import { Table } from '@components/table'; @@ -18,6 +18,39 @@ type GetFunction = T extends Function ? T : never; const tooltipAlign = { autoArrow: false }; +function elementIsClamped(element: HTMLElement) { + const style = getComputedStyle(element); + const lineHeight = Number.parseFloat(style.lineHeight); + const maxLines = Number.parseInt(style.webkitLineClamp, 10); + + return element.scrollHeight > (maxLines * lineHeight); +} + +function TextWithTooltip(props: { text: string }) { + const { text } = props; + + const [isClamped, setIsClamped] = useState(false); + const detectIsClamped = useCallback((node: HTMLDivElement | null) => { + if (node) { + setTimeout(() => { + setIsClamped(elementIsClamped(node)); + }); + } + }, []); + + const content =
{text}
; + + if (!isClamped) { + return content; + } + + return ( + {text}}> + {content} + + ); +} + export const InitialSheetView = (props: InitialSheetViewProps) => { const { className, sheet, scroll, rounded = false } = props; @@ -48,7 +81,7 @@ export const InitialSheetView = (props: InitialSheetViewProps) => { ? {cell.text || cell.url} : cell.type === Sheet_Cell_Type_Enum.IMAGE ? {cell.text} - : {cell.text}}>
{cell.text}
; + : ; return
{textContent}
; },