[DEV] integrate menue on thack

This commit is contained in:
Edouard DUPIN 2024-08-30 00:35:00 +02:00
parent 1dba2ab9a1
commit 093994b4b3
7 changed files with 121 additions and 86 deletions

View File

@ -2,16 +2,24 @@ import { Suspense } from 'react';
import { Flex, Text } from '@chakra-ui/react'; import { Flex, Text } from '@chakra-ui/react';
import { LuMusic2, LuPlay } from 'react-icons/lu'; import { LuMusic2, LuPlay } from 'react-icons/lu';
import { useNavigate } from 'react-router-dom';
import { Track } from '@/back-api'; import { Track } from '@/back-api';
import { Covers } from '@/components/Cover'; import { Covers } from '@/components/Cover';
import { ContextMenu, MenuElement } from '@/components/contextMenu/ContextMenu';
import { DisplayTrackSkeleton } from '@/components/track/DisplayTrackSkeleton'; import { DisplayTrackSkeleton } from '@/components/track/DisplayTrackSkeleton';
import { useActivePlaylistService } from '@/service/ActivePlaylist'; import { useActivePlaylistService } from '@/service/ActivePlaylist';
export type DisplayTrackProps = { export type DisplayTrackProps = {
track: Track; track: Track;
onClick?: () => void;
contextMenu?: MenuElement[];
}; };
export const DisplayTrack = ({ track }: DisplayTrackProps) => { export const DisplayTrack = ({
track,
onClick,
contextMenu,
}: DisplayTrackProps) => {
const { trackActive } = useActivePlaylistService(); const { trackActive } = useActivePlaylistService();
return ( return (
<Flex direction="row" width="full" height="full"> <Flex direction="row" width="full" height="full">
@ -26,6 +34,7 @@ export const DisplayTrack = ({ track }: DisplayTrackProps) => {
<LuMusic2 size="50" height="full" /> <LuMusic2 size="50" height="full" />
) )
} }
onClick={onClick}
/> />
<Flex <Flex
direction="column" direction="column"
@ -33,6 +42,7 @@ export const DisplayTrack = ({ track }: DisplayTrackProps) => {
height="full" height="full"
paddingLeft="5px" paddingLeft="5px"
overflowX="hidden" overflowX="hidden"
onClick={onClick}
> >
<Text <Text
as="span" as="span"
@ -49,6 +59,7 @@ export const DisplayTrack = ({ track }: DisplayTrackProps) => {
[{track.track}] {track.name} [{track.track}] {track.name}
</Text> </Text>
</Flex> </Flex>
<ContextMenu elements={contextMenu} />
</Flex> </Flex>
); );
}; };

View File

@ -13,14 +13,14 @@ import { useSpecificGender } from '@/service/Gender';
export type DisplayTrackProps = { export type DisplayTrackProps = {
track: Track; track: Track;
onClick?: () => void;
}; };
export const DisplayTrackFull = ({ track }: DisplayTrackProps) => { export const DisplayTrackFull = ({ track, onClick }: DisplayTrackProps) => {
const { trackActive } = useActivePlaylistService(); const { trackActive } = useActivePlaylistService();
const { dataAlbum } = useSpecificAlbum(track?.albumId); const { dataAlbum } = useSpecificAlbum(track?.albumId);
const { dataGender } = useSpecificGender(track?.genderId); const { dataGender } = useSpecificGender(track?.genderId);
const { dataArtists } = useSpecificArtists(track?.artists); const { dataArtists } = useSpecificArtists(track?.artists);
return ( return (
<Suspense fallback={<DisplayTrackSkeleton />}>
<Flex direction="row" width="full" height="full"> <Flex direction="row" width="full" height="full">
<Covers <Covers
data={track?.covers} data={track?.covers}
@ -34,6 +34,7 @@ export const DisplayTrackFull = ({ track }: DisplayTrackProps) => {
<LuMusic2 size="50" /> <LuMusic2 size="50" />
) )
} }
onClick={onClick}
/> />
<Flex <Flex
direction="column" direction="column"
@ -41,6 +42,7 @@ export const DisplayTrackFull = ({ track }: DisplayTrackProps) => {
height="full" height="full"
paddingLeft="5px" paddingLeft="5px"
overflowX="hidden" overflowX="hidden"
onClick={onClick}
> >
<Text <Text
as="span" as="span"
@ -105,6 +107,5 @@ export const DisplayTrackFull = ({ track }: DisplayTrackProps) => {
)} )}
</Flex> </Flex>
</Flex> </Flex>
</Suspense>
); );
}; };

View File

@ -97,9 +97,11 @@ export const AlbumDetailPage = () => {
boxShadow: 'outline-over', boxShadow: 'outline-over',
bgColor: mode('#FFFFFFF7', '#000000F7'), bgColor: mode('#FFFFFFF7', '#000000F7'),
}} }}
onClick={() => onSelectItem(data.id)}
> >
<DisplayTrack track={data} /> <DisplayTrack
track={data}
onClick={() => onSelectItem(data.id)}
/>
</Box> </Box>
))} ))}
<EmptyEnd /> <EmptyEnd />

View File

