Compare commits

...

5 Commits

Author SHA1 Message Date
poka 1295d44665 WIP: Use slideshow for onboadring 2022-05-22 10:08:06 +02:00
poka 847619bef0 fix: organisation name 2022-05-22 01:42:43 +02:00
poka 5472a03bf3 fix: debug name 2022-05-21 06:52:30 +02:00
poka 3df8b44d67 so much UI changes/refacto 2022-05-21 06:47:26 +02:00
poka 81d1b7dd30 WIP: Bad icon 2022-05-20 16:02:42 +02:00
51 changed files with 623 additions and 831 deletions

View File

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gecko">
package="gecko.axiomteam.fr">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->

View File

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gecko">
package="gecko.axiomteam.fr">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
@ -19,6 +19,8 @@
<activity
android:requestLegacyExternalStorage="true"
android:name=".MainActivity"
android:resource="@style/NormalTheme"
android:icon="@mipmap/ic_launcher"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
@ -29,16 +31,12 @@
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
<!-- <meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
android:icon="@mipmap/ic_launcher"
/> -->
<!-- Theme to apply as soon as Flutter begins rendering frames -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -1,4 +1,4 @@
package com.example.gecko
package gecko.axiomteam.fr
import io.flutter.embedding.android.FlutterActivity

View File

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gecko">
package="gecko.axiomteam.fr">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

View File

@ -299,7 +299,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.gecko;
PRODUCT_BUNDLE_IDENTIFIER = gecko.axiomteam.fr;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@ -431,7 +431,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.gecko;
PRODUCT_BUNDLE_IDENTIFIER = gecko.axiomteam.fr;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -458,7 +458,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.gecko;
PRODUCT_BUNDLE_IDENTIFIER = gecko.axiomteam.fr;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;

View File

@ -29,6 +29,8 @@ String cesiumPod = "https://g1.data.presles.fr";
// Responsive ratios
late bool isTall;
late double ratio;
late double screenWidth;
late double screenHeight;
// Logger
var log = Logger();
@ -37,7 +39,7 @@ var log = Logger();
Color orangeC = const Color(0xffd07316);
Color yellowC = const Color(0xffFFD68E);
Color floattingYellow = const Color(0xffEFEFBF);
Color backgroundColor = const Color(0xFFF5F5F5);
Color backgroundColor = const Color(0xfff9f9f1);
// Substrate settings
const int ss58 = 42;

View File

