Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integration EwHttp #1177

Merged
merged 12 commits into from
May 8, 2023
2 changes: 1 addition & 1 deletion app/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import 'package:encointer_wallet/config.dart';
import 'package:encointer_wallet/utils/repository_provider.dart';
import 'package:encointer_wallet/modules/modules.dart';
import 'package:encointer_wallet/service/notification/lib/notification.dart';
import 'package:encointer_wallet/service/subscan.dart';
import 'package:encointer_wallet/service/http_overrides.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/local_storage.dart' as util;

Expand Down
2 changes: 1 addition & 1 deletion app/lib/mocks/ipfs/ipfs_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const mockIcon = '<svg viewBox="0 0 132.09 131.85" '
'<path d="m97.62 95.38-12.03 11.17-8.84-11.17z"/></svg>';

class MockIpfsApi extends IpfsApi {
MockIpfsApi({super.gateway, super.httpClient});
const MockIpfsApi(super.httpClient, {super.gateway});

@override
Future<String?> getCommunityIcon(String? cid) {
Expand Down
9 changes: 6 additions & 3 deletions app/lib/mocks/substrate_api/mock_api.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'dart:core';

import 'package:ew_http/ew_http.dart';

import 'package:encointer_wallet/mocks/ipfs/ipfs_api.dart';
import 'package:encointer_wallet/mocks/substrate_api/core/mock_dart_api.dart';
import 'package:encointer_wallet/mocks/substrate_api/mock_account_api.dart';
Expand All @@ -12,14 +14,15 @@ import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/store/app.dart';

MockApi getMockApi(AppStore store, {required bool withUI}) {
return MockApi(store, MockJSApi(), MockSubstrateDartApi(), '', withUi: withUI);
return MockApi(store, MockJSApi(), MockSubstrateDartApi(), EwHttp(), '', withUi: withUI);
}

class MockApi extends Api {
MockApi(
AppStore store,
MockJSApi js,
MockSubstrateDartApi dartApi,
EwHttp ewHttp,
String jsServiceEncointer, {
required this.withUi,
}) : super(
Expand All @@ -29,8 +32,8 @@ class MockApi extends Api {
MockAccountApi(store, js),
MockAssetsApi(store, js),
MockChainApi(store, js),
MockEncointerApi(store, js, dartApi),
MockIpfsApi(),
MockEncointerApi(store, js, dartApi, ewHttp),
MockIpfsApi(ewHttp),
jsServiceEncointer,
);

Expand Down
2 changes: 1 addition & 1 deletion app/lib/mocks/substrate_api/mock_encointer_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import 'package:encointer_wallet/service/substrate_api/encointer/encointer_api.d
/// The getters then return the preconfigured value, which in turn leads to consistent
/// responses in the test.
class MockEncointerApi extends EncointerApi {
MockEncointerApi(super.store, MockJSApi super.js, MockSubstrateDartApi super.dartApi);
MockEncointerApi(super.store, MockJSApi super.js, MockSubstrateDartApi super.dartApi, super.ewHttp);

@override
Future<void> startSubscriptions() async {
Expand Down
15 changes: 8 additions & 7 deletions app/lib/modules/splash/view/splash_view.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import 'package:ew_http/ew_http.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:encointer_wallet/common/components/logo/encointer_logo.dart';
import 'package:encointer_wallet/mocks/substrate_api/core/mock_dart_api.dart';
import 'package:encointer_wallet/modules/modules.dart';
import 'package:encointer_wallet/utils/repository_provider.dart';
import 'package:encointer_wallet/gen/assets.gen.dart';
import 'package:encointer_wallet/mocks/ipfs/ipfs_api.dart';
import 'package:encointer_wallet/service/ipfs/ipfs_api.dart';
import 'package:encointer_wallet/mocks/substrate_api/mock_api.dart';
import 'package:encointer_wallet/mocks/substrate_api/mock_js_api.dart';
import 'package:encointer_wallet/page-encointer/home_page.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/mocks/substrate_api/core/mock_dart_api.dart';
import 'package:encointer_wallet/store/app.dart';

class SplashView extends StatefulWidget {
Expand Down Expand Up @@ -78,11 +78,12 @@ class _SplashViewState extends State<SplashView> {
/// 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);

webApi = !store.config.mockSubstrateApi
? Api.create(store, JSApi(), SubstrateDartApi(), js,
store.config.isIntegrationTest ? MockIpfsApi() : IpfsApi(gateway: store.settings.ipfsGateway))
: MockApi(store, MockJSApi(), MockSubstrateDartApi(), js, withUi: true);
? Api.create(store, JSApi(), SubstrateDartApi(), ewHttp, js,
isIntegrationTest: store.config.isIntegrationTest, gateway: store.settings.ipfsGateway)
: MockApi(store, MockJSApi(), MockSubstrateDartApi(), ewHttp, js, withUi: true);

await webApi.init().timeout(
const Duration(seconds: 20),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/utils/fetch_status.dart';

part 'transfer_gistory_store.g.dart';
part 'transfer_history_store.g.dart';

class TransferHistoryStore = _TransferHistoryStoreBase with _$TransferHistoryStore;

Expand Down

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

2 changes: 1 addition & 1 deletion app/lib/modules/transfer/transfer.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export 'logic/transfer_gistory_store.dart';
export 'logic/transfer_history_store.dart';
export 'view/transfer_history_view.dart';
export 'widgets/transaction_card.dart';
export 'widgets/transactions_empty.dart';
Expand Down
3 changes: 3 additions & 0 deletions app/lib/page-encointer/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import 'package:ew_http/ew_http.dart';
import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
import 'package:provider/provider.dart';
import 'package:timezone/timezone.dart' as tz;

import 'package:encointer_wallet/common/theme.dart';
import 'package:encointer_wallet/utils/repository_provider.dart';
import 'package:encointer_wallet/page-encointer/bazaar/0_main/bazaar_main.dart';
import 'package:encointer_wallet/page/assets/index.dart';
import 'package:encointer_wallet/page/profile/contacts/contacts_page.dart';
Expand Down Expand Up @@ -42,6 +44,7 @@ class _EncointerHomePageState extends State<EncointerHomePage> {
NotificationPlugin.scheduleNotification,
langCode: Localizations.localeOf(context).languageCode,
cid: cid,
ewHttp: RepositoryProvider.of<EwHttp>(context),
);

// Should never be null, we either come from the splash screen, and hence we had
Expand Down
30 changes: 7 additions & 23 deletions app/lib/service/encointer_feed/feed.dart
Original file line number Diff line number Diff line change
@@ -1,32 +1,16 @@
import 'dart:convert';

import 'package:collection/collection.dart' show IterableExtension;
import 'package:http/http.dart' as http;

import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/models/communities/community_identifier.dart';
import 'package:encointer_wallet/models/index.dart';
import 'package:encointer_wallet/service/log/log_service.dart';

Future<List<MeetupOverrides>> getMeetupOverrides() async {
final response = await http.get(Uri.parse(encointerFeedOverrides));

if (response.statusCode == 200) {
final list = jsonDecode(response.body);
return (list as List).map((e) => MeetupOverrides.fromJson(e as Map<String, dynamic>)).toList();
} else {
throw Exception('Failed to get meetup overrides.');
}
}

Future<DateTime?> getMeetupTimeOverride(String network, CommunityIdentifier cid, CeremonyPhase phase) async {
// For testing that it works.
// final overrides = testMeetupOverrides;
final overrides = await getMeetupOverrides();

final networkOverride = overrides.firstWhereOrNull(
(o) => o.network == network,
);
Future<DateTime?> getMeetupTimeOverride({
required String network,
required CommunityIdentifier cid,
required CeremonyPhase phase,
required List<MeetupOverrides> overrides,
}) async {
final networkOverride = overrides.firstWhereOrNull((o) => o.network == network);

if (networkOverride == null) {
Log.d('No network specific override found', 'getMeetupTimeOverride');
Expand Down
9 changes: 9 additions & 0 deletions app/lib/service/http_overrides.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'dart:io';

class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
}
}
22 changes: 5 additions & 17 deletions app/lib/service/ipfs/ipfs_api.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import 'dart:convert';

import 'package:http/http.dart' as http;
import 'package:ew_http/ew_http.dart';

import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/service/log/log_service.dart';

class IpfsApi {
IpfsApi({
http.Client? httpClient,
this.gateway = ipfsGatewayEncointer,
}) : _httpClient = httpClient ?? http.Client();
const IpfsApi(this.ewHttp, {this.gateway = ipfsGatewayEncointer});

final http.Client _httpClient;
final EwHttp ewHttp;
final String gateway;

static const String getRequest = '/api/v0/object/get?arg=';
Expand All @@ -21,14 +16,7 @@ class IpfsApi {
Log.d('[IPFS] return default encointer icon because ipfs-cid is not set', 'Ipfs');
return null;
}
try {
final uri = Uri.parse('$gateway/$getRequest$cid/$communityIconName');
final response = await _httpClient.get(uri).timeout(const Duration(seconds: 8));
final body = jsonDecode(response.body) as Map<String, dynamic>;
return body['Data'] as String?;
} catch (e, s) {
Log.e('$e', 'Ipfs', s);
return null;
}
final data = await ewHttp.get<Map<String, dynamic>>('$gateway/$getRequest$cid/$communityIconName');
return data?['Data'] as String?;
}
}
24 changes: 0 additions & 24 deletions app/lib/service/meetup/feed_repo.dart

This file was deleted.

1 change: 0 additions & 1 deletion app/lib/service/meetup/meetup.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export 'notification_handler.dart';
export 'feed_model.dart';
export 'feed_repo.dart';
10 changes: 8 additions & 2 deletions app/lib/service/meetup/notification_handler.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
import 'package:collection/collection.dart';
import 'package:ew_http/ew_http.dart';
import 'package:timezone/timezone.dart' as tz;

import 'package:encointer_wallet/service/meetup/feed_repo.dart';
import 'package:encointer_wallet/service/notification/lib/notification.dart';
import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/service/meetup/feed_model.dart';

class NotificationHandler {
static Future<void> fetchMessagesAndScheduleNotifications(
tz.Location local,
ScheduleNotification scheduleNotification, {
required String langCode,
String? cid,
required EwHttp ewHttp,
}) async {
final feeds = await FeedRepo().fetchData(langCode);
final feeds = await ewHttp.getTypeList(
replaceLocalePlaceholder(meetupNotificationLink, langCode),
fromJson: Feed.fromJson,
);
if (feeds != null && feeds.isNotEmpty) {
feeds.forEachIndexed((i, e) async {
if (tz.TZDateTime.from(feeds[i].showAt, local).isAfter(DateTime.now())) {
Expand Down
Loading