diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart new file mode 100644 index 00000000..20393d92 --- /dev/null +++ b/lib/config/localized_values.dart @@ -0,0 +1,7 @@ +const Map> localizedValues = { + 'dashboardScreenToolbarTitle': {'ar': 'الرئيسة', 'en': 'Home'}, + 'settings': {'en': 'Settings', 'ar': 'الاعدادات'}, + 'language': {'en': 'App Language', 'ar': 'لغة التطبيق'}, + 'lanEnglish': {'en': 'English', 'ar': 'English'}, + 'lanArabic': {'en': 'العربية', 'ar': 'العربية'} +}; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index 3fe1f22d..8a90edf6 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -1,3 +1,4 @@ final TOKEN = 'token'; final PROJECT_ID="projectID"; -final SLECTED_PATIENT_TYPE="slectedPatientType"; \ No newline at end of file +final SLECTED_PATIENT_TYPE="slectedPatientType"; +final APP_Language = "language"; \ No newline at end of file diff --git a/lib/i18n/ar.i18n.dart b/lib/i18n/ar.i18n.dart deleted file mode 100644 index 2b768d19..00000000 --- a/lib/i18n/ar.i18n.dart +++ /dev/null @@ -1,25 +0,0 @@ -// GENERATED FILE, do not edit! -import 'package:i18n/i18n.dart' as i18n; - -String get _languageCode => 'en'; -String get _localeName => 'en'; - -String _plural(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.plural(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); -String _ordinal(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.ordinal(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); -String _cardinal(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.cardinal(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); - -class Ar { - const Ar(); - ButtonAr get button => ButtonAr(this); -} - -class ButtonAr { - final Ar _parent; - const ButtonAr(this._parent); - String get save => "حفظ"; - String get load => "تحميل"; -} - diff --git a/lib/i18n/ar.i18n.yaml b/lib/i18n/ar.i18n.yaml deleted file mode 100644 index c59964df..00000000 --- a/lib/i18n/ar.i18n.yaml +++ /dev/null @@ -1,3 +0,0 @@ -button: - save: حفظ - load: تحميل \ No newline at end of file diff --git a/lib/i18n/en.i18n.dart b/lib/i18n/en.i18n.dart deleted file mode 100644 index 9f06a223..00000000 --- a/lib/i18n/en.i18n.dart +++ /dev/null @@ -1,25 +0,0 @@ -// GENERATED FILE, do not edit! -import 'package:i18n/i18n.dart' as i18n; - -String get _languageCode => 'en'; -String get _localeName => 'en'; - -String _plural(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.plural(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); -String _ordinal(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.ordinal(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); -String _cardinal(int count, {String zero, String one, String two, String few, String many, String other}) => - i18n.cardinal(count, _languageCode, zero:zero, one:one, two:two, few:few, many:many, other:other); - -class En { - const En(); - ButtonEn get button => ButtonEn(this); -} - -class ButtonEn { - final En _parent; - const ButtonEn(this._parent); - String get save => "Save"; - String get load => "Load"; -} - diff --git a/lib/i18n/en.i18n.yaml b/lib/i18n/en.i18n.yaml deleted file mode 100644 index a4c26572..00000000 --- a/lib/i18n/en.i18n.yaml +++ /dev/null @@ -1,4 +0,0 @@ -button: - save: Save - load: Load - diff --git a/lib/main.dart b/lib/main.dart index a205b379..869d0b88 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,14 @@ +import 'package:doctor_app_flutter/providers/project_provider.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; import './config/size_config.dart'; import './providers/auth_provider.dart'; import './providers/patients_provider.dart'; -import './providers/projects_provider.dart'; +import './providers/hospital_provider.dart'; import './routes.dart'; void main() => runApp(MyApp()); @@ -22,20 +25,33 @@ class MyApp extends StatelessWidget { providers: [ ChangeNotifierProvider(create: (context) => PatientsProvider()), ChangeNotifierProvider(create: (context) => AuthProvider()), - ChangeNotifierProvider(create: (context) => ProjectsProvider()), + ChangeNotifierProvider(create: (context) => HospitalProvider()), + ChangeNotifierProvider(create: (context) => ProjectProvider(),) ], - child: MaterialApp( - showSemanticsDebugger: false, - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - primaryColor: Hexcolor('#B8382C'), - buttonColor: Hexcolor('#B8382C'), - fontFamily: 'WorkSans', - ), - initialRoute: INIT_ROUTE, - routes: routes, - debugShowCheckedModeBanner: false, + child: Consumer( + builder: (context,projectProvider,child) => MaterialApp( + showSemanticsDebugger: false, + title: 'Flutter Demo', + locale: projectProvider.appLocal, + localizationsDelegates: [ + TranslationBaseDelegate(), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: [ + const Locale('ar', ''), // Arabic + const Locale('en', ''), // English + ], + theme: ThemeData( + primarySwatch: Colors.blue, + primaryColor: Hexcolor('#B8382C'), + buttonColor: Hexcolor('#B8382C'), + fontFamily: 'WorkSans', + ), + initialRoute: INIT_ROUTE, + routes: routes, + debugShowCheckedModeBanner: false, + ) ), ); }); diff --git a/lib/models/RequestDoctorReply.dart b/lib/models/request_doctor_reply.dart similarity index 100% rename from lib/models/RequestDoctorReply.dart rename to lib/models/request_doctor_reply.dart diff --git a/lib/models/RequestSchedule.dart b/lib/models/request_schedule.dart similarity index 100% rename from lib/models/RequestSchedule.dart rename to lib/models/request_schedule.dart diff --git a/lib/providers/doctor_reply_provider.dart b/lib/providers/doctor_reply_provider.dart index 1c977185..b67cba47 100644 --- a/lib/providers/doctor_reply_provider.dart +++ b/lib/providers/doctor_reply_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/models/RequestDoctorReply.dart'; +import 'package:doctor_app_flutter/models/request_doctor_reply.dart'; import 'package:doctor_app_flutter/models/list_gt_my_pationents_question_model.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/providers/projects_provider.dart b/lib/providers/hospital_provider.dart similarity index 78% rename from lib/providers/projects_provider.dart rename to lib/providers/hospital_provider.dart index 62debed6..005a53ac 100644 --- a/lib/providers/projects_provider.dart +++ b/lib/providers/hospital_provider.dart @@ -1,18 +1,23 @@ import 'dart:convert'; import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; +import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import '../interceptor/http_interceptor.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; import 'package:http_interceptor/http_client_with_interceptor.dart'; -const GET_PROJECTS = - BASE_URL+'Lists.svc/REST/GetProjectForDoctorAPP'; +const GET_PROJECTS = BASE_URL + 'Lists.svc/REST/GetProjectForDoctorAPP'; + +class HospitalProvider with ChangeNotifier { + + -class ProjectsProvider with ChangeNotifier { Client client = HttpClientWithInterceptor.build(interceptors: [HttpInterceptor()]); + Future getProjectsList() async { const url = GET_PROJECTS; var info = { diff --git a/lib/providers/project_provider.dart b/lib/providers/project_provider.dart new file mode 100644 index 00000000..abf53ea3 --- /dev/null +++ b/lib/providers/project_provider.dart @@ -0,0 +1,43 @@ +import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; +import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; +import 'package:flutter/cupertino.dart'; + +class ProjectProvider with ChangeNotifier{ + + DrAppSharedPreferances sharedPref = DrAppSharedPreferances(); + Locale _appLocale; + String currentLanguage = 'ar'; + bool _isArabic = false; + + Locale get appLocal => _appLocale; + + bool get isArabic => _isArabic; + + ProjectProvider(){ + loadSharedPrefLanguage (); + } + void loadSharedPrefLanguage() async { + currentLanguage = await sharedPref.getString(APP_Language); + _appLocale = Locale(currentLanguage ?? 'ar'); + _isArabic = currentLanguage != null + ? currentLanguage == 'ar' ? true : false + : false; + notifyListeners(); + } + + void changeLanguage(String lan) { + if (lan != "en" && currentLanguage != lan) { + _appLocale = Locale("ar"); + _isArabic = true; + currentLanguage = 'ar'; + sharedPref.setString(APP_Language, 'ar'); + } else if (lan != "ar" && currentLanguage != lan) { + _appLocale = Locale("en"); + _isArabic = false; + currentLanguage = 'en'; + sharedPref.setString(APP_Language, 'en'); + } + notifyListeners(); + } + +} \ No newline at end of file diff --git a/lib/providers/schedule_provider.dart b/lib/providers/schedule_provider.dart index 14bc4571..edd880d2 100644 --- a/lib/providers/schedule_provider.dart +++ b/lib/providers/schedule_provider.dart @@ -8,7 +8,7 @@ import 'package:http_interceptor/http_client_with_interceptor.dart'; import '../interceptor/http_interceptor.dart'; import '../models/list_doctor_working_hours_table_model.dart'; -import '../models/RequestSchedule.dart'; +import '../models/request_schedule.dart'; class ScheduleProvider with ChangeNotifier { Client client = @@ -27,6 +27,7 @@ class ScheduleProvider with ChangeNotifier { getDoctorSchedule() async { const url = BASE_URL + 'Doctors.svc/REST/GetDoctorWorkingHoursTable'; try { + if (await Helpers.checkConnection()) { final response = await client.post(url, body: json.encode(requestSchedule.toJson())); final int statusCode = response.statusCode; diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index aade7083..97e5158f 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -1,7 +1,9 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/providers/doctor_reply_provider.dart'; import 'package:doctor_app_flutter/providers/medicine_provider.dart'; +import 'package:doctor_app_flutter/providers/hospital_provider.dart'; import 'package:doctor_app_flutter/screens/medicine/medicine_search_screen.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:provider/provider.dart'; import '../routes.dart'; @@ -25,10 +27,13 @@ class DashboardScreen extends StatefulWidget { } class _DashboardScreenState extends State { + + HospitalProvider projectsProvider; @override Widget build(BuildContext context) { + projectsProvider = Provider.of(context); return AppScaffold( - appBarTitle: 'Home', + appBarTitle: TranslationBase.of(context).dashboardScreenToolbarTitle, current: 0, body: Container( child: Column( @@ -206,7 +211,7 @@ class _DashboardScreenState extends State { backgroundColor: Colors.green[200], ), onTap: () { - Navigator.of(context).pushNamed(PATIENT_SEARCH); + Navigator.of(context).pushNamed(PATIENT_SEARCH); }, ), ), diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart index ccb9b588..c205f49d 100644 --- a/lib/screens/settings/settings_screen.dart +++ b/lib/screens/settings/settings_screen.dart @@ -1,11 +1,65 @@ +import 'package:doctor_app_flutter/providers/project_provider.dart'; +import 'package:doctor_app_flutter/providers/hospital_provider.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class SettingsScreen extends StatelessWidget { + + ProjectProvider projectsProvider; @override Widget build(BuildContext context) { + projectsProvider = Provider.of(context); return AppScaffold( - appBarTitle: "SETTINS", - body: Container(), + appBarTitle: TranslationBase.of(context).settings.toUpperCase(), + body: ListView( + children: [ + AppText(TranslationBase.of(context).language.toUpperCase(),fontSize: 18,margin: 5,fontWeight: FontWeight.bold,), + Container( + margin: EdgeInsets.symmetric(horizontal: 10,vertical: 10), + height: 50, + decoration: BoxDecoration( + border: Border.all(color: Colors.grey[600],width: 2.0), + borderRadius: BorderRadius.circular(8.0) + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(7.0), + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () { projectsProvider.changeLanguage('en'); }, + child: AnimatedContainer( + duration: Duration(milliseconds: 350), + decoration: BoxDecoration( + color: !projectsProvider.isArabic ? Hexcolor('#58434F') : Colors.transparent, + border: Border(right: BorderSide(color: Colors.grey[200], width: 2.0)) + ), + child: Center(child: AppText(TranslationBase.of(context).lanEnglish, color: !projectsProvider.isArabic ? Colors.white : Colors.grey[500])) + ), + ), + ), + Expanded( + child: InkWell( + onTap: (){projectsProvider.changeLanguage('ar');}, + child: AnimatedContainer( + duration: Duration(milliseconds: 350), + decoration: BoxDecoration( + color: projectsProvider.isArabic ? Hexcolor('#58434F') : Colors.transparent, + border: Border(right: BorderSide(color: Colors.grey[200], width: 2.0)) + ), + child: Center(child: AppText(TranslationBase.of(context).lanArabic, color: projectsProvider.isArabic ? Colors.white : Colors.grey[500],)) + ), + ), + ) + ], + ), + ), + ) + ], + ), ); } } \ No newline at end of file diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart new file mode 100644 index 00000000..1af735a1 --- /dev/null +++ b/lib/util/translations_delegate_base.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:doctor_app_flutter/config/localized_values.dart'; +import 'package:flutter/foundation.dart' show SynchronousFuture; +import 'package:flutter/material.dart'; + +class TranslationBase { + TranslationBase(this.locale); + + final Locale locale; + + static TranslationBase of(BuildContext context) { + return Localizations.of(context, TranslationBase); + } + + + + String get dashboardScreenToolbarTitle => localizedValues['dashboardScreenToolbarTitle'][locale.languageCode]; + + String get settings => localizedValues['settings'][locale.languageCode]; + + String get language => localizedValues['language'][locale.languageCode]; + + String get lanEnglish => localizedValues['lanEnglish'][locale.languageCode]; + + String get lanArabic => localizedValues['lanArabic'][locale.languageCode]; + +} + +class TranslationBaseDelegate extends LocalizationsDelegate { + const TranslationBaseDelegate(); + + @override + bool isSupported(Locale locale) => ['en', 'ar'].contains(locale.languageCode); + + @override + Future load(Locale locale) { + return SynchronousFuture(TranslationBase(locale)); + } + + @override + bool shouldReload(TranslationBaseDelegate old) => false; +} diff --git a/lib/widgets/auth/login_form.dart b/lib/widgets/auth/login_form.dart index f20cb0f3..43daa219 100644 --- a/lib/widgets/auth/login_form.dart +++ b/lib/widgets/auth/login_form.dart @@ -10,7 +10,7 @@ import '../../config/shared_pref_kay.dart'; import '../../config/size_config.dart'; import '../../models/user_model.dart'; import '../../providers/auth_provider.dart'; -import '../../providers/projects_provider.dart'; +import '../../providers/hospital_provider.dart'; import '../../routes.dart'; import '../../util/dr_app_shared_pref.dart'; import '../../util/dr_app_toast_msg.dart'; @@ -290,7 +290,7 @@ class _LoginFormState extends State { } getProjectsList() { - ProjectsProvider projectsProv = Provider.of(context); + HospitalProvider projectsProv = Provider.of(context); projectsProv.getProjectsList().then((res) { if (res['MessageStatus'] == 1) { setState(() { diff --git a/pubspec.lock b/pubspec.lock index 14612a67..4e2d1cde 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -244,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.4" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -317,13 +322,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.4" - i18n: - dependency: "direct main" - description: - name: i18n - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.10" imei_plugin: dependency: "direct main" description: @@ -373,6 +371,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.11.4" + maps_launcher: + dependency: "direct main" + description: + name: maps_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: @@ -499,13 +504,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.5" - quick_log: - dependency: transitive - description: - name: quick_log - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" quiver: dependency: transitive description: @@ -513,13 +511,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.5" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.23.1" scratch_space: dependency: transitive description: @@ -644,6 +635,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "5.4.5" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+4" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8a82ea4a..00c18525 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,11 +20,12 @@ dependencies: flutter: sdk: flutter hexcolor: ^1.0.1 + flutter_localizations: + sdk: flutter flutter_device_type: ^0.2.0 intl: ^0.16.1 http: ^0.12.0+4 provider: ^4.0.5+1 - i18n: any shared_preferences: ^0.5.6+3 imei_plugin: ^1.1.6 flutter_flexible_toast: ^0.1.4