taafee-mobile/lib/features/home/presentation_layer/screens/home.dart
2023-10-25 09:11:21 +03:00

340 lines
15 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:lottie/lottie.dart';
import 'package:taafee_mobile/common/const/const.dart';
import 'package:taafee_mobile/common/extensions/widget_extension.dart';
import 'package:taafee_mobile/common/widgets/gridview.dart';
import 'package:taafee_mobile/common/widgets/loader.dart';
import 'package:taafee_mobile/common/widgets/responsive_view.dart';
import 'package:taafee_mobile/common/widgets/rx_viewer.dart';
import 'package:taafee_mobile/common/widgets/text.dart';
import 'package:taafee_mobile/common/widgets/toast.dart';
import 'package:taafee_mobile/core/routing/routing_manager.dart';
import 'package:taafee_mobile/features/auth/business_logic_layer/auth_controller.dart';
import 'package:taafee_mobile/features/card/business_logic_layer/card_controller.dart';
// import 'package:taafee_mobile/features/card/data_layer/model/card_model.dart';
// import 'package:taafee_mobile/features/card/data_layer/source/card_service.dart';
import 'package:taafee_mobile/features/card/presentation_layer/widgets/card.dart';
import 'package:taafee_mobile/features/card/presentation_layer/widgets/random_card_widget.dart';
import 'package:taafee_mobile/features/category/business_logic_layer/category_controller.dart';
import 'package:taafee_mobile/features/category/presentation_layer/widgets/category.dart';
import 'package:taafee_mobile/features/chat/business%20logic%20layer/chat_controller.dart';
import 'package:taafee_mobile/features/home/business_logic_layer/home_controller.dart';
import 'package:taafee_mobile/features/home/presentation_layer/widgets/appbar.dart';
import '../../../favorite/business_logic_layer/favorite_controller.dart';
// ignore: must_be_immutable
class HomeScreen extends StatelessWidget {
final HomeController homeController = Get.find<HomeController>();
final CategoryController categoryController = Get.find<CategoryController>();
final CardController cardController = Get.find<CardController>();
final ScrollController scrollController = ScrollController();
final ScrollController searchScrollController = ScrollController();
final AuthController authController = Get.find<AuthController>();
final ChatController chatController = Get.find<ChatController>();
final FavoriteController favoriteController = Get.find<FavoriteController>();
HomeScreen({super.key});
Future<void> load() async {
await Future.wait([
if (favoriteController.getFavoriteState.result.isEmpty)
favoriteController.getFavorites(),
if (categoryController.categoryState.result.isEmpty)
categoryController.getCategories(onConnectionError: (e) {
Toast.showToast('no_internert_connection'.tr);
}),
if (cardController.cardState.result.data.isEmpty)
cardController.getCards(onConnectionError: (e) {
Toast.showToast('no_internert_connection'.tr);
})
]);
}
Future<void> refresh() async {
cardController.cardState.result.clear();
categoryController.categoryState.result.clear();
await load();
}
void moreDate() {
scrollController.addListener(() {
if (scrollController.position.atEdge && scrollController.offset != 0) {
if (homeController.isUserSearching.value) {
homeController.search();
} else {
cardController.getCards();
}
}
});
}
TextEditingController textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
Future.delayed(const Duration(microseconds: 1), () async {
homeController.readUser();
});
load();
moreDate();
return Scaffold(
backgroundColor: AppColors.backGroundColor,
body: Obx(
() => RefreshIndicator(
onRefresh: () async {
await refresh();
},
child: SingleChildScrollView(
controller: scrollController,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppBarWidget(
textEditingController: textEditingController,
),
(homeController.isUserSearching.value)
? searchResults()
: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
"categories".tr,
color: AppColors.textColor,
fontSize: (Responsive.isTablet() ? 18 : 16),
),
RegularTextWidget("see_all".tr).onTap(() {
RoutingManager.to(RouteName.categoryScreen);
})
],
).paddingSymmetric(
horizontal: Responsive.isTablet() ? 30 : 20,
vertical: 20),
RxViewer(
width: 150,
height: 150,
rxFuture: categoryController.categoryState,
child: () => GridViewWidget(
mainAxisExtent:
Responsive.isTablet() ? 90 : null,
count: Responsive.isTablet() ? 4 : 3,
itemCount: Responsive.isTablet()
? ((categoryController
.categoryState.result.length <
8)
? categoryController
.categoryState.result.length
: 8)
: ((categoryController
.categoryState.result.length <
6)
? categoryController
.categoryState.result.length
: 6),
child: (index) => CategoryWidget(
categoryController
.categoryState.result[index]),
).paddingSymmetric(
horizontal: Responsive.isTablet() ? 25 : 0,
),
),
BoldTextWidget(
"latest_add".tr,
fontSize: (Responsive.isTablet() ? 18 : 16),
color: AppColors.textColor,
).paddingSymmetric(
horizontal: Responsive.isTablet() ? 30 : 20,
vertical: 10),
Obx(
() {
if (cardController.cardState.loading &&
cardController
.cardState.result.isFirstPage) {
return Loader(
width: 150,
height: 150,
).center();
} else if (cardController.cardState.hasError) {
return Column(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Lottie.asset(
'assets/animations/Wifi.json',
repeat: false,
width: 120,
).paddingAll(5),
RegularTextWidget(
'you_have_no_internet_connection'.tr,
textAlign: TextAlign.center,
color: AppColors.textColor,
fontSize: 18.0,
),
SizedBox(
height: Get.height,
),
],
).center();
} else {
return Obx(() {
return ResponsiveView(
mainAxisExtent:
Responsive.isTablet() ? 200 : 158,
itemCount: cardController
.cardState.result.data.length,
childBuilder: (index) {
return Obx(() {
return RandomCardWidget(
cardController
.cardState.result.data[index],
);
});
});
});
}
},
),
if (cardController.cardState.loading &&
!cardController.cardState.result.isFirstPage)
Loader(
width: 40,
height: 40,
),
],
).paddingSymmetric(
horizontal: Responsive.isTablet() ? 16 : 8),
],
),
),
),
)).makeSafeArea();
}
RxViewer searchResults() {
return RxViewer(
// width: Get.width * 0.5,
height: Get.height * 0.5,
withPagination: true,
errorWidget: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
'search_results'.tr,
fontSize: 18,
color: AppColors.textColor,
)
.align(alignment: Alignment.topLeft)
.padding(const EdgeInsets.only(
left: 16,
)),
SvgPicture.asset(
"assets/icons/x.svg",
).onTap(() {
textEditingController.clear();
homeController.changeUserSearchingState(false);
homeController.searchState.result.clear();
}),
],
).paddingOnly(top: 24, bottom: 16, right: 18),
SizedBox(
height: Get.height * 0.08,
),
Lottie.asset(
'assets/animations/Wifi.json',
repeat: false,
width: 120,
).paddingAll(5),
RegularTextWidget(
'you_have_no_internet_connection'.tr,
color: AppColors.textColor,
fontSize: 18.0,
)
],
).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0).center(),
rxFuture: homeController.searchState,
child: () => (homeController.searchState.result.data.isNotEmpty)
? Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
'search_results'.tr,
fontSize: 18,
color: AppColors.textColor,
)
.align(alignment: Alignment.topLeft)
.padding(EdgeInsets.only(
left: Responsive.isTablet() ? 40 : 16,
)),
SvgPicture.asset(
"assets/icons/x.svg",
).onTap(() {
textEditingController.clear();
homeController.searchState.result.clear();
homeController.changeUserSearchingState(false);
}).paddingOnly(right: Responsive.isTablet() ? 40 : 0),
],
).paddingOnly(top: 24, bottom: 16, right: 18),
Obx(() {
return ResponsiveView(
mainAxisExtent: 180,
itemCount: homeController.searchState.result.length,
childBuilder: (index) => CardWidget(
homeController.searchState.result.data[index]),
);
}),
],
).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0)
: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BoldTextWidget(
'search_results'.tr,
fontSize: 18,
color: AppColors.textColor,
)
.align(alignment: Alignment.topLeft)
.padding(const EdgeInsets.only(
left: 16,
)),
SvgPicture.asset(
"assets/icons/x.svg",
).onTap(() {
textEditingController.clear();
homeController.searchState.result.clear();
homeController.changeUserSearchingState(false);
}),
],
).paddingOnly(top: 24, bottom: 16, right: 18),
SizedBox(
height: Get.height * 0.08,
),
SizedBox(
width: 120,
height: 120,
child: Lottie.asset(
'assets/animations/folder.json',
repeat: false,
)),
RegularTextWidget(
'no_results_found'.tr,
color: AppColors.textColor,
fontSize: 18.0,
)
],
).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0),
);
}
}