mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-03-12 09:32:33 +00:00
add connecting status
This commit is contained in:
parent
b7963684b2
commit
e407a6d385
34 changed files with 158 additions and 76 deletions
|
@ -392,7 +392,8 @@ Future<void> setup({
|
|||
yatStore: getIt.get<YatStore>(),
|
||||
ordersStore: getIt.get<OrdersStore>(),
|
||||
anonpayTransactionsStore: getIt.get<AnonpayTransactionsStore>(),
|
||||
keyService: getIt.get<KeyService>()));
|
||||
keyService: getIt.get<KeyService>(),
|
||||
torViewModel: getIt.get<TorViewModel>()));
|
||||
|
||||
getIt.registerFactory<AuthService>(
|
||||
() => AuthService(
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_connection.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_view_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cake_wallet/core/sync_status_title.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:cw_core/sync_status.dart';
|
||||
import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.dart';
|
||||
import 'package:tor/tor.dart';
|
||||
|
||||
class SyncIndicator extends StatelessWidget {
|
||||
SyncIndicator({required this.dashboardViewModel, required this.onTap});
|
||||
SyncIndicator(
|
||||
{required this.dashboardViewModel, required this.onTap});
|
||||
|
||||
final DashboardViewModel dashboardViewModel;
|
||||
final Function() onTap;
|
||||
|
@ -57,12 +55,23 @@ class SyncIndicator extends StatelessWidget {
|
|||
Row(
|
||||
children: [
|
||||
Observer(builder: (_) {
|
||||
Widget torImage;
|
||||
switch (dashboardViewModel.torViewModel.torConnectionStatus) {
|
||||
case TorConnectionStatus.connected:
|
||||
torImage = Image.asset('assets/images/tor_icon.png');
|
||||
break;
|
||||
case TorConnectionStatus.connecting:
|
||||
torImage =
|
||||
Image.asset('assets/images/tor_icon.png', color: Colors.amber);
|
||||
break;
|
||||
case TorConnectionStatus.disconnected:
|
||||
torImage = Image.asset('assets/images/tor_icon_disabled.png');
|
||||
break;
|
||||
}
|
||||
return Container(
|
||||
width: 15,
|
||||
margin: EdgeInsets.only(left: 12, bottom: 2),
|
||||
child: dashboardViewModel.isTorConnected
|
||||
? Image.asset('assets/images/tor_icon.png')
|
||||
: Image.asset('assets/images/tor_icon_disabled.png'),
|
||||
child: torImage,
|
||||
);
|
||||
}),
|
||||
],
|
||||
|
|
|
@ -3,10 +3,13 @@ import 'package:flutter/material.dart';
|
|||
import 'package:cake_wallet/palette.dart';
|
||||
|
||||
class NodeIndicator extends StatelessWidget {
|
||||
NodeIndicator({this.isLive = false, this.showText = false});
|
||||
NodeIndicator({
|
||||
this.color = Palette.red,
|
||||
this.text = "",
|
||||
});
|
||||
|
||||
final bool isLive;
|
||||
final bool showText;
|
||||
final Color? color;
|
||||
final String text;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -15,13 +18,15 @@ class NodeIndicator extends StatelessWidget {
|
|||
Container(
|
||||
width: 12.0,
|
||||
height: 12.0,
|
||||
decoration:
|
||||
BoxDecoration(shape: BoxShape.circle, color: isLive ? Palette.green : Palette.red),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
if (showText) ...[
|
||||
if (text.isNotEmpty) ...[
|
||||
const SizedBox(width: 8.0),
|
||||
Text(
|
||||
isLive ? S.current.connected : S.current.disconnected,
|
||||
text,
|
||||
style: TextStyle(fontSize: 14.0),
|
||||
)
|
||||
],
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart';
|
||||
import 'package:cake_wallet/src/widgets/standard_list.dart';
|
||||
|
@ -23,12 +24,16 @@ class NodeListRow extends StandardListRow {
|
|||
return FutureBuilder(
|
||||
future: node.requestNode(),
|
||||
builder: (context, snapshot) {
|
||||
Color? color;
|
||||
switch (snapshot.connectionState) {
|
||||
case ConnectionState.done:
|
||||
return NodeIndicator(isLive: (snapshot.data as bool?) ?? false);
|
||||
color = ((snapshot.data as bool?) ?? false) ? Palette.green : Palette.red;
|
||||
break;
|
||||
default:
|
||||
return NodeIndicator(isLive: false);
|
||||
color = Palette.red;
|
||||
break;
|
||||
}
|
||||
return NodeIndicator(color: color);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -41,14 +46,9 @@ class NodeListRow extends StandardListRow {
|
|||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Theme.of(context)
|
||||
.extension<ReceivePageTheme>()!
|
||||
.iconsBackgroundColor),
|
||||
color: Theme.of(context).extension<ReceivePageTheme>()!.iconsBackgroundColor),
|
||||
child: Icon(Icons.edit,
|
||||
size: 14,
|
||||
color: Theme.of(context)
|
||||
.extension<ReceivePageTheme>()!
|
||||
.iconsColor)));
|
||||
size: 14, color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,7 @@ class NodeHeaderListRow extends StandardListRow {
|
|||
return SizedBox(
|
||||
width: 20,
|
||||
child: Icon(Icons.add,
|
||||
color: Theme.of(context).extension<FilterTheme>()!.titlesColor,size: 24.0),
|
||||
color: Theme.of(context).extension<FilterTheme>()!.titlesColor, size: 24.0),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,8 +101,8 @@ class ConnectionSyncPage extends BasePage {
|
|||
title: S.current.tor_connection,
|
||||
items: TorConnectionMode.all,
|
||||
displayItem: (TorConnectionMode mode) => mode.title,
|
||||
selectedItem: dashboardViewModel.torConnectionMode,
|
||||
onItemSelected: dashboardViewModel.setTorConnectionMode,
|
||||
selectedItem: dashboardViewModel.torViewModel.torConnectionMode,
|
||||
onItemSelected: dashboardViewModel.torViewModel.setTorConnectionMode,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(25), topRight: Radius.circular(25)),
|
||||
|
@ -112,7 +112,7 @@ class ConnectionSyncPage extends BasePage {
|
|||
}),
|
||||
Observer(builder: (context) {
|
||||
return TorStatus(
|
||||
connected: dashboardViewModel.isTorConnected,
|
||||
torViewModel: dashboardViewModel.torViewModel,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)),
|
||||
|
|
|
@ -1,26 +1,41 @@
|
|||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart';
|
||||
import 'package:cake_wallet/src/widgets/standard_list.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_view_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/themes/extensions/filter_theme.dart';
|
||||
import 'package:tor/tor.dart';
|
||||
|
||||
class TorStatus extends StandardListRow {
|
||||
TorStatus(
|
||||
{required String title,
|
||||
required void Function(BuildContext context) onTap,
|
||||
required bool isSelected,
|
||||
required this.connected,
|
||||
required this.torViewModel,
|
||||
BoxDecoration? decoration})
|
||||
: super(title: title, onTap: onTap, isSelected: isSelected, decoration: decoration);
|
||||
|
||||
final bool connected;
|
||||
final TorViewModel torViewModel;
|
||||
|
||||
@override
|
||||
Widget buildTrailing(BuildContext context) {
|
||||
return NodeIndicator(
|
||||
isLive: connected,
|
||||
showText: true,
|
||||
);
|
||||
Color? color;
|
||||
String? text;
|
||||
switch (torViewModel.torConnectionStatus) {
|
||||
case TorConnectionStatus.connected:
|
||||
color = Palette.green;
|
||||
text = S.current.connected;
|
||||
break;
|
||||
case TorConnectionStatus.connecting:
|
||||
color = Colors.amber;
|
||||
text = S.current.connecting;
|
||||
break;
|
||||
case TorConnectionStatus.disconnected:
|
||||
color = Palette.red;
|
||||
text = S.current.disconnected;
|
||||
break;
|
||||
}
|
||||
return NodeIndicator(color: color, text: text);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
|
|||
import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
|
||||
import 'package:cake_wallet/view_model/settings/sync_mode.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_connection.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_view_model.dart';
|
||||
import 'package:cake_wallet/wallet_type_utils.dart';
|
||||
import 'package:cryptography/cryptography.dart';
|
||||
import 'package:cw_core/balance.dart';
|
||||
|
@ -61,7 +62,8 @@ abstract class DashboardViewModelBase with Store {
|
|||
required this.yatStore,
|
||||
required this.ordersStore,
|
||||
required this.anonpayTransactionsStore,
|
||||
required this.keyService})
|
||||
required this.keyService,
|
||||
required this.torViewModel})
|
||||
: hasSellAction = false,
|
||||
hasBuyAction = false,
|
||||
hasExchangeAction = false,
|
||||
|
@ -281,6 +283,8 @@ abstract class DashboardViewModelBase with Store {
|
|||
|
||||
BalanceViewModel balanceViewModel;
|
||||
|
||||
TorViewModel torViewModel;
|
||||
|
||||
AppStore appStore;
|
||||
|
||||
SettingsStore settingsStore;
|
||||
|
@ -460,18 +464,6 @@ abstract class DashboardViewModelBase with Store {
|
|||
@action
|
||||
void setSyncMode(SyncMode syncMode) => settingsStore.currentSyncMode = syncMode;
|
||||
|
||||
@computed
|
||||
TorConnectionMode get torConnectionMode => settingsStore.torConnectionMode;
|
||||
|
||||
@action
|
||||
void setTorConnectionMode(TorConnectionMode mode) => settingsStore.torConnectionMode = mode;
|
||||
|
||||
@computed
|
||||
bool get isTorConnected =>
|
||||
(settingsStore.torConnectionMode == TorConnectionMode.enabled ||
|
||||
settingsStore.torConnectionMode == TorConnectionMode.onionOnly) &&
|
||||
(Tor.instance.port != -1);
|
||||
|
||||
@computed
|
||||
bool get syncAll => settingsStore.currentSyncAll;
|
||||
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/view_model/settings/tor_connection.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:tor/tor.dart';
|
||||
|
||||
part 'tor_view_model.g.dart';
|
||||
|
||||
class TorViewModel = TorViewModelBase with _$TorViewModel;
|
||||
|
||||
abstract class TorViewModelBase with Store {
|
||||
enum TorConnectionStatus { connecting, connected, disconnected }
|
||||
|
||||
abstract class TorViewModelBase with Store {
|
||||
TorViewModelBase(this._settingsStore);
|
||||
|
||||
final SettingsStore _settingsStore;
|
||||
|
@ -15,4 +18,35 @@ abstract class TorViewModelBase with Store {
|
|||
Future<void> updateStartOnLaunch(bool value) async {
|
||||
_settingsStore.shouldStartTorOnLaunch = value;
|
||||
}
|
||||
|
||||
@computed
|
||||
TorConnectionMode get torConnectionMode => _settingsStore.torConnectionMode;
|
||||
|
||||
@action
|
||||
void setTorConnectionMode(TorConnectionMode mode) => _settingsStore.torConnectionMode = mode;
|
||||
|
||||
// @computed
|
||||
// bool get isTorConnected =>
|
||||
// (_settingsStore.torConnectionMode == TorConnectionMode.enabled ||
|
||||
// _settingsStore.torConnectionMode == TorConnectionMode.onionOnly) &&
|
||||
// (Tor.instance.port != -1);
|
||||
|
||||
@computed
|
||||
TorConnectionStatus get torConnectionStatus {
|
||||
|
||||
if (_settingsStore.torConnectionMode == TorConnectionMode.disabled) {
|
||||
return TorConnectionStatus.disconnected;
|
||||
}
|
||||
|
||||
if (Tor.instance.port == -1 && Tor.instance.started) {
|
||||
return TorConnectionStatus.connecting;
|
||||
}
|
||||
|
||||
if (Tor.instance.port != -1) {
|
||||
return TorConnectionStatus.connected;
|
||||
}
|
||||
|
||||
return TorConnectionStatus.disconnected;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -764,5 +764,6 @@
|
|||
"tor_status": "وضع تور",
|
||||
"connected": "متصل",
|
||||
"disconnected": "انقطع الاتصال",
|
||||
"onion_only": "البصل فقط"
|
||||
"onion_only": "البصل فقط",
|
||||
"connecting": "توصيل"
|
||||
}
|
|
@ -760,5 +760,6 @@
|
|||
"tor_status": "TOR статус",
|
||||
"connected": "Свързани",
|
||||
"disconnected": "Изключен",
|
||||
"onion_only": "Само лук"
|
||||
"onion_only": "Само лук",
|
||||
"connecting": "Свързване"
|
||||
}
|
|
@ -760,5 +760,6 @@
|
|||
"tor_status": "TOR status",
|
||||
"connected": "Připojeno",
|
||||
"disconnected": "Odpojené",
|
||||
"onion_only": "Pouze cibule"
|
||||
"onion_only": "Pouze cibule",
|
||||
"connecting": "Spojovací"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Torstatus",
|
||||
"connected": "In Verbindung gebracht",
|
||||
"disconnected": "Getrennt",
|
||||
"onion_only": "Nur Zwiebel"
|
||||
"onion_only": "Nur Zwiebel",
|
||||
"connecting": "Verbinden"
|
||||
}
|
|
@ -769,5 +769,6 @@
|
|||
"tor_status": "Tor status",
|
||||
"connected": "Connected",
|
||||
"disconnected": "Disconnected",
|
||||
"onion_only": "Onion only"
|
||||
"onion_only": "Onion only",
|
||||
"connecting": "Connecting"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Estado de Tor",
|
||||
"connected": "Conectado",
|
||||
"disconnected": "Desconectado",
|
||||
"onion_only": "Solo cebolla"
|
||||
"onion_only": "Solo cebolla",
|
||||
"connecting": "Conexión"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Statut",
|
||||
"connected": "Connecté",
|
||||
"disconnected": "Débranché",
|
||||
"onion_only": "Oignon seulement"
|
||||
"onion_only": "Oignon seulement",
|
||||
"connecting": "De liaison"
|
||||
}
|
|
@ -750,5 +750,6 @@
|
|||
"tor_status": "State State",
|
||||
"connected": "Wanda aka haɗa",
|
||||
"disconnected": "Katse",
|
||||
"onion_only": "Albasa kawai"
|
||||
"onion_only": "Albasa kawai",
|
||||
"connecting": "Haɗa"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "टोर की स्थिति",
|
||||
"connected": "जुड़े हुए",
|
||||
"disconnected": "डिस्कनेक्ट किया गया",
|
||||
"onion_only": "केवल प्याज"
|
||||
"onion_only": "केवल प्याज",
|
||||
"connecting": "कनेक्ट"
|
||||
}
|
|
@ -766,5 +766,6 @@
|
|||
"tor_status": "Status tor",
|
||||
"connected": "Povezan",
|
||||
"disconnected": "Isključen",
|
||||
"onion_only": "Samo luk"
|
||||
"onion_only": "Samo luk",
|
||||
"connecting": "Spoj"
|
||||
}
|
|
@ -756,5 +756,6 @@
|
|||
"tor_status": "Status Tor",
|
||||
"connected": "Terhubung",
|
||||
"disconnected": "Terputus",
|
||||
"onion_only": "Bawang saja"
|
||||
"onion_only": "Bawang saja",
|
||||
"connecting": "Menghubungkan"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Stato di tor",
|
||||
"connected": "Collegato",
|
||||
"disconnected": "Disconnesso",
|
||||
"onion_only": "Solo cipolla"
|
||||
"onion_only": "Solo cipolla",
|
||||
"connecting": "Connessione"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "TORステータス",
|
||||
"connected": "接続",
|
||||
"disconnected": "切断された",
|
||||
"onion_only": "オニオンのみ"
|
||||
"onion_only": "オニオンのみ",
|
||||
"connecting": "接続"
|
||||
}
|
|
@ -766,5 +766,6 @@
|
|||
"tor_status": "Tor 상태",
|
||||
"connected": "연결",
|
||||
"disconnected": "연결이 끊어졌습니다",
|
||||
"onion_only": "양파 만"
|
||||
"onion_only": "양파 만",
|
||||
"connecting": "연결"
|
||||
}
|
|
@ -766,5 +766,6 @@
|
|||
"tor_status": "Tor Status",
|
||||
"connected": "ချိတ်ဆက်ထားသော",
|
||||
"disconnected": "ချို့ယွင်းချက်",
|
||||
"onion_only": "သာကြက်သွန်"
|
||||
"onion_only": "သာကြက်သွန်",
|
||||
"connecting": "ချိတ်ဆက်"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Tor Status",
|
||||
"connected": "Verbonden",
|
||||
"disconnected": "Losgekoppeld",
|
||||
"onion_only": "Alleen ui"
|
||||
"onion_only": "Alleen ui",
|
||||
"connecting": "Verbinden"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Status TOR",
|
||||
"connected": "Połączony",
|
||||
"disconnected": "Bezładny",
|
||||
"onion_only": "Tylko cebula"
|
||||
"onion_only": "Tylko cebula",
|
||||
"connecting": "Złączony"
|
||||
}
|
|
@ -767,5 +767,6 @@
|
|||
"tor_status": "Status de tor",
|
||||
"connected": "Conectado",
|
||||
"disconnected": "Desconectado",
|
||||
"onion_only": "Apenas cebola"
|
||||
"onion_only": "Apenas cebola",
|
||||
"connecting": "Conectando"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "ТОР Статус",
|
||||
"connected": "Связанный",
|
||||
"disconnected": "Отключен",
|
||||
"onion_only": "Только лук"
|
||||
"onion_only": "Только лук",
|
||||
"connecting": "Соединение"
|
||||
}
|
|
@ -766,5 +766,6 @@
|
|||
"tor_status": "สถานะ tor",
|
||||
"connected": "ซึ่งเชื่อมต่อกัน",
|
||||
"disconnected": "ตัดการเชื่อมต่อ",
|
||||
"onion_only": "หัวหอมเท่านั้น"
|
||||
"onion_only": "หัวหอมเท่านั้น",
|
||||
"connecting": "การเชื่อมต่อ"
|
||||
}
|
|
@ -762,5 +762,6 @@
|
|||
"tor_status": "Katayuan ng tor",
|
||||
"connected": "Konektado",
|
||||
"disconnected": "Naka -disconnect",
|
||||
"onion_only": "Onion lamang"
|
||||
"onion_only": "Onion lamang",
|
||||
"connecting": "Pagkonekta"
|
||||
}
|
|
@ -766,5 +766,6 @@
|
|||
"tor_status": "Tor Durumu",
|
||||
"connected": "Bağlı",
|
||||
"disconnected": "Bağlantı kesildi",
|
||||
"onion_only": "Sadece soğan"
|
||||
"onion_only": "Sadece soğan",
|
||||
"connecting": "Bağlanıyor"
|
||||
}
|
|
@ -768,5 +768,6 @@
|
|||
"tor_status": "Статус Tor",
|
||||
"connected": "З'єднаний",
|
||||
"disconnected": "Роз'єднаний",
|
||||
"onion_only": "Тільки цибуля"
|
||||
"onion_only": "Тільки цибуля",
|
||||
"connecting": "З'єднання"
|
||||
}
|
|
@ -760,5 +760,6 @@
|
|||
"tor_status": "ٹور کی حیثیت",
|
||||
"connected": "منسلک",
|
||||
"disconnected": "منقطع",
|
||||
"onion_only": "صرف پیاز"
|
||||
"onion_only": "صرف پیاز",
|
||||
"connecting": "رابطہ قائم کرنا"
|
||||
}
|
|
@ -762,5 +762,6 @@
|
|||
"tor_status": "Ipo Tor",
|
||||
"connected": "Sopọ",
|
||||
"disconnected": "Ge asopọ",
|
||||
"onion_only": "Alubosa nikan"
|
||||
"onion_only": "Alubosa nikan",
|
||||
"connecting": "Asopọ"
|
||||
}
|
|
@ -767,5 +767,6 @@
|
|||
"tor_status": "TOR状态",
|
||||
"connected": "连接的",
|
||||
"disconnected": "断开连接",
|
||||
"onion_only": "仅洋葱"
|
||||
"onion_only": "仅洋葱",
|
||||
"connecting": "连接"
|
||||
}
|
Loading…
Reference in a new issue