lemmur-app-android/lib/pages/full_post.dart

160 lines
4.9 KiB
Dart
Raw Normal View History

2020-09-21 20:19:14 +02:00
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
2021-01-09 02:11:30 +01:00
import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
2021-04-05 20:14:39 +02:00
import 'package:lemmy_api_client/v3.dart';
2020-09-21 20:19:14 +02:00
import '../hooks/logged_in_action.dart';
2021-01-09 17:34:24 +01:00
import '../hooks/refreshable.dart';
2020-09-17 18:38:03 +02:00
import '../hooks/stores.dart';
2021-02-24 20:52:18 +01:00
import '../util/extensions/api.dart';
import '../util/more_icon.dart';
2021-03-18 19:24:29 +01:00
import '../util/share.dart';
import '../widgets/comment_section.dart';
import '../widgets/post.dart';
2021-02-24 20:52:18 +01:00
import '../widgets/reveal_after_scroll.dart';
2020-09-17 18:34:03 +02:00
import '../widgets/save_post_button.dart';
2020-09-21 13:30:47 +02:00
import '../widgets/write_comment.dart';
2020-09-30 19:05:00 +02:00
/// Displays a post with its comment section
class FullPostPage extends HookWidget {
2020-09-17 18:34:03 +02:00
final int id;
final String instanceHost;
final PostView? post;
const FullPostPage({required this.id, required this.instanceHost})
: post = null;
FullPostPage.fromPostView(PostView this.post)
2021-01-24 20:01:55 +01:00
: id = post.post.id,
instanceHost = post.instanceHost;
@override
Widget build(BuildContext context) {
2020-09-17 18:37:27 +02:00
final accStore = useAccountsStore();
2021-02-24 20:52:18 +01:00
final scrollController = useScrollController();
2021-01-24 20:01:55 +01:00
final fullPostRefreshable =
2021-04-05 20:14:39 +02:00
useRefreshable(() => LemmyApiV3(instanceHost).run(GetPost(
2021-01-24 20:01:55 +01:00
id: id,
2021-04-11 18:27:22 +02:00
auth: accStore.defaultUserDataFor(instanceHost)?.jwt.raw,
2021-01-24 20:01:55 +01:00
)));
final loggedInAction = useLoggedInAction(instanceHost);
2020-09-21 13:30:47 +02:00
final newComments = useState(const <CommentView>[]);
2021-01-09 17:34:24 +01:00
// FALLBACK VIEW
if (!fullPostRefreshable.snapshot.hasData && this.post == null) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
2021-01-09 17:34:24 +01:00
if (fullPostRefreshable.snapshot.hasError)
Text(fullPostRefreshable.snapshot.error.toString())
else
const CircularProgressIndicator(),
],
),
),
);
}
// VARIABLES
2021-01-09 17:34:24 +01:00
final post = fullPostRefreshable.snapshot.hasData
? fullPostRefreshable.snapshot.data!.postView
: this.post!;
2021-01-09 17:34:24 +01:00
final fullPost = fullPostRefreshable.snapshot.data;
// FUNCTIONS
2021-01-09 02:11:30 +01:00
refresh() async {
await HapticFeedback.mediumImpact();
try {
2021-01-09 17:34:24 +01:00
await fullPostRefreshable.refresh();
2021-01-09 02:11:30 +01:00
// ignore: avoid_catches_without_on_clauses
} catch (e) {
2021-03-10 08:34:30 +01:00
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
2021-01-09 02:11:30 +01:00
content: Text(e.toString()),
));
}
}
2021-03-20 15:50:49 +01:00
sharePost() => share(post.post.apId, context: context);
2020-09-21 13:30:47 +02:00
comment() async {
2020-09-21 20:18:57 +02:00
final newComment = await showCupertinoModalPopup<CommentView>(
2020-09-21 13:30:47 +02:00
context: context,
2021-02-24 20:52:18 +01:00
builder: (_) => WriteComment.toPost(post.post),
2020-09-21 13:30:47 +02:00
);
if (newComment != null) {
newComments.value = [...newComments.value, newComment];
}
}
return Scaffold(
appBar: AppBar(
2021-02-24 20:52:18 +01:00
centerTitle: false,
title: RevealAfterScroll(
scrollController: scrollController,
after: 65,
child: Text(
2021-04-29 11:38:28 +02:00
post.community.originPreferredName,
2021-02-24 20:52:18 +01:00
overflow: TextOverflow.fade,
),
),
actions: [
2021-01-03 19:43:39 +01:00
IconButton(icon: const Icon(Icons.share), onPressed: sharePost),
2020-09-17 22:50:18 +02:00
SavePostButton(post),
IconButton(
2021-04-21 18:59:46 +02:00
icon: Icon(moreIcon),
onPressed: () => PostWidget.showMoreMenu(
context: context,
post: post,
fullPost: true,
),
),
],
),
floatingActionButton: post.post.locked
? null
: FloatingActionButton(
onPressed: loggedInAction((_) => comment()),
child: const Icon(Icons.comment),
),
2021-01-09 02:11:30 +01:00
body: RefreshIndicator(
onRefresh: refresh,
child: ListView(
2021-02-24 20:52:18 +01:00
controller: scrollController,
2021-01-09 02:11:30 +01:00
physics: const AlwaysScrollableScrollPhysics(),
children: [
2021-02-24 20:52:18 +01:00
const SizedBox(height: 15),
2021-01-24 20:01:55 +01:00
PostWidget(post, fullPost: true),
if (fullPost != null)
2021-01-09 02:11:30 +01:00
CommentSection(
newComments.value.followedBy(fullPost.comments).toList(),
2021-01-24 20:01:55 +01:00
postCreatorId: fullPost.postView.creator.id)
2021-01-09 17:34:24 +01:00
else if (fullPostRefreshable.snapshot.hasError)
2021-01-09 02:11:30 +01:00
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10, vertical: 30),
child: Column(
children: [
const Icon(Icons.error),
2021-01-09 17:34:24 +01:00
Text('Error: ${fullPostRefreshable.snapshot.error}')
2021-01-09 02:11:30 +01:00
],
),
)
else
const Padding(
padding: EdgeInsets.only(top: 40),
child: Center(child: CircularProgressIndicator()),
2020-09-17 18:34:03 +02:00
),
2021-01-09 02:11:30 +01:00
],
),
));
}
}