import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:just_audio/just_audio.dart'; import 'package:audio_session/audio_session.dart'; import 'package:motor/azafah/backend/models.dart'; import 'package:motor/azafah/backend/services.dart'; import 'package:motor/azafah/screens/ordernow.dart'; import 'package:motor/core/resources/color_manager.dart'; import 'package:motor/directcall.dart'; import 'package:shared_preferences/shared_preferences.dart'; class zafatsongscreen extends StatefulWidget { final int artstid; final String artistName; final String artistImage; List songs2; zafatsongscreen({ super.key, required this.artistName, required this.artistImage, required this.songs2, required this.artstid, }); @override State createState() => _ArtistScreenState(); } class Song2 { final String title; final String url; bool isFavorite; bool isSeen; Song2({ required this.title, required this.url, this.isFavorite = false, this.isSeen = false, }); } class _ArtistScreenState extends State { final Map _players = {}; final Map _positions = {}; final Map _durations = {}; int? _playingIndex; late List songs; late SharedPreferences _prefs; final String _favoritesKey = 'favorite_songs'; final String _seenKey = 'seen_songs'; final api = ApiService(); List songartis = []; @override void initState() { super.initState(); _initPrefs(); print("object"); _loadartist(widget.artstid); } Future _loadartist(int artisid) async { print("object"); try { List data = await api.showallphoneFamilies2(artisid); setState(() { songartis = data; widget.songs2 = data; }); print(widget.songs2); } catch (e) { print('Error fetching data: $e'); } } Future _initPrefs() async { _prefs = await SharedPreferences.getInstance(); final favoriteUrls = _prefs.getStringList(_favoritesKey) ?? []; final seenUrls = _prefs.getStringList(_seenKey) ?? []; for (var song in widget.songs2) { //song.isFavorite = favoriteUrls.contains(song.audio_url); //song.isSeen = seenUrls.contains(song.audio_url); } setState(() {}); } @override void dispose() { for (var player in _players.values) { player.dispose(); } super.dispose(); } Future _play(int index) async { if (_playingIndex != null && _playingIndex != index) { await _players[_playingIndex!]?.stop(); } _playingIndex = index; _players[index] ??= AudioPlayer(); final session = await AudioSession.instance; await session.configure(const AudioSessionConfiguration.music()); await _players[index]!.setUrl(widget.songs2[index].audio_url.toString()); _durations[index] = _players[index]!.duration ?? Duration.zero; _players[index]!.positionStream.listen((pos) { setState(() { _positions[index] = pos; }); }); _players[index]!.durationStream.listen((dur) { setState(() { _durations[index] = dur ?? Duration.zero; }); }); await _players[index]!.play(); _markAsSeen(index); setState(() {}); } Future _stop(int index) async { await _players[index]?.stop(); if (_playingIndex == index) _playingIndex = null; setState(() {}); } void _seek(int index, double seconds) { _players[index]?.seek(Duration(seconds: seconds.toInt())); } void _playNext() { if (_playingIndex != null && _playingIndex! < widget.songs2.length - 1) { _play(_playingIndex! + 1); } } void _playPrevious() { if (_playingIndex != null && _playingIndex! > 0) { _play(_playingIndex! - 1); } } void _toggleFavorite(int index) { setState(() { final song = widget.songs2[index]; //song.isFavorite = !song.isFavorite; final favorites = _prefs.getStringList(_favoritesKey) ?? []; // if (song.isFavorite) { // favorites.add(song.audioUrl); // } else { // favorites.remove(song.audioUrl); // } _prefs.setStringList(_favoritesKey, favorites); }); } void _markAsSeen(int index) { final song = widget.songs2[index]; if (!song.isSeen.toString().contains('true')) { setState(() { song.isSeen = ''; final seen = _prefs.getStringList(_seenKey) ?? []; seen.add(song.audio_url.toString()); _prefs.setStringList(_seenKey, seen); }); } } String c = ''; @override Widget build(BuildContext context) { return Directionality( textDirection: TextDirection.rtl, child: Scaffold( appBar: AppBar( title: const Text(''), // Image.asset("assets/images/home_app_bar_image2.png") ), body: Column( children: [ SizedBox(height: 5.h), CircleAvatar( radius: 60, backgroundImage: AssetImage(widget.artistImage), ), SizedBox(height: 5.h), Text( '${widget.artistName} : $c', style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: ColorManager.C33), ), SizedBox(height: 10.h), Expanded( child: ListView.builder( itemCount: widget.songs2.length, itemBuilder: (context, index) { final isPlaying = _playingIndex == index && _players[index]?.playing == true; final duration = _durations[index] ?? Duration.zero; final position = _positions[index] ?? Duration.zero; final song = widget.songs2[index]; return Card( shadowColor: ColorManager.C3.withOpacity(.1), elevation: 5, surfaceTintColor: ColorManager.C3, borderOnForeground: true, margin: EdgeInsets.symmetric(vertical: 8.h, horizontal: 12.w), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16.r), ), child: Padding( padding: const EdgeInsets.all(12.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon(Icons.music_note, color: Theme.of(context).colorScheme.primary), const SizedBox(width: 12), Expanded( child: Column( children: [ Text( song.title.toString(), style: const TextStyle( fontWeight: FontWeight.w900), ), Text( song.artisname.toString(), style: TextStyle( color: Colors.black.withOpacity(0.7), fontWeight: FontWeight.normal), ), ], ), ), IconButton( icon: Icon( song.isFavorite.toString() == 'true' ? Icons.favorite : Icons.favorite_border, color: song.isFavorite.toString() == 'true' ? Colors.red : Theme.of(context).iconTheme.color, ), onPressed: () => _toggleFavorite(index), tooltip: 'مفضلة', ), IconButton( icon: const Icon(Icons.skip_previous_rounded), onPressed: index > 0 ? _playPrevious : null, tooltip: 'السابق', ), IconButton( icon: Icon( isPlaying ? Icons.stop : Icons.play_arrow, ), onPressed: () { if (isPlaying) { c = widget.songs2[index].title.toString(); _stop(index); } else { _play(index); c = widget.songs2[index].title.toString(); } }, tooltip: isPlaying ? 'إيقاف' : 'تشغيل', ), IconButton( icon: const Icon(Icons.skip_next_rounded), onPressed: index < widget.songs2.length - 1 ? _playNext : null, tooltip: 'التالي', ), ], ), const SizedBox(height: 8), SliderTheme( data: SliderTheme.of(context).copyWith( trackHeight: 4, thumbShape: const RoundSliderThumbShape( enabledThumbRadius: 8), overlayShape: const RoundSliderOverlayShape( overlayRadius: 16), activeTrackColor: Theme.of(context).colorScheme.primary, inactiveTrackColor: Theme.of(context) .colorScheme .secondary .withOpacity(0.3), thumbColor: Theme.of(context).colorScheme.primary, overlayColor: Theme.of(context) .colorScheme .primary .withOpacity(0.1), ), child: Slider( min: 0, max: duration.inSeconds.toDouble() > 0 ? duration.inSeconds.toDouble() : 1, value: position.inSeconds .clamp(0, duration.inSeconds) .toDouble(), onChanged: (value) { _seek(index, value); }, ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(_formatDuration(position), style: const TextStyle(fontSize: 12)), Row( children: [ Text(_formatDuration(duration), style: const TextStyle(fontSize: 12)), ], ), ], ), if (true) Padding( padding: EdgeInsets.only(top: 4.0), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ // Icon(Icons.visibility, // size: 16, color: Colors.green), // SizedBox(width: 4), // Text('تم الاستماع', // style: TextStyle( // fontSize: 12, color: Colors.green)), Row( children: [ OrderNowButton( onPressed: () { print (c+'طلب : '+widget.songs2[index].title.toString()); sendWhatsMassegeFromQuestion (c.toString() + ' اسم الزفه :' + widget.songs2[index].title.toString() +'___' +'الفنان' + ':'+widget.songs2[index].artisname.toString()); // نفذ العملية هنا مثل: إرسال رسالة واتساب أو الطلب /// sendWhatsAppMessage (phone: '0966558652639',message: ' اسم الزفه : ' + widget.songs2[index].title.toString()); }, ), ], ) ], ), ), ], ), ), ); }, ), ), ], ), ), ); } String _formatDuration(Duration d) { String twoDigits(int n) => n.toString().padLeft(2, '0'); final minutes = twoDigits(d.inMinutes.remainder(60)); final seconds = twoDigits(d.inSeconds.remainder(60)); return "$minutes:$seconds"; } }