Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Hoàng Văn Đạt
mypoint_flutter_app
Commits
55151ba2
Commit
55151ba2
authored
Sep 05, 2025
by
DatHV
Browse files
update history point, manager
parent
f714cdcc
Changes
130
Hide whitespace changes
Inline
Side-by-side
lib/screen/voucher/voucher_list/voucher_list_viewmodel.dart
View file @
55151ba2
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
;
}
...
...
lib/screen/voucher/voucher_tab_screen.dart
View file @
55151ba2
...
...
@@ -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
();
...
...
lib/screen/voucher/voucher_tab_viewmodel.dart
View file @
55151ba2
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
{
...
...
lib/screen/webview/payment_web_view_screen.dart
View file @
55151ba2
...
...
@@ -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:
Custom
App
Bar
(
appBar:
Custom
Navigation
Bar
(
title:
"Thanh toán"
,
leftButtons:
[
CustomBackButton
(
...
...
lib/screen/webview/web_view_screen.dart
View file @
55151ba2
...
...
@@ -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
.
startsWith
(
'http://'
)
&&
!
inputUrl
.
startsWith
(
'https://'
))
{
return
'https://
$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
;
}
return
inputUrl
;
}
@override
...
...
lib/shared/navigate_helper.dart
deleted
100644 → 0
View file @
f714cdcc
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
lib/shared/router_gage.dart
View file @
55151ba2
...
...
@@ -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
pointH
istoryScreen
=
'/
pointH
istoryScreen'
;
const
h
istory
Point
Screen
=
'/
h
istory
Point
Screen'
;
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:
pointH
istoryScreen
,
page:
()
=>
Point
HistoryScreen
()),
GetPage
(
name:
h
istory
Point
Screen
,
page:
()
=>
History
Point
Screen
()),
];
}
}
\ No newline at end of file
lib/widgets/custom_price_tag.dart
View file @
55151ba2
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
(
C
urrencyUnit
.
none
),
isFree
?
'Miễn phí'
:
point
.
money
(
c
urrencyUnit
),
style:
TextStyle
(
fontSize:
12
,
color:
Colors
.
black
,
fontWeight:
FontWeight
.
bold
,
fontWeight:
FontWeight
.
w500
,
),
),
],
...
...
lib/widgets/time_picker_widget.dart
View file @
55151ba2
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),
//
],
//
),
//
),
//
),
//
);
//
}
//
}
pubspec.yaml
View file @
55151ba2
...
...
@@ -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
:
...
...
Prev
1
…
3
4
5
6
7
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment