Commit 55151ba2 authored by DatHV's avatar DatHV
Browse files

update history point, manager

parent f714cdcc
import 'dart:async';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/networking/restful_api_request.dart';
import '../../../base/restful_api_viewmodel.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart';
import '../../../networking/restful_api_viewmodel.dart';
import '../models/product_model.dart';
import '../models/product_type.dart';
......@@ -60,6 +60,9 @@ class VoucherListViewModel extends RestfulApiViewModel {
_currentPage = products.length;
}
if (!_hasMore) return;
if (reset) {
showLoading();
}
final body = {"size": _pageSize, "index": _currentPage};
try {
isLoading.value = true;
......@@ -73,6 +76,7 @@ class VoucherListViewModel extends RestfulApiViewModel {
} catch (error) {
print("Error fetching products: $error");
} finally {
hideLoading();
isLoading.value = false;
isLoadMore.value = false;
}
......@@ -88,7 +92,9 @@ class VoucherListViewModel extends RestfulApiViewModel {
_currentPage = products.length;
}
if (!_hasMore) return;
if (reset) {
showLoading();
}
final body = {
"type": ProductType.voucher.value,
"size": _pageSize,
......@@ -111,6 +117,7 @@ class VoucherListViewModel extends RestfulApiViewModel {
} catch (error) {
print("Error fetching products: $error");
} finally {
hideLoading();
isLoading.value = false;
isLoadMore.value = false;
}
......
......@@ -22,8 +22,6 @@ class VoucherTabScreen extends StatefulWidget {
}
class _VoucherTabScreenState extends State<VoucherTabScreen> with PopupOnInit {
final _headerHomeVM = Get.find<HeaderHomeViewModel>();
@override
void initState() {
super.initState();
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/networking/restful_api_request.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart';
import 'package:mypoint_flutter_app/screen/voucher/models/product_type.dart';
import '../../base/restful_api_viewmodel.dart';
import '../../networking/restful_api_viewmodel.dart';
import 'models/product_model.dart';
class VoucherTabViewModel extends RestfulApiViewModel {
......
......@@ -12,6 +12,7 @@ import '../../resources/base_color.dart';
import '../../shared/router_gage.dart';
import '../../widgets/alert/data_alert_model.dart';
import '../../widgets/back_button.dart';
import '../../widgets/custom_navigation_bar.dart';
enum PaymentProcess {
begin,
......@@ -120,7 +121,7 @@ class _PaymentWebViewScreenState extends BaseState<PaymentWebViewScreen> with Ba
@override
Widget createBody() {
return Scaffold(
appBar: CustomAppBar(
appBar: CustomNavigationBar(
title: "Thanh toán",
leftButtons: [
CustomBackButton(
......
......@@ -59,6 +59,10 @@ class _BaseWebViewScreenState extends BaseState<BaseWebViewScreen> with BasicSta
onWebResourceError: (error) {
hideLoading();
if (error.description != 'about:blank') {
if (kDebugMode) {
print('WebView error: ${error.description}');
}
// Có thể hiển thị lỗi nếu cần
// showAlertError(content: error.description);
}
},
......@@ -70,10 +74,19 @@ class _BaseWebViewScreenState extends BaseState<BaseWebViewScreen> with BasicSta
}
String formatUrl(String inputUrl) {
if (inputUrl.isEmpty) return '';
try {
if (!inputUrl.startsWith('http://') && !inputUrl.startsWith('https://')) {
return 'https://$inputUrl';
}
return inputUrl;
} catch (e) {
if (kDebugMode) {
print('Failed to format URL: $inputUrl - $e');
}
return inputUrl;
}
}
@override
......
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/extensions/context_extensions.dart';
mixin navigateHelper {
void showPopupErrorMessage(String message){
Get.context?.showAlertDialog(message);
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ import '../screen/electric_payment/electric_payment_history_screen.dart';
import '../screen/electric_payment/electric_payment_screen.dart';
import '../screen/game/game_cards/game_card_screen.dart';
import '../screen/game/game_tab_screen.dart';
import '../screen/history_point/history_point_screen.dart';
import '../screen/history_point_cashback/history_point_cashback_screen.dart';
import '../screen/interested_categories/interestied_categories_screen.dart';
import '../screen/invite_friend_campaign/invite_friend_campaign_screen.dart';
......@@ -28,7 +29,6 @@ import '../screen/onboarding/onboarding_screen.dart';
import '../screen/order_menu/order_menu_screen.dart';
import '../screen/pageDetail/campaign_detail_screen.dart';
import '../screen/personal/personal_edit_screen.dart';
import '../screen/point_history/point_history_screen.dart';
import '../screen/quiz_campaign/quiz_campaign_screen.dart';
import '../screen/register_campaign/register_form_input_screen.dart';
import '../screen/setting/setting_screen.dart';
......@@ -95,7 +95,7 @@ const deviceManagerScreen = '/deviceManagerScreen';
const interestCategoriesScreen = '/interestCategoriesScreen';
const myMobileCardListScreen = '/myMobileCardListScreen';
const bankAccountManagerScreen = '/bankAccountManagerScreen';
const pointHistoryScreen = '/pointHistoryScreen';
const historyPointScreen = '/historyPointScreen';
class RouterPage {
static List<GetPage> pages() {
......@@ -159,7 +159,7 @@ class RouterPage {
GetPage(name: myMobileCardListScreen, page: () => MyMobileCardListScreen()),
GetPage(name: interestCategoriesScreen, page: () => InterestCategoriesScreen()),
GetPage(name: bankAccountManagerScreen, page: () => BankAccountManagerScreen()),
GetPage(name: pointHistoryScreen, page: () => PointHistoryScreen()),
GetPage(name: historyPointScreen, page: () => HistoryPointScreen()),
];
}
}
\ No newline at end of file
import 'package:flutter/material.dart';
import '../extensions/num_extension.dart';
import '../resources/base_color.dart';
import '../screen/voucher/models/cash_type.dart';
class PriceTagWidget extends StatelessWidget {
final int point;
const PriceTagWidget({super.key, required this.point});
final CashType? type;
const PriceTagWidget({super.key, required this.point, this.type,});
bool get isFree => point == 0;
CurrencyUnit get currencyUnit => type == CashType.point ? CurrencyUnit.point : CurrencyUnit.vnd;
@override
Widget build(BuildContext context) {
......@@ -24,11 +26,11 @@ class PriceTagWidget extends StatelessWidget {
Image.asset('assets/images/ic_point.png', width: 16, height: 16),
const SizedBox(width: 4),
Text(
isFree ? 'Miễn phí' : point.money(CurrencyUnit.none),
isFree ? 'Miễn phí' : point.money(currencyUnit),
style: TextStyle(
fontSize: 12,
color: Colors.black,
fontWeight: FontWeight.bold,
fontWeight: FontWeight.w500,
),
),
],
......
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class DatePickerField extends StatefulWidget {
final String label;
final DateTime? initialDate;
final Function(DateTime) onDateSelected;
final bool enabled;
const DatePickerField({
super.key,
required this.label,
this.initialDate,
required this.onDateSelected,
this.enabled = true,
});
@override
State<DatePickerField> createState() => _DatePickerFieldState();
}
class _DatePickerFieldState extends State<DatePickerField> {
DateTime? _selectedDate;
@override
void initState() {
super.initState();
_selectedDate = widget.initialDate;
}
Future<void> _pickDate() async {
if (!widget.enabled) return;
final now = DateTime.now();
final picked = await showDatePicker(
context: context,
initialDate: _selectedDate ?? now,
firstDate: DateTime(1900),
lastDate: DateTime(2100),
);
if (picked != null) {
setState(() {
_selectedDate = picked;
});
widget.onDateSelected(picked);
}
}
@override
Widget build(BuildContext context) {
final displayText = _selectedDate != null
? DateFormat('dd/MM/yyyy').format(_selectedDate!)
: widget.label;
return GestureDetector(
onTap: _pickDate,
child: AbsorbPointer(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey.shade400),
borderRadius: BorderRadius.circular(8),
color: widget.enabled ? Colors.white : Colors.grey.shade100,
),
child: Row(
children: [
const Icon(Icons.calendar_today, color: Colors.blueGrey, size: 20),
const SizedBox(width: 12),
Expanded(
child: Text(
displayText,
style: TextStyle(
fontSize: 16,
color: _selectedDate != null
? Colors.black87
: Colors.grey.shade500,
),
),
),
if (widget.enabled)
const Icon(Icons.expand_more, color: Colors.grey),
],
),
),
),
);
}
}
// import 'package:flutter/material.dart';
// import 'package:intl/intl.dart';
//
// class DatePickerField extends StatefulWidget {
// final String label;
// final DateTime? initialDate;
// final Function(DateTime) onDateSelected;
// final bool enabled;
//
// const DatePickerField({
// super.key,
// required this.label,
// this.initialDate,
// required this.onDateSelected,
// this.enabled = true,
// });
//
// @override
// State<DatePickerField> createState() => _DatePickerFieldState();
// }
//
// class _DatePickerFieldState extends State<DatePickerField> {
// DateTime? _selectedDate;
//
// @override
// void initState() {
// super.initState();
// _selectedDate = widget.initialDate;
// }
//
// Future<void> _pickDate() async {
// if (!widget.enabled) return;
//
// final now = DateTime.now();
// final picked = await showDatePicker(
// context: context,
// initialDate: _selectedDate ?? now,
// firstDate: DateTime(1900),
// lastDate: DateTime(2100),
// );
//
// if (picked != null) {
// setState(() {
// _selectedDate = picked;
// });
// widget.onDateSelected(picked);
// }
// }
//
// @override
// Widget build(BuildContext context) {
// final displayText = _selectedDate != null
// ? DateFormat('dd/MM/yyyy').format(_selectedDate!)
// : widget.label;
//
// return GestureDetector(
// onTap: _pickDate,
// child: AbsorbPointer(
// child: Container(
// padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
// decoration: BoxDecoration(
// border: Border.all(color: Colors.grey.shade400),
// borderRadius: BorderRadius.circular(8),
// color: widget.enabled ? Colors.white : Colors.grey.shade100,
// ),
// child: Row(
// children: [
// const Icon(Icons.calendar_today, color: Colors.blueGrey, size: 20),
// const SizedBox(width: 12),
// Expanded(
// child: Text(
// displayText,
// style: TextStyle(
// fontSize: 16,
// color: _selectedDate != null
// ? Colors.black87
// : Colors.grey.shade500,
// ),
// ),
// ),
// if (widget.enabled)
// const Icon(Icons.expand_more, color: Colors.grey),
// ],
// ),
// ),
// ),
// );
// }
// }
......@@ -64,7 +64,7 @@ dependencies:
file_saver: ^0.2.2
month_picker_dialog:
marquee: ^2.2.3
fl_chart: ^0.66.2
game_miniapp:
path: ../mini_app/game_miniapp
dev_dependencies:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment