From 50bee2f5295b01e72f04ab6d766d6b8fc47385cb Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Mon, 31 Jul 2023 18:41:49 +0200 Subject: [PATCH] get post --- .../lib/components/post_component.dart | 768 +++++++++--------- .../justMUSIC/lib/screens/feed_screen.dart | 151 ++-- .../lib/view_model/PostViewModel.dart | 7 +- 3 files changed, 454 insertions(+), 472 deletions(-) diff --git a/Sources/justMUSIC/lib/components/post_component.dart b/Sources/justMUSIC/lib/components/post_component.dart index d5e0f9e..bb29cd1 100644 --- a/Sources/justMUSIC/lib/components/post_component.dart +++ b/Sources/justMUSIC/lib/components/post_component.dart @@ -4,15 +4,19 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:justmusic/main.dart'; +import 'package:justmusic/model/Music.dart'; +import 'package:justmusic/model/User.dart'; import 'package:text_scroll/text_scroll.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart'; import '../model/Post.dart'; class PostComponent extends StatefulWidget { - final VoidCallback? callback; + final Function(int)? callback; final Post post; - PostComponent({Key? key, required this.callback, required this.post}) : super(key: key); + final int index; + PostComponent({Key? key, required this.callback, required this.post, required this.index}) : super(key: key); @override State createState() => _PostComponentState(); @@ -20,6 +24,15 @@ class PostComponent extends StatefulWidget { class _PostComponentState extends State { bool choice = false; + DateTime today = DateTime.now(); + + Future fetchUserData() async { + return await MyApp.userViewModel.getUser(widget.post.idUser); + } + + Future fetchMusicData() async { + return await MyApp.musicViewModel.getMusic(widget.post.idMusic); + } void switchChoice() { setState(() { @@ -27,6 +40,13 @@ class _PostComponentState extends State { }); } + @override + void initState() { + print("post: ${widget.post.date.toString()}"); + print("ajrd: ${DateTime.now().toString()}"); + super.initState(); + } + @override Widget build(BuildContext context) { return GestureDetector( @@ -35,397 +55,399 @@ class _PostComponentState extends State { builder: (BuildContext context, BoxConstraints constraints) { if (choice && widget.callback == null) { return SizedBox( - width: double.infinity, - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - ClipOval( - child: SizedBox.fromSize( - // Image radius - child: const Image( - image: - AssetImage("assets/images/exemple_profile.png"), - width: 40, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: const EdgeInsets.only(left: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Melina", - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w600), - ), - Text( - "France, Lyon", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.4), - fontWeight: FontWeight.w300, - fontSize: 13), - ) - ], - ), - ), - ), - Text( - "Aujourd’hui, 16:43", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.4), - fontWeight: FontWeight.w300, - fontSize: 13), - ), - ], - ), - SizedBox(height: 10), - ZoomTapAnimation( - onTap: widget.callback, - enableLongTapRepeatEvent: false, - longTapRepeatDuration: const Duration(milliseconds: 100), - begin: 1.0, - end: 0.99, - beginDuration: const Duration(milliseconds: 70), - endDuration: const Duration(milliseconds: 100), - beginCurve: Curves.decelerate, - endCurve: Curves.easeInOutSine, - child: AspectRatio( - aspectRatio: 1 / 1, - child: Container( - decoration: BoxDecoration( - // add border - border: const GradientBoxBorder( - gradient: LinearGradient( - colors: [ - Colors.transparent, - Color(0xFF323232), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter), - width: 2.5, - ), - // set border radius - borderRadius: BorderRadius.circular(20), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(18), - // implement image - child: Stack( - alignment: Alignment.bottomCenter, + width: double.infinity, + child: FutureBuilder( + future: Future.wait([fetchMusicData(), fetchUserData()]), + builder: (context, AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + final music = snapshot.data![0] as Music; + final user = snapshot.data![1] as User; + return Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, children: [ - Image( - image: AssetImage( - "assets/images/exemple_profile.png"), - fit: BoxFit.cover, - width: double.infinity, + ClipOval( + child: SizedBox.fromSize( + // Image radius + child: Image( + image: NetworkImage(user.pp), + width: 40, + ), + ), ), - Positioned( - top: 0, - right: 0, - child: Padding( - padding: EdgeInsets.all(12), - child: Container( - constraints: BoxConstraints( - maxWidth: 140, maxHeight: 140), - width: 80.sp, - height: 80.sp, - decoration: BoxDecoration( - color: Colors.white, - // add border - border: Border.all( - width: 3, color: Colors.white), - // set border radius - borderRadius: - BorderRadius.circular(15), + Expanded( + flex: 8, + child: Padding( + padding: const EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + user.pseudo, + style: GoogleFonts.plusJakartaSans( + color: Colors.white, fontWeight: FontWeight.w600), ), - child: ClipRRect( - borderRadius: - BorderRadius.circular(13), - // implement image - child: Image( - image: AssetImage( - 'assets/images/exemple_cover.png'), + Text( + "${widget.post.location.item1}, ${widget.post.location.item2}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ) + ], + ), + ), + ), + widget.post.date.isAtSameMomentAs(DateTime.now()) + ? Text( + "Aujourd'hui, ${widget.post.date.hour}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ) + : Text( + "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ), + ], + ), + SizedBox(height: 10), + ZoomTapAnimation( + onTap: () { + widget.callback!(widget.index); + }, + enableLongTapRepeatEvent: false, + longTapRepeatDuration: const Duration(milliseconds: 100), + begin: 1.0, + end: 0.99, + beginDuration: const Duration(milliseconds: 70), + endDuration: const Duration(milliseconds: 100), + beginCurve: Curves.decelerate, + endCurve: Curves.easeInOutSine, + child: AspectRatio( + aspectRatio: 1 / 1, + child: Container( + decoration: BoxDecoration( + // add border + border: const GradientBoxBorder( + gradient: LinearGradient(colors: [ + Colors.transparent, + Color(0xFF323232), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + width: 2.5, + ), + // set border radius + borderRadius: BorderRadius.circular(20), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + // implement image + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Image( + image: NetworkImage(user.pp), fit: BoxFit.cover, + width: double.infinity, ), - ), + Positioned( + top: 0, + right: 0, + child: Padding( + padding: EdgeInsets.all(12), + child: Container( + constraints: BoxConstraints(maxWidth: 140, maxHeight: 140), + width: 80.sp, + height: 80.sp, + decoration: BoxDecoration( + color: Colors.white, + // add border + border: Border.all(width: 3, color: Colors.white), + // set border radius + borderRadius: BorderRadius.circular(15), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(13), + // implement image + child: Image( + image: NetworkImage(music.cover!), + fit: BoxFit.cover, + ), + ), + ), + )) + ], ), - )) + ), + ), + )), + SizedBox(height: 15), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 8, + child: TextScroll( + music.artists.first.name!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h), + mode: TextScrollMode.endless, + pauseBetween: Duration(milliseconds: 500), + velocity: Velocity(pixelsPerSecond: Offset(20, 0)), + )), + Padding( + padding: EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w), + child: ClipOval( + child: Container( + width: 5.h, + height: 5.h, + color: Colors.white, + ), + ), + ), + Expanded( + flex: 8, + child: Padding( + padding: EdgeInsets.only(bottom: 2), + child: TextScroll( + music.title!, + style: GoogleFonts.plusJakartaSans( + height: 1, + color: Colors.white, + fontWeight: FontWeight.w300, + fontSize: 16.h), + mode: TextScrollMode.endless, + velocity: Velocity(pixelsPerSecond: Offset(50, 20)), + pauseBetween: Duration(milliseconds: 500), + ), + )), + Container(width: 10), + AutoSizeText( + music.date.toString(), + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.5), + fontWeight: FontWeight.w300, + fontSize: 16.h), + textAlign: TextAlign.end, + maxFontSize: 20, + ), ], ), - ), - ), - )), - SizedBox(height: 15), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 8, - child: TextScroll( - "BOOBA", - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 26.h), - mode: TextScrollMode.endless, - pauseBetween: Duration(milliseconds: 500), - velocity: Velocity(pixelsPerSecond: Offset(20, 0)), - )), - Padding( - padding: EdgeInsets.only( - bottom: 10.h, right: 5.w, left: 5.w), - child: ClipOval( - child: Container( - width: 5.h, - height: 5.h, - color: Colors.white, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: EdgeInsets.only(bottom: 2), - child: TextScroll( - "A.C. Milan", - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w300, - fontSize: 16.h), - mode: TextScrollMode.endless, - velocity: - Velocity(pixelsPerSecond: Offset(50, 20)), - pauseBetween: Duration(milliseconds: 500), - ), - )), - Container(width: 10), - AutoSizeText( - "2013", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.5), - fontWeight: FontWeight.w300, - fontSize: 16.h), - textAlign: TextAlign.end, - maxFontSize: 20, - ), - ], - ), - ], - ), - ); + ], + ); + } else { + return CupertinoActivityIndicator(); + } + })); } return SizedBox( - width: double.infinity, - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - ClipOval( - child: SizedBox.fromSize( - // Image radius - child: const Image( - image: - AssetImage("assets/images/exemple_profile.png"), - width: 40, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: const EdgeInsets.only(left: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Melina", - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w600), - ), - Text( - "France, Lyon", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.4), - fontWeight: FontWeight.w300, - fontSize: 13), - ) - ], - ), - ), - ), - Text( - "Aujourd’hui, 16:43", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.4), - fontWeight: FontWeight.w300, - fontSize: 13), - ), - ], - ), - SizedBox(height: 10), - ZoomTapAnimation( - onTap: widget.callback, - enableLongTapRepeatEvent: false, - longTapRepeatDuration: const Duration(milliseconds: 100), - begin: 1.0, - end: 0.99, - beginDuration: const Duration(milliseconds: 70), - endDuration: const Duration(milliseconds: 100), - beginCurve: Curves.decelerate, - endCurve: Curves.easeInOutSine, - child: AspectRatio( - aspectRatio: 1 / 1, - child: Container( - decoration: BoxDecoration( - // add border - border: const GradientBoxBorder( - gradient: LinearGradient( - colors: [ - Colors.transparent, - Color(0xFF323232), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter), - width: 2.5, - ), - // set border radius - borderRadius: BorderRadius.circular(20), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(18), - // implement image - child: Stack( - alignment: Alignment.bottomCenter, + width: double.infinity, + child: FutureBuilder( + future: Future.wait([fetchMusicData(), fetchUserData()]), + builder: (context, AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + final music = snapshot.data![0] as Music; + final user = snapshot.data![1] as User; + return Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, children: [ - Image( - image: AssetImage( - "assets/images/exemple_cover.png"), - fit: BoxFit.cover, - width: double.infinity, + ClipOval( + child: SizedBox.fromSize( + // Image radius + child: const Image( + image: AssetImage("assets/images/exemple_profile.png"), + width: 40, + ), + ), ), - Image( - image: - AssetImage("assets/images/shadow_post.png"), - fit: BoxFit.fitHeight, - width: double.infinity, + Expanded( + flex: 8, + child: Padding( + padding: const EdgeInsets.only(left: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + user.pseudo, + style: GoogleFonts.plusJakartaSans( + color: Colors.white, fontWeight: FontWeight.w600), + ), + Text( + "${widget.post.location.item1}, ${widget.post.location.item2}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ) + ], + ), + ), ), + DateTime(today.year, today.month, today.day).isAtSameMomentAs( + DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day)) + ? Text( + "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ) + : Text( + "${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${widget.post.date.hour}:${widget.post.date.minute}", + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.4), + fontWeight: FontWeight.w300, + fontSize: 13), + ), + ], + ), + SizedBox(height: 10), + ZoomTapAnimation( + onTap: () { + widget.callback!(widget.index); + }, + enableLongTapRepeatEvent: false, + longTapRepeatDuration: const Duration(milliseconds: 100), + begin: 1.0, + end: 0.99, + beginDuration: const Duration(milliseconds: 70), + endDuration: const Duration(milliseconds: 100), + beginCurve: Curves.decelerate, + endCurve: Curves.easeInOutSine, + child: AspectRatio( + aspectRatio: 1 / 1, + child: Container( + decoration: BoxDecoration( + // add border + border: const GradientBoxBorder( + gradient: LinearGradient(colors: [ + Colors.transparent, + Color(0xFF323232), + ], begin: Alignment.topCenter, end: Alignment.bottomCenter), + width: 2.5, + ), + // set border radius + borderRadius: BorderRadius.circular(20), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + // implement image + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + Image( + image: NetworkImage(music.cover!), + fit: BoxFit.cover, + width: double.infinity, + ), + Image( + image: AssetImage("assets/images/shadow_post.png"), + fit: BoxFit.fitHeight, + width: double.infinity, + ), + Padding( + padding: EdgeInsets.all(15), + child: AutoSizeText( + '“${widget.post.description}”', + style: GoogleFonts.plusJakartaSans( + color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.sp), + maxFontSize: 20, + maxLines: 1, + ), + ), + Positioned( + top: 0, + right: 0, + child: Padding( + padding: EdgeInsets.all(12), + child: Container( + constraints: BoxConstraints(maxWidth: 140, maxHeight: 140), + width: 80.sp, + height: 80.sp, + decoration: BoxDecoration( + color: Colors.white, + // add border + border: Border.all(width: 3, color: Colors.white), + // set border radius + borderRadius: BorderRadius.circular(15), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(13), + // implement image + child: Image( + image: NetworkImage(user.pp), + fit: BoxFit.cover, + ), + ), + ), + )) + ], + ), + ), + ), + )), + SizedBox(height: 15), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 8, + child: TextScroll( + music.artists.first.name!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h), + mode: TextScrollMode.endless, + pauseBetween: Duration(milliseconds: 500), + velocity: Velocity(pixelsPerSecond: Offset(20, 0)), + )), Padding( - padding: EdgeInsets.all(15), - child: AutoSizeText( - '“J’écoute en boucle ce son. B2O<3”', - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 15.sp), - maxFontSize: 20, - maxLines: 1, + padding: EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w), + child: ClipOval( + child: Container( + width: 5.h, + height: 5.h, + color: Colors.white, + ), ), ), - Positioned( - top: 0, - right: 0, + Expanded( + flex: 8, child: Padding( - padding: EdgeInsets.all(12), - child: Container( - constraints: BoxConstraints( - maxWidth: 140, maxHeight: 140), - width: 80.sp, - height: 80.sp, - decoration: BoxDecoration( - color: Colors.white, - // add border - border: Border.all( - width: 3, color: Colors.white), - // set border radius - borderRadius: BorderRadius.circular(15), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(13), - // implement image - child: Image( - image: AssetImage( - 'assets/images/exemple_profile.png'), - fit: BoxFit.cover, - ), - ), + padding: EdgeInsets.only(bottom: 2), + child: TextScroll( + music.title!, + style: GoogleFonts.plusJakartaSans( + height: 1, color: Colors.white, fontWeight: FontWeight.w300, fontSize: 16.h), + mode: TextScrollMode.endless, + velocity: Velocity(pixelsPerSecond: Offset(50, 20)), + pauseBetween: Duration(milliseconds: 500), ), - )) + )), + Container(width: 10), + AutoSizeText( + music.date.toString(), + style: GoogleFonts.plusJakartaSans( + color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h), + textAlign: TextAlign.end, + maxFontSize: 20, + ), ], ), - ), - ), - )), - SizedBox(height: 15), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 8, - child: TextScroll( - "BOOBA", - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 26.h), - mode: TextScrollMode.endless, - pauseBetween: Duration(milliseconds: 500), - velocity: Velocity(pixelsPerSecond: Offset(20, 0)), - )), - Padding( - padding: - EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w), - child: ClipOval( - child: Container( - width: 5.h, - height: 5.h, - color: Colors.white, - ), - ), - ), - Expanded( - flex: 8, - child: Padding( - padding: EdgeInsets.only(bottom: 2), - child: TextScroll( - "A.C. Milan", - style: GoogleFonts.plusJakartaSans( - height: 1, - color: Colors.white, - fontWeight: FontWeight.w300, - fontSize: 16.h), - mode: TextScrollMode.endless, - velocity: Velocity(pixelsPerSecond: Offset(50, 20)), - pauseBetween: Duration(milliseconds: 500), - ), - )), - Container(width: 10), - AutoSizeText( - "2013", - style: GoogleFonts.plusJakartaSans( - color: Colors.white.withOpacity(0.5), - fontWeight: FontWeight.w300, - fontSize: 16.h), - textAlign: TextAlign.end, - maxFontSize: 20, - ), - ], - ), - ], - ), - ); + ], + ); + } else { + return CupertinoActivityIndicator(); + } + })); }, ), ); diff --git a/Sources/justMUSIC/lib/screens/feed_screen.dart b/Sources/justMUSIC/lib/screens/feed_screen.dart index 216dae6..32055e7 100644 --- a/Sources/justMUSIC/lib/screens/feed_screen.dart +++ b/Sources/justMUSIC/lib/screens/feed_screen.dart @@ -1,14 +1,13 @@ -import 'package:another_flushbar/flushbar.dart'; import 'package:circular_reveal_animation/circular_reveal_animation.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:justmusic/main.dart'; import '../components/comment_component.dart'; import '../components/post_component.dart'; import '../components/top_nav_bar_component.dart'; -import '../main.dart'; import '../model/Post.dart'; import '../values/constants.dart'; @@ -19,7 +18,7 @@ class FeedScreen extends StatefulWidget { State createState() => _FeedScreenState(); } -class _FeedScreenState extends State with TickerProviderStateMixin { +class _FeedScreenState extends State with SingleTickerProviderStateMixin { late AnimationController animationController; late Animation animation; late List friendFeed; @@ -29,9 +28,10 @@ class _FeedScreenState extends State with TickerProviderStateMixin { @override void initState() { super.initState(); - friendFeed = []; + friendFeed = MyApp.postViewModel.postsFriends; + MyApp.postViewModel.getBestPosts(); discoveryFeed = MyApp.postViewModel.bestPosts; - displayFeed = friendFeed; + displayFeed = []; animationController = AnimationController( vsync: this, duration: Duration(milliseconds: 400), @@ -54,19 +54,21 @@ class _FeedScreenState extends State with TickerProviderStateMixin { if (choice) { setState(() { animationController.reset(); - displayFeed = friendFeed; + displayFeed = MyApp.postViewModel.postsFriends; animationController.forward(); + print(displayFeed.length); }); } else { setState(() { animationController.reset(); - displayFeed = discoveryFeed; + displayFeed = MyApp.postViewModel.bestPosts; + print(displayFeed.length); animationController.forward(); }); } } - void openDetailPost() { + void openDetailPost(int index) { showModalBottomSheet( backgroundColor: bgModal, elevation: 1, @@ -76,8 +78,7 @@ class _FeedScreenState extends State with TickerProviderStateMixin { isScrollControlled: true, context: context, shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), topRight: Radius.circular(20))), + borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))), builder: ((BuildContext context) { return GestureDetector( onTap: () { @@ -96,47 +97,42 @@ class _FeedScreenState extends State with TickerProviderStateMixin { child: Container( width: 60, height: 5, - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.3), - borderRadius: BorderRadius.circular(20))), + decoration: + BoxDecoration(color: Colors.white.withOpacity(0.3), borderRadius: BorderRadius.circular(20))), ), const SizedBox( height: 20, ), Expanded( child: ClipRRect( - borderRadius: BorderRadius.only( - topRight: Radius.circular(15), - topLeft: Radius.circular(15)), + borderRadius: BorderRadius.only(topRight: Radius.circular(15), topLeft: Radius.circular(15)), child: Padding( - padding: EdgeInsets.only( - left: defaultPadding, right: defaultPadding), + padding: EdgeInsets.only(left: defaultPadding, right: defaultPadding), child: SingleChildScrollView( - physics: BouncingScrollPhysics( - decelerationRate: ScrollDecelerationRate.fast), + physics: BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), child: Wrap( // to apply margin in the main axis of the wrap runSpacing: 10, children: [ PostComponent( callback: null, + post: displayFeed[index], + index: index, ), Container(height: 10), Align( child: RichText( text: TextSpan( text: "3", - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w600), + style: + GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600), children: [ - TextSpan( - text: " commentaires", - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w300), - ) - ])), + TextSpan( + text: " commentaires", + style: + GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w300), + ) + ])), ), SizedBox(height: 20), CommentComponent(), @@ -150,18 +146,12 @@ class _FeedScreenState extends State with TickerProviderStateMixin { ), ), Padding( - padding: EdgeInsets.only( - bottom: MediaQuery - .of(context) - .viewInsets - .bottom), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), child: Container( height: 70, width: double.infinity, decoration: BoxDecoration( - border: Border( - top: BorderSide(color: grayColor, width: 2)), - color: textFieldMessage), + border: Border(top: BorderSide(color: grayColor, width: 2)), color: textFieldMessage), child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), @@ -171,8 +161,7 @@ class _FeedScreenState extends State with TickerProviderStateMixin { child: SizedBox.fromSize( // Image radius child: const Image( - image: AssetImage( - "assets/images/exemple_profile.png"), + image: AssetImage("assets/images/exemple_profile.png"), width: 45, ), ), @@ -185,8 +174,7 @@ class _FeedScreenState extends State with TickerProviderStateMixin { keyboardAppearance: Brightness.dark, cursorColor: primaryColor, keyboardType: TextInputType.emailAddress, - style: GoogleFonts.plusJakartaSans( - color: Colors.white), + style: GoogleFonts.plusJakartaSans(color: Colors.white), decoration: InputDecoration( suffixIcon: Icon( Icons.send, @@ -194,27 +182,17 @@ class _FeedScreenState extends State with TickerProviderStateMixin { size: 20, ), focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - width: 1, color: grayText), - borderRadius: BorderRadius.all( - Radius.circular(100))), - contentPadding: EdgeInsets.only( - top: 0, - bottom: 0, - left: 20, - right: 20), + borderSide: BorderSide(width: 1, color: grayText), + borderRadius: BorderRadius.all(Radius.circular(100))), + contentPadding: EdgeInsets.only(top: 0, bottom: 0, left: 20, right: 20), fillColor: bgModal, filled: true, - focusColor: - Color.fromRGBO(255, 255, 255, 0.30), + focusColor: Color.fromRGBO(255, 255, 255, 0.30), enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - width: 1, color: grayText), - borderRadius: BorderRadius.all( - Radius.circular(100))), + borderSide: BorderSide(width: 1, color: grayText), + borderRadius: BorderRadius.all(Radius.circular(100))), hintText: 'Ajoutez une réponse...', - hintStyle: GoogleFonts.plusJakartaSans( - color: grayText)), + hintStyle: GoogleFonts.plusJakartaSans(color: grayText)), ), ) ], @@ -240,47 +218,30 @@ class _FeedScreenState extends State with TickerProviderStateMixin { CircularRevealAnimation( animation: animation, centerOffset: Offset(30.w, -100), - child: SingleChildScrollView( - physics: const BouncingScrollPhysics( - decelerationRate: ScrollDecelerationRate.fast), - child: SizedBox( - width: double.infinity, - child: Align( - child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 600), - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: defaultPadding), - child: Container( - width: double.infinity, - child: Padding( - padding: EdgeInsets.only(top: 100.h), - child: SingleChildScrollView( - child: ListView.builder( - itemBuilder: (BuildContext context, - int index) { - return PostComponent(callback: openDetailPost,); - }, - - ), - )), - ), - ), - ), - )), - ), + child: Container( + constraints: BoxConstraints(maxWidth: 600), + padding: EdgeInsets.fromLTRB(defaultPadding, 100.h, defaultPadding, 0), + child: ListView.builder( + physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), + clipBehavior: Clip.none, + shrinkWrap: true, + itemCount: displayFeed.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(bottom: 40), + child: PostComponent(callback: openDetailPost, post: displayFeed[index], index: index), + ); + }, + )), ), IgnorePointer( child: Container( height: 240.h, decoration: BoxDecoration( - gradient: LinearGradient(begin: Alignment.topRight, stops: [ - 0.3, - 1 - ], colors: [ - bgColor.withOpacity(0.9), - bgColor.withOpacity(0) - ])), + gradient: LinearGradient( + begin: Alignment.topRight, + stops: [0.3, 1], + colors: [bgColor.withOpacity(0.9), bgColor.withOpacity(0)])), ), ), Align( diff --git a/Sources/justMUSIC/lib/view_model/PostViewModel.dart b/Sources/justMUSIC/lib/view_model/PostViewModel.dart index fbacc1c..2947a59 100644 --- a/Sources/justMUSIC/lib/view_model/PostViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/PostViewModel.dart @@ -20,8 +20,7 @@ class PostViewModel { List get bestPosts => _bestPosts; // Methods - addPost(String? description, String idMusic, File? image, - Tuple2? location) async { + addPost(String? description, String idMusic, File? image, Tuple2? location) async { await _postService.createPost(description, idMusic, image, location); } @@ -37,8 +36,8 @@ class PostViewModel { try { var responseData = await _postService.getPopularPosts(); - _bestPosts = - responseData.map((value) => PostMapper.toModel(value)).toList(); + _bestPosts = responseData.map((value) => PostMapper.toModel(value)).toList(); + print(_bestPosts.length); } catch (e) { print(e); }