Add voting widget for handling voting

This commit is contained in:
krawieck 2020-09-17 16:46:40 +02:00
parent c4329a163f
commit c9558a5945
1 changed files with 70 additions and 5 deletions

View File

@ -9,6 +9,8 @@ import 'package:lemmy_api_client/lemmy_api_client.dart';
import 'package:timeago/timeago.dart' as timeago; import 'package:timeago/timeago.dart' as timeago;
import 'package:url_launcher/url_launcher.dart' as ul; import 'package:url_launcher/url_launcher.dart' as ul;
import '../hooks/delayed_loading.dart';
import '../hooks/stores.dart';
import '../pages/full_post.dart'; import '../pages/full_post.dart';
import '../url_launcher.dart'; import '../url_launcher.dart';
import '../util/api_extensions.dart'; import '../util/api_extensions.dart';
@ -408,11 +410,12 @@ class Post extends HookWidget {
? Icon(Icons.bookmark) ? Icon(Icons.bookmark)
: Icon(Icons.bookmark_border), : Icon(Icons.bookmark_border),
onPressed: _savePost), onPressed: _savePost),
IconButton( _Voting(post),
icon: Icon(Icons.arrow_upward), onPressed: _upvotePost), // IconButton(
Text(NumberFormat.compact().format(post.score)), // icon: Icon(Icons.arrow_upward), onPressed: _upvotePost),
IconButton( // Text(NumberFormat.compact().format(post.score)),
icon: Icon(Icons.arrow_downward), onPressed: _downvotePost), // IconButton(
// icon: Icon(Icons.arrow_downward), onPressed: _downvotePost),
], ],
), ),
); );
@ -449,3 +452,65 @@ class Post extends HookWidget {
); );
} }
} }
class _Voting extends HookWidget {
final PostView post;
_Voting(this.post);
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final myVote = useState(post.myVote ?? 0);
final store = useAccountsStore();
final loading = useDelayedLoading(Duration(milliseconds: 500));
vote(VoteType vote) async {
final api = LemmyApi(post.instanceUrl).v1;
final token = store.defaultTokenFor(post.instanceUrl);
if (token == null) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text("can't vote if you ain't logged in")));
return;
}
loading.start();
try {
final res = await api.createPostLike(
postId: post.id, score: vote, auth: token.raw);
myVote.value = res.myVote;
} catch (e) {
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text('voting failed :(')));
return;
}
loading.cancel();
}
return Row(
children: [
IconButton(
icon: Icon(
Icons.arrow_upward,
color: myVote.value == 1 ? theme.accentColor : null,
),
onPressed: () =>
vote(myVote.value == 1 ? VoteType.none : VoteType.up),
),
if (loading.loading)
SizedBox(child: CircularProgressIndicator(), width: 20, height: 20)
else
Text(NumberFormat.compact().format(post.score + myVote.value)),
IconButton(
icon: Icon(
Icons.arrow_downward,
color: myVote.value == -1 ? Colors.red : null,
),
onPressed: () =>
vote(myVote.value == -1 ? VoteType.none : VoteType.down),
),
],
);
}
}