|
96 | 96 |
|
97 | 97 | // Player callbacks |
98 | 98 | const onProgress = (track) => { |
99 | | - if (!track) return; |
| 99 | + if (!track || !player) return; |
100 | 100 |
|
101 | 101 | const currentLoadingState = track.webAudioLoadingState || 'NONE'; |
102 | 102 | const nextLoadingState = player.nextTrack?.webAudioLoadingState || 'NONE'; |
|
113 | 113 | }; |
114 | 114 |
|
115 | 115 | const onTrackChange = (track) => { |
116 | | - if (!track) return; |
| 116 | + if (!track || !player) return; |
117 | 117 | updateState({ |
118 | 118 | currentTrack: track, |
119 | 119 | isPlaying: !track.isPaused, |
|
124 | 124 | // Event handlers |
125 | 125 | const controls = { |
126 | 126 | playPause: () => { |
| 127 | + if (!player) return; |
127 | 128 | player.togglePlayPause(); |
128 | 129 | updateState({ isPlaying: !player.currentTrack?.isPaused }); |
129 | 130 | }, |
130 | 131 |
|
131 | 132 | previous: () => { |
| 133 | + if (!player) return; |
132 | 134 | player.playPrevious(); |
133 | 135 | if (player.currentTrack?.isPaused) player.play(); |
134 | 136 | }, |
135 | 137 |
|
136 | 138 | next: () => { |
| 139 | + if (!player) return; |
137 | 140 | player.playNext(); |
138 | 141 | if (player.currentTrack?.isPaused) player.play(); |
139 | 142 | }, |
140 | 143 |
|
141 | 144 | skipToEnd: () => { |
142 | | - if (player.currentTrack) { |
143 | | - player.currentTrack.seekToEnd(5); |
144 | | - console.log('Skipping to end for gapless test'); |
145 | | - } |
| 145 | + if (!player?.currentTrack) return; |
| 146 | + player.currentTrack.seekToEnd(5); |
| 147 | + console.log('Skipping to end for gapless test'); |
146 | 148 | }, |
147 | 149 |
|
148 | 150 | volume: (e) => { |
| 151 | + if (!player) return; |
149 | 152 | const vol = e.target.value; |
150 | 153 | updateState({ volume: vol }); |
151 | 154 | player.setVolume(vol / 100); |
152 | 155 | }, |
153 | 156 |
|
154 | 157 | seek: (e) => { |
155 | | - if (!player.currentTrack?.duration) return; |
| 158 | + if (!player?.currentTrack?.duration) return; |
156 | 159 | const rect = e.currentTarget.getBoundingClientRect(); |
157 | 160 | const x = e.clientX - rect.left; |
158 | 161 | const percentage = Math.max(0, Math.min(1, x / rect.width)); |
|
161 | 164 | onProgress(player.currentTrack); |
162 | 165 | }, |
163 | 166 |
|
164 | | - selectTrack: (idx) => player.gotoTrack(idx, true) |
| 167 | + selectTrack: (idx) => { |
| 168 | + if (!player) return; |
| 169 | + player.gotoTrack(idx, true); |
| 170 | + } |
165 | 171 | }; |
166 | 172 |
|
167 | 173 | // Initialize |
|
0 commit comments