app_environment_config.dart 1.77 KB
import 'package:get/get.dart';

import '../constants/app_const.dart';
import '../constants/storage_const.dart';
import '../../data/local/local_storage.dart';
import 'app_environment.dart';

/// Resolves API base URL and third-party keys by environment.
class AppEnvironmentConfig {
  AppEnvironmentConfig(this._storage);

  final LocalStorage _storage;

  final Rx<AppEnvironment> environment = AppEnvironment.release.obs;

  Future<AppEnvironmentConfig> init() async {
    environment.value = await _storage.readEnvironment();
    return this;
  }

  Future<void> setEnvironment(AppEnvironment value) async {
    environment.value = value;
    await _storage.writeEnvironment(value);
  }

  String get serverBaseUrl => resolveServerUrl(AppConst.serverBaseUrl);

  String resolveServerUrl(String url) {
    return resolveServerUrlFor(environment.value, url);
  }

  String resolveServerUrlFor(AppEnvironment targetEnvironment, String url) {
    try {
      final uri = Uri.parse(url);
      final host = uri.host;
      final resolvedHost = switch (targetEnvironment) {
        AppEnvironment.xlab => '${AppConst.prefixXlabServerHost}-$host',
        AppEnvironment.dev => '${AppConst.prefixDevServerHost}-$host',
        AppEnvironment.release => host,
      };
      if (resolvedHost == host) {
        return url;
      }
      return uri.replace(host: resolvedHost).toString();
    } catch (_) {
      return url;
    }
  }

  String get rongCloudAppKey => environment.value == AppEnvironment.dev
      ? AppConst.appKeyRongCloudDev
      : AppConst.appKeyRongCloudProduct;

  String get thinkingDataAppId => environment.value == AppEnvironment.dev
      ? AppConst.appIdThinkingDataDebug
      : AppConst.appIdThinkingDataRelease;

  static const environmentPrefsName = StorageConst.appEnvironmentPrefsName;
}