Skip to content

Commit

Permalink
reInit webApi with webview and nodes if failed (#1262)
Browse files Browse the repository at this point in the history
* reInit webApi with webview and nodes if failed
if user closes and reopens the app

* after code review changes made
organized imports

* fixed melos format-check failure
  • Loading branch information
azackmatoff authored Jun 9, 2023
1 parent 45efc05 commit 5b46cdd
Show file tree
Hide file tree
Showing 13 changed files with 310 additions and 138 deletions.
2 changes: 2 additions & 0 deletions app/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:io';

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:encointer_wallet/service/substrate_api/core/dart_api.dart';
import 'package:ew_storage/ew_storage.dart';
import 'package:ew_http/ew_http.dart';
import 'package:flutter/cupertino.dart';
Expand Down Expand Up @@ -37,6 +38,7 @@ Future<void> main({AppConfig? appConfig, AppSettings? settings}) async {
providers: [
RepositoryProvider(create: (context) => EwHttp()),
RepositoryProvider(create: (context) => appConfig ?? const AppConfig()),
RepositoryProvider(create: (context) => SubstrateDartApi()),
],
child: MultiProvider(
providers: [
Expand Down
2 changes: 1 addition & 1 deletion app/lib/modules/account/view/create_pin_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:encointer_wallet/common/components/loading/centered_activity_ind
import 'package:encointer_wallet/theme/theme.dart';
import 'package:encointer_wallet/common/components/gradient_elements.dart';
import 'package:encointer_wallet/page-encointer/common/community_chooser_on_map.dart';
import 'package:encointer_wallet/page-encointer/home_page.dart';
import 'package:encointer_wallet/presentation/home/views/home_page.dart';
import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
Expand Down
2 changes: 1 addition & 1 deletion app/lib/modules/login/logic/login_store.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:mobx/mobx.dart';
import 'package:provider/provider.dart';

import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:encointer_wallet/page-encointer/home_page.dart';
import 'package:encointer_wallet/presentation/home/views/home_page.dart';
import 'package:encointer_wallet/utils/snack_bar.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/alerts/app_alert.dart';
Expand Down
24 changes: 1 addition & 23 deletions app/lib/modules/splash/view/splash_view.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import 'package:ew_http/ew_http.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:encointer_wallet/service/init_web_api/init_web_api.dart';
import 'package:encointer_wallet/modules/modules.dart';
import 'package:encointer_wallet/config.dart';
import 'package:encointer_wallet/utils/repository_provider.dart';
import 'package:encointer_wallet/gen/assets.gen.dart';
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/service/substrate_api/core/dart_api.dart';
import 'package:encointer_wallet/service/substrate_api/core/js_api.dart';
import 'package:encointer_wallet/common/components/logo/encointer_logo.dart';
import 'package:encointer_wallet/store/app.dart';

Expand Down Expand Up @@ -61,19 +55,3 @@ class _SplashViewState extends State<SplashView> {
);
}
}

/// Initialize an the webApi instance.
///
/// Currently, `store.init()` must be called before it is passed into the api
/// due to some cyclic dependencies between webApi <> AppStore.
Future<void> initWebApi(BuildContext context, AppStore store) async {
final js = await DefaultAssetBundle.of(context).loadString(Assets.jsServiceEncointer.dist.main);
final ewHttp = RepositoryProvider.of<EwHttp>(context);
final appConfig = RepositoryProvider.of<AppConfig>(context);
webApi = Api.create(store, JSApi(), SubstrateDartApi(), ewHttp, js, isIntegrationTest: appConfig.isIntegrationTest);

await webApi.init().timeout(
const Duration(seconds: 20),
onTimeout: () => Log.d('webApi.init() has run into a timeout. We might be offline.'),
);
}
5 changes: 5 additions & 0 deletions app/lib/page/page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
///TODO(Azamat): Add other exports here
export 'assets/index.dart';
export 'profile/contacts/contacts_page.dart';
export 'profile/index.dart';
export 'qr_scan/qr_scan_page.dart';
98 changes: 98 additions & 0 deletions app/lib/presentation/home/store/home_page_store.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import 'package:flutter/cupertino.dart';
import 'package:ew_http/ew_http.dart';
import 'package:mobx/mobx.dart';
import 'package:provider/provider.dart';
import 'package:timezone/timezone.dart' as tz;

import 'package:encointer_wallet/service/service.dart';
import 'package:encointer_wallet/config.dart';
import 'package:encointer_wallet/modules/settings/logic/app_settings_store.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/utils.dart';

part 'home_page_store.g.dart';

const _logTarget = 'HomePageStore';
// ignore: library_private_types_in_public_api
class HomePageStore = _HomePageStoreBase with _$HomePageStore;

abstract class _HomePageStoreBase with Store, WidgetsBindingObserver {
_HomePageStoreBase(this.appStore, this.buildContext) {
_init();
}

@observable
late AppStore appStore;

@observable
late BuildContext buildContext;

@action
void _init() {
Log.d(_logTarget, '_init');
WidgetsBinding.instance.addObserver(this);
if (!RepositoryProvider.of<AppConfig>(buildContext).isIntegrationTest) NotificationPlugin.init(buildContext);
}

@action
Future<void> postFrameCallbacks() async {
Log.d(_logTarget, 'postFrameCallbacks');
final encointer = buildContext.read<AppStore>().encointer;
final cid = encointer.community?.cid.toFmtString();
await initialDeepLinks(buildContext);
await NotificationHandler.fetchMessagesAndScheduleNotifications(
tz.local,
NotificationPlugin.scheduleNotification,
langCode: Localizations.localeOf(buildContext).languageCode,
cid: cid,
ewHttp: RepositoryProvider.of<EwHttp>(buildContext),
devMode: buildContext.read<AppSettings>().developerMode,
);

// Should never be null, we either come from the splash screen, and hence we had
// enough time to connect to the blockchain or we already have a populated store.
//
// Hence, can only be null if someone uses the app for the first time and is offline.
if (encointer.nextRegisteringPhaseStart != null &&
encointer.currentCeremonyIndex != null &&
encointer.ceremonyCycleDuration != null) {
await CeremonyNotifications.scheduleRegisteringStartsReminders(
encointer.nextRegisteringPhaseStart!,
encointer.currentCeremonyIndex!,
encointer.ceremonyCycleDuration!,
I18n.of(buildContext)!.translationsForLocale().encointer,
cid: cid,
);

await CeremonyNotifications.scheduleLastDayOfRegisteringReminders(
encointer.assigningPhaseStart!,
encointer.currentCeremonyIndex!,
encointer.ceremonyCycleDuration!,
I18n.of(buildContext)!.translationsForLocale().encointer,
cid: cid,
);
}
}

@action
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
Log.d(_logTarget, 'Change lifecycle to $state');

if (state == AppLifecycleState.resumed) {
final connected = await webApi.isConnected();
Log.d(_logTarget, 'webApi.isConnected() = $connected');
if (!connected) {
/// initialize webApi again if it's failed after
/// user closes the app and reopens it
await initWebApi(buildContext, appStore);
}
}
super.didChangeAppLifecycleState(state);
}

@action
void dispose() {
WidgetsBinding.instance.removeObserver(this);
}
}
86 changes: 86 additions & 0 deletions app/lib/presentation/home/store/home_page_store.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 5b46cdd

Please sign in to comment.