// ignore_for_file: deprecated_member_use_from_same_package import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:hoshan/core/gen/assets.gen.dart'; import 'package:hoshan/core/routes/route_generator.dart'; import 'package:hoshan/data/model/ai/bots_model.dart'; import 'package:hoshan/data/model/empty_states_enum.dart'; import 'package:hoshan/data/model/tools_categories_model.dart'; import 'package:hoshan/ui/screens/main/assistant/bloc/global_assistants_bloc.dart'; import 'package:hoshan/ui/screens/main/forum/cubit/category_cubit.dart'; import 'package:hoshan/ui/theme/colors.dart'; import 'package:hoshan/ui/theme/cubit/theme_mode_cubit.dart'; import 'package:hoshan/ui/theme/responsive.dart'; import 'package:hoshan/ui/theme/text.dart'; import 'package:hoshan/ui/widgets/components/bot/bot_grid_card.dart'; import 'package:hoshan/ui/widgets/components/bot/bot_grid_card_placeholder.dart'; import 'package:hoshan/ui/widgets/sections/empty/empty_states.dart'; import 'package:hoshan/ui/widgets/sections/loading/default_placeholder.dart'; class GlobalAssistantsScreen extends StatefulWidget { const GlobalAssistantsScreen({super.key}); @override State createState() => _GlobalAssistantsScreenState(); } ValueNotifier initiaGlobalCatItem = ValueNotifier(Categories(id: -1, name: 'برگزیده‌ها')); class _GlobalAssistantsScreenState extends State { void onSelect(BuildContext contxet, Bots bot) { context.go(Routes.assistant, extra: bot.id); } void onMark(bool marked, Bots bot, int index) { final newBot = bot; // if (initialItem.value.id == -2) { // context.read().add(RemoveGlobalAssistantBot( // oldAssistantsIndex: index, // oldBot: newBot, // )); // return; // } newBot.marked = marked; context.read().add(ChangeGlobalAssistantBot( oldAssistantsIndex: index, oldBot: bot, newBot: newBot)); } final ScrollController scrollController = ScrollController(); @override Widget build(BuildContext context) { return RefreshIndicator( backgroundColor: Theme.of(context).colorScheme.surface, color: Theme.of(context).colorScheme.primary, onRefresh: () async { context .read() .add(GetGlobalAssistants(category: initiaGlobalCatItem.value.id)); scrollController.jumpTo(0); }, child: Column( children: [ BlocBuilder( builder: (context, state) { if (state is CategoryLoading) { return SizedBox( height: 36, child: ListView.builder( padding: const EdgeInsetsDirectional.symmetric(horizontal: 16), itemCount: 10, physics: const NeverScrollableScrollPhysics(), scrollDirection: Axis.horizontal, itemBuilder: (context, index) { return categoryPlaceholder(); }, ), ); } if (state is CategorySuccess) { final categories = [ Categories(id: -1, name: 'برگزیده‌ها'), Categories(id: -2, name: 'علاقه‌مندی‌ها'), ...state.categories ]; return Padding( padding: const EdgeInsets.symmetric(vertical: 12), child: Directionality( textDirection: TextDirection.rtl, child: SizedBox( height: 36, width: MediaQuery.sizeOf(context).width, child: ListView.builder( padding: const EdgeInsetsDirectional.symmetric( horizontal: 16), scrollDirection: Axis.horizontal, physics: const BouncingScrollPhysics(), itemCount: categories.length, itemBuilder: (context, index) { final cat = categories[index]; return GestureDetector( onTap: () { if (context.read().state is GlobalAssistantsLoading) { return; } if (initiaGlobalCatItem.value.id == cat.id) { return; } context.read().add( GetGlobalAssistants(category: cat.id)); initiaGlobalCatItem.value = cat; }, child: categoryContainer(cat)); }, )), ), ); } return const SizedBox.shrink(); }, ), Expanded( child: BlocBuilder( builder: (context, state) { if (state is GlobalAssistantsFail) { return EmptyStates.getEmptyState( status: EmptyStatesEnum.server, scale: 0.8); } if (state is GlobalAssistantsSuccess) { final assistants = state.assistants; if (assistants.isEmpty) { if (initiaGlobalCatItem.value.id == -2) { return Center( child: Column( children: [ const SizedBox( height: 32, ), Assets.icon.gif.emptyBookmarks.image(), Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Text( 'اینجا دستیارهای نشان‌دار شده شما نمایش داده می‌شوند. هنوز موردی اضافه نکرده‌اید. برای دسترسی سریع‌تر، دستیارهای دلخواهتان را بوکمارک کنید!', style: AppTextStyles.body4.copyWith( color: Theme.of(context).colorScheme.onSurface), textDirection: TextDirection.rtl, textAlign: TextAlign.center, ), ) ], )); } return EmptyStates.getEmptyState( status: EmptyStatesEnum.assistant, title: 'دستیاری وجود ندارد', height: MediaQuery.sizeOf(context).height * 0.4, ); } return Directionality( textDirection: TextDirection.rtl, child: ListView.builder( itemCount: assistants.length, shrinkWrap: true, padding: EdgeInsets.only(bottom: 90), physics: const BouncingScrollPhysics(), itemBuilder: (context, index) { final assistant = assistants[index]; return state.category == null || state.category == -1 || state.category == -2 ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Builder(builder: (context) { return ListTile( title: Text( assistant.categoryName ?? '', style: AppTextStyles.body4.copyWith( color: Theme.of(context) .colorScheme .onSurface), ), ); }), rowsList(assistant.bots!) ], ) : gridsList(assistant.bots!); }, ), ); } return Directionality( textDirection: TextDirection.rtl, child: ListView.builder( itemCount: 10, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 8), child: DefaultPlaceHolder( child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16)), child: Text( 'عمومی', style: AppTextStyles.body4 .copyWith(color: AppColors.black[900]), ), ), ), ), rowsListPlaceHolder() ], ); }, ), ); }, ), ), ], ), ); } Widget gridsList(List bots) { return GridView.builder( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: Responsive(context).isMobile() ? 2 : Responsive(context).isTablet() ? 3 : 5, crossAxisSpacing: 16, mainAxisSpacing: 16, mainAxisExtent: 150), itemCount: bots.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, index) { return GestureDetector( onTap: () => onSelect(context, bots[index]), child: BotGridCard( onMark: (marked) => onMark(marked, bots[index], index), bot: bots[index], ), ); }, ); } Widget rowsList(List bots) { return SizedBox( height: 170, child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, physics: const BouncingScrollPhysics(), padding: const EdgeInsets.symmetric(horizontal: 8), itemCount: bots.length, itemBuilder: (context, index) { return SizedBox( width: 180, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8), child: GestureDetector( onTap: () => onSelect(context, bots[index]), child: BotGridCard( onMark: (marked) => onMark(marked, bots[index], index), bot: bots[index], ), ), )); }, ), ); } Widget rowsListPlaceHolder() { return SizedBox( height: 170, child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.symmetric(horizontal: 16), itemCount: 10, itemBuilder: (context, index) { return SizedBox( width: 180, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8), child: BotGridCardPlaceholder( index: index, ), )); }, ), ); } Widget categoryContainer(Categories cat) { return ValueListenableBuilder( valueListenable: initiaGlobalCatItem, builder: (context, item, child) { final active = item.id == cat.id; return Container( padding: const EdgeInsets.all(0), margin: const EdgeInsets.symmetric(horizontal: 4), constraints: const BoxConstraints(minWidth: 100), alignment: Alignment.center, decoration: BoxDecoration( color: active ? AppColors.primaryColor[ context.read().isDark() ? 500 : 50] : AppColors.gray[ context.read().isDark() ? 900 : 400], borderRadius: BorderRadius.circular(360)), child: Text( cat.name ?? '', style: AppTextStyles.body4.copyWith( color: context.read().isDark() ? Colors.white : active ? AppColors.primaryColor.defaultShade : AppColors.black[300]), ), ); }); } Widget categoryPlaceholder() { return DefaultPlaceHolder( child: Container( padding: const EdgeInsets.all(8), margin: const EdgeInsets.symmetric(horizontal: 4), constraints: const BoxConstraints(minWidth: 100), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(360)), child: Text( 'for placeholder', style: AppTextStyles.body4, ), ), ); } }