add icon
continuous-integration/drone/push Build is passing Details

LIKES_POST_LDE-EKA
Lucas Delanier 2 years ago
parent 18eacc6e56
commit 4036f02391

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

@ -11,13 +11,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:justmusic/screens/add_friend_screen.dart'; import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/explanations_screen.dart'; import 'package:justmusic/screens/explanations_screen.dart';
import 'package:justmusic/screens/feed_screen.dart'; import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/loading_screen.dart';
import 'package:justmusic/screens/login_screen.dart'; import 'package:justmusic/screens/login_screen.dart';
import 'package:justmusic/screens/launching_rocker_screen.dart'; import 'package:justmusic/screens/launching_rocker_screen.dart';
import 'package:justmusic/screens/post_screen.dart'; import 'package:justmusic/screens/post_screen.dart';
import 'package:justmusic/screens/profile_screen.dart'; import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/registration_screen.dart'; import 'package:justmusic/screens/registration_screen.dart';
import 'package:justmusic/screens/user_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart'; import 'package:justmusic/screens/welcome_screen.dart';
import 'package:justmusic/view_model/CommentViewModel.dart'; import 'package:justmusic/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart'; import 'package:justmusic/view_model/MusicViewModel.dart';
@ -29,6 +27,7 @@ import 'package:timezone/data/latest.dart' as tz;
Future<void> main() async { Future<void> main() async {
tz.initializeTimeZones(); tz.initializeTimeZones();
Paint.enableDithering = true;
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp( await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, options: DefaultFirebaseOptions.currentPlatform,

@ -14,11 +14,11 @@ class Music {
List<Artist> _artists; List<Artist> _artists;
// Constructor // Constructor
Music(this._id, this._title, this._cover, this._previewUrl, this._date, Music(
this._duration, this._explicit, this._artists); this._id, this._title, this._cover, this._previewUrl, this._date, this._duration, this._explicit, this._artists);
//Getters and setters //Getters and setters
String? get id => _id; String get id => _id;
String? get title => _title; String? get title => _title;

@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:pinch_zoom/pinch_zoom.dart';
import 'package:text_scroll/text_scroll.dart'; import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../components/button_play_component.dart'; import '../components/button_play_component.dart';
@ -89,26 +90,35 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Container( child: Container(
height: 400, height: 400,
width: double.infinity, width: double.infinity,
child: PinchZoom(
resetDuration: const Duration(milliseconds: 400),
maxScale: 2.5,
child: FadeInImage.assetNetwork( child: FadeInImage.assetNetwork(
placeholder: "assets/images/loadingPlaceholder.gif", placeholder: "assets/images/loadingPlaceholder.gif",
image: choice ? widget.post.selfie! : widget.post.music.cover!, image: choice ? widget.post.selfie! : widget.post.music.cover!,
width: double.infinity, width: double.infinity,
fit: BoxFit.cover, fit: BoxFit.cover,
), )),
), ),
), ),
Column( Column(
children: [ children: [
Container( IgnorePointer(
child: Container(
height: 200, height: 200,
margin: EdgeInsets.only(top: 230), margin: EdgeInsets.only(top: 230),
width: double.infinity, width: double.infinity,
decoration: const BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal], colors: [
stops: [0, 0.8], Colors.transparent,
bgModal.withOpacity(0.5),
bgModal.withOpacity(0.75),
bgModal
],
stops: [0, 0.2, 0.4, 0.8],
), ),
), ),
child: Padding( child: Padding(
@ -240,6 +250,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
), ),
), ),
), ),
),
widget.post.description != null widget.post.description != null
? Align( ? Align(
alignment: Alignment.bottomLeft, alignment: Alignment.bottomLeft,
@ -289,8 +300,52 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
SvgPicture.asset("assets/images/add.svg", SvgPicture.asset("assets/images/add.svg",
semanticsLabel: 'Add playlist Logo'), semanticsLabel: 'Add playlist Logo'),
GestureDetector( GestureDetector(
onTap: () { onTap: () async {
MyApp.musicViewModel. var bool = await MyApp.musicViewModel
.addOrDeleteFavoriteMusic(widget.post.music.id);
!bool
? ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
shape: RoundedRectangleBorder(
borderRadius:
new BorderRadius.all(new Radius.circular(300.0)),
),
behavior: SnackBarBehavior.floating,
content: Text(
"${widget.post.music.title} ajouté à votre collection",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15),
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
)
: ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius:
new BorderRadius.all(new Radius.circular(300.0)),
),
content: Text(
"${widget.post.music.title} retiré de votre collection",
textAlign: TextAlign.center,
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
}, },
child: SvgPicture.asset("assets/images/save.svg", child: SvgPicture.asset("assets/images/save.svg",
semanticsLabel: 'Save Logo')), semanticsLabel: 'Save Logo')),

@ -91,7 +91,14 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
builder: ((BuildContext context) { builder: ((BuildContext context) {
return ClipRRect( return ClipRRect(
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)), borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: DetailPostScreen(post: post)); child: SizedBox(
height: 760.h,
child: Scaffold(
primary: false,
extendBody: false,
backgroundColor: Colors.transparent,
body: DetailPostScreen(post: post)),
));
}), }),
); );
} }

@ -11,7 +11,6 @@ import '../components/editable_post_component.dart';
import '../components/post_button_component.dart'; import '../components/post_button_component.dart';
import '../main.dart'; import '../main.dart';
import '../model/Music.dart'; import '../model/Music.dart';
import '../model/Post.dart';
import '../values/constants.dart'; import '../values/constants.dart';
class PostScreen extends StatefulWidget { class PostScreen extends StatefulWidget {
@ -93,7 +92,7 @@ class _PostScreenState extends State<PostScreen> with SingleTickerProviderStateM
} }
handleSubmit() async { handleSubmit() async {
MyApp.postViewModel.addPost(description, (selectedMusic?.id)!, selectedImage, selectedCity); MyApp.postViewModel.addPost(description, selectedMusic!.id, selectedImage, selectedCity);
quit(); quit();
} }

@ -124,7 +124,6 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
child: SizedBox( child: SizedBox(
height: 40, height: 40,
child: TextField( child: TextField(
autofocus: true,
controller: _textEditingController, controller: _textEditingController,
keyboardAppearance: Brightness.dark, keyboardAppearance: Brightness.dark,
onEditingComplete: resetFullScreen, onEditingComplete: resetFullScreen,
@ -132,6 +131,9 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
if (_textEditingController.text.isEmpty) { if (_textEditingController.text.isEmpty) {
fetchTrendingMusic(); fetchTrendingMusic();
} else { } else {
setState(() {
filteredData = [];
});
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value); filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
setState(() { setState(() {
filteredData = filteredData; filteredData = filteredData;
@ -163,7 +165,47 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
), ),
), ),
Flexible( Flexible(
child: ScrollConfiguration( child: PageView(
physics: BouncingScrollPhysics(),
children: [
ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: true),
child: ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
controller: _scrollController,
itemCount: filteredData.length,
itemBuilder: (context, index) {
if (playingIndex == index) {
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: true,
callback: playMusic,
index: index,
),
));
}
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: false,
callback: playMusic,
index: index,
),
));
}),
),
ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: true), behavior: ScrollBehavior().copyWith(scrollbars: true),
child: ListView.builder( child: ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
@ -199,6 +241,8 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
), ),
)); ));
}), }),
)
],
)) ))
], ],
), ),

