import { useMemo } from 'react'; import { List, RowComponentProps } from 'react-window-v2'; import styles from './unsynchronized-lyrics.module.css'; import { LyricLine } from '/@/renderer/features/lyrics/lyric-line'; import { useLyricsDisplaySettings, useLyricsSettings } from '/@/renderer/store'; import { FullLyricsMetadata } from '/@/shared/types/domain-types'; export interface UnsynchronizedLyricsProps extends Omit { lyrics: string; settingsKey?: string; translatedLyrics?: null | string; } type LyricRowProps = { alignment: 'center' | 'left' | 'right'; fontSize: number; lines: string[]; translatedLines: string[]; }; const LyricRow = ({ alignment, fontSize, index, lines, style, translatedLines, }: RowComponentProps) => { const translatedLine = translatedLines[index] || ''; return (
); }; export const UnsynchronizedLyrics = ({ lyrics, settingsKey = 'default', translatedLyrics, }: UnsynchronizedLyricsProps) => { const lyricsSettings = useLyricsSettings(); const displaySettings = useLyricsDisplaySettings(settingsKey); const settings = { ...lyricsSettings, fontSizeUnsync: displaySettings.fontSizeUnsync && displaySettings.fontSizeUnsync !== 0 ? displaySettings.fontSizeUnsync : 24, gapUnsync: displaySettings.gapUnsync && displaySettings.gapUnsync !== 0 ? displaySettings.gapUnsync : 24, }; const lines = useMemo(() => { return lyrics.split('\n'); }, [lyrics]); const translatedLines = useMemo(() => { return translatedLyrics ? translatedLyrics.split('\n') : []; }, [translatedLyrics]); const useVirtualization = lines.length > 100; const itemHeight = settings.gapUnsync + settings.fontSizeUnsync + 4; const rowProps: LyricRowProps = useMemo( () => ({ alignment: settings.alignment, fontSize: settings.fontSizeUnsync, lines, translatedLines, }), [settings.alignment, settings.fontSizeUnsync, lines, translatedLines], ); if (useVirtualization) { return (
{/* * v2 sizes itself to its container, which also fixes a latent * bug: under v1 this passed a hardcoded `height={600}`, so long * lyrics were clipped to 600px regardless of how tall the pane * actually was. */}
); } return (
{lines.map((text, idx) => ( ))}
); };