[mob][photos] Use loading indicator instead of blocking progress

This commit is contained in:
Neeraj Gupta 2024-04-19 15:52:41 +05:30
parent 564ca77a8b
commit 08040d9154

View file

@ -3,11 +3,11 @@ import "dart:async";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:like_button/like_button.dart"; import "package:like_button/like_button.dart";
import "package:logging/logging.dart"; import "package:logging/logging.dart";
import "package:photos/core/configuration.dart";
import "package:photos/generated/l10n.dart"; import "package:photos/generated/l10n.dart";
import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file.dart';
import "package:photos/services/favorites_service.dart"; import "package:photos/services/favorites_service.dart";
import "package:photos/ui/common/progress_dialog.dart"; import "package:photos/ui/common/loading_widget.dart";
import "package:photos/utils/dialog_util.dart";
import "package:photos/utils/toast_util.dart"; import "package:photos/utils/toast_util.dart";
class FavoriteWidget extends StatefulWidget { class FavoriteWidget extends StatefulWidget {
@ -18,13 +18,13 @@ class FavoriteWidget extends StatefulWidget {
super.key, super.key,
}); });
// State<ShareCollectionPage> createState() => _ShareCollectionPageState();
@override @override
State<StatefulWidget> createState() => _FavoriteWidgetState(); State<StatefulWidget> createState() => _FavoriteWidgetState();
} }
class _FavoriteWidgetState extends State<FavoriteWidget> { class _FavoriteWidgetState extends State<FavoriteWidget> {
late Logger _logger; late Logger _logger;
bool _isLoading = false;
@override @override
void initState() { void initState() {
@ -42,61 +42,67 @@ class _FavoriteWidgetState extends State<FavoriteWidget> {
future: _fetchData(), future: _fetchData(),
builder: (context, snapshot) { builder: (context, snapshot) {
final bool isLiked = snapshot.data ?? false; final bool isLiked = snapshot.data ?? false;
return LikeButton( return _isLoading
size: 24, ? const EnteLoadingWidget(
isLiked: isLiked, size: 12,
onTap: (oldValue) async { ) // Add this line
final isLiked = !oldValue; : LikeButton(
bool hasError = false; size: 24,
if (isLiked) { isLiked: isLiked,
final shouldBlockUser = widget.file.uploadedFileID == null; onTap: (oldValue) async {
late ProgressDialog dialog; if (widget.file.uploadedFileID == null ||
if (shouldBlockUser) { widget.file.ownerID !=
dialog = createProgressDialog( Configuration.instance.getUserID()!) {
context, setState(() {
S.of(context).addingToFavorites, _isLoading = true; // Add this line
); });
await dialog.show(); }
} final isLiked = !oldValue;
try { bool hasError = false;
await FavoritesService.instance.addToFavorites( if (isLiked) {
context, try {
widget.file, await FavoritesService.instance.addToFavorites(
); context,
} catch (e, s) { widget.file,
_logger.severe(e, s); );
hasError = true; } catch (e, s) {
showToast(context, S.of(context).sorryCouldNotAddToFavorites); _logger.severe(e, s);
} finally { hasError = true;
if (shouldBlockUser) { showToast(
await dialog.hide(); context, S.of(context).sorryCouldNotAddToFavorites);
} }
} } else {
} else { try {
try { await FavoritesService.instance
await FavoritesService.instance .removeFromFavorites(context, widget.file);
.removeFromFavorites(context, widget.file); } catch (e, s) {
} catch (e, s) { _logger.severe(e, s);
_logger.severe(e, s); hasError = true;
hasError = true; showToast(
showToast( context,
context, S.of(context).sorryCouldNotRemoveFromFavorites,
S.of(context).sorryCouldNotRemoveFromFavorites, );
); }
} }
} setState(() {
return hasError ? oldValue : isLiked; _isLoading = false; // Add this line
}, });
likeBuilder: (isLiked) { return hasError ? oldValue : isLiked;
return Icon( },
isLiked ? Icons.favorite_rounded : Icons.favorite_border_rounded, likeBuilder: (isLiked) {
color: isLiked debugPrint(
? Colors.pinkAccent "File Upload ID ${widget.file.uploadedFileID} & collection ${widget.file.collectionID}");
: Colors.white, //same for both themes return Icon(
size: 24, isLiked
); ? Icons.favorite_rounded
}, : Icons.favorite_border_rounded,
); color: isLiked
? Colors.pinkAccent
: Colors.white, //same for both themes
size: 24,
);
},
);
}, },
); );
} }