Files
jellyfin-audio-player/src/screens/modals/TrackPopupMenu.tsx

97 lines
3.8 KiB
TypeScript
Raw Normal View History

import React, { useCallback } from 'react';
import { useNavigation, StackActions, useRoute, RouteProp } from '@react-navigation/native';
2023-06-19 23:03:17 +02:00
import { StackParams } from '@/screens/types';
2023-06-19 22:26:41 +02:00
import { useAppDispatch, useTypedSelector } from '@/store';
import { Header, SubHeader } from '@/components/Typography';
import styled from 'styled-components/native';
2023-06-19 22:26:41 +02:00
import { t } from '@/localisation';
2023-06-19 23:03:17 +02:00
import PlayIcon from '@/assets/icons/play.svg';
import DownloadIcon from '@/assets/icons/cloud-down-arrow.svg';
import QueueAppendIcon from '@/assets/icons/queue-append.svg';
import TrashIcon from '@/assets/icons/trash.svg';
2023-06-19 22:26:41 +02:00
import { WrappableButton, WrappableButtonRow } from '@/components/WrappableButtonRow';
import CoverImage from '@/components/CoverImage';
import { queueTrackForDownload, removeDownloadedTrack } from '@/store/downloads/actions';
import usePlayTracks from '@/utility/usePlayTracks';
import { selectIsDownloaded } from '@/store/downloads/selectors';
import { useGetImage } from '@/utility/JellyfinApi/lib';
import { ColoredBlurView } from '@/components/Colors';
2023-04-23 01:15:07 +02:00
type Route = RouteProp<StackParams, 'TrackPopupMenu'>;
const Container = styled.View`
2022-05-11 22:13:42 +02:00
padding: 40px;
margin-top: 20px;
flex: 1 1 auto;
2022-01-01 21:55:32 +01:00
flex-direction: column;
`;
2022-05-11 22:13:42 +02:00
const Artwork = styled(CoverImage)`
margin: 0 auto 25px auto;
`;
function TrackPopupMenu() {
2022-01-02 19:16:12 +01:00
// Retrieve trackId from route
const { params: { trackId } } = useRoute<Route>();
2022-01-02 19:16:12 +01:00
// Retrieve helpers
const navigation = useNavigation();
2022-05-18 22:10:06 +02:00
const dispatch = useAppDispatch();
2022-01-02 02:28:52 +01:00
const playTracks = usePlayTracks();
2022-05-11 22:13:42 +02:00
const getImage = useGetImage();
2022-01-02 19:16:12 +01:00
// Retrieve data from store
const track = useTypedSelector((state) => state.music.tracks.entities[trackId]);
const isDownloaded = useTypedSelector(selectIsDownloaded(trackId));
// Set callback to close the modal
const closeModal = useCallback(() => {
navigation.dispatch(StackActions.popToTop());
}, [navigation]);
2022-01-02 19:16:12 +01:00
// Callback for adding the track to the queue as the next song
const handlePlayNext = useCallback(() => {
2022-01-02 02:28:52 +01:00
playTracks([trackId], { method: 'add-after-currently-playing', play: false });
closeModal();
2022-01-02 02:28:52 +01:00
}, [playTracks, closeModal, trackId]);
2022-01-02 19:16:12 +01:00
// Callback for adding the track to the end of the queue
const handleAddToQueue = useCallback(() => {
2022-01-02 02:28:52 +01:00
playTracks([trackId], { method: 'add-to-end', play: false });
closeModal();
2022-01-02 02:28:52 +01:00
}, [playTracks, closeModal, trackId]);
2022-01-02 19:16:12 +01:00
// Callback for downloading the track
2022-01-02 02:28:52 +01:00
const handleDownload = useCallback(() => {
dispatch(queueTrackForDownload(trackId));
2022-01-02 02:28:52 +01:00
closeModal();
2022-01-02 19:16:12 +01:00
}, [trackId, dispatch, closeModal]);
// Callback for removing the downloaded track
const handleDelete = useCallback(() => {
dispatch(removeDownloadedTrack(trackId));
closeModal();
}, [trackId, dispatch, closeModal]);
return (
<ColoredBlurView>
<Container>
<Artwork src={getImage(track)} />
<Header>{track?.Name}</Header>
<SubHeader style={{ marginBottom: 18 }}>{track?.AlbumArtist} {track?.Album ? '— ' + track?.Album : ''}</SubHeader>
<WrappableButtonRow>
<WrappableButton title={t('play-next')} icon={PlayIcon} onPress={handlePlayNext} />
<WrappableButton title={t('add-to-queue')} icon={QueueAppendIcon} onPress={handleAddToQueue} />
{isDownloaded ? (
<WrappableButton title={t('delete-track')} icon={TrashIcon} onPress={handleDelete} />
) : (
<WrappableButton title={t('download-track')} icon={DownloadIcon} onPress={handleDownload} />
)}
</WrappableButtonRow>
</Container>
</ColoredBlurView>
);
}
export default TrackPopupMenu;