Subscriptions

This commit is contained in:
LittleSheep 2025-05-14 01:38:47 +08:00
parent 70f58259de
commit 661d07716b
8 changed files with 653 additions and 9 deletions

View File

@ -78,6 +78,18 @@ abstract class SnPublisherStats with _$SnPublisherStats {
_$SnPublisherStatsFromJson(json); _$SnPublisherStatsFromJson(json);
} }
@freezed
abstract class SnSubscriptionStatus with _$SnSubscriptionStatus {
const factory SnSubscriptionStatus({
required bool isSubscribed,
required int publisherId,
required String publisherName,
}) = _SnSubscriptionStatus;
factory SnSubscriptionStatus.fromJson(Map<String, dynamic> json) =>
_$SnSubscriptionStatusFromJson(json);
}
@freezed @freezed
abstract class ReactInfo with _$ReactInfo { abstract class ReactInfo with _$ReactInfo {
const factory ReactInfo({required String icon, required int attitude}) = const factory ReactInfo({required String icon, required int attitude}) =

View File

@ -654,6 +654,145 @@ as int,
} }
}
/// @nodoc
mixin _$SnSubscriptionStatus {
bool get isSubscribed; int get publisherId; String get publisherName;
/// Create a copy of SnSubscriptionStatus
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SnSubscriptionStatusCopyWith<SnSubscriptionStatus> get copyWith => _$SnSubscriptionStatusCopyWithImpl<SnSubscriptionStatus>(this as SnSubscriptionStatus, _$identity);
/// Serializes this SnSubscriptionStatus to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SnSubscriptionStatus&&(identical(other.isSubscribed, isSubscribed) || other.isSubscribed == isSubscribed)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisherName, publisherName) || other.publisherName == publisherName));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isSubscribed,publisherId,publisherName);
@override
String toString() {
return 'SnSubscriptionStatus(isSubscribed: $isSubscribed, publisherId: $publisherId, publisherName: $publisherName)';
}
}
/// @nodoc
abstract mixin class $SnSubscriptionStatusCopyWith<$Res> {
factory $SnSubscriptionStatusCopyWith(SnSubscriptionStatus value, $Res Function(SnSubscriptionStatus) _then) = _$SnSubscriptionStatusCopyWithImpl;
@useResult
$Res call({
bool isSubscribed, int publisherId, String publisherName
});
}
/// @nodoc
class _$SnSubscriptionStatusCopyWithImpl<$Res>
implements $SnSubscriptionStatusCopyWith<$Res> {
_$SnSubscriptionStatusCopyWithImpl(this._self, this._then);
final SnSubscriptionStatus _self;
final $Res Function(SnSubscriptionStatus) _then;
/// Create a copy of SnSubscriptionStatus
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? isSubscribed = null,Object? publisherId = null,Object? publisherName = null,}) {
return _then(_self.copyWith(
isSubscribed: null == isSubscribed ? _self.isSubscribed : isSubscribed // ignore: cast_nullable_to_non_nullable
as bool,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable
as int,publisherName: null == publisherName ? _self.publisherName : publisherName // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
@JsonSerializable()
class _SnSubscriptionStatus implements SnSubscriptionStatus {
const _SnSubscriptionStatus({required this.isSubscribed, required this.publisherId, required this.publisherName});
factory _SnSubscriptionStatus.fromJson(Map<String, dynamic> json) => _$SnSubscriptionStatusFromJson(json);
@override final bool isSubscribed;
@override final int publisherId;
@override final String publisherName;
/// Create a copy of SnSubscriptionStatus
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SnSubscriptionStatusCopyWith<_SnSubscriptionStatus> get copyWith => __$SnSubscriptionStatusCopyWithImpl<_SnSubscriptionStatus>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$SnSubscriptionStatusToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnSubscriptionStatus&&(identical(other.isSubscribed, isSubscribed) || other.isSubscribed == isSubscribed)&&(identical(other.publisherId, publisherId) || other.publisherId == publisherId)&&(identical(other.publisherName, publisherName) || other.publisherName == publisherName));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isSubscribed,publisherId,publisherName);
@override
String toString() {
return 'SnSubscriptionStatus(isSubscribed: $isSubscribed, publisherId: $publisherId, publisherName: $publisherName)';
}
}
/// @nodoc
abstract mixin class _$SnSubscriptionStatusCopyWith<$Res> implements $SnSubscriptionStatusCopyWith<$Res> {
factory _$SnSubscriptionStatusCopyWith(_SnSubscriptionStatus value, $Res Function(_SnSubscriptionStatus) _then) = __$SnSubscriptionStatusCopyWithImpl;
@override @useResult
$Res call({
bool isSubscribed, int publisherId, String publisherName
});
}
/// @nodoc
class __$SnSubscriptionStatusCopyWithImpl<$Res>
implements _$SnSubscriptionStatusCopyWith<$Res> {
__$SnSubscriptionStatusCopyWithImpl(this._self, this._then);
final _SnSubscriptionStatus _self;
final $Res Function(_SnSubscriptionStatus) _then;
/// Create a copy of SnSubscriptionStatus
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? isSubscribed = null,Object? publisherId = null,Object? publisherName = null,}) {
return _then(_SnSubscriptionStatus(
isSubscribed: null == isSubscribed ? _self.isSubscribed : isSubscribed // ignore: cast_nullable_to_non_nullable
as bool,publisherId: null == publisherId ? _self.publisherId : publisherId // ignore: cast_nullable_to_non_nullable
as int,publisherName: null == publisherName ? _self.publisherName : publisherName // ignore: cast_nullable_to_non_nullable
as String,
));
}
} }
/// @nodoc /// @nodoc

