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

fix: Ewm 250 #478

Merged
merged 9 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
package="com.broxus.sparx.app">
<application
android:label="${appName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/ic_launcher"
android:enableOnBackInvokedCallback="true">
<activity
android:name=".MainActivity"
android:exported="true"
Expand Down
59 changes: 29 additions & 30 deletions lib/app/router/routs/add_seed/add_seed.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'dart:convert';

import 'package:app/app/router/router.dart';
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/feature/add_seed/add_existing_wallet/view/add_existing_wallet_page.dart';
import 'package:app/feature/add_seed/add_seed_enable_biometry/view/add_seed_enable_biometry_page.dart';
import 'package:app/feature/add_seed/create_password/screens/create_seed_password/create_seed_password_screen.dart';
Expand All @@ -24,6 +23,8 @@ const enterSeedNameNamePathParam = 'nameParam';
/// Route that allows to create a seed phrase without entering name.
/// This route may be used in onboarding or profile section, depends
/// on [passwordRoute].

// TODO(knightforce): check is used
@Deprecated('Use v2 version')
GoRoute createSeedNoNamedRoute(GoRoute passwordRoute) {
return GoRoute(
Expand All @@ -33,10 +34,9 @@ GoRoute createSeedNoNamedRoute(GoRoute passwordRoute) {
GoRoute(
path: AppRoute.checkSeed.path,
builder: (_, state) => CheckSeedPhrasePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
seed: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
),
routes: [
passwordRoute,
Expand Down Expand Up @@ -93,7 +93,9 @@ GoRoute get createOnboardingSeedPasswordRoute {
path: AppRoute.createSeedPassword.path,
builder: (_, GoRouterState state) {
return CreateSeedPasswordScreen(
phrase: state.uri.queryParameters[addSeedPhraseQueryParam],
phrase: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
);
},
routes: [
Expand All @@ -116,10 +118,9 @@ GoRoute get createSeedNoNamedProfileRoute {
GoRoute(
path: AppRoute.createSeedPassword.path,
builder: (_, state) => CreateSeedPasswordProfilePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
seedPhrase: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
name: state.pathParameters[enterSeedNameNamePathParam],
),
),
Expand All @@ -132,10 +133,9 @@ GoRoute get enterSeedNoNamedProfileRoute {
GoRoute(
path: AppRoute.createSeedPassword.path,
builder: (_, GoRouterState state) => CreateSeedPasswordProfilePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
seedPhrase: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
name: state.pathParameters[enterSeedNameNamePathParam],
),
),
Expand All @@ -149,10 +149,9 @@ GoRoute get createSeedNamedProfileRoute {
final passwordRoute = GoRoute(
path: AppRoute.createSeedPassword.path,
builder: (_, GoRouterState state) => CreateSeedPasswordProfilePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
seedPhrase: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
name: state.pathParameters[enterSeedNameNamePathParam],
),
);
Expand All @@ -164,10 +163,9 @@ GoRoute get createSeedNamedProfileRoute {
GoRoute(
path: AppRoute.checkSeed.path,
builder: (_, state) => CheckSeedPhrasePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
seed: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
),
routes: [
passwordRoute,
Expand All @@ -188,13 +186,14 @@ GoRoute get enterSeedNamedProfileRoute {
routes: [
GoRoute(
path: AppRoute.createSeedPassword.path,
builder: (_, GoRouterState state) => CreateSeedPasswordProfilePage(
phrase: (jsonDecode(
state.uri.queryParameters[addSeedPhraseQueryParam]!,
) as List<dynamic>)
.cast<String>(),
name: state.pathParameters[enterSeedNameNamePathParam],
),
builder: (_, GoRouterState state) {
return CreateSeedPasswordProfilePage(
seedPhrase: SeedPhraseModel(
state.uri.queryParameters[addSeedPhraseQueryParam],
),
name: state.pathParameters[enterSeedNameNamePathParam],
);
},
),
],
);
Expand Down
22 changes: 22 additions & 0 deletions lib/data/models/seed/seed_phrase_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class SeedPhraseModel {
SeedPhraseModel(String? phrase) : phrase = phrase ?? '' {
_words = null;
}

SeedPhraseModel.fromWords(List<String> list) {
phrase = list.join(' ');
_words = list;
}

SeedPhraseModel.empty() : this(null);

late final String phrase;
late final List<String> words = _words ?? phrase.split(' ');

late final wordsCount = words.length;

late final isEmpty = phrase.isEmpty;
late final isNotEmpty = !isEmpty;

late final List<String>? _words;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:app/app/service/network_connection/network_connection_service.dart';
import 'package:app/app/service/service.dart';
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/di/di.dart';
import 'package:app/feature/add_seed/create_password/model/password_status.dart';
import 'package:app/utils/mixins/connection_mixin.dart';
Expand All @@ -19,8 +20,8 @@ const _minPasswordLength = 8;
class CreateSeedPasswordCubit extends Cubit<CreateSeedPasswordState>
with ConnectionMixin {
CreateSeedPasswordCubit({
required this.phrase,
required this.completeCallback,
required this.seedPhrase,
this.setCurrentKey = false,
this.name,
}) : super(CreateSeedPasswordState.initial()) {
Expand All @@ -32,7 +33,7 @@ class CreateSeedPasswordCubit extends Cubit<CreateSeedPasswordState>
final VoidCallback completeCallback;

/// Phrase that must be used to create seed
final List<String> phrase;
final SeedPhraseModel seedPhrase;

/// Name of seed phrase if provided
final String? name;
Expand Down Expand Up @@ -67,7 +68,7 @@ class CreateSeedPasswordCubit extends Cubit<CreateSeedPasswordState>
}

Future<void> nextAction() async {
if (!await checkConnection()) {
if (seedPhrase.isEmpty || !await checkConnection()) {
return;
}

Expand All @@ -76,7 +77,7 @@ class CreateSeedPasswordCubit extends Cubit<CreateSeedPasswordState>
final currentKeyService = inject<CurrentKeyService>();
try {
final publicKey = await nekoton.addSeed(
phrase: phrase,
phrase: seedPhrase.words,
password: passwordController.text,
name: name,
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/feature/add_seed/create_password/model/password_status.dart';
import 'package:app/feature/add_seed/create_password/screens/create_seed_password/create_seed_password_screen_wm.dart';
import 'package:app/feature/add_seed/create_password/view/create_seed_password_view.dart';
Expand All @@ -15,7 +16,7 @@ class CreateSeedPasswordScreen
CreateSeedPasswordScreen({
Key? key,
WidgetModelFactory<CreateSeedPasswordScreenWidgetModel>? wmFactory,
String? phrase,
SeedPhraseModel? phrase,
}) : super(
wmFactory ??
(context) => defaultCreateSeedPasswordScreenWidgetModelFactory(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:app/app/service/biometry_service.dart';
import 'package:app/app/service/messenger/message.dart';
import 'package:app/app/service/messenger/service/messenger_service.dart';
import 'package:app/app/service/nekoton_related/current_key_service.dart';
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/feature/add_seed/create_password/screens/create_seed_password/create_seed_password_screen.dart';
import 'package:app/feature/constants.dart';
import 'package:elementary/elementary.dart';
Expand All @@ -23,16 +24,22 @@ class CreateSeedPasswordScreenModel extends ElementaryModel {
final CurrentKeyService _currentKeyService;
final MessengerService _messengerService;
final NekotonRepository _nekotonRepository;
final String? _phrase;
final SeedPhraseModel? _phrase;

Future<void> next({
required String password,
}) async {
late SeedPhraseModel seed;

try {
final phrase = _phrase?.split(' ') ?? await _createSeed();
if (_phrase?.isNotEmpty ?? false) {
seed = _phrase!;
} else {
seed = await _createSeed();
}

final publicKey = await _nekotonRepository.addSeed(
phrase: phrase,
phrase: seed.words,
password: password,
);

Expand All @@ -48,8 +55,8 @@ class CreateSeedPasswordScreenModel extends ElementaryModel {
}
}

Future<List<String>> _createSeed() async {
Future<SeedPhraseModel> _createSeed() async {
final seed = await generateKey(accountType: defaultMnemonicType);
return seed.words;
return SeedPhraseModel.fromWords(seed.words);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:app/app/router/routs/add_seed/add_seed.dart';
import 'package:app/core/error_handler_factory.dart';
import 'package:app/core/wm/custom_wm.dart';
import 'package:app/core/wm/navigation_wm_mixin.dart';
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/di/di.dart';
import 'package:app/feature/add_seed/create_password/model/password_status.dart';
import 'package:app/feature/add_seed/create_password/screens/create_seed_password/create_seed_password_screen.dart';
Expand All @@ -15,7 +16,7 @@ import 'package:ui_components_lib/v2/ui_components_lib_v2.dart';
CreateSeedPasswordScreenWidgetModel
defaultCreateSeedPasswordScreenWidgetModelFactory(
BuildContext context, {
String? phrase,
SeedPhraseModel? phrase,
}) {
return CreateSeedPasswordScreenWidgetModel(
CreateSeedPasswordScreenModel(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:app/app/router/app_route.dart';
import 'package:app/data/models/seed/seed_phrase_model.dart';
import 'package:app/feature/add_seed/create_password/create_password.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
Expand All @@ -13,19 +14,19 @@ typedef _Cubit = CreateSeedPasswordCubit;
class CreateSeedPasswordProfilePage extends StatelessWidget {
/// {@macro create_seed_password_profile_page}
const CreateSeedPasswordProfilePage({
required this.phrase,
required this.name,
required this.seedPhrase,
super.key,
});

final List<String> phrase;
final SeedPhraseModel seedPhrase;
final String? name;

@override
Widget build(BuildContext context) {
return BlocProvider<CreateSeedPasswordCubit>(
create: (context) => CreateSeedPasswordCubit(
phrase: phrase,
seedPhrase: seedPhrase,
name: name,
// When we do this flow from profile, navigate to profile root
completeCallback: () =>
Expand Down
10 changes: 6 additions & 4 deletions lib/feature/add_seed/import_wallet/data/import_wallet_data.dart
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
import 'package:app/data/models/seed/seed_phrase_model.dart';

class ImportWalletData {
ImportWalletData({
this.isPasted,
this.allowedData,
this.selectedValue,
this.words,
this.seed,
this.firstColumnWords,
this.secondColumnWords,
});

final bool? isPasted;
final List<int>? allowedData;
final int? selectedValue;
final List<String>? words;
final SeedPhraseModel? seed;
final List<String>? firstColumnWords;
final List<String>? secondColumnWords;

ImportWalletData copyWith({
bool? isPasted,
List<int>? allowedData,
int? selectedValue,
List<String>? words,
SeedPhraseModel? seed,
List<String>? firstColumnWords,
List<String>? secondColumnWords,
}) {
return ImportWalletData(
isPasted: isPasted ?? this.isPasted,
allowedData: allowedData ?? this.allowedData,
selectedValue: selectedValue ?? this.selectedValue,
words: words,
seed: seed,
firstColumnWords: firstColumnWords,
secondColumnWords: secondColumnWords,
);
Expand Down
Loading
Loading