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/explanations_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/launching_rocker_screen.dart';
import 'package:justmusic/screens/post_screen.dart';
import 'package:justmusic/screens/profile_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/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart';
@ -29,6 +27,7 @@ import 'package:timezone/data/latest.dart' as tz;
Future<void> main() async {
tz.initializeTimeZones();
Paint.enableDithering = true;
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,

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

@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:pinch_zoom/pinch_zoom.dart';
import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../components/button_play_component.dart';
@ -89,26 +90,35 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Container(
height: 400,
width: double.infinity,
child: PinchZoom(
resetDuration: const Duration(milliseconds: 400),
maxScale: 2.5,
child: FadeInImage.assetNetwork(
placeholder: "assets/images/loadingPlaceholder.gif",
image: choice ? widget.post.selfie! : widget.post.music.cover!,
width: double.infinity,
fit: BoxFit.cover,
),
)),
),
),
Column(
children: [
Container(
IgnorePointer(
child: Container(
height: 200,
margin: EdgeInsets.only(top: 230),
width: double.infinity,
decoration: const BoxDecoration(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal],
stops: [0, 0.8],
colors: [
Colors.transparent,
bgModal.withOpacity(0.5),
bgModal.withOpacity(0.75),
bgModal
],
stops: [0, 0.2, 0.4, 0.8],
),
),
child: Padding(
@ -240,6 +250,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
),
),
),
widget.post.description != null
? Align(
alignment: Alignment.bottomLeft,
@ -289,8 +300,52 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
SvgPicture.asset("assets/images/add.svg",
semanticsLabel: 'Add playlist Logo'),
GestureDetector(
onTap: () {
MyApp.musicViewModel.
onTap: () async {
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",
semanticsLabel: 'Save Logo')),

@ -91,7 +91,14 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
builder: ((BuildContext context) {
return ClipRRect(
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 '../main.dart';
import '../model/Music.dart';
import '../model/Post.dart';
import '../values/constants.dart';
class PostScreen extends StatefulWidget {
@ -93,7 +92,7 @@ class _PostScreenState extends State<PostScreen> with SingleTickerProviderStateM
}
handleSubmit() async {
MyApp.postViewModel.addPost(description, (selectedMusic?.id)!, selectedImage, selectedCity);
MyApp.postViewModel.addPost(description, selectedMusic!.id, selectedImage, selectedCity);
quit();
}

@ -124,7 +124,6 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
child: SizedBox(
height: 40,
child: TextField(
autofocus: true,
controller: _textEditingController,
keyboardAppearance: Brightness.dark,
onEditingComplete: resetFullScreen,
@ -132,6 +131,9 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
if (_textEditingController.text.isEmpty) {
fetchTrendingMusic();
} else {
setState(() {
filteredData = [];
});
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
setState(() {
filteredData = filteredData;
@ -163,7 +165,47 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
),
),
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),
child: ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
@ -199,6 +241,8 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
),
));
}),
)
],
))
],
),

@ -29,7 +29,7 @@ class AuthService {
"nbCapsules": 0,
"followers": [],
"token_notify": token,
"musics_likes": [],
"saved_musics": [],
"picture":
"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 {
String uniqueId = '$pseudo#0001';
int suffix = 1;
final CollectionReference usersCollection =
FirebaseFirestore.instance.collection("users");
final QuerySnapshot querySnapshot =
await usersCollection.where('pseudo', isEqualTo: pseudo).get();
final CollectionReference usersCollection = FirebaseFirestore.instance.collection("users");
final QuerySnapshot querySnapshot = await usersCollection.where('pseudo', isEqualTo: pseudo).get();
querySnapshot.docs.forEach((snapshot) {
suffix++;
@ -70,8 +68,7 @@ class AuthService {
login(String email, String password) async {
try {
await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password);
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
throw ('Mail incorrect');
@ -98,12 +95,10 @@ class AuthService {
.doc(currentUser?.uid)
.delete()
.then((value) => print("Firestore deleted user"))
.catchError(
(error) => print("Error deleting user from Firestore: $error"));
.catchError((error) => print("Error deleting user from Firestore: $error"));
await currentUser?.delete();
await FirebaseAuth.instance.signOut();
} on FirebaseAuthException catch (e) {
if (e.code == 'requires-recent-login') {
throw ('Please log in again to delete your account');

@ -4,45 +4,27 @@ import '../main.dart';
class MusicService {
Future<dynamic> getFavoriteMusicsByUserId(String id) async {
var response =
await FirebaseFirestore.instance.collection("users").doc(id).get();
var response = await FirebaseFirestore.instance.collection("users").doc(id).get();
if (response.exists) {
var musicFavorite = response.get("musics_likes");
var musicFavorite = response.get("saved_musics");
return List.from(musicFavorite);
} else {
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 {
var userRef = await FirebaseFirestore.instance
.collection("users")
.doc(MyApp.userViewModel.userCurrent.id);
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"));
List<dynamic> musicFavorite = List.from(response.get("saved_musics"));
if (!musicFavorite.contains(id)) {
musicFavorite.add(id);
await userRef.update({"musics_likes": musicFavorite});
await userRef.update({"saved_musics": musicFavorite});
return false;
} else {
musicFavorite.remove(id);
await userRef.update({"musics_likes": musicFavorite});
await userRef.update({"saved_musics": musicFavorite});
return true;
}
}

Loading…
Cancel
Save