import clsx from 'clsx'; import { CSSProperties, memo } from 'react'; import { Link } from 'react-router'; import styles from './title-artist-column.module.css'; import { getTitlePath } from '/@/renderer/components/item-list/helpers/get-title-path'; import { ColumnNullFallback, ColumnSkeletonVariable, ItemTableListInnerColumn, TableColumnContainer, } from '/@/renderer/components/item-list/item-table-list/item-table-list-column'; import { useIsActiveRow } from '/@/renderer/components/item-list/item-table-list/item-table-list-context'; import { JoinedArtists } from '/@/renderer/features/albums/components/joined-artists'; import { Icon } from '/@/shared/components/icon/icon'; import { Text } from '/@/shared/components/text/text'; import { Folder, LibraryItem, QueueSong } from '/@/shared/types/domain-types'; export const DefaultTitleArtistColumn = (props: ItemTableListInnerColumn) => { const rowItem = props.getRowItem?.(props.rowIndex) ?? (props.data as any[])[props.rowIndex]; const row: object | undefined = (rowItem as any)?.id; const item = rowItem as any; const align = props.columns[props.columnIndex]?.align || 'start'; if (item && 'name' in item && 'artists' in item) { const rowHeight = props.getRowHeight(props.rowIndex, props); const path = getTitlePath(props.itemType, (rowItem as any).id as string); const item = rowItem as any; const titleLinkProps = path ? { component: Link, isLink: true, state: { item }, to: path, } : {}; return (
{item.name as string}
); } if (row === null) { return ; } return ; }; export const QueueSongTitleArtistColumn = (props: ItemTableListInnerColumn) => { const rowItem = props.getRowItem?.(props.rowIndex) ?? (props.data as any[])[props.rowIndex]; const row: object | undefined = rowItem as any; const song = rowItem as QueueSong; const isActive = useIsActiveRow(song?.id, song?._uniqueId); const align = props.columns[props.columnIndex]?.align || 'start'; const alignClass = align === 'center' ? 'align-center' : align === 'end' ? 'align-right' : 'align-left'; if (row && 'name' in row && 'artists' in row) { const rowHeight = props.getRowHeight(props.rowIndex, props); const path = getTitlePath(props.itemType, (rowItem as any).id as string); const item = rowItem as any; const titleLinkProps = path ? { component: Link, isLink: true, state: { item }, to: path, } : {}; return (
{row.name as string} {song?.trackSubtitle && props.itemType !== LibraryItem.QUEUE_SONG && ( {' ('} {song.trackSubtitle} {')'} )}
); } if ((rowItem as unknown as Folder)?._itemType === LibraryItem.FOLDER) { const rowHeight = props.getRowHeight(props.rowIndex, props); const path = getTitlePath(props.itemType, (rowItem as any).id as string); const item = rowItem as any; const textStyles = isActive ? { color: 'var(--theme-colors-primary)' } : {}; const titleLinkProps = path ? { component: Link, isLink: true, state: { item }, to: path, } : {}; const title = (rowItem as unknown as Folder)?.name; return ( {title} ); } if (row === null) { return ; } return ; }; const TitleArtistColumnBase = (props: ItemTableListInnerColumn) => { const { itemType } = props; switch (itemType) { case LibraryItem.FOLDER: case LibraryItem.PLAYLIST_SONG: case LibraryItem.QUEUE_SONG: case LibraryItem.SONG: return ; default: return ; } }; export const TitleArtistColumn = memo(TitleArtistColumnBase, (prevProps, nextProps) => { const prevItem = prevProps.getRowItem?.(prevProps.rowIndex); const nextItem = nextProps.getRowItem?.(nextProps.rowIndex); return ( prevProps.rowIndex === nextProps.rowIndex && prevProps.columnIndex === nextProps.columnIndex && prevProps.data === nextProps.data && prevProps.columns === nextProps.columns && prevProps.itemType === nextProps.itemType && prevProps.size === nextProps.size && prevItem === nextItem ); });