From 755258a4bc45cad3ea2a2b4017fd9d0cd9b3cd23 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Sat, 2 May 2026 09:24:45 +0200 Subject: [PATCH] feat(auth): refactor token retrieval to use maybeWhen for improved null handling --- .../presentation/recipe_import_tab.dart | 6 +++-- .../presentation/recipe_detail_screen.dart | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/flutter/lib/features/import/presentation/recipe_import_tab.dart b/flutter/lib/features/import/presentation/recipe_import_tab.dart index ebc26811..e1b29556 100644 --- a/flutter/lib/features/import/presentation/recipe_import_tab.dart +++ b/flutter/lib/features/import/presentation/recipe_import_tab.dart @@ -50,7 +50,6 @@ class _RecipeImportTabState extends ConsumerState { if (result == null || result.files.isEmpty) return; setState(() { _pickedFile = result.files.first; - _error = null; }); } @@ -65,7 +64,10 @@ class _RecipeImportTabState extends ConsumerState { setState(() => _isLoading = true); try { - final token = ref.read(authStateProvider).valueOrNull ?? + final token = ref.read(authStateProvider).maybeWhen( + data: (t) => t, + orElse: () => null, + ) ?? await ref.read(authStateProvider.future); final repo = ref.read(importRepositoryProvider); final result = _method == _Method.file diff --git a/flutter/lib/features/recipes/presentation/recipe_detail_screen.dart b/flutter/lib/features/recipes/presentation/recipe_detail_screen.dart index 894fa743..1783b1e4 100644 --- a/flutter/lib/features/recipes/presentation/recipe_detail_screen.dart +++ b/flutter/lib/features/recipes/presentation/recipe_detail_screen.dart @@ -24,9 +24,12 @@ class RecipeDetailScreen extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final recipeAsync = ref.watch(recipeDetailProvider(recipeId)); - final token = ref.watch(authStateProvider).valueOrNull; + final token = ref.watch(authStateProvider).maybeWhen( + data: (t) => t, + orElse: () => null, + ); final currentUserId = jwtUserId(token); - final recipe = recipeAsync.valueOrNull; + final recipe = recipeAsync.asData?.value; final isOwner = recipe != null && currentUserId != null && recipe.ownerId == currentUserId; return Scaffold( @@ -164,7 +167,10 @@ class RecipeDetailScreen extends ConsumerWidget { Recipe recipe, ) async { try { - final token = ref.read(authStateProvider).valueOrNull ?? + final token = ref.read(authStateProvider).maybeWhen( + data: (t) => t, + orElse: () => null, + ) ?? await ref.read(authStateProvider.future); await ref.read(recipeRepositoryProvider).setRecipeVisibility( recipe.id, @@ -242,7 +248,10 @@ class RecipeDetailScreen extends ConsumerWidget { if (trimmed.isEmpty) return; try { - final token = ref.read(authStateProvider).valueOrNull ?? + final token = ref.read(authStateProvider).maybeWhen( + data: (t) => t, + orElse: () => null, + ) ?? await ref.read(authStateProvider.future); if (action == _ShareAction.unshare) { await ref.read(recipeRepositoryProvider).unshareRecipeWithUsername( @@ -332,7 +341,10 @@ class _DeleteButton extends ConsumerWidget { if (confirmed != true || !context.mounted) return; try { - final token = ref.read(authStateProvider).valueOrNull ?? + final token = ref.read(authStateProvider).maybeWhen( + data: (t) => t, + orElse: () => null, + ) ?? await ref.read(authStateProvider.future); await ref.read(recipeRepositoryProvider).deleteRecipe(recipe.id, token: token);