diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index b2c7ee0..263a337 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -626,6 +626,7 @@ "realmJoin": "Join Realm", "realmCommunityHint": "This realm is a community realm, you can freely join.", "realmCommunityPublicChannelsHint": "The public channels in this realm", + "realmCommunityPublishersHint": "The publishers in this realm", "realmJoined": "Joined realm {}.", "join": "Join", "pollEditorNew": "New Poll", diff --git a/assets/translations/zh-CN.json b/assets/translations/zh-CN.json index ce0e30b..a75a0d6 100644 --- a/assets/translations/zh-CN.json +++ b/assets/translations/zh-CN.json @@ -625,6 +625,7 @@ "realmJoin": "加入领域", "realmCommunityHint": "该领域是一个社区领域,你可以自由加入。", "realmCommunityPublicChannelsHint": "该领域包含的公共频道", + "realmCommunityPublishersHint": "该领域的发布者", "realmJoined": "已加入领域 {}。", "join": "加入", "pollEditorNew": "新投票", diff --git a/lib/controllers/post_write_controller.dart b/lib/controllers/post_write_controller.dart index 64da090..bbead02 100644 --- a/lib/controllers/post_write_controller.dart +++ b/lib/controllers/post_write_controller.dart @@ -247,6 +247,9 @@ class PostWriteController extends ChangeNotifier { if (post.preload?.thumbnail != null && (post.preload?.thumbnail?.rid.isNotEmpty ?? false)) { thumbnail = PostWriteMedia(post.preload!.thumbnail); } + if (post.preload?.realm != null) { + realm = post.preload!.realm!; + } editingPost = post; } @@ -382,6 +385,7 @@ class PostWriteController extends ChangeNotifier { if (replyingPost != null) 'reply_to': replyingPost!.toJson(), if (repostingPost != null) 'repost_to': repostingPost!.toJson(), if (poll != null) 'poll': poll!.toJson(), + if (realm != null) 'realm': realm!.toJson(), }), ); }); @@ -412,6 +416,7 @@ class PostWriteController extends ChangeNotifier { replyingPost = data['reply_to'] != null ? SnPost.fromJson(data['reply_to']) : null; repostingPost = data['repost_to'] != null ? SnPost.fromJson(data['repost_to']) : null; poll = data['poll'] != null ? SnPoll.fromJson(data['poll']) : null; + realm = data['realm'] != null ? SnRealm.fromJson(data['realm']) : null; temporaryRestored = true; notifyListeners(); }); @@ -528,6 +533,7 @@ class PostWriteController extends ChangeNotifier { if (reward != null) 'reward': reward, if (videoAttachment != null) 'video': videoAttachment!.rid, if (poll != null) 'poll': poll!.id, + if (realm != null) 'realm': realm!.id, }, onSendProgress: (count, total) { progress = baseProgressVal + (count / total) * (kPostingProgressWeight / 2); diff --git a/lib/main.dart b/lib/main.dart index e359e43..4ee7789 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -156,11 +156,11 @@ class SolianApp extends StatelessWidget { Provider(create: (ctx) => SnNetworkProvider(ctx)), Provider(create: (ctx) => UserDirectoryProvider(ctx)), Provider(create: (ctx) => SnAttachmentProvider(ctx)), + Provider(create: (ctx) => SnRealmProvider(ctx)), Provider(create: (ctx) => SnPostContentProvider(ctx)), Provider(create: (ctx) => SnRelationshipProvider(ctx)), Provider(create: (ctx) => SnLinkPreviewProvider(ctx)), Provider(create: (ctx) => SnStickerProvider(ctx)), - Provider(create: (ctx) => SnRealmProvider(ctx)), ChangeNotifierProvider(create: (ctx) => UserProvider(ctx)), ChangeNotifierProvider(create: (ctx) => WebSocketProvider(ctx)), ChangeNotifierProvider(create: (ctx) => NotificationProvider(ctx)), diff --git a/lib/providers/post.dart b/lib/providers/post.dart index 8e264fc..98cd71f 100644 --- a/lib/providers/post.dart +++ b/lib/providers/post.dart @@ -2,19 +2,23 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:surface/providers/sn_attachment.dart'; import 'package:surface/providers/sn_network.dart'; +import 'package:surface/providers/sn_realm.dart'; import 'package:surface/providers/user_directory.dart'; import 'package:surface/types/poll.dart'; import 'package:surface/types/post.dart'; +import 'package:surface/types/realm.dart'; class SnPostContentProvider { late final SnNetworkProvider _sn; late final UserDirectoryProvider _ud; late final SnAttachmentProvider _attach; + late final SnRealmProvider _realm; SnPostContentProvider(BuildContext context) { _sn = context.read(); _ud = context.read(); _attach = context.read(); + _realm = context.read(); } Future _fetchPoll(int id) async { @@ -42,9 +46,13 @@ class SnPostContentProvider { final attachments = await _attach.getMultiple(rids.toList()); for (var i = 0; i < out.length; i++) { SnPoll? poll; + SnRealm? realm; if (out[i].pollId != null) { poll = await _fetchPoll(out[i].pollId!); } + if (out[i].realmId != null) { + realm = await _realm.getRealm(out[i].realmId!); + } out[i] = out[i].copyWith( preload: SnPostPreload( @@ -52,6 +60,7 @@ class SnPostContentProvider { attachments: attachments.where((ele) => out[i].body['attachments']?.contains(ele?.rid) ?? false).toList(), video: attachments.where((ele) => ele?.rid == out[i].body['video']).firstOrNull, poll: poll, + realm: realm, ), ); } @@ -81,9 +90,13 @@ class SnPostContentProvider { final attachments = await _attach.getMultiple(rids.toList()); SnPoll? poll; + SnRealm? realm; if (out.pollId != null) { poll = await _fetchPoll(out.pollId!); } + if (out.realmId != null) { + realm = await _realm.getRealm(out.realmId!); + } out = out.copyWith( preload: SnPostPreload( @@ -91,6 +104,7 @@ class SnPostContentProvider { attachments: attachments.where((ele) => out.body['attachments']?.contains(ele?.rid) ?? false).toList(), video: attachments.where((ele) => ele?.rid == out.body['video']).firstOrNull, poll: poll, + realm: realm, ), ); diff --git a/lib/providers/sn_realm.dart b/lib/providers/sn_realm.dart index 09e438a..87dc1e9 100644 --- a/lib/providers/sn_realm.dart +++ b/lib/providers/sn_realm.dart @@ -10,17 +10,28 @@ class SnRealmProvider { _sn = context.read(); } + final Map _cache = {}; + Future> listAvailableRealms() async { final resp = await _sn.client.get('/cgi/id/realms/me/available'); final out = List.from( resp.data?.map((e) => SnRealm.fromJson(e)) ?? [], ); + for (final realm in out) { + _cache[realm.alias] = realm; + _cache[realm.id.toString()] = realm; + } return out; } - Future getRealm(String alias) async { - final resp = await _sn.client.get('/cgi/id/realms/$alias'); + Future getRealm(dynamic aliasOrId) async { + if (_cache.containsKey(aliasOrId.toString())) { + return _cache[aliasOrId.toString()]!; + } + final resp = await _sn.client.get('/cgi/id/realms/$aliasOrId'); final out = SnRealm.fromJson(resp.data); + _cache[out.alias] = out; + _cache[out.id.toString()] = out; return out; } } diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index 766d8b2..2440d1a 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -58,6 +58,7 @@ class _ChatRoomScreenState extends State { StreamSubscription? _wsSubscription; + // TODO fetch user identity and ask them to join the channel or not Future _fetchChannel() async { setState(() => _isBusy = true); diff --git a/lib/screens/realm/realm_detail.dart b/lib/screens/realm/realm_detail.dart index b8f5256..d117409 100644 --- a/lib/screens/realm/realm_detail.dart +++ b/lib/screens/realm/realm_detail.dart @@ -9,6 +9,7 @@ import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/user_directory.dart'; import 'package:surface/providers/userinfo.dart'; import 'package:surface/types/account.dart'; +import 'package:surface/types/chat.dart'; import 'package:surface/types/post.dart'; import 'package:surface/types/realm.dart'; import 'package:surface/widgets/account/account_image.dart'; @@ -60,11 +61,29 @@ class _RealmDetailScreenState extends State { } } + List? _channels; + + Future _fetchChannels() async { + try { + final sn = context.read(); + final resp = await sn.client.get('/cgi/im/channels/${widget.alias}/public'); + _channels = List.from( + resp.data.map((e) => SnChannel.fromJson(e)).cast(), + ); + } catch (err) { + if (mounted) context.showErrorDialog(err); + rethrow; + } finally { + setState(() {}); + } + } + @override void initState() { super.initState(); _fetchRealm().then((_) { _fetchPublishers(); + _fetchChannels(); }); } @@ -93,7 +112,7 @@ class _RealmDetailScreenState extends State { }, body: TabBarView( children: [ - _RealmDetailHomeWidget(realm: _realm, publishers: _publishers), + _RealmDetailHomeWidget(realm: _realm, publishers: _publishers, channels: _channels), _RealmMemberListWidget(realm: _realm), _RealmSettingsWidget( realm: _realm, @@ -112,8 +131,9 @@ class _RealmDetailScreenState extends State { class _RealmDetailHomeWidget extends StatelessWidget { final SnRealm? realm; final List? publishers; + final List? channels; - const _RealmDetailHomeWidget({required this.realm, this.publishers}); + const _RealmDetailHomeWidget({required this.realm, this.publishers, this.channels}); @override Widget build(BuildContext context) { @@ -135,30 +155,76 @@ class _RealmDetailHomeWidget extends StatelessWidget { ], ).padding(horizontal: 24), const Gap(16), - const Divider(), + const Divider(height: 1), Expanded( - child: ListView.builder( - padding: EdgeInsets.zero, - itemCount: publishers?.length ?? 0, - itemBuilder: (context, idx) { - final ele = publishers![idx]; - return ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 20), - leading: AccountImage( - content: ele.avatar, - fallbackWidget: const Icon(Symbols.group, size: 24), + child: CustomScrollView( + slivers: [ + if (publishers?.isNotEmpty ?? false) + SliverToBoxAdapter( + child: Container( + width: double.infinity, + color: Theme.of(context).colorScheme.surfaceContainerHigh, + child: Text('realmCommunityPublishersHint'.tr(), style: Theme.of(context).textTheme.bodyMedium) + .padding(horizontal: 24, vertical: 8), + ), ), - title: Text(ele.nick), - subtitle: Text('@${ele.name}'), - trailing: const Icon(Symbols.chevron_right), - onTap: () { - GoRouter.of(context).pushNamed( - 'postPublisher', - pathParameters: {'name': ele.name}, + SliverList.builder( + itemCount: publishers?.length ?? 0, + itemBuilder: (context, idx) { + final ele = publishers![idx]; + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + leading: AccountImage( + content: ele.avatar, + fallbackWidget: const Icon(Symbols.group, size: 24), + ), + title: Text(ele.nick), + subtitle: Text('@${ele.name}'), + trailing: const Icon(Symbols.chevron_right), + onTap: () { + GoRouter.of(context).pushNamed( + 'postPublisher', + pathParameters: {'name': ele.name}, + ); + }, ); }, - ); - }, + ), + if (channels?.isNotEmpty ?? false) + SliverToBoxAdapter( + child: Container( + width: double.infinity, + color: Theme.of(context).colorScheme.surfaceContainerHigh, + child: Text('realmCommunityPublicChannelsHint'.tr(), style: Theme.of(context).textTheme.bodyMedium) + .padding(horizontal: 24, vertical: 8), + ), + ), + SliverList.builder( + itemCount: channels?.length ?? 0, + itemBuilder: (context, idx) { + final ele = channels![idx]; + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + leading: AccountImage( + content: null, + fallbackWidget: const Icon(Symbols.chat, size: 20), + ), + title: Text(ele.name), + subtitle: Text('#${ele.alias}'), + trailing: const Icon(Symbols.chevron_right), + onTap: () { + GoRouter.of(context).pushNamed( + 'chatRoom', + pathParameters: { + 'scope': realm?.alias ?? 'global', + 'alias': ele.alias, + }, + ); + }, + ); + }, + ), + ], ), ), ], diff --git a/lib/screens/realm/realm_discovery.dart b/lib/screens/realm/realm_discovery.dart index 7e1b083..ffa389f 100644 --- a/lib/screens/realm/realm_discovery.dart +++ b/lib/screens/realm/realm_discovery.dart @@ -14,7 +14,6 @@ import 'package:surface/widgets/dialog.dart'; import 'package:surface/widgets/loading_indicator.dart'; import 'package:surface/widgets/navigation/app_scaffold.dart'; import 'package:surface/widgets/realm/realm_item.dart'; -import 'package:surface/widgets/universal_image.dart'; class RealmDiscoveryScreen extends StatefulWidget { const RealmDiscoveryScreen({super.key}); diff --git a/lib/types/post.dart b/lib/types/post.dart index 542ef03..76741c1 100644 --- a/lib/types/post.dart +++ b/lib/types/post.dart @@ -1,6 +1,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:surface/types/attachment.dart'; import 'package:surface/types/poll.dart'; +import 'package:surface/types/realm.dart'; part 'post.freezed.dart'; part 'post.g.dart'; @@ -24,6 +25,7 @@ class SnPost with _$SnPost { required List? replies, required int? replyId, required int? repostId, + required int? realmId, required SnPost? replyTo, required SnPost? repostTo, required List? visibleUsersList, @@ -95,6 +97,7 @@ class SnPostPreload with _$SnPostPreload { required List? attachments, required SnAttachment? video, required SnPoll? poll, + required SnRealm? realm, }) = _SnPostPreload; factory SnPostPreload.fromJson(Map json) => diff --git a/lib/types/post.freezed.dart b/lib/types/post.freezed.dart index 9666b25..3c23e14 100644 --- a/lib/types/post.freezed.dart +++ b/lib/types/post.freezed.dart @@ -34,6 +34,7 @@ mixin _$SnPost { List? get replies => throw _privateConstructorUsedError; int? get replyId => throw _privateConstructorUsedError; int? get repostId => throw _privateConstructorUsedError; + int? get realmId => throw _privateConstructorUsedError; SnPost? get replyTo => throw _privateConstructorUsedError; SnPost? get repostTo => throw _privateConstructorUsedError; List? get visibleUsersList => throw _privateConstructorUsedError; @@ -84,6 +85,7 @@ abstract class $SnPostCopyWith<$Res> { List? replies, int? replyId, int? repostId, + int? realmId, SnPost? replyTo, SnPost? repostTo, List? visibleUsersList, @@ -141,6 +143,7 @@ class _$SnPostCopyWithImpl<$Res, $Val extends SnPost> Object? replies = freezed, Object? replyId = freezed, Object? repostId = freezed, + Object? realmId = freezed, Object? replyTo = freezed, Object? repostTo = freezed, Object? visibleUsersList = freezed, @@ -219,6 +222,10 @@ class _$SnPostCopyWithImpl<$Res, $Val extends SnPost> ? _value.repostId : repostId // ignore: cast_nullable_to_non_nullable as int?, + realmId: freezed == realmId + ? _value.realmId + : realmId // ignore: cast_nullable_to_non_nullable + as int?, replyTo: freezed == replyTo ? _value.replyTo : replyTo // ignore: cast_nullable_to_non_nullable @@ -387,6 +394,7 @@ abstract class _$$SnPostImplCopyWith<$Res> implements $SnPostCopyWith<$Res> { List? replies, int? replyId, int? repostId, + int? realmId, SnPost? replyTo, SnPost? repostTo, List? visibleUsersList, @@ -447,6 +455,7 @@ class __$$SnPostImplCopyWithImpl<$Res> Object? replies = freezed, Object? replyId = freezed, Object? repostId = freezed, + Object? realmId = freezed, Object? replyTo = freezed, Object? repostTo = freezed, Object? visibleUsersList = freezed, @@ -525,6 +534,10 @@ class __$$SnPostImplCopyWithImpl<$Res> ? _value.repostId : repostId // ignore: cast_nullable_to_non_nullable as int?, + realmId: freezed == realmId + ? _value.realmId + : realmId // ignore: cast_nullable_to_non_nullable + as int?, replyTo: freezed == replyTo ? _value.replyTo : replyTo // ignore: cast_nullable_to_non_nullable @@ -627,6 +640,7 @@ class _$SnPostImpl extends _SnPost { required final List? replies, required this.replyId, required this.repostId, + required this.realmId, required this.replyTo, required this.repostTo, required final List? visibleUsersList, @@ -715,6 +729,8 @@ class _$SnPostImpl extends _SnPost { @override final int? repostId; @override + final int? realmId; + @override final SnPost? replyTo; @override final SnPost? repostTo; @@ -777,7 +793,7 @@ class _$SnPostImpl extends _SnPost { @override String toString() { - return 'SnPost(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, type: $type, body: $body, language: $language, alias: $alias, aliasPrefix: $aliasPrefix, tags: $tags, categories: $categories, replies: $replies, replyId: $replyId, repostId: $repostId, replyTo: $replyTo, repostTo: $repostTo, visibleUsersList: $visibleUsersList, invisibleUsersList: $invisibleUsersList, visibility: $visibility, editedAt: $editedAt, pinnedAt: $pinnedAt, lockedAt: $lockedAt, isDraft: $isDraft, publishedAt: $publishedAt, publishedUntil: $publishedUntil, totalUpvote: $totalUpvote, totalDownvote: $totalDownvote, totalViews: $totalViews, totalAggregatedViews: $totalAggregatedViews, publisherId: $publisherId, pollId: $pollId, publisher: $publisher, metric: $metric, preload: $preload)'; + return 'SnPost(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, type: $type, body: $body, language: $language, alias: $alias, aliasPrefix: $aliasPrefix, tags: $tags, categories: $categories, replies: $replies, replyId: $replyId, repostId: $repostId, realmId: $realmId, replyTo: $replyTo, repostTo: $repostTo, visibleUsersList: $visibleUsersList, invisibleUsersList: $invisibleUsersList, visibility: $visibility, editedAt: $editedAt, pinnedAt: $pinnedAt, lockedAt: $lockedAt, isDraft: $isDraft, publishedAt: $publishedAt, publishedUntil: $publishedUntil, totalUpvote: $totalUpvote, totalDownvote: $totalDownvote, totalViews: $totalViews, totalAggregatedViews: $totalAggregatedViews, publisherId: $publisherId, pollId: $pollId, publisher: $publisher, metric: $metric, preload: $preload)'; } @override @@ -806,6 +822,7 @@ class _$SnPostImpl extends _SnPost { (identical(other.replyId, replyId) || other.replyId == replyId) && (identical(other.repostId, repostId) || other.repostId == repostId) && + (identical(other.realmId, realmId) || other.realmId == realmId) && (identical(other.replyTo, replyTo) || other.replyTo == replyTo) && (identical(other.repostTo, repostTo) || other.repostTo == repostTo) && @@ -861,6 +878,7 @@ class _$SnPostImpl extends _SnPost { const DeepCollectionEquality().hash(_replies), replyId, repostId, + realmId, replyTo, repostTo, const DeepCollectionEquality().hash(_visibleUsersList), @@ -915,6 +933,7 @@ abstract class _SnPost extends SnPost { required final List? replies, required final int? replyId, required final int? repostId, + required final int? realmId, required final SnPost? replyTo, required final SnPost? repostTo, required final List? visibleUsersList, @@ -968,6 +987,8 @@ abstract class _SnPost extends SnPost { @override int? get repostId; @override + int? get realmId; + @override SnPost? get replyTo; @override SnPost? get repostTo; @@ -1636,6 +1657,7 @@ mixin _$SnPostPreload { List? get attachments => throw _privateConstructorUsedError; SnAttachment? get video => throw _privateConstructorUsedError; SnPoll? get poll => throw _privateConstructorUsedError; + SnRealm? get realm => throw _privateConstructorUsedError; /// Serializes this SnPostPreload to a JSON map. Map toJson() => throw _privateConstructorUsedError; @@ -1657,11 +1679,13 @@ abstract class $SnPostPreloadCopyWith<$Res> { {SnAttachment? thumbnail, List? attachments, SnAttachment? video, - SnPoll? poll}); + SnPoll? poll, + SnRealm? realm}); $SnAttachmentCopyWith<$Res>? get thumbnail; $SnAttachmentCopyWith<$Res>? get video; $SnPollCopyWith<$Res>? get poll; + $SnRealmCopyWith<$Res>? get realm; } /// @nodoc @@ -1683,6 +1707,7 @@ class _$SnPostPreloadCopyWithImpl<$Res, $Val extends SnPostPreload> Object? attachments = freezed, Object? video = freezed, Object? poll = freezed, + Object? realm = freezed, }) { return _then(_value.copyWith( thumbnail: freezed == thumbnail @@ -1701,6 +1726,10 @@ class _$SnPostPreloadCopyWithImpl<$Res, $Val extends SnPostPreload> ? _value.poll : poll // ignore: cast_nullable_to_non_nullable as SnPoll?, + realm: freezed == realm + ? _value.realm + : realm // ignore: cast_nullable_to_non_nullable + as SnRealm?, ) as $Val); } @@ -1745,6 +1774,20 @@ class _$SnPostPreloadCopyWithImpl<$Res, $Val extends SnPostPreload> return _then(_value.copyWith(poll: value) as $Val); }); } + + /// Create a copy of SnPostPreload + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SnRealmCopyWith<$Res>? get realm { + if (_value.realm == null) { + return null; + } + + return $SnRealmCopyWith<$Res>(_value.realm!, (value) { + return _then(_value.copyWith(realm: value) as $Val); + }); + } } /// @nodoc @@ -1759,7 +1802,8 @@ abstract class _$$SnPostPreloadImplCopyWith<$Res> {SnAttachment? thumbnail, List? attachments, SnAttachment? video, - SnPoll? poll}); + SnPoll? poll, + SnRealm? realm}); @override $SnAttachmentCopyWith<$Res>? get thumbnail; @@ -1767,6 +1811,8 @@ abstract class _$$SnPostPreloadImplCopyWith<$Res> $SnAttachmentCopyWith<$Res>? get video; @override $SnPollCopyWith<$Res>? get poll; + @override + $SnRealmCopyWith<$Res>? get realm; } /// @nodoc @@ -1786,6 +1832,7 @@ class __$$SnPostPreloadImplCopyWithImpl<$Res> Object? attachments = freezed, Object? video = freezed, Object? poll = freezed, + Object? realm = freezed, }) { return _then(_$SnPostPreloadImpl( thumbnail: freezed == thumbnail @@ -1804,6 +1851,10 @@ class __$$SnPostPreloadImplCopyWithImpl<$Res> ? _value.poll : poll // ignore: cast_nullable_to_non_nullable as SnPoll?, + realm: freezed == realm + ? _value.realm + : realm // ignore: cast_nullable_to_non_nullable + as SnRealm?, )); } } @@ -1815,7 +1866,8 @@ class _$SnPostPreloadImpl implements _SnPostPreload { {required this.thumbnail, required final List? attachments, required this.video, - required this.poll}) + required this.poll, + required this.realm}) : _attachments = attachments; factory _$SnPostPreloadImpl.fromJson(Map json) => @@ -1837,10 +1889,12 @@ class _$SnPostPreloadImpl implements _SnPostPreload { final SnAttachment? video; @override final SnPoll? poll; + @override + final SnRealm? realm; @override String toString() { - return 'SnPostPreload(thumbnail: $thumbnail, attachments: $attachments, video: $video, poll: $poll)'; + return 'SnPostPreload(thumbnail: $thumbnail, attachments: $attachments, video: $video, poll: $poll, realm: $realm)'; } @override @@ -1853,13 +1907,14 @@ class _$SnPostPreloadImpl implements _SnPostPreload { const DeepCollectionEquality() .equals(other._attachments, _attachments) && (identical(other.video, video) || other.video == video) && - (identical(other.poll, poll) || other.poll == poll)); + (identical(other.poll, poll) || other.poll == poll) && + (identical(other.realm, realm) || other.realm == realm)); } @JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType, thumbnail, - const DeepCollectionEquality().hash(_attachments), video, poll); + const DeepCollectionEquality().hash(_attachments), video, poll, realm); /// Create a copy of SnPostPreload /// with the given fields replaced by the non-null parameter values. @@ -1882,7 +1937,8 @@ abstract class _SnPostPreload implements SnPostPreload { {required final SnAttachment? thumbnail, required final List? attachments, required final SnAttachment? video, - required final SnPoll? poll}) = _$SnPostPreloadImpl; + required final SnPoll? poll, + required final SnRealm? realm}) = _$SnPostPreloadImpl; factory _SnPostPreload.fromJson(Map json) = _$SnPostPreloadImpl.fromJson; @@ -1895,6 +1951,8 @@ abstract class _SnPostPreload implements SnPostPreload { SnAttachment? get video; @override SnPoll? get poll; + @override + SnRealm? get realm; /// Create a copy of SnPostPreload /// with the given fields replaced by the non-null parameter values. diff --git a/lib/types/post.g.dart b/lib/types/post.g.dart index 1a639ce..c48bbc9 100644 --- a/lib/types/post.g.dart +++ b/lib/types/post.g.dart @@ -31,6 +31,7 @@ _$SnPostImpl _$$SnPostImplFromJson(Map json) => _$SnPostImpl( .toList(), replyId: (json['reply_id'] as num?)?.toInt(), repostId: (json['repost_id'] as num?)?.toInt(), + realmId: (json['realm_id'] as num?)?.toInt(), replyTo: json['reply_to'] == null ? null : SnPost.fromJson(json['reply_to'] as Map), @@ -91,6 +92,7 @@ Map _$$SnPostImplToJson(_$SnPostImpl instance) => 'replies': instance.replies?.map((e) => e.toJson()).toList(), 'reply_id': instance.replyId, 'repost_id': instance.repostId, + 'realm_id': instance.realmId, 'reply_to': instance.replyTo?.toJson(), 'repost_to': instance.repostTo?.toJson(), 'visible_users_list': instance.visibleUsersList, @@ -178,6 +180,9 @@ _$SnPostPreloadImpl _$$SnPostPreloadImplFromJson(Map json) => poll: json['poll'] == null ? null : SnPoll.fromJson(json['poll'] as Map), + realm: json['realm'] == null + ? null + : SnRealm.fromJson(json['realm'] as Map), ); Map _$$SnPostPreloadImplToJson(_$SnPostPreloadImpl instance) => @@ -186,6 +191,7 @@ Map _$$SnPostPreloadImplToJson(_$SnPostPreloadImpl instance) => 'attachments': instance.attachments?.map((e) => e?.toJson()).toList(), 'video': instance.video?.toJson(), 'poll': instance.poll?.toJson(), + 'realm': instance.realm?.toJson(), }; _$SnBodyImpl _$$SnBodyImplFromJson(Map json) => _$SnBodyImpl(