Résolution de toutes les erreurs pour le build, toutes les fonctionnalités ne sont quand même pas mise à jour

remotes/origin/mvc-implementation
Félix MIELCAREK 2 years ago
parent 160d75a3e7
commit 32135c7b53

@ -1,3 +1,4 @@
import 'dart:collection';
import 'dart:convert'; import 'dart:convert';
import 'package:dafl_project_flutter/controller/live_datas.dart'; import 'package:dafl_project_flutter/controller/live_datas.dart';
import 'package:dafl_project_flutter/model/music.dart'; import 'package:dafl_project_flutter/model/music.dart';
@ -10,47 +11,48 @@ import 'package:http/http.dart' as http;
import '../model/user.dart'; import '../model/user.dart';
class Controller { class Controller {
ApiSpotify _api = ApiSpotify(); final ApiSpotify _api = ApiSpotify();
late User _currentUser; late User _currentUser;
final DataBaseService _dataBaseService = DataBaseService(); final DataBaseService _dataBaseService = DataBaseService();
final LiveDatas _datas = LiveDatas(); final LiveData _data = LiveData();
late BuildContext navigatorKey; late BuildContext navigatorKey;
// //
// Methods to manage datas // Methods to manage data
// //
// Datas that can change // Data that can change
bool getChoice() => _datas.discoveriesSortChoice; bool getChoice() => _data.discoveriesSortChoice;
setChoice(bool c) { setChoice(bool c) {
_datas.discoveriesSortChoice = c; _data.discoveriesSortChoice = c;
} }
Music getCurrentMusic() => _datas.userCurrentMusic; Music getCurrentMusic() => _data.userCurrentMusic;
setCurrentMusic() async { setCurrentMusic() async {
_datas.userCurrentMusic = _data.userCurrentMusic =
await getCompleteMusic(await _api.requests.getCurrentlyPlayingTrack()); await getCompleteMusic(await _api.requests.getCurrentlyPlayingTrack());
} }
List<Spot> getSpots() => _datas.spots; List<Spot> getSpots() => _data.spots;
setSpots() async { setSpots() async {
_datas.spots = await Location.sendCurrentLocation(); _data.spots = await Location.sendCurrentLocation();
} }
Map<Music, DateTime> getDiscoveries() => _datas.discoveries; LinkedHashMap<Music, DateTime> getDiscoveries() => _data.discoveries;
setDiscoveries() async { setDiscoveries() async {
Map<String, DateTime> tmpData = await _api.requests.getPlaylistTracks(); LinkedHashMap<String, DateTime> tmpData =
Map<Music, DateTime> tmpCast = {}; await _api.requests.getPlaylistTracks();
LinkedHashMap<Music, DateTime> tmpCast = LinkedHashMap();
tmpData.forEach((key, value) async { tmpData.forEach((key, value) async {
tmpCast[(await getCompleteMusic(key))] = value; tmpCast[(await getCompleteMusic(key))] = value;
}); });
_datas.discoveries = tmpCast; _data.discoveries = tmpCast;
} }
//Data that can not change //Data that can not change
@ -72,8 +74,8 @@ class Controller {
} }
Future<Music> getCompleteMusic(String id) async { Future<Music> getCompleteMusic(String id) async {
Map infos = await _api.requests.getTrackInfo(id); Map info = await _api.requests.getTrackInfo(id);
return Music(id, infos['name'], infos['artist'], infos['cover']); return Music(id, info['name'], info['artist'], info['cover']);
} }
removeFromPlaylist(String id) { removeFromPlaylist(String id) {

@ -1,14 +1,11 @@
import 'package:dafl_project_flutter/main.dart'; import 'dart:collection';
import '../model/music.dart'; import '../model/music.dart';
import '../model/spot.dart'; import '../model/spot.dart';
class LiveDatas { class LiveData {
bool discoveriesSortChoice = bool discoveriesSortChoice = true;
false; //false = sort by name ; true = sort by date late LinkedHashMap<Music, DateTime> discoveries;
Map<Music, DateTime> discoveries; late List<Spot> spots;
List<Spot> spots; late Music userCurrentMusic;
Music userCurrentMusic;
LiveDatas() {}
} }

@ -176,7 +176,7 @@ class CardProvider extends ChangeNotifier {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
MyApp.controller.getDiscoveries().containsKey( MyApp.controller.getDiscoveries().containsKey(
MyApp.controller.currentUser.spots.last.music) MyApp.controller.getSpots().last.music)
? const Icon( ? const Icon(
Icons.info_rounded, Icons.info_rounded,
size: 40, size: 40,
@ -190,7 +190,7 @@ class CardProvider extends ChangeNotifier {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
MyApp.controller.getDiscoveries().contains( MyApp.controller.getDiscoveries().containsKey(
MyApp.controller.getSpots().last.music) MyApp.controller.getSpots().last.music)
? const Text( ? const Text(
"Déjà dans vos discovery", "Déjà dans vos discovery",
@ -216,7 +216,7 @@ class CardProvider extends ChangeNotifier {
); );
if (!MyApp.controller if (!MyApp.controller
.getDiscoveries() .getDiscoveries()
.contains(MyApp.controller.getSpots().last.music)) { .containsKey(MyApp.controller.getSpots().last.music)) {
MyApp.controller.addToPlaylist(MyApp.controller.getSpots().last.music.id); MyApp.controller.addToPlaylist(MyApp.controller.getSpots().last.music.id);
notifyListeners(); notifyListeners();
} }
@ -327,7 +327,7 @@ class CardProvider extends ChangeNotifier {
child: ElevatedButton( child: ElevatedButton(
onPressed: () { onPressed: () {
sendMessage(messageTextField.text, sendMessage(messageTextField.text,
MyApp.controller.getSpots().last.key); MyApp.controller.getSpots().last.userId);
}, },
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF3F1DC3), backgroundColor: const Color(0xFF3F1DC3),

@ -1,3 +1,4 @@
import 'dart:collection';
import 'dart:convert'; import 'dart:convert';
import 'package:dafl_project_flutter/services/api/token_spotify.dart'; import 'package:dafl_project_flutter/services/api/token_spotify.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -86,11 +87,11 @@ class ApiSpotifyRequests extends HttpResponseVerification {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
})); }));
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map; var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
var daflplaylist = decodedResponse['items'] var daflPlaylist = decodedResponse['items']
.where((element) => element['name'] == _playlistName) .where((element) => element['name'] == _playlistName)
.toList(); .toList();
if (daflplaylist.length == 1) { if (daflPlaylist.length == 1) {
return daflplaylist[0]['uri'].substring( return daflPlaylist[0]['uri'].substring(
17); //17 char because format is 'spotify:playlist:MYPLAYLISTID' 17); //17 char because format is 'spotify:playlist:MYPLAYLISTID'
} }
return await _createPlaylist(); return await _createPlaylist();
@ -148,11 +149,9 @@ class ApiSpotifyRequests extends HttpResponseVerification {
removeFromPlaylist(String idTrack) async { removeFromPlaylist(String idTrack) async {
var idPlaylist = await _getPlaylistId(); var idPlaylist = await _getPlaylistId();
if (idPlaylist != null) {
if (await _isInPlaylist(idTrack, idPlaylist)) { if (await _isInPlaylist(idTrack, idPlaylist)) {
var token = await _token.getAccessToken(); var token = await _token.getAccessToken();
var url = var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks');
Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks');
var jsonVar = jsonEncode(<String, List>{ var jsonVar = jsonEncode(<String, List>{
'tracks': [ 'tracks': [
{'uri': 'spotify:track:$idTrack'} {'uri': 'spotify:track:$idTrack'}
@ -166,9 +165,8 @@ class ApiSpotifyRequests extends HttpResponseVerification {
body: jsonVar)); body: jsonVar));
} }
} }
}
Future<Map<String, DateTime>> getPlaylistTracks() async { Future<LinkedHashMap<String, DateTime>> getPlaylistTracks() async {
var idPlaylist = _getPlaylistId(); var idPlaylist = _getPlaylistId();
var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks', var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks',
{'fields': 'items(track(id),added_at)'}); {'fields': 'items(track(id),added_at)'});
@ -178,7 +176,7 @@ class ApiSpotifyRequests extends HttpResponseVerification {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
})); }));
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map; var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
Map<String, DateTime> mapRes = {}; LinkedHashMap<String, DateTime> mapRes = LinkedHashMap();
decodedResponse['items'].toList().forEach((elem) => decodedResponse['items'].toList().forEach((elem) =>
{mapRes[elem['track']['id']] = DateTime.parse(elem['added_at'])}); {mapRes[elem['track']['id']] = DateTime.parse(elem['added_at'])});
return mapRes; return mapRes;

@ -1,5 +1,6 @@
import 'dart:collection';
import 'package:dafl_project_flutter/main.dart'; import 'package:dafl_project_flutter/main.dart';
import 'package:fluttericon/font_awesome5_icons.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:developer' as dev; import 'dart:developer' as dev;
@ -118,15 +119,20 @@ class _DiscoveryListState extends State<DiscoveryList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var listDiscoveries = MyApp.controller.getDiscoveries(); late LinkedHashMap<Music, DateTime> listDiscoveries;
if (MyApp.controller.getChoice()) { if (MyApp.controller.getChoice()) {
listDiscoveries.sort((a, b) { //TODO : implement sort by date
return a.date.compareTo(b.date); listDiscoveries = LinkedHashMap();
});
} else { } else {
listDiscoveries.sort((a, b) { //TODO : implement sort by name
return a.name.compareTo(b.name); /* var sortedKeys = MyApp.controller
}); .getDiscoveries()
.values
.toList(growable: false)
..sort((v1, v2) => v1.compareTo(v2));
listDiscoveries = LinkedHashMap.fromIterable(sortedKeys,
key: (k) => k, value: (k) => sortedKeys[k]); */
listDiscoveries = LinkedHashMap();
} }
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
@ -141,21 +147,23 @@ class _DiscoveryListState extends State<DiscoveryList> {
int reversedIndex = itemCount - 1 - index; int reversedIndex = itemCount - 1 - index;
return Dismissible( return Dismissible(
movementDuration: const Duration(milliseconds: 400), movementDuration: const Duration(milliseconds: 400),
key: Key(listDiscoveries[index].name), key: Key(listDiscoveries.keys.toList()[index].name),
confirmDismiss: (direction) async { confirmDismiss: (direction) async {
if (direction == DismissDirection.endToStart) { if (direction == DismissDirection.endToStart) {
print(listDiscoveries[reversedIndex].id); dev.log(listDiscoveries.keys.toList()[reversedIndex].id);
print(listDiscoveries[reversedIndex].name); dev.log(
listDiscoveries.keys.toList()[reversedIndex].name);
MyApp.controller.removeFromPlaylist( MyApp.controller.removeFromPlaylist(
listDiscoveries[reversedIndex].id); listDiscoveries.keys.toList()[reversedIndex].id);
listDiscoveries = MyApp.controller.getDiscoveries(); listDiscoveries = MyApp.controller.getDiscoveries();
return true; return true;
} }
if (direction == DismissDirection.startToEnd) { if (direction == DismissDirection.startToEnd) {
print(listDiscoveries[reversedIndex].name); dev.log(
print('play'); listDiscoveries.keys.toList()[reversedIndex].name);
MyApp.controller dev.log('play');
.playTrack(listDiscoveries[reversedIndex].id); MyApp.controller.playTrack(
listDiscoveries.keys.toList()[reversedIndex].id);
setState(() {}); setState(() {});
} }
return false; return false;
@ -194,7 +202,9 @@ class _DiscoveryListState extends State<DiscoveryList> {
placeholder: placeholder:
"assets/images/loadingPlaceholder.gif", "assets/images/loadingPlaceholder.gif",
image: MyApp.controller image: MyApp.controller
.getDiscoveries()[reversedIndex] .getDiscoveries()
.keys
.toList()[reversedIndex]
.linkCover), .linkCover),
), ),
Container( Container(
@ -208,7 +218,9 @@ class _DiscoveryListState extends State<DiscoveryList> {
children: [ children: [
Text( Text(
MyApp.controller MyApp.controller
.getDiscoveries()[reversedIndex] .getDiscoveries()
.keys
.toList()[reversedIndex]
.name, .name,
style: TextStyle( style: TextStyle(
fontFamily: 'DMSans', fontFamily: 'DMSans',
@ -219,7 +231,9 @@ class _DiscoveryListState extends State<DiscoveryList> {
), ),
Text( Text(
MyApp.controller MyApp.controller
.getDiscoveries()[reversedIndex] .getDiscoveries()
.keys
.toList()[reversedIndex]
.artist, .artist,
style: TextStyle( style: TextStyle(
fontFamily: 'DMSans', fontFamily: 'DMSans',

@ -1,7 +1,4 @@
import 'package:text_scroll/text_scroll.dart';
import 'package:scroll_loop_auto_scroll/scroll_loop_auto_scroll.dart';
import '../../../main.dart'; import '../../../main.dart';
import '../../../model/music.dart';
import './w_settings.dart'; import './w_settings.dart';
import './w_spot.dart'; import './w_spot.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -56,8 +53,7 @@ class _MainPageProfilState extends State<MainPageProfil> {
fontSize: 25, fontSize: 25,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: Colors.white, color: Colors.white,
fontFamily: "DMSans")), fontFamily: "DMSans"))),
),
Container( Container(
margin: const EdgeInsets.fromLTRB(0, 10, 0, 10), margin: const EdgeInsets.fromLTRB(0, 10, 0, 10),
height: height * 0.14, height: height * 0.14,
@ -159,7 +155,8 @@ class _MainPageProfilState extends State<MainPageProfil> {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => const DisplayInfoWidget())); builder: (context) =>
const DisplayInfoWidget()));
}, },
child: Row( child: Row(
children: [ children: [
@ -192,8 +189,7 @@ class _MainPageProfilState extends State<MainPageProfil> {
height: height * 0.27, height: height * 0.27,
width: double.infinity, width: double.infinity,
margin: const EdgeInsets.fromLTRB(30, 15, 30, 0), margin: const EdgeInsets.fromLTRB(30, 15, 30, 0),
child: Column( child: Column(children: [
children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -220,16 +216,9 @@ class _MainPageProfilState extends State<MainPageProfil> {
width: 25, width: 25,
height: 25, height: 25,
child: riv.RiveAnimation.asset( child: riv.RiveAnimation.asset(
'assets/images/playing_animation.riv'), 'assets/images/playing_animation.riv')))
), ]),
), Container(
],
),
FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Container(
margin: const EdgeInsets.fromLTRB(0, 10, 0, 0), margin: const EdgeInsets.fromLTRB(0, 10, 0, 0),
height: height * 0.14, height: height * 0.14,
decoration: BoxDecoration( decoration: BoxDecoration(
@ -241,158 +230,86 @@ class _MainPageProfilState extends State<MainPageProfil> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
margin: margin: const EdgeInsets.fromLTRB(
const EdgeInsets.fromLTRB(15, 0, 0, 0), 15, 0, 0, 0),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius:
child: Image.network( BorderRadius.circular(15),
snapshot.data!.linkCover, child: FadeInImage.assetNetwork(
height: 90, height: 90,
width: 90, width: 90,
))), placeholder:
"assets/images/loadingPlaceholder.gif",
image: MyApp.controller
.getCurrentMusic()
.linkCover))),
Container( Container(
margin: margin: const EdgeInsets.fromLTRB(
const EdgeInsets.fromLTRB(12, 20, 0, 0), 12, 20, 0, 0),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
snapshot.data!.name.length > 22 Text(
? SizedBox( MyApp.controller
width: 220, .getCurrentMusic()
child: ScrollLoopAutoScroll( .name,
delayAfterScrollInput:
const Duration(seconds: 1),
delay:
const Duration(seconds: 1),
duration: const Duration(
seconds: 100),
scrollDirection:
Axis.horizontal,
child: Text(
snapshot.data!.name,
style: const TextStyle(
fontSize: 20,
color: Colors.white,
fontWeight:
FontWeight.bold),
),
),
)
: Text(
snapshot.data!.name,
style: const TextStyle( style: const TextStyle(
fontSize: 20, fontSize: 18,
color: Colors.white, fontWeight: FontWeight.w500,
fontWeight: FontWeight.bold), color: Colors.white),
), ),
Text( Text(
snapshot.data!.artist, MyApp.controller
.getCurrentMusic()
.artist,
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
color: Colors.grey), color: Colors.grey))
), ])),
],
),
)
],
),
);
} else {
return Container(
margin: const EdgeInsets.fromLTRB(0, 10, 0, 0),
height: height * 0.14,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
color: const Color(0xFFD9D9D9).withOpacity(0.08),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
margin:
const EdgeInsets.fromLTRB(15, 0, 0, 0),
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Image.asset(
"assets/images/loadingPlaceholder.gif",
height: 90,
width: 90))),
Container(
margin:
const EdgeInsets.fromLTRB(12, 20, 0, 0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Container(
width: 150,
height: 20,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(5.0),
color: Colors.grey.withOpacity(0.7),
),
),
const SizedBox(
height: 10,
),
Container(
width: 100,
height: 20,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(5.0),
color: Colors.grey.withOpacity(0.4),
),
),
],
),
)
],
),
);
}
}),
],
),
),
const Spacer(), const Spacer(),
Container( Container(
height: 55, height: 55,
width: double.infinity, width: double.infinity,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0), borderRadius:
BorderRadius.circular(10.0),
color: Colors.transparent, color: Colors.transparent,
), ),
margin: const EdgeInsets.fromLTRB(30, 0, 30, 0), margin: const EdgeInsets.fromLTRB(
30, 0, 30, 0),
child: SizedBox( child: SizedBox(
height: 55, height: 55,
width: double.infinity, width: double.infinity,
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: backgroundColor:
const Color(0xFFD9D9D9).withOpacity(0.08), const Color(0xFFD9D9D9)
.withOpacity(0.08),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0), borderRadius:
BorderRadius.circular(
10.0),
), // background// foreground ), // background// foreground
), ),
onPressed: () { onPressed: () {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => const SettingsWidget())) builder: (context) =>
.then((value) => setState(() { const SettingsWidget()))
username = .then(
MyApp.controller.getIdDafl().toString(); (value) => setState(() {
username = MyApp
.controller
.getIdDafl()
.toString();
})); }));
}, },
child: Row( child: Row(children: [
children: [
const Icon( const Icon(
Icons.settings, Icons.settings,
color: Colors.white, color: Colors.white,
@ -406,22 +323,20 @@ class _MainPageProfilState extends State<MainPageProfil> {
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 17, fontSize: 17,
fontWeight: FontWeight.w400), fontWeight:
FontWeight.w400),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
const Spacer(), const Spacer(),
Icon( Icon(
Icons.arrow_forward_ios, Icons.arrow_forward_ios,
color: Colors.white.withOpacity(0.3), color: Colors.white
), .withOpacity(0.3),
], )
)), ])))),
), const Spacer()
), ]))
const Spacer(), ]))
], ])));
),
),
);
} }
} }

Loading…
Cancel
Save