fluffychat/lib/pangea/course_plans/course_topics/course_topic_model.dart

137 lines
4.4 KiB
Dart

import 'package:collection/collection.dart';
import 'package:fluffychat/pangea/activity_planner/activity_plan_model.dart';
import 'package:fluffychat/pangea/common/config/environment.dart';
import 'package:fluffychat/pangea/course_plans/course_activities/course_activity_repo.dart';
import 'package:fluffychat/pangea/course_plans/course_activities/course_activity_translation_request.dart';
import 'package:fluffychat/pangea/course_plans/course_info_batch_request.dart';
import 'package:fluffychat/pangea/course_plans/course_locations/course_location_media_repo.dart';
import 'package:fluffychat/pangea/course_plans/course_locations/course_location_repo.dart';
import 'package:fluffychat/pangea/course_plans/course_locations/course_location_response.dart';
import 'package:fluffychat/widgets/matrix.dart';
/// Represents a topic in the course planner response.
class CourseTopicModel {
final String title;
final String description;
final String uuid;
final List<String> locationIds;
final List<String> activityIds;
CourseTopicModel({
required this.title,
required this.description,
required this.uuid,
required this.activityIds,
required this.locationIds,
});
bool get locationListComplete =>
locationIds.length == loadedLocations.locations.length;
CourseLocationResponse get loadedLocations => CourseLocationRepo.getCached(
CourseInfoBatchRequest(
batchId: uuid,
uuids: locationIds,
),
);
Future<CourseLocationResponse> _fetchLocations() => CourseLocationRepo.get(
CourseInfoBatchRequest(
batchId: uuid,
uuids: locationIds,
),
);
String? get location => loadedLocations.locations.firstOrNull?.name;
bool get locationMediaListComplete =>
loadedLocationMediaIds.length ==
loadedLocations.locations
.map((e) => e.mediaIds.length)
.fold(0, (a, b) => a + b);
List<String> get loadedLocationMediaIds => loadedLocations.locations
.map(
(location) => CourseLocationMediaRepo.getCached(
CourseInfoBatchRequest(
batchId: uuid,
uuids: location.mediaIds,
),
).mediaUrls,
)
.expand((e) => e)
.map((e) => e.url)
.toList();
Future<List<String>> fetchLocationMedia() async {
final allLocationMedia = <String>[];
final locationResp = await _fetchLocations();
for (final location in locationResp.locations) {
final mediaResp = await CourseLocationMediaRepo.get(
CourseInfoBatchRequest(
batchId: uuid,
uuids: location.mediaIds,
),
);
allLocationMedia.addAll(mediaResp.mediaUrls.map((e) => e.url));
}
return allLocationMedia;
}
String? get imageUrl => loadedLocationMediaIds.isEmpty
? null
: "${Environment.cmsApi}${loadedLocationMediaIds.first}";
bool get activityListComplete =>
activityIds.length == loadedActivities.length;
Map<String, ActivityPlanModel> get loadedActivities =>
CourseActivityRepo.getCached(
TranslateActivityRequest(
activityIds: activityIds,
l1: MatrixState.pangeaController.userController.userL1Code!,
),
).plans;
Future<Map<String, ActivityPlanModel>> fetchActivities() async {
final resp = await CourseActivityRepo.get(
TranslateActivityRequest(
activityIds: activityIds,
l1: MatrixState.pangeaController.userController.userL1Code!,
),
uuid,
);
return resp.plans;
}
/// Deserialize from JSON
factory CourseTopicModel.fromJson(Map<String, dynamic> json) {
final List<dynamic>? activityIdsEntry =
json['activity_ids'] as List<dynamic>? ??
json['activityIds'] as List<dynamic>?;
final List<dynamic>? locationIdsEntry =
json['location_ids'] as List<dynamic>? ??
json['locationIds'] as List<dynamic>?;
return CourseTopicModel(
title: json['title'] as String,
description: json['description'] as String,
uuid: json['uuid'] as String,
activityIds: activityIdsEntry?.map((e) => e as String).toList() ?? [],
locationIds: locationIdsEntry?.map((e) => e as String).toList() ?? [],
);
}
/// Serialize to JSON
Map<String, dynamic> toJson() {
return {
'title': title,
'description': description,
'uuid': uuid,
'activity_ids': activityIds,
'location_ids': locationIds,
};
}
}