diff --git a/resources/langs/en.json b/assets/langs/ar-SA.json similarity index 78% rename from resources/langs/en.json rename to assets/langs/ar-SA.json index c9f87fc..55e73b0 100644 --- a/resources/langs/en.json +++ b/assets/langs/ar-SA.json @@ -1,5 +1,13 @@ { + "mohemm": "Mohemm", + "english": "English", + "arabic": "Arabic", + "login": "Login", + "pleaseEnterLoginDetails": "Please enter the detail below to login", + "username": "Username", + "password": "Password", "title": "Hello", + "forgotPassword": "Forgot Password", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", diff --git a/resources/langs/en-US.json b/assets/langs/en-US.json similarity index 78% rename from resources/langs/en-US.json rename to assets/langs/en-US.json index c9f87fc..55e73b0 100644 --- a/resources/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1,5 +1,13 @@ { + "mohemm": "Mohemm", + "english": "English", + "arabic": "Arabic", + "login": "Login", + "pleaseEnterLoginDetails": "Please enter the detail below to login", + "username": "Username", + "password": "Password", "title": "Hello", + "forgotPassword": "Forgot Password", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", diff --git a/lib/config/localization.dart b/lib/config/localization.dart deleted file mode 100644 index 5d7acdf..0000000 --- a/lib/config/localization.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_localizations/flutter_localizations.dart'; - -class AppLocalizations { - static const Iterable> localizationsDelegates = - [ - // ... app-specific localization delegate[s] here - // S.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate - ]; - - static const List supportedLocales = [ - const Locale("en", "US") - ]; -} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 298e9b2..34505d0 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,19 +1,15 @@ - -import 'package:mohem_flutter_app/pages/login/login_screen.dart'; -import 'package:mohem_flutter_app/pages/user/splash_page.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/pages/login/login_screen.dart'; class AppRoutes { - //User - static final String splash = "/splash"; - static final String registerSelection = "/registerSelection"; - static final String loginVerifyAccount = "/loginVerifyAccount"; - static final String login = "/login"; - static final String forgetPassword = "/forgetPassword"; - static final String loginVerification = "/loginVerification"; - static final String dashboard = "/dashboard"; - - static final String initialRoute = login; + static const String splash = "/splash"; + static const String registerSelection = "/registerSelection"; + static const String loginVerifyAccount = "/loginVerifyAccount"; + static const String login = "/login"; + static const String forgetPassword = "/forgetPassword"; + static const String loginVerification = "/loginVerification"; + static const String dashboard = "/dashboard"; + static const String initialRoute = login; static final Map routes = { login: (context) => LoginScreen(), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 1157a89..6d49427 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -14,8 +14,16 @@ class CodegenLoader extends AssetLoader{ return Future.value(mapLocales[locale.toString()]); } - static const Map en = { + static const Map ar_SA = { + "mohemm": "Mohemm", + "english": "English", + "arabic": "Arabic", + "login": "Login", + "pleaseEnterLoginDetails": "Please enter the detail below to login", + "username": "Username", + "password": "Password", "title": "Hello", + "forgotPassword": "Forgot Password", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", @@ -53,7 +61,15 @@ class CodegenLoader extends AssetLoader{ "reset_locale": "Reset Language" }; static const Map en_US = { + "mohemm": "Mohemm", + "english": "English", + "arabic": "Arabic", + "login": "Login", + "pleaseEnterLoginDetails": "Please enter the detail below to login", + "username": "Username", + "password": "Password", "title": "Hello", + "forgotPassword": "Forgot Password", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", "clickMe": "Click me", @@ -90,5 +106,5 @@ static const Map en_US = { }, "reset_locale": "Reset Language" }; -static const Map> mapLocales = {"en": en, "en_US": en_US}; +static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/main.dart b/lib/main.dart index 10f698c..5964efe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/config/app_provider.dart'; import 'package:mohem_flutter_app/config/dependencies.dart'; +import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; import 'package:sizer/sizer.dart'; @@ -14,15 +15,22 @@ Future main() async { EasyLocalization( supportedLocales: [ Locale('en', 'US'), + Locale('ar', 'SA'), ], - path: 'resources/langs', + path: 'assets/langs', + assetLoader: CodegenLoader(), child: MyApp(), ), ); } +// todo terminal command to genertate translation files +// flutter pub run easy_localization:generate --source-dir ./assets/langs +// todo terminal command to genertate translation keys +// flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart +// command to generate languages data from json + class MyApp extends StatelessWidget { - // This widget is the root of your application. MyApp() { AppDependencies.addDependencies(); } @@ -33,7 +41,7 @@ class MyApp extends StatelessWidget { child: Sizer( builder: (context, orientation, deviceType) { return MaterialApp( - theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "en"), + theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), debugShowCheckedModeBanner: false, localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, diff --git a/lib/pages/login/login_screen.dart b/lib/pages/login/login_screen.dart index 932c1bc..8fd0244 100644 --- a/lib/pages/login/login_screen.dart +++ b/lib/pages/login/login_screen.dart @@ -1,4 +1,13 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/colors.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/widgets/input_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; class LoginScreen extends StatefulWidget { LoginScreen({Key? key}) : super(key: key); @@ -10,6 +19,9 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { + TextEditingController username = TextEditingController(); + TextEditingController password = TextEditingController(); + @override void initState() { super.initState(); @@ -25,14 +37,67 @@ class _LoginScreenState extends State { return Scaffold( body: Column( children: [ - Row( - children: [ - Text("English"), - Text("Arabic"), - ], + const SizedBox(height: 23), + Expanded( + child: Padding( + padding: const EdgeInsets.all(21.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded(child: SizedBox()), + Row( + children: [ + Text( + LocaleKeys.english.tr(), + style: TextStyle(color: MyColors.textMixColor, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.w600), + ).onPress(() {}), + Container( + width: 1, + color: MyColors.darkWhiteColor, + height: 16, + margin: const EdgeInsets.only(left: 10, right: 10), + ), + Text( + LocaleKeys.arabic.tr(), + style: TextStyle(color: MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.w600), + ).onPress(() {}), + ], + ), + ], + ), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.login.tr(), + style: TextStyle(color: MyColors.darkTextColor, fontSize: 24, letterSpacing: -1.44, fontWeight: FontWeight.w700), + ), + Text( + LocaleKeys.pleaseEnterLoginDetails.tr(), + style: TextStyle(color: MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: FontWeight.w600), + ), + 16.height, + InputWidget(LocaleKeys.username.tr(), "123456", username), + 12.height, + InputWidget(LocaleKeys.password.tr(), "xxxxxx", password, isObscureText: true) + ], + ), + ) + ], + ), + ), ), + DefaultButton(LocaleKeys.login.tr(), () async { + // context.setLocale(const Locale("en", "US")); // to change Loacle + }) + .insideContainer ], ), ); } -} \ No newline at end of file +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/api/api_client.dart b/lib/sikander_later_will_remove_to_parent_directory/api/api_client.dart new file mode 100644 index 0000000..66828ee --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/api/api_client.dart @@ -0,0 +1,155 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart'; +import 'package:http/io_client.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart'; + +typedef FactoryConstructor = U Function(dynamic); + +class APIError { + int errorCode; + String errorMessage; + + APIError(this.errorCode, this.errorMessage); + + Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; + + @override + String toString() { + return jsonEncode(this); + } +} + +APIException _throwAPIException(Response response) { + switch (response.statusCode) { + case 400: + APIError? apiError; + if (response.body != null && response.body.isNotEmpty) { + var jsonError = jsonDecode(response.body); + apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']); + } + return APIException(APIException.BAD_REQUEST, error: apiError); + case 401: + return APIException(APIException.UNAUTHORIZED); + case 403: + return APIException(APIException.FORBIDDEN); + case 404: + return APIException(APIException.NOT_FOUND); + case 500: + return APIException(APIException.INTERNAL_SERVER_ERROR); + case 444: + var downloadUrl = response.headers["location"]; + return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); + default: + return APIException(APIException.OTHER); + } +} + +class ApiClient { + static final ApiClient _instance = ApiClient._internal(); + + ApiClient._internal(); + + factory ApiClient() => _instance; + + Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, + {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + var _headers = {'Accept': 'application/json'}; + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + if (!kReleaseMode) { + print("Url:$url"); + print("body:$jsonObject"); + } + var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); + try { + var jsonData = jsonDecode(response.body); + return factoryConstructor(jsonData); + } catch (ex) { + throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); + } + } + + Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + String? requestBody; + if (jsonObject != null) { + requestBody = jsonEncode(jsonObject); + if (headers == null) { + headers = {'Content-Type': 'application/json'}; + } else { + headers['Content-Type'] = 'application/json'; + } + } + + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); + } + + Future _postForResponse(String url, requestBody, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { + try { + var _headers = {}; + if (token != null) { + _headers['Authorization'] = 'Bearer $token'; + } + + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + + if (queryParameters != null) { + var queryString = new Uri(queryParameters: queryParameters).query; + url = url + '?' + queryString; + } + var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 15)); + + if (response.statusCode >= 200 && response.statusCode < 300) { + return response; + } else { + throw _throwAPIException(response); + } + } on SocketException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on HttpException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on TimeoutException catch (e) { + throw APIException(APIException.TIMEOUT, arguments: e); + } on ClientException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } + } + + bool _certificateCheck(X509Certificate cert, String host, int port) => true; + + Future _withClient(Future Function(Client) fn) async { + var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; + var client = IOClient(httpClient); + try { + return await fn(client); + } finally { + client.close(); + } + } + + Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/api/tangheem_user_api_client.dart b/lib/sikander_later_will_remove_to_parent_directory/api/tangheem_user_api_client.dart new file mode 100644 index 0000000..429902f --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/api/tangheem_user_api_client.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/consts.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/member_model.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/surah_model.dart'; + +import 'api_client.dart'; + +class TangheemUserApiClient { + static final TangheemUserApiClient _instance = TangheemUserApiClient._internal(); + + TangheemUserApiClient._internal(); + + factory TangheemUserApiClient() => _instance; + + Future getSurahs() async { + String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; + var postParams = {}; + return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); + } + + Future getMembers() async { + String url = "${ApiConsts.tangheemUsers}Committee_Get"; + var postParams = {}; + return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); + } + + Future getContentInfo(int contentId) async { + String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; + var postParams = {"contentTypeId": contentId}; + return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/app_state/app_state.dart b/lib/sikander_later_will_remove_to_parent_directory/app_state/app_state.dart new file mode 100644 index 0000000..bbc6403 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/app_state/app_state.dart @@ -0,0 +1,26 @@ +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/surah_model.dart'; + +class AppState { + static final AppState _instance = AppState._internal(); + + AppState._internal(); + + factory AppState() => _instance; + + SurahModel? _surahModel; + + SurahModel? get getSurahModel => _surahModel; + + void setSurahModel(SurahModel _surahModel) { + this._surahModel = _surahModel; + } + + ContentInfoDataModel? _copyRight; + + ContentInfoDataModel? get getContentInfoModel => _copyRight; + + void setContentInfoModel(ContentInfoDataModel _copyRight) { + this._copyRight = _copyRight; + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/classes/colors.dart b/lib/sikander_later_will_remove_to_parent_directory/classes/colors.dart new file mode 100644 index 0000000..d19edc6 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/classes/colors.dart @@ -0,0 +1,13 @@ +import 'package:flutter/cupertino.dart'; + +class MyColors { + static const Color darkIconColor = Color(0xff28323A); + static const Color darkTextColor = Color(0xff2B353E); + static const Color gradiantStartColor = Color(0xff32D892); + static const Color gradiantEndColor = Color(0xff259CB8); + static const Color textMixColor = Color(0xff2BB8A6); + static const Color backgroundColor = Color(0xffF8F8F8); + static const Color greyColor = Color(0xff575757); + static const Color lightGreyColor = Color(0xffEFEFEF); + static const Color darkWhiteColor = Color(0xffE0E0E0); +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/classes/consts.dart b/lib/sikander_later_will_remove_to_parent_directory/classes/consts.dart new file mode 100644 index 0000000..0c71f0c --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/classes/consts.dart @@ -0,0 +1,20 @@ +class ApiConsts { + //static String baseUrl = "http://10.200.204.20:2801/"; // Local server + static String baseUrl = "http://20.203.25.82"; // production server + static String baseUrlServices = baseUrl + "/services/"; // production server + // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server + static String authentication = baseUrlServices + "api/Authentication/"; + static String tangheemUsers = baseUrlServices + "api/TangheemUsers/"; + static String adminConfiguration = baseUrlServices + "api/AdminConfiguration/"; + static String user = baseUrlServices + "api/User/"; +} + +class GlobalConsts { + static String isRememberMe = "remember_me"; + static String email = "email"; + static String password = "password"; + static String bookmark = "bookmark"; + static String fontZoomSize = "font_zoom_size"; + static String welcomeVideoUrl = "welcomeVideoUrl"; + static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/classes/utils.dart b/lib/sikander_later_will_remove_to_parent_directory/classes/utils.dart new file mode 100644 index 0000000..3aafdb1 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/classes/utils.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +// import 'package:fluttertoast/fluttertoast.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart'; + +class Utils { + static bool _isLoadingVisible = false; + + static bool get isLoading => _isLoadingVisible; + + static void showToast(String message) { + // Fluttertoast.showToast( + // msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); + } + + static dynamic getNotNullValue(List list, int index) { + try { + return list[index]; + } catch (ex) { + return null; + } + } + + static int stringToHex(String colorCode) { + try { + return int.parse(colorCode.replaceAll("#", "0xff")); + } catch (ex) { + return (0xff000000); + } + } + + static void showLoading(BuildContext context) { + WidgetsBinding.instance?.addPostFrameCallback((_) { + _isLoadingVisible = true; + // showDialog( + // context: context, + // barrierColor: ColorConsts.primaryBlack.withOpacity(0.5), + // builder: (BuildContext context) => LoadingDialog(), + // ).then((value) { + // _isLoadingVisible = false; + // }); + }); + } + + static void hideLoading(BuildContext context) { + if (_isLoadingVisible) { + _isLoadingVisible = false; + Navigator.of(context).pop(); + } + _isLoadingVisible = false; + } + + static void handleException(dynamic exception, Function(String)? onErrorMessage) { + String errorMessage; + if (exception is APIException) { + if (exception.message == APIException.UNAUTHORIZED) { + return; + } else { + errorMessage = exception.error?.errorMessage ?? exception.message; + } + } else { + errorMessage = APIException.UNKNOWN; + } + if (onErrorMessage != null) { + onErrorMessage(errorMessage); + } else { + showToast(errorMessage); + } + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart b/lib/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart new file mode 100644 index 0000000..fa2b22c --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; + +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/api/api_client.dart'; + +class APIException implements Exception { + static const String BAD_REQUEST = 'api_common_bad_request'; + static const String UNAUTHORIZED = 'api_common_unauthorized'; + static const String FORBIDDEN = 'api_common_forbidden'; + static const String NOT_FOUND = 'api_common_not_found'; + static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error'; + static const String UPGRADE_REQUIRED = 'api_common_upgrade_required'; + static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format'; + static const String OTHER = 'api_common_http_error'; + static const String TIMEOUT = 'api_common_http_timeout'; + static const String UNKNOWN = 'unexpected_error'; + + final String message; + final APIError? error; + final arguments; + + const APIException(this.message, {this.arguments, this.error}); + + Map toJson() => {'message': message, 'error': error, 'arguments': '$arguments'}; + + @override + String toString() { + return jsonEncode(this); + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/extensions/int_extensions.dart b/lib/sikander_later_will_remove_to_parent_directory/extensions/int_extensions.dart new file mode 100644 index 0000000..9b90b2f --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/extensions/int_extensions.dart @@ -0,0 +1,7 @@ +import 'package:flutter/cupertino.dart'; + +extension IntExtensions on int { + Widget get height => SizedBox(height: toDouble()); + + Widget get width => SizedBox(width: toDouble()); +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/extensions/string_extensions.dart b/lib/sikander_later_will_remove_to_parent_directory/extensions/string_extensions.dart new file mode 100644 index 0000000..db84adf --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/extensions/string_extensions.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:intl/intl.dart'; + +extension EmailValidator on String { + Widget toWidget() => Text(this); + + bool isValidEmail() { + return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this); + } + + String toFormattedDate() { + String date = this.split("T")[0]; + String time = this.split("T")[1]; + var dates = date.split("-"); + return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; + } + + getMonth(int month) { + switch (month) { + case 1: + return "January"; + case 2: + return "February"; + case 3: + return "March"; + case 4: + return "April"; + case 5: + return "May"; + case 6: + return "June"; + case 7: + return "July"; + case 8: + return "August"; + case 9: + return "September"; + case 10: + return "October"; + case 11: + return "November"; + case 12: + return "December"; + } + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/extensions/widget_extensions.dart b/lib/sikander_later_will_remove_to_parent_directory/extensions/widget_extensions.dart new file mode 100644 index 0000000..6f5e013 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/extensions/widget_extensions.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +extension WidgetExtensions on Widget { + Widget onPress(VoidCallback onTap) => InkWell( + onTap: onTap, + child: this, + ); +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart b/lib/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart new file mode 100644 index 0000000..4eec746 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart @@ -0,0 +1,65 @@ +class ContentInfoModel { + int? totalItemsCount; + int? statusCode; + String? message; + List? data; + + ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data}); + + ContentInfoModel.fromJson(Map json) { + totalItemsCount = json['totalItemsCount']; + statusCode = json['statusCode']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data?.add(new ContentInfoDataModel.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['totalItemsCount'] = this.totalItemsCount; + data['statusCode'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data?.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ContentInfoDataModel { + int? contentInfoId; + int? contentTypeId; + String? content; + String? contentTypeNameEn; + String? contentTypeNameAr; + String? fileName; + String? exposeFilePath; + + ContentInfoDataModel({this.contentInfoId, this.contentTypeId, this.content, this.contentTypeNameEn, this.contentTypeNameAr, this.fileName, this.exposeFilePath}); + + ContentInfoDataModel.fromJson(Map json) { + contentInfoId = json['contentInfoId']; + contentTypeId = json['contentTypeId']; + content = json['content']; + contentTypeNameEn = json['contentTypeNameEn']; + contentTypeNameAr = json['contentTypeNameAr']; + fileName = json['fileName']; + exposeFilePath = json['exposeFilePath']; + } + + Map toJson() { + final Map data = new Map(); + data['contentInfoId'] = this.contentInfoId; + data['contentTypeId'] = this.contentTypeId; + data['content'] = this.content; + data['contentTypeNameEn'] = this.contentTypeNameEn; + data['contentTypeNameAr'] = this.contentTypeNameAr; + data['fileName'] = this.fileName; + data['exposeFilePath'] = this.exposeFilePath; + return data; + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/models/member_model.dart b/lib/sikander_later_will_remove_to_parent_directory/models/member_model.dart new file mode 100644 index 0000000..d968827 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/models/member_model.dart @@ -0,0 +1,62 @@ +class MemberModel { + int? totalItemsCount; + int? statusCode; + String? message; + List? data; + + MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data}); + + MemberModel.fromJson(Map json) { + totalItemsCount = json['totalItemsCount']; + statusCode = json['statusCode']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data?.add(new MemberDataModel.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['totalItemsCount'] = this.totalItemsCount; + data['statusCode'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data?.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class MemberDataModel { + int? committeeId; + String? firstName; + String? lastName; + String? description; + String? picture; + int? orderNo; + + MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo}); + + MemberDataModel.fromJson(Map json) { + committeeId = json['committeeId']; + firstName = json['firstName']; + lastName = json['lastName']; + description = json['description']; + picture = json['picture']; + orderNo = json['orderNo']; + } + + Map toJson() { + final Map data = new Map(); + data['committeeId'] = this.committeeId; + data['firstName'] = this.firstName; + data['lastName'] = this.lastName; + data['description'] = this.description; + data['picture'] = this.picture; + data['orderNo'] = this.orderNo; + return data; + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/models/surah_model.dart b/lib/sikander_later_will_remove_to_parent_directory/models/surah_model.dart new file mode 100644 index 0000000..acc171a --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/models/surah_model.dart @@ -0,0 +1,74 @@ +class SurahModel { + int? totalItemsCount; + int? statusCode; + String? message; + List? data; + + SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data}); + + SurahModel.fromJson(Map json) { + totalItemsCount = json['totalItemsCount']; + statusCode = json['statusCode']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data?.add(SurahModelData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['totalItemsCount'] = totalItemsCount; + data['statusCode'] = statusCode; + data['message'] = message; + if (this.data != null) { + data['data'] = this.data?.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class SurahModelData { + int? id; + int? surahID; + String? nameAR; + String? nameEN; + int? numberOfAyahs; + String? englishNameTranslation; + int? revelationID; + String? revelationType; + int? startPageNo; + int? endPageNo; + + SurahModelData({this.id, this.surahID, this.nameAR, this.nameEN, this.numberOfAyahs, this.englishNameTranslation, this.revelationID, this.revelationType, this.startPageNo, this.endPageNo}); + + SurahModelData.fromJson(Map json) { + id = json['id']; + surahID = json['surahID']; + nameAR = json['nameAR']; + nameEN = json['nameEN']; + numberOfAyahs = json['numberOfAyahs']; + englishNameTranslation = json['englishNameTranslation']; + revelationID = json['revelation_ID']; + revelationType = json['revelationType']; + startPageNo = json['startPageNo']; + endPageNo = json['endPageNo']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['surahID'] = this.surahID; + data['nameAR'] = this.nameAR; + data['nameEN'] = this.nameEN; + data['numberOfAyahs'] = this.numberOfAyahs; + data['englishNameTranslation'] = this.englishNameTranslation; + data['revelation_ID'] = this.revelationID; + data['revelationType'] = this.revelationType; + data['startPageNo'] = this.startPageNo; + data['endPageNo'] = this.endPageNo; + return data; + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/bottom_sheets/country_selection_bottom_sheet.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/bottom_sheets/country_selection_bottom_sheet.dart new file mode 100644 index 0000000..905c5ce --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/bottom_sheets/country_selection_bottom_sheet.dart @@ -0,0 +1,103 @@ +// import 'package:flutter/material.dart'; +// import 'package:tangheem/classes/colors.dart'; +// import 'package:tangheem/models/country_model.dart'; +// import 'package:tangheem/widgets/common_textfield_widget.dart'; +// +// class CountrySelectionBottomSheet extends StatefulWidget { +// final List countryList; +// final Function(CountryModelData) onSelectCountry; +// +// CountrySelectionBottomSheet({Key key, this.countryList, this.onSelectCountry}) : super(key: key); +// +// @override +// _CountrySelectionBottomSheetState createState() { +// return _CountrySelectionBottomSheetState(); +// } +// } +// +// class _CountrySelectionBottomSheetState extends State { +// TextEditingController _searchCountryController = TextEditingController(); +// List _filteredCountryList = []; +// +// @override +// void initState() { +// super.initState(); +// _searchCountryController.addListener(_onTextChange); +// _filterList(""); +// } +// +// void _filterList(String _query) { +// _filteredCountryList = []; +// if (_query.isEmpty) { +// _filteredCountryList = widget.countryList; +// } else { +// _filteredCountryList = widget.countryList.where((element) => element.countryNameAr.contains(_query) || element.countryNameEn.toLowerCase().contains(_query.toLowerCase()))?.toList() ?? []; +// } +// setState(() {}); +// } +// +// void _onTextChange() { +// var _searchText = _searchCountryController.text; +// _filterList(_searchText); +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Directionality( +// textDirection: TextDirection.rtl, +// child: Container( +// height: MediaQuery.of(context).size.height * 0.75, +// padding: EdgeInsets.all(16), +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.only( +// topLeft: Radius.circular(16), +// topRight: Radius.circular(16), +// ), +// ), +// child: Column( +// children: [ +// Container( +// padding: EdgeInsets.all(8), +// height: 54, +// decoration: BoxDecoration( +// color: ColorConsts.primaryBlue, +// borderRadius: BorderRadius.only( +// topLeft: Radius.circular(12), +// topRight: Radius.circular(12), +// bottomRight: Radius.circular(12), +// bottomLeft: Radius.circular(12), +// ), +// ), +// child: CommonTextFieldWidget(hint: "البحث في البلد", controller: _searchCountryController), +// ), +// Expanded( +// child: ListView.separated( +// padding: EdgeInsets.only(left: 8, right: 8), +// itemCount: _filteredCountryList.length, +// physics: BouncingScrollPhysics(), +// separatorBuilder: (context, index) => Divider( +// height: 1, +// color: Colors.black87.withOpacity(0.3), +// ), +// itemBuilder: (context, index) => ListTile( +// title: Text(_filteredCountryList[index].countryNameAr + " (" + _filteredCountryList[index].countryCode + ")"), +// dense: true, +// onTap: () { +// Navigator.pop(context); +// widget.onSelectCountry(_filteredCountryList[index]); +// }, +// ), +// ), +// ) +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/common_appbar.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/common_appbar.dart new file mode 100644 index 0000000..ae1e782 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/common_appbar.dart @@ -0,0 +1,364 @@ +// import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:shared_preferences/shared_preferences.dart'; +// import 'package:tangheem/api/tangheem_user_api_client.dart'; +// import 'package:tangheem/app_state/app_state.dart'; +// import 'package:tangheem/classes/colors.dart'; +// import 'package:tangheem/classes/consts.dart'; +// import 'package:tangheem/classes/utils.dart'; +// import 'package:tangheem/models/navigation_model.dart'; +// import 'package:tangheem/models/quick_links_model.dart'; +// import 'package:tangheem/ui/screens/bookmark_screen.dart'; +// import 'package:tangheem/ui/screens/content_info_screen.dart'; +// import 'package:tangheem/ui/screens/login_screen.dart'; +// import 'package:tangheem/ui/screens/pdf_viewer_screen.dart'; +// import 'package:url_launcher/url_launcher.dart'; +// +// class CommonAppbar extends StatefulWidget { +// final bool showDrawer; +// final Widget child; +// final bool isFirst; +// +// CommonAppbar({Key key, this.showDrawer = false, @required this.child, this.isFirst = false}) : super(key: key); +// +// @override +// _CommonAppbarState createState() { +// return _CommonAppbarState(); +// } +// } +// +// class _CommonAppbarState extends State { +// final GlobalKey _scaffoldKey = new GlobalKey(); +// List quickLinks = []; +// List navigationList = []; +// +// @override +// void initState() { +// super.initState(); +// getPrefs(); +// getNavigation(); +// getQuickLinks(); +// //getCopyRight(); +// } +// +// // void getCopyRight() async { +// // if (AppState().getContentInfoModel == null) { +// // try { +// // var model = await TangheemUserApiClient().getContentInfo(3); +// // var contentList = model?.data ?? []; +// // if (contentList.length > 0) { +// // _copyRight = contentList.first; +// // AppState().setContentInfoModel(_copyRight); +// // } +// // } catch (ex) {} +// // } else { +// // _copyRight = AppState().getContentInfoModel; +// // } +// // setState(() {}); +// // } +// +// void getNavigation() async { +// if (AppState().getNavigationModel?.data == null) { +// try { +// var model = await TangheemUserApiClient().getNavigation(); +// navigationList = model?.data ?? []; +// navigationList.sort((a, b) => a.orderNo.compareTo(b.orderNo)); +// AppState().setNavigationModel(model); +// } catch (ex) {} +// } else { +// navigationList = AppState().getNavigationModel.data; +// } +// setState(() {}); +// } +// +// void getQuickLinks() async { +// if (widget.showDrawer) { +// try { +// quickLinks = (await TangheemUserApiClient().quickLinks())?.data ?? []; +// quickLinks = quickLinks.where((element) => element.position == "down").toList(); +// quickLinks.sort((a, b) => a.orderNo.compareTo(b.orderNo)); +// } catch (ex) {} +// setState(() {}); +// } +// } +// +// int fontSize; +// SharedPreferences prefs; +// +// void getPrefs() async { +// prefs = await SharedPreferences.getInstance(); +// fontSize = prefs.getInt(GlobalConsts.fontZoomSize) ?? 18; +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// key: widget.showDrawer ? _scaffoldKey : null, +// drawer: widget.showDrawer ? drawerView() : null, +// resizeToAvoidBottomInset: true, +// drawerScrimColor: Colors.black.withOpacity(.3), +// body: SafeArea( +// child: Column( +// children: [ +// Container( +// color: Colors.white, +// height: 100, +// padding: EdgeInsets.only(top: 8, bottom: 8, right: 16), +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// if (!widget.isFirst) +// IconButton( +// icon: Icon(widget.showDrawer ? Icons.menu : Icons.arrow_back_ios, color: ColorConsts.textGrey), +// padding: EdgeInsets.only(left: 16), +// onPressed: () { +// if (widget.showDrawer) { +// _scaffoldKey.currentState.openDrawer(); +// } else { +// Navigator.pop(context); +// } +// }, +// ), +// Expanded(child: SizedBox()), +// Hero( +// tag: "logo", +// child: SvgPicture.asset( +// "assets/logos/tangheem_logo.svg", +// height: 100, +// width: 100, +// alignment: Alignment.centerRight, +// ), +// ) +// ], +// ), +// ), +// Expanded( +// child: Directionality(textDirection: TextDirection.rtl, child: widget.child), +// ), +// ], +// ), +// ), +// ); +// } +// +// Widget drawerView() { +// var height = MediaQuery.of(context).padding.top; +// return Drawer( +// elevation: 0, +// child: Container( +// color: Colors.white, +// child: SafeArea( +// bottom: true, +// top: false, +// right: false, +// left: false, +// maintainBottomViewPadding: true, +// child: Builder( +// builder: (context) { +// bool isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; +// Widget listContents = ListView.builder( +// shrinkWrap: true, +// physics: BouncingScrollPhysics(), +// padding: EdgeInsets.only(left: 24, right: 24), +// itemCount: navigationList.length, +// itemBuilder: (context, index) { +// String icon = "assets/icons/${navigationList[index].mobileFontIcon}.svg"; +// var subList = navigationList.where((element) => element.parentId == navigationList[index].navigationId).toList(); +// return Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// if (navigationList[index].parentId == 1) +// myListItem(icon, navigationList[index].navigationText, navigationList[index].orderNo == 1 ? true : false, onTap: () { +// String url = navigationList[index]?.mobileNavigationUrl ?? ""; +// if (url.isEmpty || url.length < 2) { +// return; +// } +// Navigator.pushNamed(context, url, arguments: null); +// }), +// for (var subItem in subList) +// Container( +// width: double.infinity, +// child: Row( +// children: [ +// Expanded( +// child: myListItem("assets/icons/${subItem.mobileFontIcon}.svg", subItem.navigationText, false, onTap: () { +// String url = subItem.mobileNavigationUrl ?? ""; +// if (url.isEmpty) { +// return; +// } +// var contentId; +// if (subItem.mobileNavigationUrl == "/introduction") { +// url = ContentInfoScreen.routeName; +// contentId = 2; +// } else if (subItem.mobileNavigationUrl == "/encyclopedia") { +// url = ContentInfoScreen.routeName; +// contentId = 1; +// } else if (subItem.mobileNavigationUrl == "/tangheempdf") { +// url = PdfListScreen.routeName; +// contentId = 8; +// } +// Navigator.pushNamed(context, url, arguments: contentId); +// }), +// ), +// Container( +// height: 40, +// margin: EdgeInsets.only(right: 17, left: 10), +// child: VerticalDivider(color: ColorConsts.primaryBlack, thickness: .7, width: 1), +// ), +// ], +// ), +// ) +// ], +// ); +// }); +// if (isPortrait) { +// listContents = Expanded(child: listContents); +// } +// List list = [ +// Container( +// height: 100 + height, +// padding: EdgeInsets.only(left: 0, top: height), +// alignment: Alignment.centerLeft, +// child: IconButton( +// icon: Icon(Icons.clear, color: ColorConsts.textGrey), +// onPressed: () { +// if (_scaffoldKey.currentState.isDrawerOpen) { +// Navigator.pop(context); +// } +// }, +// ), +// ), +// Container( +// margin: EdgeInsets.only(top: 8, bottom: 16), +// padding: EdgeInsets.only(left: 16, right: 16), +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// commonIconButton("assets/icons/bookmark.svg", () { +// Navigator.pushNamed(context, BookmarkScreen.routeName); +// }), +// commonIconButton("assets/icons/increase_size.svg", () { +// if (fontSize >= 36) { +// Utils.showToast("وصل حجم الخط إلى الحد الأقصى للحجم"); +// return; +// } +// fontSize += 2; +// prefs.setInt(GlobalConsts.fontZoomSize, fontSize); +// Utils.showToast("زيادة حجم الخط"); +// }), +// commonIconButton("assets/icons/reduce_size.svg", () { +// if (fontSize <= 12) { +// Utils.showToast("وصل حجم الخط إلى الحد الأدنى للحجم"); +// return; +// } +// fontSize -= 2; +// prefs.setInt(GlobalConsts.fontZoomSize, fontSize); +// Utils.showToast("تم تقليل حجم الخط"); +// }), +// commonIconButton("assets/icons/user_logged.svg", () { +// if (AppState().isUserLogin) { +// Utils.showToast("أنت بالفعل تسجيل الدخول"); +// return; +// } +// Navigator.pushNamed(context, LoginScreen.routeName); +// }), +// ], +// ), +// ), +// listContents, +// Container( +// margin: EdgeInsets.only(top: 16, bottom: 12), +// padding: EdgeInsets.only(left: 32, right: 32), +// child: Row( +// children: [ +// for (QuickLinksData _quickLink in quickLinks) +// commonIconButton(ApiConsts.baseUrl + _quickLink.exposeFilePath, () { //for live production server +// // commonIconButton( _quickLink.exposeFilePath, () { +// _launchURL(_quickLink.imageUrl); +// }, size: 35, isAsset: false), +// ], +// ), +// ), +// Padding( +// padding: EdgeInsets.only(left: 32, right: 32, bottom: 8), +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Text( +// "Powered by Cloud Solutions", +// maxLines: 1, +// textAlign: TextAlign.right, +// style: TextStyle(fontSize: 14, color: Colors.black87), +// ), +// SizedBox(width: 8), +// SvgPicture.asset("assets/logos/cloud_logo.svg", width: 30, height: 30) +// ], +// ), +// ) +// ]; +// return isPortrait ? Column(children: list) : ListView(children: list); +// }, +// ), +// ), +// ), +// ); +// } +// +// void _launchURL(String _url) async => await canLaunch(_url) ? await launch(_url) : throw 'Could not launch $_url'; +// +// Widget commonIconButton(String icon, VoidCallback onPressed, {double size, bool isAsset = true}) { +// return Expanded( +// child: IconButton( +// padding: EdgeInsets.zero, +// icon: isAsset ? SvgPicture.asset(icon, height: size ?? 25, width: size ?? 30) : Image.network(icon, height: size ?? 25, width: size ?? 30), +// onPressed: () { +// Navigator.pop(context); +// Future.delayed(Duration(milliseconds: 200), () => onPressed()); +// }), +// ); +// } +// +// Widget myListItem(String icon, String title, bool isSelected, {VoidCallback onTap}) { +// return InkWell( +// onTap: () { +// Navigator.pop(context); +// if (onTap != null) { +// Future.delayed(Duration(milliseconds: 200), () => onTap()); +// } +// }, +// child: Container( +// height: 40, +// padding: EdgeInsets.only(left: 8, right: 8), +// alignment: Alignment.centerRight, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(6), +// gradient: isSelected +// ? LinearGradient( +// stops: [0.0, 0.5], +// begin: Alignment.topCenter, +// end: Alignment.bottomCenter, +// colors: [ColorConsts.gradientPink, ColorConsts.gradientOrange], +// ) +// : null, +// ), +// child: Row( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// title, +// style: TextStyle(fontSize: 14, color: isSelected ? Colors.white : ColorConsts.textGrey), +// ), +// SizedBox(width: 8), +// SvgPicture.asset(icon, height: 20, width: 20, color: isSelected ? Colors.white : ColorConsts.textGrey), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/change_password_dialog.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/change_password_dialog.dart new file mode 100644 index 0000000..d856b9c --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/change_password_dialog.dart @@ -0,0 +1,101 @@ +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/rendering.dart'; +// import 'package:tangheem/classes/colors.dart'; +// import 'package:tangheem/classes/utils.dart'; +// import 'package:tangheem/widgets/common_textfield_widget.dart'; +// +// class ChangePasswordDialog extends StatefulWidget { +// final Function(String) onPassword; +// +// ChangePasswordDialog({Key key, this.onPassword}) : super(key: key); +// +// @override +// _ChangePasswordDialogState createState() { +// return _ChangePasswordDialogState(); +// } +// } +// +// class _ChangePasswordDialogState extends State { +// final TextEditingController _passwordController = TextEditingController(); +// final TextEditingController _confirmPasswordController = TextEditingController(); +// +// @override +// void initState() { +// super.initState(); +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Dialog( +// insetPadding: EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(12), +// ), +// elevation: 0, +// backgroundColor: Colors.transparent, +// child: Directionality( +// textDirection: TextDirection.rtl, +// child: Container( +// width: double.infinity, +// decoration: BoxDecoration( +// color: ColorConsts.primaryBlue, +// borderRadius: BorderRadius.circular(16), +// ), +// padding: EdgeInsets.symmetric(vertical: 32, horizontal: 16), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// "تغيير كلمة المرور", +// textAlign: TextAlign.center, +// style: TextStyle(color: Colors.white, fontSize: 22), +// ), +// SizedBox(height: 16), +// CommonTextFieldWidget(hint: "كلمة المرور الجديدة", controller: _passwordController, prefixIcon: "assets/icons/password.svg"), +// SizedBox(height: 8), +// CommonTextFieldWidget(hint: "تأكيد كلمة المرور الجديدة", controller: _confirmPasswordController, prefixIcon: "assets/icons/password.svg"), +// SizedBox(height: 16), +// SizedBox( +// width: double.infinity, +// height: 40, +// child: TextButton( +// onPressed: () { +// if (_passwordController.text.length < 1) { +// Utils.showToast("يرجى إاخال كلمة المرور"); +// return; +// } +// if (_confirmPasswordController.text.length < 1) { +// Utils.showToast("يرجى تأكيد كلمة المرور"); +// return; +// } +// if (_passwordController.text != _confirmPasswordController.text) { +// Utils.showToast("خطأ في تطابق كلمات المرور"); +// return; +// } +// widget.onPassword(_passwordController.text); +// }, +// style: TextButton.styleFrom( +// primary: Colors.white, +// padding: EdgeInsets.all(2), +// backgroundColor: ColorConsts.secondaryPink, +// textStyle: TextStyle(fontSize: 14, fontFamily: "DroidKufi"), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(6.0), +// ), +// ), +// child: Text("إعادة تعيين كلمة المرور"), +// ), +// ), +// ], +// ), +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/general_dialog.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/general_dialog.dart new file mode 100644 index 0000000..22255eb --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/general_dialog.dart @@ -0,0 +1,55 @@ +// import 'package:flutter/material.dart'; +// import 'package:tangheem/classes/colors.dart'; +// +// class GeneralDialog extends StatelessWidget { +// final String message; +// GeneralDialog({Key key, this.message}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return Dialog( +// insetPadding: EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(12), +// ), +// elevation: 0, +// backgroundColor: Colors.transparent, +// child: Container( +// width: double.infinity, +// decoration: BoxDecoration( +// color: ColorConsts.primaryBlue, +// borderRadius: BorderRadius.circular(16), +// ), +// padding: EdgeInsets.symmetric(vertical: 32, horizontal: 16), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// message ?? "للحصول على تجربة أفضل ، يرجى إمالة هاتفك واستخدام التطبيق في الوضع الأفقي", +// textAlign: TextAlign.center, +// style: TextStyle(color: Colors.white), +// ), +// SizedBox(height: 32), +// SizedBox( +// width: double.infinity, +// height: 40, +// child: TextButton( +// onPressed: () => Navigator.pop(context), +// style: TextButton.styleFrom( +// primary: Colors.white, +// padding: EdgeInsets.all(2), +// backgroundColor: ColorConsts.secondaryPink, +// textStyle: TextStyle(fontSize: 14, fontFamily: "DroidKufi"), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(6.0), +// ), +// ), +// child: Text("نعم"), +// ), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/loading_dialog.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/loading_dialog.dart new file mode 100644 index 0000000..371b9fa --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/loading_dialog.dart @@ -0,0 +1,58 @@ +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/rendering.dart'; +// import 'package:tangheem/classes/colors.dart'; +// +// class LoadingDialog extends StatefulWidget { +// LoadingDialog({Key key}) : super(key: key); +// +// @override +// _LoadingDialogState createState() { +// return _LoadingDialogState(); +// } +// } +// +// class _LoadingDialogState extends State { +// @override +// void initState() { +// super.initState(); +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Dialog( +// insetPadding: EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(16), +// ), +// elevation: 0, +// backgroundColor: Colors.transparent, +// child: Directionality( +// textDirection: TextDirection.rtl, +// child: Center( +// child: Container( +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(16), +// ), +// padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), +// child: SizedBox( +// height: 32, +// width: 32, +// child: CircularProgressIndicator( +// strokeWidth: 2, +// valueColor: AlwaysStoppedAnimation(ColorConsts.textGrey), +// ), +// ), +// ), +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/otp_dialog.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/otp_dialog.dart new file mode 100644 index 0000000..6b0238b --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/dialogs/otp_dialog.dart @@ -0,0 +1,116 @@ +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/rendering.dart'; +// import 'package:tangheem/classes/colors.dart'; +// import 'package:tangheem/classes/utils.dart'; +// import 'package:tangheem/widgets/otp_widget.dart'; +// +// class OTPDialog extends StatefulWidget { +// final Function(int) onOTP; +// +// OTPDialog({Key key, this.onOTP}) : super(key: key); +// +// @override +// _OTPDialogState createState() { +// return _OTPDialogState(); +// } +// } +// +// class _OTPDialogState extends State { +// final TextEditingController _pinPutController = TextEditingController(); +// +// bool hasError = false; +// String errorMessage; +// String otpMessage = ""; +// +// @override +// void initState() { +// super.initState(); +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Dialog( +// insetPadding: EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(12), +// ), +// elevation: 0, +// backgroundColor: Colors.transparent, +// child: Container( +// width: double.infinity, +// decoration: BoxDecoration( +// color: ColorConsts.primaryBlue, +// borderRadius: BorderRadius.circular(16), +// ), +// padding: EdgeInsets.symmetric(vertical: 32, horizontal: 16), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// "الرجاء إدخال الرقم المرسل إلى جوالك", +// textAlign: TextAlign.center, +// style: TextStyle(color: Colors.white), +// ), +// Container( +// margin: EdgeInsets.only(top: 8, bottom: 8), +// padding: EdgeInsets.all(6), +// decoration: BoxDecoration( +// border: Border.all(width: 1, color: Colors.white), +// ), +// child: OTPWidget( +// autoFocus: true, +// controller: _pinPutController, +// defaultBorderColor: Colors.transparent, +// maxLength: 4, +// hasError: hasError, +// onTextChanged: (text) { +// setState(() { +// hasError = false; +// }); +// }, +// pinBoxColor: ColorConsts.secondaryWhite.withOpacity(0.2), +// onDone: (text) => otpMessage = text, +// textBorderColor: Colors.transparent, +// pinBoxWidth: 40, +// pinBoxHeight: 40, +// pinTextStyle: TextStyle(fontSize: 20.0, color: Colors.white), +// pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition, +// pinTextAnimatedSwitcherDuration: Duration(milliseconds: 300), +// keyboardType: TextInputType.number, +// ), +// ), +// SizedBox( +// width: double.infinity, +// height: 40, +// child: TextButton( +// onPressed: () { +// if (otpMessage.length < 4) { +// Utils.showToast("الرقم الذي قمت بإدخاله غير صحيح"); +// return; +// } +// widget.onOTP(int.parse(otpMessage)); +// }, +// style: TextButton.styleFrom( +// primary: Colors.white, +// padding: EdgeInsets.all(2), +// backgroundColor: ColorConsts.secondaryPink, +// textStyle: TextStyle(fontSize: 14, fontFamily: "DroidKufi"), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(6.0), +// ), +// ), +// child: Text("تحقق من الرقم"), +// ), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/misc/no_data_ui.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/misc/no_data_ui.dart new file mode 100644 index 0000000..d7110ed --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/misc/no_data_ui.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/colors.dart'; + +class NoDataUI extends StatelessWidget { + NoDataUI({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + padding: const EdgeInsets.only(top: 100), + child: Column( + children: [ + SvgPicture.asset("assets/icons/no_data.svg", width: 75, height: 75), + const SizedBox(height: 8), + Text( + "لا توجد بيانات", + style: TextStyle(fontSize: 16, color: MyColors.darkTextColor.withOpacity(0.7), fontWeight: FontWeight.w600), + ), + const SizedBox(height: 16), + ], + ), + ); + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/ui/screens/tangheem_detail_screen.dart b/lib/sikander_later_will_remove_to_parent_directory/ui/screens/tangheem_detail_screen.dart new file mode 100644 index 0000000..b4ca256 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/ui/screens/tangheem_detail_screen.dart @@ -0,0 +1,819 @@ +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter_html/flutter_html.dart'; +// import 'package:flutter_svg/flutter_svg.dart'; +// import 'package:shared_preferences/shared_preferences.dart'; +// import 'package:tangheem/api/admin_configuration_api_client.dart'; +// import 'package:tangheem/api/tangheem_user_api_client.dart'; +// import 'package:tangheem/app_state/app_state.dart'; +// import 'package:tangheem/classes/colors.dart'; +// import 'package:tangheem/classes/consts.dart'; +// import 'package:tangheem/classes/utils.dart'; +// import 'package:tangheem/extensions/string_extensions.dart'; +// import 'package:tangheem/models/aya_tangheem_type_mapped.dart'; +// import 'package:tangheem/models/discussion_model.dart'; +// import 'package:tangheem/ui/dialogs/discussion_input_dialog.dart'; +// import 'package:tangheem/widgets/aya_player_widget.dart'; +// import 'package:tangheem/widgets/aya_record_widget.dart'; +// import 'package:tangheem/widgets/text_highlight_widget.dart'; +// +// import 'login_screen.dart'; +// +// class TangheemDetailParams { +// final String selectedTangheemTypeId; +// final List ayatTangheemTypeMappedDataList; +// +// TangheemDetailParams({@required this.selectedTangheemTypeId, @required this.ayatTangheemTypeMappedDataList}); +// } +// +// class TangheemDetailScreen extends StatefulWidget { +// static const String routeName = "/tangheem_detail"; +// final TangheemDetailParams tangheemDetailParams; +// +// TangheemDetailScreen({Key key, this.tangheemDetailParams}) : super(key: key); +// +// @override +// _TangheemDetailScreenState createState() { +// return _TangheemDetailScreenState(); +// } +// } +// +// class _TangheemDetailScreenState extends State { +// GlobalKey _globalKey = GlobalKey(); +// +// List voiceNoteList = []; +// +// List ayatTangheemTypeMappedDataList = []; +// +// List _dataList = []; +// +// int _discussionPage = -1; +// AyatTangheemTypeMappedData _ayatTangheemTypeMappedFirstData; +// DiscussionModel _discussionModel; +// +// bool showAyaPlayer = false; +// +// @override +// void initState() { +// super.initState(); +// ayatTangheemTypeMappedDataList = widget.tangheemDetailParams.ayatTangheemTypeMappedDataList; +// _ayatTangheemTypeMappedFirstData = ayatTangheemTypeMappedDataList.first; +// filterVoiceListData(); +// getPrefs(); +// getTangheemDiscussionAndRelatedData(); +// } +// +// double fontSize = 18; +// +// SharedPreferences prefs; +// +// void getPrefs() async { +// prefs = await SharedPreferences.getInstance(); +// fontSize = (prefs.getInt(GlobalConsts.fontZoomSize) ?? 18) + 0.0; +// setState(() {}); +// } +// +// String getArabicIndexWord(int index) { +// if (index == 0) { +// return 'الأولى'; +// } else if (index == 1) { +// return 'الثانية'; +// } else if (index == 2) { +// return 'الثالثة'; +// } else if (index == 3) { +// return 'الرابعة'; +// } else if (index == 4) { +// return 'الخامسة'; +// } +// return ""; +// } +// +// void getTangheemDiscussionAndRelatedData() async { +// Utils.showLoading(context); +// try { +// _discussionModel = await TangheemUserApiClient().getDiscussionByTangheemID(_discussionPage, widget.tangheemDetailParams.selectedTangheemTypeId); +// if (!_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs.contains(",")) { +// _dataList = await getTangheemRelatedData(); +// } +// Utils.hideLoading(context); +// setState(() {}); +// } catch (ex) { +// print(ex); +// Utils.handleException(ex, null); +// Utils.hideLoading(context); +// } +// } +// +// Future> getTangheemRelatedData() async { +// _dataList = []; +// AyatTangheemTypeMapped _ayatTangheemTypeMapped = +// await TangheemUserApiClient().getAyaTangheemTypeMappedRelated(_ayatTangheemTypeMappedFirstData.surahNo, _ayatTangheemTypeMappedFirstData.ayatNumberInSurahs); +// _dataList = _ayatTangheemTypeMapped?.data ?? []; +// if (_dataList.isNotEmpty) { +// _dataList = _dataList.where((element) => element.tangheemTypeId != _ayatTangheemTypeMappedFirstData.tangheemTypeId)?.toList() ?? []; +// var _tempList = _dataList.map((e) => e.tangheemTypeId).toList().toSet().toList(); +// var _dataTempList = []; +// _tempList.forEach((_tempElement) { +// _dataTempList.add(_dataList.firstWhere((element) { +// return !element.ayatNumberInSurahs.contains(",") && (element.tangheemTypeId == _tempElement); +// }, orElse: null)); +// }); +// _dataList = _dataTempList; +// } +// +// return _dataList; +// } +// +// void sendComment(String discussionText) async { +// Utils.showLoading(context); +// try { +// await AdminConfigurationApiClient().addDiscussion(discussionText, _ayatTangheemTypeMappedFirstData.ayaTangheemTypeId); +// Utils.showToast("تم إرسال التعليق ، سيكون مرئيًا بمجرد موافقة المسؤول عليه"); +// Utils.hideLoading(context); +// Navigator.pop(context); +// } catch (ex) { +// Utils.handleException(ex, null); +// Utils.hideLoading(context); +// } +// } +// +// void filterVoiceListData() { +// ayatTangheemTypeMappedDataList.forEach((element) { +// voiceNoteList.addAll(element.voiceNote); +// }); +// } +// +// @override +// void dispose() { +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Container( +// padding: EdgeInsets.fromLTRB(16, 0, 16, 0), +// width: double.infinity, +// child: _ayatTangheemTypeMappedFirstData == null +// ? SizedBox() +// : Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Expanded( +// child: ListView( +// physics: BouncingScrollPhysics(), +// padding: EdgeInsets.only(bottom: 16, top: 16), +// children: [ +// Text( +// _ayatTangheemTypeMappedFirstData.tangheemTypeName ?? "", +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: ColorConsts.primaryBlue, height: 1.5), +// ), +// SizedBox(height: 8), +// Text( +// _ayatTangheemTypeMappedFirstData.tangheemTypeDescription ?? "", +// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1), +// ), +// SizedBox(height: 8), +// Container( +// margin: EdgeInsets.only(top: 4, bottom: 4), +// padding: EdgeInsets.only(top: 8, bottom: 8, right: 4, left: 4), +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(8), +// ), +// child: SingleChildScrollView( +// physics: NeverScrollableScrollPhysics(), +// child: RepaintBoundary( +// key: _globalKey, +// child: Material( +// color: Colors.white, +// child: ListView.builder( +// physics: NeverScrollableScrollPhysics(), +// shrinkWrap: true, +// itemCount: ayatTangheemTypeMappedDataList.length > 5 ? 5 : ayatTangheemTypeMappedDataList.length, +// itemBuilder: (context, index) { +// var _ayatTangheemTypeMappedData = ayatTangheemTypeMappedDataList[index]; +// List _tangheemInsideTableList = []; +// List _tangheemAboveTableList = []; +// List _tangheemBelowTableList = []; +// List _tangheemWords = []; +// +// List _tempPropertyList = List() + _ayatTangheemTypeMappedData?.property ?? []; +// int firstIndex = _tempPropertyList.indexWhere((element) => element.isInsideTable); +// if (firstIndex >= 0) { +// var _tempPropertyListTop = _tempPropertyList.take(firstIndex); +// _tempPropertyListTop = _tempPropertyListTop.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; +// _tangheemAboveTableList = _tempPropertyListTop; +// _tempPropertyListTop.forEach((element) { +// _tempPropertyList.remove(element); +// }); +// var _tempPropertyListInside = _tempPropertyList?.where((element) => (element.isInsideTable))?.toList() ?? []; +// _tempPropertyListInside.forEach((element) { +// _tempPropertyList.remove(element); +// }); +// _tempPropertyListInside = _tempPropertyListInside.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; +// _tangheemInsideTableList = _tempPropertyListInside; +// var _tempPropertyListBelow = _tempPropertyList; +// _tempPropertyListBelow = _tempPropertyListBelow.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; +// _tangheemBelowTableList = _tempPropertyListBelow; +// } +// +// _tangheemWords.add(_ayatTangheemTypeMappedData.highlightText ?? ""); +// // _tangheemInsideTableList = +// // _ayatTangheemTypeMappedData?.property?.where((element) => (element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; +// // _tangheemAboveTableList = +// // _ayatTangheemTypeMappedData?.property?.where((element) => (!element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; +// // +// // +// +// var _tempTangheemIndexWord = ""; +// if (ayatTangheemTypeMappedDataList.length == 1) { +// _tempTangheemIndexWord = ""; +// } else { +// _tempTangheemIndexWord = getArabicIndexWord(index) + " "; +// } +// +// return ListView( +// physics: NeverScrollableScrollPhysics(), +// shrinkWrap: true, +// padding: EdgeInsets.all(4), +// children: [ +// Row( +// children: [ +// Text( +// " جملة ${_ayatTangheemTypeMappedData.tangheemTypeName} $_tempTangheemIndexWord", +// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white, backgroundColor: ColorConsts.primaryBlue), +// ), +// Expanded( +// child: Container(height: 2, color: ColorConsts.primaryBlue), +// ), +// ], +// ), +// SizedBox(height: 8), +// TextHighLightWidget( +// text: _ayatTangheemTypeMappedData.reverseAyatNumber() ?? "", +// valueColor: ColorConsts.primaryBlue, +// highlights: _tangheemWords, +// highLightFontSize: fontSize, +// style: TextStyle( +// fontFamily: "UthmanicHafs", +// fontSize: fontSize, +// fontWeight: FontWeight.bold, +// ), +// ), +// SizedBox(height: 16), +// ListView.separated( +// itemCount: _tangheemAboveTableList.length, +// physics: NeverScrollableScrollPhysics(), +// shrinkWrap: true, +// separatorBuilder: (context, index) { +// return Divider( +// color: Colors.white, +// height: 4, +// thickness: 0, +// ); +// }, +// itemBuilder: (context, index) { +// return Row( +// children: [ +// Expanded( +// child: Container( +// height: 40, +// padding: EdgeInsets.only(left: 4, right: 8), +// alignment: Alignment.centerRight, +// child: Text( +// _tangheemAboveTableList[index].propertyText, +// maxLines: 1, +// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), +// ), +// color: ColorConsts.secondaryWhite, +// ), +// ), +// SizedBox(width: 4), +// Expanded( +// child: Container( +// color: ColorConsts.secondaryWhite, +// padding: EdgeInsets.all(4), +// child: Container( +// color: Colors.white, +// padding: EdgeInsets.only(left: 4, right: 8), +// // alignment: Alignment.centerRight, +// child: Html( +// data: _tangheemAboveTableList[index]?.propertyValue ?? "", +// style: { +// 'html': Style(textAlign: TextAlign.left), +// }, +// ), +// +// // Text( +// // _tangheemAboveTableList[index].propertyValue, +// // maxLines: 1, +// // style: TextStyle( +// // color: Color( +// // Utils.stringToHex(_tangheemAboveTableList[index].textColor), +// // ), +// // ), +// // ), +// ), +// ), +// ) +// ], +// ); +// }), +// if (_tangheemInsideTableList.isNotEmpty) +// Container( +// color: ColorConsts.primaryBlue, +// margin: EdgeInsets.only(top: 8, bottom: 8), +// padding: EdgeInsets.all(8), +// child: Column( +// children: [ +// Text( +// "خط النبر و التنغيم ل${_ayatTangheemTypeMappedData.tangheemTypeName ?? ""}", +// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white), +// ), +// SizedBox(height: 8), +// tangheemInsideTablePropertyView(_tangheemInsideTableList) +// ], +// ), +// ), +// tangheemOutSideTablePropertyView(_tangheemBelowTableList) +// ], +// ); +// }), +// ), +// ), +// ), +// ), +// SizedBox(height: 8), +// discussionView(_discussionModel?.data ?? []), +// if (_dataList.isNotEmpty) +// Container( +// margin: EdgeInsets.only(top: 8), +// padding: EdgeInsets.only(bottom: 20), +// width: double.infinity, +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(8), +// ), +// child: Column( +// children: [ +// Container( +// height: 60, +// width: double.infinity, +// margin: EdgeInsets.only(bottom: 8), +// alignment: Alignment.center, +// decoration: BoxDecoration( +// color: ColorConsts.primaryBlue, +// borderRadius: BorderRadius.only( +// topLeft: Radius.circular(8), +// topRight: Radius.circular(8), +// ), +// ), +// child: Text( +// "قائمة الأساليب اللغوية في هذه الآية", +// style: TextStyle(fontSize: 16, color: Colors.white), +// ), +// ), +// ListView.separated( +// padding: EdgeInsets.fromLTRB(4, 8, 4, 4), +// shrinkWrap: true, +// physics: NeverScrollableScrollPhysics(), +// itemCount: _dataList.length, +// separatorBuilder: (context, index) => SizedBox(height: 16), +// itemBuilder: (context, index) { +// return InkWell( +// onTap: () { +// List list = _dataList; +// var removedData = list[index]; +// list.remove(removedData); +// list.insert(0, removedData); +// TangheemDetailParams tangheem = TangheemDetailParams(selectedTangheemTypeId: _dataList[index].ayaTangheemTypeId, ayatTangheemTypeMappedDataList: list); +// Navigator.pushNamed(context, TangheemDetailScreen.routeName, arguments: tangheem); +// }, +// child: Text( +// _dataList[index].tangheemTypeName, +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.secondaryOrange, height: 1.5), +// ), +// ); +// }, +// ), +// ], +// ), +// ), +// SizedBox(height: 16), +// AyaRecordWidget() +// ], +// ), +// ), +// if (MediaQuery.of(context).orientation == Orientation.portrait) +// AyaPlayerWidget( +// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", +// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", +// globalKey: _globalKey, +// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, +// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, +// voiceNoteList: voiceNoteList), +// if (MediaQuery.of(context).orientation == Orientation.landscape) +// Column( +// mainAxisSize: MainAxisSize.min, +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Container( +// height: 24, +// margin: EdgeInsets.only(bottom: 8, top: 8), +// // color: Colors.transparent, +// child: TextButton( +// onPressed: () { +// setState(() { +// showAyaPlayer = !showAyaPlayer; +// }); +// }, +// child: Text( +// showAyaPlayer ? "إخفاء التسجيلات" : "إظهار التسجيلات", +// style: TextStyle(color: Colors.black87, fontSize: 12), +// ), +// style: TextButton.styleFrom( +// backgroundColor: ColorConsts.gradientOrange, +// primary: ColorConsts.primaryBlue, +// padding: EdgeInsets.only(top: 4, bottom: 4, right: 8, left: 8), +// textStyle: TextStyle(color: Colors.white, fontSize: 12), +// ), +// ), +// ), +// if (showAyaPlayer) +// AyaPlayerWidget( +// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", +// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", +// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, +// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, +// globalKey: _globalKey, +// voiceNoteList: voiceNoteList), +// ], +// ) +// ], +// ), +// ); +// } +// +// Widget nextOptionButton(String icon, String text, VoidCallback onPressed) { +// return InkWell( +// onTap: onPressed, +// child: onPressed == null +// ? SizedBox() +// : Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisSize: MainAxisSize.min, +// children: [ +// SvgPicture.asset(icon, height: 12, width: 12), +// SizedBox(width: 4), +// Text( +// text, +// style: TextStyle(color: ColorConsts.textGrey), +// ), +// ], +// ), +// ); +// } +// +// Widget previousOptionButton(String icon, String text, VoidCallback onPressed) { +// return InkWell( +// onTap: onPressed, +// child: onPressed == null +// ? SizedBox() +// : Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisSize: MainAxisSize.min, +// children: [ +// Text( +// text, +// style: TextStyle(color: ColorConsts.textGrey), +// ), +// SizedBox(width: 4), +// SvgPicture.asset(icon, height: 12, width: 12), +// ], +// ), +// ); +// } +// +// Widget tangheemOutSideTablePropertyView(List tangheemPropertyList) { +// return ListView.separated( +// itemCount: tangheemPropertyList.length, +// physics: NeverScrollableScrollPhysics(), +// shrinkWrap: true, +// separatorBuilder: (context, index) { +// return Divider( +// color: Colors.white, +// height: 4, +// thickness: 0, +// ); +// }, +// itemBuilder: (context, index) { +// return Row( +// children: [ +// Expanded( +// child: Container( +// height: 40, +// padding: EdgeInsets.only(left: 4, right: 8), +// alignment: Alignment.centerRight, +// child: Text( +// tangheemPropertyList[index].propertyText, +// maxLines: 1, +// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), +// ), +// color: ColorConsts.secondaryWhite, +// ), +// ), +// SizedBox(width: 4), +// Expanded( +// child: Container( +// color: ColorConsts.secondaryWhite, +// padding: EdgeInsets.all(4), +// child: Container( +// color: Colors.white, +// padding: EdgeInsets.only(left: 4, right: 8), +// // alignment: Alignment.centerRight, +// child: Html( +// data: tangheemPropertyList[index]?.propertyValue ?? "", +// style: { +// 'html': Style(textAlign: TextAlign.left), +// }, +// ), +// // Text( +// // tangheemPropertyList[index].propertyValue, +// // maxLines: 1, +// // style: TextStyle( +// // color: Color( +// // Utils.stringToHex(tangheemPropertyList[index].textColor), +// // ), +// // ), +// // ), +// ), +// ), +// ) +// ], +// ); +// }); +// } +// +// Widget tangheemInsideTablePropertyView(List tangheemPropertyList) { +// return Container( +// color: Colors.white, +// padding: EdgeInsets.all(2), +// child: Row( +// children: [ +// for (var property in tangheemPropertyList) +// Expanded( +// child: Container( +// // color: ColorConsts.secondaryWhite, +// // padding: EdgeInsets.all(8), +// margin: EdgeInsets.only(left: 2, right: 2), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Container( +// color: ColorConsts.secondaryWhite, +// //height: 30, +// alignment: Alignment.center, +// padding: EdgeInsets.only(left: 2, right: 4), +// width: double.infinity, +// child: Text( +// property.propertyText ?? "", +// // maxLines: 1, +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), +// ), +// ), +// Container(width: double.infinity, height: 4, color: Colors.white), +// Container( +// color: ColorConsts.secondaryWhite, +// padding: EdgeInsets.all(4), +// child: Container( +// color: Colors.white, +// padding: EdgeInsets.only(left: 2, right: 4), +// width: double.infinity, +// child: Html( +// data: property.propertyValue ?? "", +// style: { +// 'html': Style(textAlign: TextAlign.left), +// }, +// ), +// +// // Text( +// // property.propertyValue ?? "", +// // maxLines: 1, +// // style: TextStyle( +// // fontSize: 12, +// // color: Color( +// // Utils.stringToHex(property.textColor), +// // ), +// // ), +// // ), +// ), +// ), +// ], +// ), +// ), +// ) +// ], +// ) +// +// //@todo sikander :commented these line for later discussion +// // ListView.separated( +// // itemCount: tangheemPropertyList.length, +// // physics: NeverScrollableScrollPhysics(), +// // padding: EdgeInsets.zero, +// // shrinkWrap: true, +// // separatorBuilder: (context, index) { +// // return Divider( +// // color: Colors.white, +// // height: 1, +// // thickness: 0, +// // ); +// // }, +// // itemBuilder: (context, index) { +// // return Container( +// // color: ColorConsts.secondaryWhite, +// // padding: EdgeInsets.all(8), +// // child: Column( +// // mainAxisSize: MainAxisSize.min, +// // crossAxisAlignment: CrossAxisAlignment.start, +// // mainAxisAlignment: MainAxisAlignment.center, +// // children: [ +// // Text( +// // tangheemPropertyList[index].propertyText ?? "", +// // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), +// // ), +// // SizedBox(height: 4), +// // Text( +// // tangheemPropertyList[index].propertyValue ?? "", +// // style: TextStyle( +// // fontSize: 12, +// // color: Color( +// // Utils.stringToHex(tangheemPropertyList[index].textColor), +// // ), +// // ), +// // ), +// // ], +// // ), +// // ); +// // }, +// // ), +// ); +// } +// +// Widget discussionView(List _discussionList) { +// _discussionList = _discussionList.where((element) => element.status.toLowerCase() == "Accept".toLowerCase()).toList(); +// return Stack( +// alignment: Alignment.bottomCenter, +// children: [ +// Container( +// margin: EdgeInsets.only(top: 4, bottom: 25), +// padding: EdgeInsets.all(8), +// width: double.infinity, +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(8), +// ), +// child: _discussionList.length > 0 +// ? ListView.separated( +// padding: EdgeInsets.only(top: 4, bottom: 24), +// shrinkWrap: true, +// physics: NeverScrollableScrollPhysics(), +// itemCount: _discussionList.length, +// separatorBuilder: (context, index) => SizedBox(height: 16), +// itemBuilder: (context, index) { +// return Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisSize: MainAxisSize.min, +// children: [ +// Row( +// children: [ +// SvgPicture.asset( +// "assets/icons/chat_user.svg", +// width: 60, +// height: 60, +// ), +// SizedBox(width: 8), +// Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Text( +// "تعليق على الآية ${_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs}", +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.primaryBlue, height: 1.5), +// ), +// SizedBox(height: 4), +// Directionality( +// textDirection: TextDirection.ltr, +// child: Text( +// _discussionList[index].date.toFormattedDate(), +// style: TextStyle(fontSize: 12, color: ColorConsts.textGrey, height: 1), +// ), +// ), +// ], +// ) +// ], +// ), +// SizedBox(height: 4), +// Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text( +// "تعليق من: " + _discussionList[index].userName, +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: ColorConsts.primaryBlue, height: 1.5), +// ), +// Text( +// _discussionList[index].discussionText, +// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), +// ), +// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) SizedBox(height: 4), +// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) +// Text( +// "رد من المسؤول: " + _discussionList[index].adminResponse, +// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), +// ), +// ], +// ) +// ], +// ); +// }, +// ) +// : Text( +// "لا يوجد تعليقات", +// style: TextStyle(fontSize: 12, color: ColorConsts.primaryBlue, height: 1.5), +// ), +// ), +// Positioned( +// bottom: 0, +// child: InkWell( +// borderRadius: BorderRadius.circular(30), +// onTap: () async { +// if (!AppState().isUserLogin) { +// Widget cancelButton = FlatButton( +// child: Text("أرغب بالتسجيل"), +// onPressed: () async { +// Navigator.pop(context); +// await Navigator.pushNamed(context, LoginScreen.routeName); +// if (!AppState().isUserLogin) { +// return; +// } +// }, +// ); +// Widget continueButton = FlatButton( +// child: Text("استمرار كضيف"), +// onPressed: () { +// Navigator.pop(context); +// return; +// }, +// ); +// +// AlertDialog alert = AlertDialog( +// content: Text("هذه الخاصية متاحه فقط للأعضاء المسجلين"), +// actions: [ +// cancelButton, +// continueButton, +// ], +// ); +// +// showDialog( +// context: context, +// builder: (BuildContext context) { +// return alert; +// }, +// ); +// +// return; +// } +// showDialog( +// context: context, +// barrierColor: ColorConsts.secondaryWhite.withOpacity(0.8), +// builder: (BuildContext context) => DiscussionInputDialog(onCommentPress: (comment) { +// sendComment(comment); +// }), +// ); +// }, +// child: Container( +// height: 40, +// padding: EdgeInsets.only(left: 24, right: 24), +// alignment: Alignment.centerRight, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(30), +// color: ColorConsts.gradientPink, +// gradient: LinearGradient( +// stops: [0.0, 0.5], +// begin: Alignment.topCenter, +// end: Alignment.bottomCenter, +// colors: [ColorConsts.gradientPink, ColorConsts.gradientOrange], +// ), +// ), +// child: Text( +// "إضافة تعليق", +// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: Colors.white, height: 1.5), +// ), +// ), +// ), +// ), +// ], +// ); +// } +// } diff --git a/lib/sikander_later_will_remove_to_parent_directory/widgets/input_widget.dart b/lib/sikander_later_will_remove_to_parent_directory/widgets/input_widget.dart new file mode 100644 index 0000000..162fd35 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/widgets/input_widget.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/colors.dart'; + +class InputWidget extends StatelessWidget { + final String labelText; + final String hintText; + final TextEditingController controller; + final VoidCallback? suffixTap; + final bool isEnable; + final bool hasSelection; + final int? lines; + final bool isInputTypeNum; + final bool isObscureText; + + InputWidget(this.labelText, this.hintText, this.controller, + {this.isObscureText = false, this.suffixTap, this.isEnable = true, this.hasSelection = false, this.lines = 1, this.isInputTypeNum = false}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: Colors.white, + border: Border.all( + color: Color(0xffefefef), + width: 1, + ), + ), + child: InkWell( + onTap: hasSelection ? () {} : null, + child: Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + labelText, + style: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.w600, + color: Color(0xff2B353E), + letterSpacing: -0.44, + ), + ), + TextField( + enabled: isEnable, + scrollPadding: EdgeInsets.zero, + keyboardType: isInputTypeNum ? TextInputType.number : TextInputType.text, + controller: controller, + maxLines: lines, + obscuringCharacter: "*", + obscureText: isObscureText, + onChanged: (value) => {}, + style: const TextStyle( + fontSize: 14, + height: 21 / 14, + fontWeight: FontWeight.w400, + color: Color(0xff2B353E), + letterSpacing: -0.44, + ), + decoration: InputDecoration( + isDense: true, + hintText: hintText, + hintStyle: const TextStyle( + fontSize: 14, + height: 21 / 14, + fontWeight: FontWeight.w400, + color: Color(0xff575757), + letterSpacing: -0.56, + ), + suffixIconConstraints: const BoxConstraints(minWidth: 50), + suffixIcon: suffixTap == null ? null : IconButton(icon: const Icon(Icons.mic, color: MyColors.darkTextColor), onPressed: suffixTap), + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + ), + ], + ), + ), + if (hasSelection) Icon(Icons.keyboard_arrow_down_outlined), + ], + ), + ), + ); + } +} diff --git a/lib/sikander_later_will_remove_to_parent_directory/widgets/otp_widget.dart b/lib/sikander_later_will_remove_to_parent_directory/widgets/otp_widget.dart new file mode 100644 index 0000000..bf03b72 --- /dev/null +++ b/lib/sikander_later_will_remove_to_parent_directory/widgets/otp_widget.dart @@ -0,0 +1,373 @@ +// import 'dart:async'; +// +// import 'package:flutter/animation.dart'; +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/rendering.dart'; +// import 'package:flutter/services.dart'; +// +// typedef OnDone = void Function(String text); +// +// class ProvidedPinBoxTextAnimation { +// static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) { +// return ScaleTransition( +// child: child, +// scale: animation, +// ); +// }; +// +// static AnimatedSwitcherTransitionBuilder defaultNoTransition = (Widget child, Animation animation) { +// return child; +// }; +// } +// +// class OTPWidget extends StatefulWidget { +// final int maxLength; +// final TextEditingController controller; +// +// final Color defaultBorderColor; +// final Color pinBoxColor; +// final double pinBoxBorderWidth; +// final double pinBoxRadius; +// final bool hideDefaultKeyboard; +// +// final TextStyle pinTextStyle; +// final double pinBoxHeight; +// final double pinBoxWidth; +// final OnDone onDone; +// final bool hasError; +// final Color errorBorderColor; +// final Color textBorderColor; +// final Function(String) onTextChanged; +// final bool autoFocus; +// final FocusNode focusNode; +// final AnimatedSwitcherTransitionBuilder pinTextAnimatedSwitcherTransition; +// final Duration pinTextAnimatedSwitcherDuration; +// final TextDirection textDirection; +// final TextInputType keyboardType; +// final EdgeInsets pinBoxOuterPadding; +// +// const OTPWidget({ +// Key key, +// this.maxLength: 4, +// this.controller, +// this.pinBoxWidth: 70.0, +// this.pinBoxHeight: 70.0, +// this.pinTextStyle, +// this.onDone, +// this.defaultBorderColor: Colors.black, +// this.textBorderColor: Colors.black, +// this.pinTextAnimatedSwitcherTransition, +// this.pinTextAnimatedSwitcherDuration: const Duration(), +// this.hasError: false, +// this.errorBorderColor: Colors.red, +// this.onTextChanged, +// this.autoFocus: false, +// this.focusNode, +// this.textDirection: TextDirection.ltr, +// this.keyboardType: TextInputType.number, +// this.pinBoxOuterPadding = const EdgeInsets.symmetric(horizontal: 4.0), +// this.pinBoxColor = Colors.white, +// this.pinBoxBorderWidth = 2.0, +// this.pinBoxRadius = 0, +// this.hideDefaultKeyboard = false, +// }) : super(key: key); +// +// @override +// State createState() { +// return OTPWidgetState(); +// } +// } +// +// class OTPWidgetState extends State with SingleTickerProviderStateMixin { +// AnimationController _highlightAnimationController; +// FocusNode focusNode; +// String text = ""; +// int currentIndex = 0; +// List strList = []; +// bool hasFocus = false; +// +// @override +// void didUpdateWidget(OTPWidget oldWidget) { +// super.didUpdateWidget(oldWidget); +// focusNode = widget.focusNode ?? focusNode; +// +// if (oldWidget.maxLength < widget.maxLength) { +// setState(() { +// currentIndex = text.length; +// }); +// widget.controller?.text = text; +// widget.controller?.selection = TextSelection.collapsed(offset: text.length); +// } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.length > 0 && text.length > widget.maxLength) { +// setState(() { +// text = text.substring(0, widget.maxLength); +// currentIndex = text.length; +// }); +// widget.controller?.text = text; +// widget.controller?.selection = TextSelection.collapsed(offset: text.length); +// } +// } +// +// _calculateStrList() { +// if (strList.length > widget.maxLength) { +// strList.length = widget.maxLength; +// } +// while (strList.length < widget.maxLength) { +// strList.add(""); +// } +// } +// +// @override +// void initState() { +// super.initState(); +// focusNode = widget.focusNode ?? FocusNode(); +// +// _initTextController(); +// _calculateStrList(); +// widget.controller?.addListener(_controllerListener); +// focusNode?.addListener(_focusListener); +// } +// +// void _controllerListener() { +// if (mounted == true) { +// setState(() { +// _initTextController(); +// }); +// var onTextChanged = widget.onTextChanged; +// if (onTextChanged != null) { +// onTextChanged(widget.controller?.text ?? ""); +// } +// } +// } +// +// void _focusListener() { +// if (mounted == true) { +// setState(() { +// hasFocus = focusNode?.hasFocus ?? false; +// }); +// } +// } +// +// void _initTextController() { +// if (widget.controller == null) { +// return; +// } +// strList.clear(); +// var text = widget.controller?.text ?? ""; +// if (text.isNotEmpty) { +// if (text.length > widget.maxLength) { +// throw Exception("TextEditingController length exceeded maxLength!"); +// } +// } +// for (var i = 0; i < text.length; i++) { +// strList.add(text[i]); +// } +// } +// +// double get _width { +// var width = 0.0; +// for (var i = 0; i < widget.maxLength; i++) { +// width += widget.pinBoxWidth; +// if (i == 0) { +// width += widget.pinBoxOuterPadding.left; +// } else if (i + 1 == widget.maxLength) { +// width += widget.pinBoxOuterPadding.right; +// } else { +// width += widget.pinBoxOuterPadding.left; +// } +// } +// return width; +// } +// +// @override +// void dispose() { +// if (widget.focusNode == null) { +// focusNode?.dispose(); +// } else { +// focusNode?.removeListener(_focusListener); +// } +// _highlightAnimationController?.dispose(); +// widget.controller?.removeListener(_controllerListener); +// +// super.dispose(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Stack( +// children: [ +// _otpTextInput(), +// _touchPinBoxRow(), +// ], +// ); +// } +// +// Widget _touchPinBoxRow() { +// return widget.hideDefaultKeyboard +// ? _pinBoxRow(context) +// : GestureDetector( +// behavior: HitTestBehavior.opaque, +// onTap: () { +// if (hasFocus) { +// FocusScope.of(context).requestFocus(FocusNode()); +// Future.delayed(Duration(milliseconds: 100), () { +// FocusScope.of(context).requestFocus(focusNode); +// }); +// } else { +// FocusScope.of(context).requestFocus(focusNode); +// } +// }, +// child: _pinBoxRow(context), +// ); +// } +// +// Widget _otpTextInput() { +// var transparentBorder = OutlineInputBorder( +// borderSide: BorderSide( +// color: Colors.transparent, +// width: 0.0, +// ), +// ); +// return Container( +// width: _width, +// height: widget.pinBoxHeight, +// child: TextField( +// autofocus: !kIsWeb ? widget.autoFocus : false, +// enableInteractiveSelection: false, +// focusNode: focusNode, +// controller: widget.controller, +// keyboardType: widget.keyboardType, +// inputFormatters: widget.keyboardType == TextInputType.number ? [FilteringTextInputFormatter.digitsOnly] : null, +// style: TextStyle( +// height: 0.1, +// color: Colors.transparent, +// ), +// decoration: InputDecoration( +// contentPadding: EdgeInsets.all(0), +// focusedErrorBorder: transparentBorder, +// errorBorder: transparentBorder, +// disabledBorder: transparentBorder, +// enabledBorder: transparentBorder, +// focusedBorder: transparentBorder, +// counterText: null, +// counterStyle: null, +// helperStyle: TextStyle( +// height: 0.0, +// color: Colors.transparent, +// ), +// labelStyle: TextStyle(height: 0.1), +// fillColor: Colors.transparent, +// border: InputBorder.none, +// ), +// cursorColor: Colors.transparent, +// showCursor: false, +// maxLength: widget.maxLength, +// onChanged: _onTextChanged, +// ), +// ); +// } +// +// void _onTextChanged(text) { +// var onTextChanged = widget.onTextChanged; +// if (onTextChanged != null) { +// onTextChanged(text); +// } +// setState(() { +// this.text = text; +// if (text.length >= currentIndex) { +// for (int i = currentIndex; i < text.length; i++) { +// strList[i] = text[i]; +// } +// } +// currentIndex = text.length; +// }); +// if (text.length == widget.maxLength) { +// FocusScope.of(context).requestFocus(FocusNode()); +// var onDone = widget.onDone; +// if (onDone != null) { +// onDone(text); +// } +// } +// } +// +// Widget _pinBoxRow(BuildContext context) { +// _calculateStrList(); +// List pinCodes = List.generate(widget.maxLength, (int i) { +// return _buildPinCode(i, context); +// }); +// return Row(children: pinCodes, mainAxisSize: MainAxisSize.min); +// } +// +// Widget _buildPinCode(int i, BuildContext context) { +// Color borderColor; +// Color pinBoxColor = widget.pinBoxColor; +// +// if (widget.hasError) { +// borderColor = widget.errorBorderColor; +// } else if (i < text.length) { +// borderColor = widget.textBorderColor; +// } else { +// borderColor = widget.defaultBorderColor; +// pinBoxColor = widget.pinBoxColor; +// } +// +// EdgeInsets insets; +// if (i == 0) { +// insets = EdgeInsets.only( +// left: 0, +// top: widget.pinBoxOuterPadding.top, +// right: widget.pinBoxOuterPadding.right, +// bottom: widget.pinBoxOuterPadding.bottom, +// ); +// } else if (i == strList.length - 1) { +// insets = EdgeInsets.only( +// left: widget.pinBoxOuterPadding.left, +// top: widget.pinBoxOuterPadding.top, +// right: 0, +// bottom: widget.pinBoxOuterPadding.bottom, +// ); +// } else { +// insets = widget.pinBoxOuterPadding; +// } +// return Container( +// key: ValueKey("container$i"), +// alignment: Alignment.center, +// padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), +// margin: insets, +// child: _animatedTextBox(strList[i], i), +// decoration: BoxDecoration( +// border: Border.all( +// color: borderColor, +// width: widget.pinBoxBorderWidth, +// ), +// color: pinBoxColor, +// borderRadius: BorderRadius.circular(widget.pinBoxRadius), +// ), +// width: widget.pinBoxWidth, +// height: widget.pinBoxHeight, +// ); +// } +// +// Widget _animatedTextBox(String text, int i) { +// if (widget.pinTextAnimatedSwitcherTransition != null) { +// return AnimatedSwitcher( +// duration: widget.pinTextAnimatedSwitcherDuration, +// transitionBuilder: widget.pinTextAnimatedSwitcherTransition ?? +// (Widget child, Animation animation) { +// return child; +// }, +// child: Text( +// text, +// key: ValueKey("$text$i"), +// style: widget.pinTextStyle, +// ), +// ); +// } else { +// return Text( +// text, +// key: ValueKey("${strList[i]}$i"), +// style: widget.pinTextStyle, +// ); +// } +// } +// } diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 40a00e7..e081009 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/colors.dart'; import 'package:mohem_flutter_app/theme/colors.dart'; class AppTheme { @@ -16,8 +17,7 @@ class AppTheme { hintColor: Colors.grey[400], disabledColor: Colors.grey[300], errorColor: const Color.fromRGBO(235, 80, 60, 1.0), - scaffoldBackgroundColor: const Color(0xffF8F8F8), - + scaffoldBackgroundColor: MyColors.backgroundColor, textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.grey, selectionColor: Color.fromRGBO(80, 100, 253, 0.5), selectionHandleColor: Colors.grey), canvasColor: Colors.white, backgroundColor: const Color.fromRGBO(255, 255, 255, 1), diff --git a/lib/widgets/button/default_button.dart b/lib/widgets/button/default_button.dart new file mode 100644 index 0000000..b8ad88e --- /dev/null +++ b/lib/widgets/button/default_button.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +extension WithContainer on Widget { + Widget get insideContainer => Container(color: Colors.white, padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this); +} + +class DefaultButton extends StatelessWidget { + final String text; + final VoidCallback? onPress; + final Color textColor; + final Color? color; + final Color? disabledColor; + final IconData? iconData; + final String? svgIcon; + final double? fontSize; + final bool isTextExpanded; + final int count; + + DefaultButton(this.text, this.onPress, {this.color, this.isTextExpanded = true, this.svgIcon, this.disabledColor, this.count = 0, this.textColor = Colors.white, this.iconData, this.fontSize}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onPress, + child: Container( + height: 43, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.0), + gradient: onPress == null + ? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) + : const LinearGradient(transform: GradientRotation(.83), begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ + Color(0xff32D892), + Color(0xff259CB8), + ]), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (iconData != null) Icon(iconData, color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), + if (!isTextExpanded) + Padding( + padding: EdgeInsets.only(left: (iconData ?? svgIcon) != null ? 6 : 0), + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), + ), + ), + if (isTextExpanded) + Expanded( + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), + ), + ), + if (count > 0) + Align( + alignment: Alignment.topCenter, + child: Container( + margin: const EdgeInsets.only(top: 6, bottom: 6), + padding: const EdgeInsets.only(left: 5, right: 5), + alignment: Alignment.center, + height: 16, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.0), color: Colors.white), + child: Text( + "$count", + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w700, color: Color(0xffD02127), letterSpacing: -0.6), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index e574414..50eef52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,8 +71,8 @@ flutter: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg assets: - - resources/langs/ - assets/ + - assets/langs/ - assets/icons/ - assets/images/ diff --git a/resources/s.dart b/resources/s.dart deleted file mode 100644 index e69de29..0000000