myCurriculumDomains function

  1. @riverpod
Future<List<DomainEntity>> myCurriculumDomains(
  1. Ref<Object?> ref
)

Domains the user has personal access to: owned + shared + assigned (via curriculum_assignments). Does NOT include public-visibility domains the user hasn't engaged with. Used by progress-focused screens (home card, progress dashboard, domain browse) so "no curriculum" means "no domains shown".

Implementation

@riverpod
Future<List<DomainEntity>> myCurriculumDomains(Ref ref) async {
  final results = await Future.wait([
    ref.watch(myDomainsProvider.future),
    ref.watch(sharedWithMeProvider.future),
    ref.watch(myAssignmentsProvider.future),
  ]);
  final owned = results[0] as List<DomainEntity>;
  final shared = results[1] as List<DomainEntity>;
  final assignments = results[2] as List<CurriculumAssignment>;

  final byId = <String, DomainEntity>{};
  for (final d in [...owned, ...shared]) {
    byId[d.id] = d;
  }

  final missing = assignments
      .map((a) => a.domainId)
      .where((id) => !byId.containsKey(id))
      .toSet();
  if (missing.isNotEmpty) {
    final ds = ref.watch(supabaseDatasourceProvider);
    final resolved = await ds.getDomainsByIds(missing);
    for (final d in resolved.map((m) => m.toEntity())) {
      byId[d.id] = d;
    }
  }

  final list = byId.values.toList()
    ..sort((a, b) {
      final c = a.sortOrder.compareTo(b.sortOrder);
      return c != 0 ? c : a.name.compareTo(b.name);
    });
  return list;
}