diff --git a/lib/models/post.dart b/lib/models/post.dart
index ae7fae14..cffe7129 100644
--- a/lib/models/post.dart
+++ b/lib/models/post.dart
@@ -78,6 +78,18 @@ abstract class SnPublisherStats with _$SnPublisherStats {
_$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
abstract class ReactInfo with _$ReactInfo {
const factory ReactInfo({required String icon, required int attitude}) =
diff --git a/lib/models/post.freezed.dart b/lib/models/post.freezed.dart
index 5b59d101..d4e41ff4 100644
--- a/lib/models/post.freezed.dart
+++ b/lib/models/post.freezed.dart
@@ -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
diff --git a/lib/models/post.g.dart b/lib/models/post.g.dart
index 8df7188c..71aafa13 100644
--- a/lib/models/post.g.dart
+++ b/lib/models/post.g.dart
@@ -144,3 +144,19 @@ Map<String, dynamic> _$SnPublisherStatsToJson(_SnPublisherStats instance) =>
'upvote_received': instance.upvoteReceived,
'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,
+};
diff --git a/lib/screens/account/profile.dart b/lib/screens/account/profile.dart
index ffbc99e5..48b6e39b 100644
--- a/lib/screens/account/profile.dart
+++ b/lib/screens/account/profile.dart
@@ -21,6 +21,15 @@ Future<SnAccount> account(Ref ref, String uname) async {
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()
class AccountProfileScreen extends HookConsumerWidget {
final String name;
diff --git a/lib/screens/account/profile.g.dart b/lib/screens/account/profile.g.dart
index 9ba08204..efe824be 100644
--- a/lib/screens/account/profile.g.dart
+++ b/lib/screens/account/profile.g.dart
@@ -145,5 +145,127 @@ class _AccountProviderElement
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: 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/posts/pub_profile.dart b/lib/screens/posts/pub_profile.dart
index cb42b6d2..8786dae6 100644
--- a/lib/screens/posts/pub_profile.dart
+++ b/lib/screens/posts/pub_profile.dart
@@ -1,11 +1,16 @@
import 'package:auto_route/annotations.dart';
import 'package:easy_localization/easy_localization.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:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post.dart';
+import 'package:island/models/user.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/alert.dart';
import 'package:island/widgets/app_scaffold.dart';
import 'package:island/widgets/content/cloud_files.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);
}
+@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()
class PublisherProfileScreen extends HookConsumerWidget {
final String name;
@@ -32,6 +58,38 @@ class PublisherProfileScreen extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
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(
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(
child: Row(
@@ -95,14 +188,14 @@ class PublisherProfileScreen extends HookConsumerWidget {
],
).padding(horizontal: 24, top: 24, bottom: 24),
),
- // if (data.badges.isNotEmpty)
- // SliverToBoxAdapter(
- // child: BadgeList(
- // badges: data.badges,
- // ).padding(horizontal: 24, bottom: 24),
- // )
- // else
- // const Gap(16),
+ if (badges.value?.isNotEmpty ?? false)
+ SliverToBoxAdapter(
+ child: BadgeList(
+ badges: badges.value!,
+ ).padding(horizontal: 24, bottom: 24),
+ )
+ else
+ const SliverGap(16),
SliverToBoxAdapter(child: const Divider(height: 1)),
if (data.bio.isNotEmpty)
SliverToBoxAdapter(
diff --git a/lib/screens/posts/pub_profile.g.dart b/lib/screens/posts/pub_profile.g.dart
index 26eba9da..595e9a8b 100644
--- a/lib/screens/posts/pub_profile.g.dart
+++ b/lib/screens/posts/pub_profile.g.dart
@@ -145,5 +145,259 @@ class _PublisherProviderElement
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: 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/widgets/post/post_list.dart b/lib/widgets/post/post_list.dart
index f2b82960..6f66ad9a 100644
--- a/lib/widgets/post/post_list.dart
+++ b/lib/widgets/post/post_list.dart
@@ -4,7 +4,6 @@ import 'package:dio/dio.dart';
import 'package:island/models/post.dart';
import 'package:island/pods/network.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';
// State class to hold posts and pagination info