diff --git a/app/assets/images/no_internet.png b/app/assets/images/no_internet.png new file mode 100644 index 000000000000..486a92decc5d Binary files /dev/null and b/app/assets/images/no_internet.png differ diff --git a/app/lib/controllers/network_controller.dart b/app/lib/controllers/network_controller.dart new file mode 100644 index 000000000000..b9df5ad91457 --- /dev/null +++ b/app/lib/controllers/network_controller.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class NetworkController extends GetxController { + static NetworkController to = Get.find(); + + var connectionType = ''.obs; + final Connectivity _connectivity = Connectivity(); + late StreamSubscription _streamSubscription; + + @override + void onInit() { + super.onInit(); + _getConnectionType(); + _streamSubscription = + _connectivity.onConnectivityChanged.listen(_updateState); + } + + Future _getConnectionType() async { + ConnectivityResult? connectivityResult; + try { + connectivityResult = await (_connectivity.checkConnectivity()); + } on PlatformException catch (e) { + debugPrint(e.toString()); + } + return _updateState(connectivityResult!); + } + + void _updateState(ConnectivityResult result) { + switch (result) { + case ConnectivityResult.wifi: + connectionType = '1'.obs; + update(); + break; + case ConnectivityResult.mobile: + connectionType = '2'.obs; + update(); + break; + case ConnectivityResult.none: + connectionType = '0'.obs; + update(); + break; + default: + Get.snackbar('Network Error', 'Failed to get Network Status'); + break; + } + } + + @override + void onClose() { + _streamSubscription.cancel(); + super.onClose(); + } +} diff --git a/app/lib/screens/HomeScreens/chat/ChatScreen.dart b/app/lib/screens/HomeScreens/chat/ChatScreen.dart index b44ecc22ba45..98949be99973 100644 --- a/app/lib/screens/HomeScreens/chat/ChatScreen.dart +++ b/app/lib/screens/HomeScreens/chat/ChatScreen.dart @@ -6,6 +6,7 @@ import 'package:effektio/common/store/themes/ChatTheme.dart'; import 'package:effektio/common/store/themes/SeperatedThemes.dart'; import 'package:effektio/controllers/chat_list_controller.dart'; import 'package:effektio/controllers/chat_room_controller.dart'; +import 'package:effektio/controllers/network_controller.dart'; import 'package:effektio/screens/HomeScreens/chat/ChatProfile.dart'; import 'package:effektio/widgets/AppCommon.dart'; import 'package:effektio/widgets/ChatBubbleBuilder.dart'; @@ -48,12 +49,15 @@ class ChatScreen extends StatefulWidget { class _ChatScreenState extends State { ChatRoomController roomController = Get.find(); ChatListController listController = Get.find(); + final networkController = Get.put(NetworkController()); @override void initState() { super.initState(); - roomController.setCurrentRoom(widget.room); + if (networkController.connectionType.value != '0') { + roomController.setCurrentRoom(widget.room); + } } @override @@ -297,7 +301,9 @@ class _ChatScreenState extends State { body: Obx( () => SafeArea( bottom: false, - child: buildBody(context), + child: networkController.connectionType.value == '0' + ? noInternetWidget() + : buildBody(context), ), ), ); diff --git a/app/lib/screens/HomeScreens/chat/Overview.dart b/app/lib/screens/HomeScreens/chat/Overview.dart index 6b1f9c01f688..0bdf2fbeeaa4 100644 --- a/app/lib/screens/HomeScreens/chat/Overview.dart +++ b/app/lib/screens/HomeScreens/chat/Overview.dart @@ -2,6 +2,7 @@ import 'dart:ui'; import 'package:effektio/common/store/themes/SeperatedThemes.dart'; import 'package:effektio/controllers/chat_list_controller.dart'; +import 'package:effektio/controllers/network_controller.dart'; import 'package:effektio/widgets/AppCommon.dart'; import 'package:effektio/widgets/ChatListItem.dart'; import 'package:effektio/widgets/InviteInfoWidget.dart'; @@ -25,78 +26,87 @@ class ChatOverview extends StatefulWidget { } class _ChatOverviewState extends State { + final networkController = Get.put(NetworkController()); + @override Widget build(BuildContext context) { - return Scaffold( - body: CustomScrollView( - physics: const BouncingScrollPhysics(), - slivers: [ - SliverAppBar( - pinned: false, - snap: false, - floating: true, - leading: TextButton( - onPressed: () {}, - child: Container( - margin: const EdgeInsets.only(right: 15), - child: Text( - AppLocalizations.of(context)!.chat, - style: AppCommonTheme.appBarTitleStyle, - ), - ), - ), - leadingWidth: 100, - actions: [ - IconButton( - onPressed: () { - showNotYetImplementedMsg( - context, - 'Chat Search is not implemented yet', - ); - }, - padding: const EdgeInsets.only(right: 10, left: 5), - icon: const Icon( - FlutterIcons.search1_ant, - color: AppCommonTheme.svgIconColor, - ), - ), - IconButton( - onPressed: () { - showNotYetImplementedMsg( - context, - 'Multiselect is not implemented yet', - ); - }, - padding: const EdgeInsets.only(right: 10, left: 5), - icon: const Icon( - FlutterIcons.select_mco, - color: AppCommonTheme.svgIconColor, - ), - ), - IconButton( - onPressed: () { - showNotYetImplementedMsg( - context, - 'Starting a new chat is not implemented yet', - ); - }, - padding: const EdgeInsets.only(right: 10, left: 10), - icon: const Icon( - FlutterIcons.md_add_ion, - color: AppCommonTheme.svgIconColor, - ), + return Obx( + () => Scaffold( + body: networkController.connectionType.value == '0' + ? noInternetWidget() + : CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + SliverAppBar( + pinned: false, + snap: false, + floating: true, + leading: TextButton( + onPressed: () {}, + child: Container( + margin: const EdgeInsets.only(right: 15), + child: Text( + AppLocalizations.of(context)!.chat, + style: AppCommonTheme.appBarTitleStyle, + ), + ), + ), + leadingWidth: 100, + actions: [ + IconButton( + onPressed: () { + showNotYetImplementedMsg( + context, + 'Chat Search is not implemented yet', + ); + }, + padding: const EdgeInsets.only(right: 10, left: 5), + icon: const Icon( + FlutterIcons.search1_ant, + color: AppCommonTheme.svgIconColor, + ), + ), + IconButton( + onPressed: () { + showNotYetImplementedMsg( + context, + 'Multiselect is not implemented yet', + ); + }, + padding: const EdgeInsets.only(right: 10, left: 5), + icon: const Icon( + FlutterIcons.select_mco, + color: AppCommonTheme.svgIconColor, + ), + ), + IconButton( + onPressed: () { + showNotYetImplementedMsg( + context, + 'Starting a new chat is not implemented yet', + ); + }, + padding: const EdgeInsets.only(right: 10, left: 10), + icon: const Icon( + FlutterIcons.md_add_ion, + color: AppCommonTheme.svgIconColor, + ), + ), + ], + ), + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (widget.client.isGuest()) + empty + else + buildList(context), + ], + ), + ), + ], ), - ], - ), - SliverToBoxAdapter( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (widget.client.isGuest()) empty else buildList(context), - ], - ), - ), - ], ), ); } diff --git a/app/lib/screens/HomeScreens/faq/Overview.dart b/app/lib/screens/HomeScreens/faq/Overview.dart index b9575d0ad2d4..435287407077 100644 --- a/app/lib/screens/HomeScreens/faq/Overview.dart +++ b/app/lib/screens/HomeScreens/faq/Overview.dart @@ -1,6 +1,7 @@ import 'package:effektio/common/store/themes/SeperatedThemes.dart'; import 'package:effektio/controllers/FaqController.dart'; -// import 'package:effektio/screens/HomeScreens/faq/Editor.dart'; +import 'package:effektio/controllers/network_controller.dart'; +import 'package:effektio/widgets/AppCommon.dart'; import 'package:effektio/widgets/FaqListItem.dart'; import 'package:effektio_flutter_sdk/effektio_flutter_sdk_ffi.dart'; import 'package:flutter/material.dart'; @@ -16,112 +17,136 @@ class FaqOverviewScreen extends StatefulWidget { class _FaqOverviewScreenState extends State { final faqController = Get.put(FaqController()); + final networkController = Get.put(NetworkController()); @override Widget build(BuildContext context) { return FutureBuilder( future: widget.client.faqs(), builder: (BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) { - return Container( - height: MediaQuery.of(context).size.height, - width: MediaQuery.of(context).size.width, - color: AppCommonTheme.backgroundColor, - child: const Center( - child: SizedBox( - height: 50, - width: 50, - child: CircularProgressIndicator( - color: AppCommonTheme.primaryColor, - ), - ), - ), - ); - } else { - return Scaffold( - body: Container( - decoration: PinsTheme.pinsDecoration, - child: Padding( - padding: const EdgeInsets.only(top: 25), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Padding( - padding: EdgeInsets.only(left: 12), - child: Text('Pins', style: PinsTheme.titleTextStyle), - ), - Padding( - padding: const EdgeInsets.only( - top: 5, - bottom: 6, - left: 10, - right: 10, - ), - child: TextField( - onChanged: (value) { - faqController.searchedData(value, snapshot); - }, - controller: faqController.searchController, - style: ToDoTheme.taskTitleTextStyle.copyWith( - fontWeight: FontWeight.w500, - ), - cursorColor: ToDoTheme.primaryTextColor, - decoration: InputDecoration( - hintStyle: const TextStyle( - color: Colors.white, - fontSize: 13, - ), - suffixIcon: const Icon( - Icons.search, - color: Colors.white, - ), - contentPadding: const EdgeInsets.only( - left: 12, - bottom: 2, - top: 2, + return Obx( + () => Container( + child: networkController.connectionType.value == '0' + ? noInternetWidget() + : (!snapshot.hasData) + ? Container( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + color: AppCommonTheme.backgroundColor, + child: const Center( + child: SizedBox( + height: 50, + width: 50, + child: CircularProgressIndicator( + color: AppCommonTheme.primaryColor, + ), ), - border: OutlineInputBorder( - borderSide: const BorderSide(color: Colors.white), - borderRadius: BorderRadius.circular(20.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: const BorderSide(color: Colors.white), - borderRadius: BorderRadius.circular(30.0), - ), - enabledBorder: OutlineInputBorder( - borderSide: const BorderSide(color: Colors.white), - borderRadius: BorderRadius.circular(30.0), + ), + ) + : Scaffold( + body: Container( + decoration: PinsTheme.pinsDecoration, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.only(left: 12), + child: Text( + 'Pins', + style: PinsTheme.titleTextStyle, + ), + ), + Padding( + padding: const EdgeInsets.only( + top: 5, + bottom: 6, + left: 10, + right: 10, + ), + child: TextField( + onChanged: (value) { + faqController.searchedData( + value, + snapshot, + ); + }, + controller: faqController.searchController, + style: + ToDoTheme.taskTitleTextStyle.copyWith( + fontWeight: FontWeight.w500, + ), + cursorColor: ToDoTheme.primaryTextColor, + decoration: InputDecoration( + hintStyle: const TextStyle( + color: Colors.white, + fontSize: 13, + ), + suffixIcon: const Icon( + Icons.search, + color: Colors.white, + ), + contentPadding: const EdgeInsets.only( + left: 12, + bottom: 2, + top: 2, + ), + border: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.white, + ), + borderRadius: + BorderRadius.circular(20.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.white, + ), + borderRadius: + BorderRadius.circular(30.0), + ), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.white, + ), + borderRadius: + BorderRadius.circular(30.0), + ), + ), + ), + ), + GetBuilder( + builder: (FaqController controller) { + return Expanded( + child: ListView.builder( + padding: const EdgeInsets.all(8), + shrinkWrap: true, + itemCount: controller.searchData.isEmpty + ? snapshot.requireData.length + : controller.searchData.length, + itemBuilder: ( + BuildContext context, + int index, + ) { + return FaqListItem( + client: widget.client, + faq: controller.searchData.isEmpty + ? snapshot.requireData[index] + : controller.searchData[index], + ); + }, + ), + ); + }, + ), + ], + ), ), ), ), - ), - GetBuilder( - builder: (FaqController controller) { - return Expanded( - child: ListView.builder( - padding: const EdgeInsets.all(8), - shrinkWrap: true, - itemCount: controller.searchData.isEmpty - ? snapshot.requireData.length - : controller.searchData.length, - itemBuilder: (BuildContext context, int index) { - return FaqListItem( - client: widget.client, - faq: controller.searchData.isEmpty - ? snapshot.requireData[index] - : controller.searchData[index], - ); - }, - ), - ); - }, - ), - ], - ), - ), - ), - ); - } + ), + ); }, ); } diff --git a/app/lib/screens/HomeScreens/news/News.dart b/app/lib/screens/HomeScreens/news/News.dart index bbecb185fea5..efd2bde87a0b 100644 --- a/app/lib/screens/HomeScreens/news/News.dart +++ b/app/lib/screens/HomeScreens/news/News.dart @@ -1,9 +1,12 @@ import 'package:effektio/common/animations/LikeAnimation.dart'; import 'package:effektio/common/store/themes/SeperatedThemes.dart'; +import 'package:effektio/controllers/network_controller.dart'; +import 'package:effektio/widgets/AppCommon.dart'; import 'package:effektio/widgets/NewsItem.dart'; import 'package:effektio/widgets/SideMenu.dart'; import 'package:effektio_flutter_sdk/effektio_flutter_sdk_ffi.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; class NewsScreen extends StatefulWidget { final Client client; @@ -24,6 +27,7 @@ class NewsScreen extends StatefulWidget { class _NewsScreenState extends State with SingleTickerProviderStateMixin { late AnimationController controller; + final networkController = Get.put(NetworkController()); @override void initState() { @@ -40,121 +44,130 @@ class _NewsScreenState extends State return FutureBuilder( future: widget.client.latestNews(), builder: (BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) { - return SizedBox( - height: MediaQuery.of(context).size.height, - width: MediaQuery.of(context).size.width, - child: const Center( - child: SizedBox( - height: 50, - width: 50, - child: CircularProgressIndicator( - color: AppCommonTheme.primaryColor, - ), - ), - ), - ); - } else { - //final items = snapshot.requireData.toList(); - return Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - backgroundColor: Colors.transparent, - leading: Builder( - builder: (BuildContext context) { - return IconButton( - icon: Container( - margin: const EdgeInsets.only(bottom: 10, left: 10), - child: CircleAvatar( - backgroundColor: AppCommonTheme.primaryColor, - child: Image.asset('assets/images/hamburger.png'), - ), - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, - tooltip: - MaterialLocalizations.of(context).openAppDrawerTooltip, - ); - }, - ), - centerTitle: true, - title: const ButtonBar( - alignment: MainAxisAlignment.center, - children: [ - Text( - 'All', - style: TextStyle( - color: Colors.white, - fontSize: 14, - shadows: [ - Shadow( - blurRadius: 1.0, - color: Colors.black, + return Obx( + () => Container( + child: networkController.connectionType.value == '0' + ? noInternetWidget() + : (!snapshot.hasData) + ? SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + child: const Center( + child: SizedBox( + height: 50, + width: 50, + child: CircularProgressIndicator( + color: AppCommonTheme.primaryColor, + ), + ), ), - ], - fontWeight: FontWeight.w100, - ), - ), - Text( - 'News', - style: TextStyle( - color: Colors.white, - fontSize: 14, - shadows: [ - Shadow( - blurRadius: 5.0, - color: Colors.white, + ) + : Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + backgroundColor: Colors.transparent, + leading: Builder( + builder: (BuildContext context) { + return IconButton( + icon: Container( + margin: const EdgeInsets.only( + bottom: 10, + left: 10, + ), + child: CircleAvatar( + backgroundColor: + AppCommonTheme.primaryColor, + child: Image.asset( + 'assets/images/hamburger.png', + ), + ), + ), + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + tooltip: MaterialLocalizations.of(context) + .openAppDrawerTooltip, + ); + }, + ), + centerTitle: true, + title: const ButtonBar( + alignment: MainAxisAlignment.center, + children: [ + Text( + 'All', + style: TextStyle( + color: Colors.white, + fontSize: 14, + shadows: [ + Shadow( + blurRadius: 1.0, + color: Colors.black, + ), + ], + fontWeight: FontWeight.w100, + ), + ), + Text( + 'News', + style: TextStyle( + color: Colors.white, + fontSize: 14, + shadows: [ + Shadow( + blurRadius: 5.0, + color: Colors.white, + ), + Shadow( + blurRadius: 3.0, + color: Colors.black, + ), + ], + fontWeight: FontWeight.w900, + ), + ), + Text( + 'Stories', + style: TextStyle( + color: Colors.white, + fontSize: 14, + shadows: [ + Shadow( + blurRadius: 1.0, + color: Colors.black, + ), + ], + fontWeight: FontWeight.w100, + ), + ), + ], + ), ), - Shadow( - blurRadius: 3.0, - color: Colors.black, + drawer: SideDrawer( + isGuest: widget.client.isGuest(), + userId: widget.client.userId().toString(), + displayName: widget.displayName, + displayAvatar: widget.displayAvatar, ), - ], - fontWeight: FontWeight.w900, - ), - ), - Text( - 'Stories', - style: TextStyle( - color: Colors.white, - fontSize: 14, - shadows: [ - Shadow( - blurRadius: 1.0, - color: Colors.black, + body: PageView.builder( + itemCount: snapshot.requireData.length, + onPageChanged: (int page) {}, + scrollDirection: Axis.vertical, + itemBuilder: (context, index) => InkWell( + onDoubleTap: () { + LikeAnimation.run(index); + }, + child: NewsItem( + client: widget.client, + news: snapshot.requireData[index], + index: index, + ), + ), ), - ], - fontWeight: FontWeight.w100, - ), - ), - ], - ), - ), - drawer: SideDrawer( - isGuest: widget.client.isGuest(), - userId: widget.client.userId().toString(), - displayName: widget.displayName, - displayAvatar: widget.displayAvatar, - ), - body: PageView.builder( - itemCount: snapshot.requireData.length, - onPageChanged: (int page) {}, - scrollDirection: Axis.vertical, - itemBuilder: (context, index) => InkWell( - onDoubleTap: () { - LikeAnimation.run(index); - }, - child: NewsItem( - client: widget.client, - news: snapshot.requireData[index], - index: index, - ), - ), - ), - ); - } + ), + ), + ); }, ); } diff --git a/app/lib/screens/OnboardingScreens/LogIn.dart b/app/lib/screens/OnboardingScreens/LogIn.dart index 972124961328..829b81d2c74f 100644 --- a/app/lib/screens/OnboardingScreens/LogIn.dart +++ b/app/lib/screens/OnboardingScreens/LogIn.dart @@ -1,5 +1,6 @@ import 'package:effektio/common/store/themes/SeperatedThemes.dart'; import 'package:effektio/controllers/login_controller.dart'; +import 'package:effektio/controllers/network_controller.dart'; import 'package:effektio/widgets/OnboardingWidget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -17,12 +18,13 @@ class LoginScreen extends StatefulWidget { class _LoginScreenState extends State { final formKey = GlobalKey(); final loginController = Get.put(LoginController()); + final networkController = Get.put(NetworkController()); @override void dispose() { // Clean up the controller when the widget is disposed. Get.delete(); - + Get.delete(); super.dispose(); } @@ -111,8 +113,17 @@ class _LoginScreenState extends State { onPressed: () async { controller.isSubmitting = true; if (formKey.currentState!.validate()) { - if (await validateLogin()) { - Navigator.pushReplacementNamed(context, '/'); + if (networkController.connectionType.value == + '0') { + Get.snackbar( + 'No internet', + 'Please turn on internet to continue', + colorText: Colors.white, + ); + } else { + if (await validateLogin()) { + Navigator.pushReplacementNamed(context, '/'); + } } } }, diff --git a/app/lib/screens/OnboardingScreens/Signup.dart b/app/lib/screens/OnboardingScreens/Signup.dart index d5b1ce3b28eb..ea07671f9013 100644 --- a/app/lib/screens/OnboardingScreens/Signup.dart +++ b/app/lib/screens/OnboardingScreens/Signup.dart @@ -1,4 +1,5 @@ import 'package:effektio/common/store/themes/SeperatedThemes.dart'; +import 'package:effektio/controllers/network_controller.dart'; import 'package:effektio/controllers/signup_controller.dart'; import 'package:effektio/screens/OnboardingScreens/LogIn.dart'; import 'package:effektio/widgets/OnboardingWidget.dart'; @@ -19,12 +20,13 @@ class SignupScreen extends StatefulWidget { class _SignupScreentate extends State { final formKey = GlobalKey(); final SignUpController signUpController = Get.put(SignUpController()); + final networkController = Get.put(NetworkController()); @override void dispose() { // Clean up the controller when the widget is disposed. Get.delete(); - + Get.delete(); super.dispose(); } @@ -188,8 +190,16 @@ class _SignupScreentate extends State { return CustomOnbaordingButton( onPressed: () async { if (formKey.currentState!.validate()) { - if (await validateSignUp()) { - Navigator.pushReplacementNamed(context, '/'); + if (networkController.connectionType.value == '0') { + Get.snackbar( + 'No internet', + 'Please turn on internet to continue', + colorText: Colors.white, + ); + } else { + if (await validateSignUp()) { + Navigator.pushReplacementNamed(context, '/'); + } } } }, diff --git a/app/lib/screens/SideMenuScreens/ToDo.dart b/app/lib/screens/SideMenuScreens/ToDo.dart index 89d15bb87880..c7f5971dfc73 100644 --- a/app/lib/screens/SideMenuScreens/ToDo.dart +++ b/app/lib/screens/SideMenuScreens/ToDo.dart @@ -1,5 +1,6 @@ import 'package:effektio/common/store/MockData.dart' as mock; import 'package:effektio/common/store/themes/SeperatedThemes.dart'; +import 'package:effektio/controllers/network_controller.dart'; import 'package:effektio/controllers/todo_controller.dart'; import 'package:effektio/widgets/AppCommon.dart'; import 'package:flutter/material.dart'; @@ -14,6 +15,7 @@ class ToDoScreen extends StatefulWidget { class _ToDoScreenState extends State { final ToDoController todoController = ToDoController.instance; + final networkController = Get.put(NetworkController()); List buttonText = ['Mine', 'All Teams', 'Unassigned']; @override @@ -32,60 +34,72 @@ class _ToDoScreenState extends State { @override Widget build(BuildContext context) { - return Scaffold( - extendBodyBehindAppBar: true, - floatingActionButtonLocation: FloatingActionButtonLocation.miniEndFloat, - floatingActionButton: FloatingActionButton( - backgroundColor: ToDoTheme.floatingABColor, - onPressed: () { - showNotYetImplementedMsg( - context, - 'Add Task-List Action not yet implemented', - ); - }, - child: const Icon(Icons.add_outlined, size: 25), - ), - body: Container( - decoration: ToDoTheme.toDoDecoration, - child: Padding( - padding: const EdgeInsets.only(top: 25), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Padding( - padding: EdgeInsets.only(left: 12), - child: Text('Tasks', style: ToDoTheme.titleTextStyle), - ), - const Padding( - padding: EdgeInsets.only(left: 12, top: 10), - child: Text( - mock.loremPara1, - style: ToDoTheme.subtitleTextStyle, - ), + return Obx( + () => Container( + child: networkController.connectionType.value == '0' + ? noInternetWidget() + : Scaffold( + extendBodyBehindAppBar: true, + floatingActionButtonLocation: + FloatingActionButtonLocation.miniEndFloat, + floatingActionButton: FloatingActionButton( + backgroundColor: ToDoTheme.floatingABColor, + onPressed: () { + showNotYetImplementedMsg( + context, + 'Add Task-List Action not yet implemented', + ); + }, + child: const Icon(Icons.add_outlined, size: 25), ), - Padding( - padding: const EdgeInsets.only(left: 12, top: 15), - child: Wrap( - direction: Axis.horizontal, - spacing: 5.0, - children: List.generate(buttonText.length, (int index) { - return radioButton(text: buttonText[index], index: index); - }), + body: Container( + decoration: ToDoTheme.toDoDecoration, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.only(left: 12), + child: + Text('Tasks', style: ToDoTheme.titleTextStyle), + ), + const Padding( + padding: EdgeInsets.only(left: 12, top: 10), + child: Text( + mock.loremPara1, + style: ToDoTheme.subtitleTextStyle, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 12, top: 15), + child: Wrap( + direction: Axis.horizontal, + spacing: 5.0, + children: + List.generate(buttonText.length, (int index) { + return radioButton( + text: buttonText[index], + index: index, + ); + }), + ), + ), + ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: todoController.todoList!.length, + itemBuilder: (BuildContext context, int index) { + return todoController.todoList![index]; + }, + ), + ], + ), + ), ), ), - ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: todoController.todoList!.length, - itemBuilder: (BuildContext context, int index) { - return todoController.todoList![index]; - }, - ), - ], - ), - ), - ), + ), ), ); } diff --git a/app/lib/widgets/AppCommon.dart b/app/lib/widgets/AppCommon.dart index 1e106d75b0b5..a27874c06642 100644 --- a/app/lib/widgets/AppCommon.dart +++ b/app/lib/widgets/AppCommon.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io' show Platform; import 'dart:math'; import 'package:effektio/common/store/themes/SeperatedThemes.dart'; @@ -67,6 +68,37 @@ Widget elevatedButton( ); } +Widget noInternetWidget() { + Size screenSize = WidgetsBinding.instance.window.physicalSize; + bool isDesktop = Platform.isWindows || Platform.isMacOS || Platform.isLinux; + double width = screenSize.width; + double height = screenSize.height; + return Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: Image.asset( + 'assets/images/no_internet.png', + cacheHeight: + isDesktop ? (height * 0.25).toInt() : (height * 0.10).toInt(), + cacheWidth: + isDesktop ? (width * 0.15).toInt() : (height * 0.10).toInt(), + filterQuality: FilterQuality.high, + ), + ), + const Text( + 'No internet\nPlease turn on internet to process', + style: SideMenuAndProfileTheme.profileMenuStyle, + textAlign: TextAlign.center, + ), + ], + ), + ); +} + int hexOfRGBA(int r, int g, int b, {double opacity = 1}) { r = (r < 0) ? -r : r; g = (g < 0) ? -g : g; diff --git a/app/pubspec.lock b/app/pubspec.lock index bc9dd22d614c..11057d8916ce 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -99,6 +99,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.3" cross_file: dependency: transitive description: @@ -120,6 +134,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.1" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.4" diffutil_dart: dependency: transitive description: @@ -584,6 +605,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + nm: + dependency: transitive + description: + name: nm + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" numberpicker: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 9239b7b9ec82..4759c9c3bfa9 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: flutter_mentions: ^2.0.1 flutter_html: ^3.0.0-alpha.5 flutter_icons_null_safety: ^1.1.0 + connectivity_plus: ^3.0.2 dev_dependencies: flutter_test: