124 lines
3.3 KiB
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;
|
|
}
|
|
}
|
|
}
|