import 'package:logging/logging.dart'; import '../../globals.dart'; import '../../models/engagement_summary.dart'; import '../../models/link_data.dart'; import '../../models/location_data.dart'; import '../../models/media_attachment.dart'; import '../../models/timeline_entry.dart'; import '../../services/connections_manager.dart'; import '../../utils/dateutils.dart'; import 'connection_mastodon_extensions.dart'; final _logger = Logger('TimelineEntryMastodonExtensions'); extension TimelineEntryMastodonExtensions on TimelineEntry { static TimelineEntry fromJson(Map json) { final int timestamp = json.containsKey('created_at') ? OffsetDateTimeUtils.epochSecTimeFromTimeZoneString(json['created_at']) .fold( onSuccess: (value) => value, onError: (error) { _logger.severe("Couldn't read date time string: $error"); return 0; }) : 0; final id = json['id'] ?? ''; final isReshare = json.containsKey('reblogged'); final parentId = json['in_reply_to_id'] ?? ''; final parentAuthor = json['in_reply_to_account_id'] ?? ''; final parentAuthorId = json['in_reply_to_account_id'] ?? ''; final body = json['content'] ?? ''; final author = json['account']['display_name']; final authorId = json['account']['id']; const title = ''; final externalLink = json['uri'] ?? ''; final actualLocationData = LocationData(); final modificationTimestamp = timestamp; final backdatedTimestamp = timestamp; final isFavorited = json['favourited'] ?? false; final linkData = json['card'] == null ? [] : [LinkData.fromMastodonJson(json['card'])]; final mediaAttachments = (json['media_attachments'] as List? ?? []) .map((json) => MediaAttachment.fromMastodonJson(json)) .toList(); final favoritesCount = json['favorites_count'] ?? 0; final repliesCount = json['replies_count'] ?? 0; final rebloggedCount = json['reblogs_count'] ?? 0; final engagementSummary = EngagementSummary( favoritesCount: favoritesCount, rebloggedCount: rebloggedCount, repliesCount: repliesCount, ); final connection = ConnectionMastodonExtensions.fromJson(json['account']); getIt().addConnection(connection); return TimelineEntry( creationTimestamp: timestamp, modificationTimestamp: modificationTimestamp, backdatedTimestamp: backdatedTimestamp, locationData: actualLocationData, body: body, isReshare: isReshare, id: id, parentId: parentId, parentAuthorId: parentAuthorId, isFavorited: isFavorited, externalLink: externalLink, author: author, authorId: authorId, parentAuthor: parentAuthor, title: title, links: linkData, mediaAttachments: mediaAttachments, engagementSummary: engagementSummary, ); } }