diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 7f7c6f9..8cb1ec7 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -114,6 +114,27 @@ + + + + + + + + + + + + + + + + + + @@ -352,6 +373,20 @@ + + + + + + + + + + + + @@ -667,6 +702,13 @@ + + + + + + @@ -758,6 +800,13 @@ + + + + + + @@ -786,6 +835,20 @@ + + + + + + + + + + + + @@ -945,6 +1008,9 @@ + + + @@ -978,6 +1044,8 @@ + + @@ -1021,6 +1089,7 @@ + @@ -1034,9 +1103,12 @@ + + + diff --git a/Sources/justMUSIC/lib/components/comment_component.dart b/Sources/justMUSIC/lib/components/comment_component.dart index 7743f8c..c129839 100644 --- a/Sources/justMUSIC/lib/components/comment_component.dart +++ b/Sources/justMUSIC/lib/components/comment_component.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -18,9 +19,7 @@ class CommentComponent extends StatelessWidget { return Container( width: double.infinity, - decoration: BoxDecoration( - color: bgComment.withOpacity(0.6), - borderRadius: BorderRadius.circular(15)), + decoration: BoxDecoration(color: bgComment.withOpacity(0.6), borderRadius: BorderRadius.circular(15)), padding: EdgeInsets.fromLTRB(20, 10, 20, 10), margin: EdgeInsets.only(bottom: 13), child: Row( @@ -28,11 +27,17 @@ class CommentComponent extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ ClipOval( - child: SizedBox.fromSize( + child: SizedBox( + height: 40, + width: 40, // Image radius - child: Image( - image: NetworkImage(comment.user.pp), - width: 40, + child: CachedNetworkImage( + imageUrl: comment.user.pp, + fadeInDuration: const Duration(milliseconds: 200), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), ), @@ -49,17 +54,14 @@ class CommentComponent extends StatelessWidget { ), Text( comment.user.pseudo, - style: GoogleFonts.plusJakartaSans( - color: Colors.white, fontWeight: FontWeight.w600), + style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600), ), Padding( padding: EdgeInsets.only(top: 6, left: 10), child: Text( "il y a ${difference.inHours > 0 ? difference.inHours : difference.inMinutes}${difference.inHours > 0 ? "h" : "m"}", 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), ), ), ], @@ -71,10 +73,7 @@ class CommentComponent extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10), child: Text( comment.text, - style: GoogleFonts.plusJakartaSans( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 15), + style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15), ), ), ], diff --git a/Sources/justMUSIC/lib/components/editable_post_component.dart b/Sources/justMUSIC/lib/components/editable_post_component.dart index 82e0d30..5246e54 100644 --- a/Sources/justMUSIC/lib/components/editable_post_component.dart +++ b/Sources/justMUSIC/lib/components/editable_post_component.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:animated_appear/animated_appear.dart'; import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/Material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -150,10 +151,10 @@ class _EditablePostComponentState extends State with Tick ), ), ) - : Image( - image: NetworkImage(widget.music?.cover ?? ""), - fit: BoxFit.cover, - width: double.infinity, + : CachedNetworkImage( + imageUrl: widget.music!.cover!, + fadeInDuration: const Duration(milliseconds: 100), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), ), diff --git a/Sources/justMUSIC/lib/components/music_list_component.dart b/Sources/justMUSIC/lib/components/music_list_component.dart index c38608d..393c938 100644 --- a/Sources/justMUSIC/lib/components/music_list_component.dart +++ b/Sources/justMUSIC/lib/components/music_list_component.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/Material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:justmusic/components/play_button_component.dart'; @@ -28,12 +29,19 @@ class MusicListComponent extends StatelessWidget { return ClipRRect( borderRadius: BorderRadius.all(Radius.circular(5)), child: music.cover != null - ? FadeInImage.assetNetwork( + ? SizedBox( height: 60, width: 60, - fit: BoxFit.cover, - placeholder: "assets/images/loadingPlaceholder.gif", - image: music.cover!) + // Image radius + child: CachedNetworkImage( + imageUrl: music.cover!, + fadeInDuration: const Duration(milliseconds: 200), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ) : Container( height: 60, width: 60, @@ -41,8 +49,8 @@ class MusicListComponent extends StatelessWidget { ), ); } else { - return Image( - image: AssetImage("assets/images/exemple_cover.png"), + return const Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), height: 60, width: 60, ); diff --git a/Sources/justMUSIC/lib/components/post_component.dart b/Sources/justMUSIC/lib/components/post_component.dart index 2d0535c..5aa63e2 100644 --- a/Sources/justMUSIC/lib/components/post_component.dart +++ b/Sources/justMUSIC/lib/components/post_component.dart @@ -1,4 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -127,10 +128,16 @@ class _PostComponentState extends State with TickerProviderStateM child: Stack( alignment: Alignment.bottomCenter, children: [ - Image( - image: NetworkImage(widget.post.music.cover!), - fit: BoxFit.cover, + SizedBox( width: double.infinity, + child: CachedNetworkImage( + imageUrl: widget.post.music.cover!, + fadeInDuration: const Duration(milliseconds: 200), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), + ), ), Image( image: AssetImage("assets/images/shadow_post.png"), @@ -170,9 +177,14 @@ class _PostComponentState extends State with TickerProviderStateM child: ClipRRect( borderRadius: BorderRadius.circular(13), // implement image - child: Image( - image: NetworkImage(widget.post.selfie!), + child: CachedNetworkImage( + imageUrl: widget.post.selfie!, fit: BoxFit.cover, + fadeInDuration: const Duration(milliseconds: 200), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), ), diff --git a/Sources/justMUSIC/lib/components/profil_picture_component.dart b/Sources/justMUSIC/lib/components/profil_picture_component.dart index cd0ad72..fbdc84d 100644 --- a/Sources/justMUSIC/lib/components/profil_picture_component.dart +++ b/Sources/justMUSIC/lib/components/profil_picture_component.dart @@ -1,6 +1,5 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/Material.dart'; -import 'package:justmusic/screens/user_screen.dart'; - import '../config/routes.dart'; import '../model/User.dart'; @@ -20,11 +19,17 @@ class ProfilPictureComponent extends StatelessWidget { _openDetail(context); }, child: ClipOval( - child: SizedBox.fromSize( + child: SizedBox( + height: 40, + width: 40, // Image radius - child: Image( - image: NetworkImage(user.pp), - width: 40, + child: CachedNetworkImage( + imageUrl: user.pp, + fadeInDuration: const Duration(milliseconds: 300), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), ), diff --git a/Sources/justMUSIC/lib/components/profile_component.dart b/Sources/justMUSIC/lib/components/profile_component.dart index 9b18d1b..86b9f9a 100644 --- a/Sources/justMUSIC/lib/components/profile_component.dart +++ b/Sources/justMUSIC/lib/components/profile_component.dart @@ -1,4 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -18,13 +19,19 @@ class ProfileComponent extends StatelessWidget { children: [ ClipOval( child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 200, maxHeight: 200), - child: Image( - image: NetworkImage(user.pp), - height: 100.w, - width: 100.w, - ), - ), + constraints: BoxConstraints(maxWidth: 200, maxHeight: 200), + child: SizedBox( + width: 100.w, + height: 100.w, + child: CachedNetworkImage( + imageUrl: user.pp, + fadeInDuration: const Duration(milliseconds: 300), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + )), ), SizedBox( height: 10, diff --git a/Sources/justMUSIC/lib/components/top_nav_bar_component.dart b/Sources/justMUSIC/lib/components/top_nav_bar_component.dart index d258f68..d47357a 100644 --- a/Sources/justMUSIC/lib/components/top_nav_bar_component.dart +++ b/Sources/justMUSIC/lib/components/top_nav_bar_component.dart @@ -1,5 +1,6 @@ import 'package:another_flushbar/flushbar.dart'; import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; @@ -262,13 +263,18 @@ class _TopNavBarComponentState extends State with TickerProv Navigator.of(context).push(routeProfile()); }, child: ClipOval( - child: SizedBox.fromSize( - // Image radius - child: FadeInImage.assetNetwork( - placeholder: 'assets/images/loadingPlaceholder.gif', - image: MyApp.userViewModel.userCurrent.pp, + child: SizedBox( width: 30, - )), + // Image radius + child: CachedNetworkImage( + imageUrl: MyApp.userViewModel.userCurrent.pp, + fadeInDuration: const Duration(milliseconds: 300), + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), + ), + ), ), ), ) diff --git a/Sources/justMUSIC/lib/main.dart b/Sources/justMUSIC/lib/main.dart index 391db40..bcba65c 100644 --- a/Sources/justMUSIC/lib/main.dart +++ b/Sources/justMUSIC/lib/main.dart @@ -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'; @@ -45,6 +43,7 @@ class MyApp extends StatefulWidget { static PostViewModel postViewModel = PostViewModel(); static AudioPlayer audioPlayer = AudioPlayer(); static CommentViewModel commentViewModel = CommentViewModel(); + static const keyManager = 'customCacheKey'; const MyApp({super.key}); diff --git a/Sources/justMUSIC/lib/screens/detail_post_screen.dart b/Sources/justMUSIC/lib/screens/detail_post_screen.dart index a99e540..677a7de 100644 --- a/Sources/justMUSIC/lib/screens/detail_post_screen.dart +++ b/Sources/justMUSIC/lib/screens/detail_post_screen.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/Material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -89,11 +90,14 @@ class _DetailPostScreenState extends State { child: Container( height: 400, width: double.infinity, - child: FadeInImage.assetNetwork( - placeholder: "assets/images/loadingPlaceholder.gif", - image: choice ? widget.post.selfie! : widget.post.music.cover!, - width: double.infinity, + child: CachedNetworkImage( + imageUrl: choice ? widget.post.selfie! : widget.post.music.cover!, + fadeInDuration: const Duration(milliseconds: 300), fit: BoxFit.cover, + placeholder: (context, url) => Image( + image: AssetImage("assets/images/loadingPlaceholder.gif"), + ), + errorWidget: (context, url, error) => Icon(Icons.error), ), ), ), diff --git a/Sources/justMUSIC/lib/services/cacheManager.dart b/Sources/justMUSIC/lib/services/cacheManager.dart new file mode 100644 index 0000000..1d92571 --- /dev/null +++ b/Sources/justMUSIC/lib/services/cacheManager.dart @@ -0,0 +1,14 @@ +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; + +class CustomCacheManager { + static const key = 'customCacheKey'; + static CacheManager instance = CacheManager( + Config( + key, + stalePeriod: const Duration(days: 2), + maxNrOfCacheObjects: 40, + repo: JsonCacheInfoRepository(databaseName: key), + fileService: HttpFileService(), + ), + ); +} diff --git a/Sources/justMUSIC/pubspec.lock b/Sources/justMUSIC/pubspec.lock index 8268097..ef6e363 100644 --- a/Sources/justMUSIC/pubspec.lock +++ b/Sources/justMUSIC/pubspec.lock @@ -129,6 +129,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + url: "https://pub.dev" + source: hosted + version: "3.2.3" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + url: "https://pub.dev" + source: hosted + version: "1.0.2" characters: dependency: transitive description: @@ -398,6 +422,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + flutter_blurhash: + dependency: transitive + description: + name: flutter_blurhash + sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" flutter_countdown_timer: dependency: "direct main" description: @@ -752,6 +792,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + url: "https://pub.dev" + source: hosted + version: "1.0.2" path: dependency: transitive description: @@ -856,6 +904,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.7.3" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" sky_engine: dependency: transitive description: flutter @@ -885,6 +941,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" stack_trace: dependency: transitive description: diff --git a/Sources/justMUSIC/pubspec.yaml b/Sources/justMUSIC/pubspec.yaml index ae178c7..872339f 100644 --- a/Sources/justMUSIC/pubspec.yaml +++ b/Sources/justMUSIC/pubspec.yaml @@ -74,6 +74,7 @@ dependencies: flutter_keyboard_visibility: ^5.4.1 timezone: ^0.9.2 firebase_messaging: ^14.6.5 + cached_network_image: ^3.2.3 dev_dependencies: flutter_test: