feishin/src/renderer/features/playlists/components/playlist-detail-header.tsx

80 lines
3.1 KiB
TypeScript
Raw Normal View History

import { forwardRef, Fragment, Ref } from 'react';
2023-01-02 02:04:23 -08:00
import { Group, Stack } from '@mantine/core';
import { useParams } from 'react-router';
import { Badge, Text } from '/@/renderer/components';
2023-01-02 02:04:23 -08:00
import { usePlaylistDetail } from '/@/renderer/features/playlists/queries/playlist-detail-query';
import { LibraryHeader } from '/@/renderer/features/shared';
2023-01-02 02:04:23 -08:00
import { AppRoute } from '/@/renderer/router/routes';
2023-01-03 03:25:21 -08:00
import { formatDurationString } from '/@/renderer/utils';
import { LibraryItem } from '/@/renderer/api/types';
import { useCurrentServer } from '../../../store/auth.store';
2023-01-02 02:04:23 -08:00
interface PlaylistDetailHeaderProps {
2023-07-01 19:10:05 -07:00
background: string;
imagePlaceholderUrl?: string | null;
imageUrl?: string | null;
2023-01-02 02:04:23 -08:00
}
export const PlaylistDetailHeader = forwardRef(
2023-07-01 19:10:05 -07:00
(
{ background, imageUrl, imagePlaceholderUrl }: PlaylistDetailHeaderProps,
ref: Ref<HTMLDivElement>,
) => {
const { playlistId } = useParams() as { playlistId: string };
const server = useCurrentServer();
const detailQuery = usePlaylistDetail({ query: { id: playlistId }, serverId: server?.id });
2023-01-03 00:28:09 -08:00
2023-07-01 19:10:05 -07:00
const metadataItems = [
{
id: 'songCount',
secondary: false,
value: `${detailQuery?.data?.songCount || 0} songs`,
},
{
id: 'duration',
secondary: true,
value:
detailQuery?.data?.duration && formatDurationString(detailQuery.data.duration),
},
];
2023-01-03 03:25:21 -08:00
2023-07-01 19:10:05 -07:00
const isSmartPlaylist = detailQuery?.data?.rules;
2023-07-01 19:10:05 -07:00
return (
<Stack>
<LibraryHeader
ref={ref}
background={background}
imagePlaceholderUrl={imagePlaceholderUrl}
imageUrl={imageUrl}
item={{ route: AppRoute.PLAYLISTS, type: LibraryItem.PLAYLIST }}
title={detailQuery?.data?.name || ''}
>
<Stack>
<Group spacing="sm">
{metadataItems.map((item, index) => (
<Fragment key={`item-${item.id}-${index}`}>
{index > 0 && <Text $noSelect></Text>}
<Text $secondary={item.secondary}>{item.value}</Text>
</Fragment>
))}
{isSmartPlaylist && (
<>
<Text $noSelect></Text>
<Badge
radius="sm"
size="md"
>
Smart Playlist
</Badge>
</>
)}
</Group>
<Text lineClamp={3}>{detailQuery?.data?.description}</Text>
</Stack>
</LibraryHeader>
</Stack>
);
},
);