import { forwardRef, Fragment, Ref } from 'react'; import { Group, Stack } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import { generatePath, useParams } from 'react-router'; import { Link } from 'react-router-dom'; import { LibraryItem, ServerType } from '/@/renderer/api/types'; import { Rating, Text } from '/@/renderer/components'; import { useAlbumDetail } from '/@/renderer/features/albums/queries/album-detail-query'; import { LibraryHeader, useSetRating } from '/@/renderer/features/shared'; import { useContainerQuery } from '/@/renderer/hooks'; import { AppRoute } from '/@/renderer/router/routes'; import { useCurrentServer } from '/@/renderer/store'; import { formatDateAbsolute, formatDurationString } from '/@/renderer/utils'; interface AlbumDetailHeaderProps { background: string; } export const AlbumDetailHeader = forwardRef( ({ background }: AlbumDetailHeaderProps, ref: Ref) => { const { albumId } = useParams() as { albumId: string }; const server = useCurrentServer(); const detailQuery = useAlbumDetail({ query: { id: albumId }, serverId: server?.id }); const cq = useContainerQuery(); const { t } = useTranslation(); const originalDifferentFromRelease = detailQuery.data?.originalDate && detailQuery.data.originalDate !== detailQuery.data.releaseDate; const releasePrefix = originalDifferentFromRelease ? t('page.albumDetail.released', { postProcess: 'sentenceCase' }) : '♫'; const metadataItems = [ { id: 'releaseDate', value: detailQuery?.data?.releaseDate && `${releasePrefix} ${formatDateAbsolute(detailQuery?.data?.releaseDate)}`, }, { id: 'songCount', value: `${detailQuery?.data?.songCount} songs`, }, { id: 'duration', value: detailQuery?.data?.duration && formatDurationString(detailQuery.data.duration), }, { id: 'playCount', value: `${detailQuery?.data?.playCount} plays`, }, ]; if (originalDifferentFromRelease) { const formatted = `♫ ${formatDateAbsolute(detailQuery!.data!.originalDate)}`; metadataItems.splice(0, 0, { id: 'originalDate', value: formatted, }); } const updateRatingMutation = useSetRating({}); const handleUpdateRating = (rating: number) => { if (!detailQuery?.data) return; updateRatingMutation.mutate({ query: { item: [detailQuery.data], rating, }, serverId: detailQuery.data.serverId, }); }; const showRating = detailQuery?.data?.serverType === ServerType.NAVIDROME; return ( {metadataItems.map((item, index) => ( {index > 0 && } {item.value} ))} {showRating && ( <> )} {detailQuery?.data?.albumArtists.map((artist) => ( {artist.name} ))} ); }, );