Fixes for yat

This commit is contained in:
M 2021-11-02 09:17:24 +00:00
parent c9482caa19
commit fe3d00f1a8
36 changed files with 543 additions and 88 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -85,6 +85,8 @@ PODS:
- Flutter - Flutter
- SwiftProtobuf (1.12.0) - SwiftProtobuf (1.12.0)
- SwiftyGif (5.3.0) - SwiftyGif (5.3.0)
- uni_links (0.0.1):
- Flutter
- UnstoppableDomainsResolution (2.0.1): - UnstoppableDomainsResolution (2.0.1):
- BigInt - BigInt
- CryptoSwift - CryptoSwift
@ -109,6 +111,7 @@ DEPENDENCIES:
- permission_handler (from `.symlinks/plugins/permission_handler/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`)
- share (from `.symlinks/plugins/share/ios`) - share (from `.symlinks/plugins/share/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
- uni_links (from `.symlinks/plugins/uni_links/ios`)
- UnstoppableDomainsResolution (~> 2.0.1) - UnstoppableDomainsResolution (~> 2.0.1)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
- webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`)
@ -155,6 +158,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/share/ios" :path: ".symlinks/plugins/share/ios"
shared_preferences: shared_preferences:
:path: ".symlinks/plugins/shared_preferences/ios" :path: ".symlinks/plugins/shared_preferences/ios"
uni_links:
:path: ".symlinks/plugins/uni_links/ios"
url_launcher: url_launcher:
:path: ".symlinks/plugins/url_launcher/ios" :path: ".symlinks/plugins/url_launcher/ios"
webview_flutter: webview_flutter:
@ -184,10 +189,11 @@ SPEC CHECKSUMS:
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
SwiftProtobuf: 4ef85479c18ca85b5482b343df9c319c62bda699 SwiftProtobuf: 4ef85479c18ca85b5482b343df9c319c62bda699
SwiftyGif: e466e86c660d343357ab944a819a101c4127cb40 SwiftyGif: e466e86c660d343357ab944a819a101c4127cb40
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
UnstoppableDomainsResolution: 856ba43f08b31f3f34157c7257092bd0c6e31cf8 UnstoppableDomainsResolution: 856ba43f08b31f3f34157c7257092bd0c6e31cf8
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b webview_flutter: 3603125dfd3bcbc9d8d418c3f80aeecf331c068b
PODFILE CHECKSUM: bc2591d23316907c9c90ca1cd2fce063fd866508 PODFILE CHECKSUM: bc2591d23316907c9c90ca1cd2fce063fd866508
COCOAPODS: 1.10.2 COCOAPODS: 1.9.3

View file

@ -362,7 +362,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 59; CURRENT_PROJECT_VERSION = 62;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
EXCLUDED_SOURCE_FILE_NAMES = ""; EXCLUDED_SOURCE_FILE_NAMES = "";
@ -380,7 +380,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.2.7; MARKETING_VERSION = 4.2.8;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -506,7 +506,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 59; CURRENT_PROJECT_VERSION = 62;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
EXCLUDED_SOURCE_FILE_NAMES = ""; EXCLUDED_SOURCE_FILE_NAMES = "";
@ -524,7 +524,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.2.7; MARKETING_VERSION = 4.2.8;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -542,7 +542,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 59; CURRENT_PROJECT_VERSION = 62;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
EXCLUDED_SOURCE_FILE_NAMES = ""; EXCLUDED_SOURCE_FILE_NAMES = "";
@ -560,7 +560,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.2.7; MARKETING_VERSION = 4.2.8;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View file

@ -20,6 +20,19 @@
<string>$(MARKETING_VERSION)</string> <string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>y.at</string>
<key>CFBundleURLSchemes</key>
<array>
<string>cakewallet</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string> <string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
@ -57,19 +70,6 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>y.at</string>
<key>CFBundleURLSchemes</key>
<array>
<string>cakewallet</string>
</array>
</dict>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
</dict> </dict>

View file

