diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 0badbc15..8a898b4c 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -25,18 +25,18 @@ class BaseAppClient { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); String token = await sharedPref.getString(TOKEN); var user = await sharedPref.getObject(USER_PROFILE); - body['SetupID'] = SETUP_ID; - body['VersionID'] = VERSION_ID; - body['Channel'] = CHANNEL; - body['LanguageID'] = LANGUAGE; - body['IPAdress'] = IP_ADDRESS; - body['generalid'] = GENERAL_ID; - body['PatientOutSA'] = PATIENT_OUT_SA; - body['SessionID'] = SESSION_ID; - body['isDentalAllowedBackend'] = IS_DENTAL_ALLOWED_BACKEND; - body['DeviceTypeID'] = DeviceTypeID; - body['PatientType'] = PATIENT_TYPE; - body['PatientTypeID'] = PATIENT_TYPE_ID; + // body['SetupID'] = SETUP_ID; + // body['VersionID'] = VERSION_ID; + // body['Channel'] = CHANNEL; + // body['LanguageID'] = LANGUAGE; + // body['IPAdress'] = IP_ADDRESS; + // body['generalid'] = GENERAL_ID; + // body['PatientOutSA'] = PATIENT_OUT_SA; + // body['SessionID'] = SESSION_ID; + // body['isDentalAllowedBackend'] = IS_DENTAL_ALLOWED_BACKEND; + // body['DeviceTypeID'] = DeviceTypeID; + // body['PatientType'] = PATIENT_TYPE; + // body['PatientTypeID'] = PATIENT_TYPE_ID; if (user != null) { body['TokenID'] = token; //user['TokenID']; body['PatientID'] = user['PatientID']; diff --git a/lib/main.dart b/lib/main.dart index 8ad06ce9..99924b35 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,7 @@ import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'config/size_config.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; void main() { setupLocator(); @@ -28,10 +28,14 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider( create: (context) => ProjectViewModel(), ), - // ChangeNotifierProvider( - // create: (context) => SearchProvider()), + ChangeNotifierProvider( + create: (context) => SearchProvider()), ChangeNotifierProvider.value( value: SearchProvider(), + ), + StreamProvider.value( + value: RobotProvider().intStream(), + initialData: RobotProvider().setValue({}), ) ], child: Consumer( diff --git a/lib/pages/BookAppointment/BookingOptions.dart b/lib/pages/BookAppointment/BookingOptions.dart index 7a9f449e..dacb25e9 100644 --- a/lib/pages/BookAppointment/BookingOptions.dart +++ b/lib/pages/BookAppointment/BookingOptions.dart @@ -1,14 +1,19 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/CardCommon.dart'; +import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../uitl/translations_delegate_base.dart'; class BookingOptions extends StatelessWidget { + final bool isAppbar; + BookingOptions({this.isAppbar = false}); @override Widget build(BuildContext context) { + final searchValue = Provider.of(context); return AppScaffold( - isShowAppBar: false, + isShowAppBar: isAppbar, appBarTitle: TranslationBase.of(context).bookAppo, body: Container( margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 10.0), @@ -29,17 +34,18 @@ class BookingOptions extends StatelessWidget { children: [ Expanded( child: CardCommon( - image: - 'assets/images/new-design/search_by_clinic.png', - text: TranslationBase.of(context).clinic, - subText: TranslationBase.of(context).name), + image: 'assets/images/new-design/search_by_clinic.png', + text: TranslationBase.of(context).clinic, + subText: TranslationBase.of(context).name, + type: 0, + ), ), Expanded( child: CardCommon( - image: - 'assets/images/new-design/search_by_doctor.png', + image: 'assets/images/new-design/search_by_doctor.png', text: TranslationBase.of(context).doctor, - subText: TranslationBase.of(context).name), + subText: TranslationBase.of(context).name, + type: 1), ) ], ), diff --git a/lib/pages/BookAppointment/Search.dart b/lib/pages/BookAppointment/Search.dart index 55fa943e..d759fafa 100644 --- a/lib/pages/BookAppointment/Search.dart +++ b/lib/pages/BookAppointment/Search.dart @@ -1,9 +1,12 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByClinic.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByDoctor.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/floating_button_search.dart'; import 'package:flutter/material.dart'; class Search extends StatefulWidget { + final int type; + Search({this.type = 0}); @override _SearchState createState() => _SearchState(); } @@ -13,7 +16,9 @@ class _SearchState extends State with SingleTickerProviderStateMixin { @override void initState() { - _tabController = new TabController(length: 2, vsync: this); + _tabController = + new TabController(length: 2, vsync: this, initialIndex: widget.type); + super.initState(); } @@ -36,6 +41,7 @@ class _SearchState extends State with SingleTickerProviderStateMixin { body: TabBarView( physics: NeverScrollableScrollPhysics(), children: [SearchByClinic(), SearchByDoctor()], - controller: _tabController)); + controller: _tabController), + floatingActionButton: FloatingSearchButton()); } } diff --git a/lib/pages/BookAppointment/components/SearchByClinic.dart b/lib/pages/BookAppointment/components/SearchByClinic.dart index 63053077..8a6321ad 100644 --- a/lib/pages/BookAppointment/components/SearchByClinic.dart +++ b/lib/pages/BookAppointment/components/SearchByClinic.dart @@ -1,11 +1,15 @@ +import 'dart:convert'; + import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Clinics/ClinicListResponse.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; +import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; +import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; - +import 'package:provider/provider.dart'; import '../SearchResults.dart'; class SearchByClinic extends StatefulWidget { @@ -16,17 +20,26 @@ class SearchByClinic extends StatefulWidget { class _SearchByClinicState extends State { bool nearestAppo = false; String dropdownValue; + var event = RobotProvider(); List clinicsList = []; @override void initState() { - WidgetsBinding.instance - .addPostFrameCallback((_) => getClinicsList()); + WidgetsBinding.instance.addPostFrameCallback((_) => getClinicsList()); + super.initState(); } @override Widget build(BuildContext context) { + event.controller.stream.listen((p) { + if (p['Id'] != null) { + setState(() { + dropdownValue = p['Id']; + getDoctorsList(context); + }); + } + }); return Container( margin: EdgeInsets.all(10.0), child: Column( @@ -57,8 +70,8 @@ class _SearchByClinicState extends State { ), borderRadius: BorderRadius.circular(10), ), - margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 20.0), - padding: EdgeInsets.all(10.0), + // margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 20.0), + padding: EdgeInsets.all(8.0), width: MediaQuery.of(context).size.width, child: DropdownButtonHideUnderline( child: DropdownButton( @@ -73,7 +86,7 @@ class _SearchByClinicState extends State { onChanged: (newValue) { setState(() { dropdownValue = newValue; - print(dropdownValue); + getDoctorsList(context); }); }, diff --git a/lib/pages/BookAppointment/widgets/CardCommon.dart b/lib/pages/BookAppointment/widgets/CardCommon.dart index 2f05fa91..a6cf648f 100644 --- a/lib/pages/BookAppointment/widgets/CardCommon.dart +++ b/lib/pages/BookAppointment/widgets/CardCommon.dart @@ -5,23 +5,24 @@ class CardCommon extends StatelessWidget { final image; final text; final subText; - + final type; const CardCommon( - {@required this.image, @required this.text, @required this.subText}); + {@required this.image, + @required this.text, + @required this.subText, + @required this.type}); @override Widget build(BuildContext context) { - return GestureDetector( onTap: () { - navigateToSearch(context); + navigateToSearch(context, this.type); }, child: Container( margin: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0), decoration: BoxDecoration(boxShadow: [ BoxShadow(color: Colors.grey[400], blurRadius: 2.0, spreadRadius: 0.0) - ], borderRadius: BorderRadius.circular(10), - color: Colors.white), + ], borderRadius: BorderRadius.circular(10), color: Colors.white), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -39,9 +40,7 @@ class CardCommon extends StatelessWidget { child: Text(this.subText, overflow: TextOverflow.clip, style: TextStyle( - color: Colors.black, - letterSpacing: 1.0, - fontSize: 15.0)), + color: Colors.black, letterSpacing: 1.0, fontSize: 15.0)), ), Container( alignment: Alignment.bottomRight, @@ -54,9 +53,12 @@ class CardCommon extends StatelessWidget { ); } - Future navigateToSearch(context) async { + Future navigateToSearch(context, type) async { Navigator.push( - context, MaterialPageRoute(builder: (context) => Search())); + context, + MaterialPageRoute( + builder: (context) => Search( + type: type, + ))); } - } diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 89227ee7..1011e08b 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Authentication/select_device_imei_res.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; @@ -22,8 +23,7 @@ class LandingPage extends StatefulWidget { _LandingPageState createState() => _LandingPageState(); } -class _LandingPageState extends State - with SingleTickerProviderStateMixin { +class _LandingPageState extends State { int currentTab = 0; PageController pageController; ProjectViewModel projectProvider; @@ -94,7 +94,8 @@ class _LandingPageState extends State HomePage(), MedicalProfilePage(), MyAdmissionsPage(), - ToDo() + ToDo(), + BookingOptions() ], ), bottomNavigationBar: BottomNavBar(changeIndex: _changeCurrentTab), diff --git a/lib/services/robo_search/event_provider.dart b/lib/services/robo_search/event_provider.dart new file mode 100644 index 00000000..a01b1318 --- /dev/null +++ b/lib/services/robo_search/event_provider.dart @@ -0,0 +1,25 @@ +import 'dart:async'; + +class RobotProvider { + static final RobotProvider _singleton = RobotProvider._internal(); + var value; + StreamController controller = StreamController.broadcast(); + + getData() { + // return data; + } + intStream() { + controller.add({}); + } + + setValue(Map data) { + value = data; + controller.add(value); + } + + factory RobotProvider() { + return _singleton; + } + + RobotProvider._internal(); +} diff --git a/lib/services/robo_search/search_provider.dart b/lib/services/robo_search/search_provider.dart index 03ce6480..bd129d1b 100644 --- a/lib/services/robo_search/search_provider.dart +++ b/lib/services/robo_search/search_provider.dart @@ -3,17 +3,13 @@ import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart'; import 'package:flutter/cupertino.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'dart:async'; -import 'dart:math' as Math; + +import 'package:flutter/material.dart'; class SearchProvider with ChangeNotifier { bool isLogin = false; bool isLoading = true; - Map pageData = {}; - Map get value => pageData; - ProjectViewModel projectProvider = ProjectViewModel(); - // AuthProvider() { - // // getLisner(); - // } + dynamic pageData = {}; Future getBotPages(request) async { try { @@ -21,7 +17,7 @@ class SearchProvider with ChangeNotifier { onSuccess: (dynamic response, int statusCode) { pageData = response; - notifyListeners(); + // notifyListeners(); }, onFailure: (String error, int statusCode) { throw error; }, body: request); @@ -34,7 +30,7 @@ class SearchProvider with ChangeNotifier { } setLisener(data) { - pageData["id"] = 100; + //SearchProvider.pageData = data; //projectProvider.setSearchValue(pageData); notifyListeners(); } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 50cac52e..89fb88d4 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -1,10 +1,11 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - +import 'floating_button_search.dart'; import '../progress_indicator/app_loader_widget.dart'; import 'arrow_back.dart'; import 'network_base_view.dart'; @@ -53,7 +54,7 @@ class AppScaffold extends StatelessWidget { icon: Icon(FontAwesomeIcons.home), color: Colors.white, onPressed: () { - // TODO add navigator to home page + Navigator.of(context).pushNamed(HOME); }, ), ], @@ -66,14 +67,7 @@ class AppScaffold extends StatelessWidget { ) : buildBodyWidget(), bottomSheet: bottomSheet, - floatingActionButton: Padding( - padding: const EdgeInsets.only(bottom: 80), - child: FloatingActionButton( - child: Icon(Icons.mic), - onPressed: () { - roboSearch(context); - }, - )), + floatingActionButton: FloatingSearchButton(), ); } @@ -84,9 +78,4 @@ class AppScaffold extends StatelessWidget { buildBodyWidget() { return Stack(children: [body, buildAppLoaderWidget(isLoading)]); } - - roboSearch(context) { - var dialog = RoboSearch(context: context); - dialog.showAlertDialog(context); - } } diff --git a/lib/widgets/others/floating_button_search.dart b/lib/widgets/others/floating_button_search.dart new file mode 100644 index 00000000..92b0b45f --- /dev/null +++ b/lib/widgets/others/floating_button_search.dart @@ -0,0 +1,21 @@ +import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; +import 'package:flutter/material.dart'; + +class FloatingSearchButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 80), + child: FloatingActionButton( + child: Icon(Icons.mic), + onPressed: () { + roboSearch(context); + }, + )); + } + + roboSearch(context) { + var dialog = RoboSearch(context: context); + dialog.showAlertDialog(context); + } +} diff --git a/lib/widgets/robo-search/search.dart b/lib/widgets/robo-search/search.dart index 30d352b0..25f29ba0 100644 --- a/lib/widgets/robo-search/search.dart +++ b/lib/widgets/robo-search/search.dart @@ -1,10 +1,13 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; @@ -17,6 +20,7 @@ import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; import 'dart:math'; +import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; class SearchBot extends StatefulWidget { @override @@ -25,8 +29,8 @@ class SearchBot extends StatefulWidget { class _SearchBot extends State { // DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); - // SearchProvider searchProvider = new SearchProvider(); - ProjectViewModel projectProvider = ProjectViewModel(); + SearchProvider searchProvider = new SearchProvider(); + RobotProvider eventProvider = RobotProvider(); bool isLoading = false; bool isError = false; final SpeechToText speech = SpeechToText(); @@ -34,11 +38,12 @@ class _SearchBot extends State { String _currentLocaleId = ""; String lastError; double level = 0.0; - double minSoundLevel = 10000; - double maxSoundLevel = -10000; + + double minSoundLevel = 50000; + double maxSoundLevel = -50000; String reconizedWord = ''; FlutterTts flutterTts = FlutterTts(); - + var selectedLang; bool isSearching = false; String lastStatus; @@ -68,6 +73,9 @@ class _SearchBot extends State { child: FlatButton( child: Text('Start'), onPressed: () { + setState(() { + reconizedWord = 'Lisening...'; + }); startVoiceSearch(); }, ), @@ -107,9 +115,6 @@ class _SearchBot extends State { await flutterTts.speak(reconizedWord); getPages(reconizedWord); - //Future.delayed(const Duration(seconds: 2), () { - // - // }); } void soundLevelListener(double level) { @@ -145,7 +150,7 @@ class _SearchBot extends State { void statusListener(String status) { setState(() { - reconizedWord = status == 'listening' ? 'Lisening...' : 'Wait....'; + reconizedWord = status == 'listening' ? 'Lisening...' : 'Sorry....'; }); } @@ -155,23 +160,57 @@ class _SearchBot extends State { 'Lang': TranslationBase.of(context).locale.languageCode == 'en' ? 'En' : 'Ar' }; - if (text == 'book appointment') { - Navigator.push(context, FadePage(page: MyAdmissionsPage())); - } - // //searchProvider.setLisener(request); - // // searchProvider.getBotPages(request).then((result) => getCommands(result)); - // // var dialog = RoboSearch(context: context); - // //projectProvider.setSearchValue(request); - // RoboSearch.closeAlertDialog(context); - // PageController pageController; - // pageController.jumpToPage(1); - - // landing._changeCurrentTab(1); + searchProvider + .getBotPages(request) + .then((value) => {getCommands(value['Response'], value['Understand'])}); } - getCommands(result) { - isSearching = false; - print(result); + getCommands(result, understand) async { + RoboSearch.closeAlertDialog(context); + + switch (result["CommandNumber"]) { + case '100': + Navigator.push( + context, + FadePage( + page: BookingOptions( + isAppbar: true, + ))); + break; + case '101': + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => Search( + type: 0, + ))); + break; + case '102': + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => Search( + type: 1, + ))); + break; + case '103': + eventProvider.setValue(understand); + break; + default: + { + eventProvider.setValue({"Id": "17"}); + // if (result['CommandNumber'] == '0') { + // searchProvider.setData(understand); + // } + } + break; + } + if (_currentLocaleId == 'en-GB') { + await flutterTts.speak(result['ResponseEn']); + } else { + await flutterTts.speak(result['ResponseAr']); + } + //searchProvider.setLisener(result); } }