import formatDuration from 'format-duration'; import debounce from 'lodash/debounce'; import { useCallback } from 'react'; import { RiPauseFill, RiPlayFill, RiVolumeUpFill } from 'react-icons/ri'; import { PlayerImage } from '/@/remote/components/player-image'; import { WrappedSlider } from '/@/remote/components/wrapped-slider'; import { useInfo, useSend, useShowImage } from '/@/remote/store'; import { ActionIcon } from '/@/shared/components/action-icon/action-icon'; import { Flex } from '/@/shared/components/flex/flex'; import { Group } from '/@/shared/components/group/group'; import { Rating } from '/@/shared/components/rating/rating'; import { Stack } from '/@/shared/components/stack/stack'; import { Text } from '/@/shared/components/text/text'; import { Tooltip } from '/@/shared/components/tooltip/tooltip'; import { PlayerRepeat, PlayerStatus } from '/@/shared/types/types'; export const RemoteContainer = () => { const { position, repeat, shuffle, song, status, volume } = useInfo(); const send = useSend(); const showImage = useShowImage(); const id = song?.id; const setRating = useCallback( (rating: number) => { send({ event: 'rating', id: id!, rating }); }, [send, id], ); const debouncedSetRating = debounce(setRating, 400); return ( {showImage && ( )} {id && ( {song.name} {song.album} {song.artistName} {song.releaseDate && ( {new Date(song.releaseDate).toLocaleDateString()} )} Plays: {song.playCount} )} { if (!id) return; send({ event: 'favorite', favorite: !song.userFavorite, id }); }} tooltip={{ label: song?.userFavorite ? 'Unfavorite' : 'Favorite', }} variant="transparent" /> {(song?.serverType === 'navidrome' || song?.serverType === 'subsonic') && (
debouncedSetRating(0)} style={{ margin: 'auto' }} value={song.userRating ?? 0} />
)}
send({ event: 'previous' })} tooltip={{ label: 'Previous track', }} variant="default" /> { if (status === PlayerStatus.PLAYING) { send({ event: 'pause' }); } else if (status === PlayerStatus.PAUSED) { send({ event: 'play' }); } }} tooltip={{ label: id && status === PlayerStatus.PLAYING ? 'Pause' : 'Play', }} variant="default" > {id && status === PlayerStatus.PLAYING ? ( ) : ( )} send({ event: 'next' })} tooltip={{ label: 'Next track', }} variant="default" /> send({ event: 'shuffle' })} tooltip={{ label: shuffle ? 'Shuffle tracks' : 'Shuffle disabled', }} variant="default" /> send({ event: 'repeat' })} tooltip={{ label: `Repeat ${ repeat === PlayerRepeat.ONE ? 'One' : repeat === PlayerRepeat.ALL ? 'all' : 'none' }`, }} variant="default" /> {id && position !== undefined && ( formatDuration(value * 1e3)} leftLabel={formatDuration(position * 1e3)} max={song.duration / 1e3} onChangeEnd={(e) => send({ event: 'position', position: e })} rightLabel={formatDuration(song.duration)} value={position} /> )} } max={100} onChangeEnd={(e) => send({ event: 'volume', volume: e })} rightLabel={ {volume ?? 0} } value={volume ?? 0} />
); };