import React, { useCallback, useEffect } from 'react'; import { useRoute, RouteProp, useNavigation } from '@react-navigation/native'; import { useAppDispatch, useTypedSelector } from '@/store'; import TrackListView from './components/TrackListView'; import { fetchAlbum, fetchTracksByAlbum } from '@/store/music/actions'; import { differenceInDays } from 'date-fns'; import { ALBUM_CACHE_AMOUNT_OF_DAYS } from '@/CONSTANTS'; import { t } from '@/localisation'; import { NavigationProp, StackParams } from 'screens/types'; import { SubHeader, Text } from '@/components/Typography'; import { ScrollView } from 'react-native-gesture-handler'; import { useGetImage } from '@/utility/JellyfinApi'; import styled from 'styled-components'; import { Dimensions, Pressable } from 'react-native'; import AlbumImage from './components/AlbumImage'; type Route = RouteProp; const Screen = Dimensions.get('screen'); const Cover = styled(AlbumImage)` height: ${Screen.width / 2.8}px; width: ${Screen.width / 2.8}px; border-radius: 12px; margin-bottom: 8px; `; function SimilarAlbum({ id }: { id: string }) { const navigation = useNavigation(); const getImage = useGetImage(); const album = useTypedSelector((state) => state.music.albums.entities[id]); const handlePress = useCallback(() => { album && navigation.push('Album', { id, album }); }, [id, album, navigation]); return ( ({ opacity: pressed ? 0.5 : 1.0, width: Screen.width / 2.8, marginRight: 12 })} onPress={handlePress} > {album?.Name} {album?.Artists.join(', ')} ); } const Album: React.FC = () => { const { params: { id } } = useRoute(); const dispatch = useAppDispatch(); // Retrieve the album data from the store const album = useTypedSelector((state) => state.music.albums.entities[id]); const albumTracks = useTypedSelector((state) => state.music.tracks.byAlbum[id]); // Define a function for refreshing this entity const refresh = useCallback(() => { dispatch(fetchTracksByAlbum(id)); dispatch(fetchAlbum(id)); }, [id, dispatch]); // Auto-fetch the track data periodically useEffect(() => { if (!album?.lastRefreshed || differenceInDays(album?.lastRefreshed, new Date()) > ALBUM_CACHE_AMOUNT_OF_DAYS) { refresh(); } }, [album?.lastRefreshed, refresh]); return ( {album?.Overview ? ( {album?.Overview} ) : null} {album?.Similar?.length ? ( <> {t('similar-albums')} {album.Similar.map((id) => ( ))} ) : null} ); }; export default Album;