import 'dart:developer' as dev;
import 'package:english_words/english_words.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:huddle01_flutter/huddle01_flutter.dart';
import 'package:huddle01_flutter_example/logic/blocs/consumers/consumers_bloc.dart';
import 'package:huddle01_flutter_example/logic/blocs/me/me_bloc.dart';
import 'package:huddle01_flutter_example/logic/blocs/media_devices/media_devices_bloc.dart';
import 'package:huddle01_flutter_example/logic/blocs/peers/peers_bloc.dart';
import 'package:huddle01_flutter_example/logic/blocs/producers/producers_bloc.dart';
import 'package:huddle01_flutter_example/logic/blocs/room/room_bloc.dart';
import 'package:huddle01_flutter_example/presentation/enter_page.dart';
import 'package:huddle01_flutter_example/presentation/room.dart';
import 'package:random_string/random_string.dart';
import 'package:flutter/material.dart';
runApp(BlocProvider<MediaDevicesBloc>(
create: (context) => MediaDevicesBloc()..add(MediaDeviceLoadDevices()),
class MyApp extends StatelessWidget {
required ConsumersBloc consumersBloc,
required ProducersBloc producersBloc,
required PeersBloc peersBloc,
emitter.on('addConsumer', (consumer) {
consumersBloc.add(ConsumerAdd(consumer: consumer));
emitter.on('removeConsumer', (consumerId) {
consumersBloc.add(ConsumerRemove(consumerId: consumerId));
emitter.on('addProducer', (producer) {
producersBloc.add(ProducerAdd(producer: producer));
if (producer.source == 'webcam') {
meBloc.add(MeSetWebcamInProgress(progress: true));
emitter.on('removeProducer', (source) {
producersBloc.add(ProducerRemove(source: source));
if (source == 'webcam') {
meBloc.add(MeSetWebcamInProgress(progress: false));
emitter.on('addPeer', (peer) {
peersBloc.add(PeerAdd(newPeer: peer));
emitter.on('removePeer', (peerId) {
peersBloc.add(PeerRemove(peerId: peerId));
emitter.on('addPeerConsumer', (consumer) {
PeerAddConsumer(peerId: consumer.peerId, consumerId: consumer.id));
emitter.on('removePeerConsumer', (peerId, consumerId) {
peersBloc.add(PeerRemoveConsumer(peerId: peerId, consumerId: consumerId));
Widget build(BuildContext context) {
// ignore: missing_return
onGenerateRoute: (settings) {
if (settings.name == EnterPage.RoutePath) {
return MaterialPageRoute(
builder: (context) => EnterPage(),
if (settings.name == '/room') {
return MaterialPageRoute(
builder: (context) => MultiBlocProvider(
// just like multiprovider, we are providing all the blocs except the media devices one to the Room
BlocProvider<ProducersBloc>(
create: (context) => ProducersBloc(),
BlocProvider<ConsumersBloc>(
create: (context) => ConsumersBloc(),
create: (context) => PeersBloc(
consumersBloc: context.read<ConsumersBloc>(),
create: (context) => MeBloc(
displayName: nouns[Random.secure().nextInt(2500)],
RoomBloc(settings.arguments.toString()),
child: RepositoryProvider<HuddleClientRepository>(
// provider to provide room client as an object to all the child widgets of this
consumersBloc: context.read<ConsumersBloc>(),
producersBloc: context.read<ProducersBloc>(),
peersBloc: context.read<PeersBloc>(),
meBloc: context.read<MeBloc>(),
MediaDevicesBloc mediaDevicesBloc =
context.read<MediaDevicesBloc>();
String audioInputDeviceId =
mediaDevicesBloc.state.selectedAudioInput!.deviceId;
String videoInputDeviceId =
mediaDevicesBloc.state.selectedVideoInput!.deviceId;
final meState = context.read<MeBloc>().state;
String displayName = meState.displayName;
final roomState = context.read<RoomBloc>().state;
String roomId = roomState.roomId!;
return HuddleClientRepository(
displayName: displayName,
apiKey: "i4pzqbpxza8vpijQMwZsP1H7nZZEH0TN3vR4NdNS",
audioInputDeviceId: audioInputDeviceId,
videoInputDeviceId: videoInputDeviceId,