Chat input full featured upload

This commit is contained in:
2025-10-10 20:54:37 +08:00
parent e1ea61c5f1
commit 598c51bc1a
7 changed files with 404 additions and 164 deletions

View File

@@ -0,0 +1,64 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:material_symbols_icons/symbols.dart';
class MenuItemData {
final IconData icon;
final String textKey;
final VoidCallback onPressed;
const MenuItemData(this.icon, this.textKey, this.onPressed);
}
class UploadMenu extends StatelessWidget {
final List<MenuItemData> items;
final bool isCompact;
final Color? iconColor;
const UploadMenu({
super.key,
required this.items,
this.isCompact = false,
this.iconColor,
});
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return MenuAnchor(
builder:
(context, controller, child) => IconButton(
onPressed: () {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
}
},
tooltip: 'uploadFile'.tr(),
icon: const Icon(Symbols.file_upload),
color: iconColor ?? colorScheme.primary,
visualDensity:
isCompact
? const VisualDensity(horizontal: -4, vertical: -2)
: null,
),
menuChildren:
items
.map(
(item) => MenuItemButton(
onPressed: item.onPressed,
leadingIcon: Icon(item.icon),
style: ButtonStyle(
padding: WidgetStatePropertyAll(
EdgeInsets.symmetric(horizontal: 16, vertical: 20),
),
),
child: Text(item.textKey.tr()),
),
)
.toList(),
);
}
}