diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index f17ba28..899f7c3 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -309,6 +309,8 @@ "removeChatMemberHint": "Are you sure to remove this member from the room?", "removeRealmMember": "Remove Realm Member", "removeRealmMemberHint": "Are you sure to remove this member from the realm?", + "removePublisherMember": "Remove Publisher Member", + "removePublisherMemberHint": "Are you sure to remove this member from the publisher?", "memberRole": "Member Role", "memberRoleHint": "Greater number has higher permission.", "memberRoleEdit": "Edit role for @{}", diff --git a/lib/main.dart b/lib/main.dart index 3ccba49..72b7835 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -169,7 +169,7 @@ class IslandApp extends HookConsumerWidget { } } - if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) { + if (!kIsWeb && Platform.isAndroid) { handleInitialLink(); } diff --git a/lib/models/post.dart b/lib/models/post.dart index f0edd76..813044b 100644 --- a/lib/models/post.dart +++ b/lib/models/post.dart @@ -2,7 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:island/models/file.dart'; import 'package:island/models/post_category.dart'; import 'package:island/models/post_tag.dart'; -import 'package:island/models/user.dart'; +import 'package:island/models/publisher.dart'; part 'post.freezed.dart'; part 'post.g.dart'; @@ -32,7 +32,7 @@ sealed class SnPost with _$SnPost { String? forwardedPostId, SnPost? forwardedPost, @Default([]) List attachments, - @Default(SnPublisher()) SnPublisher publisher, + required SnPublisher publisher, @Default({}) Map reactionsCount, @Default([]) List reactions, @Default([]) List tags, @@ -47,29 +47,6 @@ sealed class SnPost with _$SnPost { factory SnPost.fromJson(Map json) => _$SnPostFromJson(json); } -@freezed -sealed class SnPublisher with _$SnPublisher { - const factory SnPublisher({ - @Default('') String id, - @Default(0) int type, - @Default('') String name, - @Default('') String nick, - @Default('') String bio, - SnCloudFile? picture, - SnCloudFile? background, - SnAccount? account, - String? accountId, - @Default(null) DateTime? createdAt, - @Default(null) DateTime? updatedAt, - DateTime? deletedAt, - String? realmId, - SnVerificationMark? verification, - }) = _SnPublisher; - - factory SnPublisher.fromJson(Map json) => - _$SnPublisherFromJson(json); -} - @freezed sealed class SnPublisherStats with _$SnPublisherStats { const factory SnPublisherStats({ diff --git a/lib/models/post.freezed.dart b/lib/models/post.freezed.dart index d12f8c6..22ebaf6 100644 --- a/lib/models/post.freezed.dart +++ b/lib/models/post.freezed.dart @@ -156,7 +156,7 @@ $SnPublisherCopyWith<$Res> get publisher { @JsonSerializable() class _SnPost implements SnPost { - const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.type = 0, final Map? meta, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, final List attachments = const [], this.publisher = const SnPublisher(), final Map reactionsCount = const {}, final List reactions = const [], final List tags = const [], final List categories = const [], final List collections = const [], this.createdAt = null, this.updatedAt = null, this.deletedAt, this.isTruncated = false}): _meta = meta,_attachments = attachments,_reactionsCount = reactionsCount,_reactions = reactions,_tags = tags,_categories = categories,_collections = collections; + const _SnPost({required this.id, this.title, this.description, this.language, this.editedAt, this.publishedAt = null, this.visibility = 0, this.content, this.type = 0, final Map? meta, this.viewsUnique = 0, this.viewsTotal = 0, this.upvotes = 0, this.downvotes = 0, this.repliesCount = 0, this.threadedPostId, this.threadedPost, this.repliedPostId, this.repliedPost, this.forwardedPostId, this.forwardedPost, final List attachments = const [], required this.publisher, final Map reactionsCount = const {}, final List reactions = const [], final List tags = const [], final List categories = const [], final List collections = const [], this.createdAt = null, this.updatedAt = null, this.deletedAt, this.isTruncated = false}): _meta = meta,_attachments = attachments,_reactionsCount = reactionsCount,_reactions = reactions,_tags = tags,_categories = categories,_collections = collections; factory _SnPost.fromJson(Map json) => _$SnPostFromJson(json); @override final String id; @@ -195,7 +195,7 @@ class _SnPost implements SnPost { return EqualUnmodifiableListView(_attachments); } -@override@JsonKey() final SnPublisher publisher; +@override final SnPublisher publisher; final Map _reactionsCount; @override@JsonKey() Map get reactionsCount { if (_reactionsCount is EqualUnmodifiableMapView) return _reactionsCount; @@ -373,274 +373,6 @@ $SnPublisherCopyWith<$Res> get publisher { } -/// @nodoc -mixin _$SnPublisher { - - String get id; int get type; String get name; String get nick; String get bio; SnCloudFile? get picture; SnCloudFile? get background; SnAccount? get account; String? get accountId; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; String? get realmId; SnVerificationMark? get verification; -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$SnPublisherCopyWith get copyWith => _$SnPublisherCopyWithImpl(this as SnPublisher, _$identity); - - /// Serializes this SnPublisher to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPublisher&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.name, name) || other.name == name)&&(identical(other.nick, nick) || other.nick == nick)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.account, account) || other.account == account)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.verification, verification) || other.verification == verification)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,id,type,name,nick,bio,picture,background,account,accountId,createdAt,updatedAt,deletedAt,realmId,verification); - -@override -String toString() { - return 'SnPublisher(id: $id, type: $type, name: $name, nick: $nick, bio: $bio, picture: $picture, background: $background, account: $account, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, realmId: $realmId, verification: $verification)'; -} - - -} - -/// @nodoc -abstract mixin class $SnPublisherCopyWith<$Res> { - factory $SnPublisherCopyWith(SnPublisher value, $Res Function(SnPublisher) _then) = _$SnPublisherCopyWithImpl; -@useResult -$Res call({ - String id, int type, String name, String nick, String bio, SnCloudFile? picture, SnCloudFile? background, SnAccount? account, String? accountId, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, String? realmId, SnVerificationMark? verification -}); - - -$SnCloudFileCopyWith<$Res>? get picture;$SnCloudFileCopyWith<$Res>? get background;$SnAccountCopyWith<$Res>? get account;$SnVerificationMarkCopyWith<$Res>? get verification; - -} -/// @nodoc -class _$SnPublisherCopyWithImpl<$Res> - implements $SnPublisherCopyWith<$Res> { - _$SnPublisherCopyWithImpl(this._self, this._then); - - final SnPublisher _self; - final $Res Function(SnPublisher) _then; - -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? type = null,Object? name = null,Object? nick = null,Object? bio = null,Object? picture = freezed,Object? background = freezed,Object? account = freezed,Object? accountId = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? realmId = freezed,Object? verification = freezed,}) { - return _then(_self.copyWith( -id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable -as int,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String,nick: null == nick ? _self.nick : nick // ignore: cast_nullable_to_non_nullable -as String,bio: null == bio ? _self.bio : bio // ignore: cast_nullable_to_non_nullable -as String,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable -as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable -as SnCloudFile?,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable -as SnAccount?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable -as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable -as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable -as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable -as DateTime?,realmId: freezed == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable -as String?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable -as SnVerificationMark?, - )); -} -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnCloudFileCopyWith<$Res>? get picture { - if (_self.picture == null) { - return null; - } - - return $SnCloudFileCopyWith<$Res>(_self.picture!, (value) { - return _then(_self.copyWith(picture: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnCloudFileCopyWith<$Res>? get background { - if (_self.background == null) { - return null; - } - - return $SnCloudFileCopyWith<$Res>(_self.background!, (value) { - return _then(_self.copyWith(background: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnAccountCopyWith<$Res>? get account { - if (_self.account == null) { - return null; - } - - return $SnAccountCopyWith<$Res>(_self.account!, (value) { - return _then(_self.copyWith(account: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnVerificationMarkCopyWith<$Res>? get verification { - if (_self.verification == null) { - return null; - } - - return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) { - return _then(_self.copyWith(verification: value)); - }); -} -} - - -/// @nodoc -@JsonSerializable() - -class _SnPublisher implements SnPublisher { - const _SnPublisher({this.id = '', this.type = 0, this.name = '', this.nick = '', this.bio = '', this.picture, this.background, this.account, this.accountId, this.createdAt = null, this.updatedAt = null, this.deletedAt, this.realmId, this.verification}); - factory _SnPublisher.fromJson(Map json) => _$SnPublisherFromJson(json); - -@override@JsonKey() final String id; -@override@JsonKey() final int type; -@override@JsonKey() final String name; -@override@JsonKey() final String nick; -@override@JsonKey() final String bio; -@override final SnCloudFile? picture; -@override final SnCloudFile? background; -@override final SnAccount? account; -@override final String? accountId; -@override@JsonKey() final DateTime? createdAt; -@override@JsonKey() final DateTime? updatedAt; -@override final DateTime? deletedAt; -@override final String? realmId; -@override final SnVerificationMark? verification; - -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$SnPublisherCopyWith<_SnPublisher> get copyWith => __$SnPublisherCopyWithImpl<_SnPublisher>(this, _$identity); - -@override -Map toJson() { - return _$SnPublisherToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPublisher&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.name, name) || other.name == name)&&(identical(other.nick, nick) || other.nick == nick)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.account, account) || other.account == account)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.verification, verification) || other.verification == verification)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,id,type,name,nick,bio,picture,background,account,accountId,createdAt,updatedAt,deletedAt,realmId,verification); - -@override -String toString() { - return 'SnPublisher(id: $id, type: $type, name: $name, nick: $nick, bio: $bio, picture: $picture, background: $background, account: $account, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, realmId: $realmId, verification: $verification)'; -} - - -} - -/// @nodoc -abstract mixin class _$SnPublisherCopyWith<$Res> implements $SnPublisherCopyWith<$Res> { - factory _$SnPublisherCopyWith(_SnPublisher value, $Res Function(_SnPublisher) _then) = __$SnPublisherCopyWithImpl; -@override @useResult -$Res call({ - String id, int type, String name, String nick, String bio, SnCloudFile? picture, SnCloudFile? background, SnAccount? account, String? accountId, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, String? realmId, SnVerificationMark? verification -}); - - -@override $SnCloudFileCopyWith<$Res>? get picture;@override $SnCloudFileCopyWith<$Res>? get background;@override $SnAccountCopyWith<$Res>? get account;@override $SnVerificationMarkCopyWith<$Res>? get verification; - -} -/// @nodoc -class __$SnPublisherCopyWithImpl<$Res> - implements _$SnPublisherCopyWith<$Res> { - __$SnPublisherCopyWithImpl(this._self, this._then); - - final _SnPublisher _self; - final $Res Function(_SnPublisher) _then; - -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? type = null,Object? name = null,Object? nick = null,Object? bio = null,Object? picture = freezed,Object? background = freezed,Object? account = freezed,Object? accountId = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? realmId = freezed,Object? verification = freezed,}) { - return _then(_SnPublisher( -id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable -as int,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String,nick: null == nick ? _self.nick : nick // ignore: cast_nullable_to_non_nullable -as String,bio: null == bio ? _self.bio : bio // ignore: cast_nullable_to_non_nullable -as String,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable -as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable -as SnCloudFile?,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable -as SnAccount?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable -as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable -as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable -as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable -as DateTime?,realmId: freezed == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable -as String?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable -as SnVerificationMark?, - )); -} - -/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnCloudFileCopyWith<$Res>? get picture { - if (_self.picture == null) { - return null; - } - - return $SnCloudFileCopyWith<$Res>(_self.picture!, (value) { - return _then(_self.copyWith(picture: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnCloudFileCopyWith<$Res>? get background { - if (_self.background == null) { - return null; - } - - return $SnCloudFileCopyWith<$Res>(_self.background!, (value) { - return _then(_self.copyWith(background: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnAccountCopyWith<$Res>? get account { - if (_self.account == null) { - return null; - } - - return $SnAccountCopyWith<$Res>(_self.account!, (value) { - return _then(_self.copyWith(account: value)); - }); -}/// Create a copy of SnPublisher -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnVerificationMarkCopyWith<$Res>? get verification { - if (_self.verification == null) { - return null; - } - - return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) { - return _then(_self.copyWith(verification: value)); - }); -} -} - - /// @nodoc mixin _$SnPublisherStats { diff --git a/lib/models/post.g.dart b/lib/models/post.g.dart index afaee77..88f8b1f 100644 --- a/lib/models/post.g.dart +++ b/lib/models/post.g.dart @@ -48,10 +48,7 @@ _SnPost _$SnPostFromJson(Map json) => _SnPost( ?.map((e) => SnCloudFile.fromJson(e as Map)) .toList() ?? const [], - publisher: - json['publisher'] == null - ? const SnPublisher() - : SnPublisher.fromJson(json['publisher'] as Map), + publisher: SnPublisher.fromJson(json['publisher'] as Map), reactionsCount: (json['reactions_count'] as Map?)?.map( (k, e) => MapEntry(k, (e as num).toInt()), @@ -119,64 +116,6 @@ Map _$SnPostToJson(_SnPost instance) => { 'is_truncated': instance.isTruncated, }; -_SnPublisher _$SnPublisherFromJson(Map json) => _SnPublisher( - id: json['id'] as String? ?? '', - type: (json['type'] as num?)?.toInt() ?? 0, - name: json['name'] as String? ?? '', - nick: json['nick'] as String? ?? '', - bio: json['bio'] as String? ?? '', - picture: - json['picture'] == null - ? null - : SnCloudFile.fromJson(json['picture'] as Map), - background: - json['background'] == null - ? null - : SnCloudFile.fromJson(json['background'] as Map), - account: - json['account'] == null - ? null - : SnAccount.fromJson(json['account'] as Map), - accountId: json['account_id'] as String?, - createdAt: - json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: - json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - deletedAt: - json['deleted_at'] == null - ? null - : DateTime.parse(json['deleted_at'] as String), - realmId: json['realm_id'] as String?, - verification: - json['verification'] == null - ? null - : SnVerificationMark.fromJson( - json['verification'] as Map, - ), -); - -Map _$SnPublisherToJson(_SnPublisher instance) => - { - 'id': instance.id, - 'type': instance.type, - 'name': instance.name, - 'nick': instance.nick, - 'bio': instance.bio, - 'picture': instance.picture?.toJson(), - 'background': instance.background?.toJson(), - 'account': instance.account?.toJson(), - 'account_id': instance.accountId, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'deleted_at': instance.deletedAt?.toIso8601String(), - 'realm_id': instance.realmId, - 'verification': instance.verification?.toJson(), - }; - _SnPublisherStats _$SnPublisherStatsFromJson(Map json) => _SnPublisherStats( postsCreated: (json['posts_created'] as num).toInt(), diff --git a/lib/models/publisher.dart b/lib/models/publisher.dart new file mode 100644 index 0000000..dcd06c5 --- /dev/null +++ b/lib/models/publisher.dart @@ -0,0 +1,47 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:island/models/file.dart'; +import 'package:island/models/user.dart'; + +part 'publisher.freezed.dart'; +part 'publisher.g.dart'; + +@freezed +sealed class SnPublisher with _$SnPublisher { + const factory SnPublisher({ + @Default('') String id, + @Default(0) int type, + @Default('') String name, + @Default('') String nick, + @Default('') String bio, + SnCloudFile? picture, + SnCloudFile? background, + SnAccount? account, + String? accountId, + @Default(null) DateTime? createdAt, + @Default(null) DateTime? updatedAt, + DateTime? deletedAt, + String? realmId, + SnVerificationMark? verification, + }) = _SnPublisher; + + factory SnPublisher.fromJson(Map json) => + _$SnPublisherFromJson(json); +} + +@freezed +sealed class SnPublisherMember with _$SnPublisherMember { + const factory SnPublisherMember({ + required String publisherId, + required SnPublisher? publisher, + required String accountId, + required SnAccount? account, + required int role, + required DateTime? joinedAt, + required DateTime createdAt, + required DateTime updatedAt, + required DateTime? deletedAt, + }) = _SnPublisherMember; + + factory SnPublisherMember.fromJson(Map json) => + _$SnPublisherMemberFromJson(json); +} diff --git a/lib/models/publisher.freezed.dart b/lib/models/publisher.freezed.dart new file mode 100644 index 0000000..b4ac9b8 --- /dev/null +++ b/lib/models/publisher.freezed.dart @@ -0,0 +1,488 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'publisher.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$SnPublisher { + + String get id; int get type; String get name; String get nick; String get bio; SnCloudFile? get picture; SnCloudFile? get background; SnAccount? get account; String? get accountId; DateTime? get createdAt; DateTime? get updatedAt; DateTime? get deletedAt; String? get realmId; SnVerificationMark? get verification; +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SnPublisherCopyWith get copyWith => _$SnPublisherCopyWithImpl(this as SnPublisher, _$identity); + + /// Serializes this SnPublisher to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPublisher&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.name, name) || other.name == name)&&(identical(other.nick, nick) || other.nick == nick)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.account, account) || other.account == account)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.verification, verification) || other.verification == verification)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,type,name,nick,bio,picture,background,account,accountId,createdAt,updatedAt,deletedAt,realmId,verification); + +@override +String toString() { + return 'SnPublisher(id: $id, type: $type, name: $name, nick: $nick, bio: $bio, picture: $picture, background: $background, account: $account, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, realmId: $realmId, verification: $verification)'; +} + + +} + +/// @nodoc +abstract mixin class $SnPublisherCopyWith<$Res> { + factory $SnPublisherCopyWith(SnPublisher value, $Res Function(SnPublisher) _then) = _$SnPublisherCopyWithImpl; +@useResult +$Res call({ + String id, int type, String name, String nick, String bio, SnCloudFile? picture, SnCloudFile? background, SnAccount? account, String? accountId, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, String? realmId, SnVerificationMark? verification +}); + + +$SnCloudFileCopyWith<$Res>? get picture;$SnCloudFileCopyWith<$Res>? get background;$SnAccountCopyWith<$Res>? get account;$SnVerificationMarkCopyWith<$Res>? get verification; + +} +/// @nodoc +class _$SnPublisherCopyWithImpl<$Res> + implements $SnPublisherCopyWith<$Res> { + _$SnPublisherCopyWithImpl(this._self, this._then); + + final SnPublisher _self; + final $Res Function(SnPublisher) _then; + +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? type = null,Object? name = null,Object? nick = null,Object? bio = null,Object? picture = freezed,Object? background = freezed,Object? account = freezed,Object? accountId = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? realmId = freezed,Object? verification = freezed,}) { + return _then(_self.copyWith( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as int,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String,nick: null == nick ? _self.nick : nick // ignore: cast_nullable_to_non_nullable +as String,bio: null == bio ? _self.bio : bio // ignore: cast_nullable_to_non_nullable +as String,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable +as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable +as SnCloudFile?,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,realmId: freezed == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable +as String?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable +as SnVerificationMark?, + )); +} +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnCloudFileCopyWith<$Res>? get picture { + if (_self.picture == null) { + return null; + } + + return $SnCloudFileCopyWith<$Res>(_self.picture!, (value) { + return _then(_self.copyWith(picture: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnCloudFileCopyWith<$Res>? get background { + if (_self.background == null) { + return null; + } + + return $SnCloudFileCopyWith<$Res>(_self.background!, (value) { + return _then(_self.copyWith(background: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnVerificationMarkCopyWith<$Res>? get verification { + if (_self.verification == null) { + return null; + } + + return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) { + return _then(_self.copyWith(verification: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _SnPublisher implements SnPublisher { + const _SnPublisher({this.id = '', this.type = 0, this.name = '', this.nick = '', this.bio = '', this.picture, this.background, this.account, this.accountId, this.createdAt = null, this.updatedAt = null, this.deletedAt, this.realmId, this.verification}); + factory _SnPublisher.fromJson(Map json) => _$SnPublisherFromJson(json); + +@override@JsonKey() final String id; +@override@JsonKey() final int type; +@override@JsonKey() final String name; +@override@JsonKey() final String nick; +@override@JsonKey() final String bio; +@override final SnCloudFile? picture; +@override final SnCloudFile? background; +@override final SnAccount? account; +@override final String? accountId; +@override@JsonKey() final DateTime? createdAt; +@override@JsonKey() final DateTime? updatedAt; +@override final DateTime? deletedAt; +@override final String? realmId; +@override final SnVerificationMark? verification; + +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SnPublisherCopyWith<_SnPublisher> get copyWith => __$SnPublisherCopyWithImpl<_SnPublisher>(this, _$identity); + +@override +Map toJson() { + return _$SnPublisherToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPublisher&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.name, name) || other.name == name)&&(identical(other.nick, nick) || other.nick == nick)&&(identical(other.bio, bio) || other.bio == bio)&&(identical(other.picture, picture) || other.picture == picture)&&(identical(other.background, background) || other.background == background)&&(identical(other.account, account) || other.account == account)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.realmId, realmId) || other.realmId == realmId)&&(identical(other.verification, verification) || other.verification == verification)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,type,name,nick,bio,picture,background,account,accountId,createdAt,updatedAt,deletedAt,realmId,verification); + +@override +String toString() { + return 'SnPublisher(id: $id, type: $type, name: $name, nick: $nick, bio: $bio, picture: $picture, background: $background, account: $account, accountId: $accountId, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, realmId: $realmId, verification: $verification)'; +} + + +} + +/// @nodoc +abstract mixin class _$SnPublisherCopyWith<$Res> implements $SnPublisherCopyWith<$Res> { + factory _$SnPublisherCopyWith(_SnPublisher value, $Res Function(_SnPublisher) _then) = __$SnPublisherCopyWithImpl; +@override @useResult +$Res call({ + String id, int type, String name, String nick, String bio, SnCloudFile? picture, SnCloudFile? background, SnAccount? account, String? accountId, DateTime? createdAt, DateTime? updatedAt, DateTime? deletedAt, String? realmId, SnVerificationMark? verification +}); + + +@override $SnCloudFileCopyWith<$Res>? get picture;@override $SnCloudFileCopyWith<$Res>? get background;@override $SnAccountCopyWith<$Res>? get account;@override $SnVerificationMarkCopyWith<$Res>? get verification; + +} +/// @nodoc +class __$SnPublisherCopyWithImpl<$Res> + implements _$SnPublisherCopyWith<$Res> { + __$SnPublisherCopyWithImpl(this._self, this._then); + + final _SnPublisher _self; + final $Res Function(_SnPublisher) _then; + +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? type = null,Object? name = null,Object? nick = null,Object? bio = null,Object? picture = freezed,Object? background = freezed,Object? account = freezed,Object? accountId = freezed,Object? createdAt = freezed,Object? updatedAt = freezed,Object? deletedAt = freezed,Object? realmId = freezed,Object? verification = freezed,}) { + return _then(_SnPublisher( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as int,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String,nick: null == nick ? _self.nick : nick // ignore: cast_nullable_to_non_nullable +as String,bio: null == bio ? _self.bio : bio // ignore: cast_nullable_to_non_nullable +as String,picture: freezed == picture ? _self.picture : picture // ignore: cast_nullable_to_non_nullable +as SnCloudFile?,background: freezed == background ? _self.background : background // ignore: cast_nullable_to_non_nullable +as SnCloudFile?,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,accountId: freezed == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String?,createdAt: freezed == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime?,updatedAt: freezed == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,realmId: freezed == realmId ? _self.realmId : realmId // ignore: cast_nullable_to_non_nullable +as String?,verification: freezed == verification ? _self.verification : verification // ignore: cast_nullable_to_non_nullable +as SnVerificationMark?, + )); +} + +/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnCloudFileCopyWith<$Res>? get picture { + if (_self.picture == null) { + return null; + } + + return $SnCloudFileCopyWith<$Res>(_self.picture!, (value) { + return _then(_self.copyWith(picture: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnCloudFileCopyWith<$Res>? get background { + if (_self.background == null) { + return null; + } + + return $SnCloudFileCopyWith<$Res>(_self.background!, (value) { + return _then(_self.copyWith(background: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +}/// Create a copy of SnPublisher +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnVerificationMarkCopyWith<$Res>? get verification { + if (_self.verification == null) { + return null; + } + + return $SnVerificationMarkCopyWith<$Res>(_self.verification!, (value) { + return _then(_self.copyWith(verification: value)); + }); +} +} + + +/// @nodoc +mixin _$SnPublisherMember { + + String get publisherId; SnPublisher? get publisher; String get accountId; SnAccount? get account; int get role; DateTime? get joinedAt; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SnPublisherMemberCopyWith get copyWith => _$SnPublisherMemberCopyWithImpl(this as SnPublisherMember, _$identity); + + /// Serializes this SnPublisherMember to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SnPublisherMember&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,publisherId,publisher,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt); + +@override +String toString() { + return 'SnPublisherMember(publisherId: $publisherId, publisher: $publisher, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; +} + + +} + +/// @nodoc +abstract mixin class $SnPublisherMemberCopyWith<$Res> { + factory $SnPublisherMemberCopyWith(SnPublisherMember value, $Res Function(SnPublisherMember) _then) = _$SnPublisherMemberCopyWithImpl; +@useResult +$Res call({ + String publisherId, SnPublisher? publisher, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt +}); + + +$SnPublisherCopyWith<$Res>? get publisher;$SnAccountCopyWith<$Res>? get account; + +} +/// @nodoc +class _$SnPublisherMemberCopyWithImpl<$Res> + implements $SnPublisherMemberCopyWith<$Res> { + _$SnPublisherMemberCopyWithImpl(this._self, this._then); + + final SnPublisherMember _self; + final $Res Function(SnPublisherMember) _then; + +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? publisherId = null,Object? publisher = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { + return _then(_self.copyWith( +publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable +as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable +as SnPublisher?,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,role: null == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as int,joinedAt: freezed == joinedAt ? _self.joinedAt : joinedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?, + )); +} +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnPublisherCopyWith<$Res>? get publisher { + if (_self.publisher == null) { + return null; + } + + return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { + return _then(_self.copyWith(publisher: value)); + }); +}/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _SnPublisherMember implements SnPublisherMember { + const _SnPublisherMember({required this.publisherId, required this.publisher, required this.accountId, required this.account, required this.role, required this.joinedAt, required this.createdAt, required this.updatedAt, required this.deletedAt}); + factory _SnPublisherMember.fromJson(Map json) => _$SnPublisherMemberFromJson(json); + +@override final String publisherId; +@override final SnPublisher? publisher; +@override final String accountId; +@override final SnAccount? account; +@override final int role; +@override final DateTime? joinedAt; +@override final DateTime createdAt; +@override final DateTime updatedAt; +@override final DateTime? deletedAt; + +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SnPublisherMemberCopyWith<_SnPublisherMember> get copyWith => __$SnPublisherMemberCopyWithImpl<_SnPublisherMember>(this, _$identity); + +@override +Map toJson() { + return _$SnPublisherMemberToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnPublisherMember&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisher, publisher) || other.publisher == publisher)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.role, role) || other.role == role)&&(identical(other.joinedAt, joinedAt) || other.joinedAt == joinedAt)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,publisherId,publisher,accountId,account,role,joinedAt,createdAt,updatedAt,deletedAt); + +@override +String toString() { + return 'SnPublisherMember(publisherId: $publisherId, publisher: $publisher, accountId: $accountId, account: $account, role: $role, joinedAt: $joinedAt, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; +} + + +} + +/// @nodoc +abstract mixin class _$SnPublisherMemberCopyWith<$Res> implements $SnPublisherMemberCopyWith<$Res> { + factory _$SnPublisherMemberCopyWith(_SnPublisherMember value, $Res Function(_SnPublisherMember) _then) = __$SnPublisherMemberCopyWithImpl; +@override @useResult +$Res call({ + String publisherId, SnPublisher? publisher, String accountId, SnAccount? account, int role, DateTime? joinedAt, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt +}); + + +@override $SnPublisherCopyWith<$Res>? get publisher;@override $SnAccountCopyWith<$Res>? get account; + +} +/// @nodoc +class __$SnPublisherMemberCopyWithImpl<$Res> + implements _$SnPublisherMemberCopyWith<$Res> { + __$SnPublisherMemberCopyWithImpl(this._self, this._then); + + final _SnPublisherMember _self; + final $Res Function(_SnPublisherMember) _then; + +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? publisherId = null,Object? publisher = freezed,Object? accountId = null,Object? account = freezed,Object? role = null,Object? joinedAt = freezed,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { + return _then(_SnPublisherMember( +publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable +as String,publisher: freezed == publisher ? _self.publisher : publisher // ignore: cast_nullable_to_non_nullable +as SnPublisher?,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,role: null == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as int,joinedAt: freezed == joinedAt ? _self.joinedAt : joinedAt // ignore: cast_nullable_to_non_nullable +as DateTime?,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?, + )); +} + +/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnPublisherCopyWith<$Res>? get publisher { + if (_self.publisher == null) { + return null; + } + + return $SnPublisherCopyWith<$Res>(_self.publisher!, (value) { + return _then(_self.copyWith(publisher: value)); + }); +}/// Create a copy of SnPublisherMember +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +} +} + +// dart format on diff --git a/lib/models/publisher.g.dart b/lib/models/publisher.g.dart new file mode 100644 index 0000000..edd179a --- /dev/null +++ b/lib/models/publisher.g.dart @@ -0,0 +1,103 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'publisher.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_SnPublisher _$SnPublisherFromJson(Map json) => _SnPublisher( + id: json['id'] as String? ?? '', + type: (json['type'] as num?)?.toInt() ?? 0, + name: json['name'] as String? ?? '', + nick: json['nick'] as String? ?? '', + bio: json['bio'] as String? ?? '', + picture: + json['picture'] == null + ? null + : SnCloudFile.fromJson(json['picture'] as Map), + background: + json['background'] == null + ? null + : SnCloudFile.fromJson(json['background'] as Map), + account: + json['account'] == null + ? null + : SnAccount.fromJson(json['account'] as Map), + accountId: json['account_id'] as String?, + createdAt: + json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: + json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + deletedAt: + json['deleted_at'] == null + ? null + : DateTime.parse(json['deleted_at'] as String), + realmId: json['realm_id'] as String?, + verification: + json['verification'] == null + ? null + : SnVerificationMark.fromJson( + json['verification'] as Map, + ), +); + +Map _$SnPublisherToJson(_SnPublisher instance) => + { + 'id': instance.id, + 'type': instance.type, + 'name': instance.name, + 'nick': instance.nick, + 'bio': instance.bio, + 'picture': instance.picture?.toJson(), + 'background': instance.background?.toJson(), + 'account': instance.account?.toJson(), + 'account_id': instance.accountId, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'deleted_at': instance.deletedAt?.toIso8601String(), + 'realm_id': instance.realmId, + 'verification': instance.verification?.toJson(), + }; + +_SnPublisherMember _$SnPublisherMemberFromJson(Map json) => + _SnPublisherMember( + publisherId: json['publisher_id'] as String, + publisher: + json['publisher'] == null + ? null + : SnPublisher.fromJson(json['publisher'] as Map), + accountId: json['account_id'] as String, + account: + json['account'] == null + ? null + : SnAccount.fromJson(json['account'] as Map), + role: (json['role'] as num).toInt(), + joinedAt: + json['joined_at'] == null + ? null + : DateTime.parse(json['joined_at'] as String), + createdAt: DateTime.parse(json['created_at'] as String), + updatedAt: DateTime.parse(json['updated_at'] as String), + deletedAt: + json['deleted_at'] == null + ? null + : DateTime.parse(json['deleted_at'] as String), + ); + +Map _$SnPublisherMemberToJson(_SnPublisherMember instance) => + { + 'publisher_id': instance.publisherId, + 'publisher': instance.publisher?.toJson(), + 'account_id': instance.accountId, + 'account': instance.account?.toJson(), + 'role': instance.role, + 'joined_at': instance.joinedAt?.toIso8601String(), + 'created_at': instance.createdAt.toIso8601String(), + 'updated_at': instance.updatedAt.toIso8601String(), + 'deleted_at': instance.deletedAt?.toIso8601String(), + }; diff --git a/lib/models/sticker.dart b/lib/models/sticker.dart index 0734612..3021e12 100644 --- a/lib/models/sticker.dart +++ b/lib/models/sticker.dart @@ -1,6 +1,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:island/models/file.dart'; -import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; part 'sticker.freezed.dart'; part 'sticker.g.dart'; diff --git a/lib/screens/account/profile.g.dart b/lib/screens/account/profile.g.dart index 71bf551..5817caa 100644 --- a/lib/screens/account/profile.g.dart +++ b/lib/screens/account/profile.g.dart @@ -268,7 +268,7 @@ class _AccountBadgesProviderElement } String _$accountAppbarForcegroundColorHash() => - r'f654a7a5594eda1500906e9ad023c22772257a9b'; + r'8ee0cae10817b77fb09548a482f5247662b4374c'; /// See also [accountAppbarForcegroundColor]. @ProviderFor(accountAppbarForcegroundColor) diff --git a/lib/screens/creators/hub.dart b/lib/screens/creators/hub.dart index 61242ce..3752169 100644 --- a/lib/screens/creators/hub.dart +++ b/lib/screens/creators/hub.dart @@ -1,3 +1,4 @@ +import 'package:dio/dio.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -6,14 +7,19 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/creators/publishers.dart'; import 'package:island/services/responsive.dart'; +import 'package:island/widgets/account/account_picker.dart'; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/cloud_files.dart'; +import 'package:island/widgets/content/sheet.dart'; +import 'package:island/widgets/response.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; import 'package:styled_widget/styled_widget.dart'; part 'hub.g.dart'; @@ -26,6 +32,65 @@ Future publisherStats(Ref ref, String? uname) async { return SnPublisherStats.fromJson(resp.data); } +@riverpod +Future publisherIdentity(Ref ref, String uname) async { + try { + final apiClient = ref.watch(apiClientProvider); + final response = await apiClient.get('/publishers/$uname/members/me'); + return SnPublisherMember.fromJson(response.data); + } catch (err) { + if (err is DioException && err.response?.statusCode == 404) { + return null; // No identity found, user is not a member + } + rethrow; + } +} + +@riverpod +Future> publisherInvites(Ref ref) async { + final client = ref.watch(apiClientProvider); + final resp = await client.get('/publishers/invites'); + return resp.data + .map((e) => SnPublisherMember.fromJson(e)) + .cast() + .toList(); +} + +@riverpod +class PublisherMemberListNotifier extends _$PublisherMemberListNotifier + with CursorPagingNotifierMixin { + static const int _pageSize = 20; + + @override + Future> build(String uname) async { + return fetch(); + } + + @override + Future> fetch({String? cursor}) async { + final apiClient = ref.read(apiClientProvider); + final offset = cursor != null ? int.parse(cursor) : 0; + + final response = await apiClient.get( + '/publishers/$uname/members', + queryParameters: {'offset': offset, 'take': _pageSize}, + ); + + final total = int.parse(response.headers.value('X-Total') ?? '0'); + final List data = response.data; + final members = data.map((e) => SnPublisherMember.fromJson(e)).toList(); + + final hasMore = offset + members.length < total; + final nextCursor = hasMore ? (offset + members.length).toString() : null; + + return CursorPagingData( + items: members, + hasMore: hasMore, + nextCursor: nextCursor, + ); + } +} + class CreatorHubShellScreen extends StatelessWidget { final Widget child; const CreatorHubShellScreen({super.key, required this.child}); @@ -58,21 +123,20 @@ class CreatorHubScreen extends HookConsumerWidget { } final publishers = ref.watch(publishersManagedProvider); + final publisherInvites = ref.watch(publisherInvitesProvider); final currentPublisher = useState( publishers.value?.firstOrNull, ); void updatePublisher() { - context - .push('/creators/${currentPublisher.value!.name}/edit') - .then((value) async { - if (value == null) return; - final data = await ref.refresh(publishersManagedProvider.future); - currentPublisher.value = - data - .where((e) => e.id == currentPublisher.value!.id) - .firstOrNull; - }); + context.push('/creators/${currentPublisher.value!.name}/edit').then(( + value, + ) async { + if (value == null) return; + final data = await ref.refresh(publishersManagedProvider.future); + currentPublisher.value = + data.where((e) => e.id == currentPublisher.value!.id).firstOrNull; + }); } void deletePublisher() { @@ -126,6 +190,30 @@ class CreatorHubScreen extends HookConsumerWidget { leading: !isWide ? const PageBackButton() : null, title: Text('creatorHub').tr(), actions: [ + IconButton( + icon: Badge( + label: Text( + publisherInvites.when( + data: (invites) => invites.length.toString(), + error: (_, _) => '0', + loading: () => '0', + ), + ), + isLabelVisible: publisherInvites.when( + data: (invites) => invites.isNotEmpty, + error: (_, _) => false, + loading: () => false, + ), + child: const Icon(Symbols.email), + ), + onPressed: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (_) => const _PublisherInviteSheet(), + ); + }, + ), DropdownButtonHideUnderline( child: DropdownButton2( alignment: Alignment.centerRight, @@ -203,7 +291,7 @@ class CreatorHubScreen extends HookConsumerWidget { ...(publishers.value?.map( (publisher) => ListTile( leading: ProfilePictureWidget( - fileId: publisher.picture?.id, + file: publisher.picture, ), title: Text(publisher.nick), subtitle: Text('@${publisher.name}'), @@ -266,6 +354,32 @@ class CreatorHubScreen extends HookConsumerWidget { ); }, ), + ListTile( + minTileHeight: 48, + title: Text('members').plural( + ref + .watch(publisherMemberStateProvider( + currentPublisher.value!.name, + )) + .total, + ), + trailing: Icon(Symbols.chevron_right), + leading: const Icon(Symbols.group), + contentPadding: EdgeInsets.symmetric( + horizontal: 24, + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: + (context) => _PublisherMemberListSheet( + publisherUname: + currentPublisher.value!.name, + ), + ); + }, + ), Divider(height: 1).padding(vertical: 8), ListTile( minTileHeight: 48, @@ -393,3 +507,483 @@ class _PublisherStatsWidget extends StatelessWidget { ); } } + +class PublisherMemberState { + final List members; + final bool isLoading; + final int total; + final String? error; + + const PublisherMemberState({ + required this.members, + required this.isLoading, + required this.total, + this.error, + }); + + PublisherMemberState copyWith({ + List? members, + bool? isLoading, + int? total, + String? error, + }) { + return PublisherMemberState( + members: members ?? this.members, + isLoading: isLoading ?? this.isLoading, + total: total ?? this.total, + error: error ?? this.error, + ); + } +} + +final publisherMemberStateProvider = StateNotifierProvider.family< + PublisherMemberNotifier, PublisherMemberState, String>( + (ref, publisherUname) { + final apiClient = ref.watch(apiClientProvider); + return PublisherMemberNotifier(apiClient, publisherUname); + }, +); + +class PublisherMemberNotifier extends StateNotifier { + final String publisherUname; + final Dio _apiClient; + + PublisherMemberNotifier(this._apiClient, this.publisherUname) + : super(const PublisherMemberState( + members: [], + isLoading: false, + total: 0, + )); + + Future loadMore({int offset = 0, int take = 20}) async { + if (state.isLoading) return; + if (state.total > 0 && state.members.length >= state.total) return; + + state = state.copyWith(isLoading: true, error: null); + + try { + final response = await _apiClient.get( + '/publishers/$publisherUname/members', + queryParameters: {'offset': offset, 'take': take}, + ); + + final total = int.parse(response.headers.value('X-Total') ?? '0'); + final List data = response.data; + final members = + data.map((e) => SnPublisherMember.fromJson(e)).toList(); + + state = state.copyWith( + members: [...state.members, ...members], + total: total, + isLoading: false, + ); + } catch (e) { + state = state.copyWith(error: e.toString(), isLoading: false); + } + } + + void reset() { + state = const PublisherMemberState(members: [], isLoading: false, total: 0); + } +} + +class _PublisherMemberListSheet extends HookConsumerWidget { + final String publisherUname; + const _PublisherMemberListSheet({required this.publisherUname}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final publisherIdentity = ref.watch( + publisherIdentityProvider(publisherUname), + ); + final memberListProvider = + publisherMemberListNotifierProvider(publisherUname); + final memberState = ref.watch(publisherMemberStateProvider(publisherUname)); + final memberNotifier = ref.read( + publisherMemberStateProvider(publisherUname).notifier, + ); + + useEffect(() { + Future(() { + memberNotifier.loadMore(); + }); + return null; + }, []); + + Future invitePerson() async { + final result = await showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (context) => const AccountPickerSheet(), + ); + if (result == null) return; + try { + final apiClient = ref.watch(apiClientProvider); + await apiClient.post( + '/publishers/$publisherUname/invites', + data: {'related_user_id': result.id, 'role': 0}, + ); + ref.invalidate(memberListProvider); + } catch (err) { + showErrorAlert(err); + } + } + + return Container( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.8, + ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(top: 16, left: 20, right: 16, bottom: 12), + child: Row( + children: [ + Text( + 'members'.plural(memberState.total), + style: Theme.of(context).textTheme.headlineSmall?.copyWith( + fontWeight: FontWeight.w600, + letterSpacing: -0.5, + ), + ), + const Spacer(), + IconButton( + icon: const Icon(Symbols.person_add), + onPressed: invitePerson, + style: IconButton.styleFrom(minimumSize: const Size(36, 36)), + ), + IconButton( + icon: const Icon(Symbols.refresh), + onPressed: () { + memberNotifier.reset(); + memberNotifier.loadMore(); + ref.invalidate(memberListProvider); + }, + ), + IconButton( + icon: const Icon(Symbols.close), + onPressed: () => Navigator.pop(context), + style: IconButton.styleFrom(minimumSize: const Size(36, 36)), + ), + ], + ), + ), + const Divider(height: 1), + Expanded( + child: PagingHelperView( + provider: memberListProvider, + futureRefreshable: memberListProvider.future, + notifierRefreshable: memberListProvider.notifier, + contentBuilder: (data, widgetCount, endItemView) { + return ListView.builder( + itemCount: widgetCount, + itemBuilder: (context, index) { + if (index == data.items.length) { + return endItemView; + } + + final member = data.items[index]; + return ListTile( + contentPadding: EdgeInsets.only(left: 16, right: 12), + leading: ProfilePictureWidget( + fileId: member.account!.profile.picture?.id, + ), + title: Row( + spacing: 6, + children: [ + Flexible(child: Text(member.account!.nick)), + if (member.joinedAt == null) + const Icon(Symbols.pending_actions, size: 20), + ], + ), + subtitle: Row( + children: [ + Text( + member.role >= 100 + ? 'permissionOwner' + : member.role >= 50 + ? 'permissionModerator' + : 'permissionMember', + ).tr(), + Text('ยท').bold().padding(horizontal: 6), + Expanded(child: Text("@${member.account!.name}")), + ], + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if ((publisherIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.edit), + onPressed: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: + (context) => _PublisherMemberRoleSheet( + publisherUname: publisherUname, + member: member, + ), + ).then((value) { + if (value != null) { + ref.invalidate(memberListProvider); + } + }); + }, + ), + if ((publisherIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.delete), + onPressed: () { + showConfirmAlert( + 'removePublisherMemberHint'.tr(), + 'removePublisherMember'.tr(), + ).then((confirm) async { + if (confirm != true) return; + try { + final apiClient = ref.watch( + apiClientProvider, + ); + await apiClient.delete( + '/publishers/$publisherUname/members/${member.accountId}', + ); + ref.invalidate(memberListProvider); + } catch (err) { + showErrorAlert(err); + } + }); + }, + ), + ], + ), + ); + }, + ); + }, + ), + ), + ], + ), + ); + } +} + +class _PublisherMemberRoleSheet extends HookConsumerWidget { + final String publisherUname; + final SnPublisherMember member; + + const _PublisherMemberRoleSheet({ + required this.publisherUname, + required this.member, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final roleController = useTextEditingController( + text: member.role.toString(), + ); + + return Container( + padding: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom, + ), + child: SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: EdgeInsets.only( + top: 16, + left: 20, + right: 16, + bottom: 12, + ), + child: Row( + children: [ + Text( + 'memberRoleEdit'.tr(args: [member.account!.name]), + style: Theme.of(context).textTheme.headlineSmall?.copyWith( + fontWeight: FontWeight.w600, + letterSpacing: -0.5, + ), + ), + const Spacer(), + IconButton( + icon: const Icon(Symbols.close), + onPressed: () => Navigator.pop(context), + style: IconButton.styleFrom( + minimumSize: const Size(36, 36), + ), + ), + ], + ), + ), + const Divider(height: 1), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Autocomplete( + optionsBuilder: (TextEditingValue textEditingValue) { + if (textEditingValue.text.isEmpty) { + return const [100, 50, 0]; + } + final int? value = int.tryParse(textEditingValue.text); + if (value == null) return const [100, 50, 0]; + return [100, 50, 0].where( + (option) => + option.toString().contains(textEditingValue.text), + ); + }, + onSelected: (int selection) { + roleController.text = selection.toString(); + }, + fieldViewBuilder: ( + context, + controller, + focusNode, + onFieldSubmitted, + ) { + return TextField( + controller: controller, + focusNode: focusNode, + keyboardType: TextInputType.number, + decoration: InputDecoration( + labelText: 'memberRole'.tr(), + helperText: 'memberRoleHint'.tr(), + ), + onTapOutside: (event) => focusNode.unfocus(), + ); + }, + ), + const Gap(16), + FilledButton.icon( + onPressed: () async { + try { + final newRole = int.parse(roleController.text); + if (newRole < 0 || newRole > 100) { + throw 'Role must be between 0 and 100'; + } + + final apiClient = ref.read(apiClientProvider); + await apiClient.patch( + '/publishers/$publisherUname/members/${member.accountId}/role', + data: newRole, + ); + + if (context.mounted) Navigator.pop(context, true); + } catch (err) { + showErrorAlert(err); + } + }, + icon: const Icon(Symbols.save), + label: const Text('saveChanges').tr(), + ), + ], + ).padding(vertical: 16, horizontal: 24), + ], + ), + ), + ); + } +} + +class _PublisherInviteSheet extends HookConsumerWidget { + const _PublisherInviteSheet(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final invites = ref.watch(publisherInvitesProvider); + + Future acceptInvite(SnPublisherMember invite) async { + try { + final client = ref.read(apiClientProvider); + await client.post( + '/publishers/invites/${invite.publisher!.name}/accept', + ); + ref.invalidate(publisherInvitesProvider); + ref.invalidate(publishersManagedProvider); + } catch (err) { + showErrorAlert(err); + } + } + + Future declineInvite(SnPublisherMember invite) async { + try { + final client = ref.read(apiClientProvider); + await client.post( + '/publishers/invites/${invite.publisher!.name}/decline', + ); + ref.invalidate(publisherInvitesProvider); + } catch (err) { + showErrorAlert(err); + } + } + + return SheetScaffold( + titleText: 'invites'.tr(), + actions: [ + IconButton( + icon: const Icon(Symbols.refresh), + style: IconButton.styleFrom(minimumSize: const Size(36, 36)), + onPressed: () { + ref.invalidate(publisherInvitesProvider); + }, + ), + ], + child: invites.when( + data: + (items) => + items.isEmpty + ? Center( + child: + Text( + 'invitesEmpty', + textAlign: TextAlign.center, + ).tr(), + ) + : ListView.builder( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + final invite = items[index]; + return ListTile( + leading: ProfilePictureWidget( + fileId: invite.publisher!.picture?.id, + fallbackIcon: Symbols.group, + ), + title: Text(invite.publisher!.nick), + subtitle: + Text( + invite.role >= 100 + ? 'permissionOwner' + : invite.role >= 50 + ? 'permissionModerator' + : 'permissionMember', + ).tr(), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(Symbols.check), + onPressed: () => acceptInvite(invite), + ), + IconButton( + icon: const Icon(Symbols.close), + onPressed: () => declineInvite(invite), + ), + ], + ), + ); + }, + ), + loading: () => const Center(child: CircularProgressIndicator()), + error: + (error, _) => ResponseErrorWidget( + error: error, + onRetry: () => ref.invalidate(publisherInvitesProvider), + ), + ), + ); + } +} diff --git a/lib/screens/creators/hub.g.dart b/lib/screens/creators/hub.g.dart index 694c03c..1795cc0 100644 --- a/lib/screens/creators/hub.g.dart +++ b/lib/screens/creators/hub.g.dart @@ -149,5 +149,300 @@ class _PublisherStatsProviderElement String? get uname => (origin as PublisherStatsProvider).uname; } +String _$publisherIdentityHash() => r'f7fd986a303a729ca5557022fceb37cd01fa17f3'; + +/// See also [publisherIdentity]. +@ProviderFor(publisherIdentity) +const publisherIdentityProvider = PublisherIdentityFamily(); + +/// See also [publisherIdentity]. +class PublisherIdentityFamily extends Family> { + /// See also [publisherIdentity]. + const PublisherIdentityFamily(); + + /// See also [publisherIdentity]. + PublisherIdentityProvider call(String uname) { + return PublisherIdentityProvider(uname); + } + + @override + PublisherIdentityProvider getProviderOverride( + covariant PublisherIdentityProvider provider, + ) { + return call(provider.uname); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'publisherIdentityProvider'; +} + +/// See also [publisherIdentity]. +class PublisherIdentityProvider + extends AutoDisposeFutureProvider { + /// See also [publisherIdentity]. + PublisherIdentityProvider(String uname) + : this._internal( + (ref) => publisherIdentity(ref as PublisherIdentityRef, uname), + from: publisherIdentityProvider, + name: r'publisherIdentityProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$publisherIdentityHash, + dependencies: PublisherIdentityFamily._dependencies, + allTransitiveDependencies: + PublisherIdentityFamily._allTransitiveDependencies, + uname: uname, + ); + + PublisherIdentityProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.uname, + }) : super.internal(); + + final String uname; + + @override + Override overrideWith( + FutureOr Function(PublisherIdentityRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: PublisherIdentityProvider._internal( + (ref) => create(ref as PublisherIdentityRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + uname: uname, + ), + ); + } + + @override + AutoDisposeFutureProviderElement createElement() { + return _PublisherIdentityProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is PublisherIdentityProvider && other.uname == uname; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, uname.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin PublisherIdentityRef on AutoDisposeFutureProviderRef { + /// The parameter `uname` of this provider. + String get uname; +} + +class _PublisherIdentityProviderElement + extends AutoDisposeFutureProviderElement + with PublisherIdentityRef { + _PublisherIdentityProviderElement(super.provider); + + @override + String get uname => (origin as PublisherIdentityProvider).uname; +} + +String _$publisherInvitesHash() => r'488cd443407895ce11f4edff07cb6ea58f2aa018'; + +/// See also [publisherInvites]. +@ProviderFor(publisherInvites) +final publisherInvitesProvider = + AutoDisposeFutureProvider>.internal( + publisherInvites, + name: r'publisherInvitesProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$publisherInvitesHash, + dependencies: null, + allTransitiveDependencies: null, + ); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef PublisherInvitesRef = + AutoDisposeFutureProviderRef>; +String _$publisherMemberListNotifierHash() => + r'237e8f39c9757a6cbdff817853c697539242ad2a'; + +abstract class _$PublisherMemberListNotifier + extends + BuildlessAutoDisposeAsyncNotifier> { + late final String uname; + + FutureOr> build(String uname); +} + +/// See also [PublisherMemberListNotifier]. +@ProviderFor(PublisherMemberListNotifier) +const publisherMemberListNotifierProvider = PublisherMemberListNotifierFamily(); + +/// See also [PublisherMemberListNotifier]. +class PublisherMemberListNotifierFamily + extends Family>> { + /// See also [PublisherMemberListNotifier]. + const PublisherMemberListNotifierFamily(); + + /// See also [PublisherMemberListNotifier]. + PublisherMemberListNotifierProvider call(String uname) { + return PublisherMemberListNotifierProvider(uname); + } + + @override + PublisherMemberListNotifierProvider getProviderOverride( + covariant PublisherMemberListNotifierProvider provider, + ) { + return call(provider.uname); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'publisherMemberListNotifierProvider'; +} + +/// See also [PublisherMemberListNotifier]. +class PublisherMemberListNotifierProvider + extends + AutoDisposeAsyncNotifierProviderImpl< + PublisherMemberListNotifier, + CursorPagingData + > { + /// See also [PublisherMemberListNotifier]. + PublisherMemberListNotifierProvider(String uname) + : this._internal( + () => PublisherMemberListNotifier()..uname = uname, + from: publisherMemberListNotifierProvider, + name: r'publisherMemberListNotifierProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$publisherMemberListNotifierHash, + dependencies: PublisherMemberListNotifierFamily._dependencies, + allTransitiveDependencies: + PublisherMemberListNotifierFamily._allTransitiveDependencies, + uname: uname, + ); + + PublisherMemberListNotifierProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.uname, + }) : super.internal(); + + final String uname; + + @override + FutureOr> runNotifierBuild( + covariant PublisherMemberListNotifier notifier, + ) { + return notifier.build(uname); + } + + @override + Override overrideWith(PublisherMemberListNotifier Function() create) { + return ProviderOverride( + origin: this, + override: PublisherMemberListNotifierProvider._internal( + () => create()..uname = uname, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + uname: uname, + ), + ); + } + + @override + AutoDisposeAsyncNotifierProviderElement< + PublisherMemberListNotifier, + CursorPagingData + > + createElement() { + return _PublisherMemberListNotifierProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is PublisherMemberListNotifierProvider && other.uname == uname; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, uname.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin PublisherMemberListNotifierRef + on + AutoDisposeAsyncNotifierProviderRef< + CursorPagingData + > { + /// The parameter `uname` of this provider. + String get uname; +} + +class _PublisherMemberListNotifierProviderElement + extends + AutoDisposeAsyncNotifierProviderElement< + PublisherMemberListNotifier, + CursorPagingData + > + with PublisherMemberListNotifierRef { + _PublisherMemberListNotifierProviderElement(super.provider); + + @override + String get uname => (origin as PublisherMemberListNotifierProvider).uname; +} + // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/screens/creators/publishers.dart b/lib/screens/creators/publishers.dart index 1a579fe..fd994cf 100644 --- a/lib/screens/creators/publishers.dart +++ b/lib/screens/creators/publishers.dart @@ -8,7 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:island/models/file.dart'; -import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/models/realm.dart'; import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart index a4b8d54..08e3865 100644 --- a/lib/screens/explore.dart +++ b/lib/screens/explore.dart @@ -6,6 +6,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/activity.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/models/realm.dart'; import 'package:island/pods/userinfo.dart'; import 'package:island/services/responsive.dart'; diff --git a/lib/screens/posts/pub_profile.dart b/lib/screens/posts/pub_profile.dart index 9c79b0a..adcfd52 100644 --- a/lib/screens/posts/pub_profile.dart +++ b/lib/screens/posts/pub_profile.dart @@ -6,6 +6,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/models/user.dart'; import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; diff --git a/lib/screens/posts/pub_profile.g.dart b/lib/screens/posts/pub_profile.g.dart index 78dfe1c..ca0d5d7 100644 --- a/lib/screens/posts/pub_profile.g.dart +++ b/lib/screens/posts/pub_profile.g.dart @@ -400,7 +400,7 @@ class _PublisherSubscriptionStatusProviderElement } String _$publisherAppbarForcegroundColorHash() => - r'3ff2eebb48d3f3af1907052f471e648f5b14b13c'; + r'd781a806a242aea5c1609ec98c97c52fdd9f7db1'; /// See also [publisherAppbarForcegroundColor]. @ProviderFor(publisherAppbarForcegroundColor) diff --git a/lib/widgets/content/cloud_file_collection.dart b/lib/widgets/content/cloud_file_collection.dart index a3b2ff3..7f14a90 100644 --- a/lib/widgets/content/cloud_file_collection.dart +++ b/lib/widgets/content/cloud_file_collection.dart @@ -125,6 +125,7 @@ class CloudFileList extends HookConsumerWidget { if (!disableZoomIn) { context.pushTransparentRoute( CloudFileZoomIn(item: files[i], heroTag: heroTags[i]), + rootNavigator: true, ); } }, diff --git a/lib/widgets/post/compose_shared.dart b/lib/widgets/post/compose_shared.dart index fb9bc17..bda1982 100644 --- a/lib/widgets/post/compose_shared.dart +++ b/lib/widgets/post/compose_shared.dart @@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:island/models/file.dart'; import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; import 'package:island/services/file.dart'; diff --git a/lib/widgets/post/post_item.dart b/lib/widgets/post/post_item.dart index 8f51861..2a7698a 100644 --- a/lib/widgets/post/post_item.dart +++ b/lib/widgets/post/post_item.dart @@ -362,6 +362,7 @@ class PostItem extends HookConsumerWidget { showModalBottomSheet( context: context, isScrollControlled: true, + useRootNavigator: true, builder: (context) => PostRepliesSheet(post: item), ); } diff --git a/lib/widgets/post/post_quick_reply.dart b/lib/widgets/post/post_quick_reply.dart index f95e76b..0d5ea31 100644 --- a/lib/widgets/post/post_quick_reply.dart +++ b/lib/widgets/post/post_quick_reply.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/creators/publishers.dart'; import 'package:island/widgets/alert.dart'; diff --git a/lib/widgets/publisher/publisher_card.dart b/lib/widgets/publisher/publisher_card.dart index d77f368..7152a9b 100644 --- a/lib/widgets/publisher/publisher_card.dart +++ b/lib/widgets/publisher/publisher_card.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:island/models/post.dart'; +import 'package:island/models/publisher.dart'; import 'package:island/widgets/content/cloud_files.dart'; class PublisherCard extends ConsumerWidget {