getRandomStudio method

Future<Studio?> getRandomStudio({
  1. bool useCurrentFilter = false,
  2. String? excludeStudioId,
})

Implementation

Future<Studio?> getRandomStudio({
  bool useCurrentFilter = false,
  String? excludeStudioId,
}) async {
  final repository = ref.read(studioRepositoryProvider);
  final query = useCurrentFilter ? ref.read(studioSearchQueryProvider) : '';
  final favoritesOnly = useCurrentFilter
      ? ref.read(studioFavoritesOnlyProvider)
      : false;

  final attempts = excludeStudioId == null ? 1 : 3;
  for (var i = 0; i < attempts; i++) {
    final randomPage = await repository.findStudios(
      page: 1,
      perPage: 1,
      filter: query.isEmpty ? null : query,
      sort: 'random',
      descending: true,
      favoritesOnly: favoritesOnly,
    );
    if (randomPage.isEmpty) continue;
    final candidate = randomPage.first;
    if (excludeStudioId == null || candidate.id != excludeStudioId) {
      return candidate;
    }
  }

  final loaded = state.asData?.value;
  if (loaded != null && loaded.isNotEmpty) {
    final candidates = excludeStudioId == null
        ? loaded
        : loaded.where((studio) => studio.id != excludeStudioId).toList();
    if (candidates.isEmpty) return null;
    final random = Random();
    return candidates[random.nextInt(candidates.length)];
  }

  return null;
}