Files
plezy/lib/utils/provider_extensions.dart
T

91 lines
3.5 KiB
Dart
Raw Normal View History

2025-10-30 18:49:59 +01:00
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
2025-12-04 08:36:07 +01:00
import '../services/plex_client.dart';
import '../i18n/strings.g.dart';
import '../models/plex_library.dart';
2025-12-14 21:03:11 +01:00
import '../models/plex_metadata.dart';
2025-11-01 12:11:56 +01:00
import '../models/plex_user_profile.dart';
import '../providers/hidden_libraries_provider.dart';
import '../providers/multi_server_provider.dart';
import '../providers/user_profile_provider.dart';
import 'app_logger.dart';
2025-10-30 18:49:59 +01:00
extension ProviderExtensions on BuildContext {
2025-12-15 02:29:03 +01:00
UserProfileProvider get userProfile => Provider.of<UserProfileProvider>(this, listen: false);
2025-10-30 18:49:59 +01:00
2025-12-15 02:29:03 +01:00
UserProfileProvider watchUserProfile() => Provider.of<UserProfileProvider>(this, listen: true);
2025-10-30 18:49:59 +01:00
2025-12-15 02:29:03 +01:00
HiddenLibrariesProvider get hiddenLibraries => Provider.of<HiddenLibrariesProvider>(this, listen: false);
2025-11-04 06:45:16 +01:00
2025-12-15 02:29:03 +01:00
HiddenLibrariesProvider watchHiddenLibraries() => Provider.of<HiddenLibrariesProvider>(this, listen: true);
2025-11-04 06:45:16 +01:00
2025-11-01 12:11:56 +01:00
// Direct profile settings access (nullable)
PlexUserProfile? get profileSettings => userProfile.profileSettings;
/// Get PlexClient for a specific server ID
2025-11-23 05:10:42 +01:00
/// Throws an exception if no client is available for the given serverId
PlexClient getClientForServer(String serverId) {
2025-12-15 02:29:03 +01:00
final multiServerProvider = Provider.of<MultiServerProvider>(this, listen: false);
final serverClient = multiServerProvider.getClientForServer(serverId);
if (serverClient == null) {
appLogger.e('No client found for server $serverId');
throw Exception(t.errors.noClientAvailable);
}
return serverClient;
}
/// Get PlexClient for a library
/// Throws an exception if no client is available
PlexClient getClientForLibrary(PlexLibrary library) {
2025-11-23 05:10:42 +01:00
// If library doesn't have a serverId, fall back to first available server
if (library.serverId == null) {
2025-12-15 02:29:03 +01:00
final multiServerProvider = Provider.of<MultiServerProvider>(this, listen: false);
2025-11-23 05:10:42 +01:00
if (!multiServerProvider.hasConnectedServers) {
throw Exception(t.errors.noClientAvailable);
}
return getClientForServer(multiServerProvider.onlineServerIds.first);
}
return getClientForServer(library.serverId!);
}
2025-12-14 21:03:11 +01:00
/// Get PlexClient for metadata, with fallback to first available server
/// Throws an exception if no servers are available
PlexClient getClientForMetadata(PlexMetadata metadata) {
if (metadata.serverId != null) {
return getClientForServer(metadata.serverId!);
}
return getFirstAvailableClient();
}
/// Get PlexClient for metadata, or null if offline mode or no serverId
/// Use this for screens that support offline mode
2025-12-15 02:29:03 +01:00
PlexClient? getClientForMetadataOrNull(PlexMetadata metadata, {bool isOffline = false}) {
2025-12-14 21:03:11 +01:00
if (isOffline || metadata.serverId == null) {
return null;
}
return getClientForServer(metadata.serverId!);
}
/// Get the first available client from connected servers
/// Throws an exception if no servers are available
PlexClient getFirstAvailableClient() {
2025-12-15 02:29:03 +01:00
final multiServerProvider = Provider.of<MultiServerProvider>(this, listen: false);
2025-12-14 21:03:11 +01:00
if (!multiServerProvider.hasConnectedServers) {
throw Exception(t.errors.noClientAvailable);
}
return getClientForServer(multiServerProvider.onlineServerIds.first);
}
/// Get client for a serverId with fallback to first available server
/// Useful for items that might not have a serverId
PlexClient getClientWithFallback(String? serverId) {
if (serverId != null) {
return getClientForServer(serverId);
}
return getFirstAvailableClient();
}
2025-10-30 18:49:59 +01:00
}