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