@ -155,25 +155,6 @@ class GenerateWalletsProvider with ChangeNotifier {
notifyListeners();
}
Future<durt.NewWallet?> generateWallet(String generatedMnemonic,
{required bool isImport}) async {
try {
actualWallet = await durt.Dewif().generateDewif(
generatedMnemonic, durt.randomSecretCode(pinLength),
lang: appLang);
} catch (e) {
log.e(e);
}
if (!isImport) {
mnemonicController.text = generatedMnemonic;
pin.text = actualWallet!.password;
}
// notifyListeners();
return actualWallet;
}
String changePinCode({required bool reload}) {
pin.text = durt.randomSecretCode(pinLength);
if (reload) {
@ -229,56 +210,6 @@ class GenerateWalletsProvider with ChangeNotifier {
log.d(_walletPubkey);
}
// Future<int?> importCesiumWallet() async {
// // String _walletPubkey = await DubpRust.getLegacyPublicKey(
// // salt: _cesiumID, password: _cesiumPWD);
// // String shortPubkey = truncate(_walletPubkey, 9,
// // omission: "...", position: TruncatePosition.end);
// // await storeWallet(
// // actualWallet, 'Portefeuille Cesium - $shortPubkey', context);
// // NewWallet myCesiumWallet = await DubpRust.genWalletFromDeprecatedSaltPassword(salt: _cesiumID, password: _cesiumPWD);
// cesiumID.text = '';
// cesiumPWD.text = '';
// cesiumPubkey.text = '';
// canImport = false;
// isCesiumIDVisible = false;
// isCesiumPWDVisible = false;
// int chestNumber = 0;
// chestBox.toMap().forEach((key, value) {
// if (value.isCesium!) {
// chestNumber++;
// }
// });
// String chestName;
// if (chestNumber == 0) {
// chestName = 'Coffre à Césium';
// } else {
// chestName = 'Coffre à Césium ${chestNumber + 1}';
// }
// log.d(pin.text);
// durt.NewWallet cesiumDewif =
// await durt.Dewif().generateCesiumDewif(cesiumWallet.seed, pin.text);
// ChestData cesiumChest = ChestData(
// dewif: cesiumDewif.dewif,
// name: chestName,
// imageName: 'cesium.png',
// defaultWallet: 0,
// isCesium: true);
// await chestBox.add(cesiumChest).then((value) => null);
// int? chestKey = await chestBox.toMap().keys.last;
// // chestBox.toMap().
// await configBox.put('currentChest', chestKey);
// pin.text = '';
// return chestKey;
// }
void cesiumIDisVisible() {
isCesiumIDVisible = !isCesiumIDVisible;
notifyListeners();
@ -371,25 +302,6 @@ class GenerateWalletsProvider with ChangeNotifier {
}
}
Future<bool> isSentenceValid() async {
String inputMnemonic =
'${cellController0.text} ${cellController1.text} ${cellController2.text} ${cellController3.text} ${cellController4.text} ${cellController5.text} ${cellController6.text} ${cellController7.text} ${cellController8.text} ${cellController9.text} ${cellController10.text} ${cellController11.text}';
// Needed for bad encoding of UTF-8
inputMnemonic = inputMnemonic.replaceAll('é', '');
inputMnemonic = inputMnemonic.replaceAll('è', '');
durt.NewWallet? generatedWallet =
await generateWallet(inputMnemonic, isImport: true);
if (generatedWallet == null) {
return false;
} else {
generatedMnemonic = inputMnemonic;
return true;
}
}
Future pasteMnemonic(BuildContext context) async {
final sentence = await Clipboard.getData('text/plain');
int nbr = 0;

View File

@ -26,7 +26,7 @@ class MyWalletsProvider with ChangeNotifier {
// configBox.delete('endpoint');
if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == '') {
log.d('No endpoint, configure...');
configBox.put('endpoint', 'ws://192.168.1.72:9944');
configBox.put('endpoint', 'ws://127.0.0.1:9944');
}
if (chestBox.isEmpty) {

View File

@ -315,6 +315,14 @@ class SubstrateSdk with ChangeNotifier {
return await importAccount(fromMnemonic: true, derivePath: '//$number');
}
Future<bool> isMnemonicValid(String mnemonic) async {
// Needed for bad encoding of UTF-8
mnemonic = mnemonic.replaceAll('é', '');
mnemonic = mnemonic.replaceAll('è', '');
return await sdk.api.keyring.checkMnemonicValid(mnemonic);
}
}
void snack(BuildContext context, String message, {int duration = 2}) {
@ -339,8 +347,10 @@ void snackNode(BuildContext context, bool isConnected) {
_message =
"Vous êtes connecté au noeud\n${configBox.get('endpoint').split('//')[1]}";
}
final snackBar =
SnackBar(content: Text(_message), duration: const Duration(seconds: 2));
final snackBar = SnackBar(
padding: const EdgeInsets.all(20),
content: Text(_message, style: const TextStyle(fontSize: 16)),
duration: const Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}

View File

@ -4,10 +4,11 @@ import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
import 'package:truncate/truncate.dart';
class WalletOptionsProvider with ChangeNotifier {
@ -25,33 +26,16 @@ class WalletOptionsProvider with ChangeNotifier {
Future<NewWallet>? get badWallet => null;
int getPinLenght(_walletNbr) {
// TODOo: Get real Dewif lenght
// String _localDewif;
// if (_walletNbr is int || _walletNbr == null) {
// _localDewif = chestBox.get(configBox.get('currentChest')).dewif;
// } else {
// _localDewif = _walletNbr;
// }
// final int _pinLenght = DubpRust.getDewifSecretCodeLen(
// dewif: _localDewif, secretCodeType: SecretCodeType.letters);
return pinLength;
}
void _renameWallet(List<int?> _walletID, _newName,
void _renameWallet(List<int?> _walletID, String _newName,
{required bool isCesium}) async {
if (isCesium) {
ChestData _chestTarget = chestBox.get(_walletID[0])!;
_chestTarget.name = _newName;
await chestBox.put(_chestTarget.key, _chestTarget);
} else {
MyWalletsProvider myWalletClass = MyWalletsProvider();
MyWalletsProvider myWalletClass = MyWalletsProvider();
WalletData _walletTarget = myWalletClass.getWalletData(_walletID)!;
_walletTarget.name = _newName;
await walletBox.put(_walletTarget.key, _walletTarget);
}
WalletData _walletTarget = myWalletClass.getWalletData(_walletID)!;
_walletTarget.name = _newName;
await walletBox.put(_walletTarget.key, _walletTarget);
_newWalletName.text = '';
}
@ -124,14 +108,6 @@ class WalletOptionsProvider with ChangeNotifier {
);
}
snackCopyKey(context) {
const snackBar = SnackBar(
content:
Text("Cette clé publique a été copié dans votre presse-papier."),
duration: Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
String getShortPubkey(String pubkey) {
List<int> pubkeyByte = Base58Decode(pubkey);
Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes);
@ -161,10 +137,14 @@ class WalletOptionsProvider with ChangeNotifier {
if (pickedFile != null) {
_image = File(pickedFile.path);
////TODO: Store image on disk, store path in walletBox.imagePath
log.i(pickedFile.path);
return _image;
} else {
log.w('No image selected.');
return null;
}
}
@ -186,3 +166,30 @@ class WalletOptionsProvider with ChangeNotifier {
return _address;
}
}
Widget balance(BuildContext context, String address, double size) {
String balanceCache = '';
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, _sdk, _) {
return FutureBuilder(
future: _sdk.getBalance(address),
builder: (BuildContext context, AsyncSnapshot<num?> _balance) {
if (_balance.connectionState != ConnectionState.done ||
_balance.hasError) {
return Text(balanceCache,
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
));
}
balanceCache = "${_balance.data.toString()} $currencyName";
return Text(
balanceCache,
style: TextStyle(
fontSize: isTall ? size : 18,
),
);
});
}),
]);
}

View File

@ -239,25 +239,6 @@ class WalletsProfilesProvider with ChangeNotifier {
return num.parse(result);
}
snackCopyKey(context) {
const snackBar = SnackBar(
padding: EdgeInsets.all(20),
content:
Text("Cette clé publique a été copié dans votre presse-papier."),
duration: Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
void switchProfileView() {
isHistoryScreen = !isHistoryScreen;
if (isHistoryScreen) {
historySwitchButtun = "Payer";
} else {
historySwitchButtun = "Voir l'historique";
}
notifyListeners();
}
String generateIdenticon(String _pubkey) {
return Jdenticon.toSvg(_pubkey);
}
@ -285,3 +266,12 @@ class WalletsProfilesProvider with ChangeNotifier {
return balance;
}
}
snackCopyKey(context) {
const snackBar = SnackBar(
padding: EdgeInsets.all(20),
content: Text("Cette clé publique a été copié dans votre presse-papier.",
style: TextStyle(fontSize: 16)),
duration: Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}

View File

@ -403,7 +403,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
key: const Key('copyPubkey'),
onTap: () {
Clipboard.setData(ClipboardData(text: pubkey));
_historyProvider.snackCopyKey(context);
snackCopyKey(context);
},
child: Text(
_historyProvider.getShortPubkey(pubkey!),

View File

@ -10,6 +10,7 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/screens/onBoarding/onboarding.dart';
import 'package:gecko/screens/search.dart';
import 'package:gecko/screens/settings.dart';
import 'package:flutter/services.dart';
@ -30,7 +31,8 @@ class HomeScreen extends StatelessWidget {
final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
screenWidth = MediaQuery.of(context).size.width;
screenHeight = MediaQuery.of(context).size.height;
isTall = false;
ratio = 1;
@ -71,7 +73,7 @@ class HomeScreen extends StatelessWidget {
),
ListTile(
key: const Key('substrateSandbox'),
title: const Text('SUBSTRATE SANDBOX'),
title: const Text('Substrate debug'),
onTap: () {
Navigator.pop(context);
Navigator.push(
@ -485,7 +487,7 @@ Widget welcomeHome(context) {
context,
MaterialPageRoute(
builder: (context) {
return OnboardingStepOne();
return const OnBoardingPage(); //OnBoardingPage(); //OnboardingStepOne();
},
),
);

View File

@ -1,410 +0,0 @@
import 'dart:async';
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/queries.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/history.dart';
import 'package:gecko/screens/myWallets/change_pin.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
import 'package:flutter/services.dart';
import 'package:qr_flutter/qr_flutter.dart';
bool _isNewNameValid = false;
class CesiumWalletOptions extends StatelessWidget {
const CesiumWalletOptions(
{Key? key, Key? keyMyWallets, required this.cesiumWallet})
: super(key: key);
final ChestData cesiumWallet;
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
ChestProvider _chestProvider =
Provider.of<ChestProvider>(context, listen: false);
WalletsProfilesProvider _historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
final String shortPubkey =
_walletOptions.getShortPubkey(_walletOptions.address.text);
if (_isNewNameValid == false) {
_walletOptions.nameController.text = cesiumWallet.name!;
} else {
cesiumWallet.name = _walletOptions.nameController.text;
}
return WillPopScope(
onWillPop: () {
_walletOptions.isEditing = false;
_walletOptions.isBalanceBlur = true;
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
return Future<bool>.value(true);
},
child: Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
toolbarHeight: 60 * ratio,
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_walletOptions.isEditing = false;
_walletOptions.isBalanceBlur = true;
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
}),
title: SizedBox(
height: 22,
child: Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return Text(_walletOptions.nameController.text);
}),
),
),
body: Builder(
builder: (ctx) => SafeArea(
child: Column(children: <Widget>[
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
yellowC,
const Color(0xfffafafa),
],
)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
const Spacer(flex: 1),
InkWell(
onTap: () async {
File newAvatar =
await (_walletOptions.changeAvatar());
cesiumWallet.imageFile = newAvatar;
_walletOptions.reloadBuild();
},
child: cesiumWallet.imageFile == null
? Image.asset(
'assets/chests/${cesiumWallet.imageName}',
width: 110,
)
: Image.file(cesiumWallet.imageFile!, width: 110),
),
InkWell(
onTap: () async {
File newAvatar =
await (_walletOptions.changeAvatar());
cesiumWallet.imageFile = newAvatar;
_walletOptions.reloadBuild();
},
child: Column(children: <Widget>[
Image.asset(
'assets/walletOptions/camera.png',
height: 40,
),
const SizedBox(height: 80)
])),
const Spacer(flex: 1),
Column(children: <Widget>[
SizedBox(
width: 260,
child: TextField(
key: const Key('walletName'),
autofocus: false,
focusNode: _walletOptions.walletNameFocus,
enabled: _walletOptions.isEditing,
controller: _walletOptions.nameController,
minLines: 1,
maxLines: 3,
textAlign: TextAlign.center,
decoration: const InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
disabledBorder: InputBorder.none,
contentPadding: EdgeInsets.all(15.0),
),
style: TextStyle(
fontSize: isTall ? 27 : 23,
color: Colors.black,
fontWeight: FontWeight.w400,
)),
),
SizedBox(height: isTall ? 5 : 0),
Query(
options: QueryOptions(
document: gql(getBalance),
variables: {
'pubkey': _walletOptions.address.text,
},
// pollInterval: Duration(seconds: 1),
),
builder: (QueryResult result,
{VoidCallback? refetch, FetchMore? fetchMore}) {
if (result.hasException) {
return Text(result.exception.toString());
}
if (result.isLoading) {
return const Text('Loading');
}
// List repositories = result.data['viewer']['repositories']['nodes'];
String wBalanceUD;
if (result.data!['balance'] == null) {
wBalanceUD = '0.0';
} else {
int wBalanceG1 =
result.data!['balance']['amount'];
int currentUD =
result.data!['currentUd']['amount'];
double wBalanceUDBrut =
wBalanceG1 / currentUD; // .toString();
wBalanceUD = double.parse(
(wBalanceUDBrut).toStringAsFixed(2))
.toString();
}
return Row(children: <Widget>[
ImageFiltered(
imageFilter: ImageFilter.blur(
sigmaX: _walletOptions.isBalanceBlur
? 6
: 0.001,
sigmaY: _walletOptions.isBalanceBlur
? 5
: 0.001),
child: Text(wBalanceUD,
style: TextStyle(
fontSize: isTall ? 20 : 18,
color: Colors.black)),
),
Text(' DU',
style: TextStyle(
fontSize: isTall ? 20 : 18,
color: Colors.black))
]);
// Text(
// '$wBalanceUD DU',
// style: TextStyle(
// fontSize: 20, color: Colors.black),
// );
},
),
const SizedBox(height: 5),
InkWell(
key: const Key('displayBalance'),
onTap: () {
_walletOptions.bluringBalance();
},
child: Image.asset(
_walletOptions.isBalanceBlur
? 'assets/walletOptions/icon_oeuil.png'
: 'assets/walletOptions/icon_oeuil_close.png',
height: 35,
),
),
]),
Column(children: <Widget>[
InkWell(
key: const Key('renameWallet'),
onTap: () async {
_isNewNameValid = _walletOptions.editWalletName(
[cesiumWallet.key, 0],
isCesium: cesiumWallet.isCesium);
await Future.delayed(
const Duration(milliseconds: 30));
_walletOptions.walletNameFocus.requestFocus();
},
child: ClipRRect(
child: Image.asset(
_walletOptions.isEditing
? 'assets/walletOptions/android-checkmark.png'
: 'assets/walletOptions/edit.png',
width: 20,
height: 20),
)),
const SizedBox(
height: 60,
)
]),
const Spacer(flex: 3),
]),
);
}),
SizedBox(height: 4 * ratio),
QrImageWidget(
data: _walletOptions.address.text,
version: QrVersions.auto,
size: isTall ? 300 : 270,
),
SizedBox(height: 15 * ratio),
GestureDetector(
key: const Key('copyPubkey'),
onTap: () {
Clipboard.setData(
ClipboardData(text: _walletOptions.address.text));
_walletOptions.snackCopyKey(ctx);
},
child: SizedBox(
height: 50,
child: Row(children: <Widget>[
const SizedBox(width: 30),
Image.asset(
'assets/walletOptions/key.png',
height: 45,
),
const SizedBox(width: 20),
Text("${shortPubkey.split(':')[0]}:",
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.w800,
fontFamily: 'Monospace',
color: Colors.black)),
Text(shortPubkey.split(':')[1],
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.w800,
fontFamily: 'Monospace')),
const SizedBox(width: 15),
SizedBox(
height: 40,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
elevation: 1,
primary: orangeC, // background
onPrimary: Colors.black, // foreground
),
onPressed: () {
Clipboard.setData(ClipboardData(
text: _walletOptions.address.text));
_walletOptions.snackCopyKey(ctx);
},
child: Row(children: <Widget>[
Image.asset(
'assets/walletOptions/copy-white.png',
height: 25,
),
const SizedBox(width: 7),
Text('Copier',
style: TextStyle(
fontSize: 15, color: Colors.grey[50]))
]))),
]))),
SizedBox(height: 10 * ratio),
InkWell(
key: const Key('displayHistory'),
onTap: () {
_historyProvider.nPage = 1;
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return HistoryScreen(
pubkey: _walletOptions.address.text);
}),
);
},
child: SizedBox(
height: 50,
child: Row(children: <Widget>[
const SizedBox(width: 30),
Image.asset(
'assets/walletOptions/clock.png',
height: 45,
),
const SizedBox(width: 22),
const Text('Historique des transactions',
style:
TextStyle(fontSize: 20, color: Colors.black)),
]))),
SizedBox(height: 7 * ratio),
InkWell(
key: const Key('changePin'),
onTap: () async {
// await _chestProvider.changePin(context, cesiumWallet);
String? newPin = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ChangePinScreen(
walletName: cesiumWallet.name,
walletProvider: _myWalletProvider,
);
},
),
);
if (newPin != null) _myWalletProvider.pinCode = newPin;
},
child: SizedBox(
height: 50,
child: Row(children: <Widget>[
const SizedBox(width: 31),
Image.asset(
'assets/chests/secret_code.png',
height: 24,
),
const SizedBox(width: 20),
const Text('Changer mon code secret',
style: TextStyle(fontSize: 20, color: Colors.black)),
]),
),
),
SizedBox(height: 7 * ratio),
InkWell(
key: const Key('deleteWallet'),
onTap: () async {
await _chestProvider.deleteChest(context, cesiumWallet);
},
child: SizedBox(
height: 50,
child: Row(children: <Widget>[
const SizedBox(width: 33),
Image.asset(
'assets/walletOptions/trash.png',
height: 45,
),
const SizedBox(width: 21),
const Text(
'Supprimer ce coffre',
style: TextStyle(
fontSize: 20,
color: Color(0xffD80000),
),
),
]),
),
),
]),
),
),
),
);
}
}

