favorite_widget.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import "dart:async";
  2. import "package:flutter/material.dart";
  3. import "package:like_button/like_button.dart";
  4. import "package:logging/logging.dart";
  5. import "package:photos/generated/l10n.dart";
  6. import 'package:photos/models/file/file.dart';
  7. import "package:photos/services/favorites_service.dart";
  8. import "package:photos/ui/common/progress_dialog.dart";
  9. import "package:photos/utils/dialog_util.dart";
  10. import "package:photos/utils/toast_util.dart";
  11. class FavoriteWidget extends StatefulWidget {
  12. final EnteFile file;
  13. const FavoriteWidget(
  14. this.file, {
  15. super.key,
  16. });
  17. // State<ShareCollectionPage> createState() => _ShareCollectionPageState();
  18. @override
  19. State<StatefulWidget> createState() => _FavoriteWidgetState();
  20. }
  21. class _FavoriteWidgetState extends State<FavoriteWidget> {
  22. late Logger _logger;
  23. @override
  24. void initState() {
  25. super.initState();
  26. _logger = Logger("_FavoriteWidgetState");
  27. }
  28. Future<bool> _fetchData() async {
  29. return FavoritesService.instance.isFavorite(widget.file);
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return FutureBuilder<bool>(
  34. future: _fetchData(),
  35. builder: (context, snapshot) {
  36. final bool isLiked = snapshot.data ?? false;
  37. return LikeButton(
  38. size: 24,
  39. isLiked: isLiked,
  40. onTap: (oldValue) async {
  41. final isLiked = !oldValue;
  42. bool hasError = false;
  43. if (isLiked) {
  44. final shouldBlockUser = widget.file.uploadedFileID == null;
  45. late ProgressDialog dialog;
  46. if (shouldBlockUser) {
  47. dialog = createProgressDialog(
  48. context,
  49. S.of(context).addingToFavorites,
  50. );
  51. await dialog.show();
  52. }
  53. try {
  54. await FavoritesService.instance.addToFavorites(
  55. context,
  56. widget.file,
  57. );
  58. } catch (e, s) {
  59. _logger.severe(e, s);
  60. hasError = true;
  61. showToast(context, S.of(context).sorryCouldNotAddToFavorites);
  62. } finally {
  63. if (shouldBlockUser) {
  64. await dialog.hide();
  65. }
  66. }
  67. } else {
  68. try {
  69. await FavoritesService.instance
  70. .removeFromFavorites(context, widget.file);
  71. } catch (e, s) {
  72. _logger.severe(e, s);
  73. hasError = true;
  74. unawaited(
  75. showToast(
  76. context,
  77. S.of(context).sorryCouldNotRemoveFromFavorites,
  78. ),
  79. );
  80. }
  81. }
  82. return hasError ? oldValue : isLiked;
  83. },
  84. likeBuilder: (isLiked) {
  85. return Icon(
  86. isLiked ? Icons.favorite_rounded : Icons.favorite_border_rounded,
  87. color: isLiked
  88. ? Colors.pinkAccent
  89. : Colors.white, //same for both themes
  90. size: 24,
  91. );
  92. },
  93. );
  94. },
  95. );
  96. }
  97. }