Compare commits
2 Commits
48e3b510cf
...
59c4d667f6
Author | SHA1 | Date | |
---|---|---|---|
59c4d667f6 | |||
063c087089 |
@ -6,6 +6,7 @@ import 'package:solian/providers/content/posts.dart';
|
||||
import 'package:solian/providers/last_read.dart';
|
||||
import 'package:solian/theme.dart';
|
||||
import 'package:solian/widgets/loading_indicator.dart';
|
||||
import 'package:solian/widgets/posts/post_action.dart';
|
||||
import 'package:solian/widgets/posts/post_item.dart';
|
||||
import 'package:solian/widgets/posts/post_replies.dart';
|
||||
|
||||
@ -40,7 +41,7 @@ class _PostDetailScreenState extends State<PostDetailScreen> {
|
||||
|
||||
Get.find<LastReadProvider>().feedLastReadAt = _item?.id;
|
||||
|
||||
setState(() => _isBusy = false);
|
||||
if (mounted) setState(() => _isBusy = false);
|
||||
}
|
||||
|
||||
@override
|
||||
@ -67,6 +68,7 @@ class _PostDetailScreenState extends State<PostDetailScreen> {
|
||||
),
|
||||
SliverToBoxAdapter(
|
||||
child: PostItem(
|
||||
key: ValueKey(_item),
|
||||
item: _item!,
|
||||
isClickable: false,
|
||||
isOverrideEmbedClickable: true,
|
||||
@ -79,6 +81,24 @@ class _PostDetailScreenState extends State<PostDetailScreen> {
|
||||
vertical: 8,
|
||||
)
|
||||
: EdgeInsets.zero,
|
||||
onTapMore: () {
|
||||
showModalBottomSheet(
|
||||
useRootNavigator: true,
|
||||
context: context,
|
||||
builder: (context) => PostAction(
|
||||
item: _item!,
|
||||
noReact: true,
|
||||
),
|
||||
).then((value) {
|
||||
if (value is Future) {
|
||||
value.then((_) {
|
||||
_getDetail();
|
||||
});
|
||||
} else if (value != null) {
|
||||
_getDetail();
|
||||
}
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
SliverToBoxAdapter(
|
||||
|
@ -4,8 +4,13 @@ import 'package:gap/gap.dart';
|
||||
|
||||
class LoadingIndicator extends StatefulWidget {
|
||||
final bool isActive;
|
||||
final Color? backgroundColor;
|
||||
|
||||
const LoadingIndicator({super.key, this.isActive = true});
|
||||
const LoadingIndicator({
|
||||
super.key,
|
||||
this.isActive = true,
|
||||
this.backgroundColor,
|
||||
});
|
||||
|
||||
@override
|
||||
State<LoadingIndicator> createState() => _LoadingIndicatorState();
|
||||
@ -63,7 +68,7 @@ class _LoadingIndicatorState extends State<LoadingIndicator>
|
||||
axisAlignment: -1, // Align animation from the top
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 24),
|
||||
color:
|
||||
color: widget.backgroundColor ??
|
||||
Theme.of(context).colorScheme.surfaceContainerLow.withOpacity(0.5),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
@ -11,6 +11,7 @@ import 'package:solian/exts.dart';
|
||||
import 'package:solian/models/post.dart';
|
||||
import 'package:solian/platform.dart';
|
||||
import 'package:solian/providers/auth.dart';
|
||||
import 'package:solian/providers/content/posts.dart';
|
||||
import 'package:solian/router.dart';
|
||||
import 'package:solian/screens/posts/post_editor.dart';
|
||||
import 'package:solian/widgets/loading_indicator.dart';
|
||||
@ -28,20 +29,14 @@ class PostAction extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _PostActionState extends State<PostAction> {
|
||||
bool _isBusy = true;
|
||||
bool _isBusy = false;
|
||||
bool _canModifyContent = false;
|
||||
|
||||
void _checkAbleToModifyContent() async {
|
||||
final AuthProvider auth = Get.find();
|
||||
if (auth.isAuthorized.isFalse) return;
|
||||
|
||||
setState(() => _isBusy = true);
|
||||
|
||||
setState(() {
|
||||
_canModifyContent =
|
||||
auth.userProfile.value!['id'] == widget.item.author.id;
|
||||
_isBusy = false;
|
||||
});
|
||||
_canModifyContent = auth.userProfile.value!['id'] == widget.item.author.id;
|
||||
}
|
||||
|
||||
Future<void> _doShare({bool noUri = false}) async {
|
||||
@ -94,6 +89,8 @@ class _PostActionState extends State<PostAction> {
|
||||
: List.empty();
|
||||
final hasMultipleAttachment = attachments.length > 1;
|
||||
|
||||
setState(() => _isBusy = true);
|
||||
|
||||
final screenshot = ScreenshotController();
|
||||
final image = await screenshot.captureFromLongWidget(
|
||||
MediaQuery(
|
||||
@ -137,6 +134,21 @@ class _PostActionState extends State<PostAction> {
|
||||
);
|
||||
context.showSnackbar('fileSavedAt'.trParams({'path': filepath}));
|
||||
}
|
||||
|
||||
setState(() => _isBusy = false);
|
||||
}
|
||||
|
||||
Future<Post> _getFullPost() async {
|
||||
final PostProvider posts = Get.find();
|
||||
|
||||
try {
|
||||
final resp = await posts.getPost(widget.item.id.toString());
|
||||
return Post.fromJson(resp.body);
|
||||
} catch (e) {
|
||||
context.showErrorDialog(e).then((_) => Navigator.pop(context));
|
||||
}
|
||||
|
||||
return widget.item;
|
||||
}
|
||||
|
||||
@override
|
||||
@ -182,7 +194,13 @@ class _PostActionState extends State<PostAction> {
|
||||
),
|
||||
],
|
||||
).paddingOnly(left: 24, right: 24, top: 32, bottom: 16),
|
||||
LoadingIndicator(isActive: _isBusy),
|
||||
LoadingIndicator(
|
||||
isActive: _isBusy,
|
||||
backgroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.surfaceContainerHigh
|
||||
.withOpacity(0.5),
|
||||
),
|
||||
Expanded(
|
||||
child: ListView(
|
||||
children: [
|
||||
@ -205,10 +223,12 @@ class _PostActionState extends State<PostAction> {
|
||||
IconButton(
|
||||
icon: const Icon(Icons.image),
|
||||
tooltip: 'shareImage'.tr,
|
||||
onPressed: () async {
|
||||
await _shareImage();
|
||||
Navigator.pop(context);
|
||||
},
|
||||
onPressed: _isBusy
|
||||
? null
|
||||
: () async {
|
||||
await _shareImage();
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
@ -288,15 +308,23 @@ class _PostActionState extends State<PostAction> {
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
leading: const Icon(Icons.edit),
|
||||
title: Text('edit'.tr),
|
||||
onTap: () async {
|
||||
Navigator.pop(
|
||||
context,
|
||||
AppRouter.instance.pushNamed(
|
||||
'postEditor',
|
||||
extra: PostPublishArguments(edit: widget.item),
|
||||
),
|
||||
);
|
||||
},
|
||||
onTap: _isBusy
|
||||
? null
|
||||
: () async {
|
||||
setState(() => _isBusy = true);
|
||||
var item = widget.item;
|
||||
if (item.body?['content_truncated'] == true) {
|
||||
item = await _getFullPost();
|
||||
}
|
||||
Navigator.pop(
|
||||
context,
|
||||
AppRouter.instance.pushNamed(
|
||||
'postEditor',
|
||||
extra: PostPublishArguments(edit: item),
|
||||
),
|
||||
);
|
||||
if (mounted) setState(() => _isBusy = false);
|
||||
},
|
||||
),
|
||||
if (_canModifyContent)
|
||||
ListTile(
|
||||
|
@ -38,6 +38,7 @@ class PostItem extends StatefulWidget {
|
||||
final EdgeInsets? padding;
|
||||
|
||||
final Function? onComment;
|
||||
final Function? onTapMore;
|
||||
|
||||
const PostItem({
|
||||
super.key,
|
||||
@ -55,6 +56,7 @@ class PostItem extends StatefulWidget {
|
||||
this.attachmentParent,
|
||||
this.padding,
|
||||
this.onComment,
|
||||
this.onTapMore,
|
||||
});
|
||||
|
||||
@override
|
||||
@ -99,6 +101,7 @@ class _PostItemState extends State<PostItem> {
|
||||
_PostHeaderWidget(
|
||||
isCompact: widget.isCompact,
|
||||
isFullDate: widget.isFullDate,
|
||||
onTapMore: widget.onTapMore,
|
||||
item: item,
|
||||
).paddingSymmetric(horizontal: 12),
|
||||
_PostHeaderDividerWidget(item: item).paddingSymmetric(horizontal: 12),
|
||||
@ -161,6 +164,7 @@ class _PostItemState extends State<PostItem> {
|
||||
_PostHeaderWidget(
|
||||
isCompact: widget.isCompact,
|
||||
isFullDate: widget.isFullDate,
|
||||
onTapMore: widget.onTapMore,
|
||||
item: item,
|
||||
),
|
||||
_PostHeaderDividerWidget(item: item),
|
||||
@ -588,10 +592,13 @@ class _PostHeaderWidget extends StatelessWidget {
|
||||
final bool isFullDate;
|
||||
final Post item;
|
||||
|
||||
final Function? onTapMore;
|
||||
|
||||
const _PostHeaderWidget({
|
||||
required this.isCompact,
|
||||
required this.isFullDate,
|
||||
required this.item,
|
||||
required this.onTapMore,
|
||||
});
|
||||
|
||||
@override
|
||||
@ -649,10 +656,12 @@ class _PostHeaderWidget extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
if (item.type == 'article')
|
||||
Badge(
|
||||
label: Text('article'.tr),
|
||||
).paddingOnly(top: 3),
|
||||
if (onTapMore != null)
|
||||
IconButton(
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
icon: const Icon(Icons.more_vert),
|
||||
onPressed: () => onTapMore!(),
|
||||
),
|
||||
],
|
||||
),
|
||||
const Gap(8),
|
||||
|
@ -105,6 +105,7 @@ class PostListEntryWidget extends StatelessWidget {
|
||||
isClickable: isNestedClickable,
|
||||
showFeaturedReply: showFeaturedReply,
|
||||
padding: padding,
|
||||
onTapMore: () => _openActions(context),
|
||||
onComment: () {
|
||||
AppRouter.instance
|
||||
.pushNamed(
|
||||
|
Loading…
x
Reference in New Issue
Block a user