Post with attachment

This commit is contained in:
2024-11-10 16:41:11 +08:00
parent 302691f557
commit ef51948fad
12 changed files with 191 additions and 50 deletions

View File

@ -14,9 +14,9 @@ class AttachmentItem extends StatelessWidget {
final sn = context.read<SnNetworkProvider>();
switch (tp) {
case 'image':
return AspectRatio(
aspectRatio: data.metadata['ratio']?.toDouble(),
child: UniversalImage(sn.getAttachmentUrl(data.rid)),
return UniversalImage(
sn.getAttachmentUrl(data.rid),
fit: BoxFit.cover,
);
default:
return const Placeholder();

View File

@ -8,8 +8,12 @@ class AttachmentList extends StatelessWidget {
final List<SnAttachment> data;
final bool? bordered;
final double? maxListHeight;
const AttachmentList(
{super.key, required this.data, this.bordered, this.maxListHeight});
const AttachmentList({
super.key,
required this.data,
this.bordered,
this.maxListHeight,
});
@override
Widget build(BuildContext context) {
@ -37,13 +41,19 @@ class AttachmentList extends StatelessWidget {
itemBuilder: (context, idx) {
const radius = BorderRadius.all(Radius.circular(8));
return Container(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width - 20,
),
decoration: BoxDecoration(
border: Border(top: borderSide, bottom: borderSide),
borderRadius: radius,
),
child: ClipRRect(
borderRadius: radius,
child: AttachmentItem(data: data[idx]),
child: AspectRatio(
aspectRatio: data[idx].metadata['ratio']?.toDouble() ?? 1,
child: ClipRRect(
borderRadius: radius,
child: AttachmentItem(data: data[idx]),
),
),
);
},

View File

@ -0,0 +1,67 @@
import 'dart:io';
import 'package:cross_file/cross_file.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_context_menu/flutter_context_menu.dart';
import 'package:gap/gap.dart';
import 'package:material_symbols_icons/symbols.dart';
class PostMediaPendingList extends StatelessWidget {
final List<XFile> data;
final Function(int idx)? onRemove;
const PostMediaPendingList({
super.key,
required this.data,
this.onRemove,
});
@override
Widget build(BuildContext context) {
return Container(
constraints: const BoxConstraints(maxHeight: 120),
child: ListView.separated(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.symmetric(horizontal: 8),
separatorBuilder: (context, index) => const Gap(8),
itemCount: data.length,
itemBuilder: (context, idx) {
final file = data[idx];
return ContextMenuRegion(
contextMenu: ContextMenu(
entries: [
if (onRemove != null)
MenuItem(
label: 'delete'.tr(),
icon: Symbols.delete,
onSelected: () {
onRemove!(idx);
},
),
],
),
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: Theme.of(context).dividerColor,
width: 1,
),
borderRadius: BorderRadius.circular(8),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)),
child: AspectRatio(
aspectRatio: 1,
child: kIsWeb
? Image.network(file.path, fit: BoxFit.cover)
: Image.file(File(file.path), fit: BoxFit.cover),
),
),
),
);
},
),
);
}
}