change text artist and title
continuous-integration/drone/push Build is passing Details

MANAGE_COMMENTS_LDE
Lucas Delanier 2 years ago
parent eece9357ec
commit 929f090464

@ -2,17 +2,24 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/model/Comment.dart';
import '../values/constants.dart'; import '../values/constants.dart';
class CommentComponent extends StatelessWidget { class CommentComponent extends StatelessWidget {
const CommentComponent({Key? key}) : super(key: key); final Comment comment;
const CommentComponent({Key? key, required this.comment}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final now = DateTime.now();
final difference = now.difference(comment.date);
return Container( return Container(
width: double.infinity, width: double.infinity,
decoration: BoxDecoration(color: bgComment, borderRadius: BorderRadius.circular(20)), decoration: BoxDecoration(color: bgComment, borderRadius: BorderRadius.circular(20)),
padding: EdgeInsets.all(20), padding: EdgeInsets.all(20),
margin: EdgeInsets.only(bottom: 20),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -20,28 +27,30 @@ class CommentComponent extends StatelessWidget {
child: SizedBox.fromSize( child: SizedBox.fromSize(
// Image radius // Image radius
child: Image( child: Image(
image: AssetImage("assets/images/exemple_profile.png"), image: NetworkImage(comment.user.pp),
width: 40, width: 40,
), ),
), ),
), ),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
SizedBox( SizedBox(
width: 10, width: 10,
), ),
Text( Text(
"Melina", comment.user.pseudo,
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600), style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600),
), ),
Padding( Padding(
padding: EdgeInsets.only(top: 6, left: 10), padding: EdgeInsets.only(top: 6, left: 10),
child: Text( child: Text(
"Il y a 2 min(s)", "il y a ${difference.inHours}h",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10), color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10),
), ),
@ -54,8 +63,8 @@ class CommentComponent extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 10), padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text( child: Text(
"Jadore ce son aussi, je trouve quil avait vraiment une plume de fou.", comment.text,
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w300, fontSize: 11), style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 12),
), ),
), ),
], ],

