Changeset 9c1dcc7 for frontend/src/pages/SongDetail.tsx
- Timestamp:
- 02/07/26 19:52:09 (5 months ago)
- Branches:
- main
- Children:
- 8675f75
- Parents:
- 8a47b30
- File:
-
- 1 edited
-
frontend/src/pages/SongDetail.tsx (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
frontend/src/pages/SongDetail.tsx
r8a47b30 r9c1dcc7 3 3 import axiosInstance from "../api/axiosInstance"; 4 4 import { useAuth } from "../context/authContext"; 5 import { usePlayer } from "../context/playerContext"; 5 6 import type { SongDetail as SongDetailType } from "../utils/types"; 6 7 … … 62 63 const { id } = useParams<{ id: string }>(); 63 64 const { user } = useAuth(); 65 const { play, currentSong } = usePlayer(); 64 66 const [song, setSong] = useState<SongDetailType | null>(null); 65 67 const [loading, setLoading] = useState(true); … … 72 74 const response = await axiosInstance.get(`/songs/${id}/details`); 73 75 setSong(response.data); 76 // Don't autoplay - user must click play button 74 77 } catch (err) { 75 78 console.error("Error fetching song details:", err); … … 207 210 208 211 {/* Action buttons */} 209 {/* todo: add add to playlist button */}210 212 <div className="flex items-center gap-3 mt-4"> 213 {/* Play button */} 214 {song.link && ( 215 <button 216 onClick={() => 217 play({ 218 id: song.id, 219 title: song.title, 220 artist: song.releasedBy, 221 cover: song.cover, 222 embedUrl: toEmbedUrl(song.link!), 223 }) 224 } 225 className={`flex items-center gap-2 px-6 py-3 rounded-full text-sm font-semibold transition-all cursor-pointer ${ 226 currentSong?.id === song.id 227 ? "bg-white text-[#1db954]" 228 : "bg-[#1db954] text-black hover:bg-[#1ed760] hover:scale-105" 229 }`} 230 > 231 {currentSong?.id === song.id ? ( 232 <> 233 <svg 234 className="w-5 h-5" 235 fill="currentColor" 236 viewBox="0 0 24 24" 237 > 238 <path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" /> 239 </svg> 240 Now Playing 241 </> 242 ) : ( 243 <> 244 <svg 245 className="w-5 h-5" 246 fill="currentColor" 247 viewBox="0 0 24 24" 248 > 249 <path d="M8 5v14l11-7z" /> 250 </svg> 251 Play Song 252 </> 253 )} 254 </button> 255 )} 256 211 257 {user && ( 212 258 <button … … 248 294 </div> 249 295 250 {/* YouTube embed*/}296 {/* Play button — plays in persistent mini-player */} 251 297 {song.link && ( 252 298 <section className="mb-10"> 253 <div className="rounded-xl overflow-hidden shadow-lg aspect-video bg-black"> 254 <iframe 255 src={toEmbedUrl(song.link)} 256 title={song.title} 257 className="w-full h-full" 258 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 259 allowFullScreen 260 /> 261 </div> 299 {currentSong?.id === song.id ? ( 300 <div className="bg-[#1a1a2e]/60 rounded-xl p-4 flex items-center gap-3"> 301 <div className="w-10 h-10 rounded-full bg-[#1db954] flex items-center justify-center text-black animate-pulse"> 302 <svg 303 className="w-5 h-5" 304 fill="currentColor" 305 viewBox="0 0 24 24" 306 > 307 <path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" /> 308 </svg> 309 </div> 310 <p className="text-[#1db954] font-medium"> 311 Now playing in mini-player below 312 </p> 313 </div> 314 ) : ( 315 <button 316 onClick={() => 317 play({ 318 id: song.id, 319 title: song.title, 320 artist: song.releasedBy, 321 cover: song.cover, 322 embedUrl: toEmbedUrl(song.link!), 323 }) 324 } 325 className="w-full bg-[#1a1a2e]/60 hover:bg-[#1a1a2e]/80 rounded-xl p-4 flex items-center gap-3 transition-colors cursor-pointer group" 326 > 327 <div className="w-10 h-10 rounded-full bg-[#1db954] flex items-center justify-center text-black group-hover:scale-105 transition-transform"> 328 <svg 329 className="w-5 h-5" 330 fill="currentColor" 331 viewBox="0 0 24 24" 332 > 333 <path d="M8 5v14l11-7z" /> 334 </svg> 335 </div> 336 <p className="text-white font-medium">Play this song</p> 337 </button> 338 )} 262 339 </section> 263 340 )}
Note:
See TracChangeset
for help on using the changeset viewer.
