1-
1+ import 'package:airchat/services/connection_service.dart' ;
2+ import 'package:airchat/widgets/call_overlay_widget.dart' ;
23import 'package:flutter/material.dart' ;
34import 'package:hive_flutter/hive_flutter.dart' ;
5+ import 'package:just_audio_media_kit/just_audio_media_kit.dart' ;
46import 'package:media_kit/media_kit.dart' ;
57import 'models/chat_user.dart' ;
68import 'models/chat_message.dart' ;
@@ -10,10 +12,15 @@ import 'ui/settings_screen.dart';
1012import 'package:uuid/uuid.dart' ;
1113import 'package:provider/provider.dart' ;
1214import 'providers/connection_state_provider.dart' ;
15+ import 'providers/call_state_provider.dart' ;
16+ import 'services/global_banner_controller.dart' ;
17+
18+ final GlobalKey <NavigatorState > navigatorKey = GlobalKey <NavigatorState >();
1319
1420void main () async {
1521 WidgetsFlutterBinding .ensureInitialized ();
1622 MediaKit .ensureInitialized ();
23+ JustAudioMediaKit .ensureInitialized ();
1724 await Hive .initFlutter ();
1825 Hive .registerAdapter (ChatUserAdapter ());
1926 Hive .registerAdapter (ChatMessageAdapter ());
@@ -22,36 +29,81 @@ void main() async {
2229 var settingsBox = await Hive .openBox ('settings' );
2330 if (settingsBox.get ('userId' ) == null ) {
2431 settingsBox.put ('userId' , const Uuid ().v4 ());
25- }
32+ }
2633 runApp (
27- ChangeNotifierProvider (
28- create: (_) => ConnectionStateProvider (),
34+ MultiProvider (
35+ providers: [
36+ ChangeNotifierProvider (create: (_) => ConnectionStateProvider ()),
37+ ChangeNotifierProvider (create: (_) => CallStateProvider ()),
38+ ChangeNotifierProvider (create: (_) => GlobalBannerController ()),
39+ ],
2940 child: const AirChatApp (),
3041 ),
3142 );
43+
44+ // Listen for call events and update CallStateProvider
45+ WidgetsBinding .instance.addPostFrameCallback ((_) {
46+ ConnectionService .listenForCallEvents ();
47+ final context = navigatorKey.currentContext;
48+ if (context != null ) {
49+ final callProvider =
50+ Provider .of <CallStateProvider >(context, listen: false );
51+ ConnectionService .callEventsStream.listen ((event) async {
52+ final type = event['type' ];
53+ final from = event['from' ];
54+ final id = event['id' ];
55+ if (type == 'call_invite' ) {
56+ callProvider.receiveIncomingCall (from, id);
57+ } else if (type == 'call_accept' ) {
58+ callProvider.acceptCall ();
59+ } else if (type == 'call_reject' || type == 'call_end' ) {
60+ await ConnectionService .updateCallDuration (
61+ callProvider.currentCallUserId! ,
62+ callProvider.callId! ,
63+ callProvider.callState == CallState .inCall
64+ ? callProvider.formattedCallDuration
65+ : null ,
66+ callProvider.callDirection! );
67+ callProvider.endCall ();
68+ }
69+ });
70+ }
71+ });
3272}
3373
3474class AirChatApp extends StatelessWidget {
3575 const AirChatApp ({super .key});
3676
37-
3877 @override
3978 Widget build (BuildContext context) {
4079 return MaterialApp (
41- title: 'AirChat' ,
42- color: Colors .white,
43- theme: AirChatTheme .lightTheme,
44- debugShowCheckedModeBanner: false ,
45- initialRoute: '/' ,
46- routes: {
47- '/' : (context) => const HomeScreen (),
48- '/home' : (context) => const HomeScreen (),
49- '/settings' : (context) => const SettingsScreen (),
50- },
51- );
52-
53-
54-
55-
80+ title: 'AirChat' ,
81+ color: Colors .white,
82+ theme: AirChatTheme .lightTheme,
83+ debugShowCheckedModeBanner: false ,
84+ navigatorKey: navigatorKey,
85+ initialRoute: '/' ,
86+ routes: {
87+ '/' : (context) => const HomeScreen (),
88+ '/home' : (context) => const HomeScreen (),
89+ '/settings' : (context) => const SettingsScreen (),
90+ },
91+ builder: (context, child) {
92+ return Consumer2 <GlobalBannerController , CallStateProvider >(
93+ builder: (context, bannerController, callProvider, _) {
94+ return Column (
95+ mainAxisSize: MainAxisSize .max,
96+ children: [
97+ if (! callProvider.isCallingScreenOpen &&
98+ callProvider.callState != CallState .idle &&
99+ callProvider.callState != CallState .ended)
100+ CallOverlayWidget (navigatorKey: navigatorKey),
101+ Expanded (child: child ?? SizedBox .shrink ()),
102+ ],
103+ );
104+ },
105+ );
106+ },
107+ );
56108 }
57109}
0 commit comments