kopia lustrzana https://gitlab.com/mysocialportal/relatica
Add icons and info text for delivery data on posts/comments
Implements Feature #66merge-requests/67/merge
rodzic
5b8320d8c4
commit
526c8c4d83
|
|
@ -41,6 +41,8 @@
|
||||||
old. ([Feature #58](https://gitlab.com/mysocialportal/relatica/-/issues/58))
|
old. ([Feature #58](https://gitlab.com/mysocialportal/relatica/-/issues/58))
|
||||||
* Autocomplete now lists hashtags and accounts that are used in a post or post above the rest of the
|
* Autocomplete now lists hashtags and accounts that are used in a post or post above the rest of the
|
||||||
results. ([Feature #28](https://gitlab.com/mysocialportal/relatica/-/issues/28))
|
results. ([Feature #28](https://gitlab.com/mysocialportal/relatica/-/issues/28))
|
||||||
|
* Show delivery data for logged in user's posts and comments (not
|
||||||
|
reshares) ([Feature #66](https://gitlab.com/mysocialportal/relatica/-/issues/66))
|
||||||
|
|
||||||
## Version 0.10.1 (beta)
|
## Version 0.10.1 (beta)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -142,9 +142,44 @@ class StatusHeaderControl extends StatelessWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
TimelineNetworkInfoControl(info: entry.networkInfo),
|
TimelineNetworkInfoControl(info: entry.networkInfo),
|
||||||
|
if (entry.deliveryData.hasDeliveryData) ...[
|
||||||
|
const HorizontalPadding(),
|
||||||
|
buildDeliveryIndicator(context),
|
||||||
|
],
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildDeliveryIndicator(BuildContext context) {
|
||||||
|
final data = entry.deliveryData;
|
||||||
|
const fullyDeliveredIcon = '\uf1d8'; //fa-paper-plane
|
||||||
|
const inDeliveryIcon = '\uf1d9'; //fa-paper-plane-o
|
||||||
|
final percentRemaining =
|
||||||
|
data.leftForDelivery.toDouble() / data.total.toDouble();
|
||||||
|
final iconText =
|
||||||
|
percentRemaining > 0.1 ? inDeliveryIcon : fullyDeliveredIcon;
|
||||||
|
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () async {
|
||||||
|
final text = """
|
||||||
|
Federated Messages Deliveries to Remote Servers
|
||||||
|
Total: ${data.total}
|
||||||
|
Completed: ${data.done}
|
||||||
|
Failed: ${data.failed}
|
||||||
|
Remaining: ${data.leftForDelivery}
|
||||||
|
""";
|
||||||
|
showConfirmDialog(context, text);
|
||||||
|
},
|
||||||
|
child: Tooltip(
|
||||||
|
message:
|
||||||
|
'Deliveries to remote servers: ${entry.deliveryData.done}/${entry.deliveryData.total}',
|
||||||
|
child: Text(
|
||||||
|
iconText,
|
||||||
|
style: const TextStyle(fontFamily: 'ForkAwesome'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
class DeliveryData {
|
||||||
|
static const empty = DeliveryData(total: 0, done: 0, failed: 0);
|
||||||
|
|
||||||
|
final int total;
|
||||||
|
final int done;
|
||||||
|
final int failed;
|
||||||
|
|
||||||
|
const DeliveryData({
|
||||||
|
required this.total,
|
||||||
|
required this.done,
|
||||||
|
required this.failed,
|
||||||
|
});
|
||||||
|
|
||||||
|
bool get hasDeliveryData => total > 0;
|
||||||
|
|
||||||
|
int get leftForDelivery => total - done - failed;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import '../globals.dart';
|
import '../globals.dart';
|
||||||
import 'connection.dart';
|
import 'connection.dart';
|
||||||
|
import 'delivery_data.dart';
|
||||||
import 'engagement_summary.dart';
|
import 'engagement_summary.dart';
|
||||||
import 'link_data.dart';
|
import 'link_data.dart';
|
||||||
import 'link_preview_data.dart';
|
import 'link_preview_data.dart';
|
||||||
|
|
@ -59,6 +60,8 @@ class TimelineEntry {
|
||||||
|
|
||||||
final EngagementSummary engagementSummary;
|
final EngagementSummary engagementSummary;
|
||||||
|
|
||||||
|
final DeliveryData deliveryData;
|
||||||
|
|
||||||
TimelineEntry(
|
TimelineEntry(
|
||||||
{this.id = '',
|
{this.id = '',
|
||||||
this.parentId = '',
|
this.parentId = '',
|
||||||
|
|
@ -84,7 +87,8 @@ class TimelineEntry {
|
||||||
this.mediaAttachments = const [],
|
this.mediaAttachments = const [],
|
||||||
this.engagementSummary = const EngagementSummary(),
|
this.engagementSummary = const EngagementSummary(),
|
||||||
this.networkInfo = TimelineNetworkInfo.empty,
|
this.networkInfo = TimelineNetworkInfo.empty,
|
||||||
this.linkPreviewData})
|
this.linkPreviewData,
|
||||||
|
this.deliveryData = DeliveryData.empty})
|
||||||
: visibility = visibility ?? Visibility.public();
|
: visibility = visibility ?? Visibility.public();
|
||||||
|
|
||||||
TimelineEntry.randomBuilt()
|
TimelineEntry.randomBuilt()
|
||||||
|
|
@ -114,7 +118,8 @@ class TimelineEntry {
|
||||||
mediaAttachments = [],
|
mediaAttachments = [],
|
||||||
networkInfo = TimelineNetworkInfo.empty,
|
networkInfo = TimelineNetworkInfo.empty,
|
||||||
engagementSummary = const EngagementSummary(),
|
engagementSummary = const EngagementSummary(),
|
||||||
linkPreviewData = LinkPreviewData(link: 'fake link');
|
linkPreviewData = LinkPreviewData(link: 'fake link'),
|
||||||
|
deliveryData = DeliveryData.empty;
|
||||||
|
|
||||||
TimelineEntry copy({
|
TimelineEntry copy({
|
||||||
int? creationTimestamp,
|
int? creationTimestamp,
|
||||||
|
|
@ -145,6 +150,7 @@ class TimelineEntry {
|
||||||
EngagementSummary? engagementSummary,
|
EngagementSummary? engagementSummary,
|
||||||
TimelineNetworkInfo? networkInfo,
|
TimelineNetworkInfo? networkInfo,
|
||||||
LinkPreviewData? linkPreviewData,
|
LinkPreviewData? linkPreviewData,
|
||||||
|
DeliveryData? deliveryData,
|
||||||
}) {
|
}) {
|
||||||
return TimelineEntry(
|
return TimelineEntry(
|
||||||
creationTimestamp: creationTimestamp ?? this.creationTimestamp,
|
creationTimestamp: creationTimestamp ?? this.creationTimestamp,
|
||||||
|
|
@ -173,6 +179,7 @@ class TimelineEntry {
|
||||||
engagementSummary: engagementSummary ?? this.engagementSummary,
|
engagementSummary: engagementSummary ?? this.engagementSummary,
|
||||||
networkInfo: networkInfo ?? this.networkInfo,
|
networkInfo: networkInfo ?? this.networkInfo,
|
||||||
linkPreviewData: linkPreviewData ?? this.linkPreviewData,
|
linkPreviewData: linkPreviewData ?? this.linkPreviewData,
|
||||||
|
deliveryData: deliveryData ?? this.deliveryData,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -213,7 +220,8 @@ class TimelineEntry {
|
||||||
dislikes == other.dislikes &&
|
dislikes == other.dislikes &&
|
||||||
mediaAttachments == other.mediaAttachments &&
|
mediaAttachments == other.mediaAttachments &&
|
||||||
networkInfo == other.networkInfo &&
|
networkInfo == other.networkInfo &&
|
||||||
engagementSummary == other.engagementSummary;
|
engagementSummary == other.engagementSummary &&
|
||||||
|
deliveryData == other.deliveryData;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
|
|
@ -240,5 +248,6 @@ class TimelineEntry {
|
||||||
dislikes.hashCode ^
|
dislikes.hashCode ^
|
||||||
mediaAttachments.hashCode ^
|
mediaAttachments.hashCode ^
|
||||||
networkInfo.hashCode ^
|
networkInfo.hashCode ^
|
||||||
engagementSummary.hashCode;
|
engagementSummary.hashCode ^
|
||||||
|
deliveryData.hashCode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
import '../../globals.dart';
|
import '../../globals.dart';
|
||||||
|
import '../../models/delivery_data.dart';
|
||||||
import '../../models/engagement_summary.dart';
|
import '../../models/engagement_summary.dart';
|
||||||
import '../../models/link_data.dart';
|
import '../../models/link_data.dart';
|
||||||
import '../../models/location_data.dart';
|
import '../../models/location_data.dart';
|
||||||
|
|
@ -152,6 +153,15 @@ extension TimelineEntryMastodonExtensions on TimelineEntry {
|
||||||
final connection = ConnectionMastodonExtensions.fromJson(json['account']);
|
final connection = ConnectionMastodonExtensions.fromJson(json['account']);
|
||||||
connectionManager?.upsertConnection(connection);
|
connectionManager?.upsertConnection(connection);
|
||||||
|
|
||||||
|
final ddj = json['friendica']?['delivery_data'];
|
||||||
|
final deliveryData = ddj == null
|
||||||
|
? DeliveryData.empty
|
||||||
|
: DeliveryData(
|
||||||
|
total: ddj['delivery_queue_count'] ?? 0,
|
||||||
|
done: ddj['delivery_queue_done'] ?? 0,
|
||||||
|
failed: ddj['delivery_queue_failed'] ?? 0,
|
||||||
|
);
|
||||||
|
|
||||||
return TimelineEntry(
|
return TimelineEntry(
|
||||||
creationTimestamp: timestamp,
|
creationTimestamp: timestamp,
|
||||||
modificationTimestamp: modificationTimestamp,
|
modificationTimestamp: modificationTimestamp,
|
||||||
|
|
@ -176,6 +186,7 @@ extension TimelineEntryMastodonExtensions on TimelineEntry {
|
||||||
engagementSummary: engagementSummary,
|
engagementSummary: engagementSummary,
|
||||||
networkInfo: networkInfo,
|
networkInfo: networkInfo,
|
||||||
linkPreviewData: linkPreviewData,
|
linkPreviewData: linkPreviewData,
|
||||||
|
deliveryData: deliveryData,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue