diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 404f3890..1dbc233b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,13 +24,9 @@ permissions: jobs: setup: name: Setup - needs: [] timeout-minutes: 5 runs-on: ubuntu-latest - strategy: - fail-fast: false - steps: - name: πŸ“š Git checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -81,7 +77,7 @@ jobs: build: name: Build needs: ["setup"] - timeout-minutes: ${{ (matrix.target == 'web') && 5 || 10 }} + timeout-minutes: ${{ (matrix.target == 'web') && 5 || 20 }} runs-on: ${{ matrix.os }} strategy: @@ -224,6 +220,9 @@ jobs: timeout-minutes: 7 runs-on: ubuntu-latest + permissions: + id-token: write + steps: - name: πŸ“š Git checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -268,9 +267,9 @@ jobs: continue-on-error: true - name: πŸ“Š Upload code coverage if: ${{ !cancelled() }} - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 with: - token: ${{ secrets.CODECOV_TOKEN }} + use_oidc: true files: packages/app/coverage/lcov.info fail_ci_if_error: true verbose: true @@ -299,6 +298,8 @@ jobs: cache: true - name: 🌐 Disable analytics run: flutter --disable-analytics + - name: πŸ“¦ Install dependencies + run: dart pub get --enforce-lockfile - name: ✨ Verify formatting run: dart format . --output=none --set-exit-if-changed @@ -344,7 +345,6 @@ jobs: spell-check: name: Check Spelling - needs: [] runs-on: ubuntu-latest steps: @@ -370,7 +370,6 @@ jobs: link-check: name: Check Links - needs: [] timeout-minutes: 2 runs-on: ubuntu-latest @@ -384,7 +383,6 @@ jobs: markdownlint: name: Lint Markdown - needs: [] timeout-minutes: 4 runs-on: ubuntu-latest @@ -405,3 +403,26 @@ jobs: # Surprisingly, the default is to only lint the project root. globs: | **/*.md + + zizmor: + name: Run zizmor + timeout-minutes: 1 + runs-on: ubuntu-latest + + permissions: + contents: read + security-events: write + actions: read + + steps: + - name: πŸ“š Git Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + submodules: recursive + clean: true + persist-credentials: false + set-safe-directory: true + - name: 🌈 Run zizmor + uses: zizmorcore/zizmor-action@2520132f44b3ed84916048d32e5c7153fc739fe7 # v0.0.3 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/packages/_analysis_options/lib/analysis_options.yaml b/packages/_analysis_options/lib/analysis_options.yaml index 5192876a..1e3aa0e1 100644 --- a/packages/_analysis_options/lib/analysis_options.yaml +++ b/packages/_analysis_options/lib/analysis_options.yaml @@ -53,6 +53,7 @@ linter: prefer_mixin: true unnecessary_null_aware_operator_on_extension_on_nullable: true unreachable_from_main: true + require_trailing_commas: true # Rules with false-positives, not in VGA discarded_futures: true @@ -65,13 +66,16 @@ linter: specify_nonobvious_property_types: true # New/updated rules, not yet in VGA - use_truncating_division: true avoid_futureor_void: true - unnecessary_underscores: true - strict_top_level_inference: true + use_null_aware_elements: true + unnecessary_ignore: true + use_truncating_division: true # Newly (or soon-to-be) deprecated rules, still in VGA unnecessary_await_in_return: false - require_trailing_commas: false + # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +formatter: + trailing_commas: preserve diff --git a/packages/_analysis_options/pubspec.yaml b/packages/_analysis_options/pubspec.yaml index 5457dcd7..c1563993 100644 --- a/packages/_analysis_options/pubspec.yaml +++ b/packages/_analysis_options/pubspec.yaml @@ -7,8 +7,8 @@ issue_tracker: https://github.com/PHS-TSA/nexus/issues repository: https://github.com/PHS-TSA/nexus.git environment: - sdk: ^3.7.0 + sdk: ^3.8.0 resolution: workspace dependencies: - very_good_analysis: ^7.0.0 + very_good_analysis: ^8.0.0-rc.1 diff --git a/packages/app/lib/src/app/app.dart b/packages/app/lib/src/app/app.dart index 625be5e5..4b56c5ec 100644 --- a/packages/app/lib/src/app/app.dart +++ b/packages/app/lib/src/app/app.dart @@ -18,7 +18,9 @@ class App extends ConsumerStatefulWidget with Bootstrap { /// {@macro harvest_hub.app} /// /// Construct a new [App] widget. - const App({super.key}); + const App({ + super.key, + }); @override ConsumerState createState() => _AppState(); @@ -80,7 +82,9 @@ class _AppState extends ConsumerState with RestorationMixin { /// Eagerly initializes providers. class _EagerInitialization extends ConsumerWidget { - const _EagerInitialization({required this.child}); + const _EagerInitialization({ + required this.child, + }); final Widget child; diff --git a/packages/app/lib/src/app/bootstrap.dart b/packages/app/lib/src/app/bootstrap.dart index 1d930dd8..3e503965 100644 --- a/packages/app/lib/src/app/bootstrap.dart +++ b/packages/app/lib/src/app/bootstrap.dart @@ -31,8 +31,10 @@ typedef GetSharedPreferences = }); /// The environment needed to bootstrap the app. -typedef BootstrapEnv = - ({RunApp runApp, GetSharedPreferences getSharedPreferences}); +typedef BootstrapEnv = ({ + RunApp runApp, + GetSharedPreferences getSharedPreferences, +}); /// Turn any widget into a flow-blown app. mixin Bootstrap implements Widget { diff --git a/packages/app/lib/src/app/create_post.dart b/packages/app/lib/src/app/create_post.dart index 6c802eaf..77ab14fd 100644 --- a/packages/app/lib/src/app/create_post.dart +++ b/packages/app/lib/src/app/create_post.dart @@ -29,7 +29,9 @@ class CreatePost extends HookConsumerWidget { /// {@macro harvest_hub.app.create_post} /// /// Construct a new [CreatePost] widget. - const CreatePost({super.key}); + const CreatePost({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -99,10 +101,12 @@ class CreatePost extends HookConsumerWidget { ), ), insetPadding: EdgeInsets.symmetric( - horizontal: - context.sizeClass == MaterialWindowSizeClass.compact ? 0.0 : 64.0, - vertical: - context.sizeClass == MaterialWindowSizeClass.compact ? 0.0 : 48.0, + horizontal: context.sizeClass == MaterialWindowSizeClass.compact + ? 0.0 + : 64.0, + vertical: context.sizeClass == MaterialWindowSizeClass.compact + ? 0.0 + : 48.0, ), child: Padding( padding: EdgeInsets.all( @@ -216,7 +220,10 @@ class CreatePost extends HookConsumerWidget { /// /// Notably, it also allows the user to remove images from the list. class _UploadedImagesView extends HookConsumerWidget { - const _UploadedImagesView({super.key}); + const _UploadedImagesView({ + super.key, + }); + @override Widget build(BuildContext context, WidgetRef ref) { final uploadedImages = ref.watch(uploadedImagesServiceProvider); diff --git a/packages/app/lib/src/app/wrapper.dart b/packages/app/lib/src/app/wrapper.dart index 838488b7..cd26a85e 100644 --- a/packages/app/lib/src/app/wrapper.dart +++ b/packages/app/lib/src/app/wrapper.dart @@ -15,7 +15,10 @@ class Wrapper extends StatelessWidget { /// {@macro harvest_hub.app.wrapper} /// /// Construct a new [Wrapper] widget. - const Wrapper({required this.child, super.key}); + const Wrapper({ + required this.child, + super.key, + }); /// The child widget to display. final Widget child; @@ -80,11 +83,10 @@ class _DesktopWrapper extends StatelessWidget { ], ), // TODO(MattsAttack): Implement rail here, similar to Google article. floatingActionButton: FloatingActionButton( - onPressed: - () async => showDialog( - context: context, - builder: (context) => const CreatePost(), - ), + onPressed: () async => showDialog( + context: context, + builder: (context) => const CreatePost(), + ), child: const Icon(Icons.create), ), // TODO(MattsAttack): Change to form on top of feed for desktop. ); @@ -112,11 +114,10 @@ class _MobileWrapper extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( - onPressed: - () async => showDialog( - context: context, - builder: (context) => const CreatePost(), - ), + onPressed: () async => showDialog( + context: context, + builder: (context) => const CreatePost(), + ), child: const Icon(Icons.create), ), body: child, diff --git a/packages/app/lib/src/app/wrapper_page.dart b/packages/app/lib/src/app/wrapper_page.dart index 97b2d080..4e7c8a40 100644 --- a/packages/app/lib/src/app/wrapper_page.dart +++ b/packages/app/lib/src/app/wrapper_page.dart @@ -16,7 +16,9 @@ class WrapperPage extends ConsumerWidget { /// {@macro harvest_hub.app.wrapper_page} /// /// Construct a new [WrapperPage] widget. - const WrapperPage({super.key}); + const WrapperPage({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/packages/app/lib/src/features/auth/presentation/auth/log_in_page.dart b/packages/app/lib/src/features/auth/presentation/auth/log_in_page.dart index 23687109..3557b04f 100644 --- a/packages/app/lib/src/features/auth/presentation/auth/log_in_page.dart +++ b/packages/app/lib/src/features/auth/presentation/auth/log_in_page.dart @@ -22,7 +22,10 @@ class LogInPage extends HookConsumerWidget { /// {@macro harvest_hub.features.auth.presentation.auth.login_page} /// /// Construct a new [LogInPage] widget. - const LogInPage({super.key, AuthCallback? onResult}) : _onResult = onResult; + const LogInPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; @@ -39,10 +42,13 @@ class LogInPage extends HookConsumerWidget { } class _DesktopLogInPage extends HookConsumerWidget { - const _DesktopLogInPage({super.key, AuthCallback? onResult}) - : _onResult = onResult; + const _DesktopLogInPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; + @override Widget build(BuildContext context, WidgetRef ref) { final formKey = useGlobalKey(); @@ -178,10 +184,13 @@ class _DesktopLogInPage extends HookConsumerWidget { } class _MobileLogInPage extends HookConsumerWidget { - const _MobileLogInPage({super.key, AuthCallback? onResult}) - : _onResult = onResult; + const _MobileLogInPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; + @override Widget build(BuildContext context, WidgetRef ref) { final formKey = useGlobalKey(); @@ -250,10 +259,9 @@ class _MobileLogInPage extends HookConsumerWidget { 'Welcome to Harvest Hub!', style: TextStyle( fontSize: 24, - color: - Theme.of( - context, - ).colorScheme.onPrimaryContainer, + color: Theme.of( + context, + ).colorScheme.onPrimaryContainer, ), textAlign: TextAlign.center, ), diff --git a/packages/app/lib/src/features/auth/presentation/auth/sign_up_page.dart b/packages/app/lib/src/features/auth/presentation/auth/sign_up_page.dart index 5b64ef4d..69a4731b 100644 --- a/packages/app/lib/src/features/auth/presentation/auth/sign_up_page.dart +++ b/packages/app/lib/src/features/auth/presentation/auth/sign_up_page.dart @@ -24,7 +24,10 @@ class SignUpPage extends HookConsumerWidget { /// {@macro harvest_hub.features.auth.presentation.auth.sign_up_page} /// /// Construct a new [SignUpPage] widget. - const SignUpPage({super.key, AuthCallback? onResult}) : _onResult = onResult; + const SignUpPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; @@ -41,10 +44,13 @@ class SignUpPage extends HookConsumerWidget { } class _DesktopSignUpPage extends HookConsumerWidget { - const _DesktopSignUpPage({super.key, AuthCallback? onResult}) - : _onResult = onResult; + const _DesktopSignUpPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; + @override Widget build(BuildContext context, WidgetRef ref) { final formKey = useGlobalKey(); @@ -190,10 +196,13 @@ class _DesktopSignUpPage extends HookConsumerWidget { } class _MobileSignUpPage extends HookConsumerWidget { - const _MobileSignUpPage({super.key, AuthCallback? onResult}) - : _onResult = onResult; + const _MobileSignUpPage({ + super.key, + AuthCallback? onResult, + }) : _onResult = onResult; final AuthCallback? _onResult; + @override Widget build(BuildContext context, WidgetRef ref) { final formKey = useGlobalKey(); @@ -262,10 +271,9 @@ class _MobileSignUpPage extends HookConsumerWidget { 'Welcome to Harvest Hub!', style: TextStyle( fontSize: 24, - color: - Theme.of( - context, - ).colorScheme.onPrimaryContainer, + color: Theme.of( + context, + ).colorScheme.onPrimaryContainer, ), textAlign: TextAlign.center, ), diff --git a/packages/app/lib/src/features/home/application/post_service.dart b/packages/app/lib/src/features/home/application/post_service.dart index dbef25ef..20bcd29d 100644 --- a/packages/app/lib/src/features/home/application/post_service.dart +++ b/packages/app/lib/src/features/home/application/post_service.dart @@ -25,37 +25,35 @@ Future postService(Ref ref, PostId postId) async { if (post == null) return null; - final (avatar, images, commentsAvatars) = - await ( - ref.watch(avatarServiceProvider(post.authorName).future), - Future.wait( - // TODO(MattsAttack): Could we grab all images with a single call? - post.imageIds.map((image) => ref.watch(imageProvider(image).future)), - ), - Future.wait( - post.comments.map( - (comment) => - ref.watch(avatarServiceProvider(comment.authorName).future), - ), - ), - ).wait; + final (avatar, images, commentsAvatars) = await ( + ref.watch(avatarServiceProvider(post.authorName).future), + Future.wait( + // TODO(MattsAttack): Could we grab all images with a single call? + post.imageIds.map((image) => ref.watch(imageProvider(image).future)), + ), + Future.wait( + post.comments.map( + (comment) => + ref.watch(avatarServiceProvider(comment.authorName).future), + ), + ), + ).wait; if (post.comments.length != commentsAvatars.length) { throw Exception('The number of comments and comment avatars do not match.'); } final commentsWithAvatars = post.comments.zip(commentsAvatars); - final comments = - [ - for (final (comment, commentAvatar) in commentsWithAvatars) - CommentEntity( - author: comment.author, - comment: comment.comment, - avatar: commentAvatar, - authorName: comment.authorName, - timestamp: comment.timestamp, - ), - ].lockUnsafe; + final comments = [ + for (final (comment, commentAvatar) in commentsWithAvatars) + CommentEntity( + author: comment.author, + comment: comment.comment, + avatar: commentAvatar, + authorName: comment.authorName, + timestamp: comment.timestamp, + ), + ].lockUnsafe; return PostModelEntity( id: post.id, diff --git a/packages/app/lib/src/features/home/presentation/home/comment.dart b/packages/app/lib/src/features/home/presentation/home/comment.dart index 898fc493..9a543f0e 100644 --- a/packages/app/lib/src/features/home/presentation/home/comment.dart +++ b/packages/app/lib/src/features/home/presentation/home/comment.dart @@ -11,7 +11,10 @@ class Comment extends StatelessWidget { /// {@macro nexus.features.home.presentation.home.comment} /// /// Construct a new [Comment] widget for a [CommentEntity]. - const Comment({required this.comment, super.key}); + const Comment({ + required this.comment, + super.key, + }); /// The [CommentEntity] to display. final CommentEntity comment; @@ -40,11 +43,10 @@ class Comment extends StatelessWidget { ), Timeago( date: comment.timestamp, - builder: - (context, value) => Text( - value, - style: Theme.of(context).textTheme.bodySmall, - ), + builder: (context, value) => Text( + value, + style: Theme.of(context).textTheme.bodySmall, + ), ), ], ), diff --git a/packages/app/lib/src/features/home/presentation/home/create_comment.dart b/packages/app/lib/src/features/home/presentation/home/create_comment.dart index fba5ae78..1a6b5354 100644 --- a/packages/app/lib/src/features/home/presentation/home/create_comment.dart +++ b/packages/app/lib/src/features/home/presentation/home/create_comment.dart @@ -19,7 +19,10 @@ class CreateComment extends HookConsumerWidget { /// {@macro nexus.app.create_comment} /// /// Construct a new [CreateComment] widget. - const CreateComment({required this.post, super.key}); + const CreateComment({ + required this.post, + super.key, + }); /// The post to be updating. final PostModelEntity post; @@ -66,10 +69,12 @@ class CreateComment extends HookConsumerWidget { ), ), insetPadding: EdgeInsets.symmetric( - horizontal: - context.sizeClass == MaterialWindowSizeClass.compact ? 0.0 : 64.0, - vertical: - context.sizeClass == MaterialWindowSizeClass.compact ? 0.0 : 48.0, + horizontal: context.sizeClass == MaterialWindowSizeClass.compact + ? 0.0 + : 64.0, + vertical: context.sizeClass == MaterialWindowSizeClass.compact + ? 0.0 + : 48.0, ), child: Padding( padding: EdgeInsets.all( diff --git a/packages/app/lib/src/features/home/presentation/home/feed.dart b/packages/app/lib/src/features/home/presentation/home/feed.dart index 2b27aa03..6ceb1b4d 100644 --- a/packages/app/lib/src/features/home/presentation/home/feed.dart +++ b/packages/app/lib/src/features/home/presentation/home/feed.dart @@ -21,7 +21,10 @@ class Feed extends ConsumerWidget { /// {@macro harvest_hub.features.home.presentation.home.feed} /// /// Construct a new [Feed] widget. - const Feed({required this.feed, super.key}); + const Feed({ + required this.feed, + super.key, + }); /// The feed to fetch the posts from. final FeedEntity feed; @@ -89,21 +92,20 @@ class Feed extends ConsumerWidget { ), ), - AsyncValue(:final value, hasValue: true) when value != null => - GestureDetector( - onTap: () async { - await context.router.push(PostViewRoute(id: value.id.id)); - }, - child: Card( - margin: const EdgeInsets.all(4), - child: ProviderScope( - overrides: [ - currentPostProvider.overrideWithValue(value), - ], - child: Post(key: ValueKey(value)), - ), + // Intentional, we don’t want to match null. + // ignore: async_value_nullable_pattern + AsyncValue(:final value?, hasValue: true) => GestureDetector( + onTap: () async { + await context.router.push(PostViewRoute(id: value.id.id)); + }, + child: Card( + margin: const EdgeInsets.all(4), + child: ProviderScope( + overrides: [currentPostProvider.overrideWithValue(value)], + child: Post(key: ValueKey(value)), ), ), + ), // If we have none, return a placeholder. AsyncValue(hasValue: true) when index == 0 => const Center( diff --git a/packages/app/lib/src/features/home/presentation/home/feed_routing_page.dart b/packages/app/lib/src/features/home/presentation/home/feed_routing_page.dart index 64f833d6..50fe119d 100644 --- a/packages/app/lib/src/features/home/presentation/home/feed_routing_page.dart +++ b/packages/app/lib/src/features/home/presentation/home/feed_routing_page.dart @@ -15,7 +15,9 @@ class FeedRoutingPage extends ConsumerWidget { /// {@macro harvest_hub.features.home.presentation.home.feed_routing_page} /// /// Construct a new [FeedRoutingPage] widget. - const FeedRoutingPage({super.key}); + const FeedRoutingPage({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/packages/app/lib/src/features/home/presentation/home/local_feed_page.dart b/packages/app/lib/src/features/home/presentation/home/local_feed_page.dart index a141b368..dde2dab2 100644 --- a/packages/app/lib/src/features/home/presentation/home/local_feed_page.dart +++ b/packages/app/lib/src/features/home/presentation/home/local_feed_page.dart @@ -17,7 +17,9 @@ class LocalFeedPage extends ConsumerWidget { /// {@macro harvest_hub.features.home.presentation.home.local_feed_page} /// /// Construct a new [LocalFeedPage] widget. - const LocalFeedPage({super.key}); + const LocalFeedPage({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/packages/app/lib/src/features/home/presentation/home/post.dart b/packages/app/lib/src/features/home/presentation/home/post.dart index 6f2cac4e..8b33dc4b 100644 --- a/packages/app/lib/src/features/home/presentation/home/post.dart +++ b/packages/app/lib/src/features/home/presentation/home/post.dart @@ -17,7 +17,9 @@ class Post extends StatelessWidget { /// {@macro harvest_hub.features.home.presentation.home.post} /// /// Construct a new [Post] widget for a []. - const Post({super.key}); + const Post({ + super.key, + }); @override Widget build(BuildContext context) { @@ -40,7 +42,9 @@ class Post extends StatelessWidget { } class _PosterInfo extends ConsumerWidget { - const _PosterInfo({super.key}); + const _PosterInfo({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -69,11 +73,10 @@ class _PosterInfo extends ConsumerWidget { ), Timeago( date: timestamp, - builder: - (context, value) => Text( - value, - style: Theme.of(context).textTheme.bodySmall, - ), + builder: (context, value) => Text( + value, + style: Theme.of(context).textTheme.bodySmall, + ), ), ], ), @@ -88,7 +91,9 @@ class _PosterInfo extends ConsumerWidget { } class _PostAvatar extends ConsumerWidget { - const _PostAvatar({super.key}); + const _PostAvatar({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -99,7 +104,9 @@ class _PostAvatar extends ConsumerWidget { } class _PostBody extends ConsumerWidget { - const _PostBody({super.key}); + const _PostBody({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -127,7 +134,9 @@ class _PostBody extends ConsumerWidget { } class _PostImages extends ConsumerWidget { - const _PostImages({super.key}); + const _PostImages({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -158,7 +167,9 @@ class _PostImages extends ConsumerWidget { } class _PostInteractables extends HookConsumerWidget { - const _PostInteractables({super.key}); + const _PostInteractables({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -207,7 +218,10 @@ class _PostInteractables extends HookConsumerWidget { Row( spacing: 2, - children: [Text('$numComments'), const Icon(Icons.comment)], + children: [ + Text('$numComments'), + const Icon(Icons.comment), + ], ), ], ); diff --git a/packages/app/lib/src/features/home/presentation/home/post_view_page.dart b/packages/app/lib/src/features/home/presentation/home/post_view_page.dart index 9ade14a9..46c64d51 100644 --- a/packages/app/lib/src/features/home/presentation/home/post_view_page.dart +++ b/packages/app/lib/src/features/home/presentation/home/post_view_page.dart @@ -24,7 +24,10 @@ class PostViewPage extends ConsumerWidget { /// {@macro harvest_hub.features.home.presentation.home.post_view_page} /// /// Construct a new [PostViewPage] widget. - const PostViewPage({@PathParam('id') required this.id, super.key}); + const PostViewPage({ + @PathParam('id') required this.id, + super.key, + }); /// [PostId] for this post. final String id; @@ -48,23 +51,22 @@ class PostViewPage extends ConsumerWidget { ), ), floatingActionButton: Consumer( - builder: - (context, ref, _) => FloatingActionButton( - onPressed: () async { - final post = ref.read(postServiceProvider(_postId)).valueOrNull; - if (post == null) { - return; - } - - await showDialog( - context: context, - builder: (context) => CreateComment(post: post), - ); - - ref.invalidate(singlePostProvider(_postId)); - }, - child: const Icon(Icons.add_comment), - ), + builder: (context, ref, _) => FloatingActionButton( + onPressed: () async { + final post = ref.read(postServiceProvider(_postId)).valueOrNull; + if (post == null) { + return; + } + + await showDialog( + context: context, + builder: (context) => CreateComment(post: post), + ); + + ref.invalidate(singlePostProvider(_postId)); + }, + child: const Icon(Icons.add_comment), + ), ), body: RefreshIndicator( onRefresh: () async { @@ -92,6 +94,8 @@ class PostViewPage extends ConsumerWidget { style: const TextStyle(color: Colors.red), ), ), + // Intentional, we don’t want to match null. + // ignore: async_value_nullable_pattern AsyncValue(:final value?, hasValue: true) => Column( children: [ ProviderScope( @@ -133,7 +137,10 @@ class PostViewPage extends ConsumerWidget { } class _Comments extends StatelessWidget { - const _Comments({required this.comments, super.key}); + const _Comments({ + required this.comments, + super.key, + }); final IList comments; diff --git a/packages/app/lib/src/features/home/presentation/home/world_feed_page.dart b/packages/app/lib/src/features/home/presentation/home/world_feed_page.dart index c2993bba..e113d59d 100644 --- a/packages/app/lib/src/features/home/presentation/home/world_feed_page.dart +++ b/packages/app/lib/src/features/home/presentation/home/world_feed_page.dart @@ -15,7 +15,9 @@ class WorldFeedPage extends StatelessWidget { /// {@macro harvest_hub.features.home.presentation.home.world_feed_page} /// /// Construct a new [WorldFeedPage] widget. - const WorldFeedPage({super.key}); + const WorldFeedPage({ + super.key, + }); @override Widget build(BuildContext context) { diff --git a/packages/app/lib/src/features/map/presentation/items/map_page.dart b/packages/app/lib/src/features/map/presentation/items/map_page.dart index 2a57be66..5fda18ed 100644 --- a/packages/app/lib/src/features/map/presentation/items/map_page.dart +++ b/packages/app/lib/src/features/map/presentation/items/map_page.dart @@ -21,7 +21,9 @@ class MapPage extends HookWidget { /// {@macro harvest_hub.features.map.presentation.items.map_page} /// /// Construct a new [MapPage] widget. - const MapPage({super.key}); + const MapPage({ + super.key, + }); @override Widget build(BuildContext context) { @@ -32,9 +34,8 @@ class MapPage extends HookWidget { onTap: (_, pos) async { await showDialog( context: context, - builder: - (context) => - _Dialog(latitude: pos.latitude, longitude: pos.longitude), + builder: (context) => + _Dialog(latitude: pos.latitude, longitude: pos.longitude), ); }, ), @@ -44,7 +45,11 @@ class MapPage extends HookWidget { } class _Dialog extends HookConsumerWidget { - const _Dialog({required this.latitude, required this.longitude, super.key}); + const _Dialog({ + required this.latitude, + required this.longitude, + super.key, + }); final double latitude; final double longitude; diff --git a/packages/app/lib/src/features/settings/domain/settings_model.dart b/packages/app/lib/src/features/settings/domain/settings_model.dart index 629b4657..34ba93de 100644 --- a/packages/app/lib/src/features/settings/domain/settings_model.dart +++ b/packages/app/lib/src/features/settings/domain/settings_model.dart @@ -17,7 +17,9 @@ sealed class SettingsModel with _$SettingsModel { /// {@macro harvest_hub.features.settings.domain.settings_model} /// /// Create a new, immutable instance of [SettingsModel]. - const factory SettingsModel({required ThemeMode themeMode}) = _SettingsModel; + const factory SettingsModel({ + required ThemeMode themeMode, + }) = _SettingsModel; /// Deserialize a JSON [Map] into a new, immutable instance of [SettingsModel]. factory SettingsModel.fromJson(Map json) => diff --git a/packages/app/lib/src/features/settings/presentation/preferences/settings_page.dart b/packages/app/lib/src/features/settings/presentation/preferences/settings_page.dart index 6370fee0..3be6a77f 100644 --- a/packages/app/lib/src/features/settings/presentation/preferences/settings_page.dart +++ b/packages/app/lib/src/features/settings/presentation/preferences/settings_page.dart @@ -26,7 +26,9 @@ class SettingsPage extends ConsumerWidget { /// {@macro harvest_hub.features.settings.presentation.preferences} /// /// Construct a new [SettingsPage] widget. - const SettingsPage({super.key}); + const SettingsPage({ + super.key, + }); @override Widget build(BuildContext context, WidgetRef ref) { @@ -134,7 +136,10 @@ class SettingsPage extends ConsumerWidget { } class _AppDescription extends HookWidget { - const _AppDescription({super.key, this.followLink}); + const _AppDescription({ + super.key, + this.followLink, + }); final FollowLink? followLink; diff --git a/packages/app/lib/src/utils/hooks.dart b/packages/app/lib/src/utils/hooks.dart index 383eb68b..34b9fd5e 100644 --- a/packages/app/lib/src/utils/hooks.dart +++ b/packages/app/lib/src/utils/hooks.dart @@ -26,7 +26,10 @@ TapGestureRecognizer useTapGestureRecognizer({ } class _TapGestureRecognizerHook extends Hook { - const _TapGestureRecognizerHook({super.keys, this.onTap}); + const _TapGestureRecognizerHook({ + super.keys, + this.onTap, + }); final VoidCallback? onTap; diff --git a/packages/app/pubspec.yaml b/packages/app/pubspec.yaml index c4cb4a7e..e6778ae7 100644 --- a/packages/app/pubspec.yaml +++ b/packages/app/pubspec.yaml @@ -23,7 +23,7 @@ issue_tracker: https://github.com/PHS-TSA/nexus/issues repository: https://github.com/PHS-TSA/nexus.git environment: - sdk: ^3.7.0 + sdk: ^3.8.0 resolution: workspace # Dependencies specify other packages that your package needs in order to work. @@ -32,68 +32,68 @@ resolution: workspace # dependencies can be manually updated by changing the version numbers below to # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. -dependency_overrides: - flutter_web_auth_2: 4.1.0 # Supports WASM. - pana: 0.22.18 - dependencies: - appwrite: ^14.0.0 - auto_route: ^10.0.0 + appwrite: ^16.1.0 + auto_route: ^10.0.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 # Only required if you use Cupertino (iOS style) icons dio: ^5.8.0+1 envied: ^1.1.1 - fast_immutable_collections: ^11.0.3 + fast_immutable_collections: ^11.0.4 flutter: sdk: flutter flutter_hooks: ^0.21.2 flutter_image_compress: ^2.4.0 flutter_localizations: # Required to enable localization sdk: flutter - flutter_map: ^8.1.0 + flutter_map: ^8.1.1 flutter_map_cancellable_tile_provider: ^3.1.0 - flutter_native_splash: ^2.4.5 + flutter_native_splash: ^2.4.6 flutter_web_plugins: sdk: flutter freezed_annotation: ^3.0.0 - geolocator: ^13.0.2 + geolocator: ^14.0.0 hooks_riverpod: ^2.6.1 image_picker: ^1.1.2 - intl: ^0.19.0 + intl: ^0.20.2 json_annotation: ^4.9.0 latlong2: ^0.9.1 meta: ^1.16.0 os_detect: ^2.0.3 path_provider: ^2.1.5 riverpod_annotation: ^2.6.1 - shared_preferences: ^2.5.2 + shared_preferences: ^2.5.3 timeago_flutter: ^3.7.0 url_launcher: ^6.3.1 window_manager: ^0.4.3 dev_dependencies: _analysis_options: 0.0.0 - auto_route_generator: ^10.0.0 + auto_route_generator: ^10.0.1 build_runner: ^2.4.15 build_version: ^2.1.1 checks: ^0.3.0 custom_lint: ^0.7.5 dhttpd: ^4.1.0 envied_generator: ^1.1.1 - flutter_checks: ^0.1.1 - flutter_gen_runner: ^5.9.0 + flutter_checks: ^0.1.2 + flutter_gen_runner: ^5.10.0 flutter_launcher_icons: ^0.14.3 flutter_test: # Required for a Flutter project that includes tests sdk: flutter - freezed: ^3.0.2 + freezed: ^3.0.6 freezed_lint: ^0.0.9 - json_serializable: ^6.9.4 + json_serializable: ^6.9.5 mocktail: ^1.0.4 riverpod_generator: ^2.6.5 riverpod_lint: ^2.6.5 very_good_cli: ^0.25.0 +dependency_overrides: + flutter_web_auth_2: 4.1.0 # Supports WASM. + pana: 0.22.21 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -105,7 +105,7 @@ flutter: uses-material-design: true # Required if you use the Material icon font # Enable generation of localized strings from arb files. - generate: false + generate: true # To add assets to your application, add an assets section, like this: assets: # Lists assets such as image files diff --git a/packages/app/test/helpers/pump_app.dart b/packages/app/test/helpers/pump_app.dart index 80e17dda..da4062d5 100644 --- a/packages/app/test/helpers/pump_app.dart +++ b/packages/app/test/helpers/pump_app.dart @@ -30,7 +30,9 @@ extension PumpApp on WidgetTester { } class _Widget extends StatelessWidget { - const _Widget({required this.child}); + const _Widget({ + required this.child, + }); final Widget child; diff --git a/packages/app/test/src/app/router_test.dart b/packages/app/test/src/app/router_test.dart index 9da7da68..f64090e9 100644 --- a/packages/app/test/src/app/router_test.dart +++ b/packages/app/test/src/app/router_test.dart @@ -40,7 +40,7 @@ void main() { final routerSubscription = container.listen(routerProvider, (_, _) {}); final tested = routerSubscription.read(); - final mapRoute = tested.routes[0].children?.routes.toList()[0]; + final mapRoute = tested.routes[0].children?.toList()[0]; check(mapRoute?.path).equals(''); }); test('should be correct for MapInfoRoute.', () { @@ -48,8 +48,7 @@ void main() { final routerSubscription = container.listen(routerProvider, (_, _) {}); final tested = routerSubscription.read(); - final sampleItemDetailsRoute = - tested.routes[0].children?.routes.toList()[1]; + final sampleItemDetailsRoute = tested.routes[0].children?.toList()[1]; check(sampleItemDetailsRoute?.path).equals('info'); }); test('should be correct for SettingsRoute.', () { @@ -57,7 +56,7 @@ void main() { final routerSubscription = container.listen(routerProvider, (_, _) {}); final tested = routerSubscription.read(); - final settingsRoute = tested.routes[0].children?.routes.toList()[2]; + final settingsRoute = tested.routes[0].children?.toList()[2]; check(settingsRoute?.path).equals('settings'); }); test("should be correct for ShellRoute('Feed')", () { @@ -65,8 +64,7 @@ void main() { final routerSubscription = container.listen(routerProvider, (_, _) {}); final tested = routerSubscription.read(); - final sampleItemDetailsRoute = - tested.routes[0].children?.routes.toList()[3]; + final sampleItemDetailsRoute = tested.routes[0].children?.toList()[3]; check(sampleItemDetailsRoute?.path).equals('local'); }); test('should allow logging in', () { diff --git a/pubspec.lock b/pubspec.lock index e49387d3..ebae97a2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,26 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "82.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.4.5" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - sha256: b3075265c5ab222f8b3188342dcb50b476286394a40323e85d1fa725035d40a4 + sha256: ee188b6df6c85f1441497c7171c84f1392affadc0384f71089cb10a3bc508cef url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.13.1" ansi_styles: dependency: transitive description: @@ -45,42 +45,42 @@ packages: dependency: transitive description: name: appwrite - sha256: "3e1f618c8f75bafa49ef7b1b445f64c53cf4620a195443f4d119bbc95a666d0a" + sha256: "0d354ab7c42f25b38ed6c54225a997573c0ecc70e83cfabbdd1161fd6dbea752" url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "16.1.0" archive: dependency: transitive description: name: archive - sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742" + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.dev" source: hosted - version: "4.0.4" + version: "4.0.7" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" auto_route: dependency: transitive description: name: auto_route - sha256: fd5af38a2a682e4cbb06c6842ea728efdf460cbf6a425d9459fa9647ad5468f2 + sha256: "89bc5d17d8c575399891194b8cd02b39f52a8512c730052f17ebe443cdcb9109" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.1" auto_route_generator: dependency: transitive description: @@ -173,10 +173,10 @@ packages: dependency: transitive description: name: built_value - sha256: "8b158ab94ec6913e480dc3f752418348b5ae099eb75868b5f4775f0572999c61" + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 url: "https://pub.dev" source: hosted - version: "8.9.4" + version: "8.9.5" characters: dependency: transitive description: @@ -225,6 +225,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_launcher: dependency: transitive description: @@ -277,10 +285,10 @@ packages: dependency: transitive description: name: conventional_commit - sha256: dec15ad1118f029c618651a4359eb9135d8b88f761aa24e4016d061cd45948f2 + sha256: fad254feb6fb8eace2be18855176b0a4b97e0d50e416ff0fe590d5ba83735d34 url: "https://pub.dev" source: hosted - version: "0.6.0+1" + version: "0.6.1" convert: dependency: transitive description: @@ -301,10 +309,10 @@ packages: dependency: transitive description: name: coverage - sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + sha256: "802bd084fb82e55df091ec8ad1553a7331b61c08251eef19a508b6f3f3a9858d" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.13.1" cross_file: dependency: transitive description: @@ -365,10 +373,10 @@ packages: dependency: transitive description: name: custom_lint_visitor - sha256: "36282d85714af494ee2d7da8c8913630aa6694da99f104fb2ed4afcf8fc857d8" + sha256: cba5b6d7a6217312472bf4468cdf68c949488aed7ffb0eab792cd0b6c435054d url: "https://pub.dev" source: hosted - version: "1.0.0+7.3.0" + version: "1.0.0+7.4.5" dart_earcut: dependency: transitive description: @@ -381,10 +389,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" dartx: dependency: transitive description: @@ -469,18 +477,18 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" fast_immutable_collections: dependency: transitive description: name: fast_immutable_collections - sha256: "95a69b9380483dff49ae2c12c9eb92e2b4e1aeff481a33c2a20883471771598a" + sha256: d1aa3d7788fab06cce7f303f4969c7a16a10c865e1bd2478291a8ebcbee084e5 url: "https://pub.dev" source: hosted - version: "11.0.3" + version: "11.0.4" ffi: dependency: transitive description: @@ -546,26 +554,26 @@ packages: dependency: transitive description: name: flutter_checks - sha256: b0a40b15d38436b7c08b83353e74b0569c1ec687bd81c9556091fbb8807c1b99 + sha256: "800acdd6973e1306f65ef3b2287d91c0e45c8e64b696d593297c0c1c1e2740bc" url: "https://pub.dev" source: hosted - version: "0.1.1" + version: "0.1.2" flutter_gen_core: dependency: transitive description: name: flutter_gen_core - sha256: "53890b653738f34363d9f0d40f82104c261716bd551d3ba65f648770b6764c21" + sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" url: "https://pub.dev" source: hosted - version: "5.9.0" + version: "5.10.0" flutter_gen_runner: dependency: transitive description: name: flutter_gen_runner - sha256: de70b42eb5329f712c8b041069d081ad5fb5109f32d6d1ea9c1b39596786215d + sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 url: "https://pub.dev" source: hosted - version: "5.9.0" + version: "5.10.0" flutter_hooks: dependency: transitive description: @@ -639,10 +647,10 @@ packages: dependency: transitive description: name: flutter_map - sha256: bbf145e8220531f2f727608c431871c7457f3b134e513543913afd00fdc1cd47 + sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.1.1" flutter_map_cancellable_tile_provider: dependency: transitive description: @@ -655,18 +663,18 @@ packages: dependency: transitive description: name: flutter_native_splash - sha256: edb09c35ee9230c4b03f13dd45bb3a276d0801865f0a4650b7e2a3bba61a803a + sha256: "8321a6d11a8d13977fa780c89de8d257cce3d841eecfb7a4cadffcc4f12d82dc" url: "https://pub.dev" source: hosted - version: "2.4.5" + version: "2.4.6" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "1c2b787f99bdca1f3718543f81d38aa1b124817dfeb9fb196201bea85b6134bf" + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e url: "https://pub.dev" source: hosted - version: "2.0.26" + version: "2.0.28" flutter_riverpod: dependency: transitive description: @@ -705,10 +713,10 @@ packages: dependency: transitive description: name: freezed - sha256: a3d6429368603a591ca7c1795799a247998fb213ded509070c2c59708b25df31 + sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.6" freezed_annotation: dependency: transitive description: @@ -737,50 +745,50 @@ packages: dependency: transitive description: name: geolocator - sha256: d2ec66329cab29cb297d51d96c067d457ca519dca8589665fa0b82ebacb7dbe4 + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 url: "https://pub.dev" source: hosted - version: "13.0.2" + version: "14.0.0" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: "7aefc530db47d90d0580b552df3242440a10fe60814496a979aa67aa98b1fd47" + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" url: "https://pub.dev" source: hosted - version: "4.6.1" + version: "5.0.1+1" geolocator_apple: dependency: transitive description: name: geolocator_apple - sha256: c4ecead17985ede9634f21500072edfcb3dba0ef7b97f8d7bc556d2d722b3ba3 + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 url: "https://pub.dev" source: hosted - version: "2.3.9" + version: "2.3.13" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "4.2.6" geolocator_web: dependency: transitive description: name: geolocator_web - sha256: "2ed69328e05cd94e7eb48bb0535f5fc0c0c44d1c4fa1e9737267484d05c29b5e" + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.1.3" geolocator_windows: dependency: transitive description: name: geolocator_windows - sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.2.5" glob: dependency: transitive description: @@ -825,18 +833,18 @@ packages: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" http_multi_server: dependency: transitive description: @@ -857,10 +865,10 @@ packages: dependency: transitive description: name: image - sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.5.4" image_picker: dependency: transitive description: @@ -873,10 +881,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "82652a75e3dd667a91187769a6a2cc81bd8c111bbead698d8e938d2b63e5e89a" + sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" url: "https://pub.dev" source: hosted - version: "0.8.12+21" + version: "0.8.12+23" image_picker_for_web: dependency: transitive description: @@ -897,10 +905,10 @@ packages: dependency: transitive description: name: image_picker_linux - sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" url: "https://pub.dev" source: hosted - version: "0.2.1+1" + version: "0.2.1+2" image_picker_macos: dependency: transitive description: @@ -937,10 +945,10 @@ packages: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" io: dependency: transitive description: @@ -969,10 +977,10 @@ packages: dependency: transitive description: name: json_serializable - sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" + sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c url: "https://pub.dev" source: hosted - version: "6.9.4" + version: "6.9.5" latlong2: dependency: transitive description: @@ -993,10 +1001,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -1017,10 +1025,10 @@ packages: dependency: transitive description: name: legacy_checks - sha256: b22e5b1ff55a14e8bd91acafbabff909e14829b73ca492dcdaf0fbbb70476079 + sha256: "1322d6f15e27c214b225d32c9802cd8d312a0373a45efccf48e5e2bb42c7611b" url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.1.1" lints: dependency: transitive description: @@ -1073,10 +1081,10 @@ packages: dependency: transitive description: name: mason_logger - sha256: "28afd064c416f454aaabb870ecac813f25aec4a0c01fd13078624a5c26797a46" + sha256: "6d5a989ff41157915cb5162ed6e41196d5e31b070d2f86e1c2edf216996a158c" url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.3" matcher: dependency: transitive description: @@ -1097,10 +1105,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: "63e9852a28a44c811503b31c607606f9ce8d891e22879e1e97fc7417c22ed6bc" + sha256: "26436105756ff4e535815a0f361181d6485a339cba5a84444e02c620a76d2a95" url: "https://pub.dev" source: hosted - version: "7.0.0-dev.7" + version: "7.0.0-dev.8" meta: dependency: transitive description: @@ -1161,10 +1169,10 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" package_info_plus: dependency: transitive description: @@ -1185,10 +1193,10 @@ packages: dependency: "direct overridden" description: name: pana - sha256: "3bd9ca2adbfdb9a3ac0fc75039a1a007811826ade9bc05cf3a30b803812f99f8" + sha256: "424b9e8523030e21ceeb9712a8b09c49e8e0e50d55845af70efd3238f6a73fa2" url: "https://pub.dev" source: hosted - version: "0.22.18" + version: "0.22.21" path: dependency: transitive description: @@ -1217,10 +1225,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.2.15" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -1297,18 +1305,18 @@ packages: dependency: transitive description: name: posix - sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "6.0.2" process: dependency: transitive description: name: process - sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" + sha256: "44b4226c0afd4bc3b7c7e67d44c4801abd97103cf0c84609e2654b664ca2798c" url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "5.0.4" proj4dart: dependency: transitive description: @@ -1329,10 +1337,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pub_updater: dependency: transitive description: @@ -1465,18 +1473,18 @@ packages: dependency: transitive description: name: shared_preferences - sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22 + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.10" shared_preferences_foundation: dependency: transitive description: @@ -1694,10 +1702,10 @@ packages: dependency: transitive description: name: timeago - sha256: "054cedf68706bb142839ba0ae6b135f6b68039f0b8301cbe8784ae653d5ff8de" + sha256: b05159406a97e1cbb2b9ee4faa9fb096fe0e2dfcd8b08fcd2a00553450d3422e url: "https://pub.dev" source: hosted - version: "3.7.0" + version: "3.7.1" timeago_flutter: dependency: transitive description: @@ -1750,18 +1758,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" url: "https://pub.dev" source: hosted - version: "6.3.14" + version: "6.3.16" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_linux: dependency: transitive description: @@ -1790,10 +1798,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" url_launcher_windows: dependency: transitive description: @@ -1822,10 +1830,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.dev" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: @@ -1838,10 +1846,10 @@ packages: dependency: transitive description: name: very_good_analysis - sha256: "62d2b86d183fb81b2edc22913d9f155d26eb5cf3855173adb1f59fac85035c63" + sha256: f789d414e27ea710a4a8109fbb296f6e137cc0a8c4632282859fc30777184dc6 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.0.0-rc.1" very_good_cli: dependency: transitive description: @@ -1862,10 +1870,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" watcher: dependency: transitive description: @@ -1886,18 +1894,18 @@ packages: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" webkit_inspection_protocol: dependency: transitive description: @@ -1910,10 +1918,10 @@ packages: dependency: transitive description: name: win32 - sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" url: "https://pub.dev" source: hosted - version: "5.11.0" + version: "5.13.0" win32_registry: dependency: transitive description: @@ -1979,5 +1987,5 @@ packages: source: hosted version: "2.2.2" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.29.0" + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.32.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8c947450..d99a5212 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,21 +1,21 @@ name: "harvest_hub_workspace" environment: - sdk: ">=3.7.0 <4.0.0" - flutter: "3.29.0" + sdk: ">=3.8.0 <4.0.0" + flutter: "3.32.0" workspace: - packages/_analysis_options - packages/app dev_dependencies: - melos: ^7.0.0-dev.7 + melos: ^7.0.0-dev.8 melos: command: bootstrap: environment: - sdk: "^3.7.0" + sdk: "^3.8.0" hooks: post: melos run gen-l10n && melos run gen