Houshan-Basa/lib/ui/widgets/components/dropdown/bots_search_dropdown.dart

176 lines
5.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:animated_custom_dropdown/custom_dropdown.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hoshan/core/gen/assets.gen.dart';
import 'package:hoshan/data/model/ai/bots_model.dart';
import 'package:hoshan/ui/screens/main/home/bloc/bots_bloc.dart';
import 'package:hoshan/ui/theme/colors.dart';
import 'package:hoshan/ui/theme/text.dart';
import 'package:hoshan/ui/widgets/sections/loading/default_placeholder.dart';
class BotSearchDropdown extends StatefulWidget {
final Function(Bots? bot)? onSelectedBot;
const BotSearchDropdown({super.key, this.onSelectedBot});
@override
State<BotSearchDropdown> createState() => _BotSearchDropdownState();
}
class _BotSearchDropdownState extends State<BotSearchDropdown> {
late final CustomDropdownDecoration customDropdownDecoration =
CustomDropdownDecoration(
expandedFillColor: const Color(0xffE0ECFF),
closedFillColor: const Color(0xffE0ECFF),
closedSuffixIcon: Icon(
Icons.arrow_drop_down_rounded,
color: AppColors.primaryColor.defaultShade,
),
expandedSuffixIcon: Icon(
Icons.arrow_drop_up_rounded,
color: AppColors.primaryColor.defaultShade,
),
overlayScrollbarDecoration: Theme.of(context).scrollbarTheme);
final List<Bots> _list = [];
Bots? initailBot;
Future<List<Bots>> _getFakeRequestData(String query) async {
return await Future.delayed(const Duration(seconds: 1), () {
return _list.where((e) {
return e.name.toString().toLowerCase().contains(query.toLowerCase());
}).toList();
});
}
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.rtl,
child: BlocConsumer<BotsBloc, BotsState>(
listener: (context, state) {},
builder: (context, state) {
if (state is BotsSuccess) {
_list.clear();
_list.addAll(BotsBloc.allBots);
// if (_list.isNotEmpty) {
// HomeCubit.bot.value = _list.first;
// initailBot = _list.first;
// }
}
if (state is BotsFail) {
return const SizedBox();
}
return DefaultPlaceHolder(
enabled: state is BotsLoading,
child: CustomDropdown<Bots>.searchRequest(
items: _list,
futureRequest: _getFakeRequestData,
searchHintText: 'جستجو در بات ها',
overlayHeight: MediaQuery.sizeOf(context).height / 3,
canCloseOutsideBounds: false,
excludeSelected: true,
headerBuilder: botView,
hintBuilder: hintView,
listItemPadding: EdgeInsets.zero,
listItemBuilder: listItemView,
decoration: customDropdownDecoration,
// initialItem: initailBot,
onChanged: (value) {
widget.onSelectedBot?.call(value);
},
),
);
},
),
);
}
Widget listItemView(BuildContext context, Bots item, bool isSelected,
void Function() onItemSelect) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
decoration: BoxDecoration(
border: Border(
// top: BorderSide(width: 1, color: Colors.black),
bottom: BorderSide(
width: 1,
color: _list.last != item
? AppColors.gray.defaultShade
: const Color(0xffE0ECFF)))),
child: Center(child: botView(context, item, true)));
}
Widget hintView(BuildContext context, String hint, bool enabled) {
return Row(
children: [
Assets.icon.outline.brain.svg(width: 18, height: 18),
const SizedBox(
width: 12,
),
Expanded(
child: Center(
child: Text(
'انتخاب نوع هوش مصنوعی',
style: AppTextStyles.body4.copyWith(fontWeight: FontWeight.bold),
),
),
),
],
);
}
Row botView(BuildContext context, Bots item, bool enabled) {
return Row(
children: [
ClipOval(
child: SizedBox(
width: 24,
height: 24,
child: CachedNetworkImage(
imageUrl: item.image!,
fit: BoxFit.cover,
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.name!,
style:
AppTextStyles.body3.copyWith(fontWeight: FontWeight.bold),
),
// Text(
// item.description,
// style: AppTextStyles.body5.copyWith(
// color: AppColors.gray[800],
// overflow: TextOverflow.ellipsis),
// maxLines: 1,
// )
],
),
),
),
// if (item.lock)
// Container(
// width: 24,
// height: 24,
// decoration: BoxDecoration(
// shape: BoxShape.circle,
// color: AppColors.primaryColor.defaultShade),
// child: const Icon(
// Icons.lock,
// size: 12,
// color: Colors.white,
// ),
// )
],
);
}
}