@ -1,12 +1,13 @@
import { Box, Flex, Text } from '@chakra-ui/react'; import { Box, Flex, Text } from '@chakra-ui/react';
import { LuDisc3, LuUser } from 'react-icons/lu'; import { LuDisc3, LuUser } from 'react-icons/lu';
import { useParams } from 'react-router-dom'; import { Route, Routes, useNavigate, useParams } from 'react-router-dom';
import { Covers } from '@/components/Cover'; import { Covers } from '@/components/Cover';
import { EmptyEnd } from '@/components/EmptyEnd'; import { EmptyEnd } from '@/components/EmptyEnd';
import { PageLayout } from '@/components/Layout/PageLayout'; import { PageLayout } from '@/components/Layout/PageLayout';
import { PageLayoutInfoCenter } from '@/components/Layout/PageLayoutInfoCenter'; import { PageLayoutInfoCenter } from '@/components/Layout/PageLayoutInfoCenter';
import { TopBar } from '@/components/TopBar/TopBar'; import { TopBar } from '@/components/TopBar/TopBar';
import { TrackEditPopUp } from '@/components/popup/TrackEditPopUp';
import { DisplayTrack } from '@/components/track/DisplayTrack'; import { DisplayTrack } from '@/components/track/DisplayTrack';
import { useActivePlaylistService } from '@/service/ActivePlaylist'; import { useActivePlaylistService } from '@/service/ActivePlaylist';
import { useSpecificAlbum } from '@/service/Album'; import { useSpecificAlbum } from '@/service/Album';
@ -23,8 +24,8 @@ export const ArtistAlbumDetailPage = () => {
const { dataArtist } = useSpecificArtist(artistIdInt); const { dataArtist } = useSpecificArtist(artistIdInt);
const { dataAlbum } = useSpecificAlbum(albumIdInt); const { dataAlbum } = useSpecificAlbum(albumIdInt);
const { tracksOnAnAlbum } = useTracksOfAnAlbum(albumIdInt); const { tracksOnAnAlbum } = useTracksOfAnAlbum(albumIdInt);
const navigate = useNavigate();
const onSelectItem = (trackId: number) => { const onSelectItem = (trackId: number) => {
//navigate(`/artist/${artistIdInt}/album/${albumId}`);
let currentPlay = 0; let currentPlay = 0;
const listTrackId: number[] = []; const listTrackId: number[] = [];
if (!tracksOnAnAlbum) { if (!tracksOnAnAlbum) {
@ -126,13 +127,29 @@ export const ArtistAlbumDetailPage = () => {
boxShadow: 'outline-over', boxShadow: 'outline-over',
bgColor: mode('#FFFFFFF7', '#000000F7'), bgColor: mode('#FFFFFFF7', '#000000F7'),
}} }}
onClick={() => onSelectItem(data.id)}
> >
<DisplayTrack track={data} /> <DisplayTrack
track={data}
onClick={() => onSelectItem(data.id)}
contextMenu={[
{
name: 'Edit',
onClick: () => {
navigate(
`/artist/${artistIdInt}/album/${albumId}/edit/${data.id}`
);
},
},
{ name: 'Add Playlist', onClick: () => {} },
]}
/>
</Box> </Box>
))} ))}
<EmptyEnd /> <EmptyEnd />
</Flex> </Flex>
<Routes>
<Route path="edit/:trackId" element={<TrackEditPopUp />} />
</Routes>
</PageLayout> </PageLayout>
</> </>
); );

View File

@ -12,7 +12,7 @@ export const ArtistRoutes = () => {
<Route path="all" element={<ArtistsPage />} /> <Route path="all" element={<ArtistsPage />} />
<Route path=":artistId" element={<ArtistDetailPage />} /> <Route path=":artistId" element={<ArtistDetailPage />} />
<Route <Route
path=":artistId/album/:albumId" path=":artistId/album/:albumId/*"
element={<ArtistAlbumDetailPage />} element={<ArtistAlbumDetailPage />}
/> />
<Route path="*" element={<Error404 />} /> <Route path="*" element={<Error404 />} />

View File

@ -95,9 +95,11 @@ export const GenderDetailPage = () => {
boxShadow: 'outline-over', boxShadow: 'outline-over',
bgColor: mode('#FFFFFFF7', '#000000F7'), bgColor: mode('#FFFFFFF7', '#000000F7'),
}} }}
onClick={() => onSelectItem(data.id)}
> >
<DisplayTrack track={data} /> <DisplayTrack
track={data}
onClick={() => onSelectItem(data.id)}
/>
</Box> </Box>
))} ))}
<EmptyEnd /> <EmptyEnd />

View File

@ -90,9 +90,11 @@ export const TracksStartLetterDetailPage = () => {
boxShadow: 'outline-over', boxShadow: 'outline-over',
bgColor: mode('#FFFFFFF7', '#000000F7'), bgColor: mode('#FFFFFFF7', '#000000F7'),
}} }}
onClick={() => onSelectItem(data.id)}
> >
<DisplayTrackFull track={data} /> <DisplayTrackFull
track={data}
onClick={() => onSelectItem(data.id)}
/>
</Box> </Box>
))} ))}
<EmptyEnd /> <EmptyEnd />