1+ import 'dart:io' ;
2+
13import 'package:airchat/services/connection_service.dart' ;
4+ import 'package:airchat/services/overlay_service.dart' ;
5+ import 'package:airchat/utility/notification_util.dart' ;
26import 'package:airchat/widgets/call_overlay_widget.dart' ;
37import 'package:flutter/material.dart' ;
48import 'package:hive_flutter/hive_flutter.dart' ;
59import 'package:just_audio_media_kit/just_audio_media_kit.dart' ;
610import 'package:media_kit/media_kit.dart' ;
11+ import 'package:path_provider/path_provider.dart' ;
712import 'models/chat_user.dart' ;
813import 'models/chat_message.dart' ;
914import 'theme.dart' ;
@@ -14,6 +19,7 @@ import 'package:provider/provider.dart';
1419import 'providers/connection_state_provider.dart' ;
1520import 'providers/call_state_provider.dart' ;
1621import 'services/global_banner_controller.dart' ;
22+ import 'providers/theme_provider.dart' ;
1723
1824final GlobalKey <NavigatorState > navigatorKey = GlobalKey <NavigatorState >();
1925
@@ -22,6 +28,12 @@ void main() async {
2228 MediaKit .ensureInitialized ();
2329 JustAudioMediaKit .ensureInitialized ();
2430 await Hive .initFlutter ();
31+ if (Platform .isAndroid || Platform .isIOS) {
32+ } else if (Platform .isWindows) {
33+ final localAppData = Platform .environment['LOCALAPPDATA' ] ??
34+ await getApplicationDocumentsDirectory ().then ((value) => value.path);
35+ Hive .init ('$localAppData \\ AirChat' );
36+ }
2537 Hive .registerAdapter (ChatUserAdapter ());
2638 Hive .registerAdapter (ChatMessageAdapter ());
2739 // await Hive.deleteBoxFromDisk('chat_users');
@@ -30,12 +42,15 @@ void main() async {
3042 if (settingsBox.get ('userId' ) == null ) {
3143 settingsBox.put ('userId' , const Uuid ().v4 ());
3244 }
45+ await NotificationUtil .initialize ();
46+ DraggableOverlayService .initialize (navigatorKey);
3347 runApp (
3448 MultiProvider (
3549 providers: [
3650 ChangeNotifierProvider (create: (_) => ConnectionStateProvider ()),
3751 ChangeNotifierProvider (create: (_) => CallStateProvider ()),
3852 ChangeNotifierProvider (create: (_) => GlobalBannerController ()),
53+ ChangeNotifierProvider (create: (_) => ThemeProvider ()),
3954 ],
4055 child: const AirChatApp (),
4156 ),
@@ -56,7 +71,7 @@ void main() async {
5671 callProvider.receiveIncomingCall (from, id);
5772 } else if (type == 'call_accept' ) {
5873 callProvider.acceptCall ();
59- } else if (type == 'call_reject' || type == 'call_end' ) {
74+ } else if (type == 'call_reject' || type == 'call_end' ) {
6075 await ConnectionService .updateCallDuration (
6176 callProvider.currentCallUserId! ,
6277 callProvider.callId! ,
@@ -76,30 +91,36 @@ class AirChatApp extends StatelessWidget {
7691
7792 @override
7893 Widget build (BuildContext context) {
79- return MaterialApp (
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- ],
94+ return Consumer <ThemeProvider >(
95+ builder: (context, themeProvider, _) {
96+ return MaterialApp (
97+ title: 'AirChat' ,
98+ color: Colors .white,
99+ theme: AirChatTheme .lightTheme,
100+ darkTheme: AirChatTheme .darkTheme,
101+ themeMode: themeProvider.themeMode,
102+ debugShowCheckedModeBanner: false ,
103+ navigatorKey: navigatorKey,
104+ initialRoute: '/' ,
105+ routes: {
106+ '/' : (context) => const HomeScreen (),
107+ '/home' : (context) => const HomeScreen (),
108+ '/settings' : (context) => const SettingsScreen (),
109+ },
110+ builder: (context, child) {
111+ return Consumer2 <GlobalBannerController , CallStateProvider >(
112+ builder: (context, bannerController, callProvider, _) {
113+ return Column (
114+ mainAxisSize: MainAxisSize .max,
115+ children: [
116+ if (! callProvider.isCallingScreenOpen &&
117+ callProvider.callState != CallState .idle &&
118+ callProvider.callState != CallState .ended)
119+ CallOverlayWidget (navigatorKey: navigatorKey),
120+ Expanded (child: child ?? SizedBox .shrink ()),
121+ ],
122+ );
123+ },
103124 );
104125 },
105126 );
0 commit comments