You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
diplomatic-quarter/lib/widgets/offers_packages/offers_packages.dart

283 lines
9.5 KiB
Dart

import 'dart:developer';
import 'package:carousel_pro/carousel_pro.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersCategoriesRequestModel.dart';
import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersProductsRequestModel.dart';
import 'package:diplomaticquarterapp/core/service/packages_offers/PackagesOffersServices.dart';
import 'package:diplomaticquarterapp/core/viewModels/packages_offers/PackagesOffersViewModel.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/loadings/ShimmerLoading.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
class OffersAndPackagesWidget extends StatefulWidget {
final List<OfferPackagesItemModel> models;
OffersAndPackagesWidget(this.models);
@override
_OffersAndPackagesWidgetState createState() => _OffersAndPackagesWidgetState();
}
// - - - - - - - - - - - - - -
// Carousel Widget
// - - - - - - - - - - - - - -
class _OffersAndPackagesWidgetState extends State<OffersAndPackagesWidget> {
final double HEIGHT = 140; //200;
final int AUTO_SLIDE_INTERVAL = 3;
final int ANIMATION_DURATION = 1000;
var service = locator<OffersAndPackagesServices>();
@override
Widget build(BuildContext context) {
// TODO: implement build
var option = CarouselOptions(
height: HEIGHT,
aspectRatio: 16 / 9,
viewportFraction: 1,
initialPage: 0,
enableInfiniteScroll: true,
reverse: false,
autoPlay: true,
autoPlayInterval: Duration(seconds: AUTO_SLIDE_INTERVAL),
autoPlayAnimationDuration: Duration(milliseconds: ANIMATION_DURATION),
autoPlayCurve: Curves.fastOutSlowIn,
enlargeCenterPage: true,
scrollDirection: Axis.horizontal,
);
// return Container(
// height: HEIGHT,
// child: CarouselSlider.builder(
// itemCount: widget.models.length,
// itemBuilder: (BuildContext context, int itemIndex) {
// var item = widget.models[itemIndex];
// return OfferPackagesItemWidget(model: item);
// },
// options: option));
var header = Padding(
padding: const EdgeInsets.only(right: 15, left: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(
TranslationBase.of(context).offerAndPackages,
color: Colors.red,
fontSize: 15,
bold: true,
),
Texts(
TranslationBase.of(context).viewAll,
color: Colors.red,
fontSize: 12,
)
],
),
);
var headerSpaceVisible = true;
var headerSpace = Visibility(
child: header,
visible: headerSpaceVisible,
);
return Column(
children: [
headerSpace,
ShimmerLoadingWidget(
onPreProccess: () {
return service.getAllCategories(OffersCategoriesRequestModel(limit: 100, page: 1, sinceId: 0));
},
loadingWidget: () {
return Texts(
"Loading...",
fontSize: 20,
color: Colors.green,
marginBottom: 10,
marginTop: 10,
);
},
realWidget: () {
if (widget.models.isNotEmpty) {
return Container(
child: CarouselSlider.builder(
itemCount: widget.models.length,
itemBuilder: (BuildContext context, int itemIndex) {
var item = widget.models[itemIndex];
return OfferPackagesItemWidget(model: item);
},
options: option),
);
} else {
return Container();
}
},
onFinish: () {},
)
//
],
);
}
}
// - - - - - - - - - - - - - -
// Carousel Item Widget
// - - - - - - - - - - - - - -
class OfferPackagesItemWidget extends StatefulWidget {
final OfferPackagesItemModel model;
OfferPackagesItemWidget({@required this.model});
@override
State<OfferPackagesItemWidget> createState() {
return _OfferPackagesItemWidgetState();
}
}
class _OfferPackagesItemWidgetState extends State<OfferPackagesItemWidget> {
@override
Widget build(BuildContext context) {
var model = widget.model;
return Card(
clipBehavior: Clip.hardEdge,
elevation: 5,
shadowColor: Colors.grey,
margin: EdgeInsets.only(left: 15, right: 15, bottom: 15),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10), side: BorderSide(color: Colors.white, width: 1)),
child: Container(
padding: EdgeInsets.only(left: 10, right: 20, top: 5, bottom: 5),
width: MediaQuery.of(context).size.width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Texts(
widget.model.title,
color: Colors.red,
fontSize: 20,
),
Texts(
widget.model.desc,
color: Colors.red,
fontSize: 12,
),
Container(
alignment: Alignment.bottomLeft,
child: MaterialButton(
height: 30,
color: HexColor('#D81A2E'),
onPressed: () => widget.model.action.onClick(model.item),
child: Texts(
TranslationBase.of(context).view,
color: Colors.white,
fontSize: 12,
),
),
),
],
),
)
// Container(
// child: Stack(
// children: [
// Container(
// width: MediaQuery.of(context).size.width,
// child: Image.network(
// model.bannerUrl,
// fit: BoxFit.cover,
// ),
// ),
// Align(
// alignment: Alignment.bottomRight,
// child: Container(
// height: 25,
// margin: EdgeInsets.all(5),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.end,
// children: [
// MaterialButton(
// color: HexColor('#D81A2E'),
// onPressed: () => model.action.onClick(model.item),
// child: Texts(
// TranslationBase.of(context).view,
// color: Colors.white,
// fontSize: 12,
// marginLeft: 2,
// marginRight: 2,
// ),
// ),
// VerticalDivider(
// color: Colors.white,
// thickness: 1,
// ),
// MaterialButton(
// color: HexColor('#D81A2E'),
// onPressed: () => model.action.onClick(model.item),
// child: Texts(
// TranslationBase.of(context).viewAll,
// color: Colors.white,
// fontSize: 12,
// marginLeft: 2,
// marginRight: 2,
// ),
// )
// ],
// )),
// ),
// ],
// ),
// ),
);
}
}
// - - - - - - - - - - - - - -
// Carousel Item Models
// - - - - - - - - - - - - - -
class OfferPackagesItemModel<T> {
String bannerUrl;
String title;
String desc;
T item;
OfferPackagesItemActionModel action;
OfferPackagesItemModel(this.bannerUrl, this.title, this.desc, this.item, this.action);
static List<OfferPackagesItemModel> dummy() {
List<OfferPackagesItemModel> list = List<OfferPackagesItemModel>();
list.add(OfferPackagesItemModel<String>(
"http://blog.naseej.com/hs-fs/hubfs/ellucian-banner-9.jpg?width=1486&height=782&name=ellucian-banner-9.jpg",
"Sample Title",
"Sample Desc here ....",
"Sample Item",
OfferPackagesItemActionModel<String>("Click here", (item) {
var vm_categories = locator<OfferCategoriesViewModel>();
vm_categories.service.getAllCategories(OffersCategoriesRequestModel(limit: 100, page: 1, sinceId: 0)).then((value) {
print(value.toString());
print(value.toString());
});
var vm_products = locator<OfferProductsViewModel>();
vm_products.service.getAllProducts(OffersProductsRequestModel(categoryId: 125, limit: 100, page: 1, sinceId: 0)).then((value) {
print(value.toString());
print(value.toString());
});
})));
return list;
}
}
class OfferPackagesItemActionModel<T> {
String actionTitle;
Function(dynamic) onClick;
OfferPackagesItemActionModel(this.actionTitle, this.onClick);
}