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
/campaign7day/custom_widgets/campaign_7day_special_misssion_card.dart
→
lib/
features
/campaign7day/custom_widgets/campaign_7day_special_misssion_card.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/custom_widgets/campaign_7day_top_buttons.dart
→
lib/
features
/campaign7day/custom_widgets/campaign_7day_top_buttons.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/models/campaign_7day_config_model.dart
→
lib/
features
/campaign7day/models/campaign_7day_config_model.dart
View file @
6b980613
import
'dart:ui'
;
import
'dart:ui'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'../../../
resources
/base_color.dart'
;
import
'../../../
core/theme
/base_color.dart'
;
part
'campaign_7day_config_model.g.dart'
;
part
'campaign_7day_config_model.g.dart'
;
@JsonSerializable
()
@JsonSerializable
()
...
...
lib/
screen
/campaign7day/models/campaign_7day_config_model.g.dart
→
lib/
features
/campaign7day/models/campaign_7day_config_model.g.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/models/campaign_7day_info_model.dart
→
lib/
features
/campaign7day/models/campaign_7day_info_model.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/models/campaign_7day_info_model.g.dart
→
lib/
features
/campaign7day/models/campaign_7day_info_model.g.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/models/campaign_7day_mission_model.dart
→
lib/
features
/campaign7day/models/campaign_7day_mission_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'../../../
direc
tion
al
/directional_screen.dart'
;
import
'../../../
shared/naviga
tion/directional_screen.dart'
;
import
'../../../widgets/alert/popup_data_model.dart'
;
import
'../../../
shared/
widgets/alert/popup_data_model.dart'
;
import
'campaign_7day_config_model.dart'
;
import
'campaign_7day_config_model.dart'
;
import
'campaign_7day_reward_model.dart'
;
import
'campaign_7day_reward_model.dart'
;
...
...
lib/
screen
/campaign7day/models/campaign_7day_mission_model.g.dart
→
lib/
features
/campaign7day/models/campaign_7day_mission_model.g.dart
View file @
6b980613
File moved
lib/
screen
/campaign7day/models/campaign_7day_reward_model.dart
→
lib/
features
/campaign7day/models/campaign_7day_reward_model.dart
View file @
6b980613
import
'package:json_annotation/json_annotation.dart'
;
import
'package:json_annotation/json_annotation.dart'
;
import
'../../../
direc
tion
al
/directional_screen.dart'
;
import
'../../../
shared/naviga
tion/directional_screen.dart'
;
import
'campaign_7day_config_model.dart'
;
import
'campaign_7day_config_model.dart'
;
part
'campaign_7day_reward_model.g.dart'
;
part
'campaign_7day_reward_model.g.dart'
;
...
...
lib/
screen
/campaign7day/models/campaign_7day_reward_model.g.dart
→
lib/
features
/campaign7day/models/campaign_7day_reward_model.g.dart
View file @
6b980613
File moved
lib/
screen
/change_pass/change_pass_screen.dart
→
lib/
features
/change_pass/change_pass_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/alert/data_alert_model.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/alert/data_alert_model.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
'../../preference/data_preference.dart'
;
import
'../../
shared/
preference
s
/data_preference.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../../widgets/back_button.dart'
;
import
'../../
shared/
widgets/back_button.dart'
;
import
'../../widgets/support_button.dart'
;
import
'../../
shared/
widgets/support_button.dart'
;
import
'../login/login_viewmodel.dart'
;
import
'../login/login_viewmodel.dart'
;
import
'change_pass_viewmodel.dart'
;
import
'change_pass_viewmodel.dart'
;
...
...
lib/
screen
/change_pass/change_pass_viewmodel.dart
→
lib/
features
/change_pass/change_pass_viewmodel.dart
View file @
6b980613
import
'package:get/get.dart'
;
import
'package:get/get.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
'../../
base
/base_response_model.dart'
;
import
'../../
shared/widgets/base_view
/base_response_model.dart'
;
import
'../../network
ing
/restful_api_viewmodel.dart'
;
import
'../../
core/
network/restful_api_viewmodel.dart'
;
import
'../../config
s
/constants.dart'
;
import
'../../
app/
config/constants.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../
shared/
preference
s
/data_preference.dart'
;
import
'../create_pass/change_pass_repository.dart'
;
import
'../create_pass/change_pass_repository.dart'
;
import
'../create_pass/create_pass_screen.dart'
;
import
'../create_pass/create_pass_screen.dart'
;
import
'../login/login_viewmodel.dart'
;
import
'../login/login_viewmodel.dart'
;
import
'../otp/forgot_pass_otp_repository.dart'
;
import
'../otp/model/create_otp_response_model.dart'
;
import
'../otp/otp_screen.dart'
;
class
ChangePassViewModel
extends
RestfulApiViewModel
{
class
ChangePassViewModel
extends
RestfulApiViewModel
{
final
RxBool
isPasswordVisible
=
false
.
obs
;
final
RxBool
isPasswordVisible
=
false
.
obs
;
...
...
lib/
screen
/contacts/contacts_list_screen.dart
→
lib/
features
/contacts/contacts_list_screen.dart
View file @
6b980613
import
'package:flutter/foundation.dart'
;
import
'package:flutter_contacts/flutter_contacts.dart'
;
import
'package:flutter_contacts/flutter_contacts.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:get/get.dart'
;
import
'package:get/get.dart'
;
import
'package:url_launcher/url_launcher.dart'
;
import
'package:url_launcher/url_launcher.dart'
;
import
'../../
..
/widgets/custom_empty_widget.dart'
;
import
'../../
shared
/widgets/custom_empty_widget.dart'
;
import
'../../
..
/widgets/custom_search_navigation_bar.dart'
;
import
'../../
shared
/widgets/custom_search_navigation_bar.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'../invite_friend_campaign/invite_friend_campaign_viewmodel.dart'
;
import
'../invite_friend_campaign/invite_friend_campaign_viewmodel.dart'
;
class
ContactsListScreen
extends
StatefulWidget
{
class
ContactsListScreen
extends
StatefulWidget
{
...
@@ -54,9 +53,8 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
...
@@ -54,9 +53,8 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
if
(
query
.
isEmpty
)
return
contacts
;
if
(
query
.
isEmpty
)
return
contacts
;
final
isNumber
=
RegExp
(
r'^\d+$'
).
hasMatch
(
query
);
final
isNumber
=
RegExp
(
r'^\d+$'
).
hasMatch
(
query
);
return
contacts
.
where
((
contact
)
{
return
contacts
.
where
((
contact
)
{
final
name
=
contact
.
displayName
?.
toLowerCase
()
??
''
;
final
name
=
contact
.
displayName
.
toLowerCase
();
final
phone
=
final
phone
=
contact
.
phones
.
firstOrNull
?.
number
.
replaceAll
(
RegExp
(
r'\D'
),
''
)
??
''
;
contact
.
phones
?.
isNotEmpty
==
true
?
contact
.
phones
!.
first
.
number
?.
replaceAll
(
RegExp
(
r'\D'
),
''
)
??
''
:
''
;
if
(
isNumber
)
{
if
(
isNumber
)
{
return
phone
.
contains
(
query
);
return
phone
.
contains
(
query
);
}
else
{
}
else
{
...
@@ -71,7 +69,7 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
...
@@ -71,7 +69,7 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
appBar:
CustomSearchNavigationBar
(
onSearchChanged:
_onSearchChanged
),
appBar:
CustomSearchNavigationBar
(
onSearchChanged:
_onSearchChanged
),
body:
body:
displayContacts
.
isEmpty
displayContacts
.
isEmpty
?
EmptyWidget
(
size:
Size
(
240
,
240
)
)
?
EmptyWidget
(
isLoading:
viewModel
.
isLoading
.
value
,
)
:
ListView
.
builder
(
:
ListView
.
builder
(
physics:
const
AlwaysScrollableScrollPhysics
(),
physics:
const
AlwaysScrollableScrollPhysics
(),
itemCount:
displayContacts
.
length
,
itemCount:
displayContacts
.
length
,
...
@@ -98,7 +96,7 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
...
@@ -98,7 +96,7 @@ class _ContactsListScreenState extends State<ContactsListScreen> {
Widget
_buildContactCard
(
Contact
contact
)
{
Widget
_buildContactCard
(
Contact
contact
)
{
final
name
=
contact
.
displayName
;
final
name
=
contact
.
displayName
;
final
phone
=
contact
.
phones
?.
isNotEmpty
==
true
?
contact
.
phones
?.
first
.
number
??
'Không số'
:
'Không số'
;
final
phone
=
contact
.
phones
.
firstOrNull
?.
number
??
'Không số'
;
return
ListTile
(
return
ListTile
(
leading:
CircleAvatar
(
leading:
CircleAvatar
(
backgroundImage:
const
AssetImage
(
'assets/images/ic_pipi_02.png'
),
backgroundImage:
const
AssetImage
(
'assets/images/ic_pipi_02.png'
),
...
...
lib/
screen
/contacts/contacts_picker.dart
→
lib/
features
/contacts/contacts_picker.dart
View file @
6b980613
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_contacts/flutter_contacts.dart'
;
import
'package:flutter_contacts/flutter_contacts.dart'
;
import
'package:mypoint_flutter_app/
resources
/base_color.dart'
;
import
'package:mypoint_flutter_app/
core/theme
/base_color.dart'
;
/// Mở bottom sheet hiển thị danh sách danh bạ để chọn
/// Mở bottom sheet hiển thị danh sách danh bạ để chọn
Future
<
Contact
?>
showContactPicker
(
BuildContext
context
)
async
{
Future
<
Contact
?>
showContactPicker
(
BuildContext
context
)
async
{
...
@@ -110,7 +110,7 @@ class _ContactPickerSheetState extends State<_ContactPickerSheet> {
...
@@ -110,7 +110,7 @@ class _ContactPickerSheetState extends State<_ContactPickerSheet> {
Expanded
(
Expanded
(
child:
ListView
.
separated
(
child:
ListView
.
separated
(
itemCount:
_filtered
.
length
,
itemCount:
_filtered
.
length
,
separatorBuilder:
(
_
,
_
_
)
=>
const
Divider
(
height:
1
),
separatorBuilder:
(
_
,
_
)
=>
const
Divider
(
height:
1
),
itemBuilder:
(
context
,
index
)
{
itemBuilder:
(
context
,
index
)
{
final
c
=
_filtered
[
index
];
final
c
=
_filtered
[
index
];
final
subtitle
=
c
.
phones
.
isNotEmpty
?
c
.
phones
.
first
.
number
:
'Không có số'
;
final
subtitle
=
c
.
phones
.
isNotEmpty
?
c
.
phones
.
first
.
number
:
'Không có số'
;
...
...
lib/
screen
/create_pass/change_pass_repository.dart
→
lib/
features
/create_pass/change_pass_repository.dart
View file @
6b980613
import
'package:get/get.dart'
;
import
'package:get/get.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
'package:mypoint_flutter_app/screen/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/features/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/widgets/custom_toast_message.dart'
;
import
'package:mypoint_flutter_app/shared/widgets/custom_toast_message.dart'
;
import
'../../base/base_response_model.dart'
;
import
'../../shared/widgets/base_view/base_response_model.dart'
;
import
'../../networking/restful_api_viewmodel.dart'
;
import
'../../core/network/restful_api_viewmodel.dart'
;
import
'../login/login_screen.dart'
;
import
'../main_tab_screen/main_tab_screen.dart'
;
import
'../main_tab_screen/main_tab_screen.dart'
;
import
'../splash/splash_screen_viewmodel.dart'
;
class
ChangePasswordRepository
extends
RestfulApiViewModel
implements
ICreatePasswordRepository
{
class
ChangePasswordRepository
extends
RestfulApiViewModel
implements
ICreatePasswordRepository
{
@override
@override
...
...
lib/
screen
/create_pass/create_pass_screen.dart
→
lib/
features
/create_pass/create_pass_screen.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/
screen
/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/
features
/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/widgets/back_button.dart'
;
import
'package:mypoint_flutter_app/
shared/
widgets/back_button.dart'
;
import
'../../
resources
/base_color.dart'
;
import
'../../
core/theme
/base_color.dart'
;
import
'create_pass_viewmodel.dart'
;
import
'create_pass_viewmodel.dart'
;
class
CreatePasswordScreen
extends
StatelessWidget
{
class
CreatePasswordScreen
extends
StatelessWidget
{
...
...
lib/
screen
/create_pass/create_pass_viewmodel.dart
→
lib/
features
/create_pass/create_pass_viewmodel.dart
View file @
6b980613
import
'package:get/get.dart'
;
import
'package:get/get.dart'
;
import
'package:mypoint_flutter_app/
screen
/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/
features
/create_pass/signup_create_password_repository.dart'
;
class
CreatePasswordViewModel
extends
GetxController
{
class
CreatePasswordViewModel
extends
GetxController
{
final
ICreatePasswordRepository
repository
;
final
ICreatePasswordRepository
repository
;
...
...
lib/
screen
/create_pass/reset_create_password_repository.dart
→
lib/
features
/create_pass/reset_create_password_repository.dart
View file @
6b980613
import
'package:get/get.dart'
;
import
'package:get/get.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
'package:mypoint_flutter_app/
screen
/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/
features
/create_pass/signup_create_password_repository.dart'
;
import
'package:mypoint_flutter_app/shared/router_gage.dart'
;
import
'package:mypoint_flutter_app/shared/router_gage.dart'
;
import
'
../../base/base_response_model
.dart'
;
import
'
package:mypoint_flutter_app/shared/widgets/custom_toast_message
.dart'
;
import
'../../
networking/restful_api_view
model.dart'
;
import
'../../
shared/widgets/base_view/base_response_
model.dart'
;
import
'../
splash/splash_screen
_viewmodel.dart'
;
import
'../
../core/network/restful_api
_viewmodel.dart'
;
class
ResetCreatePasswordRepository
extends
RestfulApiViewModel
implements
ICreatePasswordRepository
{
class
ResetCreatePasswordRepository
extends
RestfulApiViewModel
implements
ICreatePasswordRepository
{
@override
@override
...
@@ -18,7 +18,8 @@ class ResetCreatePasswordRepository extends RestfulApiViewModel implements ICrea
...
@@ -18,7 +18,8 @@ class ResetCreatePasswordRepository extends RestfulApiViewModel implements ICrea
return
client
.
accountPasswordReset
(
phoneNumber
,
password
).
then
((
value
)
{
return
client
.
accountPasswordReset
(
phoneNumber
,
password
).
then
((
value
)
{
hideLoading
();
hideLoading
();
if
(
value
.
status
==
"success"
||
value
.
code
==
200
)
{
if
(
value
.
status
==
"success"
||
value
.
code
==
200
)
{
Get
.
offNamed
(
loginScreen
,
arguments:
{
'phone'
:
phoneNumber
});
Get
.
offNamed
(
loginScreen
,
arguments:
{
'phone'
:
phoneNumber
,
'password'
:
password
});
showToastMessage
(
"Đặt lại mật khẩu thành công."
);
}
}
return
value
;
return
value
;
});
});
...
...
lib/
screen
/create_pass/signup_create_password_repository.dart
→
lib/
features
/create_pass/signup_create_password_repository.dart
View file @
6b980613
...
@@ -2,16 +2,14 @@ import 'dart:async';
...
@@ -2,16 +2,14 @@ import 'dart:async';
import
'package:flutter/foundation.dart'
;
import
'package:flutter/foundation.dart'
;
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/network
ing
/restful_api_client_all_request.dart'
;
import
'package:mypoint_flutter_app/
core/
network/restful_api_client_all_request.dart'
;
import
'../../
base
/base_response_model.dart'
;
import
'../../
shared/widgets/base_view
/base_response_model.dart'
;
import
'../../
networking/restful_api_viewmodel
.dart'
;
import
'../../
core/firebase/push_token_service
.dart'
;
import
'../../
firebase/push_token_service
.dart'
;
import
'../../
core/network/restful_api_viewmodel
.dart'
;
import
'../../
permission
/biometric_manager.dart'
;
import
'../../
core/services
/biometric_manager.dart'
;
import
'../../preference/data_preference.dart'
;
import
'../../
shared/
preference
s
/data_preference.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../../shared/router_gage.dart'
;
import
'../biometric/biometric_screen.dart'
;
import
'../biometric/biometric_screen.dart'
;
import
'../main_tab_screen/main_tab_screen.dart'
;
import
'../splash/splash_screen_viewmodel.dart'
;
abstract
class
ICreatePasswordRepository
{
abstract
class
ICreatePasswordRepository
{
late
String
phoneNumber
;
late
String
phoneNumber
;
...
...
lib/
screen
/daily_checkin/daily_checkin_models.dart
→
lib/
features
/daily_checkin/daily_checkin_models.dart
View file @
6b980613
import
'package:mypoint_flutter_app/
screen
/quiz_campaign/quiz_campaign_screen.dart'
;
import
'package:mypoint_flutter_app/
features
/quiz_campaign/quiz_campaign_screen.dart'
;
import
'../mobile_card/models/mobile_service_redeem_data.dart'
;
import
'../mobile_card/models/mobile_service_redeem_data.dart'
;
class
CheckInDataModel
{
class
CheckInDataModel
{
...
...
Prev
1
…
3
4
5
6
7
8
9
10
11
…
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