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
/mobile_card/models/mobile_service_redeem_data.dart
→
lib/
features
/mobile_card/models/mobile_service_redeem_data.dart
View file @
6b980613
File moved
lib/
screen
/mobile_card/models/mobile_service_redeem_data.g.dart
→
lib/
features
/mobile_card/models/mobile_service_redeem_data.g.dart
View file @
6b980613
File moved
lib/
screen
/mobile_card/models/product_mobile_card_model.dart
→
lib/
features
/mobile_card/models/product_mobile_card_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'package:mypoint_flutter_app/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/string_extension.dart'
;
part
'product_mobile_card_model.g.dart'
;
@JsonSerializable
(
explicitToJson:
true
)
...
...
lib/
screen
/mobile_card/models/product_mobile_card_model.g.dart
→
lib/
features
/mobile_card/models/product_mobile_card_model.g.dart
View file @
6b980613
File moved
lib/
screen
/mobile_card/models/usable_voucher_model.dart
→
lib/
features
/mobile_card/models/usable_voucher_model.dart
View file @
6b980613
import
'package:flutter/foundation.dart'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'package:mypoint_flutter_app/screen/mobile_card/models/product_mobile_card_model.dart'
;
import
'../../home/models/brand_model.dart'
;
import
'package:mypoint_flutter_app/features/mobile_card/models/product_mobile_card_model.dart'
;
import
'../../affiliate_brand_detail/models/brand_model.dart'
;
part
'usable_voucher_model.g.dart'
;
@JsonSerializable
()
...
...
lib/
screen
/mobile_card/models/usable_voucher_model.g.dart
→
lib/
features
/mobile_card/models/usable_voucher_model.g.dart
View file @
6b980613
File moved
lib/
screen
/mobile_card/product_mobile_card_screen.dart
→
lib/
features
/mobile_card/product_mobile_card_screen.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/extensions/num_extension.dart'
;
import
'package:mypoint_flutter_app/
screen
/mobile_card/product_mobile_card_viewmodel.dart'
;
import
'package:mypoint_flutter_app/
screen
/mobile_card/usable_mobile_card_popup.dart'
;
import
'package:mypoint_flutter_app/widgets/custom_empty_widget.dart'
;
import
'package:mypoint_flutter_app/widgets/image_loader.dart'
;
import
'../../
base
/base_screen.dart'
;
import
'../../
base
/basic_state.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'../../widgets/alert/custom_alert_dialog.dart'
;
import
'../../widgets/alert/data_alert_model.dart'
;
import
'../../widgets/custom_navigation_bar.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/num_extension.dart'
;
import
'package:mypoint_flutter_app/
features
/mobile_card/product_mobile_card_viewmodel.dart'
;
import
'package:mypoint_flutter_app/
features
/mobile_card/usable_mobile_card_popup.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/custom_empty_widget.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/image_loader.dart'
;
import
'../../
shared/widgets/base_view
/base_screen.dart'
;
import
'../../
shared/widgets/base_view
/basic_state.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'../../
shared/
widgets/alert/custom_alert_dialog.dart'
;
import
'../../
shared/
widgets/alert/data_alert_model.dart'
;
import
'../../
shared/
widgets/custom_navigation_bar.dart'
;
class
ProductMobileCardScreen
extends
BaseScreen
{
const
ProductMobileCardScreen
({
super
.
key
});
...
...
@@ -132,9 +132,9 @@ class _ProductMobileCardScreenState extends BaseState<ProductMobileCardScreen> w
final
widthItem
=
(
MediaQuery
.
of
(
context
).
size
.
width
-
12
*
3
)
/
2
;
return
(
_viewModel
.
products
.
isEmpty
)
?
const
Expanded
(
Expanded
(
child:
Center
(
child:
EmptyWidget
(),
child:
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
),
),
)
:
Expanded
(
child:
GridView
.
count
(
...
...
lib/
screen
/mobile_card/product_mobile_card_viewmodel.dart
→
lib/
features
/mobile_card/product_mobile_card_viewmodel.dart
View file @
6b980613
import
'package:get/get_rx/src/rx_types/rx_types.dart'
;
import
'package:mypoint_flutter_app/config
s
/constants.dart'
;
import
'package:mypoint_flutter_app/network
ing
/api/product_api.dart'
deferred
as
product_api
;
import
'package:mypoint_flutter_app/
screen
/mobile_card/models/product_mobile_card_model.dart'
;
import
'../../
base
/base_response_model.dart'
;
import
'../../network
ing
/restful_api_viewmodel.dart'
;
import
'../../preference/point/point_manager.dart'
;
import
'package:mypoint_flutter_app/
app/
config/constants.dart'
;
import
'package:mypoint_flutter_app/
core/
network/api/product_api.dart'
deferred
as
product_api
;
import
'package:mypoint_flutter_app/
features
/mobile_card/models/product_mobile_card_model.dart'
;
import
'../../
shared/widgets/base_view
/base_response_model.dart'
;
import
'../../
core/
network/restful_api_viewmodel.dart'
;
import
'../../
shared/
preference
s
/point/point_manager.dart'
;
import
'models/mobile_service_redeem_data.dart'
;
import
'models/usable_voucher_model.dart'
;
...
...
lib/
screen
/mobile_card/usable_mobile_card_popup.dart
→
lib/
features
/mobile_card/usable_mobile_card_popup.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
import
'package:mypoint_flutter_app/extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/extensions/string_extension.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/datetime_extensions.dart'
;
import
'package:mypoint_flutter_app/
core/utils/
extensions/string_extension.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'models/usable_voucher_model.dart'
;
class
UsableMobileCardPopup
extends
StatelessWidget
{
...
...
lib/
screen
/news/models/news_item_model.dart
→
lib/
features
/news/models/news_item_model.dart
View file @
6b980613
File moved
lib/
screen
/news/models/news_item_model.g.dart
→
lib/
features
/news/models/news_item_model.g.dart
View file @
6b980613
File moved
lib/
screen
/news/news_item_widget.dart
→
lib/
features
/news/news_item_widget.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:mypoint_flutter_app/widgets/image_loader.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/image_loader.dart'
;
import
'../faqs/faqs_model.dart'
;
class
PageItemWidget
extends
StatelessWidget
{
...
...
lib/
screen
/news/news_list_screen.dart
→
lib/
features
/news/news_list_screen.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:get/get.dart'
;
import
'../../../shared/router_gage.dart'
;
import
'../../
..
/widgets/custom_empty_widget.dart'
;
import
'../../
..
/widgets/custom_navigation_bar.dart'
;
import
'../../
shared
/widgets/custom_empty_widget.dart'
;
import
'../../
shared
/widgets/custom_navigation_bar.dart'
;
import
'news_item_widget.dart'
;
import
'news_list_viewmodel.dart'
;
...
...
@@ -19,6 +19,7 @@ class _NewsListScreenState extends State<NewsListScreen> {
@override
void
initState
()
{
super
.
initState
();
_viewModel
.
getNewsList
(
isRefresh:
true
);
}
@override
...
...
@@ -30,19 +31,26 @@ class _NewsListScreenState extends State<NewsListScreen> {
children:
[
Expanded
(
child:
Obx
(()
{
if
(
_viewModel
.
newsList
.
value
.
isEmpty
)
{
return
const
Center
(
child:
EmptyWidget
());
if
(
_viewModel
.
newsList
.
isEmpty
)
{
return
Center
(
child:
EmptyWidget
(
isLoading:
_viewModel
.
isLoading
.
value
));
}
return
RefreshIndicator
(
onRefresh:
()
=>
_viewModel
.
getNewsList
(
isRefresh:
true
),
child:
ListView
.
builder
(
physics:
const
AlwaysScrollableScrollPhysics
(),
itemCount:
_viewModel
.
newsList
.
length
,
itemCount:
_viewModel
.
newsList
.
length
+
(
_viewModel
.
canLoadMore
?
1
:
0
)
,
itemBuilder:
(
context
,
index
)
{
if
(
index
>=
_viewModel
.
newsList
.
length
)
{
_viewModel
.
getNewsList
(
isRefresh:
false
);
if
(
index
>=
_viewModel
.
newsList
.
length
&&
_viewModel
.
newsList
.
isNotEmpty
)
{
WidgetsBinding
.
instance
.
addPostFrameCallback
((
_
)
{
if
(!
_viewModel
.
isLoading
.
value
)
{
_viewModel
.
getNewsList
(
isRefresh:
false
);
}
});
return
const
Center
(
child:
Padding
(
padding:
EdgeInsets
.
all
(
16
),
child:
CircularProgressIndicator
()),
child:
Padding
(
padding:
EdgeInsets
.
all
(
16
),
child:
CircularProgressIndicator
(),
),
);
}
final
news
=
_viewModel
.
newsList
.
value
[
index
];
...
...
lib/
screen
/news/news_list_viewmodel.dart
→
lib/
features
/news/news_list_viewmodel.dart
View file @
6b980613
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/network
ing
/api/website_api.dart'
deferred
as
website_api
;
import
'../../network
ing
/restful_api_viewmodel.dart'
;
import
'package:mypoint_flutter_app/
core/
network/api/website_api.dart'
deferred
as
website_api
;
import
'../../
core/
network/restful_api_viewmodel.dart'
;
import
'../faqs/faqs_model.dart'
;
class
NewsListViewModel
extends
RestfulApiViewModel
{
String
folderUri
;
final
RxList
<
PageItemModel
>
newsList
=
<
PageItemModel
>[].
obs
;
final
RxBool
isLoading
=
false
.
obs
;
var
_canLoadMore
=
true
;
int
limit
=
20
;
final
int
_limit
=
20
;
bool
_websiteApiLoaded
=
false
;
bool
get
canLoadMore
=>
_canLoadMore
;
NewsListViewModel
({
this
.
folderUri
=
"TIN-TUC"
});
Future
<
void
>
_ensureWebsiteApiLoaded
()
async
{
if
(
_websiteApiLoaded
)
return
;
...
...
@@ -18,19 +19,10 @@ class NewsListViewModel extends RestfulApiViewModel {
_websiteApiLoaded
=
true
;
}
NewsListViewModel
({
this
.
folderUri
=
"TIN-TUC"
});
@override
onInit
()
{
super
.
onInit
();
getNewsList
();
}
Future
<
void
>
getNewsList
({
bool
isRefresh
=
false
})
async
{
if
(
is
Loading
.
value
)
return
;
if
(
is
Refresh
)
_canLoadMore
=
true
;
if
(!
isRefresh
&&
!
_canLoadMore
)
return
;
isLoading
(
true
);
final
body
=
{
"folder_uri"
:
folderUri
,
"start"
:
isRefresh
?
0
:
newsList
.
length
,
"limit"
:
limit
};
final
body
=
{
"folder_uri"
:
folderUri
,
"start"
:
isRefresh
?
0
:
newsList
.
length
,
"limit"
:
_limit
};
await
callApi
<
FAQItemModelResponse
>(
request:
()
async
{
await
_ensureWebsiteApiLoaded
();
...
...
@@ -38,16 +30,13 @@ class NewsListViewModel extends RestfulApiViewModel {
return
api
.
websiteFolderGetPageList
(
body
);
},
onSuccess:
(
data
,
_
)
{
_canLoadMore
=
(
data
.
items
?.
length
??
0
)
==
limit
;
_canLoadMore
=
(
data
.
items
?.
length
??
0
)
==
_
limit
;
if
(
isRefresh
)
{
newsList
.
clear
();
}
newsList
.
addAll
(
data
.
items
??
[]);
},
withLoading:
false
,
onComplete:
()
{
isLoading
(
false
);
},
withLoading:
isRefresh
,
);
}
}
\ No newline at end of file
}
lib/
screen
/notification/models/category_notify_item_model.dart
→
lib/
features
/notification/models/category_notify_item_model.dart
View file @
6b980613
File moved
lib/
screen
/notification/models/category_notify_item_model.g.dart
→
lib/
features
/notification/models/category_notify_item_model.g.dart
View file @
6b980613
File moved
lib/
screen
/notification/models/notification_detail_model.dart
→
lib/
features
/notification/models/notification_detail_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'package:mypoint_flutter_app/directional/directional_screen.dart'
;
import
'../../../model/auth/working_site_model.dart'
;
import
'package:mypoint_flutter_app/shared/navigation/directional_screen.dart'
;
import
'../../personal/model/working_site_model.dart'
;
part
'notification_detail_model.g.dart'
;
@JsonSerializable
()
...
...
lib/
screen
/notification/models/notification_detail_model.g.dart
→
lib/
features
/notification/models/notification_detail_model.g.dart
View file @
6b980613
File moved
lib/
screen
/notification/models/notification_item_model.dart
→
lib/
features
/notification/models/notification_item_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'../../../directional/directional_screen.dart'
;
import
'../../../shared/navigation/directional_screen.dart'
;
part
'notification_item_model.g.dart'
;
@JsonSerializable
()
...
...
lib/
screen
/notification/models/notification_item_model.g.dart
→
lib/
features
/notification/models/notification_item_model.g.dart
View file @
6b980613
File moved
Prev
1
…
10
11
12
13
14
15
16
17
18
…
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