uto_manager/lib/application/blocs/template_cubit.dart

124 lines
3.3 KiB
Dart

import 'dart:convert';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:uto_manager/infrastructure/database/app_database.dart';
import 'package:uto_manager/infrastructure/database/daos/template_dao.dart';
// ---------------------------------------------------------------------------
// State
// ---------------------------------------------------------------------------
/// State for the template cubit.
sealed class TemplateState extends Equatable {
const TemplateState();
}
class TemplateInitial extends TemplateState {
const TemplateInitial();
@override
List<Object?> get props => [];
}
class TemplateLoading extends TemplateState {
const TemplateLoading();
@override
List<Object?> get props => [];
}
class TemplateLoaded extends TemplateState {
const TemplateLoaded(this.templates);
final List<Template> templates;
@override
List<Object?> get props => [templates];
}
class TemplateError extends TemplateState {
const TemplateError(this.message);
final String message;
@override
List<Object?> get props => [message];
}
// ---------------------------------------------------------------------------
// Cubit
// ---------------------------------------------------------------------------
/// Manages saved unit tree templates.
class TemplateCubit extends Cubit<TemplateState> {
TemplateCubit({required this.dao}) : super(const TemplateInitial());
final TemplateDao dao;
// ---------------------------------------------------------------------------
// Loading
// ---------------------------------------------------------------------------
/// Loads all saved templates from the database.
Future<void> loadTemplates() async {
emit(const TemplateLoading());
try {
final templates = await dao.getAllTemplates();
emit(TemplateLoaded(templates));
} catch (e) {
emit(TemplateError(e.toString()));
}
}
// ---------------------------------------------------------------------------
// Save / Delete
// ---------------------------------------------------------------------------
/// Saves a template with [name], [bctType], and [jsonData].
Future<void> saveTemplate({
required String templateId,
required String name,
required String bctType,
required Map<String, dynamic> jsonData,
}) async {
try {
final now = DateTime.now();
await dao.upsertTemplate(
TemplatesCompanion.insert(
templateId: templateId,
name: name,
bctType: bctType,
jsonData: jsonEncode(jsonData),
createdAt: now,
updatedAt: now,
),
);
await loadTemplates();
} catch (e) {
emit(TemplateError(e.toString()));
}
}
/// Deletes the template with [templateId].
Future<void> deleteTemplate(String templateId) async {
try {
await dao.deleteTemplate(templateId);
await loadTemplates();
} catch (e) {
emit(TemplateError(e.toString()));
}
}
/// Returns the JSON data for [templateId], or null if not found.
Future<Map<String, dynamic>?> getTemplateJson(String templateId) async {
try {
final template = await dao.getTemplateById(templateId);
if (template == null) return null;
return jsonDecode(template.jsonData) as Map<String, dynamic>;
} catch (e) {
return null;
}
}
}