@ -29,7 +29,7 @@ class AuthService {
"nbCapsules": 0, "nbCapsules": 0,
"followers": [], "followers": [],
"token_notify": token, "token_notify": token,
"musics_likes": [], "saved_musics": [],
"picture": "picture":
"https://firebasestorage.googleapis.com/v0/b/justmusic-435d5.appspot.com/o/justMusicDefaultImage.png?alt=media&token=020d0fcb-b7df-4d4d-b380-e99597293fcc" "https://firebasestorage.googleapis.com/v0/b/justmusic-435d5.appspot.com/o/justMusicDefaultImage.png?alt=media&token=020d0fcb-b7df-4d4d-b380-e99597293fcc"
}; };
@ -55,10 +55,8 @@ class AuthService {
Future<String> generateUniqueId(String pseudo) async { Future<String> generateUniqueId(String pseudo) async {
String uniqueId = '$pseudo#0001'; String uniqueId = '$pseudo#0001';
int suffix = 1; int suffix = 1;
final CollectionReference usersCollection = final CollectionReference usersCollection = FirebaseFirestore.instance.collection("users");
FirebaseFirestore.instance.collection("users"); final QuerySnapshot querySnapshot = await usersCollection.where('pseudo', isEqualTo: pseudo).get();
final QuerySnapshot querySnapshot =
await usersCollection.where('pseudo', isEqualTo: pseudo).get();
querySnapshot.docs.forEach((snapshot) { querySnapshot.docs.forEach((snapshot) {
suffix++; suffix++;
@ -70,8 +68,7 @@ class AuthService {
login(String email, String password) async { login(String email, String password) async {
try { try {
await FirebaseAuth.instance await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password);
.signInWithEmailAndPassword(email: email, password: password);
} on FirebaseAuthException catch (e) { } on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') { if (e.code == 'user-not-found') {
throw ('Mail incorrect'); throw ('Mail incorrect');
@ -98,12 +95,10 @@ class AuthService {
.doc(currentUser?.uid) .doc(currentUser?.uid)
.delete() .delete()
.then((value) => print("Firestore deleted user")) .then((value) => print("Firestore deleted user"))
.catchError( .catchError((error) => print("Error deleting user from Firestore: $error"));
(error) => print("Error deleting user from Firestore: $error"));
await currentUser?.delete(); await currentUser?.delete();
await FirebaseAuth.instance.signOut(); await FirebaseAuth.instance.signOut();
} on FirebaseAuthException catch (e) { } on FirebaseAuthException catch (e) {
if (e.code == 'requires-recent-login') { if (e.code == 'requires-recent-login') {
throw ('Please log in again to delete your account'); throw ('Please log in again to delete your account');

@ -4,45 +4,27 @@ import '../main.dart';
class MusicService { class MusicService {
Future<dynamic> getFavoriteMusicsByUserId(String id) async { Future<dynamic> getFavoriteMusicsByUserId(String id) async {
var response = var response = await FirebaseFirestore.instance.collection("users").doc(id).get();
await FirebaseFirestore.instance.collection("users").doc(id).get();
if (response.exists) { if (response.exists) {
var musicFavorite = response.get("musics_likes"); var musicFavorite = response.get("saved_musics");
return List.from(musicFavorite); return List.from(musicFavorite);
} else { } else {
return []; return [];
} }
} }
deleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance
.collection("users")
.doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
if (!musicFavorite.contains(id)) {
musicFavorite.remove(id);
await userRef.update({"musics_likes": musicFavorite});
} else {
print("Delete error: The music is not in the user's favorite music list");
}
}
Future<bool> addOrDeleteFavoriteMusic(String id) async { Future<bool> addOrDeleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
.collection("users")
.doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get(); var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes")); List<dynamic> musicFavorite = List.from(response.get("saved_musics"));
if (!musicFavorite.contains(id)) { if (!musicFavorite.contains(id)) {
musicFavorite.add(id); musicFavorite.add(id);
await userRef.update({"musics_likes": musicFavorite}); await userRef.update({"saved_musics": musicFavorite});
return false; return false;
} else { } else {
musicFavorite.remove(id); musicFavorite.remove(id);
await userRef.update({"musics_likes": musicFavorite}); await userRef.update({"saved_musics": musicFavorite});
return true; return true;
} }
} }

Loading…
Cancel
Save