From 2d24ab3993f5bde29dad349f021213f515422164 Mon Sep 17 00:00:00 2001 From: mackt <1033530438@qq.com> Date: Fri, 12 Apr 2024 15:05:41 +0800 Subject: [PATCH] feat(component): Single Card. --- public/img/audio-player/CD.png | Bin 0 -> 45755 bytes src/components/AudioPlayer/Player.tsx | 14 +++- src/components/AudioPlayer/PlayerBar.tsx | 36 +++++++- src/components/AudioPlayer/PlayerCard.tsx | 82 +++++++++++++++++++ src/components/AudioPlayer/PlayerControl.tsx | 9 +- src/components/AudioPlayer/index.module.css | 7 ++ src/store/audio.ts | 14 ++++ 7 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 public/img/audio-player/CD.png create mode 100644 src/components/AudioPlayer/PlayerCard.tsx diff --git a/public/img/audio-player/CD.png b/public/img/audio-player/CD.png new file mode 100644 index 0000000000000000000000000000000000000000..ae790dded9b9f0b86630f4ed11f8fdec58a8d5c2 GIT binary patch literal 45755 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
mC>1Sy6PLGs_AI-N0YG}c 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 P00000NkvXXu0mjfOMR?| literal 0 HcmV?d00001 diff --git a/src/components/AudioPlayer/Player.tsx b/src/components/AudioPlayer/Player.tsx index f17a820..87237e4 100644 --- a/src/components/AudioPlayer/Player.tsx +++ b/src/components/AudioPlayer/Player.tsx @@ -11,15 +11,23 @@ import PlayerControl from './PlayerControl'; import useAudioStore from '@/store/audio'; -export default function AudioPlayer({ className }: { className?: string }) { - const { audioId, order, playQueue, switchSongByDiff, setOrder } = useAudioStore( +export default function AudioPlayer({ + className, + onSwitchShowCard, +}: { + className?: string; + onSwitchShowCard: () => void; +}) { + const { audioId, order, playQueue, showCard, switchSongByDiff, setOrder, setShowCard } = useAudioStore( useShallow((state) => { return { audioId: state.audioId, order: state.order, playQueue: state.playQueue, + showCard: state.showCard, setOrder: state.setOrder, switchSongByDiff: state.switchSongByDiff, + setShowCard: state.setShowCard, }; }), ); @@ -127,6 +135,7 @@ export default function AudioPlayer({ className }: { className?: string }) { order={order} audio={audio} duration={duration} + showCard={showCard} onPlay={handlePlay} onPrev={() => handleSwitchAudio(-1)} onNext={() => handleSwitchAudio(1)} @@ -134,6 +143,7 @@ export default function AudioPlayer({ className }: { className?: string }) { className={className} trackProgress={trackProgress} onChangeProgress={handleChangeProgress} + onSwitchShowCard={onSwitchShowCard} /> ); } diff --git a/src/components/AudioPlayer/PlayerBar.tsx b/src/components/AudioPlayer/PlayerBar.tsx index b267478..21a99f5 100644 --- a/src/components/AudioPlayer/PlayerBar.tsx +++ b/src/components/AudioPlayer/PlayerBar.tsx @@ -3,12 +3,32 @@ import { useEffect } from 'react'; import dynamic from 'next/dynamic'; +import { useShallow } from 'zustand/react/shallow'; import Player from './Player'; +import PlayerCard from './PlayerCard'; -// import { debounce } from 'lodash'; +import useAudioStore from '@/store/audio'; const PlayerBar = ({ className }: { className?: string }) => { + const { audioId, order, playQueue, showCard, switchSongByDiff, setOrder, setShowCard } = useAudioStore( + useShallow((state) => { + return { + audioId: state.audioId, + order: state.order, + playQueue: state.playQueue, + showCard: state.showCard, + setOrder: state.setOrder, + switchSongByDiff: state.switchSongByDiff, + setShowCard: state.setShowCard, + }; + }), + ); + + const handleSwitchShowCard = () => { + setShowCard(!showCard); + }; + // let oldScrollY: number = 0; // function handleScroll() { // if (window.scrollY > oldScrollY) { @@ -23,6 +43,13 @@ const PlayerBar = ({ className }: { className?: string }) => { // oldScrollY = window.scrollY; // } + useEffect(() => { + // window.addEventListener('scroll', handleScroll); + // return () => { + // window.removeEventListener('scroll', handleScroll); + // }; + }, []); + useEffect(() => { // window.addEventListener('scroll', handleScroll); // return () => { @@ -42,9 +69,12 @@ const PlayerBar = ({ className }: { className?: string }) => { className={`fixed w-[100vw] h-[130px] bg-[#fff] shadow-lg shadow-black-[0_0_10px] z-10 ${className}`} style={{ bottom: 0 }} > -
- + {/* 播放器 */} +
+
+ {/* 单曲卡片 */} +
); }; diff --git a/src/components/AudioPlayer/PlayerCard.tsx b/src/components/AudioPlayer/PlayerCard.tsx new file mode 100644 index 0000000..cecfcb8 --- /dev/null +++ b/src/components/AudioPlayer/PlayerCard.tsx @@ -0,0 +1,82 @@ +import Image from 'next/image'; +import { useShallow } from 'zustand/react/shallow'; + +import styles from './index.module.css'; + +import { SongCardList } from '@/components'; +import useAudioStore from '@/store/audio'; + +interface Prop { + // onClose: () => void; + show: boolean; + className?: string; +} + +export default function PlayerCard({ show, className }: Prop) { + const { audioId, playQueue } = useAudioStore( + useShallow((state) => { + return { + audioId: state.audioId, + playQueue: state.playQueue, + }; + }), + ); + + const miniClass = 'w-100vw translate-y-100vh'; // 缩小时的样式 + const largeClass = 'w-[100vw] translate-y-[-130px]'; // 放大后的样式 + + const audioInfo = playQueue.find((item) => item.id === audioId); + + console.log(audioInfo); + + return ( +
+
+ {/* 单曲信息 */} +
+ {/* 专辑封面 */} + {/* 阴影 */} +
+
+ {audioInfo?.pic && ( + pic + )} +
+
+ + {/* 歌曲名 */} +

{audioInfo?.title ?? ''}

+ {/* 歌手/专辑 */} + {audioInfo?.artist && audioInfo?.album && ( +

{`${audioInfo.artist}/${audioInfo.album}`}

+ )} + {/* 歌词 */} +
{audioInfo?.lrc ?
:
暂无歌词
}
+
+ + {/* 播放列表 */} +
+ + +
+
+
+ ); +} diff --git a/src/components/AudioPlayer/PlayerControl.tsx b/src/components/AudioPlayer/PlayerControl.tsx index 8efddae..ebfe27d 100644 --- a/src/components/AudioPlayer/PlayerControl.tsx +++ b/src/components/AudioPlayer/PlayerControl.tsx @@ -1,5 +1,7 @@ 'use client'; +// 样式层 + import Image from 'next/image'; import { secondToDate } from '@/utils/time'; @@ -12,6 +14,8 @@ interface Props { audio: SongInfo | null; order: PlayOrder; playStatus: boolean; + showCard: boolean; + onSwitchShowCard: () => void; onPlay: () => void; onOrder: () => void; onPrev: () => void; @@ -26,11 +30,13 @@ export default function AudioPlayer({ audio, order, playStatus, + showCard, onPlay, onOrder, onPrev, onNext, onChangeProgress, + onSwitchShowCard, trackProgress, duration, className, @@ -51,7 +57,8 @@ export default function AudioPlayer({
{/* 专辑封面 */}
{audio?.pic && ( music diff --git a/src/components/AudioPlayer/index.module.css b/src/components/AudioPlayer/index.module.css index 8bca1de..20cbc9e 100644 --- a/src/components/AudioPlayer/index.module.css +++ b/src/components/AudioPlayer/index.module.css @@ -24,6 +24,13 @@ background-size: 28px; } +/* 专辑封面 阴影 */ +.album_shoadow { + background: rgba(0, 0, 0, 0.08); + box-shadow: 27px 10px 30px -12px rgba(0, 0, 0, 0.25); + border-radius: 3px; +} + .range-input { -webkit-appearance: none; width: 100%; diff --git a/src/store/audio.ts b/src/store/audio.ts index b4c8f0e..94271b6 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -12,7 +12,11 @@ interface AuioState { order: PlayOrder; /** 播放器显示状态 */ show: boolean; + /** 单曲卡牌展示 */ + showCard: boolean; + /** 当前音频id */ audioId: string; + audioInfo: SongInfo | null; /** 歌单列表 */ playList: SongInfo[]; /** 播放队列 */ @@ -21,6 +25,8 @@ interface AuioState { setAudioId: (id: string) => void; // 显示/隐藏播放器 setShow: (value: boolean) => void; + // 显示/隐藏单曲卡片 + setShowCard: (value: boolean) => void; // 设置播放列表 setPlayList: (params: { id: string; list: SongInfo[] }) => void; // 切换歌曲 -1: 上一首 1: 下一首 @@ -94,9 +100,11 @@ const useAuioState = create()( order: 'list_loop', playStatus: false, show: false, + showCard: false, playListId: '', playList: [], playQueue: [], + audioInfo: get()?.playList.length ? get().playList.find((item) => item.id === get().audioId) : null, setAudioId, setOrder, setShow: (value) => @@ -105,6 +113,12 @@ const useAuioState = create()( state.show = value; }), ), + setShowCard: (value) => + set( + produce((state) => { + state.showCard = value; + }), + ), setPlayList: (params) => { set( produce((state) => {