@ -2,7 +2,9 @@ import 'dart:async';
import 'package:cake_wallet/bitcoin/unspent_coins_info.dart'; import 'package:cake_wallet/bitcoin/unspent_coins_info.dart';
import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/entities/language_service.dart';
import 'package:cake_wallet/buy/order.dart'; import 'package:cake_wallet/buy/order.dart';
import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -35,6 +37,7 @@ import 'package:cake_wallet/src/screens/root/root.dart';
import 'package:uni_links/uni_links.dart'; import 'package:uni_links/uni_links.dart';
final navigatorKey = GlobalKey<NavigatorState>(); final navigatorKey = GlobalKey<NavigatorState>();
final rootKey = GlobalKey<RootState>();
Future<void> main() async { Future<void> main() async {
try { try {
@ -106,6 +109,9 @@ Future<void> main() async {
await Hive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName); await Hive.openBox<ExchangeTemplate>(ExchangeTemplate.boxName);
final unspentCoinsInfoSource = final unspentCoinsInfoSource =
await Hive.openBox<UnspentCoinsInfo>(UnspentCoinsInfo.boxName); await Hive.openBox<UnspentCoinsInfo>(UnspentCoinsInfo.boxName);
await visualisationForEmojiId('%E2%98%A0%EF%B8%8F%F0%9F%90%99%E2%98%A0%EF%B8%8F');
await initialSetup( await initialSetup(
sharedPreferences: await SharedPreferences.getInstance(), sharedPreferences: await SharedPreferences.getInstance(),
nodes: nodes, nodes: nodes,
@ -203,6 +209,7 @@ class AppState extends State<App> with SingleTickerProviderStateMixin {
Future<void> _handleInitialUri() async { Future<void> _handleInitialUri() async {
try { try {
final uri = await getInitialUri(); final uri = await getInitialUri();
print('uri: $uri');
if (uri == null) { if (uri == null) {
return; return;
} }
@ -217,6 +224,7 @@ class AppState extends State<App> with SingleTickerProviderStateMixin {
void _handleIncomingLinks() { void _handleIncomingLinks() {
if (!kIsWeb) { if (!kIsWeb) {
stream = getUriLinksStream().listen((Uri uri) { stream = getUriLinksStream().listen((Uri uri) {
print('uri: $uri');
if (!mounted) return; if (!mounted) return;
_fetchEmojiFromUri(uri); _fetchEmojiFromUri(uri);
}, onError: (Object error) { }, onError: (Object error) {
@ -238,6 +246,7 @@ class AppState extends State<App> with SingleTickerProviderStateMixin {
} }
yatStore.emoji = emoji; yatStore.emoji = emoji;
yatStore.refreshToken = refreshToken; yatStore.refreshToken = refreshToken;
yatStore.emojiIncommingSC.add(emoji);
} }
@override @override
@ -263,6 +272,7 @@ class AppState extends State<App> with SingleTickerProviderStateMixin {
statusBarIconBrightness: statusBarIconBrightness)); statusBarIconBrightness: statusBarIconBrightness));
return Root( return Root(
key: rootKey,
authenticationStore: authenticationStore, authenticationStore: authenticationStore,
navigatorKey: navigatorKey, navigatorKey: navigatorKey,
child: MaterialApp( child: MaterialApp(

View file

@ -1,7 +1,9 @@
import 'dart:async';
import 'package:cake_wallet/entities/wallet_type.dart'; import 'package:cake_wallet/entities/wallet_type.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/yat/yat_popup.dart'; import 'package:cake_wallet/src/screens/yat/yat_popup.dart';
import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
@ -20,6 +22,7 @@ import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:smooth_page_indicator/smooth_page_indicator.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:cake_wallet/main.dart';
class DashboardPage extends BasePage { class DashboardPage extends BasePage {
DashboardPage({ DashboardPage({
@ -78,6 +81,7 @@ class DashboardPage extends BasePage {
var pages = <Widget>[]; var pages = <Widget>[];
bool _isEffectsInstalled = false; bool _isEffectsInstalled = false;
StreamSubscription<bool> _onInactiveSub;
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
@ -156,6 +160,8 @@ class DashboardPage extends BasePage {
pages.add(BalancePage(dashboardViewModel: walletViewModel)); pages.add(BalancePage(dashboardViewModel: walletViewModel));
pages.add(TransactionsPage(dashboardViewModel: walletViewModel)); pages.add(TransactionsPage(dashboardViewModel: walletViewModel));
_isEffectsInstalled = true;
if (walletViewModel.shouldShowYatPopup) { if (walletViewModel.shouldShowYatPopup) {
await Future<void>.delayed(Duration(seconds: 1)); await Future<void>.delayed(Duration(seconds: 1));
await showPopUp<void>( await showPopUp<void>(
@ -186,7 +192,29 @@ class DashboardPage extends BasePage {
}); });
}); });
_isEffectsInstalled = true; var needToPresentYat = false;
var isInactive = false;
_onInactiveSub = rootKey.currentState.isInactive.listen((inactive) {
isInactive = inactive;
if (needToPresentYat) {
Future<void>.delayed(Duration(milliseconds: 500)).then((_) {
showPopUp<void>(
context: navigatorKey.currentContext,
builder: (_) => YatEmojiId(walletViewModel.yatStore.emoji));
needToPresentYat = false;
});
}
});
walletViewModel.yatStore.emojiIncommingStream.listen((String emoji) {
if (!_isEffectsInstalled || emoji.isEmpty) {
return;
}
needToPresentYat = true;
});
} }
Future<void> _onClickBuyButton(BuildContext context) async { Future<void> _onClickBuyButton(BuildContext context) async {

View file

@ -150,7 +150,7 @@ class QRWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Text( Text(
S.of(context).yat_address, S.of(context).yat,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 13, fontSize: 13,
@ -160,14 +160,21 @@ class QRWidget extends StatelessWidget {
), ),
Padding( Padding(
padding: EdgeInsets.only(top: 5), padding: EdgeInsets.only(top: 5),
child: Text( child: Row(
addressListViewModel.emoji, mainAxisSize: MainAxisSize.max,
textAlign: TextAlign.center, crossAxisAlignment: CrossAxisAlignment.start,
style: TextStyle( children: <Widget>[
fontSize: 26, Expanded(child:Text(
addressListViewModel.emoji,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 26))),
Padding(
padding: EdgeInsets.only(left: 12),
child: copyImage,
)]
), ),
) )
)
] ]
) )
)), )),

View file

@ -1,3 +1,4 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/auth/auth_page.dart'; import 'package:cake_wallet/src/screens/auth/auth_page.dart';
@ -24,11 +25,14 @@ class Root extends StatefulWidget {
} }
class RootState extends State<Root> with WidgetsBindingObserver { class RootState extends State<Root> with WidgetsBindingObserver {
Stream<bool> get isInactive => _isInactiveController.stream;
StreamController<bool> _isInactiveController;
bool _isInactive; bool _isInactive;
bool _postFrameCallback; bool _postFrameCallback;
@override @override
void initState() { void initState() {
_isInactiveController = StreamController<bool>();
_isInactive = false; _isInactive = false;
_postFrameCallback = false; _postFrameCallback = false;
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
@ -45,7 +49,7 @@ class RootState extends State<Root> with WidgetsBindingObserver {
if (!_isInactive && if (!_isInactive &&
widget.authenticationStore.state == AuthenticationState.allowed) { widget.authenticationStore.state == AuthenticationState.allowed) {
setState(() => _isInactive = true); setState(() => _setInactive(true));
} }
break; break;
@ -77,7 +81,12 @@ class RootState extends State<Root> with WidgetsBindingObserver {
void _reset() { void _reset() {
setState(() { setState(() {
_postFrameCallback = false; _postFrameCallback = false;
_isInactive = false; _setInactive(false);
}); });
} }
void _setInactive(bool value) {
_isInactive = value;
_isInactiveController.add(value);
}
} }

View file

@ -1,5 +1,6 @@
import 'dart:ui'; import 'dart:ui';
import 'package:cake_wallet/src/screens/send/widgets/send_card.dart'; import 'package:cake_wallet/src/screens/send/widgets/send_card.dart';
import 'package:cake_wallet/src/screens/yat/widgets/yat_close_button.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/src/widgets/template_tile.dart'; import 'package:cake_wallet/src/widgets/template_tile.dart';
import 'package:cake_wallet/view_model/send/output.dart'; import 'package:cake_wallet/view_model/send/output.dart';
@ -21,6 +22,8 @@ import 'package:dotted_border/dotted_border.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart'; import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:smooth_page_indicator/smooth_page_indicator.dart';
import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/src/screens/yat/yat_sending.dart';
class SendPage extends BasePage { class SendPage extends BasePage {
SendPage({@required this.sendViewModel}) :_formKey = GlobalKey<FormState>(); SendPage({@required this.sendViewModel}) :_formKey = GlobalKey<FormState>();
@ -301,6 +304,10 @@ class SendPage extends BasePage {
} }
await sendViewModel.createTransaction(); await sendViewModel.createTransaction();
if (!sendViewModel.isBatchSending && sendViewModel.hasYat) {
Navigator.of(context).push<void>(YatSending.createRoute(sendViewModel));
}
}, },
text: S.of(context).send, text: S.of(context).send,
color: Theme.of(context).accentTextTheme.body2.color, color: Theme.of(context).accentTextTheme.body2.color,
@ -336,7 +343,8 @@ class SendPage extends BasePage {
}); });
} }
if (state is ExecutedSuccessfullyState) { if (state is ExecutedSuccessfullyState
&& !(!sendViewModel.isBatchSending && sendViewModel.hasYat)) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
showPopUp<void>( showPopUp<void>(
context: context, context: context,

View file

@ -29,6 +29,6 @@ class SettingsLinkProviderCell extends StandardListRow {
color: Palette.blueCraiola)); color: Palette.blueCraiola));
static void _launchUrl(String url) async { static void _launchUrl(String url) async {
if (await canLaunch(url)) await launch(url); if (await canLaunch(url)) await launch(url, forceSafariVC: false);
} }
} }

View file

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class CircleClipper extends CustomClipper<Path> {
CircleClipper(this.center, this.radius);
final Offset center;
final double radius;
@override
Path getClip(Size size) =>
Path()..addOval(Rect.fromCircle(radius: radius, center: center));
@override
bool shouldReclip(covariant CustomClipper<Path> oldClipper) => true;
}

View file

@ -10,13 +10,9 @@ import 'package:cake_wallet/generated/i18n.dart';
import 'package:lottie/lottie.dart'; import 'package:lottie/lottie.dart';
class YatAlert extends StatelessWidget { class YatAlert extends StatelessWidget {
YatAlert(this.yatStore) YatAlert(this.yatStore);
: baseUrl = YatLink.isDevMode
? YatLink.baseDevUrl
: YatLink.baseReleaseUrl;
final YatStore yatStore; final YatStore yatStore;
final String baseUrl;
static const aspectRatioImage = 1.133; static const aspectRatioImage = 1.133;
final animation = Lottie.asset('assets/animation/anim1.json'); final animation = Lottie.asset('assets/animation/anim1.json');
@ -88,8 +84,15 @@ class YatAlert extends StatelessWidget {
.arrow_up_right_square, .arrow_up_right_square,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
onPressed: () { onPressed: () {
final url = baseUrl + YatLink.createSuffix; var createNewYatUrl = YatLink.startFlowUrl;
launch(url); final createNewYatUrlParameters =
yatStore.defineQueryParameters();
if (createNewYatUrlParameters.isNotEmpty) {
createNewYatUrl += '?sub1=' + createNewYatUrlParameters;
}
launch(createNewYatUrl, forceSafariVC: false);
}), }),
Padding( Padding(
padding: EdgeInsets.only(top: 24), padding: EdgeInsets.only(top: 24),
@ -104,13 +107,13 @@ class YatAlert extends StatelessWidget {
.arrow_up_right_square, .arrow_up_right_square,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
onPressed: () { onPressed: () {
String url = baseUrl + YatLink.signInSuffix; String url = YatLink.baseUrl + YatLink.signInSuffix;
final parameters = final parameters =
yatStore.defineQueryParameters(); yatStore.defineQueryParameters();
if (parameters.isNotEmpty) { if (parameters.isNotEmpty) {
url += YatLink.queryParameter + parameters; url += YatLink.queryParameter + parameters;
} }
launch(url); launch(url, forceSafariVC: false);
}) })
) )
] ]

View file

@ -160,8 +160,15 @@ class YatPopup extends StatelessWidget {
child: ThirdIntroduction( child: ThirdIntroduction(
onClose: onClose, onClose: onClose,
onGet: () { onGet: () {
final url = baseUrl + YatLink.createSuffix; var createNewYatUrl = YatLink.startFlowUrl;
launch(url); final createNewYatUrlParameters = dashboardViewModel.
yatStore.defineQueryParameters();
if (createNewYatUrlParameters.isNotEmpty) {
createNewYatUrl += '?sub1=' + createNewYatUrlParameters;
}
launch(createNewYatUrl, forceSafariVC: false);
}, },
onConnect: () { onConnect: () {
String url = baseUrl + YatLink.signInSuffix; String url = baseUrl + YatLink.signInSuffix;
@ -170,7 +177,7 @@ class YatPopup extends StatelessWidget {
if (parameters.isNotEmpty) { if (parameters.isNotEmpty) {
url += YatLink.queryParameter + parameters; url += YatLink.queryParameter + parameters;
} }
launch(url); launch(url, forceSafariVC: false);
} }
)) ))
: Container() : Container()

View file

@ -0,0 +1,141 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/src/screens/yat/widgets/yat_close_button.dart';
import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
import 'package:cake_wallet/src/screens/yat/circle_clipper.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/view_model/send/send_view_model.dart';
class YatSending extends BasePage {
YatSending(this.sendViewModel);
static Route createRoute(SendViewModel sendViewModel) {
return PageRouteBuilder<void>(
transitionDuration: Duration(seconds: 1),
reverseTransitionDuration: Duration(seconds: 1),
opaque: false,
barrierDismissible: false,
pageBuilder: (context, animation, secondaryAnimation) => YatSending(sendViewModel),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
final screenSize = MediaQuery.of(context).size;
final center = Offset(screenSize.width / 2, screenSize.height / 2);
final endRadius = screenSize.height * 1.2;
final tween = Tween(begin: 0.0, end: endRadius);
return ClipPath(
clipper: CircleClipper(center, animation.drive(tween).value),
child: child,
);
},
);
}
final SendViewModel sendViewModel;
@override
Color get titleColor => Colors.white;
@override
bool get resizeToAvoidBottomInset => false;
@override
bool get extendBodyBehindAppBar => true;
@override
AppBarStyle get appBarStyle => AppBarStyle.transparent;
@override
Widget trailing(context) =>
YatCloseButton(onClose: () => Navigator.of(context).pop());
@override
Widget leading(BuildContext context) => Container();
@override
Widget body(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return Container(
color: Colors.black,
child: Stack(
children: [
Center(
child:FutureBuilder<String>(
future: visualisationForEmojiId(sendViewModel.outputs.first.address),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.done:
if (snapshot.hasError || snapshot.data.isEmpty) {
return Image.asset('assets/images/yat_logo.png', width: screenWidth, color: Colors.white);
}
return Image.network(
snapshot.data,
scale: 0.7,
loadingBuilder: (Object z, Widget child, ImageChunkEvent loading)
=> loading != null
? CupertinoActivityIndicator(animating: true)
: child);
default:
return Image.asset('assets/images/yat_logo.png', width: screenWidth, color: Colors.white);
}
}),
),
Positioned(
bottom: 20,
child: Container(
width: screenWidth,
padding: EdgeInsets.fromLTRB(20, 0, 20, 10),
child: Column(children: [
Text(
'You are sending ${sendViewModel.outputs.first.cryptoAmount} ${sendViewModel.currency.title} to ${sendViewModel.outputs.first.address}'.toUpperCase(),
style: TextStyle(
fontSize: 28,
decoration: TextDecoration.none,
color: Theme.of(context).accentTextTheme.display3.backgroundColor),
textAlign: TextAlign.center),
Container(height: 30),
LoadingPrimaryButton(
onPressed: () {
sendViewModel.commitTransaction();
showPopUp<void>(
context: context,
builder: (BuildContext popContext) {
return Observer(builder: (_) {
final state = sendViewModel.state;
if (state is FailureState) {
Navigator.of(context).pop();
}
if (state is TransactionCommitted) {
return AlertWithOneAction(
alertTitle: '',
alertContent: S.of(popContext).send_success(
sendViewModel.currency
.toString()),
buttonText: S.of(popContext).ok,
buttonAction: () {
Navigator.of(popContext).pop();
Navigator.of(context).pop();
});
}
return Offstage();
});
});
},
text: S.of(context).confirm_sending,
color: Theme.of(context).accentTextTheme.body2.color,
textColor: Colors.white,
isLoading: sendViewModel.state is IsExecutingState ||
sendViewModel.state is TransactionCommitting)])))]));
}
}

View file

@ -0,0 +1,129 @@
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/screens/yat/widgets/first_introduction.dart';
import 'package:cake_wallet/src/screens/yat/widgets/second_introduction.dart';
import 'package:cake_wallet/src/screens/yat/widgets/third_introduction.dart';
import 'package:cake_wallet/src/screens/yat/widgets/yat_close_button.dart';
import 'package:cake_wallet/src/widgets/alert_background.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:flutter/material.dart';
import 'package:animate_do/animate_do.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:cake_wallet/generated/i18n.dart';
class YatEmojiId extends StatelessWidget {
YatEmojiId(this.emojiId);
static const durationInMilliseconds = 250;
final String emojiId;
final image = Image.asset('assets/images/emoji_popup.png');
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return Stack(
clipBehavior: Clip.none,
alignment: Alignment.bottomCenter,
children: [
AlertBackground(child: Container()),
SlideInUp(
from: 420,
duration: Duration(milliseconds: durationInMilliseconds),
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(24),
topRight: Radius.circular(24)),
child: Container(
height: 420,
color: Theme.of(context).buttonColor,
padding: EdgeInsets.fromLTRB(24, 15, 24, 24),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
YatCloseButton(onClose: () => Navigator.of(context).pop())
]
),
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: EdgeInsets.fromLTRB(10, 5, 10, 5),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.white),
borderRadius: BorderRadius.all(Radius.circular(50))
),
child:
Text(
emojiId,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 46,
decoration: TextDecoration.none,
)
))
]
)
]
),
Container(
padding: EdgeInsets.only(left: 6, right: 6),
child: Column(
children: [
Text(
"That's one nice Yat!",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
fontFamily: 'Lato',
color: Theme.of(context).accentTextTheme.display3.backgroundColor,
decoration: TextDecoration.none,
)
),
Padding(
padding: EdgeInsets.only(top: 20),
child: Text(
'You can manage your Yat or purchase additional Yats in your account settings',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.normal,
fontFamily: 'Lato',
color: Theme.of(context)
.accentTextTheme
.display2
.backgroundColor,
decoration: TextDecoration.none,
)
)
)
]
)
),
PrimaryButton(
text: 'Got it',
textColor: Colors.white,
color: Palette.protectiveBlue,
onPressed: () => Navigator.of(context).pop()
)
],
)
)
),
)
],
);
}
}

