2021-09-06 08:19:13 +00:00
|
|
|
import 'dart:async';
|
2022-11-23 21:02:18 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:isolate';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
2021-03-24 16:52:30 +00:00
|
|
|
import 'package:cake_wallet/entities/language_service.dart';
|
2021-04-12 18:22:22 +00:00
|
|
|
import 'package:cake_wallet/buy/order.dart';
|
2022-11-25 16:59:47 +00:00
|
|
|
import 'package:cake_wallet/entities/preferences_key.dart';
|
2022-07-28 17:03:16 +00:00
|
|
|
import 'package:cake_wallet/ionia/ionia_category.dart';
|
|
|
|
import 'package:cake_wallet/ionia/ionia_merchant.dart';
|
2022-11-25 16:59:47 +00:00
|
|
|
import 'package:cake_wallet/src/screens/failure_page.dart';
|
2021-10-01 15:13:10 +00:00
|
|
|
import 'package:cake_wallet/store/yat/yat_store.dart';
|
2022-11-25 16:59:47 +00:00
|
|
|
import 'package:cake_wallet/themes/theme_list.dart';
|
2021-09-06 08:19:13 +00:00
|
|
|
import 'package:flutter/foundation.dart';
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:hive/hive.dart';
|
2020-06-20 07:10:00 +00:00
|
|
|
import 'package:cake_wallet/di.dart';
|
2020-01-04 19:31:52 +00:00
|
|
|
import 'package:path_provider/path_provider.dart';
|
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
2020-01-04 19:31:52 +00:00
|
|
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
2021-01-15 17:41:30 +00:00
|
|
|
import 'package:cake_wallet/themes/theme_base.dart';
|
2020-10-19 11:20:24 +00:00
|
|
|
import 'package:cake_wallet/router.dart' as Router;
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:cake_wallet/routes.dart';
|
|
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
|
|
import 'package:cake_wallet/reactions/bootstrap.dart';
|
|
|
|
import 'package:cake_wallet/store/app_store.dart';
|
|
|
|
import 'package:cake_wallet/store/authentication_store.dart';
|
|
|
|
import 'package:cake_wallet/entities/transaction_description.dart';
|
2020-09-21 11:50:26 +00:00
|
|
|
import 'package:cake_wallet/entities/get_encryption_key.dart';
|
|
|
|
import 'package:cake_wallet/entities/contact.dart';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cw_core/node.dart';
|
|
|
|
import 'package:cw_core/wallet_info.dart';
|
2020-09-21 11:50:26 +00:00
|
|
|
import 'package:cake_wallet/entities/default_settings_migration.dart';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cw_core/wallet_type.dart';
|
2020-09-21 11:50:26 +00:00
|
|
|
import 'package:cake_wallet/entities/template.dart';
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:cake_wallet/exchange/trade.dart';
|
2020-09-21 11:50:26 +00:00
|
|
|
import 'package:cake_wallet/exchange/exchange_template.dart';
|
2020-09-28 15:47:43 +00:00
|
|
|
import 'package:cake_wallet/src/screens/root/root.dart';
|
2021-09-06 08:19:13 +00:00
|
|
|
import 'package:uni_links/uni_links.dart';
|
2021-12-24 12:37:24 +00:00
|
|
|
import 'package:cw_core/unspent_coins_info.dart';
|
|
|
|
import 'package:cake_wallet/monero/monero.dart';
|
2022-01-08 14:33:17 +00:00
|
|
|
import 'package:cake_wallet/wallet_type_utils.dart';
|
2020-08-20 17:43:54 +00:00
|
|
|
|
2020-09-14 12:08:33 +00:00
|
|
|
final navigatorKey = GlobalKey<NavigatorState>();
|
2021-11-02 09:17:24 +00:00
|
|
|
final rootKey = GlobalKey<RootState>();
|
2020-09-14 12:08:33 +00:00
|
|
|
|
2021-01-15 17:41:30 +00:00
|
|
|
Future<void> main() async {
|
2022-11-23 16:06:09 +00:00
|
|
|
|
|
|
|
await runZonedGuarded(() async {
|
2020-11-08 20:44:09 +00:00
|
|
|
WidgetsFlutterBinding.ensureInitialized();
|
2020-01-04 19:31:52 +00:00
|
|
|
|
2022-11-23 21:02:18 +00:00
|
|
|
FlutterError.onError = (errorDetails) {
|
2022-11-25 16:59:47 +00:00
|
|
|
print("@@@@@@@@@@@@@@@");
|
|
|
|
print("FlutterError.onError");
|
|
|
|
print(errorDetails);
|
2022-11-23 21:02:18 +00:00
|
|
|
_saveException(errorDetails.exception.toString(), errorDetails.stack);
|
|
|
|
};
|
|
|
|
|
2022-11-25 16:59:47 +00:00
|
|
|
ErrorWidget.builder = (errorDetails) {
|
|
|
|
return FailurePage(
|
|
|
|
error: errorDetails.exception.toString(),
|
|
|
|
stackTrace: errorDetails.stack,
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
/// A callback that is invoked when an unhandled error occurs in the root
|
|
|
|
/// isolate.
|
2022-11-23 21:02:18 +00:00
|
|
|
PlatformDispatcher.instance.onError = (error, stack) {
|
2022-11-25 16:59:47 +00:00
|
|
|
print("@@@@@@@@@@@@@@@");
|
|
|
|
print("PlatformDispatcher.instance.onError");
|
2022-11-23 21:02:18 +00:00
|
|
|
_saveException(error.toString(), stack);
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
2020-11-08 20:44:09 +00:00
|
|
|
final appDir = await getApplicationDocumentsDirectory();
|
2021-01-15 17:41:30 +00:00
|
|
|
await Hive.close();
|
2020-11-08 20:44:09 +00:00
|
|
|
Hive.init(appDir.path);
|
2021-01-15 17:41:30 +00:00
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(Contact.typeId)) {
|
|
|
|
Hive.registerAdapter(ContactAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(Node.typeId)) {
|
|
|
|
Hive.registerAdapter(NodeAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(TransactionDescription.typeId)) {
|
|
|
|
Hive.registerAdapter(TransactionDescriptionAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(Trade.typeId)) {
|
|
|
|
Hive.registerAdapter(TradeAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(WalletInfo.typeId)) {
|
|
|
|
Hive.registerAdapter(WalletInfoAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(walletTypeTypeId)) {
|
|
|
|
Hive.registerAdapter(WalletTypeAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(Template.typeId)) {
|
|
|
|
Hive.registerAdapter(TemplateAdapter());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Hive.isAdapterRegistered(ExchangeTemplate.typeId)) {
|
|
|
|
Hive.registerAdapter(ExchangeTemplateAdapter());
|
|
|
|
}
|
|
|
|
|
2021-03-12 19:04:37 +00:00
|
|
|
if (!Hive.isAdapterRegistered(Order.typeId)) {
|
|
|
|
Hive.registerAdapter(OrderAdapter());
|
|
|
|
}
|
|
|
|
|
2022-01-08 14:33:17 +00:00
|
|
|
if (!isMoneroOnly && !Hive.isAdapterRegistered(UnspentCoinsInfo.typeId)) {
|
|
|
|
Hive.registerAdapter(UnspentCoinsInfoAdapter());
|
|
|
|
}
|
|
|
|
|
2020-11-08 20:44:09 +00:00
|
|
|
final secureStorage = FlutterSecureStorage();
|
|
|
|
final transactionDescriptionsBoxKey = await getEncryptionKey(
|
|
|
|
secureStorage: secureStorage, forKey: TransactionDescription.boxKey);
|
|
|
|
final tradesBoxKey = await getEncryptionKey(
|
|
|
|
secureStorage: secureStorage, forKey: Trade.boxKey);
|
2021-03-12 19:04:37 +00:00
|
|
|
final ordersBoxKey = await getEncryptionKey(
|
|
|
|
secureStorage: secureStorage, forKey: Order.boxKey);
|
2020-11-08 20:44:09 +00:00
|
|
|
final contacts = await Hive.openBox<Contact>(Contact.boxName);
|
|
|
|
final nodes = await Hive.openBox<Node>(Node.boxName);
|
|
|
|
final transactionDescriptions = await Hive.openBox<TransactionDescription>(
|
|
|
|
TransactionDescription.boxName,
|
|
|
|
encryptionKey: transactionDescriptionsBoxKey);
|
|
|
|
final trades =
|
2021-01-15 17:41:30 +00:00
|
|
|
await Hive.openBox<Trade>(Trade.boxName, encryptionKey: tradesBoxKey);
|
2021-03-12 19:04:37 +00:00
|
|
|
final orders =
|
|
|
|
await Hive.openBox<Order>(Order.boxName, encryptionKey: ordersBoxKey);
|
2020-11-08 20:44:09 +00:00
|
|
|
final walletInfoSource = await Hive.openBox<WalletInfo>(WalletInfo.boxName);
|
|
|
|
final templates = await Hive.openBox<Template>(Template.boxName);
|
|
|
|
final exchangeTemplates =
|
2021-01-15 17:41:30 +00:00
|
|
|
await Hive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName);
|
2022-10-12 17:09:57 +00:00
|
|
|
Box<UnspentCoinsInfo>? unspentCoinsInfoSource;
|
2022-01-24 14:12:25 +00:00
|
|
|
|
|
|
|
if (!isMoneroOnly) {
|
|
|
|
unspentCoinsInfoSource = await Hive.openBox<UnspentCoinsInfo>(UnspentCoinsInfo.boxName);
|
|
|
|
}
|
2021-11-02 09:17:24 +00:00
|
|
|
|
2020-11-08 20:44:09 +00:00
|
|
|
await initialSetup(
|
|
|
|
sharedPreferences: await SharedPreferences.getInstance(),
|
|
|
|
nodes: nodes,
|
|
|
|
walletInfoSource: walletInfoSource,
|
|
|
|
contactSource: contacts,
|
|
|
|
tradesSource: trades,
|
2021-03-12 19:04:37 +00:00
|
|
|
ordersSource: orders,
|
2021-07-05 13:52:24 +00:00
|
|
|
unspentCoinsInfoSource: unspentCoinsInfoSource,
|
2020-11-08 20:44:09 +00:00
|
|
|
// fiatConvertationService: fiatConvertationService,
|
|
|
|
templates: templates,
|
|
|
|
exchangeTemplates: exchangeTemplates,
|
|
|
|
transactionDescriptions: transactionDescriptions,
|
2021-01-15 17:41:30 +00:00
|
|
|
secureStorage: secureStorage,
|
2022-05-18 16:13:58 +00:00
|
|
|
initialMigrationVersion: 17);
|
2020-11-08 20:44:09 +00:00
|
|
|
runApp(App());
|
2022-11-25 16:59:47 +00:00
|
|
|
}, (error, stackTrace) async {
|
2022-11-24 14:27:29 +00:00
|
|
|
_saveException(error.toString(), stackTrace);
|
2022-11-25 16:59:47 +00:00
|
|
|
final sharedPreferences = await SharedPreferences.getInstance();
|
|
|
|
final theme = ThemeList.deserialize(
|
|
|
|
raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ?? 0);
|
|
|
|
|
|
|
|
final savedLanguageCode =
|
|
|
|
sharedPreferences.getString(PreferencesKey.currentLanguageCode) ??
|
|
|
|
await LanguageService.localeDetection();
|
|
|
|
runApp(
|
|
|
|
MaterialApp(
|
2020-11-08 20:44:09 +00:00
|
|
|
debugShowCheckedModeBanner: true,
|
2022-11-25 16:59:47 +00:00
|
|
|
theme: theme.themeData,
|
|
|
|
localizationsDelegates: [
|
|
|
|
S.delegate,
|
|
|
|
GlobalCupertinoLocalizations.delegate,
|
|
|
|
GlobalMaterialLocalizations.delegate,
|
|
|
|
GlobalWidgetsLocalizations.delegate,
|
|
|
|
],
|
|
|
|
supportedLocales: S.delegate.supportedLocales,
|
|
|
|
locale: Locale(savedLanguageCode),
|
2020-11-08 20:44:09 +00:00
|
|
|
home: Scaffold(
|
2022-11-25 16:59:47 +00:00
|
|
|
body: FailurePage(
|
|
|
|
error: error.toString(),
|
|
|
|
stackTrace: stackTrace,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
2022-11-23 16:06:09 +00:00
|
|
|
});
|
2020-01-04 19:31:52 +00:00
|
|
|
}
|
|
|
|
|
2022-11-23 21:02:18 +00:00
|
|
|
void _saveException(String? error, StackTrace? stackTrace) async {
|
2022-11-25 16:59:47 +00:00
|
|
|
final appDocDir = await getApplicationDocumentsDirectory();
|
|
|
|
|
|
|
|
final file = File('${appDocDir.path}/error.txt');
|
2022-11-23 21:02:18 +00:00
|
|
|
final exception = {
|
|
|
|
"${DateTime.now()}": {
|
|
|
|
"error": error,
|
|
|
|
"stackTrace": stackTrace.toString(),
|
|
|
|
}
|
|
|
|
};
|
2022-11-25 16:59:47 +00:00
|
|
|
|
2022-11-23 21:02:18 +00:00
|
|
|
await file.writeAsString(jsonEncode(exception), mode: FileMode.append);
|
|
|
|
}
|
|
|
|
|
2021-01-15 17:41:30 +00:00
|
|
|
Future<void> initialSetup(
|
2022-10-12 17:09:57 +00:00
|
|
|
{required SharedPreferences sharedPreferences,
|
|
|
|
required Box<Node> nodes,
|
|
|
|
required Box<WalletInfo> walletInfoSource,
|
|
|
|
required Box<Contact> contactSource,
|
|
|
|
required Box<Trade> tradesSource,
|
|
|
|
required Box<Order> ordersSource,
|
|
|
|
// required FiatConvertationService fiatConvertationService,
|
|
|
|
required Box<Template> templates,
|
|
|
|
required Box<ExchangeTemplate> exchangeTemplates,
|
|
|
|
required Box<TransactionDescription> transactionDescriptions,
|
|
|
|
required FlutterSecureStorage secureStorage,
|
|
|
|
Box<UnspentCoinsInfo>? unspentCoinsInfoSource,
|
2021-05-07 07:36:38 +00:00
|
|
|
int initialMigrationVersion = 15}) async {
|
2021-03-24 16:52:30 +00:00
|
|
|
LanguageService.loadLocaleList();
|
2020-01-04 19:31:52 +00:00
|
|
|
await defaultSettingsMigration(
|
2021-01-15 17:41:30 +00:00
|
|
|
secureStorage: secureStorage,
|
2020-01-04 19:31:52 +00:00
|
|
|
version: initialMigrationVersion,
|
|
|
|
sharedPreferences: sharedPreferences,
|
2020-09-23 18:26:10 +00:00
|
|
|
walletInfoSource: walletInfoSource,
|
|
|
|
contactSource: contactSource,
|
|
|
|
tradeSource: tradesSource,
|
2020-01-04 19:31:52 +00:00
|
|
|
nodes: nodes);
|
2020-07-06 20:09:03 +00:00
|
|
|
await setup(
|
|
|
|
walletInfoSource: walletInfoSource,
|
|
|
|
nodeSource: nodes,
|
2020-07-23 12:20:52 +00:00
|
|
|
contactSource: contactSource,
|
2020-07-29 16:55:42 +00:00
|
|
|
tradesSource: tradesSource,
|
|
|
|
templates: templates,
|
2020-11-06 18:54:00 +00:00
|
|
|
exchangeTemplates: exchangeTemplates,
|
2021-03-12 19:04:37 +00:00
|
|
|
transactionDescriptionBox: transactionDescriptions,
|
2021-07-05 13:52:24 +00:00
|
|
|
ordersSource: ordersSource,
|
2022-07-28 17:03:16 +00:00
|
|
|
unspentCoinsInfoSource: unspentCoinsInfoSource,
|
|
|
|
);
|
2021-01-15 17:41:30 +00:00
|
|
|
await bootstrap(navigatorKey);
|
2021-12-24 12:37:24 +00:00
|
|
|
monero?.onStartup();
|
2020-01-04 19:31:52 +00:00
|
|
|
}
|
|
|
|
|
2021-09-06 08:19:13 +00:00
|
|
|
class App extends StatefulWidget {
|
|
|
|
@override
|
|
|
|
AppState createState() => AppState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class AppState extends State<App> with SingleTickerProviderStateMixin {
|
2022-10-12 17:09:57 +00:00
|
|
|
AppState()
|
|
|
|
: yatStore = getIt.get<YatStore>() {
|
2021-09-06 08:19:13 +00:00
|
|
|
SystemChrome.setPreferredOrientations(
|
|
|
|
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
|
|
|
|
}
|
|
|
|
|
|
|
|
YatStore yatStore;
|
2022-10-12 17:09:57 +00:00
|
|
|
StreamSubscription? stream;
|
2021-09-06 08:19:13 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
2022-01-12 13:32:23 +00:00
|
|
|
//_handleIncomingLinks();
|
2022-01-12 13:20:43 +00:00
|
|
|
//_handleInitialUri();
|
2021-09-06 08:19:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
stream?.cancel();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
2021-10-01 15:13:10 +00:00
|
|
|
Future<void> _handleInitialUri() async {
|
2021-09-06 08:19:13 +00:00
|
|
|
try {
|
|
|
|
final uri = await getInitialUri();
|
2021-11-02 09:17:24 +00:00
|
|
|
print('uri: $uri');
|
2021-09-06 08:19:13 +00:00
|
|
|
if (uri == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!mounted) return;
|
2022-01-12 13:32:23 +00:00
|
|
|
//_fetchEmojiFromUri(uri);
|
2021-09-06 08:19:13 +00:00
|
|
|
} catch (e) {
|
|
|
|
if (!mounted) return;
|
|
|
|
print(e.toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-01 15:13:10 +00:00
|
|
|
void _handleIncomingLinks() {
|
2021-09-06 08:19:13 +00:00
|
|
|
if (!kIsWeb) {
|
2022-10-12 17:09:57 +00:00
|
|
|
stream = getUriLinksStream().listen((Uri? uri) {
|
2021-11-02 09:17:24 +00:00
|
|
|
print('uri: $uri');
|
2021-09-06 08:19:13 +00:00
|
|
|
if (!mounted) return;
|
2022-01-12 13:32:23 +00:00
|
|
|
//_fetchEmojiFromUri(uri);
|
2021-09-06 08:19:13 +00:00
|
|
|
}, onError: (Object error) {
|
|
|
|
if (!mounted) return;
|
|
|
|
print('Error: $error');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-01 15:13:10 +00:00
|
|
|
void _fetchEmojiFromUri(Uri uri) {
|
2022-01-12 13:20:43 +00:00
|
|
|
//final queryParameters = uri.queryParameters;
|
|
|
|
//if (queryParameters?.isEmpty ?? true) {
|
|
|
|
// return;
|
|
|
|
//}
|
|
|
|
//final emoji = queryParameters['eid'];
|
|
|
|
//final refreshToken = queryParameters['refresh_token'];
|
|
|
|
//if ((emoji?.isEmpty ?? true)||(refreshToken?.isEmpty ?? true)) {
|
|
|
|
// return;
|
|
|
|
//}
|
|
|
|
//yatStore.emoji = emoji;
|
|
|
|
//yatStore.refreshToken = refreshToken;
|
|
|
|
//yatStore.emojiIncommingSC.add(emoji);
|
2021-09-07 16:43:49 +00:00
|
|
|
}
|
|
|
|
|
2021-09-06 08:19:13 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Observer(builder: (BuildContext context) {
|
2022-10-12 17:09:57 +00:00
|
|
|
final appStore = getIt.get<AppStore>();
|
|
|
|
final settingsStore = appStore.settingsStore;
|
2021-09-06 08:19:13 +00:00
|
|
|
final statusBarColor = Colors.transparent;
|
|
|
|
final authenticationStore = getIt.get<AuthenticationStore>();
|
|
|
|
final initialRoute =
|
|
|
|
authenticationStore.state == AuthenticationState.denied
|
|
|
|
? Routes.disclaimer
|
|
|
|
: Routes.login;
|
|
|
|
final currentTheme = settingsStore.currentTheme;
|
|
|
|
final statusBarBrightness = currentTheme.type == ThemeType.dark
|
|
|
|
? Brightness.light
|
|
|
|
: Brightness.dark;
|
|
|
|
final statusBarIconBrightness = currentTheme.type == ThemeType.dark
|
|
|
|
? Brightness.light
|
|
|
|
: Brightness.dark;
|
|
|
|
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
|
|
|
|
statusBarColor: statusBarColor,
|
|
|
|
statusBarBrightness: statusBarBrightness,
|
|
|
|
statusBarIconBrightness: statusBarIconBrightness));
|
|
|
|
|
|
|
|
return Root(
|
2021-11-02 09:17:24 +00:00
|
|
|
key: rootKey,
|
2022-10-12 17:09:57 +00:00
|
|
|
appStore: appStore,
|
2021-09-06 08:19:13 +00:00
|
|
|
authenticationStore: authenticationStore,
|
|
|
|
navigatorKey: navigatorKey,
|
|
|
|
child: MaterialApp(
|
|
|
|
navigatorKey: navigatorKey,
|
|
|
|
debugShowCheckedModeBanner: false,
|
|
|
|
theme: settingsStore.theme,
|
|
|
|
localizationsDelegates: [
|
|
|
|
S.delegate,
|
|
|
|
GlobalCupertinoLocalizations.delegate,
|
|
|
|
GlobalMaterialLocalizations.delegate,
|
|
|
|
GlobalWidgetsLocalizations.delegate,
|
|
|
|
],
|
|
|
|
supportedLocales: S.delegate.supportedLocales,
|
|
|
|
locale: Locale(settingsStore.languageCode),
|
|
|
|
onGenerateRoute: (settings) => Router.createRoute(settings),
|
|
|
|
initialRoute: initialRoute,
|
|
|
|
));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|