add connecting status

This commit is contained in:
Matthew Fosse 2024-01-04 13:43:11 -05:00
parent b7963684b2
commit e407a6d385
34 changed files with 158 additions and 76 deletions

View file

@ -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(

View file

@ -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,
);
}),
],

View file

@ -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),
)
],

View file

@ -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),
);
}
}

View file

@ -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)),

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -764,5 +764,6 @@
"tor_status": "وضع تور",
"connected": "متصل",
"disconnected": "انقطع الاتصال",
"onion_only": "البصل فقط"
"onion_only": "البصل فقط",
"connecting": "توصيل"
}

View file

@ -760,5 +760,6 @@
"tor_status": "TOR статус",
"connected": "Свързани",
"disconnected": "Изключен",
"onion_only": "Само лук"
"onion_only": "Само лук",
"connecting": "Свързване"
}

View file

@ -760,5 +760,6 @@
"tor_status": "TOR status",
"connected": "Připojeno",
"disconnected": "Odpojené",
"onion_only": "Pouze cibule"
"onion_only": "Pouze cibule",
"connecting": "Spojovací"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Torstatus",
"connected": "In Verbindung gebracht",
"disconnected": "Getrennt",
"onion_only": "Nur Zwiebel"
"onion_only": "Nur Zwiebel",
"connecting": "Verbinden"
}

View file

@ -769,5 +769,6 @@
"tor_status": "Tor status",
"connected": "Connected",
"disconnected": "Disconnected",
"onion_only": "Onion only"
"onion_only": "Onion only",
"connecting": "Connecting"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Estado de Tor",
"connected": "Conectado",
"disconnected": "Desconectado",
"onion_only": "Solo cebolla"
"onion_only": "Solo cebolla",
"connecting": "Conexión"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Statut",
"connected": "Connecté",
"disconnected": "Débranché",
"onion_only": "Oignon seulement"
"onion_only": "Oignon seulement",
"connecting": "De liaison"
}

View file

@ -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"
}

View file

@ -768,5 +768,6 @@
"tor_status": "टोर की स्थिति",
"connected": "जुड़े हुए",
"disconnected": "डिस्कनेक्ट किया गया",
"onion_only": "केवल प्याज"
"onion_only": "केवल प्याज",
"connecting": "कनेक्ट"
}

View file

@ -766,5 +766,6 @@
"tor_status": "Status tor",
"connected": "Povezan",
"disconnected": "Isključen",
"onion_only": "Samo luk"
"onion_only": "Samo luk",
"connecting": "Spoj"
}

View file

@ -756,5 +756,6 @@
"tor_status": "Status Tor",
"connected": "Terhubung",
"disconnected": "Terputus",
"onion_only": "Bawang saja"
"onion_only": "Bawang saja",
"connecting": "Menghubungkan"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Stato di tor",
"connected": "Collegato",
"disconnected": "Disconnesso",
"onion_only": "Solo cipolla"
"onion_only": "Solo cipolla",
"connecting": "Connessione"
}

View file

@ -768,5 +768,6 @@
"tor_status": "TORステータス",
"connected": "接続",
"disconnected": "切断された",
"onion_only": "オニオンのみ"
"onion_only": "オニオンのみ",
"connecting": "接続"
}

View file

@ -766,5 +766,6 @@
"tor_status": "Tor 상태",
"connected": "연결",
"disconnected": "연결이 끊어졌습니다",
"onion_only": "양파 만"
"onion_only": "양파 만",
"connecting": "연결"
}

View file

@ -766,5 +766,6 @@
"tor_status": "Tor Status",
"connected": "ချိတ်ဆက်ထားသော",
"disconnected": "ချို့ယွင်းချက်",
"onion_only": "သာကြက်သွန်"
"onion_only": "သာကြက်သွန်",
"connecting": "ချိတ်ဆက်"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Tor Status",
"connected": "Verbonden",
"disconnected": "Losgekoppeld",
"onion_only": "Alleen ui"
"onion_only": "Alleen ui",
"connecting": "Verbinden"
}

View file

@ -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"
}

View file

@ -767,5 +767,6 @@
"tor_status": "Status de tor",
"connected": "Conectado",
"disconnected": "Desconectado",
"onion_only": "Apenas cebola"
"onion_only": "Apenas cebola",
"connecting": "Conectando"
}

View file

@ -768,5 +768,6 @@
"tor_status": "ТОР Статус",
"connected": "Связанный",
"disconnected": "Отключен",
"onion_only": "Только лук"
"onion_only": "Только лук",
"connecting": "Соединение"
}

View file

@ -766,5 +766,6 @@
"tor_status": "สถานะ tor",
"connected": "ซึ่งเชื่อมต่อกัน",
"disconnected": "ตัดการเชื่อมต่อ",
"onion_only": "หัวหอมเท่านั้น"
"onion_only": "หัวหอมเท่านั้น",
"connecting": "การเชื่อมต่อ"
}

View file

@ -762,5 +762,6 @@
"tor_status": "Katayuan ng tor",
"connected": "Konektado",
"disconnected": "Naka -disconnect",
"onion_only": "Onion lamang"
"onion_only": "Onion lamang",
"connecting": "Pagkonekta"
}

View file

@ -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"
}

View file

@ -768,5 +768,6 @@
"tor_status": "Статус Tor",
"connected": "З'єднаний",
"disconnected": "Роз'єднаний",
"onion_only": "Тільки цибуля"
"onion_only": "Тільки цибуля",
"connecting": "З'єднання"
}

View file

@ -760,5 +760,6 @@
"tor_status": "ٹور کی حیثیت",
"connected": "منسلک",
"disconnected": "منقطع",
"onion_only": "صرف پیاز"
"onion_only": "صرف پیاز",
"connecting": "رابطہ قائم کرنا"
}

View file

@ -762,5 +762,6 @@
"tor_status": "Ipo Tor",
"connected": "Sopọ",
"disconnected": "Ge asopọ",
"onion_only": "Alubosa nikan"
"onion_only": "Alubosa nikan",
"connecting": "Asopọ"
}

View file

@ -767,5 +767,6 @@
"tor_status": "TOR状态",
"connected": "连接的",
"disconnected": "断开连接",
"onion_only": "仅洋葱"
"onion_only": "仅洋葱",
"connecting": "连接"
}