import 'package:riverpod_annotation/riverpod_annotation.dart'; import '../../../stacks/presentation/providers/stacks_provider.dart'; import '../../data/repositories/container_repository_impl.dart'; import '../../domain/entities/container.dart'; part 'containers_provider.g.dart'; /// Provides all containers. @riverpod Future> allContainers(AllContainersRef ref) async { final repository = ref.watch(containerRepositoryProvider); return repository.getContainers(); } /// Provides containers filtered by the selected stack. @riverpod Future> containers(ContainersRef ref) async { final repository = ref.watch(containerRepositoryProvider); final selectedStack = ref.watch(selectedStackProvider); if (selectedStack == null) { return repository.getContainers(); } return repository.getContainersByStack(selectedStack); } /// Provides a single container by ID. @riverpod Future container(ContainerRef ref, String id) async { final repository = ref.watch(containerRepositoryProvider); return repository.getContainer(id); } /// Controller for container actions. @riverpod class ContainerActions extends _$ContainerActions { @override AsyncValue build() => const AsyncValue.data(null); Future start(String id) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(containerRepositoryProvider); await repository.startContainer(id); ref.invalidate(allContainersProvider); ref.invalidate(containersProvider); }); } Future stop(String id) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(containerRepositoryProvider); await repository.stopContainer(id); ref.invalidate(allContainersProvider); ref.invalidate(containersProvider); }); } Future restart(String id) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(containerRepositoryProvider); await repository.restartContainer(id); ref.invalidate(allContainersProvider); ref.invalidate(containersProvider); }); } Future remove(String id, {bool force = false}) async { state = const AsyncValue.loading(); state = await AsyncValue.guard(() async { final repository = ref.read(containerRepositoryProvider); await repository.removeContainer(id, force: force); ref.invalidate(allContainersProvider); ref.invalidate(containersProvider); }); } } /// Container logs provider. @riverpod Future containerLogs( ContainerLogsRef ref, String id, { int? tail = 100, }) async { final repository = ref.watch(containerRepositoryProvider); return repository.getContainerLogs(id, tail: tail); }