model improvements

merge-requests/1/merge
Sikander Saleem 4 years ago
parent 8470495332
commit 761b5abbab

@ -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",

@ -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",

@ -1,18 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
class AppLocalizations {
static const Iterable<LocalizationsDelegate<dynamic>> localizationsDelegates =
[
// ... app-specific localization delegate[s] here
// S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate
];
static const List<Locale> supportedLocales = [
const Locale("en", "US")
];
}

@ -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<String, WidgetBuilder> routes = {
login: (context) => LoginScreen(),

@ -14,8 +14,16 @@ class CodegenLoader extends AssetLoader{
return Future.value(mapLocales[locale.toString()]);
}
static const Map<String,dynamic> en = {
static const Map<String,dynamic> 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<String,dynamic> 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<String,dynamic> en_US = {
},
"reset_locale": "Reset Language"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"en": en, "en_US": en_US};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -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<void> 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,

@ -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<LoginScreen> {
TextEditingController username = TextEditingController();
TextEditingController password = TextEditingController();
@override
void initState() {
super.initState();
@ -25,14 +37,67 @@ class _LoginScreenState extends State<LoginScreen> {
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
],
),
);
}
}
}

@ -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> = U Function(dynamic);
class APIError {
int errorCode;
String errorMessage;
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> 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<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? 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<Response> postJsonForResponse<T>(String url, T jsonObject, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? 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<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
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<T> _withClient<T>(Future<T> Function(Client) fn) async {
var httpClient = HttpClient()..badCertificateCallback = _certificateCheck;
var client = IOClient(httpClient);
try {
return await fn(client);
} finally {
client.close();
}
}
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
}

@ -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<SurahModel> getSurahs() async {
String url = "${ApiConsts.tangheemUsers}AlSuar_Get";
var postParams = {};
return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams);
}
Future<MemberModel> getMembers() async {
String url = "${ApiConsts.tangheemUsers}Committee_Get";
var postParams = {};
return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams);
}
Future<ContentInfoModel> getContentInfo(int contentId) async {
String url = "${ApiConsts.tangheemUsers}ContentInfo_Get";
var postParams = {"contentTypeId": contentId};
return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams);
}
}

@ -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;
}
}

@ -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);
}

@ -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";
}

@ -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<dynamic> 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);
}
}
}

@ -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<String, dynamic> toJson() => {'message': message, 'error': error, 'arguments': '$arguments'};
@override
String toString() {
return jsonEncode(this);
}
}

@ -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());
}

@ -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";
}
}
}

@ -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,
);
}

@ -0,0 +1,65 @@
class ContentInfoModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<ContentInfoDataModel>? data;
ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data});
ContentInfoModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
contentInfoId = json['contentInfoId'];
contentTypeId = json['contentTypeId'];
content = json['content'];
contentTypeNameEn = json['contentTypeNameEn'];
contentTypeNameAr = json['contentTypeNameAr'];
fileName = json['fileName'];
exposeFilePath = json['exposeFilePath'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -0,0 +1,62 @@
class MemberModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<MemberDataModel>? data;
MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data});
MemberModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
committeeId = json['committeeId'];
firstName = json['firstName'];
lastName = json['lastName'];
description = json['description'];
picture = json['picture'];
orderNo = json['orderNo'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -0,0 +1,74 @@
class SurahModel {
int? totalItemsCount;
int? statusCode;
String? message;
List<SurahModelData>? data;
SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data});
SurahModel.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

@ -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<CountryModelData> countryList;
// final Function(CountryModelData) onSelectCountry;
//
// CountrySelectionBottomSheet({Key key, this.countryList, this.onSelectCountry}) : super(key: key);
//
// @override
// _CountrySelectionBottomSheetState createState() {
// return _CountrySelectionBottomSheetState();
// }
// }
//
// class _CountrySelectionBottomSheetState extends State<CountrySelectionBottomSheet> {
// TextEditingController _searchCountryController = TextEditingController();
// List<CountryModelData> _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]);
// },
// ),
// ),
// )
// ],
// ),
// ),
// );
// }
// }

@ -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<CommonAppbar> {
// final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
// List<QuickLinksData> quickLinks = [];
// List<NavigationDataModel> 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<Widget> 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),
// ],
// ),
// ),
// );
// }
// }

@ -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<ChangePasswordDialog> {
// 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("إعادة تعيين كلمة المرور"),
// ),
// ),
// ],
// ),
// ),
// ),
// );
// }
// }

@ -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("نعم"),
// ),
// ),
// ],
// ),
// ),
// );
// }
// }

@ -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<LoadingDialog> {
// @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<Color>(ColorConsts.textGrey),
// ),
// ),
// ),
// ),
// ),
// );
// }
// }

@ -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<OTPDialog> {
// 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("تحقق من الرقم"),
// ),
// ),
// ],
// ),
// ),
// );
// }
// }

@ -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),
],
),
);
}
}

@ -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<AyatTangheemTypeMappedData> 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<TangheemDetailScreen> {
// GlobalKey _globalKey = GlobalKey();
//
// List<VoiceNote> voiceNoteList = [];
//
// List<AyatTangheemTypeMappedData> ayatTangheemTypeMappedDataList = [];
//
// List<AyatTangheemTypeMappedData> _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<List<AyatTangheemTypeMappedData>> 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 = <AyatTangheemTypeMappedData>[];
// _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<TangheemProperty> _tangheemInsideTableList = [];
// List<TangheemProperty> _tangheemAboveTableList = [];
// List<TangheemProperty> _tangheemBelowTableList = [];
// List<String> _tangheemWords = [];
//
// List<TangheemProperty> _tempPropertyList = List<TangheemProperty>() + _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<AyatTangheemTypeMappedData> 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<TangheemProperty> 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<TangheemProperty> 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<DiscussionModelData> _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),
// ),
// ),
// ),
// ),
// ],
// );
// }
// }

@ -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),
],
),
),
);
}
}

@ -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<double> 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<StatefulWidget> createState() {
// return OTPWidgetState();
// }
// }
//
// class OTPWidgetState extends State<OTPWidget> with SingleTickerProviderStateMixin {
// AnimationController _highlightAnimationController;
// FocusNode focusNode;
// String text = "";
// int currentIndex = 0;
// List<String> 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: <Widget>[
// _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 ? <TextInputFormatter>[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<Widget> 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<String>("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<double> animation) {
// return child;
// },
// child: Text(
// text,
// key: ValueKey<String>("$text$i"),
// style: widget.pinTextStyle,
// ),
// );
// } else {
// return Text(
// text,
// key: ValueKey<String>("${strList[i]}$i"),
// style: widget.pinTextStyle,
// );
// }
// }
// }

@ -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),

@ -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),
),
),
)
],
),
),
);
}
}

@ -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/

Loading…
Cancel
Save