✨ Chat input full featured upload
This commit is contained in:
64
lib/widgets/shared/upload_menu.dart
Normal file
64
lib/widgets/shared/upload_menu.dart
Normal 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(),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user