initial commit to gitea

This commit is contained in:
2022-03-10 00:47:26 -05:00
parent 808ffa3211
commit f504e213a0
93 changed files with 4394 additions and 1539 deletions

View File

@@ -0,0 +1,297 @@
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import '../../utils/utils.dart';
import '../../widgets/desktop/shop_products.dart';
import '../../widgets/general/bottom_nav.dart';
import '../../widgets/general/breadcrumbs.dart';
import '../../widgets/general/navigationbar.dart';
import '../../widgets/general/sliding_up_panel.dart';
import '../../widgets/mobile/shopping_cart_bar.dart';
import 'shop_bulletin.dart';
import '../../constants.dart';
import '../../events/eventbus.dart';
import '../../events/events.dart';
import '../../generated/l10n.dart';
import '../../models/business.dart';
import '../../models/category_products.dart';
import 'product_search.dart';
import 'shop_promote.dart';
import 'shopping_cart_widget.dart';
class Shop extends StatefulWidget {
final int businessId;
const Shop({Key key, this.businessId}): super(key: key);
@override
State<StatefulWidget> createState() => ShopState();
}
class ShopState extends State<Shop> {
Business _business;
PanelController panelController = PanelController();
SlidingUpPanel _slidUpShoppingCart;
GlobalKey endKey = GlobalKey();
List<CategoryProducts> _categoryProducts;
bool displayProductByCategoryClick = false;
String displayProductByCategoryClickIndicator = '';
int categoryId = 0;
static int _productCurrentPage = 1;
int _categoryIndex = 0;
bool _categoryIndexChange = false;
bool _isLoading = false;
dynamic data;
@override
Widget build(BuildContext context) {
if (_business == null) {
return Scaffold(
body: Center(
child: SpinKitWave(
color: Colors.lightBlueAccent,
size: 40.0,
),
),
);
}
_slidUpShoppingCart = SlidingUpPanel(
controller: panelController,
minHeight: 0.0,
maxHeight: 250.0,
isDraggable: false,
backdropEnabled: true,
slideDirection: SlideDirection.DOWN,
panel: ShoppingCartBar(
business: _business,
endKey: endKey,
barAtBottom: true,
hasPicture: true,
onEmptyCartListener: () {
Future.delayed(Duration(seconds: 1), () {
panelController.close();
});
},
onPanelOpenCloseRequest: () {
if (panelController.isPanelOpen) {
panelController.close();
} else {
panelController.open();
}
},
),
);
Scaffold scaffold = Scaffold(
appBar: MiniNavigationBar(
title: S.of(context).shop,
back: true,
breadCrumbs: [
BreadCrumb(S.of(context).shop, null),
BreadCrumb(null, null,
item: Container(
margin: EdgeInsets.only(left: 20.0),
child: Row(
children: [
Container(
child: Icon(
Icons.search,
size: 24,
color: Colors.blue,
),
),
Container(
child: Text(
S.of(context).search_product,
),
),
],
),
),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) {
return ProductSearch(_business);
}));
},
),
],
breadCrumbHeight: Constants.BREADCRUMB_HEIGHT,
shoppingCart: ShoppingCartWidget(
business: _business,
onTap: () {
if (panelController.isPanelClosed) {
panelController.open();
}
},
),
),
body: Scrollbar(
child: NotificationListener<ScrollNotification>(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollEndNotification &&
scrollNotification.metrics.pixels == scrollNotification.metrics.maxScrollExtent) {
loadMoreProducts();
}
return false;
},
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
ShopPromote(data),
ShopBulletin(_business),
ShopProducts(data),
],
),
),
),
),
bottomNavigationBar: BottomNav(),
);
return Stack(
children: [
Positioned(
top: 0,
left: 0,
right: 0,
bottom: 0,
child: scaffold,
),
_slidUpShoppingCart,
],
);
}
@override
void initState() {
super.initState();
eventBus.on<OnCartInfoUpdated>().listen((event) {
if (mounted) {
setState(() {
});
}
});
eventBus.on<CategoryChangeEvent>().listen((event) {
if (mounted) {
// setState(() {
// categoryId = event.categoryId;
// _productCurrentPage = 1;
// });
categoryId = event.categoryId;
_productCurrentPage = 1;
_isLoading = true;
Utils.showLoadingDialog(context, message: S.of(context).loading);
loadProducts();
}
});
loadProducts();
}
void loadProducts() {
print('categoryId $categoryId');
if (categoryId < 0) {
return;
}
_productCurrentPage = 1;
Utils.loadProducts(
widget.businessId, categoryId, _productCurrentPage, false,
(value) {
if (_isLoading) {
_isLoading = false;
Navigator.of(context).pop();
}
if (mounted) {
if (_business == null) {
setState(() {
displayProductByCategoryClick =
value['display_product_by_category_click'];
displayProductByCategoryClickIndicator = '';
_business = Business.fromJson(value['business']);
_categoryProducts = (value['category_products'] as List)
.map((i) => CategoryProducts.fromJson(i))
.toList();
if (categoryId == 0 && displayProductByCategoryClick) {
categoryId = _categoryProducts[0].id;
}
data = value;
});
} else {
eventBus.fire(GetCategoryProducts(value));
}
}
},
(error) {
print('error: $error');
if (_isLoading) {
_isLoading = false;
Navigator.of(context).pop();
}
if (mounted) {
setState(() {});
}
Utils.showMessageDialog(context, error);
}, featuredCount: 6, hotSaleCount: 0, keyword: ''
);
}
void loadMoreProducts() {
if (_productCurrentPage == 0 || categoryId <= 0) {
return;
}
_productCurrentPage += 1;
Utils.loadProducts(widget.businessId, categoryId, _productCurrentPage, true, (value) {
if (_isLoading) {
_isLoading = false;
Navigator.of(context).pop();
}
if (mounted) {
List<CategoryProducts> moreCategoryProducts = (value as List).map((i) => CategoryProducts.fromJson(i)).toList();
if (moreCategoryProducts.isEmpty) {
_productCurrentPage = 0;
} else {
if (moreCategoryProducts[0].products.length < Constants.ORDERS_PER_PAGE) {
_productCurrentPage = 0;
}
}
eventBus.fire(MoreCategoryProducts(moreCategoryProducts));
}
}, (error) {
print('error: $error');
if (_isLoading) {
_isLoading = false;
Navigator.of(context).pop();
}
Utils.showMessageDialog(context, error);
}
);
}
int nextCategoryId(int currentCategoryId) {
if (_categoryProducts.length <= 0) {
return 0;
}
for (int i = 0; i < _categoryProducts.length; i++) {
if (_categoryProducts[i].id == currentCategoryId) {
try {
CategoryProducts cps = _categoryProducts[i + 1];
return cps.id;
} catch (error) {
print('Error $error');
}
}
}
return 0;
}
}