💄 Optimized attachment edit action
This commit is contained in:
parent
1e4b44a78b
commit
adb415700a
@ -18,7 +18,6 @@ import 'package:solian/platform.dart';
|
|||||||
import 'package:solian/providers/auth.dart';
|
import 'package:solian/providers/auth.dart';
|
||||||
import 'package:solian/providers/content/attachment.dart';
|
import 'package:solian/providers/content/attachment.dart';
|
||||||
import 'package:solian/widgets/attachments/attachment_fullscreen.dart';
|
import 'package:solian/widgets/attachments/attachment_fullscreen.dart';
|
||||||
import 'package:solian/widgets/attachments/attachment_item.dart';
|
|
||||||
|
|
||||||
class AttachmentEditorPopup extends StatefulWidget {
|
class AttachmentEditorPopup extends StatefulWidget {
|
||||||
final String usage;
|
final String usage;
|
||||||
@ -233,10 +232,6 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
builder: (context) {
|
builder: (context) {
|
||||||
return AttachmentEditorDialog(
|
return AttachmentEditorDialog(
|
||||||
item: element,
|
item: element,
|
||||||
onDelete: () {
|
|
||||||
setState(() => _attachments.removeAt(index));
|
|
||||||
widget.onUpdate(_attachments.map((e) => e!.id).toList());
|
|
||||||
},
|
|
||||||
onUpdate: (item) {
|
onUpdate: (item) {
|
||||||
setState(() => _attachments[index] = item);
|
setState(() => _attachments[index] = item);
|
||||||
widget.onUpdate(_attachments.map((e) => e!.id).toList());
|
widget.onUpdate(_attachments.map((e) => e!.id).toList());
|
||||||
@ -246,6 +241,18 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _deleteAttachment(Attachment element) async {
|
||||||
|
setState(() => _isBusy = true);
|
||||||
|
try {
|
||||||
|
final AttachmentProvider provider = Get.find();
|
||||||
|
await provider.deleteAttachment(element.id);
|
||||||
|
} catch (e) {
|
||||||
|
context.showErrorDialog(e);
|
||||||
|
} finally {
|
||||||
|
setState(() => _isBusy = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildListEntry(Attachment element, int index) {
|
Widget _buildListEntry(Attachment element, int index) {
|
||||||
var fileType = element.mimetype.split('/').firstOrNull;
|
var fileType = element.mimetype.split('/').firstOrNull;
|
||||||
fileType ??= 'unknown';
|
fileType ??= 'unknown';
|
||||||
@ -289,11 +296,40 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
? () => _showAttachmentPreview(element)
|
? () => _showAttachmentPreview(element)
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
IconButton(
|
PopupMenuButton(
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
visualDensity: const VisualDensity(horizontal: -4),
|
|
||||||
icon: const Icon(Icons.more_horiz),
|
icon: const Icon(Icons.more_horiz),
|
||||||
onPressed: () => _showEdit(element, index),
|
iconColor: Theme.of(context).colorScheme.primary,
|
||||||
|
style: const ButtonStyle(
|
||||||
|
visualDensity: VisualDensity(horizontal: -4),
|
||||||
|
),
|
||||||
|
itemBuilder: (BuildContext context) => [
|
||||||
|
PopupMenuItem(
|
||||||
|
child: ListTile(
|
||||||
|
title: Text('edit'.tr),
|
||||||
|
leading: const Icon(Icons.edit),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () => _showEdit(element, index),
|
||||||
|
),
|
||||||
|
PopupMenuItem(
|
||||||
|
child: ListTile(
|
||||||
|
title: Text('delete'.tr),
|
||||||
|
leading: const Icon(Icons.delete),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 8,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
_deleteAttachment(element).then((_) {
|
||||||
|
setState(() => _attachments.removeAt(index));
|
||||||
|
widget.onUpdate(
|
||||||
|
_attachments.map((e) => e!.id).toList(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
).paddingSymmetric(vertical: 8, horizontal: 16),
|
).paddingSymmetric(vertical: 8, horizontal: 16),
|
||||||
@ -412,14 +448,13 @@ class _AttachmentEditorPopupState extends State<AttachmentEditorPopup> {
|
|||||||
|
|
||||||
class AttachmentEditorDialog extends StatefulWidget {
|
class AttachmentEditorDialog extends StatefulWidget {
|
||||||
final Attachment item;
|
final Attachment item;
|
||||||
final Function onDelete;
|
|
||||||
final Function(Attachment item) onUpdate;
|
final Function(Attachment item) onUpdate;
|
||||||
|
|
||||||
const AttachmentEditorDialog(
|
const AttachmentEditorDialog({
|
||||||
{super.key,
|
super.key,
|
||||||
required this.item,
|
required this.item,
|
||||||
required this.onDelete,
|
required this.onUpdate,
|
||||||
required this.onUpdate});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<AttachmentEditorDialog> createState() => _AttachmentEditorDialogState();
|
State<AttachmentEditorDialog> createState() => _AttachmentEditorDialogState();
|
||||||
@ -431,7 +466,7 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
bool _isBusy = false;
|
bool _isBusy = false;
|
||||||
bool _isMature = false;
|
bool _isMature = false;
|
||||||
|
|
||||||
Future<Attachment?> updateAttachment() async {
|
Future<Attachment?> _updateAttachment() async {
|
||||||
final AttachmentProvider provider = Get.find();
|
final AttachmentProvider provider = Get.find();
|
||||||
|
|
||||||
setState(() => _isBusy = true);
|
setState(() => _isBusy = true);
|
||||||
@ -455,19 +490,6 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteAttachment() async {
|
|
||||||
setState(() => _isBusy = true);
|
|
||||||
try {
|
|
||||||
final AttachmentProvider provider = Get.find();
|
|
||||||
await provider.deleteAttachment(widget.item.id);
|
|
||||||
widget.onDelete();
|
|
||||||
} catch (e) {
|
|
||||||
context.showErrorDialog(e);
|
|
||||||
} finally {
|
|
||||||
setState(() => _isBusy = false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void syncWidget() {
|
void syncWidget() {
|
||||||
_isMature = widget.item.isMature;
|
_isMature = widget.item.isMature;
|
||||||
_altController.text = widget.item.alt;
|
_altController.text = widget.item.alt;
|
||||||
@ -505,34 +527,24 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
onTapOutside: (_) =>
|
onTapOutside: (_) =>
|
||||||
FocusManager.instance.primaryFocus?.unfocus(),
|
FocusManager.instance.primaryFocus?.unfocus(),
|
||||||
),
|
),
|
||||||
Card(
|
const SizedBox(height: 8),
|
||||||
child: CheckboxListTile(
|
CheckboxListTile(
|
||||||
shape: const RoundedRectangleBorder(
|
contentPadding: const EdgeInsets.only(left: 4, right: 18),
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10))),
|
shape: const RoundedRectangleBorder(
|
||||||
title: Text('matureContent'.tr),
|
borderRadius: BorderRadius.all(Radius.circular(10))),
|
||||||
secondary: const Icon(Icons.visibility_off),
|
title: Text('matureContent'.tr),
|
||||||
value: _isMature,
|
secondary: const Icon(Icons.visibility_off),
|
||||||
onChanged: (newValue) {
|
value: _isMature,
|
||||||
setState(() => _isMature = newValue ?? false);
|
onChanged: (newValue) {
|
||||||
},
|
setState(() => _isMature = newValue ?? false);
|
||||||
controlAffinity: ListTileControlAffinity.leading,
|
},
|
||||||
),
|
controlAffinity: ListTileControlAffinity.leading,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
actionsAlignment: MainAxisAlignment.spaceBetween,
|
actionsAlignment: MainAxisAlignment.spaceBetween,
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
TextButton(
|
|
||||||
style: TextButton.styleFrom(
|
|
||||||
foregroundColor: Theme.of(context).colorScheme.error),
|
|
||||||
onPressed: () {
|
|
||||||
deleteAttachment().then((_) {
|
|
||||||
Navigator.pop(context);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Text('delete'.tr),
|
|
||||||
),
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
@ -546,7 +558,7 @@ class _AttachmentEditorDialogState extends State<AttachmentEditorDialog> {
|
|||||||
TextButton(
|
TextButton(
|
||||||
child: Text('apply'.tr),
|
child: Text('apply'.tr),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
updateAttachment().then((value) {
|
_updateAttachment().then((value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
widget.onUpdate(value);
|
widget.onUpdate(value);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
Loading…
Reference in New Issue
Block a user