mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
Implement meshcore-open route reload
This commit is contained in:
@@ -469,6 +469,9 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
final retryCause = _retryCauseLabel(widget.message);
|
||||
final retryResult = _retryResultLabel(widget.message);
|
||||
final retryMode = _retryModeLabel(widget.message);
|
||||
final routeMetadata = context
|
||||
.read<MessagesProvider>()
|
||||
.getMessageRouteMetadata(widget.message.id);
|
||||
|
||||
final rawLines = <String>[
|
||||
'Message ID: ${widget.message.id}',
|
||||
@@ -790,7 +793,7 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
_detailRow(
|
||||
context,
|
||||
label: l10n.retryAttempt,
|
||||
value: '${widget.message.retryAttempt}/3',
|
||||
value: '${widget.message.retryAttempt}/4',
|
||||
),
|
||||
if (widget.message.lastRetryAt != null)
|
||||
_detailRow(
|
||||
@@ -809,6 +812,20 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
label: l10n.floodFallback,
|
||||
value: l10n.yes,
|
||||
),
|
||||
if (routeMetadata?.relayName case final relayName?)
|
||||
_detailRow(
|
||||
context,
|
||||
label: 'Relay',
|
||||
value: relayName,
|
||||
),
|
||||
if (routeMetadata?.canonicalPath
|
||||
case final routePath?)
|
||||
_detailRow(
|
||||
context,
|
||||
label: 'Selected path',
|
||||
value: routePath,
|
||||
onCopy: () => copyField(routePath),
|
||||
),
|
||||
if (retryResult != null)
|
||||
_detailRow(
|
||||
context,
|
||||
@@ -885,7 +902,9 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
_detailRow(
|
||||
context,
|
||||
label: l10n.envelope,
|
||||
value: envelope != null ? 'VE3 compact' : l10n.unknown,
|
||||
value: envelope != null
|
||||
? 'VE3 compact'
|
||||
: l10n.unknown,
|
||||
),
|
||||
if (voiceSession != null)
|
||||
_detailRow(
|
||||
@@ -1545,8 +1564,15 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
return null;
|
||||
}
|
||||
|
||||
final routeMetadata = context
|
||||
.read<MessagesProvider>()
|
||||
.getMessageRouteMetadata(message.id);
|
||||
if (routeMetadata != null) {
|
||||
return routeMetadata.modeLabel;
|
||||
}
|
||||
|
||||
if (message.usedFloodFallback) {
|
||||
return 'Flood fallback';
|
||||
return 'Flood route';
|
||||
}
|
||||
|
||||
if (message.retryAttempt > 0 || message.expectedAckTag != null) {
|
||||
@@ -1561,9 +1587,17 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
return null;
|
||||
}
|
||||
|
||||
final routeMetadata = context
|
||||
.read<MessagesProvider>()
|
||||
.getMessageRouteMetadata(message.id);
|
||||
final routeLabel = routeMetadata?.modeLabel.toLowerCase();
|
||||
|
||||
if (message.deliveryStatus == MessageDeliveryStatus.delivered) {
|
||||
if (routeLabel != null) {
|
||||
return 'Delivered via $routeLabel';
|
||||
}
|
||||
if (message.usedFloodFallback) {
|
||||
return 'Delivered after flood fallback';
|
||||
return 'Delivered after flood route';
|
||||
}
|
||||
if (message.retryAttempt > 0) {
|
||||
return 'Delivered after retry';
|
||||
@@ -1574,8 +1608,11 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
}
|
||||
|
||||
if (message.deliveryStatus == MessageDeliveryStatus.sending) {
|
||||
if (routeLabel != null) {
|
||||
return '$routeLabel in progress';
|
||||
}
|
||||
if (message.usedFloodFallback) {
|
||||
return 'Flood fallback in progress';
|
||||
return 'Flood route in progress';
|
||||
}
|
||||
if (message.retryAttempt > 0) {
|
||||
return 'Retry in progress';
|
||||
@@ -1586,8 +1623,11 @@ class _MessageBubbleState extends State<MessageBubble> {
|
||||
}
|
||||
|
||||
if (message.deliveryStatus == MessageDeliveryStatus.failed) {
|
||||
if (routeLabel != null) {
|
||||
return 'Failed via $routeLabel';
|
||||
}
|
||||
if (message.usedFloodFallback) {
|
||||
return 'Failed after flood fallback';
|
||||
return 'Failed after flood route';
|
||||
}
|
||||
if (message.retryAttempt > 0) {
|
||||
return 'Failed after retry attempts';
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../../models/message.dart';
|
||||
import '../../models/path_selection.dart';
|
||||
import '../../models/message_reception_details.dart';
|
||||
import '../../providers/messages_provider.dart';
|
||||
|
||||
IconData getDeliveryStatusIcon(MessageDeliveryStatus status) {
|
||||
switch (status) {
|
||||
@@ -185,6 +188,9 @@ Widget buildSentDirectSignalStatus(
|
||||
required int roundTripTimeMs,
|
||||
required Duration txEstimate,
|
||||
}) {
|
||||
final routeMetadata = context
|
||||
.read<MessagesProvider>()
|
||||
.getMessageRouteMetadata(message.id);
|
||||
final estimatedTransmitMs = sanitizeEstimatedTransmitMs(
|
||||
estimatedTransmitMs: txEstimate > Duration.zero
|
||||
? txEstimate.inMilliseconds
|
||||
@@ -230,7 +236,7 @@ Widget buildSentDirectSignalStatus(
|
||||
_techChip(
|
||||
context,
|
||||
icon: Icons.refresh,
|
||||
label: 'retry ${message.retryAttempt}/3',
|
||||
label: 'retry ${message.retryAttempt}/4',
|
||||
color: Colors.redAccent,
|
||||
),
|
||||
if (message.suggestedTimeoutMs != null)
|
||||
@@ -244,7 +250,7 @@ Widget buildSentDirectSignalStatus(
|
||||
_techChip(
|
||||
context,
|
||||
icon: Icons.waves,
|
||||
label: 'flood fallback',
|
||||
label: 'flood route',
|
||||
color: Colors.teal,
|
||||
)
|
||||
else if (message.expectedAckTag != null)
|
||||
@@ -254,6 +260,17 @@ Widget buildSentDirectSignalStatus(
|
||||
label: 'direct ACK',
|
||||
color: Colors.indigo,
|
||||
),
|
||||
if (routeMetadata != null)
|
||||
_techChip(
|
||||
context,
|
||||
icon: routeMetadata.mode == PathSelectionMode.nearestRouter
|
||||
? Icons.router
|
||||
: Icons.alt_route,
|
||||
label: routeMetadata.modeLabel,
|
||||
color: routeMetadata.mode == PathSelectionMode.nearestRouter
|
||||
? Colors.deepPurple
|
||||
: Colors.indigo,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user