import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:tatlock_ui/features/control_room/stacks/data/repositories/stack_repository_impl.dart'; import 'package:tatlock_ui/features/control_room/stacks/domain/entities/stack.dart'; part 'stacks_provider.g.dart'; /// Provides the list of all stacks. @riverpod Future> stacks(Ref ref) async { final repository = ref.watch(stackRepositoryProvider); return repository.getStacks(); } /// Provides a single stack by ID. @riverpod Future stack(Ref ref, String id) async { final repository = ref.watch(stackRepositoryProvider); return repository.getStack(id); } /// Currently selected stack ID (null = all containers). @riverpod class SelectedStack extends _$SelectedStack { @override String? build() => null; void select(String? stackId) { state = stackId; } void clear() { state = null; } } /// Provides the YAML content for a stack. @riverpod Future stackYaml(Ref ref, String stackId) async { final repository = ref.watch(stackRepositoryProvider); return repository.getStackYaml(stackId); } /// Provides the environment variables for a stack. @riverpod Future> stackEnvVars(Ref ref, String stackId) async { final repository = ref.watch(stackRepositoryProvider); return repository.getStackEnvVars(stackId); } /// Controller for stack configuration actions. @riverpod class StackConfigActions extends _$StackConfigActions { @override AsyncValue build() => const AsyncValue.data(null); Future saveYaml(String stackId, String yaml) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(stackRepositoryProvider); await repository.updateStackYaml(stackId, yaml); ref.invalidate(stackYamlProvider(stackId)); }); } Future saveEnvVars(String stackId, Map envVars) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(stackRepositoryProvider); await repository.updateStackEnvVars(stackId, envVars); ref.invalidate(stackEnvVarsProvider(stackId)); }); } Future deploy(String stackId) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(stackRepositoryProvider); await repository.deployStack(stackId); ref.invalidate(stacksProvider); }); } Future rebuild(String stackId) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(stackRepositoryProvider); await repository.rebuildStack(stackId); ref.invalidate(stacksProvider); }); } }