feishin/src/renderer/features/player/components/playerbar.tsx

127 lines
3.8 KiB
TypeScript
Raw Normal View History

import { useCallback, MouseEvent } from 'react';
2022-12-19 15:59:14 -08:00
import styled from 'styled-components';
import {
usePlaybackType,
useSettingsStore,
useGeneralSettings,
} from '/@/renderer/store/settings.store';
2022-12-19 15:59:14 -08:00
import { PlaybackType } from '/@/renderer/types';
import { AudioPlayer } from '/@/renderer/components';
import {
2023-07-01 19:10:05 -07:00
useCurrentPlayer,
useCurrentStatus,
useMuted,
usePlayer1Data,
usePlayer2Data,
usePlayerControls,
useVolume,
useSetFullScreenPlayerStore,
useFullScreenPlayerStore,
2022-12-19 15:59:14 -08:00
} from '/@/renderer/store';
import { CenterControls } from './center-controls';
import { LeftControls } from './left-controls';
import { RightControls } from './right-controls';
import { PlayersRef } from '/@/renderer/features/player/ref/players-ref';
2024-07-03 08:47:26 +00:00
import { updateSong } from '/@/renderer/features/player/update-remote-song';
2022-12-19 15:59:14 -08:00
const PlayerbarContainer = styled.div`
2023-07-01 19:10:05 -07:00
width: 100vw;
height: 100%;
border-top: var(--playerbar-border-top);
2022-12-19 15:59:14 -08:00
`;
const PlayerbarControlsGrid = styled.div`
2023-07-01 19:10:05 -07:00
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
gap: 1rem;
height: 100%;
2023-09-15 20:42:38 -07:00
@media (width <= 768px) {
2023-07-01 19:10:05 -07:00
grid-template-columns: minmax(0, 0.5fr) minmax(0, 1fr) minmax(0, 0.5fr);
}
2022-12-19 15:59:14 -08:00
`;
const RightGridItem = styled.div`
2023-07-01 19:10:05 -07:00
align-self: center;
width: 100%;
height: 100%;
overflow: hidden;
2022-12-19 15:59:14 -08:00
`;
const LeftGridItem = styled.div`
2023-07-01 19:10:05 -07:00
width: 100%;
height: 100%;
overflow: hidden;
2022-12-19 15:59:14 -08:00
`;
const CenterGridItem = styled.div`
2023-07-01 19:10:05 -07:00
display: flex;
flex-direction: column;
gap: 0.5rem;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
overflow: hidden;
2022-12-19 15:59:14 -08:00
`;
export const Playerbar = () => {
2023-07-01 19:10:05 -07:00
const playersRef = PlayersRef;
const settings = useSettingsStore((state) => state.playback);
const { playerbarOpenDrawer } = useGeneralSettings();
const playbackType = usePlaybackType();
2023-07-01 19:10:05 -07:00
const volume = useVolume();
const player1 = usePlayer1Data();
const player2 = usePlayer2Data();
const status = useCurrentStatus();
const player = useCurrentPlayer();
const muted = useMuted();
const { autoNext } = usePlayerControls();
const { expanded: isFullScreenPlayerExpanded } = useFullScreenPlayerStore();
const setFullScreenPlayerStore = useSetFullScreenPlayerStore();
const handleToggleFullScreenPlayer = (e?: MouseEvent<HTMLDivElement> | KeyboardEvent) => {
e?.stopPropagation();
setFullScreenPlayerStore({ expanded: !isFullScreenPlayerExpanded });
};
2022-12-19 15:59:14 -08:00
2023-07-01 19:10:05 -07:00
const autoNextFn = useCallback(() => {
const playerData = autoNext();
2024-07-03 08:47:26 +00:00
updateSong(playerData.current.song);
2023-07-01 19:10:05 -07:00
}, [autoNext]);
2023-07-01 19:10:05 -07:00
return (
<PlayerbarContainer
onClick={playerbarOpenDrawer ? handleToggleFullScreenPlayer : undefined}
>
2023-07-01 19:10:05 -07:00
<PlayerbarControlsGrid>
<LeftGridItem>
<LeftControls />
</LeftGridItem>
<CenterGridItem>
<CenterControls playersRef={playersRef} />
</CenterGridItem>
<RightGridItem>
<RightControls />
</RightGridItem>
</PlayerbarControlsGrid>
{playbackType === PlaybackType.WEB && (
2023-07-01 19:10:05 -07:00
<AudioPlayer
ref={playersRef}
autoNext={autoNextFn}
crossfadeDuration={settings.crossfadeDuration}
crossfadeStyle={settings.crossfadeStyle}
currentPlayer={player}
muted={muted}
playbackStyle={settings.style}
player1={player1}
player2={player2}
status={status}
style={settings.style}
volume={(volume / 100) ** 2}
/>
)}
</PlayerbarContainer>
);
2022-12-19 15:59:14 -08:00
};