fluffychat/lib/pangea/common/config/environment.dart
ggurdin e8428783e6
Fluffychat merge 2 (#5590)
* build: Reenable shrink resources and minify in gradle

* build: (deps): bump image from 4.6.0 to 4.7.1

Bumps [image](https://github.com/brendan-duncan/image) from 4.6.0 to 4.7.1.
- [Changelog](https://github.com/brendan-duncan/image/blob/main/CHANGELOG.md)
- [Commits](https://github.com/brendan-duncan/image/commits)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 4.7.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* build: (deps): bump file_picker from 10.3.7 to 10.3.8

Bumps [file_picker](https://github.com/miguelpruivo/flutter_file_picker) from 10.3.7 to 10.3.8.
- [Release notes](https://github.com/miguelpruivo/flutter_file_picker/releases)
- [Changelog](https://github.com/miguelpruivo/flutter_file_picker/blob/master/CHANGELOG.md)
- [Commits](https://github.com/miguelpruivo/flutter_file_picker/compare/v10.3.7...v10.3.8)

---
updated-dependencies:
- dependency-name: file_picker
  dependency-version: 10.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* feat: Improved search

* build: Use matrix sdk vom pub.dev again

* chore: Follow up better search

* build: (deps): bump image from 4.7.1 to 4.7.2

Bumps [image](https://github.com/brendan-duncan/image) from 4.7.1 to 4.7.2.
- [Changelog](https://github.com/brendan-duncan/image/blob/main/CHANGELOG.md)
- [Commits](https://github.com/brendan-duncan/image/commits)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 4.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: Make cross signing self sign mandatory for bootstrap

* chore: Update user device keys before creating bootstrap

* fix: Better wait for secrets after verification bootstrap

* refactor: Remove native imaging and enable web worker

* refactor: Remove unused html onfocus streams

* build: (deps): bump flutter_foreground_task from 9.1.0 to 9.2.0

Bumps [flutter_foreground_task](https://github.com/Dev-hwang/flutter_foreground_task) from 9.1.0 to 9.2.0.
- [Changelog](https://github.com/Dev-hwang/flutter_foreground_task/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Dev-hwang/flutter_foreground_task/commits)

---
updated-dependencies:
- dependency-name: flutter_foreground_task
  dependency-version: 9.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (Uzbek)

Currently translated at 99.7% (823 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uz/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 99.8% (824 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.9% (750 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/

* chore(translations): Translated using Weblate (Galician)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* chore(translations): Translated using Weblate (Basque)

Currently translated at 99.7% (823 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* chore(translations): Translated using Weblate (Ukrainian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* chore(translations): Translated using Weblate (Estonian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* chore(translations): Translated using Weblate (Dutch)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Spanish)

Currently translated at 95.2% (788 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/

* chore(translations): Translated using Weblate (Spanish)

Currently translated at 96.3% (797 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* fix: Broken ruzzian plurals

* chore(translations): Translated using Weblate (Norwegian Bokmål)

Currently translated at 91.2% (753 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/

* chore(translations): Translated using Weblate (Bengali)

Currently translated at 4.5% (38 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/bn/

* chore(translations): Translated using Weblate (French)

Currently translated at 82.3% (679 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fr/

* build: (deps): bump translations_cleaner from 0.0.5 to 0.1.0

Bumps [translations_cleaner](https://github.com/Chinmay-KB/translations_cleaner) from 0.0.5 to 0.1.0.
- [Changelog](https://github.com/Chinmay-KB/translations_cleaner/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Chinmay-KB/translations_cleaner/commits)

---
updated-dependencies:
- dependency-name: translations_cleaner
  dependency-version: 0.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (German)

Currently translated at 99.2% (821 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* chore(translations): Translated using Weblate (Estonian)

Currently translated at 100.0% (827 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* build: Bump version to 2.4.0

* build: (deps): bump sqflite_common_ffi from 2.3.6 to 2.3.7+1

Bumps [sqflite_common_ffi](https://github.com/tekartik/sqflite) from 2.3.6 to 2.3.7+1.
- [Commits](https://github.com/tekartik/sqflite/compare/sqflite_common_ffi_v2.3.6...sqflite_common_ffi/v2.3.7)

---
updated-dependencies:
- dependency-name: sqflite_common_ffi
  dependency-version: 2.3.7+1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (Czech)

Currently translated at 66.1% (547 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/

* chore(translations): Translated using Weblate (Czech)

Currently translated at 72.7% (602 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/

* chore(translations): Translated using Weblate (German)

Currently translated at 99.8% (826 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* chore: Add security.md file

* fix: Locale unlocalized strings

* build: (deps): bump matrix from 4.1.0 to 5.0.0

Bumps [matrix](https://github.com/famedly/matrix-dart-sdk) from 4.1.0 to 5.0.0.
- [Release notes](https://github.com/famedly/matrix-dart-sdk/releases)
- [Changelog](https://github.com/famedly/matrix-dart-sdk/blob/main/CHANGELOG.md)
- [Commits](https://github.com/famedly/matrix-dart-sdk/compare/v4.1.0...v5.0.0)

---
updated-dependencies:
- dependency-name: matrix
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: Notifications on web correctly managed when tab not focused

* chore: Add changelog for android

* chore: Remove duplicated localization

* fix: Sign in label

* chore: Versionize fcm shared isolate

* build: Remove unused packag

* build: (deps): bump package_info_plus from 8.3.1 to 9.0.0

Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 8.3.1 to 9.0.0.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v9.0.0/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* feat: Display particle animation on login page

* chore: Use fixed version of fcm shared isolate

* fix: apk crash on some platforms due new flutter version

* chore: Correct kotlin format

* fix iOS notifications

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* add missing type annotations

* update matrix version

* fluffychat merge

* fluffychat merge

* fix notification on click actions

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Christian Kußowski <c.kussowski@famedly.com>
Co-authored-by: Krille-chan <christian-kussowski@posteo.de>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BeMeritus <bemerituss@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: josé m. <correoxm@disroot.org>
Co-authored-by: xabirequejo <xabi.rn@gmail.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Jelv <post@jelv.nl>
Co-authored-by: Дмитрий Михирев <bizdelnick@gmail.com>
Co-authored-by: Kimby <kimbyqs@gmail.com>
Co-authored-by: Christian <christian-pauly@posteo.de>
Co-authored-by: Kom nake <kominak310@svcache.com>
Co-authored-by: hugues de keyzer <komputilisto@hugues.info>
Co-authored-by: nautilusx <translate@disroot.org>
Co-authored-by: Šebestová <ka.sebestova.cz@gmail.com>
2026-02-10 08:01:12 -05:00

284 lines
8 KiB
Dart

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:get_storage/get_storage.dart';
import 'package:fluffychat/pangea/common/constants/local.key.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
class Environment {
static bool get itIsTime =>
DateTime.utc(2023, 1, 25).isBefore(DateTime.now());
static bool get isStagingEnvironment =>
dotenv.env["ENVIRONMENT"] == "staging";
static String get frontendURL {
return appConfigOverride?.frontendURL ??
dotenv.env["FRONTEND_URL"] ??
"Frontend URL NOT FOUND";
}
static String get synapseURL {
return appConfigOverride?.synapseURL ??
dotenv.env['SYNAPSE_URL'] ??
'Synapse Url not found';
}
static String get homeServer {
String? homeServerFromSynapseURL =
appConfigOverride?.synapseURL ?? dotenv.env['SYNAPSE_URL'];
if (homeServerFromSynapseURL != null) {
if (homeServerFromSynapseURL.startsWith("http://")) {
homeServerFromSynapseURL = homeServerFromSynapseURL.replaceFirst(
"http://",
"",
);
}
if (homeServerFromSynapseURL.startsWith("https://")) {
homeServerFromSynapseURL = homeServerFromSynapseURL.replaceFirst(
"https://",
"",
);
}
if (homeServerFromSynapseURL.startsWith("matrix.")) {
homeServerFromSynapseURL = homeServerFromSynapseURL.replaceFirst(
"matrix.",
"",
);
}
}
return appConfigOverride?.homeServer ??
dotenv.env["HOME_SERVER"] ??
homeServerFromSynapseURL ??
'Home Server not found';
}
static String get choreoApi {
final envEntry = appConfigOverride?.choreoApi ?? dotenv.env['CHOREO_API'];
if (envEntry == null) {
return "Not found";
}
if (envEntry.endsWith("/choreo")) {
return envEntry.replaceAll("/choreo", "");
}
if (envEntry.endsWith("/choreo/")) {
return envEntry.replaceAll("/choreo/", "");
}
return envEntry;
}
static String get cmsApi {
final envEntry =
dotenv.env['CMS_API'] ??
appConfigOverride?.choreoApi ??
dotenv.env['CHOREO_API'];
if (envEntry == null) {
return "Not found";
}
return envEntry;
}
static String get choreoApiKey {
return appConfigOverride?.choreoApiKey ??
dotenv.env['CHOREO_API_KEY'] ??
'e6fa9fa97031ba0c852efe78457922f278a2fbc109752fe18e465337699e9873';
}
static String get sentryDsn {
return appConfigOverride?.sentryDsn ??
dotenv.env["SENTRY_DSN"] ??
'https://c2fd19ab2cdc4ebb939a32d01c0e9fa1@o225078.ingest.sentry.io/1376295';
}
static String get rcGoogleKey {
return appConfigOverride?.rcGoogleKey ??
dotenv.env["RC_GOOGLE_KEY"] ??
'goog_paQMrzFKGzuWZvcMTPkkvIsifJe';
}
static String get rcIosKey {
return appConfigOverride?.rcIosKey ??
dotenv.env["RC_IOS_KEY"] ??
'appl_DUPqnxuLjkBLzhBPTWeDjqNENuv';
}
static String get rcOfferingName {
return appConfigOverride?.rcOfferingName ??
dotenv.env["RC_OFFERING_NAME"] ??
'default';
}
static String get stripeManagementUrl {
return appConfigOverride?.stripeManagementUrl ??
dotenv.env["STRIPE_MANAGEMENT_LINK"] ??
(isStagingEnvironment
? 'https://billing.stripe.com/p/login/test_9AQaI8d3O9lmaXe5kk'
: 'https://billing.stripe.com/p/login/dR6dSkf5p6rBc4EcMM');
}
static String get supportUserId {
return synapseURL.contains('staging')
? '@support:staging.pangea.chat'
: '@support:pangea.chat';
}
static String? get botName {
return appConfigOverride?.botName ?? dotenv.env["BOT_NAME"];
}
static final GetStorage appConfigurationStorage = GetStorage('env_override');
static Future<List<AppConfigOverride>> getAppConfigOverrides() async {
if (!isStagingEnvironment) {
return [];
}
List<dynamic> data = [];
try {
final String jsonString = await rootBundle.loadString('envs.json');
data = jsonDecode(jsonString);
} catch (e) {
return [];
}
final List<AppConfigOverride> overrides = [];
for (final entry in data) {
if (entry is! Map<String, dynamic>) {
ErrorHandler.logError(
e: Exception("Invalid entry in envs.json"),
s: StackTrace.current,
data: entry,
);
continue;
}
try {
final override = AppConfigOverride.fromJson(entry);
overrides.add(override);
} catch (e, s) {
ErrorHandler.logError(e: e, s: s, data: entry);
continue;
}
}
return overrides;
}
static AppConfigOverride? get appConfigOverride {
final entry = appConfigurationStorage.read(PLocalKey.appConfigOverride);
if (entry == null) return null;
try {
return AppConfigOverride.fromJson(entry);
} catch (e) {
ErrorHandler.logError(e: e, s: StackTrace.current, data: entry);
return null;
}
}
static Future<void> setAppConfigOverride(AppConfigOverride? override) async {
appConfigurationStorage.write(
PLocalKey.appConfigOverride,
override?.toJson(),
);
}
}
class AppConfigOverride {
final String? environment;
final String? frontendURL;
final String? synapseURL;
final String? homeServer;
final String? choreoApi;
final String? choreoApiKey;
final String? sentryDsn;
final String? rcGoogleKey;
final String? rcIosKey;
final String? rcOfferingName;
final String? stripeManagementUrl;
final String? botName;
const AppConfigOverride({
this.environment,
this.frontendURL,
this.synapseURL,
this.homeServer,
this.choreoApi,
this.choreoApiKey,
this.sentryDsn,
this.rcGoogleKey,
this.rcIosKey,
this.rcOfferingName,
this.stripeManagementUrl,
this.botName,
});
static AppConfigOverride fromJson(Map<String, dynamic> json) {
return AppConfigOverride(
environment: json['environment'] as String?,
frontendURL: json['frontendURL'] as String?,
synapseURL: json['synapseURL'] as String?,
homeServer: json['homeServer'] as String?,
choreoApi: json['choreoApi'] as String?,
choreoApiKey: json['choreoApiKey'] as String?,
sentryDsn: json['sentryDsn'] as String?,
rcGoogleKey: json['rcGoogleKey'] as String?,
rcIosKey: json['rcIosKey'] as String?,
rcOfferingName: json['rcOfferingName'] as String?,
stripeManagementUrl: json['stripeManagementUrl'] as String?,
botName: json['botName'] as String?,
);
}
Map<String, dynamic> toJson() {
return {
'environment': environment,
'frontendURL': frontendURL,
'synapseURL': synapseURL,
'homeServer': homeServer,
'choreoApi': choreoApi,
'choreoApiKey': choreoApiKey,
'sentryDsn': sentryDsn,
'rcGoogleKey': rcGoogleKey,
'rcIosKey': rcIosKey,
'rcOfferingName': rcOfferingName,
'stripeManagementUrl': stripeManagementUrl,
'botName': botName,
};
}
@override
int get hashCode {
return environment.hashCode ^
frontendURL.hashCode ^
synapseURL.hashCode ^
homeServer.hashCode ^
choreoApi.hashCode ^
choreoApiKey.hashCode ^
sentryDsn.hashCode ^
rcGoogleKey.hashCode ^
rcIosKey.hashCode ^
rcOfferingName.hashCode ^
stripeManagementUrl.hashCode ^
botName.hashCode;
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (other is! AppConfigOverride) return false;
return environment == other.environment &&
frontendURL == other.frontendURL &&
synapseURL == other.synapseURL &&
homeServer == other.homeServer &&
choreoApi == other.choreoApi &&
choreoApiKey == other.choreoApiKey &&
sentryDsn == other.sentryDsn &&
rcGoogleKey == other.rcGoogleKey &&
rcIosKey == other.rcIosKey &&
rcOfferingName == other.rcOfferingName &&
stripeManagementUrl == other.stripeManagementUrl &&
botName == other.botName;
}
}