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
6b980613
Commit
6b980613
authored
Nov 14, 2025
by
DatHV
Browse files
update project structure
parent
bfff9e47
Changes
507
Hide whitespace changes
Inline
Side-by-side
lib/
screen
/game/models/game_bundle_item_model.dart
→
lib/
features
/game/models/game_bundle_item_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'../../../widgets/alert/popup_data_model.dart'
;
import
'../../../
shared/
widgets/alert/popup_data_model.dart'
;
import
'game_card_item_model.dart'
;
import
'game_card_item_model.dart'
;
part
'game_bundle_item_model.g.dart'
;
part
'game_bundle_item_model.g.dart'
;
@JsonSerializable
()
@JsonSerializable
()
class
GameBundleItemModel
{
class
GameBundleItemModel
{
final
String
?
id
;
final
String
?
id
;
...
...
lib/
screen
/game/models/game_bundle_item_model.g.dart
→
lib/
features
/game/models/game_bundle_item_model.g.dart
View file @
6b980613
File moved
lib/
screen
/game/models/game_bundle_response.dart
→
lib/
features
/game/models/game_bundle_response.dart
View file @
6b980613
File moved
lib/
screen
/game/models/game_bundle_response.g.dart
→
lib/
features
/game/models/game_bundle_response.g.dart
View file @
6b980613
File moved
lib/
screen
/game/models/game_card_item_model.dart
→
lib/
features
/game/models/game_card_item_model.dart
View file @
6b980613
File moved
lib/
screen
/game/models/game_card_item_model.g.dart
→
lib/
features
/game/models/game_card_item_model.g.dart
View file @
6b980613
File moved
lib/
screen
/health_book/health_book_card_detail.dart
→
lib/
features
/health_book/health_book_card_detail.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
import
'package:flutter/services.dart'
;
import
'package:get/get.dart'
;
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/widgets/custom_empty_widget.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/custom_empty_widget.dart'
;
import
'../../
base
/base_screen.dart'
;
import
'../../
shared/widgets/base_view
/base_screen.dart'
;
import
'../../
base
/basic_state.dart'
;
import
'../../
shared/widgets/base_view
/basic_state.dart'
;
import
'../../extensions/date_format.dart'
;
import
'../../
core/utils/
extensions/date_format.dart'
;
import
'../../widgets/custom_navigation_bar.dart'
;
import
'../../
shared/
widgets/custom_navigation_bar.dart'
;
import
'../../widgets/custom_toast_message.dart'
;
import
'../../
shared/
widgets/custom_toast_message.dart'
;
import
'health_book_card_detail_viewmodel.dart'
;
import
'health_book_card_detail_viewmodel.dart'
;
import
'health_book_model.dart'
;
import
'health_book_model.dart'
;
...
@@ -39,9 +39,9 @@ class _HealthBookCardDetailState extends BaseState<HealthBookCardDetail> with Ba
...
@@ -39,9 +39,9 @@ class _HealthBookCardDetailState extends BaseState<HealthBookCardDetail> with Ba
return
;
return
;
}
}
if
(
data
!=
null
)
{
if
(
data
!=
null
)
{
_viewModel
?
.
card
.
value
=
data
;
_viewModel
.
card
.
value
=
data
;
}
else
if
(
cardId
.
hasText
)
{
}
else
if
(
cardId
.
hasText
)
{
_viewModel
?
.
getHealthBookCardDetail
(
cardId
!);
_viewModel
.
getHealthBookCardDetail
(
cardId
!);
}
}
_viewModel
.
onShowAlertError
=
(
message
)
{
_viewModel
.
onShowAlertError
=
(
message
)
{
WidgetsBinding
.
instance
.
addPostFrameCallback
((
_
)
{
WidgetsBinding
.
instance
.
addPostFrameCallback
((
_
)
{
...
@@ -57,8 +57,10 @@ class _HealthBookCardDetailState extends BaseState<HealthBookCardDetail> with Ba
...
@@ -57,8 +57,10 @@ class _HealthBookCardDetailState extends BaseState<HealthBookCardDetail> with Ba
appBar:
CustomNavigationBar
(
title:
'Chi tiết thẻ'
),
appBar:
CustomNavigationBar
(
title:
'Chi tiết thẻ'
),
body:
SafeArea
(
body:
SafeArea
(
child:
Obx
(()
{
child:
Obx
(()
{
final
card
=
_viewModel
?.
card
.
value
;
final
card
=
_viewModel
.
card
.
value
;
if
(
card
==
null
)
return
EmptyWidget
();
if
(
card
==
null
)
{
return
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
);
}
final
name
=
card
.
fullName
.
orIfBlank
(
'--'
);
final
name
=
card
.
fullName
.
orIfBlank
(
'--'
);
final
phone
=
card
.
phoneNumber
.
orIfBlank
(
'--'
);
final
phone
=
card
.
phoneNumber
.
orIfBlank
(
'--'
);
final
cardCode
=
card
.
cardCode
.
orIfBlank
(
'--'
);
final
cardCode
=
card
.
cardCode
.
orIfBlank
(
'--'
);
...
...
lib/
screen
/health_book/health_book_card_detail_viewmodel.dart
→
lib/
features
/health_book/health_book_card_detail_viewmodel.dart
View file @
6b980613
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart'
;
import
'../../configs/constants.dart'
;
import
'../../core/network/restful_api_viewmodel.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'health_book_model.dart'
;
import
'health_book_model.dart'
;
class
HealthBookCardDetailViewModel
extends
RestfulApiViewModel
{
class
HealthBookCardDetailViewModel
extends
RestfulApiViewModel
{
...
...
lib/
screen
/health_book/health_book_model.dart
→
lib/
features
/health_book/health_book_model.dart
View file @
6b980613
File moved
lib/
screen
/health_book/health_book_model.g.dart
→
lib/
features
/health_book/health_book_model.g.dart
View file @
6b980613
File moved
lib/
screen
/health_book/health_book_screen.dart
→
lib/
features
/health_book/health_book_screen.dart
View file @
6b980613
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/widgets/custom_empty_widget.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/custom_empty_widget.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../../widgets/custom_navigation_bar.dart'
;
import
'../../
shared/
widgets/custom_navigation_bar.dart'
;
import
'../traffic_service/traffic_service_model.dart'
;
import
'../traffic_service/traffic_service_model.dart'
;
import
'health_book_viewmodel.dart'
;
import
'health_book_viewmodel.dart'
;
import
'widgets/health_book_item.dart'
;
import
'widgets/health_book_item.dart'
;
...
@@ -38,7 +38,7 @@ class _HealthBookScreenState extends State<HealthBookScreen> {
...
@@ -38,7 +38,7 @@ class _HealthBookScreenState extends State<HealthBookScreen> {
child:
Obx
(()
{
child:
Obx
(()
{
final
products
=
_viewModel
.
healthBookData
.
value
?.
products
??
[];
final
products
=
_viewModel
.
healthBookData
.
value
?.
products
??
[];
return
products
.
isEmpty
return
products
.
isEmpty
?
Center
(
child:
EmptyWidget
())
?
Center
(
child:
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
))
:
ListView
.
builder
(
:
ListView
.
builder
(
itemCount:
products
.
length
,
itemCount:
products
.
length
,
itemBuilder:
(
context
,
index
)
{
itemBuilder:
(
context
,
index
)
{
...
@@ -48,7 +48,7 @@ class _HealthBookScreenState extends State<HealthBookScreen> {
...
@@ -48,7 +48,7 @@ class _HealthBookScreenState extends State<HealthBookScreen> {
child:
HealthBookItem
(
child:
HealthBookItem
(
item:
item
,
item:
item
,
onTap:
()
{
onTap:
()
{
Get
.
toNamed
(
healthBookCardDetail
,
arguments:
{
'health_book_card'
:
item
,
'id'
:
item
.
itemId
.
toString
()
??
''
});
Get
.
toNamed
(
healthBookCardDetail
,
arguments:
{
'health_book_card'
:
item
,
'id'
:
item
.
itemId
.
toString
()});
},
},
),
),
);
);
...
...
lib/
screen
/health_book/health_book_viewmodel.dart
→
lib/
features
/health_book/health_book_viewmodel.dart
View file @
6b980613
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/configs/constants.dart'
;
import
'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/features/traffic_service/traffic_service_model.dart'
;
import
'package:mypoint_flutter_app/screen/traffic_service/traffic_service_model.dart'
;
import
'../../core/network/restful_api_viewmodel.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'health_book_model.dart'
;
import
'health_book_model.dart'
;
class
HealthBookViewModel
extends
RestfulApiViewModel
{
class
HealthBookViewModel
extends
RestfulApiViewModel
{
...
...
lib/
screen
/health_book/widgets/health_book_item.dart
→
lib/
features
/health_book/widgets/health_book_item.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:mypoint_flutter_app/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/widgets/image_loader.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/image_loader.dart'
;
import
'../../../extensions/date_format.dart'
;
import
'../../../
core/utils/
extensions/date_format.dart'
;
import
'../health_book_model.dart'
;
import
'../health_book_model.dart'
;
class
HealthBookItem
extends
StatelessWidget
{
class
HealthBookItem
extends
StatelessWidget
{
...
@@ -127,3 +127,8 @@ class HealthBookItem extends StatelessWidget {
...
@@ -127,3 +127,8 @@ class HealthBookItem extends StatelessWidget {
lib/
screen
/history_point/history_point_chart.dart
→
lib/
features
/history_point/history_point_chart.dart
View file @
6b980613
import
'dart:math'
;
import
'dart:math'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:fl_chart/fl_chart.dart'
;
import
'package:fl_chart/fl_chart.dart'
;
import
'package:intl/intl.dart'
;
import
'package:intl/intl.dart'
;
import
'package:mypoint_flutter_app/extensions/num_extension.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/num_extension.dart'
;
import
'models/transaction_summary_by_date_model.dart'
;
import
'models/transaction_summary_by_date_model.dart'
;
class
MonthlyPointsChart
extends
StatelessWidget
{
class
MonthlyPointsChart
extends
StatelessWidget
{
...
@@ -229,8 +228,6 @@ class MonthlyPointsChart extends StatelessWidget {
...
@@ -229,8 +228,6 @@ class MonthlyPointsChart extends StatelessWidget {
return
double
.
tryParse
(
s
)
??
0
;
return
double
.
tryParse
(
s
)
??
0
;
}
}
static
String
_formatInt
(
double
v
)
=>
v
.
toStringAsFixed
(
0
);
/// Format Y-axis label để hiển thị gọn gàng
/// Format Y-axis label để hiển thị gọn gàng
String
_formatYAxisLabel
(
int
value
)
{
String
_formatYAxisLabel
(
int
value
)
{
if
(
value
>=
1000000
)
{
if
(
value
>=
1000000
)
{
...
...
lib/
screen
/history_point/history_point_screen.dart
→
lib/
features
/history_point/history_point_screen.dart
View file @
6b980613
...
@@ -2,14 +2,13 @@ import 'package:flutter/material.dart';
...
@@ -2,14 +2,13 @@ import 'package:flutter/material.dart';
import
'package:flutter/services.dart'
;
import
'package:flutter/services.dart'
;
import
'package:get/get.dart'
;
import
'package:get/get.dart'
;
import
'package:month_picker_dialog/month_picker_dialog.dart'
;
import
'package:month_picker_dialog/month_picker_dialog.dart'
;
import
'package:mypoint_flutter_app/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/core/utils/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/extensions/num_extension.dart'
;
import
'package:mypoint_flutter_app/core/utils/extensions/num_extension.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/resources/base_color.dart'
;
import
'package:mypoint_flutter_app/shared/widgets/custom_toast_message.dart'
;
import
'package:mypoint_flutter_app/widgets/custom_toast_message.dart'
;
import
'../../shared/widgets/custom_empty_widget.dart'
;
import
'../../../widgets/custom_empty_widget.dart'
;
import
'../../shared/widgets/custom_navigation_bar.dart'
;
import
'../../../widgets/custom_navigation_bar.dart'
;
import
'../../core/utils/extensions/date_format.dart'
;
import
'../../extensions/date_format.dart'
;
import
'history_point_chart.dart'
;
import
'history_point_chart.dart'
;
import
'history_point_viewmodel.dart'
;
import
'history_point_viewmodel.dart'
;
import
'models/cash_history_model.dart'
;
import
'models/cash_history_model.dart'
;
...
@@ -121,7 +120,10 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
...
@@ -121,7 +120,10 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
Widget
_buildTransactionHistoryList
(
List
<
TransactionHistoryModel
>
transactionHistories
)
{
Widget
_buildTransactionHistoryList
(
List
<
TransactionHistoryModel
>
transactionHistories
)
{
if
(
transactionHistories
.
isEmpty
)
{
if
(
transactionHistories
.
isEmpty
)
{
return
SliverFillRemaining
(
hasScrollBody:
false
,
child:
Center
(
child:
EmptyWidget
()));
return
SliverFillRemaining
(
hasScrollBody:
false
,
child:
Center
(
child:
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
)),
);
}
else
{
}
else
{
return
SliverList
(
return
SliverList
(
delegate:
SliverChildBuilderDelegate
((
context
,
index
)
{
delegate:
SliverChildBuilderDelegate
((
context
,
index
)
{
...
@@ -133,7 +135,10 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
...
@@ -133,7 +135,10 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
Widget
_buildCashHistoryList
(
List
<
CashHistoryModel
>
cashHistories
)
{
Widget
_buildCashHistoryList
(
List
<
CashHistoryModel
>
cashHistories
)
{
if
(
cashHistories
.
isEmpty
)
{
if
(
cashHistories
.
isEmpty
)
{
return
SliverFillRemaining
(
hasScrollBody:
false
,
child:
Center
(
child:
EmptyWidget
()));
return
SliverFillRemaining
(
hasScrollBody:
false
,
child:
Center
(
child:
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
)),
);
}
else
{
}
else
{
return
SliverList
(
return
SliverList
(
delegate:
SliverChildBuilderDelegate
((
context
,
index
)
{
delegate:
SliverChildBuilderDelegate
((
context
,
index
)
{
...
@@ -230,7 +235,7 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
...
@@ -230,7 +235,7 @@ class _HistoryPointScreenState extends State<HistoryPointScreen> {
child:
Image
.
network
(
child:
Image
.
network
(
item
.
brandLogo
??
''
,
item
.
brandLogo
??
''
,
fit:
BoxFit
.
contain
,
fit:
BoxFit
.
contain
,
errorBuilder:
(
_
,
_
_
,
__
_
)
=>
Image
.
asset
(
'assets/images/ic_logo.png'
),
errorBuilder:
(
_
,
_
,
_
)
=>
Image
.
asset
(
'assets/images/ic_logo.png'
),
),
),
),
),
),
),
...
...
lib/
screen
/history_point/history_point_viewmodel.dart
→
lib/
features
/history_point/history_point_viewmodel.dart
View file @
6b980613
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/network
ing
/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/
core/
network/restful_api_client_all_request.dart'
;
import
'../../network
ing
/restful_api_viewmodel.dart'
;
import
'../../
core/
network/restful_api_viewmodel.dart'
;
import
'models/history_point_models.dart'
;
import
'models/history_point_models.dart'
;
import
'models/transaction_summary_by_date_model.dart'
;
import
'models/transaction_summary_by_date_model.dart'
;
...
...
lib/
screen
/history_point/models/cash_history_model.dart
→
lib/
features
/history_point/models/cash_history_model.dart
View file @
6b980613
import
'dart:ui'
;
import
'dart:ui'
;
class
CashHistoryModel
{
class
CashHistoryModel
{
...
...
lib/
screen
/history_point/models/history_point_models.dart
→
lib/
features
/history_point/models/history_point_models.dart
View file @
6b980613
import
'dart:ui'
;
import
'dart:ui'
;
import
'cash_history_model.dart'
;
import
'cash_history_model.dart'
;
import
'package:mypoint_flutter_app/
screen
/history_point/models/transaction_history_model.dart'
;
import
'package:mypoint_flutter_app/
features
/history_point/models/transaction_history_model.dart'
;
class
ListHistoryResponseModel
{
class
ListHistoryResponseModel
{
final
List
<
TransactionHistoryModel
>?
historyTransaction
;
final
List
<
TransactionHistoryModel
>?
historyTransaction
;
...
...
lib/
screen
/history_point/models/transaction_history_model.dart
→
lib/
features
/history_point/models/transaction_history_model.dart
View file @
6b980613
import
'../../../config
s
/callbacks.dart'
;
import
'../../../
app/
config/callbacks.dart'
;
class
TransactionHistoryModel
{
class
TransactionHistoryModel
{
final
String
?
poolCode
;
final
String
?
poolCode
;
...
...
lib/
screen
/history_point/models/transaction_summary_by_date_model.dart
→
lib/
features
/history_point/models/transaction_summary_by_date_model.dart
View file @
6b980613
import
'../../../config
s
/callbacks.dart'
;
import
'../../../
app/
config/callbacks.dart'
;
class
TransactionSummaryByDateModel
{
class
TransactionSummaryByDateModel
{
final
MonthSummaryChartModel
month
;
final
MonthSummaryChartModel
month
;
...
...
Prev
1
…
6
7
8
9
10
11
12
13
14
…
26
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