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
3a2a0642
Commit
3a2a0642
authored
Nov 06, 2025
by
DatHV
Browse files
update scripts
parent
a6797435
Changes
11
Show whitespace changes
Inline
Side-by-side
assets/config/env.json
View file @
3a2a0642
{
"flavor"
:
"
pro
"
,
"baseUrl"
:
"https://api.mypoint.com.vn/8854/gup2start/rest"
,
"t3Token"
:
"runner-env-
t3Token-pro
"
,
"enableLogging"
:
fals
e
"flavor"
:
"
dev
"
,
"baseUrl"
:
"https://api.
sandbox.
mypoint.com.vn/8854/gup2start/rest"
,
"t3Token"
:
"runner-env-
flavor-dev
"
,
"enableLogging"
:
tru
e
}
export_dev.sh
View file @
3a2a0642
...
...
@@ -5,8 +5,7 @@
set
-euo
pipefail
SCRIPT_DIR
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
${
SCRIPT_DIR
}
/.."
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
TIMESTAMP
=
"
$(
date
+%Y%m%d_%H%M%S
)
"
OUT_DIR
=
"web_dev_export_
${
TIMESTAMP
}
"
ZIP_FILE
=
"
${
OUT_DIR
}
.zip"
...
...
@@ -15,14 +14,15 @@ cd "${PROJECT_ROOT}"
set_env_dev
()
{
echo
"🔧 Switching to DEVELOPMENT environment..."
local
src
=
"assets/config/env_dev.json"
local
src
=
"
${
PROJECT_ROOT
}
/assets/config/env_dev.json"
local
dest
=
"
${
PROJECT_ROOT
}
/assets/config/env.json"
if
[
!
-f
"
${
src
}
"
]
;
then
echo
"❌
${
src
}
not found"
>
&2
exit
1
fi
cp
"
${
src
}
"
assets/config/env.json
cp
"
${
src
}
"
"
${
dest
}
"
echo
"📋 Current config:"
cat
assets/config/env.json
cat
"
${
dest
}
"
}
copy_x_app_sdk
()
{
...
...
@@ -61,11 +61,9 @@ rm -rf .dart_tool build || true
echo
"📦 Getting Flutter packages..."
flutter pub get
echo
"🔨 Flutter build web (release, CanvasKit
, no source maps
)..."
echo
"🔨 Flutter build web (release, CanvasKit)..."
flutter build web
\
--release
\
--no-source-maps
\
--pwa-strategy
=
none
\
--dart-define
=
FLUTTER_WEB_USE_SKIA
=
true
\
--dart-define
=
FLUTTER_WEB_USE_SKWASM
=
false
\
--no-wasm-dry-run
...
...
export_prod.sh
View file @
3a2a0642
...
...
@@ -4,8 +4,7 @@
set
-euo
pipefail
SCRIPT_DIR
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
${
SCRIPT_DIR
}
/.."
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
TIMESTAMP
=
"
$(
date
+%Y%m%d_%H%M%S
)
"
OUT_DIR
=
"web_prod_export_
${
TIMESTAMP
}
"
ZIP_FILE
=
"
${
OUT_DIR
}
.zip"
...
...
ios/.env_scheme
View file @
3a2a0642
pro
stg
lib/base/app_navigator.dart
View file @
3a2a0642
...
...
@@ -9,7 +9,6 @@ import '../shared/router_gage.dart';
import
'../widgets/alert/custom_alert_dialog.dart'
;
import
'../widgets/alert/data_alert_model.dart'
;
import
'../widgets/alert/popup_data_model.dart'
;
import
'package:mypoint_flutter_app/web/web_helper.dart'
;
class
AppNavigator
{
static
final
GlobalKey
<
NavigatorState
>
key
=
GlobalKey
<
NavigatorState
>();
...
...
@@ -40,13 +39,14 @@ class AppNavigator {
final
fallbackMessage
=
message
.
isNotEmpty
?
message
:
description
;
if
(
kIsWeb
)
{
await
DataPreference
.
instance
.
clearData
();
final
closed
=
await
webCloseApp
({
'message'
:
fallbackMessage
,
'timestamp'
:
DateTime
.
now
().
millisecondsSinceEpoch
,
});
if
(!
closed
)
{
Get
.
offAllNamed
(
onboardingScreen
);
}
// final closed = await webCloseApp({
// 'message': fallbackMessage,
// 'timestamp': DateTime.now().millisecondsSinceEpoch,
// });
// if (!closed) {
// Get.offAllNamed(onboardingScreen);
// }
return
;
}
final
phone
=
DataPreference
.
instance
.
phoneNumberUsedForLoginScreen
;
...
...
lib/screen/onboarding/onboarding_screen.dart
View file @
3a2a0642
import
'package:flutter/foundation.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
import
'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'
;
...
...
@@ -35,6 +36,7 @@ class _OnboardingScreenState extends BaseState<OnboardingScreen> with BasicState
@override
Widget
createBody
()
{
final
placeholderAsset
=
kIsWeb
?
'assets/images/splash_screen.png'
:
'assets/images/bg_onboarding.png'
;
return
GestureDetector
(
onTap:
hideKeyboard
,
child:
Scaffold
(
...
...
@@ -46,7 +48,7 @@ class _OnboardingScreenState extends BaseState<OnboardingScreen> with BasicState
child:
loadNetworkImage
(
url:
_viewModel
.
url
,
fit:
BoxFit
.
cover
,
placeholderAsset:
"assets/images/bg_onboarding.png"
,
placeholderAsset:
placeholderAsset
,
),
// _viewModel.url.isNotEmpty
// ? Image.network(_viewModel.url, fit: BoxFit.cover)
...
...
lib/screen/personal/personal_screen.dart
View file @
3a2a0642
...
...
@@ -342,13 +342,14 @@ class _PersonalScreenState extends BaseState<PersonalScreen> with BasicState, Po
if
(
kIsWeb
)
{
await
DataPreference
.
instance
.
clearData
();
final
closed
=
await
webCloseApp
({
'message'
:
'User logged out successfully'
,
'timestamp'
:
DateTime
.
now
().
millisecondsSinceEpoch
,
});
if
(!
closed
)
{
Get
.
offAllNamed
(
onboardingScreen
);
}
// final closed = await webCloseApp({
// 'message': 'User logged out successfully',
// 'timestamp': DateTime.now().millisecondsSinceEpoch,
// });
// if (!closed) {
// Get.offAllNamed(onboardingScreen);
// }
return
;
}
...
...
lib/screen/splash/splash_screen_viewmodel.dart
View file @
3a2a0642
...
...
@@ -103,14 +103,14 @@ class SplashScreenViewModel extends RestfulApiViewModel {
Future
<
void
>
directionWhenTokenInvalid
()
async
{
if
(
Get
.
currentRoute
==
onboardingScreen
)
return
;
if
(
kIsWeb
)
{
print
(
'❌ No token found on web, closing app'
);
final
closeSuccess
=
await
webCloseApp
({
'message'
:
'No token found, cannot proceed'
,
'timestamp'
:
DateTime
.
now
().
millisecondsSinceEpoch
,
});
if
(
closeSuccess
)
return
;
}
//
if (kIsWeb) {
//
print('❌ No token found on web, closing app');
//
final closeSuccess = await webCloseApp({
//
'message': 'No token found, cannot proceed',
//
'timestamp': DateTime.now().millisecondsSinceEpoch,
//
});
//
if (closeSuccess) return;
//
}
final
phone
=
DataPreference
.
instance
.
phoneNumberUsedForLoginScreen
;
final
displayName
=
DataPreference
.
instance
.
displayName
;
if
(
phone
.
isEmpty
)
{
...
...
run_dev.sh
View file @
3a2a0642
...
...
@@ -5,8 +5,7 @@
set
-euo
pipefail
SCRIPT_DIR
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
${
SCRIPT_DIR
}
/.."
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PORT
=
"
${
PORT
:-
8080
}
"
BROWSER_PROFILE
=
"
${
BROWSER_PROFILE
:-
/tmp/mypoint_web_dev
}
"
...
...
@@ -22,11 +21,13 @@ set_env() {
case
"
${
env
}
"
in
dev
)
echo
"🔧 Switching to DEVELOPMENT environment..."
if
[
!
-f
assets/config/env_dev.json
]
;
then
echo
"❌ assets/config/env_dev.json not found"
>
&2
local
src
=
"
${
PROJECT_ROOT
}
/assets/config/env_dev.json"
local
dest
=
"
${
PROJECT_ROOT
}
/assets/config/env.json"
if
[
!
-f
"
${
src
}
"
]
;
then
echo
"❌
${
src
}
not found"
>
&2
exit
1
fi
cp
assets/config/env_dev.json assets/config/env.json
cp
"
${
src
}
"
"
${
dest
}
"
;;
prod
)
echo
"🚀 Switching to PRODUCTION environment..."
...
...
run_prod.sh
View file @
3a2a0642
...
...
@@ -5,8 +5,7 @@
set
-euo
pipefail
SCRIPT_DIR
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
${
SCRIPT_DIR
}
/.."
&&
pwd
)
"
PROJECT_ROOT
=
"
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
"
PORT
=
"
${
PORT
:-
8080
}
"
cd
"
${
PROJECT_ROOT
}
"
...
...
@@ -17,7 +16,7 @@ kill_port() {
}
set_env_prod
()
{
cat
>
assets/config/env.json
<<
'
EOF
'
cat
>
"
${
PROJECT_ROOT
}
/
assets/config/env.json
"
<<
'
EOF
'
{
"flavor":"pro",
"baseUrl":"https://api.mypoint.com.vn/8854/gup2start/rest",
...
...
@@ -25,7 +24,7 @@ set_env_prod() {
"enableLogging":false
}
EOF
echo
"📋 Current production config written to assets/config/env.json"
echo
"📋 Current production config written to
${
PROJECT_ROOT
}
/
assets/config/env.json"
}
copy_x_app_sdk
()
{
...
...
web/index.html
View file @
3a2a0642
...
...
@@ -29,6 +29,74 @@
<!-- Favicon -->
<link
rel=
"icon"
type=
"image/png"
href=
"favicon.png"
/>
<script>
window
.
flutterConfiguration
=
window
.
flutterConfiguration
||
{};
window
.
flutterConfiguration
.
loadingElementId
=
'
app-loader
'
;
</script>
<style>
:root
{
color-scheme
:
light
;
}
#app-loader
{
position
:
fixed
;
inset
:
0
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
flex-direction
:
column
;
background
:
#ffffff
url('assets/assets/images/splash_screen.png')
center
/
cover
no-repeat
;
z-index
:
9999
;
transition
:
opacity
0.3s
ease
,
visibility
0.3s
ease
;
overflow
:
hidden
;
}
#app-loader
::before
{
content
:
''
;
position
:
absolute
;
inset
:
0
;
background
:
linear-gradient
(
180deg
,
rgba
(
255
,
255
,
255
,
0.08
),
rgba
(
244
,
246
,
255
,
0.12
));
backdrop-filter
:
blur
(
0.5px
);
transition
:
opacity
0.3s
ease
;
}
#app-loader
.app-loader--hidden
{
opacity
:
0
;
visibility
:
hidden
;
pointer-events
:
none
;
}
.app-loader__spinner
{
width
:
56px
;
height
:
56px
;
border
:
6px
solid
rgba
(
0
,
0
,
0
,
0.1
);
border-top-color
:
#2f80ed
;
border-radius
:
50%
;
animation
:
app-loader-spin
1s
linear
infinite
;
position
:
relative
;
z-index
:
1
;
}
.app-loader__text
{
margin-top
:
20px
;
font-family
:
'Helvetica Neue'
,
Arial
,
sans-serif
;
font-size
:
15px
;
color
:
#3b4a6b
;
letter-spacing
:
0.2px
;
text-align
:
center
;
max-width
:
240px
;
position
:
relative
;
z-index
:
1
;
}
@keyframes
app-loader-spin
{
to
{
transform
:
rotate
(
360deg
);
}
}
</style>
<!-- x-app-sdk integration -->
<script
type=
"module"
>
import
{
bootstrapXAppSdk
}
from
'
./js/x_app_sdk_loader.js
'
;
...
...
@@ -241,6 +309,34 @@
</script>
</head>
<body>
<div
id=
"app-loader"
role=
"status"
aria-live=
"polite"
aria-label=
"Đang khởi động ứng dụng"
>
<div
class=
"app-loader__spinner"
></div>
<div
class=
"app-loader__text"
>
Đang khởi động MyPoint...
</div>
</div>
<script
src=
"flutter_bootstrap.js"
async
></script>
<script>
(
function
()
{
var
loader
=
document
.
getElementById
(
'
app-loader
'
);
if
(
!
loader
)
return
;
function
hideLoader
()
{
if
(
!
loader
)
return
;
loader
.
classList
.
add
(
'
app-loader--hidden
'
);
setTimeout
(
function
()
{
if
(
loader
&&
loader
.
parentNode
)
{
loader
.
parentNode
.
removeChild
(
loader
);
loader
=
null
;
}
},
350
);
}
window
.
addEventListener
(
'
flutter-first-frame
'
,
hideLoader
);
// Fallback: ensure loader disappears even if event never fires
window
.
addEventListener
(
'
load
'
,
function
()
{
setTimeout
(
hideLoader
,
4000
);
});
})();
</script>
</body>
</html>
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