Files
COPILOT/copilot_keyboard/lib/presentation/blocs/camera/camera_bloc.dart
klas 40143734fc Initial commit: COPILOT D6 Flutter keyboard controller
Flutter web app replacing legacy WPF CCTV surveillance keyboard controller.
Includes wall overview, section view with monitor grid, camera input,
PTZ control, alarm/lock/sequence BLoCs, and legacy-matching UI styling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 14:57:38 +01:00

65 lines
1.7 KiB
Dart

import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../config/app_config.dart';
import '../../../data/services/bridge_service.dart';
import 'camera_event.dart';
import 'camera_state.dart';
class CameraBloc extends Bloc<CameraEvent, CameraState> {
final BridgeService _bridgeService;
final AppConfig _config;
CameraBloc({
required BridgeService bridgeService,
required AppConfig config,
}) : _bridgeService = bridgeService,
_config = config,
super(CameraState(availableCameras: config.allCameraIds)) {
on<SelectCamera>(_onSelectCamera);
on<ConnectCameraToMonitor>(_onConnectCameraToMonitor);
on<ClearCameraSelection>(_onClearCameraSelection);
}
void _onSelectCamera(
SelectCamera event,
Emitter<CameraState> emit,
) {
emit(state.copyWith(selectedCameraId: event.cameraId, error: null));
}
Future<void> _onConnectCameraToMonitor(
ConnectCameraToMonitor event,
Emitter<CameraState> emit,
) async {
emit(state.copyWith(isConnecting: true, error: null));
try {
final success = await _bridgeService.viewerConnectLive(
event.monitorId,
event.cameraId,
);
if (success) {
emit(state.copyWith(isConnecting: false));
} else {
emit(state.copyWith(
isConnecting: false,
error: 'Failed to connect camera ${event.cameraId} to monitor ${event.monitorId}',
));
}
} catch (e) {
emit(state.copyWith(
isConnecting: false,
error: e.toString(),
));
}
}
void _onClearCameraSelection(
ClearCameraSelection event,
Emitter<CameraState> emit,
) {
emit(state.copyWith(clearSelection: true, error: null));
}
}