team-2/CHALLENGE_2/sleepysound/lib/pages/now_playing_page.dart

278 lines
12 KiB
Dart
Raw Normal View History

2025-08-02 03:04:20 +02:00
import 'package:flutter/material.dart';
2025-08-02 04:16:15 +02:00
class NowPlayingPage extends StatefulWidget {
2025-08-02 03:04:20 +02:00
const NowPlayingPage({super.key});
2025-08-02 04:16:15 +02:00
@override
State<NowPlayingPage> createState() => _NowPlayingPageState();
}
class _NowPlayingPageState extends State<NowPlayingPage> {
// Mock data for demonstration
bool isPlaying = false;
String currentSong = "Summer Vibes";
String currentArtist = "Chill Collective";
double progress = 0.3; // 30% through song
List<Map<String, String>> upcomingQueue = [
{"title": "Ocean Breeze", "artist": "Lofi Dreams", "votes": "12", "position": "1", "imageUrl": "https://i.scdn.co/image/ocean"},
{"title": "Sunset Melody", "artist": "Acoustic Soul", "votes": "8", "position": "2", "imageUrl": "https://i.scdn.co/image/sunset"},
{"title": "Peaceful Waters", "artist": "Nature Sounds", "votes": "5", "position": "3", "imageUrl": "https://i.scdn.co/image/water"},
{"title": "Summer Nights", "artist": "Chill Vibes", "votes": "3", "position": "4", "imageUrl": "https://i.scdn.co/image/night"},
];
2025-08-02 03:04:20 +02:00
@override
Widget build(BuildContext context) {
2025-08-02 03:42:56 +02:00
return Container(
color: const Color(0xFF121212),
2025-08-02 04:16:15 +02:00
child: Padding(
padding: const EdgeInsets.all(20.0),
2025-08-02 03:42:56 +02:00
child: Column(
children: [
2025-08-02 04:16:15 +02:00
// Current Playing Section
Expanded(
flex: 2,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Album Art Placeholder
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
color: const Color(0xFF6366F1).withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: const Color(0xFF6366F1), width: 2),
),
child: const Icon(
Icons.music_note,
size: 80,
color: Color(0xFF6366F1),
),
),
const SizedBox(height: 20),
// Song Info
Text(
currentSong,
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
currentArtist,
style: const TextStyle(
fontSize: 18,
color: Colors.grey,
),
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
// Progress Bar
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Column(
children: [
LinearProgressIndicator(
value: progress,
backgroundColor: Colors.grey[800],
valueColor: const AlwaysStoppedAnimation<Color>(Color(0xFF6366F1)),
),
const SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"${(progress * 3.5).toInt()}:${((progress * 3.5 % 1) * 60).toInt().toString().padLeft(2, '0')}",
style: const TextStyle(color: Colors.grey, fontSize: 12),
),
const Text(
"3:30",
style: TextStyle(color: Colors.grey, fontSize: 12),
),
],
),
],
),
),
],
2025-08-02 03:42:56 +02:00
),
),
2025-08-02 04:16:15 +02:00
// Queue Section
Expanded(
flex: 1,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Up Next",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
Row(
children: [
Container(
width: 8,
height: 8,
decoration: const BoxDecoration(
color: Color(0xFF22C55E),
shape: BoxShape.circle,
),
),
const SizedBox(width: 6),
const Text(
"Live Queue",
style: TextStyle(
fontSize: 12,
color: Color(0xFF22C55E),
fontWeight: FontWeight.w500,
),
),
],
),
],
),
const SizedBox(height: 15),
Expanded(
child: ListView.builder(
itemCount: upcomingQueue.length,
itemBuilder: (context, index) {
final song = upcomingQueue[index];
return Container(
margin: const EdgeInsets.only(bottom: 10),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: const Color(0xFF1E1E1E),
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: [
// Queue Position
Container(
width: 24,
height: 24,
decoration: BoxDecoration(
color: index < 2
? const Color(0xFF6366F1)
: const Color(0xFF6366F1).withOpacity(0.3),
shape: BoxShape.circle,
),
child: Center(
child: Text(
'${index + 1}',
style: TextStyle(
color: index < 2 ? Colors.white : Colors.grey,
fontWeight: FontWeight.bold,
fontSize: 10,
),
),
),
),
const SizedBox(width: 8),
Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: const Color(0xFF6366F1).withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
),
child: song["imageUrl"] != null && song["imageUrl"]!.isNotEmpty
? ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
song["imageUrl"]!,
width: 40,
height: 40,
fit: BoxFit.cover,
errorBuilder: (context, error, stackTrace) {
return const Icon(
Icons.music_note,
color: Color(0xFF6366F1),
size: 20,
);
},
),
)
: const Icon(
Icons.music_note,
color: Color(0xFF6366F1),
size: 20,
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
song["title"]!,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
),
),
Text(
song["artist"]!,
style: const TextStyle(
color: Colors.grey,
fontSize: 12,
),
),
],
),
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: const Color(0xFF6366F1).withOpacity(0.2),
borderRadius: BorderRadius.circular(12),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icons.thumb_up,
color: Color(0xFF6366F1),
size: 12,
),
const SizedBox(width: 4),
Text(
song["votes"]!,
style: const TextStyle(
color: Color(0xFF6366F1),
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
),
);
},
),
),
],
),
2025-08-02 03:42:56 +02:00
),
],
),
2025-08-02 03:04:20 +02:00
),
);
}
}