@ -17,6 +17,7 @@ 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/welcome_screen.dart'; import 'package:justmusic/screens/welcome_screen.dart';
import 'package:justmusic/values/constants.dart'; import 'package:justmusic/values/constants.dart';
import 'package:justmusic/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart'; import 'package:justmusic/view_model/MusicViewModel.dart';
import 'package:justmusic/view_model/PostViewModel.dart'; import 'package:justmusic/view_model/PostViewModel.dart';
import 'package:justmusic/view_model/UserViewModel.dart'; import 'package:justmusic/view_model/UserViewModel.dart';
@ -38,6 +39,7 @@ class MyApp extends StatefulWidget {
static MusicViewModel musicViewModel = MusicViewModel(); static MusicViewModel musicViewModel = MusicViewModel();
static PostViewModel postViewModel = PostViewModel(); static PostViewModel postViewModel = PostViewModel();
static AudioPlayer audioPlayer = AudioPlayer(); static AudioPlayer audioPlayer = AudioPlayer();
static CommentViewModel commentViewModel = CommentViewModel();
const MyApp({super.key}); const MyApp({super.key});

@ -8,10 +8,6 @@ class CommentMapper {
static Future<Comment> toModel(DocumentSnapshot<Map<String, dynamic>> snapshot) async { static Future<Comment> toModel(DocumentSnapshot<Map<String, dynamic>> snapshot) async {
final data = snapshot.data(); final data = snapshot.data();
User? user = await MyApp.userViewModel.getUser(data?['user_id']); User? user = await MyApp.userViewModel.getUser(data?['user_id']);
return Comment( return Comment(snapshot.id, user!, data?["text"] ?? "", data?["date"].toDate());
snapshot.id,
user!,
data?["text"],
data?["date"]);
} }
} }

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/Material.dart'; import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -15,6 +16,7 @@ import '../components/comment_component.dart';
import '../main.dart'; import '../main.dart';
import '../model/Post.dart'; import '../model/Post.dart';
import '../model/Comment.dart';
import '../values/constants.dart'; import '../values/constants.dart';
class DetailPostScreen extends StatefulWidget { class DetailPostScreen extends StatefulWidget {
@ -106,7 +108,8 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
width: double.infinity, width: double.infinity,
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
)), ),
),
Column( Column(
children: [ children: [
Container( Container(
@ -118,7 +121,8 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal], colors: [Colors.transparent, bgModal],
stops: [0, 0.8]), stops: [0, 0.8],
),
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 10), padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
@ -157,31 +161,37 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: ScrollConfiguration( child: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false), behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll( child: TextScroll(
choice choice ? widget.post.user.pseudo : widget.post.music.title!,
? widget.post.user.pseudo
: widget.post.music.title!,
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w800, fontWeight: FontWeight.w800,
fontSize: 22), fontSize: 22,
),
mode: TextScrollMode.endless, mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500), pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)), velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
))), ),
),
),
Padding( Padding(
padding: const EdgeInsets.only(left: 20.0), padding: const EdgeInsets.only(left: 20.0),
child: choice child: choice
? DateTime(today.year, today.month, today.day) ? DateTime(today.year, today.month, today.day).isAtSameMomentAs(
.isAtSameMomentAs(DateTime(widget.post.date.year, DateTime(
widget.post.date.month, widget.post.date.day)) widget.post.date.year,
widget.post.date.month,
widget.post.date.day,
),
)
? Text( ? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}", "Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontSize: 18), fontSize: 18,
),
) )
: Text( : Text(
"hier, ${widget.post.date.hour}:${widget.post.date.minute}", "hier, ${widget.post.date.hour}:${widget.post.date.minute}",
@ -189,7 +199,8 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontSize: 18), fontSize: 18,
),
) )
: Text( : Text(
widget.post.music.date.toString(), widget.post.music.date.toString(),
@ -197,9 +208,10 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontSize: 18), fontSize: 18,
),
),
), ),
)
], ],
), ),
), ),
@ -210,27 +222,32 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.5), color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
fontSize: 15), fontSize: 15,
),
) )
: Text( : Text(
"", "",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
fontSize: 13), fontSize: 13,
),
) )
: ScrollConfiguration( : ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false), behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(widget.post.music.artists.first.name!, child: TextScroll(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 17), fontSize: 17,
),
mode: TextScrollMode.endless, mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500), pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0))), velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
) ),
),
], ],
), ),
), ),
@ -250,7 +267,8 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 1, height: 1,
color: Colors.white, color: Colors.white,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
fontSize: 14), fontSize: 14,
),
), ),
), ),
) )
@ -263,8 +281,8 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
color: bgAppBar, color: bgAppBar,
border: Border( border: Border(
top: BorderSide( top: BorderSide(
color: Color(0xFF262626), // Couleur de la bordure color: Color(0xFF262626),
width: 1.0, // Épaisseur de la bordure width: 1.0,
), ),
), ),
), ),
@ -280,42 +298,72 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
onTap: () { onTap: () {
myFocusNode.requestFocus(); myFocusNode.requestFocus();
}, },
child: SvgPicture.asset("assets/images/chat.svg", child:
semanticsLabel: 'Chat Logo')), SvgPicture.asset("assets/images/chat.svg", semanticsLabel: 'Chat Logo'),
),
SvgPicture.asset("assets/images/add.svg", SvgPicture.asset("assets/images/add.svg",
semanticsLabel: 'Add playlist Logo'), semanticsLabel: 'Add playlist Logo'),
SvgPicture.asset("assets/images/save.svg", semanticsLabel: 'Save Logo'), SvgPicture.asset("assets/images/save.svg", semanticsLabel: 'Save Logo'),
SvgPicture.asset("assets/images/report.svg", SvgPicture.asset("assets/images/report.svg", semanticsLabel: 'Report Logo'),
semanticsLabel: 'Report Logo'),
], ],
), ),
), ),
Padding( FutureBuilder<List<Comment>>(
future: MyApp.commentViewModel.getCommentsByPostId(widget.post.id),
builder: (BuildContext context, AsyncSnapshot<List<Comment>> snapshot) {
if (snapshot.hasData) {
print("test:");
return Column(
children: [
snapshot.data!.length > 0
? Padding(
padding: const EdgeInsets.all(15.0), padding: const EdgeInsets.all(15.0),
child: RichText( child: RichText(
text: TextSpan( text: TextSpan(
text: "3", text: snapshot.data!.length.toString(),
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w800), color: Colors.white,
fontWeight: FontWeight.w800,
),
children: [ children: [
TextSpan( TextSpan(
text: " commentaires", text: snapshot.data!.length > 1
? " commentaires"
: " commentaire",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w400), color: Colors.white,
) fontWeight: FontWeight.w400,
])), ),
), ),
Padding(
padding: EdgeInsets.fromLTRB(20, 0, 20, 20),
child: Wrap(
runSpacing: 13,
children: [
CommentComponent(),
CommentComponent(),
CommentComponent(),
], ],
), ),
),
) )
: Container(),
snapshot.data!.length > 0
? Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
child: ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: snapshot.data?.length,
itemBuilder: (BuildContext context, int index) {
return CommentComponent(comment: snapshot.data![index]);
},
),
)
: Container(),
],
);
} else {
return Container(
child: Center(
child: CupertinoActivityIndicator(),
),
);
}
},
),
], ],
), ),
), ),
@ -344,22 +392,24 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 120, height: 120,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(width: 4, color: Colors.white)), border: Border.all(width: 4, color: Colors.white),
),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
// implement image // implementer l'image
child: Image( child: Image(
image: NetworkImage( image: NetworkImage(choice ? widget.post.music.cover! : widget.post.selfie!),
choice ? widget.post.music.cover! : widget.post.selfie!),
fit: BoxFit.cover, fit: BoxFit.cover,
)), ),
),
), ),
), ),
) )
: Container() : Container(),
], ],
), ),
)), ),
),
Align( Align(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
child: Container( child: Container(
@ -373,7 +423,10 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
width: 60, width: 60,
height: 5, height: 5,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white.withOpacity(0.6), borderRadius: BorderRadius.circular(20))), color: Colors.white.withOpacity(0.6),
borderRadius: BorderRadius.circular(20),
),
),
), ),
), ),
), ),
@ -386,7 +439,9 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 70, height: 70,
width: double.infinity, width: double.infinity,
decoration: BoxDecoration( 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: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20), padding: const EdgeInsets.symmetric(horizontal: 20),
@ -394,16 +449,14 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
children: [ children: [
ClipOval( ClipOval(
child: SizedBox.fromSize( child: SizedBox.fromSize(
// Image radius // Rayon de l'image
child: Image.network( child: Image.network(
MyApp.userViewModel.userCurrent.pp, MyApp.userViewModel.userCurrent.pp,
width: 45, width: 45,
), ),
), ),
), ),
SizedBox( SizedBox(width: 10),
width: 10,
),
Expanded( Expanded(
child: TextField( child: TextField(
keyboardAppearance: Brightness.dark, keyboardAppearance: Brightness.dark,
@ -420,26 +473,31 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText), borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100))), borderRadius: BorderRadius.all(Radius.circular(100)),
),
contentPadding: EdgeInsets.only(top: 0, bottom: 0, left: 20, right: 20), contentPadding: EdgeInsets.only(top: 0, bottom: 0, left: 20, right: 20),
fillColor: bgModal, fillColor: bgModal,
filled: true, filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30), focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText), borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100))), borderRadius: BorderRadius.all(Radius.circular(100)),
),
hintText: 'Ajoutez une réponse...', hintText: 'Ajoutez une réponse...',
hintStyle: GoogleFonts.plusJakartaSans(color: grayText)), hintStyle: GoogleFonts.plusJakartaSans(color: grayText),
),
),
), ),
)
], ],
), ),
), ),
)), ),
),
), ),
], ],
), ),
)); ),
);
} }
} }

@ -13,8 +13,8 @@ class CommentViewModel {
// Methods // Methods
addComment(String text, String idPost) async { addComment(String text, String idPost) async {
try { try {
await _commentService.createComment(text,idPost); await _commentService.createComment(text, idPost);
} catch(e) { } catch (e) {
print(e); print(e);
rethrow; rethrow;
} }
@ -23,12 +23,15 @@ class CommentViewModel {
Future<List<Comment>> getCommentsByPostId(String id) async { Future<List<Comment>> getCommentsByPostId(String id) async {
try { try {
var responseData = await _commentService.getCommentsByPostId(id); var responseData = await _commentService.getCommentsByPostId(id);
print(responseData.length);
var commentsFutures = responseData.map((value) async { var commentsFutures = responseData.map((value) async {
return await CommentMapper.toModel(value); return await CommentMapper.toModel(value);
}).toList(); }).toList();
_comments = await Future.wait(commentsFutures); _comments = await Future.wait(commentsFutures);
print("ccccccc");
_comments.map((e) => print(e.text));
return _comments; return _comments;
} catch(e) { } catch (e) {
print(e); print(e);
_comments = []; _comments = [];
return []; return [];

Loading…
Cancel
Save