You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
6.6 KiB

// import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
// import 'package:emoji_picker_flutter/src/category_emoji.dart';
// import 'package:emoji_picker_flutter/src/config.dart';
// import 'package:emoji_picker_flutter/src/emoji_picker_builder.dart';
// import 'package:emoji_picker_flutter/src/emoji_view_state.dart';
import 'package:bytedesk_kefu/vendors/emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:bytedesk_kefu/vendors/emoji_picker_flutter/src/category_emoji.dart';
// import 'package:bytedesk_kefu/vendors/emoji_picker_flutter/src/config.dart';
// import 'package:bytedesk_kefu/vendors/emoji_picker_flutter/src/emoji_picker_builder.dart';
// import 'package:bytedesk_kefu/vendors/emoji_picker_flutter/src/emoji_view_state.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// EmojiPicker Implementation
class EmojiPickerView extends EmojiPickerBuilder {
/// Constructor
EmojiPickerView(
Config config,
EmojiViewState state,
this.handleSendPressed,
) : super(config, state);
@override
_EmojiPickerViewState createState() => _EmojiPickerViewState();
/// See [AttachmentButton.onPressed]
final void Function()? handleSendPressed;
}
class _EmojiPickerViewState extends State<EmojiPickerView>
with SingleTickerProviderStateMixin {
PageController? _pageController;
TabController? _tabController;
@override
void initState() {
var initCategory = widget.state.categoryEmoji.indexWhere(
(element) => element.category == widget.config.initCategory);
if (initCategory == -1) {
initCategory = 0;
}
_tabController = TabController(
initialIndex: initCategory,
length: widget.state.categoryEmoji.length,
vsync: this);
_pageController = PageController(initialPage: initCategory);
super.initState();
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
final emojiSize = widget.config.getEmojiSize(constraints.maxWidth);
return Container(
color: Color.fromRGBO(251, 251, 251, 1.0), //widget.config.bgColor,
child: Column(
children: [
Row(
children: [
Expanded(
child: TabBar(
labelColor: widget.config.iconColorSelected,
indicatorColor: widget.config.indicatorColor,
unselectedLabelColor: widget.config.iconColor,
controller: _tabController,
labelPadding: EdgeInsets.zero,
onTap: (index) {
_pageController!.jumpToPage(index);
},
tabs: widget.state.categoryEmoji
.asMap()
.entries
.map<Widget>((item) =>
_buildCategory(item.key, item.value.category))
.toList(),
),
),
IconButton(
padding: const EdgeInsets.only(bottom: 2),
icon: Icon(
Icons.backspace,
color: widget.config.backspaceColor,
),
onPressed: () {
widget.state.onBackspacePressed!();
},
),
// IconButton(
// // iconSize: 16,
// onPressed: () {
// widget.handleSendPressed!();
// },
// // backgroundColor: Colors.lightGreen,
// icon: Icon(Icons.send),
// ),
],
),
Flexible(
child: PageView.builder(
itemCount: widget.state.categoryEmoji.length,
controller: _pageController,
onPageChanged: (index) {
_tabController!.animateTo(
index,
duration: widget.config.tabIndicatorAnimDuration,
);
},
itemBuilder: (context, index) =>
_buildPage(emojiSize, widget.state.categoryEmoji[index]),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [],
),
],
),
);
},
);
}
Widget _buildCategory(int index, Category category) {
return Tab(
icon: Icon(
widget.config.getIconForCategory(category),
),
);
}
Widget _buildButtonWidget(
{required VoidCallback onPressed, required Widget child}) {
if (widget.config.buttonMode == ButtonMode.MATERIAL) {
return TextButton(
onPressed: onPressed,
child: child,
style: ButtonStyle(padding: MaterialStateProperty.all(EdgeInsets.zero)),
);
}
return CupertinoButton(
padding: EdgeInsets.zero, onPressed: onPressed, child: child);
}
Widget _buildPage(double emojiSize, CategoryEmoji categoryEmoji) {
// Display notice if recent has no entries yet
if (categoryEmoji.category == Category.RECENT &&
categoryEmoji.emoji.isEmpty) {
return _buildNoRecent();
}
// Build page normally
return GridView.count(
scrollDirection: Axis.vertical,
physics: const ScrollPhysics(),
shrinkWrap: true,
primary: true,
padding: const EdgeInsets.all(0),
crossAxisCount: widget.config.columns,
mainAxisSpacing: widget.config.verticalSpacing,
crossAxisSpacing: widget.config.horizontalSpacing,
children: categoryEmoji.emoji
.map<Widget>((item) => _buildEmoji(emojiSize, categoryEmoji, item))
.toList(),
);
}
Widget _buildEmoji(
double emojiSize,
CategoryEmoji categoryEmoji,
Emoji emoji,
) {
return _buildButtonWidget(
onPressed: () {
widget.state.onEmojiSelected(categoryEmoji.category, emoji);
},
child: FittedBox(
fit: BoxFit.fill,
child: Text(
emoji.emoji,
textScaleFactor: 1.0,
style: TextStyle(
fontSize: emojiSize,
backgroundColor: Colors.transparent,
),
),
));
}
Widget _buildNoRecent() {
return Center(
child: Text( '无最近使用表情',
// widget.config.noRecentsText,
// style: widget.config.noRecentsStyle,
textAlign: TextAlign.center,
));
}
}