diff --git a/lib/community/bloc/community_bloc_old.dart b/lib/community/bloc/community_bloc_old.dart deleted file mode 100644 index 2a5d23e1e..000000000 --- a/lib/community/bloc/community_bloc_old.dart +++ /dev/null @@ -1,495 +0,0 @@ -import 'dart:math'; - -import 'package:bloc/bloc.dart'; -import 'package:equatable/equatable.dart'; -import 'package:bloc_concurrency/bloc_concurrency.dart'; -import 'package:lemmy_api_client/v3.dart'; - -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:stream_transform/stream_transform.dart'; - -import 'package:thunder/account/models/account.dart'; -import 'package:thunder/core/auth/helpers/fetch_account.dart'; -import 'package:thunder/core/enums/local_settings.dart'; -import 'package:thunder/core/models/post_view_media.dart'; -import 'package:thunder/core/singletons/lemmy_client.dart'; -import 'package:thunder/core/singletons/preferences.dart'; -import 'package:thunder/utils/constants.dart'; -import 'package:thunder/utils/error_messages.dart'; -import 'package:thunder/utils/global_context.dart'; -import 'package:thunder/post/utils/post.dart'; - -part 'community_event_old.dart'; -part 'community_state_old.dart'; - -const throttleDuration = Duration(milliseconds: 300); -const timeout = Duration(seconds: 5); - -EventTransformer throttleDroppable(Duration duration) { - return (events, mapper) => droppable().call(events.throttle(duration), mapper); -} - -class CommunityBloc extends Bloc { - CommunityBloc() : super(const CommunityState()) { - on( - _getCommunityPostsEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _markPostAsReadEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _votePostEvent, - transformer: throttleDroppable(Duration.zero), // Don't give a throttle on vote - ); - on( - _savePostEvent, - transformer: throttleDroppable(Duration.zero), // Don't give a throttle on save - ); - on( - _forceRefreshEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _changeCommunitySubsciptionStatusEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _createPostEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _updatePostEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _blockCommunityEvent, - transformer: throttleDroppable(throttleDuration), - ); - on( - _dismissReadEvent, - transformer: throttleDroppable(Duration.zero), // Don't give a throttle on dismiss read - ); - } - - Future _updatePostEvent(UpdatePostEvent event, Emitter emit) async { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType)); - - List updatedPostViews = state.postViews!.map((communityPostView) { - if (communityPostView.postView.post.id == event.postViewMedia.postView.post.id) { - return event.postViewMedia; - } else { - return communityPostView; - } - }).toList(); - - emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType, postViews: updatedPostViews)); - } - - Future _forceRefreshEvent(ForceRefreshEvent event, Emitter emit) async { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType)); - emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType)); - } - - Future _markPostAsReadEvent(MarkPostAsReadEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType)); - - bool success = await markPostAsRead(event.postId, event.read); - - // Find the specific post to update - int existingPostViewIndex = state.postViews!.indexWhere((postViewMedia) => postViewMedia.postView.post.id == event.postId); - if (success) state.postViews![existingPostViewIndex].postView = state.postViews![existingPostViewIndex].postView.copyWith(read: event.read); - - return emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType)); - } catch (e) { - return emit(state.copyWith( - status: CommunityStatus.failure, - errorMessage: e.toString(), - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - )); - } - } - - Future _votePostEvent(VotePostEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType)); - - // Optimistically update the post - int existingPostViewIndex = state.postViews!.indexWhere((postViewMedia) => postViewMedia.postView.post.id == event.postId); - PostViewMedia postViewMedia = state.postViews![existingPostViewIndex]; - - PostView originalPostView = state.postViews![existingPostViewIndex].postView; - - PostView updatedPostView = optimisticallyVotePost(postViewMedia, event.score); - state.postViews![existingPostViewIndex].postView = updatedPostView; - - // Immediately set the status, and continue - emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType)); - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType)); - - PostView postView = await votePost(event.postId, event.score).timeout(timeout, onTimeout: () { - state.postViews![existingPostViewIndex].postView = originalPostView; - throw Exception('Error: Timeout when attempting to vote post'); - }); - - // Find the specific post to update - state.postViews![existingPostViewIndex].postView = postView; - - return emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType)); - } catch (e) { - return emit(state.copyWith( - status: CommunityStatus.failure, - errorMessage: e.toString(), - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - )); - } - } - - Future _savePostEvent(SavePostEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType, communityName: state.communityName)); - - PostView postView = await savePost(event.postId, event.save); - - // Find the specific post to update - int existingPostViewIndex = state.postViews!.indexWhere((postViewMedia) => postViewMedia.postView.post.id == event.postId); - state.postViews![existingPostViewIndex].postView = postView; - - return emit(state.copyWith(status: CommunityStatus.success, communityId: state.communityId, listingType: state.listingType, communityName: state.communityName)); - } catch (e) { - return emit(state.copyWith( - status: CommunityStatus.failure, - errorMessage: e.toString(), - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - )); - } - } - - Future _getCommunityPostsEvent(GetCommunityPostsEvent event, Emitter emit) async { - int limit = 10; - - SharedPreferences prefs = (await UserPreferences.instance).sharedPreferences; - - ListingType defaultListingType; - SortType defaultSortType; - bool tabletMode; - - try { - defaultListingType = ListingType.values.byName(prefs.getString(LocalSettings.defaultFeedListingType.name) ?? DEFAULT_LISTING_TYPE.name); - defaultSortType = SortType.values.byName(prefs.getString(LocalSettings.defaultFeedSortType.name) ?? DEFAULT_SORT_TYPE.name); - tabletMode = prefs.getBool(LocalSettings.useTabletMode.name) ?? false; - } catch (e) { - defaultListingType = ListingType.values.byName(DEFAULT_LISTING_TYPE.name); - defaultSortType = SortType.values.byName(DEFAULT_SORT_TYPE.name); - tabletMode = false; - } - - try { - Account? account = await fetchActiveProfileAccount(); - - LemmyApiV3 lemmy = LemmyClient.instance.lemmyApiV3; - - if (event.reset) { - emit(state.copyWith(status: CommunityStatus.loading)); - - int? communityId = event.communityId; - String? communityName = event.communityName; - ListingType? listingType = (communityId != null || communityName != null) ? null : (event.listingType ?? defaultListingType); - SortType sortType = event.sortType ?? (state.sortType ?? defaultSortType); - - // Fetch community's information - SubscribedType? subscribedType; - GetCommunityResponse? getCommunityResponse; - - if (communityId != null || communityName != null) { - getCommunityResponse = await lemmy.run(GetCommunity( - auth: account?.jwt, - id: communityId, - name: event.communityName, - )); - - subscribedType = getCommunityResponse?.communityView.subscribed; - } - - // Fetch community's posts - List posts = []; - Set postIds = {}; - int currentPage = 1; - - do { - GetPostsResponse getPostsResponse = await lemmy.run(GetPosts( - auth: account?.jwt, - page: currentPage, - limit: limit, - sort: sortType, - type: listingType, - communityId: communityId ?? getCommunityResponse?.communityView.community.id, - communityName: event.communityName, - )); - - currentPage++; - - // Parse the posts and add in media information which is used elsewhere in the app - List formattedPosts = await parsePostViews(getPostsResponse.posts); - posts.addAll(formattedPosts); - - for (PostViewMedia post in formattedPosts) { - postIds.add(post.postView.post.id); - } - - // Fetch any taglines from the instance - GetSiteResponse getSiteResponse = await lemmy.run(GetSite(auth: account?.jwt)); - - emit( - state.copyWith( - status: CommunityStatus.success, - page: tabletMode ? currentPage + 1 : currentPage, - postViews: posts, - postIds: postIds, - listingType: listingType, - communityId: communityId, - communityName: event.communityName, - hasReachedEnd: getPostsResponse.posts.isEmpty || getPostsResponse.posts.length < limit, - subscribedType: subscribedType, - sortType: sortType, - communityInfo: getCommunityResponse?.communityView, - tagline: getSiteResponse.taglines.isEmpty ? '' : getSiteResponse.taglines[Random().nextInt(getSiteResponse.taglines.length)].content, - ), - ); - } while (tabletMode && posts.length < limit && currentPage <= 2); // Fetch two batches - - return; - } else { - if (state.hasReachedEnd) { - // Stop extra requests if we've reached the end - emit(state.copyWith(status: CommunityStatus.success, listingType: state.listingType, communityId: state.communityId, communityName: state.communityName)); - return; - } - - emit(state.copyWith(status: CommunityStatus.refreshing, listingType: state.listingType, communityId: state.communityId, communityName: state.communityName)); - - int? communityId = event.communityId ?? state.communityId; - ListingType? listingType = (communityId != null) ? null : (event.listingType ?? state.listingType); - SortType sortType = event.sortType ?? (state.sortType ?? defaultSortType); - - // Fetch more posts from the community - List posts = List.from(state.postViews ?? []); - int currentPage = state.page; - - do { - GetPostsResponse getPostsResponse = await lemmy.run(GetPosts( - auth: account?.jwt, - page: currentPage, - limit: limit, - sort: sortType, - type: state.listingType, - communityId: state.communityId, - communityName: state.communityName, - )); - - currentPage++; - - // Parse the posts, and append them to the existing list - List postMedias = await parsePostViews(getPostsResponse.posts); - - Set postIds = Set.from(state.postIds ?? {}); - - // Ensure we don't add existing posts to view - for (PostViewMedia postMedia in postMedias) { - int id = postMedia.postView.post.id; - if (!postIds.contains(id)) { - postIds.add(id); - posts.add(postMedia); - } - } - - emit( - state.copyWith( - status: CommunityStatus.success, - page: tabletMode ? currentPage + 1 : currentPage, - postViews: posts, - postIds: postIds, - communityId: communityId, - communityName: state.communityName, - listingType: listingType, - hasReachedEnd: postMedias.isEmpty || state.postIds!.length == postIds.length, - subscribedType: state.subscribedType, - sortType: sortType, - ), - ); - } while (tabletMode && posts.length < limit && currentPage <= state.page + 2); // Fetch two batches - - return; - } - } catch (e) { - emit(state.copyWith(status: CommunityStatus.failureLoadingPosts, errorMessage: e.toString(), listingType: state.listingType, communityId: state.communityId, communityName: state.communityName)); - } - } - - Future _changeCommunitySubsciptionStatusEvent(ChangeCommunitySubsciptionStatusEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType, communityName: state.communityName)); - - Account? account = await fetchActiveProfileAccount(); - LemmyApiV3 lemmy = LemmyClient.instance.lemmyApiV3; - - if (account?.jwt == null) return; - - CommunityResponse communityResponse = await lemmy.run(FollowCommunity( - auth: account!.jwt!, - communityId: event.communityId, - follow: event.follow, - )); - - emit(state.copyWith( - status: CommunityStatus.success, - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - subscribedType: communityResponse.communityView.subscribed, - )); - - await Future.delayed(const Duration(seconds: 1)); - - // Update the community details again in case the subscribed type changed - final fullCommunityView = await lemmy.run(GetCommunity( - auth: account.jwt, - id: event.communityId, - name: state.communityName, - )); - - return emit(state.copyWith( - status: CommunityStatus.success, - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - subscribedType: fullCommunityView.communityView.subscribed, - )); - } catch (e) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: e.toString(), - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - } - - Future _createPostEvent(CreatePostEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType, communityName: state.communityName)); - - Account? account = await fetchActiveProfileAccount(); - LemmyApiV3 lemmy = LemmyClient.instance.lemmyApiV3; - - if (account?.jwt == null) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: 'You are not logged in. Cannot create a post.', - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - - if (state.communityId == null) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: 'Could not determine community to post to.', - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - - PostResponse postResponse = await lemmy.run(CreatePost(auth: account!.jwt!, communityId: state.communityId!, name: event.name, body: event.body, url: event.url, nsfw: event.nsfw)); - - // Parse the posts, and append them to the existing list - List posts = await parsePostViews([postResponse.postView]); - List postViews = List.from(state.postViews ?? []); - postViews.addAll(posts); - - return emit(state.copyWith( - status: CommunityStatus.success, - postViews: postViews, - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - )); - } catch (e) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: e is LemmyApiException ? getErrorMessage(GlobalContext.context, e.message) : e.toString(), - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - } - - Future _blockCommunityEvent(BlockCommunityEvent event, Emitter emit) async { - try { - emit(state.copyWith(status: CommunityStatus.refreshing, communityId: state.communityId, listingType: state.listingType, communityName: state.communityName)); - - Account? account = await fetchActiveProfileAccount(); - LemmyApiV3 lemmy = LemmyClient.instance.lemmyApiV3; - - if (account?.jwt == null) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: 'You are not logged in. Cannot block community.', - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - - BlockCommunityResponse blockCommunityResponse = await lemmy.run(BlockCommunity( - auth: account!.jwt!, - communityId: event.communityId, - block: event.block, - )); - - return emit(state.copyWith( - status: CommunityStatus.success, - communityId: state.communityId, - listingType: state.listingType, - communityName: state.communityName, - blockedCommunity: blockCommunityResponse.communityView, - )); - } catch (e) { - return emit( - state.copyWith( - status: CommunityStatus.failure, - errorMessage: e.toString(), - communityId: state.communityId, - listingType: state.listingType, - ), - ); - } - } - - Future _dismissReadEvent(DismissReadEvent event, Emitter emit) async { - // Take existing post list, and remove read entries, then emit, I think - - try { - return; - } catch (e) { - emit(state.copyWith(status: CommunityStatus.failure, errorMessage: e.toString())); - } - } -} diff --git a/lib/community/bloc/community_event_old.dart b/lib/community/bloc/community_event_old.dart deleted file mode 100644 index ede7db1b8..000000000 --- a/lib/community/bloc/community_event_old.dart +++ /dev/null @@ -1,74 +0,0 @@ -part of 'community_bloc_old.dart'; - -abstract class CommunityEvent extends Equatable { - const CommunityEvent(); - - @override - List get props => []; -} - -class GetCommunityPostsEvent extends CommunityEvent { - final bool reset; - final SortType? sortType; - final ListingType? listingType; - final int? communityId; - final String? communityName; - - const GetCommunityPostsEvent({this.reset = false, this.sortType, this.listingType, this.communityId, this.communityName}); -} - -class VotePostEvent extends CommunityEvent { - final int postId; - final int score; - - const VotePostEvent({required this.postId, required this.score}); -} - -class SavePostEvent extends CommunityEvent { - final int postId; - final bool save; - - const SavePostEvent({required this.postId, required this.save}); -} - -class ForceRefreshEvent extends CommunityEvent {} - -class ChangeCommunitySubsciptionStatusEvent extends CommunityEvent { - final int communityId; - final bool follow; - - const ChangeCommunitySubsciptionStatusEvent({required this.communityId, required this.follow}); -} - -class CreatePostEvent extends CommunityEvent { - final String name; - final String body; - final String? url; - final bool nsfw; - - const CreatePostEvent({required this.name, required this.body, this.url, this.nsfw = false}); -} - -class MarkPostAsReadEvent extends CommunityEvent { - final int postId; - final bool read; - - const MarkPostAsReadEvent({required this.postId, required this.read}); -} - -class UpdatePostEvent extends CommunityEvent { - final PostViewMedia postViewMedia; - - const UpdatePostEvent({required this.postViewMedia}); -} - -class BlockCommunityEvent extends CommunityEvent { - final int communityId; - final bool block; - - const BlockCommunityEvent({required this.communityId, this.block = false}); -} - -class DismissReadEvent extends CommunityEvent { - const DismissReadEvent(); -} diff --git a/lib/community/bloc/community_state_old.dart b/lib/community/bloc/community_state_old.dart deleted file mode 100644 index 55be880e9..000000000 --- a/lib/community/bloc/community_state_old.dart +++ /dev/null @@ -1,94 +0,0 @@ -part of 'community_bloc_old.dart'; - -enum CommunityStatus { initial, loading, refreshing, success, empty, failure, failureLoadingPosts } - -class CommunityState extends Equatable { - const CommunityState({ - this.status = CommunityStatus.initial, - this.postViews = const [], - this.postIds = const {}, - this.page = 1, - this.errorMessage, - this.listingType = ListingType.local, - this.communityId, - this.hasReachedEnd = false, - this.subscribedType, - this.sortType, - this.communityName, - this.communityInfo, - this.blockedCommunity, - this.tagline = '', - }); - - final CommunityStatus status; - final ListingType? listingType; - final SortType? sortType; - - final int page; - final List? postViews; - final Set? postIds; - - final String? errorMessage; - - // Specifies the community we are loading for - final int? communityId; - final String? communityName; - final CommunityView? communityInfo; - - final bool hasReachedEnd; - final SubscribedType? subscribedType; - - final CommunityView? blockedCommunity; - - final String tagline; - - CommunityState copyWith({ - CommunityStatus? status, - int? page, - List? postViews, - Set? postIds, - String? errorMessage, - ListingType? listingType, - int? communityId, - bool? hasReachedEnd, - SubscribedType? subscribedType, - SortType? sortType, - String? communityName, - CommunityView? communityInfo, - CommunityView? blockedCommunity, - String? tagline, - }) { - return CommunityState( - status: status ?? this.status, - page: page ?? this.page, - postViews: postViews ?? this.postViews, - postIds: postIds ?? this.postIds, - errorMessage: errorMessage ?? this.errorMessage, - listingType: listingType, - communityId: communityId, - communityName: communityName, - hasReachedEnd: hasReachedEnd ?? this.hasReachedEnd, - subscribedType: subscribedType ?? this.subscribedType, - sortType: sortType ?? this.sortType, - communityInfo: communityInfo ?? this.communityInfo, - blockedCommunity: blockedCommunity, - tagline: tagline ?? this.tagline, - ); - } - - @override - List get props => [ - status, - page, - postViews, - errorMessage, - listingType, - communityId, - hasReachedEnd, - subscribedType, - sortType, - communityName, - communityInfo, - blockedCommunity, - ]; -} diff --git a/lib/community/bloc/image_bloc.dart b/lib/community/bloc/image_bloc.dart index 08d60a638..ac4286ccd 100644 --- a/lib/community/bloc/image_bloc.dart +++ b/lib/community/bloc/image_bloc.dart @@ -1,10 +1,20 @@ +import 'package:bloc_concurrency/bloc_concurrency.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:lemmy_api_client/pictrs.dart'; -import 'package:thunder/community/bloc/community_bloc_old.dart'; +import 'package:stream_transform/stream_transform.dart'; + part 'image_state.dart'; part 'image_event.dart'; +const throttleDuration = Duration(milliseconds: 100); + +EventTransformer throttleDroppable(Duration duration) { + return (events, mapper) { + return droppable().call(events.throttle(duration), mapper); + }; +} + class ImageBloc extends Bloc { ImageBloc() : super(const ImageState()) { on( diff --git a/pubspec.lock b/pubspec.lock index 4003ae2ca..fe656aae3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -90,10 +90,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" auto_size_text: dependency: "direct main" description: @@ -146,10 +146,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" buffer: dependency: transitive description: @@ -250,10 +250,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -282,10 +282,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -298,10 +298,10 @@ packages: dependency: "direct main" description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" connectivity_plus: dependency: "direct main" description: @@ -466,10 +466,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: transitive description: @@ -1102,18 +1102,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -1193,10 +1193,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -1209,10 +1209,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -1265,10 +1265,10 @@ packages: dependency: "direct main" description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: "direct main" description: @@ -1627,10 +1627,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" sprintf: dependency: transitive description: @@ -1715,18 +1715,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: "direct main" description: @@ -1739,10 +1739,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" super_sliver_list: dependency: "direct main" description: @@ -1771,18 +1771,18 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" timezone: dependency: transitive description: @@ -1987,10 +1987,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" watcher: dependency: transitive description: @@ -2113,5 +2113,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.27.0"