|
|
|
@ -2,9 +2,12 @@
|
|
|
|
|
|
|
|
|
|
import { useState } from 'react';
|
|
|
|
|
|
|
|
|
|
import { useShallow } from 'zustand/react/shallow';
|
|
|
|
|
|
|
|
|
|
import ButtonProvide from './ButtonProvide';
|
|
|
|
|
import VolumeBar from './VolumeBar';
|
|
|
|
|
|
|
|
|
|
import { useAudioStore } from '@/store';
|
|
|
|
|
export default function Volume({
|
|
|
|
|
value,
|
|
|
|
|
className,
|
|
|
|
@ -14,10 +17,26 @@ export default function Volume({
|
|
|
|
|
className?: string;
|
|
|
|
|
onChange: (value: number) => void;
|
|
|
|
|
}) {
|
|
|
|
|
const { preMuteVolume, setPreMuteVolume } = useAudioStore(
|
|
|
|
|
useShallow((state) => {
|
|
|
|
|
return {
|
|
|
|
|
preMuteVolume: state.preMuteVolume,
|
|
|
|
|
setPreMuteVolume: state.setPreMuteVolume,
|
|
|
|
|
};
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const [hover, setHover] = useState<boolean>(false);
|
|
|
|
|
|
|
|
|
|
const handleClick = () => {
|
|
|
|
|
onChange(value > 0 ? 0 : 50);
|
|
|
|
|
const handleMute = () => {
|
|
|
|
|
if (value > 0) {
|
|
|
|
|
// 当前有音量
|
|
|
|
|
setPreMuteVolume(value);
|
|
|
|
|
onChange(0);
|
|
|
|
|
} else {
|
|
|
|
|
// 当前无音量
|
|
|
|
|
onChange(preMuteVolume);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
@ -29,7 +48,7 @@ export default function Volume({
|
|
|
|
|
{/* 音量条 */}
|
|
|
|
|
<VolumeBar value={value} className={`${!hover && '!hidden'} transition-all`} onChange={onChange} />
|
|
|
|
|
{/* 按钮 */}
|
|
|
|
|
<ButtonProvide className="group" onClick={handleClick}>
|
|
|
|
|
<ButtonProvide className="group" onClick={handleMute}>
|
|
|
|
|
{value >= 50 ? (
|
|
|
|
|
<VolumeFull hover={hover} />
|
|
|
|
|
) : value === 0 ? (
|
|
|
|
|