View File

@ -144,3 +144,19 @@ Map<String, dynamic> _$SnPublisherStatsToJson(_SnPublisherStats instance) =>
'upvote_received': instance.upvoteReceived, 'upvote_received': instance.upvoteReceived,
'downvote_received': instance.downvoteReceived, 'downvote_received': instance.downvoteReceived,
}; };
_SnSubscriptionStatus _$SnSubscriptionStatusFromJson(
Map<String, dynamic> json,
) => _SnSubscriptionStatus(
isSubscribed: json['is_subscribed'] as bool,
publisherId: (json['publisher_id'] as num).toInt(),
publisherName: json['publisher_name'] as String,
);
Map<String, dynamic> _$SnSubscriptionStatusToJson(
_SnSubscriptionStatus instance,
) => <String, dynamic>{
'is_subscribed': instance.isSubscribed,
'publisher_id': instance.publisherId,
'publisher_name': instance.publisherName,
};

View File

@ -21,6 +21,15 @@ Future<SnAccount> account(Ref ref, String uname) async {
return SnAccount.fromJson(resp.data); return SnAccount.fromJson(resp.data);
} }
@riverpod
Future<List<SnAccountBadge>> accountBadges(Ref ref, String uname) async {
final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.get("/accounts/$uname/badges");
return List<SnAccountBadge>.from(
resp.data.map((x) => SnAccountBadge.fromJson(x)),
);
}
@RoutePage() @RoutePage()
class AccountProfileScreen extends HookConsumerWidget { class AccountProfileScreen extends HookConsumerWidget {
final String name; final String name;

View File

@ -145,5 +145,127 @@ class _AccountProviderElement
String get uname => (origin as AccountProvider).uname; String get uname => (origin as AccountProvider).uname;
} }
String _$accountBadgesHash() => r'4bfe5fb0d6ac0d4cde4563460bde289289188f6d';
/// See also [accountBadges].
@ProviderFor(accountBadges)
const accountBadgesProvider = AccountBadgesFamily();
/// See also [accountBadges].
class AccountBadgesFamily extends Family<AsyncValue<List<SnAccountBadge>>> {
/// See also [accountBadges].
const AccountBadgesFamily();
/// See also [accountBadges].
AccountBadgesProvider call(String uname) {
return AccountBadgesProvider(uname);
}
@override
AccountBadgesProvider getProviderOverride(
covariant AccountBadgesProvider provider,
) {
return call(provider.uname);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'accountBadgesProvider';
}
/// See also [accountBadges].
class AccountBadgesProvider
extends AutoDisposeFutureProvider<List<SnAccountBadge>> {
/// See also [accountBadges].
AccountBadgesProvider(String uname)
: this._internal(
(ref) => accountBadges(ref as AccountBadgesRef, uname),
from: accountBadgesProvider,
name: r'accountBadgesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$accountBadgesHash,
dependencies: AccountBadgesFamily._dependencies,
allTransitiveDependencies:
AccountBadgesFamily._allTransitiveDependencies,
uname: uname,
);
AccountBadgesProvider._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<List<SnAccountBadge>> Function(AccountBadgesRef provider) create,
) {
return ProviderOverride(
origin: this,
override: AccountBadgesProvider._internal(
(ref) => create(ref as AccountBadgesRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
uname: uname,
),
);
}
@override
AutoDisposeFutureProviderElement<List<SnAccountBadge>> createElement() {
return _AccountBadgesProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is AccountBadgesProvider && 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 AccountBadgesRef on AutoDisposeFutureProviderRef<List<SnAccountBadge>> {
/// The parameter `uname` of this provider.
String get uname;
}
class _AccountBadgesProviderElement
extends AutoDisposeFutureProviderElement<List<SnAccountBadge>>
with AccountBadgesRef {
_AccountBadgesProviderElement(super.provider);
@override
String get uname => (origin as AccountBadgesProvider).uname;
}
// ignore_for_file: type=lint // 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 // 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

View File

@ -1,11 +1,16 @@
import 'package:auto_route/annotations.dart'; import 'package:auto_route/annotations.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post.dart'; import 'package:island/models/post.dart';
import 'package:island/models/user.dart';
import 'package:island/pods/network.dart'; import 'package:island/pods/network.dart';
import 'package:island/widgets/account/badge.dart';
import 'package:island/widgets/account/status.dart'; import 'package:island/widgets/account/status.dart';
import 'package:island/widgets/alert.dart';
import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/app_scaffold.dart';
import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/post/post_list.dart'; import 'package:island/widgets/post/post_list.dart';
@ -21,6 +26,27 @@ Future<SnPublisher> publisher(Ref ref, String uname) async {
return SnPublisher.fromJson(resp.data); return SnPublisher.fromJson(resp.data);
} }
@riverpod
Future<List<SnAccountBadge>> publisherBadges(Ref ref, String pubName) async {
final pub = await ref.watch(publisherProvider(pubName).future);
if (pub.publisherType != 0) return [];
final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.get("/accounts/${pub.name}/badges");
return List<SnAccountBadge>.from(
resp.data.map((x) => SnAccountBadge.fromJson(x)),
);
}
@riverpod
Future<SnSubscriptionStatus> publisherSubscriptionStatus(
Ref ref,
String pubName,
) async {
final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.get("/publishers/$pubName/subscription");
return SnSubscriptionStatus.fromJson(resp.data);
}
@RoutePage() @RoutePage()
class PublisherProfileScreen extends HookConsumerWidget { class PublisherProfileScreen extends HookConsumerWidget {
final String name; final String name;
@ -32,6 +58,38 @@ class PublisherProfileScreen extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final publisher = ref.watch(publisherProvider(name)); final publisher = ref.watch(publisherProvider(name));
final badges = ref.watch(publisherBadgesProvider(name));
final subStatus = ref.watch(publisherSubscriptionStatusProvider(name));
final subscribing = useState(false);
Future<void> subscribe() async {
final apiClient = ref.watch(apiClientProvider);
subscribing.value = true;
try {
await apiClient.post("/publishers/$name/subscribe", data: {'tier': 0});
ref.invalidate(publisherSubscriptionStatusProvider(name));
HapticFeedback.heavyImpact();
} catch (err) {
showErrorAlert(err);
} finally {
subscribing.value = false;
}
}
Future<void> unsubscribe() async {
final apiClient = ref.watch(apiClientProvider);
subscribing.value = true;
try {
await apiClient.post("/publishers/$name/unsubscribe");
ref.invalidate(publisherSubscriptionStatusProvider(name));
HapticFeedback.heavyImpact();
} catch (err) {
showErrorAlert(err);
} finally {
subscribing.value = false;
}
}
final iconShadow = Shadow( final iconShadow = Shadow(
color: Colors.black54, color: Colors.black54,
@ -64,6 +122,41 @@ class PublisherProfileScreen extends HookConsumerWidget {
), ),
), ),
), ),
actions: [
subStatus.when(
data:
(status) => IconButton(
onPressed:
subscribing.value
? null
: (status.isSubscribed
? unsubscribe
: subscribe),
icon: Icon(
status.isSubscribed
? Icons.remove_circle
: Icons.add_circle,
shadows: [iconShadow],
),
),
error: (_, __) => const SizedBox(),
loading:
() => const SizedBox(
width: 48,
height: 48,
child: Center(
child: SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(
strokeWidth: 2,
),
),
),
),
),
const Gap(8),
],
), ),
SliverToBoxAdapter( SliverToBoxAdapter(
child: Row( child: Row(
@ -95,14 +188,14 @@ class PublisherProfileScreen extends HookConsumerWidget {
], ],
).padding(horizontal: 24, top: 24, bottom: 24), ).padding(horizontal: 24, top: 24, bottom: 24),
), ),
// if (data.badges.isNotEmpty) if (badges.value?.isNotEmpty ?? false)
// SliverToBoxAdapter( SliverToBoxAdapter(
// child: BadgeList( child: BadgeList(
// badges: data.badges, badges: badges.value!,
// ).padding(horizontal: 24, bottom: 24), ).padding(horizontal: 24, bottom: 24),
// ) )
// else else
// const Gap(16), const SliverGap(16),
SliverToBoxAdapter(child: const Divider(height: 1)), SliverToBoxAdapter(child: const Divider(height: 1)),
if (data.bio.isNotEmpty) if (data.bio.isNotEmpty)
SliverToBoxAdapter( SliverToBoxAdapter(

View File

@ -145,5 +145,259 @@ class _PublisherProviderElement
String get uname => (origin as PublisherProvider).uname; String get uname => (origin as PublisherProvider).uname;
} }
String _$publisherBadgesHash() => r'69a5bbc9e1528da65ae8b1e5e6c4f57c3dcf4071';
/// See also [publisherBadges].
@ProviderFor(publisherBadges)
const publisherBadgesProvider = PublisherBadgesFamily();
/// See also [publisherBadges].
class PublisherBadgesFamily extends Family<AsyncValue<List<SnAccountBadge>>> {
/// See also [publisherBadges].
const PublisherBadgesFamily();
/// See also [publisherBadges].
PublisherBadgesProvider call(String pubName) {
return PublisherBadgesProvider(pubName);
}
@override
PublisherBadgesProvider getProviderOverride(
covariant PublisherBadgesProvider provider,
) {
return call(provider.pubName);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'publisherBadgesProvider';
}
/// See also [publisherBadges].
class PublisherBadgesProvider
extends AutoDisposeFutureProvider<List<SnAccountBadge>> {
/// See also [publisherBadges].
PublisherBadgesProvider(String pubName)
: this._internal(
(ref) => publisherBadges(ref as PublisherBadgesRef, pubName),
from: publisherBadgesProvider,
name: r'publisherBadgesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$publisherBadgesHash,
dependencies: PublisherBadgesFamily._dependencies,
allTransitiveDependencies:
PublisherBadgesFamily._allTransitiveDependencies,
pubName: pubName,
);
PublisherBadgesProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.pubName,
}) : super.internal();
final String pubName;
@override
Override overrideWith(
FutureOr<List<SnAccountBadge>> Function(PublisherBadgesRef provider) create,
) {
return ProviderOverride(
origin: this,
override: PublisherBadgesProvider._internal(
(ref) => create(ref as PublisherBadgesRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
pubName: pubName,
),
);
}
@override
AutoDisposeFutureProviderElement<List<SnAccountBadge>> createElement() {
return _PublisherBadgesProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is PublisherBadgesProvider && other.pubName == pubName;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, pubName.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin PublisherBadgesRef on AutoDisposeFutureProviderRef<List<SnAccountBadge>> {
/// The parameter `pubName` of this provider.
String get pubName;
}
class _PublisherBadgesProviderElement
extends AutoDisposeFutureProviderElement<List<SnAccountBadge>>
with PublisherBadgesRef {
_PublisherBadgesProviderElement(super.provider);
@override
String get pubName => (origin as PublisherBadgesProvider).pubName;
}
String _$publisherSubscriptionStatusHash() =>
r'4eb6741c40775c814e71b6a98b8f1e2d84bf7e30';
/// See also [publisherSubscriptionStatus].
@ProviderFor(publisherSubscriptionStatus)
const publisherSubscriptionStatusProvider = PublisherSubscriptionStatusFamily();
/// See also [publisherSubscriptionStatus].
class PublisherSubscriptionStatusFamily
extends Family<AsyncValue<SnSubscriptionStatus>> {
/// See also [publisherSubscriptionStatus].
const PublisherSubscriptionStatusFamily();
/// See also [publisherSubscriptionStatus].
PublisherSubscriptionStatusProvider call(String pubName) {
return PublisherSubscriptionStatusProvider(pubName);
}
@override
PublisherSubscriptionStatusProvider getProviderOverride(
covariant PublisherSubscriptionStatusProvider provider,
) {
return call(provider.pubName);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'publisherSubscriptionStatusProvider';
}
/// See also [publisherSubscriptionStatus].
class PublisherSubscriptionStatusProvider
extends AutoDisposeFutureProvider<SnSubscriptionStatus> {
/// See also [publisherSubscriptionStatus].
PublisherSubscriptionStatusProvider(String pubName)
: this._internal(
(ref) => publisherSubscriptionStatus(
ref as PublisherSubscriptionStatusRef,
pubName,
),
from: publisherSubscriptionStatusProvider,
name: r'publisherSubscriptionStatusProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$publisherSubscriptionStatusHash,
dependencies: PublisherSubscriptionStatusFamily._dependencies,
allTransitiveDependencies:
PublisherSubscriptionStatusFamily._allTransitiveDependencies,
pubName: pubName,
);
PublisherSubscriptionStatusProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.pubName,
}) : super.internal();
final String pubName;
@override
Override overrideWith(
FutureOr<SnSubscriptionStatus> Function(
PublisherSubscriptionStatusRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
override: PublisherSubscriptionStatusProvider._internal(
(ref) => create(ref as PublisherSubscriptionStatusRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
pubName: pubName,
),
);
}
@override
AutoDisposeFutureProviderElement<SnSubscriptionStatus> createElement() {
return _PublisherSubscriptionStatusProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is PublisherSubscriptionStatusProvider &&
other.pubName == pubName;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, pubName.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin PublisherSubscriptionStatusRef
on AutoDisposeFutureProviderRef<SnSubscriptionStatus> {
/// The parameter `pubName` of this provider.
String get pubName;
}
class _PublisherSubscriptionStatusProviderElement
extends AutoDisposeFutureProviderElement<SnSubscriptionStatus>
with PublisherSubscriptionStatusRef {
_PublisherSubscriptionStatusProviderElement(super.provider);
@override
String get pubName => (origin as PublisherSubscriptionStatusProvider).pubName;
}
// ignore_for_file: type=lint // 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 // 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

View File

@ -4,7 +4,6 @@ import 'package:dio/dio.dart';
import 'package:island/models/post.dart'; import 'package:island/models/post.dart';
import 'package:island/pods/network.dart'; import 'package:island/pods/network.dart';
import 'package:island/widgets/post/post_item.dart'; import 'package:island/widgets/post/post_item.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:very_good_infinite_list/very_good_infinite_list.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart';
// State class to hold posts and pagination info // State class to hold posts and pagination info