You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_Patient_App/lib/dev_tools/environment_config.dart

169 lines
6.7 KiB
Dart

// filepath: lib/config/environment_config.dart
import 'package:hmg_patient_app/config/config.dart';
import 'package:hmg_patient_app/uitl/app_shared_preferences.dart';
// ─── Keys for SharedPreferences ───────────────────────────────────────────────
const ENV_BASE_URL_KEY = 'env_base_url';
const ENV_RC_BASE_URL_KEY = 'env_rc_base_url';
const ENV_PHARMACY_BASE_URL_KEY = 'env_pharmacy_base_url';
const ENV_EXA_CART_BASE_URL_KEY = 'env_exa_cart_base_url';
const ENV_PAYFORT_KEY = 'env_payfort';
// ─── Preset environments ───────────────────────────────────────────────────────
class AppEnvironmentPreset {
final String label;
final String baseUrl;
final String rcBaseUrl;
final String pharmacyBaseUrl;
final String exaCartBaseUrl;
final String payfortMode; // 'production' | 'sandbox'
const AppEnvironmentPreset({
required this.label,
required this.baseUrl,
required this.rcBaseUrl,
required this.pharmacyBaseUrl,
required this.exaCartBaseUrl,
required this.payfortMode,
});
}
const List<AppEnvironmentPreset> kEnvironmentPresets = [
AppEnvironmentPreset(
label: 'Production',
baseUrl: 'https://hmgwebservices.com/',
rcBaseUrl: 'https://rc.hmg.com/',
pharmacyBaseUrl: 'https://mdlaboratories.com/exacartapi/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'production',
),
AppEnvironmentPreset(
label: 'UAT',
baseUrl: 'https://uat.hmgwebservices.com/',
rcBaseUrl: 'https://rc.hmg.com/test/',
pharmacyBaseUrl: 'https://uat.hmgwebservices.com/epharmacy/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'sandbox',
),
AppEnvironmentPreset(
label: 'VidaPlus UAT',
baseUrl: 'https://vidauat.cloudsolutions.com.sa/',
rcBaseUrl: 'https://rc.hmg.com/',
pharmacyBaseUrl: 'https://mdlaboratories.com/exacartapitest/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'sandbox',
),
AppEnvironmentPreset(
label: 'VidaMerge UAT',
baseUrl: 'https://vidamergeuat.cloudsolutions.com.sa/',
rcBaseUrl: 'https://rc.hmg.com/',
pharmacyBaseUrl: 'https://mdlaboratories.com/exacartapitest/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'sandbox',
),
AppEnvironmentPreset(
label: 'Orash UAT',
baseUrl: 'https://orash.cloudsolutions.com.sa/',
rcBaseUrl: 'https://rc.hmg.com/',
pharmacyBaseUrl: 'https://mdlaboratories.com/exacartapi/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'sandbox',
),
AppEnvironmentPreset(
label: 'MS HMG RC',
baseUrl: 'https://hmgwebservices.com/',
rcBaseUrl: 'https://ms.hmg.com/rc/',
pharmacyBaseUrl: 'https://mdlaboratories.com/exacartapi/api/',
exaCartBaseUrl: 'https://mdlaboratories.com/offersdiscounts',
payfortMode: 'production',
),
];
// ─── Service ───────────────────────────────────────────────────────────────────
class EnvironmentConfigService {
static final EnvironmentConfigService instance = EnvironmentConfigService._internal();
EnvironmentConfigService._internal();
final AppSharedPreferences _prefs = AppSharedPreferences();
/// Apply stored environment or fall back to production defaults.
Future<void> applyStoredEnvironment() async {
final storedBase = await _prefs.getString(ENV_BASE_URL_KEY);
final storedRc = await _prefs.getString(ENV_RC_BASE_URL_KEY);
final storedPharmacy = await _prefs.getString(ENV_PHARMACY_BASE_URL_KEY);
final storedExaCart = await _prefs.getString(ENV_EXA_CART_BASE_URL_KEY);
if (storedBase != null && storedBase.isNotEmpty) BASE_URL = storedBase;
if (storedRc != null && storedRc.isNotEmpty) RC_BASE_URL = storedRc;
if (storedPharmacy != null && storedPharmacy.isNotEmpty) {
BASE_PHARMACY_URL = storedPharmacy;
PHARMACY_BASE_URL = storedPharmacy;
}
if (storedExaCart != null && storedExaCart.isNotEmpty) EXA_CART_API_BASE_URL = storedExaCart;
}
/// Save an environment preset and apply it immediately to the global config vars.
Future<void> applyPreset(AppEnvironmentPreset preset) async {
await _prefs.setString(ENV_BASE_URL_KEY, preset.baseUrl);
await _prefs.setString(ENV_RC_BASE_URL_KEY, preset.rcBaseUrl);
await _prefs.setString(ENV_PHARMACY_BASE_URL_KEY, preset.pharmacyBaseUrl);
await _prefs.setString(ENV_EXA_CART_BASE_URL_KEY, preset.exaCartBaseUrl);
await _prefs.setString(ENV_PAYFORT_KEY, preset.payfortMode);
BASE_URL = preset.baseUrl;
RC_BASE_URL = preset.rcBaseUrl;
BASE_PHARMACY_URL = preset.pharmacyBaseUrl;
PHARMACY_BASE_URL = preset.pharmacyBaseUrl;
EXA_CART_API_BASE_URL = preset.exaCartBaseUrl;
}
/// Clears all saved environment prefs so the app falls back to the
/// hardcoded production URLs defined in config.dart.
Future<void> resetToDefault() async {
await _prefs.remove(ENV_BASE_URL_KEY);
await _prefs.remove(ENV_RC_BASE_URL_KEY);
await _prefs.remove(ENV_PHARMACY_BASE_URL_KEY);
await _prefs.remove(ENV_EXA_CART_BASE_URL_KEY);
await _prefs.remove(ENV_PAYFORT_KEY);
// Reset runtime vars back to the values compiled in config.dart
BASE_URL = 'https://hmgwebservices.com/';
RC_BASE_URL = 'https://rc.hmg.com/';
BASE_PHARMACY_URL = 'https://mdlaboratories.com/exacartapi/api/';
PHARMACY_BASE_URL = 'https://mdlaboratories.com/exacartapi/api/';
EXA_CART_API_BASE_URL = 'https://mdlaboratories.com/offersdiscounts';
}
Future<String> getCurrentBaseUrl() async {
return (await _prefs.getString(ENV_BASE_URL_KEY)) ?? BASE_URL;
}
Future<String> getCurrentRcUrl() async {
return (await _prefs.getString(ENV_RC_BASE_URL_KEY)) ?? RC_BASE_URL;
}
Future<String> getCurrentPharmacyUrl() async {
return (await _prefs.getString(ENV_PHARMACY_BASE_URL_KEY)) ?? PHARMACY_BASE_URL;
}
Future<String> getCurrentExaCartUrl() async {
return (await _prefs.getString(ENV_EXA_CART_BASE_URL_KEY)) ?? EXA_CART_API_BASE_URL;
}
Future<String> getCurrentPayfortMode() async {
return (await _prefs.getString(ENV_PAYFORT_KEY)) ?? 'production';
}
/// Find preset whose baseUrl matches the currently saved one.
Future<AppEnvironmentPreset?> getCurrentPreset() async {
final storedBase = await getCurrentBaseUrl();
try {
return kEnvironmentPresets.firstWhere((p) => p.baseUrl == storedBase);
} catch (_) {
return null;
}
}
}