Commit 3a2a0642 authored by DatHV's avatar DatHV
Browse files

update scripts

parent a6797435
{
"flavor":"pro",
"baseUrl":"https://api.mypoint.com.vn/8854/gup2start/rest",
"t3Token":"runner-env-t3Token-pro",
"enableLogging":false
"flavor":"dev",
"baseUrl":"https://api.sandbox.mypoint.com.vn/8854/gup2start/rest",
"t3Token":"runner-env-flavor-dev",
"enableLogging":true
}
......@@ -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
......
......@@ -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"
......
......@@ -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;
......
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)
......
......@@ -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;
}
......
......@@ -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) {
......
......@@ -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..."
......
......@@ -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() {
......
......@@ -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>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment