feat: fake orders
This commit is contained in:
@@ -6,6 +6,7 @@ import 'package:gymlink_module_web/components/order_confirm_item_card.dart';
|
||||
import 'package:gymlink_module_web/interfaces/items.dart';
|
||||
import 'package:gymlink_module_web/pages/order_history.dart';
|
||||
import 'package:gymlink_module_web/providers/cart.dart';
|
||||
import 'package:gymlink_module_web/tools/history.dart';
|
||||
import 'package:gymlink_module_web/tools/items.dart';
|
||||
import 'package:gymlink_module_web/tools/prefs.dart';
|
||||
import 'package:gymlink_module_web/tools/routes.dart';
|
||||
@@ -64,6 +65,9 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
List<GymItem> gymCart = [];
|
||||
bool isAgree = false;
|
||||
bool _isLoading = true;
|
||||
final _emailController = TextEditingController();
|
||||
final _addressController = TextEditingController();
|
||||
final _nameController = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -93,6 +97,65 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
}
|
||||
}
|
||||
|
||||
bool _checkInputs() {
|
||||
final email = _emailController.text;
|
||||
final address = _addressController.text;
|
||||
final name = _nameController.text;
|
||||
|
||||
if (!RegExp(r"^((?!\.)[\w\-_.]*[^.])(@\w+)(\.\w+(\.\w+)?[^.\W])$")
|
||||
.hasMatch(email)) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Ошибка'),
|
||||
content: const Text('Некорректный email'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('ОК'),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (address.isEmpty) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Ошибка'),
|
||||
content: const Text('Адрес не может быть пустым'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('ОК'),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (name.isEmpty) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Ошибка'),
|
||||
content: const Text('ФИО не может быть пустым'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('ОК'),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@@ -148,6 +211,7 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
data: '## Итого: ${totalPrice.toStringAsFixed(2)} руб.'),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _addressController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Адрес доставки',
|
||||
border: OutlineInputBorder(
|
||||
@@ -158,6 +222,7 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _emailController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Электронная почта',
|
||||
border: OutlineInputBorder(
|
||||
@@ -169,6 +234,7 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _nameController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Получатель',
|
||||
border: OutlineInputBorder(
|
||||
@@ -179,8 +245,15 @@ class _OrderConfirmationPageState extends State<OrderConfirmationPage> {
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
if (!_checkInputs()) return;
|
||||
_goToPage();
|
||||
await clearCart();
|
||||
await addToHistory(GymHistoryItem(
|
||||
id: '123',
|
||||
date: '01.01.1970',
|
||||
sum: '123',
|
||||
photo: 'product.png',
|
||||
));
|
||||
Provider.of<CartProvider>(context, listen: false)
|
||||
.updateCartLength();
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gymlink_module_web/components/app_bar.dart';
|
||||
import 'package:gymlink_module_web/components/heading.dart';
|
||||
import 'package:gymlink_module_web/components/history_item_card.dart';
|
||||
import 'package:gymlink_module_web/interfaces/items.dart';
|
||||
import 'package:gymlink_module_web/tools/history.dart';
|
||||
import 'package:gymlink_module_web/tools/relative.dart';
|
||||
import 'package:lazy_load_scrollview/lazy_load_scrollview.dart';
|
||||
|
||||
@@ -48,29 +50,22 @@ class HistoryPage extends StatefulWidget {
|
||||
class _HistoryPageState extends State<HistoryPage> {
|
||||
List<GymHistoryItem> my_orders = [];
|
||||
late Timer _updateTimer;
|
||||
bool _isLoading = true;
|
||||
bool _isRefreshing = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
my_orders = [
|
||||
GymHistoryItem(
|
||||
id: '123', date: '01.01.1970', sum: '120', photo: 'product.png')
|
||||
];
|
||||
ordersRefresh();
|
||||
}
|
||||
|
||||
void ordersRefresh() {
|
||||
_updateTimer = Timer.periodic(const Duration(minutes: 1), _onRefresh);
|
||||
Future.microtask(() => _onRefresh(_updateTimer));
|
||||
}
|
||||
|
||||
void _onLoad() async {
|
||||
await Future.delayed(const Duration(milliseconds: 1000));
|
||||
setState(() {
|
||||
my_orders.add(
|
||||
GymHistoryItem(
|
||||
id: '123', date: '01.01.1970', sum: '120', photo: 'product.png'),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -81,7 +76,12 @@ class _HistoryPageState extends State<HistoryPage> {
|
||||
|
||||
Future<void> _onRefresh(Timer timer) async {
|
||||
await Future.delayed(const Duration(milliseconds: 1000));
|
||||
debugPrint('refreshed');
|
||||
var orders = await getHistory();
|
||||
setState(() {
|
||||
my_orders = orders;
|
||||
_isLoading = false;
|
||||
_isRefreshing = false;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -95,42 +95,83 @@ class _HistoryPageState extends State<HistoryPage> {
|
||||
title: 'История заказов',
|
||||
toMain: true,
|
||||
),
|
||||
Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: LazyLoadScrollView(
|
||||
onEndOfPage: _onLoad,
|
||||
scrollOffset: 200,
|
||||
child: RefreshIndicator(
|
||||
edgeOffset: 55,
|
||||
onRefresh: () => _onRefresh(_updateTimer),
|
||||
child: Stack(
|
||||
children: [
|
||||
ListView.builder(
|
||||
itemCount: my_orders.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = my_orders[index];
|
||||
return HistoryItemCard(
|
||||
id: item.id,
|
||||
cost: item.sum,
|
||||
date: item.date,
|
||||
image: Image(
|
||||
image: AssetImage('assets/${item.photo}'),
|
||||
width: 50,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
const SizedBox(height: 5),
|
||||
kIsWeb && !_isLoading
|
||||
? Center(
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
setState(() => _isRefreshing = true);
|
||||
_onRefresh(_updateTimer);
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(50)),
|
||||
),
|
||||
foregroundColor: Colors.white,
|
||||
fixedSize: const Size(180, 40),
|
||||
),
|
||||
child: const Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text('Обновить'),
|
||||
Spacer(),
|
||||
Icon(Icons.refresh),
|
||||
Spacer()
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
const SizedBox(height: 5),
|
||||
_isRefreshing
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: const SizedBox.shrink(),
|
||||
const SizedBox(height: 5),
|
||||
_isLoading
|
||||
? const Expanded(
|
||||
child: Center(child: CircularProgressIndicator()))
|
||||
: Expanded(
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: LazyLoadScrollView(
|
||||
onEndOfPage: _onLoad,
|
||||
scrollOffset: 200,
|
||||
child: RefreshIndicator(
|
||||
edgeOffset: 55,
|
||||
onRefresh: () => _onRefresh(_updateTimer),
|
||||
child: my_orders.isEmpty
|
||||
? const Center(child: Text('Нет заказов'))
|
||||
: Stack(
|
||||
children: [
|
||||
ListView.builder(
|
||||
itemCount: my_orders.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = my_orders[index];
|
||||
return HistoryItemCard(
|
||||
id: item.id,
|
||||
cost: item.sum,
|
||||
date: item.date,
|
||||
image: Image(
|
||||
image: AssetImage(
|
||||
'assets/${item.photo}'),
|
||||
width: 50,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
my_orders.isEmpty
|
||||
? const SizedBox.shrink()
|
||||
: getSpacer(context: context)
|
||||
],
|
||||
),
|
||||
),
|
||||
getSpacer(context: context)
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -7,6 +7,7 @@ import 'package:gymlink_module_web/components/app_bar.dart';
|
||||
import 'package:gymlink_module_web/components/heading.dart';
|
||||
import 'package:gymlink_module_web/components/order_detail_item_card.dart';
|
||||
import 'package:gymlink_module_web/interfaces/items.dart';
|
||||
import 'package:gymlink_module_web/tools/history.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
final GymHistoryItemDetail item = GymHistoryItemDetail.fromJson({
|
||||
@@ -38,7 +39,6 @@ final GymHistoryItemDetail item = GymHistoryItemDetail.fromJson({
|
||||
]
|
||||
});
|
||||
|
||||
//FIXME: Починить скролл
|
||||
class OrderInfoPage extends StatefulWidget {
|
||||
final String id;
|
||||
const OrderInfoPage({super.key, required this.id});
|
||||
@@ -51,6 +51,7 @@ class _OrderInfoPageState extends State<OrderInfoPage> {
|
||||
GymHistoryItemDetail? detail;
|
||||
final _scrollController = ScrollController();
|
||||
late Timer _updateTimer;
|
||||
bool _isRefreshing = false;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -65,9 +66,11 @@ class _OrderInfoPageState extends State<OrderInfoPage> {
|
||||
}
|
||||
|
||||
Future<void> _onRefresh(Timer timer) async {
|
||||
return Future.delayed(const Duration(milliseconds: 1000), () {
|
||||
return Future.delayed(const Duration(milliseconds: 1000), () async {
|
||||
var orderInfo = await getHistoryDetail(widget.id);
|
||||
setState(() {
|
||||
detail = item;
|
||||
detail = orderInfo;
|
||||
_isRefreshing = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -100,7 +103,12 @@ class _OrderInfoPageState extends State<OrderInfoPage> {
|
||||
kIsWeb
|
||||
? Center(
|
||||
child: ElevatedButton(
|
||||
onPressed: () => _onRefresh(_updateTimer),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_isRefreshing = true;
|
||||
});
|
||||
_onRefresh(_updateTimer);
|
||||
},
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
shape: const RoundedRectangleBorder(
|
||||
@@ -122,13 +130,19 @@ class _OrderInfoPageState extends State<OrderInfoPage> {
|
||||
),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
const SizedBox(height: 10),
|
||||
const SizedBox(height: 5),
|
||||
_isRefreshing
|
||||
? const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
const SizedBox(height: 5),
|
||||
ListView.builder(
|
||||
itemCount: 3,
|
||||
itemCount: detail!.providers.length,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemBuilder: (context, index) {
|
||||
final provider = detail!.providers[0];
|
||||
final provider = detail!.providers[index];
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.symmetric(
|
||||
vertical: 10,
|
||||
|
||||
Reference in New Issue
Block a user