refactor(network): Replace read with watch for providers in image handling

This commit is contained in:
cogwheel0
2025-11-01 15:42:08 +05:30
parent 877b403914
commit 71d63ac157
4 changed files with 16 additions and 14 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:conduit/core/providers/app_providers.dart'; import 'package:conduit/core/providers/app_providers.dart';
import 'package:conduit/core/services/api_service.dart';
import 'package:conduit/features/auth/providers/unified_auth_providers.dart'; import 'package:conduit/features/auth/providers/unified_auth_providers.dart';
/// Builds HTTP headers for protected image requests. /// Builds HTTP headers for protected image requests.
@@ -8,14 +9,14 @@ import 'package:conduit/features/auth/providers/unified_auth_providers.dart';
/// Includes Authorization (Bearer token or API key) and any server-configured /// Includes Authorization (Bearer token or API key) and any server-configured
/// custom headers. Returns `null` if no headers are needed. /// custom headers. Returns `null` if no headers are needed.
Map<String, String>? buildImageHeadersFromRef(Ref ref) { Map<String, String>? buildImageHeadersFromRef(Ref ref) {
final api = ref.read(apiServiceProvider); final api = ref.watch(apiServiceProvider);
final token = ref.read(authTokenProvider3); final token = ref.watch(authTokenProvider3);
return _build(api, token); return _build(api, token);
} }
Map<String, String>? buildImageHeadersFromWidgetRef(WidgetRef ref) { Map<String, String>? buildImageHeadersFromWidgetRef(WidgetRef ref) {
final api = ref.read(apiServiceProvider); final api = ref.watch(apiServiceProvider);
final token = ref.read(authTokenProvider3); final token = ref.watch(authTokenProvider3);
return _build(api, token); return _build(api, token);
} }
@@ -29,7 +30,7 @@ Map<String, String>? buildImageHeadersFromContainer(
return _build(api, token); return _build(api, token);
} }
Map<String, String>? _build(dynamic api, String? token) { Map<String, String>? _build(ApiService? api, String? token) {
final headers = <String, String>{}; final headers = <String, String>{};
if (token != null && token.isNotEmpty) { if (token != null && token.isNotEmpty) {
@@ -39,8 +40,9 @@ Map<String, String>? _build(dynamic api, String? token) {
headers['Authorization'] = 'Bearer ${api.serverConfig.apiKey}'; headers['Authorization'] = 'Bearer ${api.serverConfig.apiKey}';
} }
if (api != null && api.serverConfig.customHeaders.isNotEmpty) { final customHeaders = api?.serverConfig.customHeaders ?? {};
headers.addAll(api.serverConfig.customHeaders); if (customHeaders.isNotEmpty) {
headers.addAll(customHeaders);
} }
return headers.isEmpty ? null : headers; return headers.isEmpty ? null : headers;

View File

@@ -14,7 +14,7 @@ import '../providers/app_providers.dart';
/// Notes /// Notes
/// - Scoped to the configured host and (optionally) port only. /// - Scoped to the configured host and (optionally) port only.
/// - Not available on web (browsers enforce TLS validation). /// - Not available on web (browsers enforce TLS validation).
final selfSignedImageCacheManagerProvider = Provider<CacheManager?>((ref) { final selfSignedImageCacheManagerProvider = Provider<BaseCacheManager?>((ref) {
final active = ref.watch(activeServerProvider); final active = ref.watch(activeServerProvider);
return active.maybeWhen( return active.maybeWhen(
@@ -26,7 +26,7 @@ final selfSignedImageCacheManagerProvider = Provider<CacheManager?>((ref) {
); );
}); });
CacheManager? _buildForServer(ServerConfig server) { BaseCacheManager? _buildForServer(ServerConfig server) {
if (kIsWeb) return null; if (kIsWeb) return null;
if (!server.allowSelfSignedCertificates) return null; if (!server.allowSelfSignedCertificates) return null;

View File

@@ -417,7 +417,7 @@ class _EnhancedImageAttachmentState
// Get authentication headers if available // Get authentication headers if available
final headers = buildImageHeadersFromWidgetRef(ref); final headers = buildImageHeadersFromWidgetRef(ref);
final cacheManager = ref.read(selfSignedImageCacheManagerProvider); final cacheManager = ref.watch(selfSignedImageCacheManagerProvider);
final imageWidget = CachedNetworkImage( final imageWidget = CachedNetworkImage(
key: ValueKey('image_${widget.attachmentId}'), key: ValueKey('image_${widget.attachmentId}'),
imageUrl: _cachedImageData!, imageUrl: _cachedImageData!,
@@ -548,7 +548,7 @@ class FullScreenImageViewer extends ConsumerWidget {
// Get authentication headers if available // Get authentication headers if available
final headers = buildImageHeadersFromWidgetRef(ref); final headers = buildImageHeadersFromWidgetRef(ref);
final cacheManager = ref.read(selfSignedImageCacheManagerProvider); final cacheManager = ref.watch(selfSignedImageCacheManagerProvider);
imageWidget = CachedNetworkImage( imageWidget = CachedNetworkImage(
imageUrl: imageData, imageUrl: imageData,
fit: BoxFit.contain, fit: BoxFit.contain,

View File

@@ -2,13 +2,13 @@ import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:conduit/core/network/image_header_utils.dart';
import 'package:conduit/core/network/self_signed_image_cache_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../services/brand_service.dart'; import '../services/brand_service.dart';
import '../theme/theme_extensions.dart'; import '../theme/theme_extensions.dart';
import 'package:conduit/core/network/self_signed_image_cache_manager.dart';
import 'package:conduit/core/network/image_header_utils.dart';
typedef AvatarWidgetBuilder = typedef AvatarWidgetBuilder =
Widget Function(BuildContext context, double size); Widget Function(BuildContext context, double size);
@@ -59,7 +59,7 @@ class AvatarImage extends ConsumerWidget {
// Build auth/custom headers when loading from network // Build auth/custom headers when loading from network
final headers = buildImageHeadersFromWidgetRef(ref); final headers = buildImageHeadersFromWidgetRef(ref);
final cacheManager = ref.read(selfSignedImageCacheManagerProvider); final cacheManager = ref.watch(selfSignedImageCacheManagerProvider);
return ClipRRect( return ClipRRect(
borderRadius: _radius, borderRadius: _radius,