/v9E1ecjIPfS47TS6LikuGQ
/IB80enIeW_iKu26SoYZgsw
/9SOEM5vIWbyVFarIwCorsg
/8W2RN-mekfM38F-lDD7otg
/lKPvcWcnkaSTs2cqOD-Kaw
/1cdWwWrUEeukKmQLAgR5IQ
/NMqKc3HpqvO7vY2zjg6-Uw
/lRZD2rb2gSd0fQqj0RbZiA
/cUWiTJWwqtdncDnTEybFzA
import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lotti/classes/ai/ai_config.dart';
import 'package:lotti/classes/journal_entities.dart';
import 'package:lotti/features/ai/helpers/prompt_capability_filter.dart';
import 'package:lotti/features/ai/repository/ai_config_repository.dart';
import 'package:lotti/features/ai/state/consts.dart';
import 'package:lotti/logic/repositories/journal_repository.dart';
class AiPromptResolver {
AiPromptResolver({required this.ref});
final Ref ref;
Future<List<AiConfigPrompt>> getActivePromptsForContext({
required JournalEntity entity,
}) async {
final allPrompts = await ref
.read(aiConfigRepositoryProvider)
.getConfigsByType(AiConfigType.prompt);
final activePrompts = <AiConfigPrompt>[];
final activeChecks = <Future<bool>>[];
final validPrompts = <AiConfigPrompt>[];
for (final config in allPrompts) {
if (config is AiConfigPrompt &&
!config.archived &&
!config.aiResponseType.isLegacyType) {
validPrompts.add(config);
activeChecks.add(_isPromptActiveForEntity(config, entity));
}
}
final results = await Future.wait(activeChecks);
for (var i = 0; i < results.length; i++) {
if (results[i]) {
activePrompts.add(validPrompts[i]);
}
}
final capabilityFilter = ref.read(promptCapabilityFilterProvider);
final platformFilteredPrompts = await capabilityFilter
.filterPromptsByPlatform(activePrompts);
return platformFilteredPrompts;
}
Future<bool> _isPromptActiveForEntity(
AiConfigPrompt prompt,
JournalEntity entity,
) async {
final hasTask = prompt.requiredInputData.contains(InputDataType.task);
final hasImages = prompt.requiredInputData.contains(InputDataType.images);
final hasAudio = prompt.requiredInputData.contains(
InputDataType.audioFiles,
);
if (hasTask) {
if (entity is Task) {
if (prompt.aiResponseType.isPromptGenerationType) {
return false;
}
return !hasImages && !hasAudio;
} else if (entity is JournalImage && hasImages) {
final linkedEntities = await ref
.read(journalRepositoryProvider)
.getLinkedToEntities(linkedTo: entity.id);
return linkedEntities.any((e) => e is Task);
} else if (entity is JournalAudio && hasAudio) {
final linkedEntities = await ref
.read(journalRepositoryProvider)
.getLinkedToEntities(linkedTo: entity.id);
return linkedEntities.any((e) => e is Task);
}
if (entity is JournalAudio &&
prompt.aiResponseType.isPromptGenerationType) {
final linkedEntities = await ref
.read(journalRepositoryProvider)
.getLinkedToEntities(linkedTo: entity.id);
return linkedEntities.any((e) => e is Task);
}
return false;
}
if (hasImages && entity is! JournalImage) return false;
if (hasAudio && entity is! JournalAudio) return false;
return true;
}
}
/SLqGVZ04UYLdDMye84d04w
/PECkZ4TrT4cO3-0-3MQ-Uw
/D8QYvizPLP00uOoC02ABPw
/znASd7_2JoW3WdQRPCp6rg
/Xfap2zw1Un_XAi94FnHfKQ
/fPm7dk4_Sh0eACQ72cPr9A
/KN_CLDpYkX63ORTmrpM04Q
/fRIXiCRpGE79sbp5nArJbg
/HuoU8PaiDX-tZGFbZ08WPg
/Z_wXIqbOSZQypY519V9Fkw