View file

@ -12,20 +12,28 @@ import 'package:cake_wallet/monero/monero_wallet.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:cake_wallet/store/yat/yat_exception.dart'; import 'package:cake_wallet/store/yat/yat_exception.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'dart:async';
part 'yat_store.g.dart'; part 'yat_store.g.dart';
class YatLink { class YatLink {
static const partnerId = 'CW';
static const baseDevUrl = 'https://yat.fyi'; static const baseDevUrl = 'https://yat.fyi';
static const baseReleaseUrl = 'https://y.at'; static const baseReleaseUrl = 'https://y.at';
static const signInSuffix = '/partner/CW/link-email'; static const signInSuffix = '/partner/$partnerId/link-email';
static const createSuffix = '/create'; static const createSuffix = '/create';
static const managePath = '/partner/$partnerId/manage';
static const queryParameter = '?addresses='; static const queryParameter = '?addresses=';
static const requestDevUrl = 'https://a.yat.fyi/emoji_id/'; static const requestDevUrl = 'https://a.yat.fyi/emoji_id/';
static const requestReleaseUrl = 'https://a.y.at/emoji_id/'; static const requestReleaseUrl = 'https://a.y.at/emoji_id/';
static const isDevMode = true; static const startFlowUrl = 'https://www.y03btrk.com/4RQSJ/55M6S/';
static const isDevMode = false;
static const tags = <String, List<String>>{"XMR" : ['0x1001', '0x1002'], static const tags = <String, List<String>>{"XMR" : ['0x1001', '0x1002'],
"BTC" : ['0x1003'], "LTC" : ['0x3fff']}; "BTC" : ['0x1003'], "LTC" : ['0x3fff']};
static String get baseUrl => YatLink.isDevMode
? YatLink.baseDevUrl
: YatLink.baseReleaseUrl;
} }
Future<List<String>> fetchYatAddress(String emojiId, String ticker) async { Future<List<String>> fetchYatAddress(String emojiId, String ticker) async {
@ -65,6 +73,18 @@ Future<List<String>> fetchYatAddress(String emojiId, String ticker) async {
return addresses; return addresses;
} }
Future<String> visualisationForEmojiId(String emojiId) async {
final requestURL = YatLink.isDevMode
? YatLink.requestDevUrl
: YatLink.requestReleaseUrl;
final url = requestURL + emojiId + '/json/VisualizerFileLocations';
final response = await get(url);
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
final data = responseJSON['data'] as Map<String, dynamic>;
final result = data['gif'] as String ?? '';
return result;
}
class YatStore = YatStoreBase with _$YatStore; class YatStore = YatStoreBase with _$YatStore;
abstract class YatStoreBase with Store { abstract class YatStoreBase with Store {
@ -74,6 +94,7 @@ abstract class YatStoreBase with Store {
refreshToken = _wallet?.walletInfo?.yatToken ?? ''; refreshToken = _wallet?.walletInfo?.yatToken ?? '';
reaction((_) => appStore.wallet, _onWalletChange); reaction((_) => appStore.wallet, _onWalletChange);
reaction((_) => emoji, (String emoji) => _onEmojiChange()); reaction((_) => emoji, (String emoji) => _onEmojiChange());
emojiIncommingSC = StreamController<String>();
} }
AppStore appStore; AppStore appStore;
@ -84,6 +105,10 @@ abstract class YatStoreBase with Store {
@observable @observable
String refreshToken; String refreshToken;
StreamController<String> emojiIncommingSC;
Stream<String> get emojiIncommingStream => emojiIncommingSC.stream;
@observable @observable
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo>
_wallet; _wallet;

View file

@ -25,6 +25,7 @@ import 'package:cake_wallet/entities/wallet_type.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/send/send_view_model_state.dart'; import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
import 'package:cake_wallet/entities/parsed_address.dart';
part 'send_view_model.g.dart'; part 'send_view_model.g.dart';
@ -134,6 +135,11 @@ abstract class SendViewModelBase with Store {
@computed @computed
bool get isElectrumWallet => _wallet is ElectrumWallet; bool get isElectrumWallet => _wallet is ElectrumWallet;
bool get hasYat
=> outputs.any((out) => out.isParsedAddress
&& out.parsedAddress.parseFrom == ParseFrom.yatRecord);
WalletType get walletType => _wallet.type; WalletType get walletType => _wallet.type;
final WalletBase _wallet; final WalletBase _wallet;
final SettingsStore _settingsStore; final SettingsStore _settingsStore;

View file

@ -1,6 +1,7 @@
import 'package:cake_wallet/src/screens/yat/yat_alert.dart'; import 'package:cake_wallet/src/screens/yat/yat_alert.dart';
import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/settings/link_list_item.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
@ -69,6 +70,31 @@ abstract class SettingsViewModelBase with Store {
_settingsStore.priority[wallet.type] = priorities.first; _settingsStore.priority[wallet.type] = priorities.first;
} }
var connectYatUrl = YatLink.baseUrl + YatLink.signInSuffix;
final connectYatUrlParameters =
_yatStore.defineQueryParameters();
if (connectYatUrlParameters.isNotEmpty) {
connectYatUrl += YatLink.queryParameter + connectYatUrlParameters;
}
var manageYatUrl = YatLink.baseUrl + YatLink.managePath;
final manageYatUrlParameters =
_yatStore.defineQueryParameters();
if (manageYatUrlParameters.isNotEmpty) {
manageYatUrl += YatLink.queryParameter + manageYatUrlParameters;
}
var createNewYatUrl = YatLink.startFlowUrl;
final createNewYatUrlParameters =
_yatStore.defineQueryParameters();
if (createNewYatUrlParameters.isNotEmpty) {
createNewYatUrl += '?sub1=' + createNewYatUrlParameters;
}
sections = [ sections = [
[ [
PickerListItem( PickerListItem(
@ -158,16 +184,23 @@ abstract class SettingsViewModelBase with Store {
_settingsStore.currentTheme = theme) _settingsStore.currentTheme = theme)
], ],
[ [
RegularListItem( if (_yatStore.emoji.isNotEmpty) ...[
title: S.current.manage_yats, LinkListItem(
handler: (BuildContext context) async { title: S.current.manage_yats,
await showPopUp<void>( link: manageYatUrl,
context: context, linkTitle: ''),
builder: (BuildContext context) { ] else ...[
return YatAlert(_yatStore); LinkListItem(
}); title: S.current.connect_yats,
}, link: connectYatUrl,
), linkTitle: ''),
LinkListItem(
title: 'Create new Yats',
link: createNewYatUrl,
linkTitle: '')
]
],
[
RegularListItem( RegularListItem(
title: S.current.settings_terms_and_conditions, title: S.current.settings_terms_and_conditions,
handler: (BuildContext context) => handler: (BuildContext context) =>

View file

@ -200,7 +200,7 @@ packages:
name: cli_util name: cli_util
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.0" version: "0.3.5"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@ -228,21 +228,21 @@ packages:
name: connectivity name: connectivity
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.3" version: "3.0.6"
connectivity_for_web: connectivity_for_web:
dependency: transitive dependency: transitive
description: description:
name: connectivity_for_web name: connectivity_for_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0" version: "0.4.0+1"
connectivity_macos: connectivity_macos:
dependency: transitive dependency: transitive
description: description:
name: connectivity_macos name: connectivity_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0" version: "0.2.1+2"
connectivity_platform_interface: connectivity_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -277,7 +277,7 @@ packages:
name: cupertino_icons name: cupertino_icons
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.3"
cw_monero: cw_monero:
dependency: "direct main" dependency: "direct main"
description: description:
@ -312,7 +312,7 @@ packages:
name: devicelocale name: devicelocale
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.1" version: "0.4.3"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
@ -361,7 +361,7 @@ packages:
name: file name: file
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.0" version: "6.1.2"
file_picker: file_picker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -420,7 +420,7 @@ packages:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.3"
flutter_secure_storage: flutter_secure_storage:
dependency: "direct main" dependency: "direct main"
description: description:
@ -443,7 +443,7 @@ packages:
name: flutter_spinkit name: flutter_spinkit
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.0.0" version: "5.1.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -460,7 +460,7 @@ packages:
name: get_it name: get_it
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.0" version: "6.1.1"
glob: glob:
dependency: transitive dependency: transitive
description: description:
@ -565,14 +565,14 @@ packages:
name: keyboard_actions name: keyboard_actions
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.4.0" version: "3.4.4"
local_auth: local_auth:
dependency: "direct main" dependency: "direct main"
description: description:
name: local_auth name: local_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.6" version: "1.1.7"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@ -607,7 +607,7 @@ packages:
name: mime name: mime
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.1"
mobx: mobx:
dependency: "direct main" dependency: "direct main"
description: description:
@ -642,7 +642,7 @@ packages:
name: package_info name: package_info
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.2"
password: password:
dependency: "direct main" dependency: "direct main"
description: description:
@ -712,7 +712,7 @@ packages:
name: pedantic name: pedantic
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.11.0" version: "1.11.1"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
@ -740,7 +740,7 @@ packages:
name: platform name: platform
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.2"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -768,14 +768,14 @@ packages:
name: process name: process
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.1" version: "4.2.3"
protobuf: protobuf:
dependency: transitive dependency: transitive
description: description:
name: protobuf name: protobuf
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.3" version: "1.1.4"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
@ -789,7 +789,7 @@ packages:
name: pub_semver name: pub_semver
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.1.0"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
@ -803,7 +803,7 @@ packages:
name: qr name: qr
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.1.0"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:
@ -824,7 +824,7 @@ packages:
name: share name: share
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.4"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
@ -990,21 +990,21 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.3" version: "6.0.5"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.2"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.2"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1018,14 +1018,14 @@ packages:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.4"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.2"
uuid: uuid:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1060,7 +1060,7 @@ packages:
name: webview_flutter name: webview_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.13"
win32: win32:
dependency: transitive dependency: transitive
description: description:

View file

@ -501,7 +501,9 @@
"yat_alert_content" : "Cake Wallet-Benutzer können jetzt alle ihre Lieblingswährungen mit einem einzigartigen Emoji-basierten Benutzernamen senden und empfangen.", "yat_alert_content" : "Cake Wallet-Benutzer können jetzt alle ihre Lieblingswährungen mit einem einzigartigen Emoji-basierten Benutzernamen senden und empfangen.",
"get_your_yat" : "Holen Sie sich Ihre Yat", "get_your_yat" : "Holen Sie sich Ihre Yat",
"connect_an_existing_yat" : "Verbinden Sie ein vorhandenes Yat", "connect_an_existing_yat" : "Verbinden Sie ein vorhandenes Yat",
"connect_yats": "Yats verbinden",
"yat_address" : "Yat-Adresse", "yat_address" : "Yat-Adresse",
"yat" : "Yat",
"address_from_yat" : "Diese Adresse ist von ${emoji} auf Yat", "address_from_yat" : "Diese Adresse ist von ${emoji} auf Yat",
"yat_error" : "Yat-Fehler", "yat_error" : "Yat-Fehler",
"yat_error_content" : "Keine Adressen mit diesem Yat verknüpft. Versuchen Sie es mit einem anderen Yat", "yat_error_content" : "Keine Adressen mit diesem Yat verknüpft. Versuchen Sie es mit einem anderen Yat",

View file

@ -501,7 +501,9 @@
"yat_alert_content" : "Cake Wallet users can now send and receive all their favorite currencies with a one-of-a-kind emoji-based username.", "yat_alert_content" : "Cake Wallet users can now send and receive all their favorite currencies with a one-of-a-kind emoji-based username.",
"get_your_yat" : "Get your Yat", "get_your_yat" : "Get your Yat",
"connect_an_existing_yat" : "Connect an existing Yat", "connect_an_existing_yat" : "Connect an existing Yat",
"connect_yats": "Connect Yats",
"yat_address" : "Yat Address", "yat_address" : "Yat Address",
"yat" : "Yat",
"address_from_yat" : "This address is from ${emoji} on Yat", "address_from_yat" : "This address is from ${emoji} on Yat",
"yat_error" : "Yat error", "yat_error" : "Yat error",
"yat_error_content" : "No addresses linked with this Yat. Try another Yat", "yat_error_content" : "No addresses linked with this Yat. Try another Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Obtén tu Yat", "get_your_yat" : "Obtén tu Yat",
"connect_an_existing_yat" : "Conectar un Yat existente", "connect_an_existing_yat" : "Conectar un Yat existente",
"yat_address" : "Dirección de Yat", "yat_address" : "Dirección de Yat",
"yat" : "Yat",
"connect_yats": "Conectar Yats",
"address_from_yat" : "Esta dirección es de ${emoji} en Yat", "address_from_yat" : "Esta dirección es de ${emoji} en Yat",
"yat_error" : "Error de Yat", "yat_error" : "Error de Yat",
"yat_error_content" : "No hay direcciones vinculadas con este Yat. Prueba con otro Yat", "yat_error_content" : "No hay direcciones vinculadas con este Yat. Prueba con otro Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "अपना प्राप्त करें Yat", "get_your_yat" : "अपना प्राप्त करें Yat",
"connect_an_existing_yat" : "मौजूदा Yat कनेक्ट करें", "connect_an_existing_yat" : "मौजूदा Yat कनेक्ट करें",
"yat_address" : "Yat पता", "yat_address" : "Yat पता",
"yat" : "Yat",
"connect_yats": "कनेक्ट Yats",
"address_from_yat" : "यह पता ${emoji} से है Yat", "address_from_yat" : "यह पता ${emoji} से है Yat",
"yat_error" : "Yat त्रुटि", "yat_error" : "Yat त्रुटि",
"yat_error_content" : "इसके साथ कोई पता लिंक नहीं है Yat. कोई दूसरा आज़माएं Yat", "yat_error_content" : "इसके साथ कोई पता लिंक नहीं है Yat. कोई दूसरा आज़माएं Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Uzmi svoj Yat", "get_your_yat" : "Uzmi svoj Yat",
"connect_an_existing_yat" : "Povežite postojeći Yat", "connect_an_existing_yat" : "Povežite postojeći Yat",
"yat_address" : "Yat adresa", "yat_address" : "Yat adresa",
"yat" : "Yat",
"connect_yats": "Povežite Yats",
"address_from_yat" : "To je adresa od ${emoji} na Yat", "address_from_yat" : "To je adresa od ${emoji} na Yat",
"yat_error" : "Yat pogreška", "yat_error" : "Yat pogreška",
"yat_error_content" : "Nema adresa povezanih s ovim Yat -om. Pokušajte s drugim Yat -om", "yat_error_content" : "Nema adresa povezanih s ovim Yat -om. Pokušajte s drugim Yat -om",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Ottieni il tuo Yat", "get_your_yat" : "Ottieni il tuo Yat",
"connect_an_existing_yat" : "Collegare un Yat esistente", "connect_an_existing_yat" : "Collegare un Yat esistente",
"yat_address" : "Indirizzo Yat", "yat_address" : "Indirizzo Yat",
"yat" : "Yat",
"connect_yats": "Connetti Yats",
"address_from_yat" : "Questo indirizzo è da ${emoji} in poi Yat", "address_from_yat" : "Questo indirizzo è da ${emoji} in poi Yat",
"yat_error" : "Yat errore", "yat_error" : "Yat errore",
"yat_error_content" : "Nessun indirizzo collegato a questo Yat. Prova un altro Yat", "yat_error_content" : "Nessun indirizzo collegato a questo Yat. Prova un altro Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "あなたのYatを入手してください", "get_your_yat" : "あなたのYatを入手してください",
"connect_an_existing_yat" : "既存のYatを接続します", "connect_an_existing_yat" : "既存のYatを接続します",
"yat_address" : "Yat住所", "yat_address" : "Yat住所",
"yat" : "Yat",
"connect_yats": "Yatsを接続します",
"address_from_yat" : "このアドレスは ${emoji} からのものです Yat", "address_from_yat" : "このアドレスは ${emoji} からのものです Yat",
"yat_error" : "Yatエラー", "yat_error" : "Yatエラー",
"yat_error_content" : "このYatにリンクされているアドレスはありません。別のYatを試してください", "yat_error_content" : "このYatにリンクされているアドレスはありません。別のYatを試してください",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "당신의 Yat를 얻으십시오", "get_your_yat" : "당신의 Yat를 얻으십시오",
"connect_an_existing_yat" : "기존 Yat 연결", "connect_an_existing_yat" : "기존 Yat 연결",
"yat_address" : "Yat 주소", "yat_address" : "Yat 주소",
"yat" : "Yat",
"connect_yats": "야츠 연결",
"address_from_yat" : "이 주소는 ${emoji} 의 주소입니다 Yat", "address_from_yat" : "이 주소는 ${emoji} 의 주소입니다 Yat",
"yat_error" : "Yat 오류", "yat_error" : "Yat 오류",
"yat_error_content" : "이 Yat와 연결된 주소가 없습니다. 다른 Yat 시도", "yat_error_content" : "이 Yat와 연결된 주소가 없습니다. 다른 Yat 시도",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Haal je Yato", "get_your_yat" : "Haal je Yato",
"connect_an_existing_yat" : "Verbind een bestaande Yat", "connect_an_existing_yat" : "Verbind een bestaande Yat",
"yat_address" : "Yat-adres", "yat_address" : "Yat-adres",
"yat" : "Yat",
"connect_yats": "Verbind Yats",
"address_from_yat" : "Dit adres is van ${emoji} op Yat", "address_from_yat" : "Dit adres is van ${emoji} op Yat",
"yat_error" : "Yat fout", "yat_error" : "Yat fout",
"yat_error_content" : "Geen adressen gekoppeld aan deze Yat. Probeer een andere Yato", "yat_error_content" : "Geen adressen gekoppeld aan deze Yat. Probeer een andere Yato",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Zdobądź swój Yat", "get_your_yat" : "Zdobądź swój Yat",
"connect_an_existing_yat" : "Podłącz istniejący Yat", "connect_an_existing_yat" : "Podłącz istniejący Yat",
"yat_address" : "Adres Yat", "yat_address" : "Adres Yat",
"yat" : "Yat",
"connect_yats": "Połącz Yats",
"address_from_yat" : "Ten adres jest od ${emoji} na Yat", "address_from_yat" : "Ten adres jest od ${emoji} na Yat",
"yat_error" : "Pomyłka Yata", "yat_error" : "Pomyłka Yata",
"yat_error_content" : "Brak adresów powiązanych z tym Yat. Wypróbuj inny Yat", "yat_error_content" : "Brak adresów powiązanych z tym Yat. Wypróbuj inny Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Pegue seu Yat", "get_your_yat" : "Pegue seu Yat",
"connect_an_existing_yat" : "Conecte um Yat existente", "connect_an_existing_yat" : "Conecte um Yat existente",
"yat_address" : "Endereço Yat", "yat_address" : "Endereço Yat",
"yat" : "Yat",
"connect_yats": "Connect Yats",
"address_from_yat" : "Este endereço é de ${emoji} em Yat", "address_from_yat" : "Este endereço é de ${emoji} em Yat",
"yat_error" : "Yat erro", "yat_error" : "Yat erro",
"yat_error_content" : "Nenhum endereço vinculado a este Yat. Tente outro Yat", "yat_error_content" : "Nenhum endereço vinculado a este Yat. Tente outro Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Получить свой Yat", "get_your_yat" : "Получить свой Yat",
"connect_an_existing_yat" : "Подключить существующий Yat", "connect_an_existing_yat" : "Подключить существующий Yat",
"yat_address" : "Yat адрес", "yat_address" : "Yat адрес",
"yat" : "Yat",
"connect_yats": "Подключить Yats",
"address_from_yat" : "Этот адрес от ${emoji} на Yat", "address_from_yat" : "Этот адрес от ${emoji} на Yat",
"yat_error" : "Ошибка Yat", "yat_error" : "Ошибка Yat",
"yat_error_content" : "Нет адресов, связанных с этим Yat. Попробуйте другой Yat", "yat_error_content" : "Нет адресов, связанных с этим Yat. Попробуйте другой Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "Одержати свій Yat", "get_your_yat" : "Одержати свій Yat",
"connect_an_existing_yat" : "Підключити існуючий Yat", "connect_an_existing_yat" : "Підключити існуючий Yat",
"yat_address" : "Yat адреса", "yat_address" : "Yat адреса",
"yat" : "Yat",
"connect_yats": "Підключіть Yats",
"address_from_yat" : "Ця адреса від ${emoji} на Yat", "address_from_yat" : "Ця адреса від ${emoji} на Yat",
"yat_error" : "Помилка Yat", "yat_error" : "Помилка Yat",
"yat_error_content" : "Немає адрес, пов'язаних з цим Yat. Спробуйте інший Yat", "yat_error_content" : "Немає адрес, пов'язаних з цим Yat. Спробуйте інший Yat",

View file

@ -502,6 +502,8 @@
"get_your_yat" : "得到你的 Yat", "get_your_yat" : "得到你的 Yat",
"connect_an_existing_yat" : "連接現有 Yat", "connect_an_existing_yat" : "連接現有 Yat",
"yat_address" : "Yat 地址", "yat_address" : "Yat 地址",
"yat" : "Yat",
"connect_yats": "连接 Yats",
"address_from_yat" : "此地址來自 Yat 上的 ${emoji}", "address_from_yat" : "此地址來自 Yat 上的 ${emoji}",
"yat_error" : "Yat 誤差", "yat_error" : "Yat 誤差",
"yat_error_content" : "沒有與此 Yat 相關聯的地址。 嘗試另一個 Yat", "yat_error_content" : "沒有與此 Yat 相關聯的地址。 嘗試另一個 Yat",

View file

@ -5,7 +5,7 @@
MIN_IOS_VERSION=10.0 MIN_IOS_VERSION=10.0
BOOST_URL="https://github.com/cake-tech/Apple-Boost-BuildScript.git" BOOST_URL="https://github.com/cake-tech/Apple-Boost-BuildScript.git"
BOOST_DIR_PATH="${EXTERNAL_IOS_SOURCE_DIR}/Apple-Boost-BuildScript" BOOST_DIR_PATH="${EXTERNAL_IOS_SOURCE_DIR}/Apple-Boost-BuildScript"
BOOST_VERSION=1.74.0 BOOST_VERSION=1.72.0
BOOST_LIBS="random regex graph random chrono thread filesystem system date_time locale serialization program_options" BOOST_LIBS="random regex graph random chrono thread filesystem system date_time locale serialization program_options"
echo "============================ Boost ============================" echo "============================ Boost ============================"