import React, { useCallback, useEffect } from 'react'; import TrackPlayer from 'react-native-track-player'; import { StackParams } from '../types'; import { Text, ScrollView, Dimensions, Button, TouchableOpacity, RefreshControl } from 'react-native'; import { generateTrack, useGetImage } from '../../../utility/JellyfinApi'; import styled from 'styled-components/native'; import { useRoute, RouteProp } from '@react-navigation/native'; import { useDispatch } from 'react-redux'; import { useTypedSelector } from '../../../store'; import { fetchTracksByAlbum } from '../../../store/music/actions'; type Route = RouteProp; const Screen = Dimensions.get('screen'); const AlbumImage = styled.Image` border-radius: 10px; width: ${Screen.width * 0.6}px; height: ${Screen.width * 0.6}px; margin: 10px auto; `; const TrackContainer = styled.View` padding: 15px; border-bottom-width: 1px; border-bottom-color: #eee; flex-direction: row; `; interface TouchableTrackProps { id: string; onPress: (id: string) => void; } const TouchableTrack: React.FC = ({ id, onPress, children }) => { const handlePress = useCallback(() => { return onPress(id); }, [id]); return ( {children} ); }; const Album: React.FC = () => { // Retrieve state const { params: { id } } = useRoute(); const tracks = useTypedSelector((state) => state.music.tracks.entities); const album = useTypedSelector((state) => state.music.albums.entities[id]); const isLoading = useTypedSelector((state) => state.music.tracks.isLoading); const credentials = useTypedSelector((state) => state.settings.jellyfin); // Retrieve helpers const dispatch = useDispatch(); const getImage = useGetImage(); // Set callbacks const selectTrack = useCallback(async (trackId) => { const newTrack = generateTrack(tracks[trackId], credentials); console.log(newTrack); await TrackPlayer.add([ newTrack ]); await TrackPlayer.skip(trackId); TrackPlayer.play(); }, [tracks, credentials]); const playAlbum = useCallback(async () => { const newTracks = album.Tracks.map((trackId) => generateTrack(tracks[trackId], credentials)); await TrackPlayer.removeUpcomingTracks(); await TrackPlayer.add(newTracks); await TrackPlayer.skip(album.Tracks[0]); TrackPlayer.play(); }, [tracks, credentials]); const refresh = useCallback(() => { dispatch(fetchTracksByAlbum(id)); }, [id]); // Retrieve album tracks on load useEffect(refresh, []); return ( } > {album?.Name} {album?.AlbumArtist}