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.
169 lines
6.7 KiB
Dart
169 lines
6.7 KiB
Dart
|
5 days ago
|
// 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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|