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

update history point, manager

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