View File

@ -55,7 +55,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
}),
title: const SizedBox(
height: 22,
child: Text('Enregistrer ce trousseau'),
child: Text('Enregistrer ce coffre'),
)),
body: Center(
child: Column(children: <Widget>[

View File

@ -1,4 +1,3 @@
import 'package:durt/durt.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
@ -48,7 +47,7 @@ class GenerateFastChestScreen extends StatelessWidget {
}),
title: const SizedBox(
height: 22,
child: Text('Générer un trousseau'),
child: Text('Générer un coffre'),
)),
floatingActionButton: SizedBox(
height: 80.0,
@ -127,11 +126,6 @@ class GenerateFastChestScreen extends StatelessWidget {
? () async {
_generateWalletProvider.nbrWord =
_generateWalletProvider.getRandomInt();
_generateWalletProvider.actualWallet = await Dewif()
.generateDewif(
_generateWalletProvider.generatedMnemonic!,
_generateWalletProvider.pin.text,
lang: appLang);
await Navigator.push(
context,
MaterialPageRoute(builder: (context) {
@ -144,7 +138,7 @@ class GenerateFastChestScreen extends StatelessWidget {
);
}
: null,
child: const Text('Enregistrer ce trousseau',
child: const Text('Enregistrer ce coffre',
style: TextStyle(fontSize: 20))),
const SizedBox(height: 20),
GestureDetector(
@ -219,7 +213,7 @@ class PrintWallet extends StatelessWidget {
Navigator.pop(context);
}),
toolbarHeight: 60 * ratio,
title: const Text('Imprimer ce trousseau')),
title: const Text('Imprimer ce coffre')),
body: PdfPreview(
build: (format) => _generateWalletProvider.printWallet(sentence),
),

View File

@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/onBoarding/11.dart';
import 'package:provider/provider.dart';
@ -15,14 +16,19 @@ class RestoreChest extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
GenerateWalletsProvider genW =
Provider.of<GenerateWalletsProvider>(context, listen: false);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
generateWalletProvider.actualWallet = null;
genW.actualWallet = null;
if (genW.isSentenceComplete(context)) {
genW.generatedMnemonic =
'${genW.cellController0.text} ${genW.cellController1.text} ${genW.cellController2.text} ${genW.cellController3.text} ${genW.cellController4.text} ${genW.cellController5.text} ${genW.cellController6.text} ${genW.cellController7.text} ${genW.cellController8.text} ${genW.cellController9.text} ${genW.cellController10.text} ${genW.cellController11.text}';
}
return WillPopScope(
onWillPop: () {
generateWalletProvider.resetImportView();
genW.resetImportView();
return Future<bool>.value(true);
},
child: Scaffold(
@ -31,7 +37,7 @@ class RestoreChest extends StatelessWidget {
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
generateWalletProvider.resetImportView();
genW.resetImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
@ -48,32 +54,32 @@ class RestoreChest extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController0),
arrayCell(context, generateWalletProvider.cellController1),
arrayCell(context, generateWalletProvider.cellController2),
arrayCell(context, generateWalletProvider.cellController3),
arrayCell(context, genW.cellController0),
arrayCell(context, genW.cellController1),
arrayCell(context, genW.cellController2),
arrayCell(context, genW.cellController3),
]),
const SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController4),
arrayCell(context, generateWalletProvider.cellController5),
arrayCell(context, generateWalletProvider.cellController6),
arrayCell(context, generateWalletProvider.cellController7),
arrayCell(context, genW.cellController4),
arrayCell(context, genW.cellController5),
arrayCell(context, genW.cellController6),
arrayCell(context, genW.cellController7),
]),
const SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
arrayCell(context, generateWalletProvider.cellController8),
arrayCell(context, generateWalletProvider.cellController9),
arrayCell(context, generateWalletProvider.cellController10),
arrayCell(context, generateWalletProvider.cellController11),
arrayCell(context, genW.cellController8),
arrayCell(context, genW.cellController9),
arrayCell(context, genW.cellController10),
arrayCell(context, genW.cellController11),
]),
]),
// const Spacer(),
if (generateWalletProvider.isSentenceComplete(context))
if (genW.isSentenceComplete(context))
Expanded(
child: Align(
alignment: Alignment.center,
@ -87,8 +93,8 @@ class RestoreChest extends StatelessWidget {
onPrimary: Colors.white, // foreground
),
onPressed: () async {
if (await generateWalletProvider.isSentenceValid()) {
generateWalletProvider.resetImportView();
if (await _sub.isMnemonicValid(genW.generatedMnemonic!)) {
genW.resetImportView();
await Navigator.push(
context,
FaderTransition(
@ -121,7 +127,7 @@ class RestoreChest extends StatelessWidget {
onPrimary: Colors.black, // foreground
),
onPressed: () {
generateWalletProvider.pasteMnemonic(context);
genW.pasteMnemonic(context);
},
child: const Text(
'Coller depuis le\npresse-papier',
@ -193,7 +199,7 @@ class RestoreChest extends StatelessWidget {
return AlertDialog(
title: const Text('Phrase incorrecte'),
content: const Text(
'Votre phrase de restauration semble incorrecte, veuillez la corriger.'),
'Votre phrase de restauration semble incorrecte, les mots ne sont pas dans le bon ordre.\nVeuillez la corriger.'),
actions: <Widget>[
TextButton(
child: const Text("OK"),

View File

@ -8,7 +8,6 @@ import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:flutter/material.dart';
import 'package:gecko/screens/myWallets/cesium_wallet_options.dart';
import 'package:gecko/screens/myWallets/choose_chest.dart';
import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
@ -214,20 +213,12 @@ class UnlockingWallet extends StatelessWidget {
} else {
pinColor = Colors.green[400];
if (action == "mywallets") {
currentChest.isCesium!
? Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return CesiumWalletOptions(
cesiumWallet: currentChest);
}),
).then((value) => _myWalletProvider.mnemonic = '')
: Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
} else if (action == "pay") {
Navigator.push(
context,

View File

@ -1,11 +1,8 @@
import 'dart:async';
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/history.dart';
@ -92,13 +89,13 @@ class WalletOptions extends StatelessWidget {
Column(children: <Widget>[
walletName(walletProvider, _walletOptions),
SizedBox(height: isTall ? 5 : 0),
balance(context, walletProvider),
balance(context, walletProvider.address.text, 20),
]),
const Spacer(flex: 3),
]),
);
}),
SizedBox(height: 4 * ratio),
SizedBox(height: 10 * ratio),
QrImageWidget(
data: _walletOptions.address.text,
version: QrVersions.auto,
@ -132,8 +129,10 @@ class WalletOptions extends StatelessWidget {
children: <Widget>[
InkWell(
onTap: () async {
File newAvatar = await (walletProvider.changeAvatar());
wallet.imageFile = newAvatar;
wallet.imageFile = await (walletProvider.changeAvatar());
if (wallet.imageFile != null) {
walletBox.put(wallet.key, wallet);
}
walletProvider.reloadBuild();
},
child: wallet.imageFile == null
@ -151,8 +150,7 @@ class WalletOptions extends StatelessWidget {
top: 0,
child: InkWell(
onTap: () async {
File newAvatar = await (walletProvider.changeAvatar());
wallet.imageFile = newAvatar;
wallet.imageFile = await (walletProvider.changeAvatar());
walletProvider.reloadBuild();
},
child: Image.asset(
@ -223,52 +221,6 @@ class WalletOptions extends StatelessWidget {
);
}
Widget balance(BuildContext context, WalletOptionsProvider walletProvider) {
String balanceCache = '';
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, _sdk, _) {
return FutureBuilder(
future: _sdk.getBalance(walletProvider.address.text),
builder: (BuildContext context, AsyncSnapshot<num?> _balance) {
if (_balance.connectionState != ConnectionState.done ||
_balance.hasError) {
return Text(balanceCache,
style: TextStyle(
fontSize: isTall ? 20 : 18,
));
}
balanceCache = "${_balance.data.toString()} $currencyName";
return ImageFiltered(
imageFilter: ImageFilter.blur(
sigmaX: walletProvider.isBalanceBlur ? 6 : 0,
sigmaY: walletProvider.isBalanceBlur ? 5 : 0),
child: Text(
balanceCache,
style: TextStyle(
fontSize: isTall ? 20 : 18,
),
),
);
});
}),
const SizedBox(height: 15),
// InkWell(
// key: const Key('displayBalance'),
// onTap: () {
// walletProvider.bluringBalance();
// },
// child: Image.asset(
// walletProvider.isBalanceBlur
// ? 'assets/walletOptions/icon_oeuil.png'
// : 'assets/walletOptions/icon_oeuil_close.png',
// height: 35,
// ),
// ),
]);
}
Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) {
final String shortPubkey =
walletProvider.getShortPubkey(walletProvider.address.text);
@ -276,7 +228,7 @@ class WalletOptions extends StatelessWidget {
key: const Key('copyPubkey'),
onTap: () {
Clipboard.setData(ClipboardData(text: walletProvider.address.text));
walletProvider.snackCopyKey(ctx);
snackCopyKey(ctx);
},
child: SizedBox(
height: 50,
@ -313,7 +265,7 @@ class WalletOptions extends StatelessWidget {
onPressed: () {
Clipboard.setData(
ClipboardData(text: walletProvider.address.text));
walletProvider.snackCopyKey(ctx);
snackCopyKey(ctx);
},
child: Row(children: <Widget>[
Image.asset(

View File

@ -3,7 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/screens/onBoarding/onboarding.dart';
class NoKeyChainScreen extends StatelessWidget {
const NoKeyChainScreen({Key? key}) : super(key: key);
@ -39,7 +39,7 @@ class NoKeyChainScreen extends StatelessWidget {
Navigator.push(
context,
FaderTransition(
page: OnboardingStepOne(), isFast: true));
page: OnBoardingPage(), isFast: true));
}),
),
),

View File

@ -27,11 +27,11 @@ class OnboardingStepOne extends StatelessWidget {
common.onboardingProgressBar(
context, 'Nouveau portefeuilles', progress),
common.bubbleSpeak(
"Il semblerait que vous nayez pas encore de trousseau.\n\nUn trousseau vous permet de gérer un ou plusieurs portefeuilles.",
"Il semblerait que vous nayez pas encore de coffre.\n\nUn coffre vous permet de gérer un ou plusieurs portefeuilles.",
textKey: const Key('step1')),
const SizedBox(height: 90),
Image.asset(
'assets/onBoarding/keys-and-wallets-horizontal.png',
'assets/onBoarding/fabrication-de-portefeuille.png',
height: 200,
),
Expanded(
@ -53,7 +53,7 @@ class OnboardingStepOne extends StatelessWidget {
FaderTransition(
page: OnboardingStepTwo(), isFast: true));
},
child: const Text('Créer mon trousseau',
child: const Text('Créer mon coffre',
style: TextStyle(fontSize: 20))),
))),
const SizedBox(height: 80),

View File

@ -25,7 +25,7 @@ class OnboardingStepTwelve extends StatelessWidget {
common.onboardingProgressBar(
context, 'Ma phrase de restauration', progress),
common.bubbleSpeak(
"Si un jour vous changez de téléphone, votre code secret sera différent, mais il vous suffira de me redonner votre phrase de restauration pour recréer votre trousseau.",
"Si un jour vous changez de téléphone, votre code secret sera différent, mais il vous suffira de me redonner votre phrase de restauration pour recréer votre coffre.",
textKey: const Key('step10'),
),
const SizedBox(height: 10),

View File

@ -25,7 +25,7 @@ class OnboardingStepFiveteen extends StatelessWidget {
common.onboardingProgressBar(
context, 'Ma phrase de restauration', progress),
common.bubbleSpeak(
"Top !\n\nVotre trousseau de clef et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
"Top !\n\nVotre coffre de clef et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
textKey: const Key('step13'),
),
SizedBox(height: isTall ? 20 : 10),

View File

@ -28,7 +28,7 @@ class OnboardingStepTwo extends StatelessWidget {
common.onboardingProgressBar(
context, 'Nouveau portefeuilles', progress),
common.bubbleSpeak(
"Un trousseau est créé à partir dune phrase de restauration.",
"Un coffre est créé à partir dune phrase de restauration.",
textKey: const Key('step2'),
),
const SizedBox(height: 70),

View File

@ -25,7 +25,7 @@ class OnboardingStepFor extends StatelessWidget {
common.onboardingProgressBar(
context, 'Ma phrase de restauration', progress),
common.bubbleSpeak(
"Si un jour vous changez de téléphone, il vous suffira de me redonner votre phrase de restauration pour recréer votre trousseau.",
"Si un jour vous changez de téléphone, il vous suffira de me redonner votre phrase de restauration pour recréer votre coffre.",
textKey: const Key('step3'),
),
SizedBox(height: isTall ? 15 : 0),

View File

@ -25,7 +25,7 @@ class OnboardingStepFive extends StatelessWidget {
common.onboardingProgressBar(
context, 'Ma phrase de restauration', progress),
common.bubbleSpeak(
"Par contre, attention :\n\nDans une blockchain, il ny a pas de procédure de récupération de trousseau.\n\nSi vous perdez votre phrase de restauration, je ne pourrai pas vous la communiquer, et vous ne pourrez donc plus jamais accéder à votre compte.",
"Par contre, attention :\n\nDans une blockchain, il ny a pas de procédure de récupération de coffre.\n\nSi vous perdez votre phrase de restauration, je ne pourrai pas vous la communiquer, et vous ne pourrez donc plus jamais accéder à votre compte.",
textKey: const Key('step4'),
),
SizedBox(height: isTall ? 30 : 10),

View File

@ -21,7 +21,7 @@ class OnboardingStepNine extends StatelessWidget {
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context);
Provider.of<GenerateWalletsProvider>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
CommonElements common = CommonElements();
@ -58,24 +58,26 @@ class OnboardingStepNine extends StatelessWidget {
),
),
Expanded(
child: Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
width: 400,
height: 62,
child: ElevatedButton(
key: const Key('generateMnemonic'),
style: ElevatedButton.styleFrom(
elevation: 5,
primary: const Color(0xffFFD58D),
onPrimary: Colors.black, // foreground
),
onPressed: () {
_generateWalletProvider.reloadBuild();
},
child: const Text("Choisir une autre phrase",
style: TextStyle(fontSize: 20))),
))),
child: Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
width: 400,
height: 62,
child: ElevatedButton(
key: const Key('generateMnemonic'),
style: ElevatedButton.styleFrom(
elevation: 5,
primary: const Color(0xffFFD58D),
onPrimary: Colors.black, // foreground
),
onPressed: () {
_generateWalletProvider.reloadBuild();
},
child: const Text("Choisir une autre phrase",
style: TextStyle(fontSize: 20))),
),
),
),
const SizedBox(height: 25),
SizedBox(
width: 400,
@ -135,12 +137,12 @@ Widget sentanceArray(BuildContext context) {
// ];
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
padding: const EdgeInsets.symmetric(horizontal: 3),
child: Container(
constraints: const BoxConstraints(maxWidth: 450),
decoration: BoxDecoration(
border: Border.all(color: Colors.black),
color: Colors.grey[300],
color: const Color(0xffeeeedd),
borderRadius: const BorderRadius.all(
Radius.circular(10),
)),
@ -186,17 +188,16 @@ Widget sentanceArray(BuildContext context) {
Widget arrayCell(dataWord) {
return SizedBox(
width: 102,
width: 100,
child: Column(children: <Widget>[
Text(
dataWord.split(':')[0],
style: const TextStyle(fontSize: 14),
style: const TextStyle(fontSize: 15, color: Color(0xff6b6b52)),
),
const SizedBox(height: 2),
Text(
dataWord.split(':')[1],
key: Key('word${dataWord.split(':')[0]}'),
style: const TextStyle(fontSize: 19, color: Colors.black),
style: const TextStyle(fontSize: 20, color: Colors.black),
),
]),
);
@ -221,7 +222,7 @@ class PrintWallet extends StatelessWidget {
Navigator.pop(context);
}),
toolbarHeight: 60 * ratio,
title: const Text('Imprimer ce trousseau')),
title: const Text('Imprimer ce coffre')),
body: PdfPreview(
build: (format) => _generateWalletProvider.printWallet(sentence),
),

View File

@ -33,7 +33,7 @@ class OnboardingStepEleven extends StatelessWidget {
style: TextStyle(fontWeight: FontWeight.bold)),
const TextSpan(
text:
" \n\nVotre code secret chiffre votre trousseau de clefs, ce qui le rend inutilisable par dautres, par exemple si vous perdez votre téléphone ou si on vous le vole."),
" \n\nVotre code secret chiffre votre coffre de clefs, ce qui le rend inutilisable par dautres, par exemple si vous perdez votre téléphone ou si on vous le vole."),
],
textKey: const Key('step9'),
),

View File

@ -0,0 +1,307 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/generate_wallets.dart';
import 'package:introduction_screen/introduction_screen.dart';
import 'package:provider/provider.dart';
import '7.dart';
class OnBoardingPage extends StatefulWidget {
const OnBoardingPage({Key? key}) : super(key: key);
@override
_OnBoardingPageState createState() => _OnBoardingPageState();
}
class _OnBoardingPageState extends State<OnBoardingPage> {
final introKey = GlobalKey<IntroductionScreenState>();
bool isFreeze = false;
void _onIntroEnd(context) {
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => HomePage()),
);
}
Widget _buildImage(String assetName, [double width = 350]) {
return Container(
padding: const EdgeInsets.all(0),
width: 440,
decoration: BoxDecoration(
gradient: const LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xffd2d4cf),
Color(0xffeaeae7),
],
),
border: Border.all(color: Colors.grey[900]!)),
child: Image.asset('assets/onBoarding/$assetName', width: width));
}
Widget _buildText(String text, [double size = 20]) {
return Container(
padding: const EdgeInsets.all(12),
width: 440,
decoration: BoxDecoration(
color: Colors.white, border: Border.all(color: Colors.grey[900]!)),
child: Text(
text,
style: TextStyle(fontSize: size),
),
);
}
Widget _nextButton() {
return SizedBox(
width: 410,
height: 70,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 4,
primary: orangeC, // background
onPrimary: Colors.white, // foreground
),
onPressed: () {
introKey.currentState?.next();
},
child: const Text(
'Continuer',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600),
),
),
);
}
@override
Widget build(BuildContext context) {
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false);
const bodyStyle = TextStyle(fontSize: 19.0);
var pageDecoration = PageDecoration(
titleTextStyle:
const TextStyle(fontSize: 28.0, fontWeight: FontWeight.w700),
bodyTextStyle: bodyStyle,
bodyPadding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
pageColor: backgroundColor,
imagePadding: EdgeInsets.zero,
);
log.d(introKey.currentState?.controller.page);
return IntroductionScreen(
controlsPosition: const Position(left: 0, right: 0, bottom: 0),
freeze: false,
isProgressTap: false,
isTopSafeArea: false,
isBottomSafeArea: true,
key: introKey,
globalBackgroundColor: backgroundColor,
globalFooter:
SizedBox(width: double.infinity, height: 60, child: _nextButton()),
pages: [
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Gecko fabrique votre portefeuille à partir dune phrase de restauration. Elle un peu le comme un plan qui permet de construire votre portefeuille.'),
_buildImage('fabrication-de-portefeuille.png'),
// const SizedBox(height: 40),
// _nextButton()
],
),
decoration: pageDecoration,
),
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Conservez cette phrase précieusement, car sans elle Gecko ne pourra pas reconstruire vos portefeuilles le jour où vous changez de téléphone.'),
_buildImage(
'fabrication-de-portefeuille-impossible-sans-phrase.png')
],
),
decoration: pageDecoration,
),
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Dans une blockchain, pas de procédure de récupération par mail. Seule votre phrase de restauration peut vous permettre de récupérer vos Ğ1 à tout moment.'),
_buildImage('mot-de-passe-oublie.png')
],
),
decoration: pageDecoration,
),
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Il est temps de vous munir dun dun papier et dun crayon afin de pouvoir noter votre phrase de restauration.'),
_buildImage('gecko-oublie-aussi.png')
],
),
decoration: pageDecoration,
),
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Gecko a généré votre phrase de restauration ! Tâchez de la garder bien secrète, car elle permet à quiconque la connaît daccéder à tous vos portefeuilles.'),
const SizedBox(height: 40),
sentanceArray(context),
const SizedBox(height: 20),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return PrintWallet(
_generateWalletProvider.generatedMnemonic);
}),
);
},
child: Image.asset(
'assets/printer.png',
height: 35,
),
),
const SizedBox(height: 40),
// const Spacer(),
SizedBox(
width: 400,
height: 62,
child: ElevatedButton(
key: const Key('generateMnemonic'),
style: ElevatedButton.styleFrom(
elevation: 5,
primary: const Color(0xffFFD58D),
onPrimary: Colors.black, // foreground
),
onPressed: () {
_generateWalletProvider.reloadBuild();
// setState(() {});
},
child: const Text("Choisir une autre phrase",
style: TextStyle(
fontSize: 21, fontWeight: FontWeight.w600))),
),
// const Spacer(),
],
),
decoration: pageDecoration,
),
PageViewModel(
title: '',
body: '',
footer: Column(
children: [
_buildText(
'Gecko fabrique votre portefeuille à partir dune phrase de restauration. Elle un peu le comme un plan qui permet de construire votre portefeuille.'),
_buildImage('fabrication-de-portefeuille.png'),
const SizedBox(height: 25),
],
),
decoration: pageDecoration,
),
// PageViewModel(
// title: "Another title page",
// body: "Another beautiful body text for this example onboarding",
// image: _buildImage('keys-and-wallets-horizontal-plus-phrase.png'),
// footer: ElevatedButton(
// onPressed: () {
// introKey.currentState?.animateScroll(0);
// },
// child: const Text(
// 'FooButton',
// style: TextStyle(color: Colors.white),
// ),
// style: ElevatedButton.styleFrom(
// primary: Colors.lightBlue,
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(8.0),
// ),
// ),
// ),
// decoration: pageDecoration,
// ),
// PageViewModel(
// title: "Title of last page - reversed",
// bodyWidget: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: const [
// Text("Click on ", style: bodyStyle),
// Icon(Icons.edit),
// Text(" to edit a post", style: bodyStyle),
// ],
// ),
// decoration: pageDecoration.copyWith(
// bodyFlex: 2,
// imageFlex: 4,
// bodyAlignment: Alignment.bottomCenter,
// imageAlignment: Alignment.topCenter,
// ),
// image: _buildImage('keys-and-wallets-horizontal-plus-phrase.png'),
// reverse: true,
// ),
],
onDone: () => _onIntroEnd(context),
onChange: (i) => setState(() {}),
//onSkip: () => _onIntroEnd(context), // You can override onSkip callback
showSkipButton: false,
skipOrBackFlex: 0,
nextFlex: 0,
showBackButton: false,
skip: const Text('Skip', style: TextStyle(fontWeight: FontWeight.w600)),
showNextButton: false,
// next: Icon(
// Icons.arrow_forward_ios,
// color: orangeC,
// size: 40,
// ),
done: const Text('Done', style: TextStyle(fontWeight: FontWeight.w600)),
curve: Curves.fastLinearToSlowEaseIn,
controlsMargin: const EdgeInsets.all(0),
controlsPadding: kIsWeb
? const EdgeInsets.all(12.0)
: const EdgeInsets.fromLTRB(0, 0.0, 0.0, 50),
dotsDecorator: DotsDecorator(
size: const Size(10.0, 10.0),
color: Colors.grey[400]!,
activeColor: orangeC,
activeSize: const Size(22.0, 10.0),
activeShape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(25.0)),
),
),
dotsContainerDecorator: const ShapeDecoration(
color: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Home')),
body: const Center(child: Text("This is the screen after Introduction")),
);
}
}

View File

@ -3,6 +3,7 @@ import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/wallet_view.dart';
@ -133,6 +134,11 @@ class SearchResultScreen extends StatelessWidget {
fontWeight: FontWeight.w500),
textAlign: TextAlign.center),
]),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
balance(context, g1Wallet.pubkey!, 16)
]),
subtitle: Row(children: <Widget>[
Text(g1Wallet.id?.username ?? '',
style: const TextStyle(

View File

@ -30,7 +30,6 @@ class SettingsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
const double buttonHigh = 50;
const double buttonWidth = 240;
@ -96,7 +95,7 @@ class SettingsScreen extends StatelessWidget {
}),
),
child: const Text(
"Générer un trousseau",
"Générer un coffre",
style: TextStyle(fontSize: fontSize),
),
),

View File

@ -38,11 +38,10 @@ class SubstrateSandBox extends StatelessWidget {
child: Text(
'Noeud connecté ?: ${_sub.nodeConnected} (${configBox.get('endpoint')})')),
if (_sub.nodeConnected)
Text(
'Noeud "${_sub.sdk.api.connectedNode!.name}", bloc N°${_sub.blocNumber}'),
Text('Noeud "$currencyName", bloc N°${_sub.blocNumber}'),
const SizedBox(height: 20),
Row(children: [
const Text('Liste des trousseaux:'),
const Text('Liste des coffres:'),
const Spacer(),
InkWell(
child: Image.asset(
@ -100,7 +99,7 @@ class SubstrateSandBox extends StatelessWidget {
]);
}),
const SizedBox(height: 20),
const Text('Mot de passe du trousseau:'),
const Text('Mot de passe du coffre:'),
TextField(
controller: _sub.keystorePassword,
obscureText: true,
@ -127,7 +126,7 @@ class SubstrateSandBox extends StatelessWidget {
context,
res != ''
? 'Portefeuille importé'
: 'Le format de trousseau est invalide');
: 'Le format de coffre est invalide');
}
: null,
child: const Text(

View File

@ -2,15 +2,12 @@ import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/models/queries.dart';
import 'package:gecko/screens/avatar_fullscreen.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/history.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
class WalletViewScreen extends StatelessWidget {
@ -53,7 +50,8 @@ class WalletViewScreen extends StatelessWidget {
height: buttonSize,
child: ClipOval(
child: Material(
color: const Color(0xffFFD58D), // button color
color: Colors
.grey[300], //const Color(0xffFFD58D), // button color
child: InkWell(
key: const Key('viewHistory'),
splashColor: orangeC, // inkwell color
@ -64,19 +62,20 @@ class WalletViewScreen extends StatelessWidget {
'assets/walletOptions/clock.png'),
height: 90)),
onTap: () {
_historyProvider.nPage = 1;
Navigator.push(
context,
FaderTransition(
page: HistoryScreen(
pubkey: pubkey,
username: username ??
g1WalletsBox.get(pubkey)?.username,
avatar: avatar ??
g1WalletsBox.get(pubkey)?.avatar,
),
isFast: false),
);
////TODO: wait for subsquid indexer
// _historyProvider.nPage = 1;
// Navigator.push(
// context,
// FaderTransition(
// page: HistoryScreen(
// pubkey: pubkey,
// username: username ??
// g1WalletsBox.get(pubkey)?.username,
// avatar: avatar ??
// g1WalletsBox.get(pubkey)?.avatar,
// ),
// isFast: false),
// );
}),
),
),
@ -105,7 +104,7 @@ class WalletViewScreen extends StatelessWidget {
height: 90)),
onTap: () {
Clipboard.setData(ClipboardData(text: pubkey));
_historyProvider.snackCopyKey(context);
snackCopyKey(context);
}),
),
),
@ -286,21 +285,21 @@ class WalletViewScreen extends StatelessWidget {
primary: orangeC, // background
onPrimary: Colors.white, // foreground
),
onPressed:
_walletViewProvider.payAmount.text != ''
? () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: "pay");
},
),
);
}
: null,
onPressed: _walletViewProvider.payAmount.text !=
''
? () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: "pay");
},
),
);
}
: null,
child: const Text(
'Effectuer le virement',
style: TextStyle(
@ -352,7 +351,7 @@ class WalletViewScreen extends StatelessWidget {
key: const Key('copyPubkey'),
onTap: () {
Clipboard.setData(ClipboardData(text: pubkey));
_historyProvider.snackCopyKey(context);
snackCopyKey(context);
},
child: Text(
_historyProvider.getShortPubkey(pubkey!),
@ -363,40 +362,45 @@ class WalletViewScreen extends StatelessWidget {
),
),
]),
const SizedBox(height: 10),
if (username == null &&
g1WalletsBox.get(pubkey)?.username == null)
Query(
options: QueryOptions(
document: gql(getId),
variables: {
'pubkey': pubkey,
},
),
builder: (QueryResult result,
{VoidCallback? refetch, FetchMore? fetchMore}) {
if (result.isLoading || result.hasException) {
return const Text('...');
} else if (result.data!['idty'] == null ||
result.data!['idty']['username'] == null) {
g1WalletsBox.get(pubkey)?.username = '';
return const Text('');
} else {
g1WalletsBox.get(pubkey)?.username =
result.data!['idty']['username'] ?? '';
return SizedBox(
width: 230,
child: Text(
result.data!['idty']['username'] ?? '',
style: const TextStyle(
fontSize: 27,
color: Color(0xff814C00),
),
),
);
}
},
),
const SizedBox(height: 25),
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return balance(context, pubkey!, 20);
}),
////
// if (username == null &&
// g1WalletsBox.get(pubkey)?.username == null)
// Query(
// options: QueryOptions(
// document: gql(getId),
// variables: {
// 'pubkey': pubkey,
// },
// ),
// builder: (QueryResult result,
// {VoidCallback? refetch, FetchMore? fetchMore}) {
// if (result.isLoading || result.hasException) {
// return const Text('...');
// } else if (result.data!['idty'] == null ||
// result.data!['idty']['username'] == null) {
// g1WalletsBox.get(pubkey)?.username = '';
// return const Text('');
// } else {
// g1WalletsBox.get(pubkey)?.username =
// result.data!['idty']['username'] ?? '';
// return SizedBox(
// width: 230,
// child: Text(
// result.data!['idty']['username'] ?? '',
// style: const TextStyle(
// fontSize: 27,
// color: Color(0xff814C00),
// ),
// ),
// );
// }
// },
// ),
if (username == null &&
g1WalletsBox.get(pubkey)?.username != null)
SizedBox(
@ -421,19 +425,20 @@ class WalletViewScreen extends StatelessWidget {
),
),
const SizedBox(height: 25),
FutureBuilder(
future: _cesiumPlusProvider.getName(pubkey),
initialData: '...',
builder: (context, snapshot) {
return SizedBox(
width: 230,
child: Text(
snapshot.data.toString(),
style: const TextStyle(
fontSize: 18, color: Colors.black),
),
);
}),
//// To get Cs+ name
// FutureBuilder(
// future: _cesiumPlusProvider.getName(pubkey),
// initialData: '...',
// builder: (context, snapshot) {
// return SizedBox(
// width: 230,
// child: Text(
// snapshot.data.toString(),
// style: const TextStyle(
// fontSize: 18, color: Colors.black),
// ),
// );
// }),
const SizedBox(height: 30),
]),
const Spacer(),

View File

@ -8,7 +8,7 @@
PRODUCT_NAME = gecko
// The application's bundle identifier
PRODUCT_BUNDLE_IDENTIFIER = com.example.gecko
PRODUCT_BUNDLE_IDENTIFIER = gecko.axiomteam.fr
// The copyright displayed in application information
PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved.
PRODUCT_COPYRIGHT = Copyright © 2021 gecko.axiomteam.fr. All rights reserved.

View File

@ -8,13 +8,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "40.0.0"
aes_ecb_pkcs5_flutter:
dependency: transitive
description:
name: aes_ecb_pkcs5_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
analyzer:
dependency: transitive
description:
@ -302,6 +295,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.6"
dots_indicator:
dependency: transitive
description:
name: dots_indicator
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
durt:
dependency: "direct main"
description:
@ -349,6 +349,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_aes_ecb_pkcs5:
dependency: transitive
description:
name: flutter_aes_ecb_pkcs5
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
flutter_driver:
dependency: "direct main"
description: flutter
@ -559,7 +566,7 @@ packages:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
version: "4.0.1"
http_server:
dependency: transitive
description:
@ -615,7 +622,7 @@ packages:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+4"
version: "0.8.5+5"
image_picker_platform_interface:
dependency: transitive
description:
@ -642,6 +649,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
introduction_screen:
dependency: "direct main"
description:
name: introduction_screen
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
io:
dependency: transitive
description:
@ -914,7 +928,7 @@ packages:
name: pdf
url: "https://pub.dartlang.org"
source: hosted
version: "3.8.0"
version: "3.8.1"
permission_handler:
dependency: "direct main"
description:
@ -976,7 +990,7 @@ packages:
description:
path: "."
ref: fixAndroidActivityVersion
resolved-ref: db17df1a7e421066dd88a16ed46c5cc945b77f82
resolved-ref: e33351cde5ea9b55d191772fe3b36f9dbb8277e6
url: "https://github.com/poka-IT/sdk.git"
source: git
version: "0.4.5"
@ -992,7 +1006,7 @@ packages:
description:
path: printing
ref: HEAD
resolved-ref: "726aab13746a4f515601febfb0824ba71dbe4f80"
resolved-ref: "95bbc1f33b7cb45f7a4b98088b96bc541fefc495"
url: "https://github.com/DavBfr/dart_pdf.git"
source: git
version: "5.9.1"
@ -1069,7 +1083,7 @@ packages:
name: responsive_framework
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.8"
version: "0.1.9"
rxdart:
dependency: transitive
description:
@ -1368,7 +1382,7 @@ packages:
name: webkit_inspection_protocol
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "1.1.0"
webview_flutter:
dependency: transitive
description:

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.5+2
version: 0.0.5+3
environment:
sdk: '>=2.12.0 <3.0.0'
@ -79,6 +79,18 @@ dependencies:
git:
url: https://github.com/poka-IT/sdk.git
ref: fixAndroidActivityVersion
introduction_screen: ^3.0.2
dev_dependencies:
# flutter_launcher_icons: ^0.9.2
# flutter_launcher_icons_maker: ^^0.10.2
icons_launcher: ^1.1.8
build_runner: ^2.1.2
flutter_test:
sdk: flutter
hive_generator: ^1.1.1
integration_test:
sdk: flutter
flutter_icons:
android: true
@ -86,14 +98,7 @@ flutter_icons:
image_path: "assets/icon/gecko_flat.png"
remove_alpha_ios: true
dev_dependencies:
icons_launcher: ^1.1.3
build_runner: ^2.1.2
flutter_test:
sdk: flutter
hive_generator: ^1.1.1
integration_test:
sdk: flutter
uses-material-design: true
# The following section is specific to Flutter.
flutter:

View File

@ -19,7 +19,7 @@ cargo make
# Build APK
echo "Build APK..."
flutter clean
#flutter clean
flutter build apk --release --build-name $VERSION --build-number $BUILD
# Create artifacts folder

View File

@ -22,7 +22,9 @@ else
# flutter build apk --release --build-name $VERSION --build-number $BUILD
fi
if [[ -d $HOME/Téléchargements ]]; then
if [[ -d $HOME/Nextcloud/Gecko-APK ]]; then
DL="$HOME/Nextcloud/Gecko-APK"
elif [[ -d $HOME/Téléchargements ]]; then
DL="$HOME/Téléchargements"
elif [[ -d $HOME/Downloads ]]; then
DL="$HOME/Downloads"

View File

@ -1,5 +1,5 @@
#!/bin/bash
flutter pub run flutter_launcher_icons:main
flutter pub run icons_launcher:main
exit 0

View File

@ -216,7 +216,7 @@ void main() {
test('OnBoarding - Generate secret code and confirm it', (
{timeout = Timeout.none}) async {
expect(await getText('step9'),
"Super !\n\nJe vais maintenant créer votre code secret. \n\nVotre code secret chiffre votre trousseau de clefs, ce qui le rend inutilisable par dautres, par exemple si vous perdez votre téléphone ou si on vous le vole.");
"Super !\n\nJe vais maintenant créer votre code secret. \n\nVotre code secret chiffre votre coffre de clefs, ce qui le rend inutilisable par dautres, par exemple si vous perdez votre téléphone ou si on vous le vole.");
await sleep(800);
await tapOn('goStep10');
await sleep(50);
@ -248,7 +248,7 @@ void main() {
await driver!.enterText(pinCode!);
expect(await getText('step13'),
"Top !\n\nVotre trousseau de clef et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !");
"Top !\n\nVotre coffre et votre portefeuille ont été créés avec un immense succès.\n\nFélicitations !");
});
test('My wallets - Rename first derivation', (

View File

@ -89,11 +89,11 @@ BEGIN
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "com.example" "\0"
VALUE "CompanyName", "gecko.axiomteam.fr" "\0"
VALUE "FileDescription", "A new Flutter project." "\0"
VALUE "FileVersion", VERSION_AS_STRING "\0"
VALUE "InternalName", "gecko" "\0"
VALUE "LegalCopyright", "Copyright (C) 2021 com.example. All rights reserved." "\0"
VALUE "LegalCopyright", "Copyright (C) 2021 gecko.axiomteam.fr. All rights reserved." "\0"
VALUE "OriginalFilename", "gecko.exe" "\0"
VALUE "ProductName", "gecko" "\0"
VALUE "ProductVersion", VERSION_AS_STRING "\0"