diff --git a/lib/config/config.dart b/lib/config/config.dart index e6ae40e..2e70bf9 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,6 +6,8 @@ const MAX_SMALL_SCREEN = 660; const BASE_URL = 'https://uat.hmgwebservices.com/Services'; const GET_PROJECT = '/Lists.svc/REST/GetProject'; +const LOGIN = "/Authentication.svc/REST/CheckDriverAuthentication"; + class AppGlobal { diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 5916d90..5cfdfbe 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -11,6 +11,28 @@ const Map> localizedValues = { 'services': {'en': 'SERVICES', 'ar': 'الخدمات'}, 'mySchedule': {'en': 'My Schedule', 'ar': 'جدولي'}, 'logout': {'en': 'Logout', 'ar': 'تسجيل خروج'}, - 'booking':{'en': 'Booking','ar':'حجز'} + 'booking':{'en': 'Booking','ar':'حجز'}, + 'enterId': {'en': 'User Name', 'ar': 'اسم المستخدم'}, + 'pleaseEnterYourID': { + 'en': 'Please enter your ', + 'ar': 'الرجاء ادخال اسم المستخدم' + }, + 'enterPassword': {'en': 'Password', 'ar': 'كلمه السر'}, + 'pleaseEnterPassword': { + 'en': 'Please Enter Your Password', + 'ar': 'الرجاء ادخال كلمه السر' + }, + 'enterCredentialsMsg': { + 'en': 'Please insert username and password to login', + 'ar': 'الرجاء إدخال اسم المستخدم وكلمة المرور لتسجيل الدخول' + }, + 'forgotPassword': { + 'en': 'Forgot Password?', + 'ar': 'هل نسيت كلمة المرور ؟' + }, + 'login': { + 'en': 'Login', + 'ar': 'تسجيل الدخول' + } }; diff --git a/lib/core/model/authentication/authenticated_user.dart b/lib/core/model/authentication/authenticated_user.dart index 7ca3a3e..0329bd5 100644 --- a/lib/core/model/authentication/authenticated_user.dart +++ b/lib/core/model/authentication/authenticated_user.dart @@ -1,282 +1,64 @@ class AuthenticatedUser { - String setupID; - int patientType; - int patientID; - String firstName; - String middleName; - String lastName; - String firstNameN; - String middleNameN; - String lastNameN; - int relationshipID; - int gender; - String dateofBirth; - dynamic dateofBirthN; - String nationalityID; - dynamic phoneResi; - dynamic phoneOffice; - String mobileNumber; - dynamic faxNumber; - String emailAddress; - dynamic bloodGroup; - dynamic rHFactor; - bool isEmailAlertRequired; - bool isSMSAlertRequired; - String preferredLanguage; - bool isPrivilegedMember; - dynamic memberID; - dynamic expiryDate; - dynamic isHmgEmployee; - dynamic employeeID; - dynamic emergencyContactName; - dynamic emergencyContactNo; - int patientPayType; - dynamic dHCCPatientRefID; - bool isPatientDummy; - int status; - dynamic isStatusCleared; - int patientIdentificationType; - String patientIdentificationNo; - int projectID; - int infoSourceID; - dynamic address; - int age; - String ageDesc; - int areaID; + int iD; + int userID; + String password; + String userName; + int roleID; + String name; + bool active; + String createdOn; int createdBy; - String genderDescription; - dynamic iR; - dynamic iSOCityID; - dynamic iSOCountryID; - List listPrivilege; - dynamic marital; - int outSA; - dynamic pOBox; - bool receiveHealthSummaryReport; - int sourceType; - dynamic strDateofBirth; - dynamic tempAddress; - dynamic zipCode; - // dynamic patientPayType; - // dynamic patientType; - // dynamic status; + Null editedOn; + Null editedBy; + String mobileNumber; + int realRoleID; - AuthenticatedUser({ - this.setupID, - this.patientType, - this.patientID, - this.firstName, - this.middleName, - this.lastName, - this.firstNameN, - this.middleNameN, - this.lastNameN, - this.relationshipID, - this.gender, - this.dateofBirth, - this.dateofBirthN, - this.nationalityID, - this.phoneResi, - this.phoneOffice, - this.mobileNumber, - this.faxNumber, - this.emailAddress, - this.bloodGroup, - this.rHFactor, - this.isEmailAlertRequired, - this.isSMSAlertRequired, - this.preferredLanguage, - this.isPrivilegedMember, - this.memberID, - this.expiryDate, - this.isHmgEmployee, - this.employeeID, - this.emergencyContactName, - this.emergencyContactNo, - this.patientPayType, - this.dHCCPatientRefID, - this.isPatientDummy, - this.status, - this.isStatusCleared, - this.patientIdentificationType, - this.patientIdentificationNo, - this.projectID, - this.infoSourceID, - this.address, - this.age, - this.ageDesc, - this.areaID, - this.createdBy, - this.genderDescription, - this.iR, - this.iSOCityID, - this.iSOCountryID, - this.listPrivilege, - this.marital, - this.outSA, - this.pOBox, - this.receiveHealthSummaryReport, - this.sourceType, - this.strDateofBirth, - this.tempAddress, - this.zipCode, - }); + AuthenticatedUser( + {this.iD, + this.userID, + this.password, + this.userName, + this.roleID, + this.name, + this.active, + this.createdOn, + this.createdBy, + this.editedOn, + this.editedBy, + this.mobileNumber, + this.realRoleID}); AuthenticatedUser.fromJson(Map json) { - setupID = json['SetupID']; - patientType = json['PatientType']; - patientID = json['PatientID']; - firstName = json['FirstName']; - middleName = json['MiddleName']; - lastName = json['LastName']; - firstNameN = json['FirstNameN']; - middleNameN = json['MiddleNameN']; - lastNameN = json['LastNameN']; - relationshipID = json['RelationshipID']; - gender = json['Gender']; - dateofBirth = json['DateofBirth']; - dateofBirthN = json['DateofBirthN']; - nationalityID = json['NationalityID']; - phoneResi = json['PhoneResi']; - phoneOffice = json['PhoneOffice']; - mobileNumber = json['MobileNumber']; - faxNumber = json['FaxNumber']; - emailAddress = json['EmailAddress']; - bloodGroup = json['BloodGroup']; - rHFactor = json['RHFactor']; - isEmailAlertRequired = json['IsEmailAlertRequired']; - isSMSAlertRequired = json['IsSMSAlertRequired']; - preferredLanguage = json['PreferredLanguage']; - isPrivilegedMember = json['IsPrivilegedMember']; - memberID = json['MemberID']; - expiryDate = json['ExpiryDate']; - isHmgEmployee = json['IsHmgEmployee']; - employeeID = json['EmployeeID']; - emergencyContactName = json['EmergencyContactName']; - emergencyContactNo = json['EmergencyContactNo']; - patientPayType = json['PatientPayType']; - dHCCPatientRefID = json['DHCCPatientRefID']; - isPatientDummy = json['IsPatientDummy']; - status = json['Status']; - isStatusCleared = json['IsStatusCleared']; - patientIdentificationType = json['PatientIdentificationType']; - patientIdentificationNo = json['PatientIdentificationNo']; - projectID = json['ProjectID']; - infoSourceID = json['InfoSourceID']; - address = json['Address']; - age = json['Age']; - ageDesc = json['AgeDesc']; - areaID = json['AreaID']; - createdBy = json['CreatedBy']; - genderDescription = json['GenderDescription']; - iR = json['IR']; - iSOCityID = json['ISOCityID']; - iSOCountryID = json['ISOCountryID']; - if (json['ListPrivilege'] != null) { - listPrivilege = new List(); - json['ListPrivilege'].forEach((v) { - listPrivilege.add(new ListPrivilege.fromJson(v)); - }); - } - marital = json['Marital']; - outSA = json['OutSA']; - pOBox = json['POBox']; - receiveHealthSummaryReport = json['ReceiveHealthSummaryReport']; - sourceType = json['SourceType']; - strDateofBirth = json['StrDateofBirth']; - tempAddress = json['TempAddress']; - zipCode = json['ZipCode']; - } - - Map toJson() { - final Map data = new Map(); - data['SetupID'] = this.setupID; - data['PatientType'] = this.patientType; - data['PatientID'] = this.patientID; - data['FirstName'] = this.firstName; - data['MiddleName'] = this.middleName; - data['LastName'] = this.lastName; - data['FirstNameN'] = this.firstNameN; - data['MiddleNameN'] = this.middleNameN; - data['LastNameN'] = this.lastNameN; - data['RelationshipID'] = this.relationshipID; - data['Gender'] = this.gender; - data['DateofBirth'] = this.dateofBirth; - data['DateofBirthN'] = this.dateofBirthN; - data['NationalityID'] = this.nationalityID; - data['PhoneResi'] = this.phoneResi; - data['PhoneOffice'] = this.phoneOffice; - data['MobileNumber'] = this.mobileNumber; - data['FaxNumber'] = this.faxNumber; - data['EmailAddress'] = this.emailAddress; - data['BloodGroup'] = this.bloodGroup; - data['RHFactor'] = this.rHFactor; - data['IsEmailAlertRequired'] = this.isEmailAlertRequired; - data['IsSMSAlertRequired'] = this.isSMSAlertRequired; - data['PreferredLanguage'] = this.preferredLanguage; - data['IsPrivilegedMember'] = this.isPrivilegedMember; - data['MemberID'] = this.memberID; - data['ExpiryDate'] = this.expiryDate; - data['IsHmgEmployee'] = this.isHmgEmployee; - data['EmployeeID'] = this.employeeID; - data['EmergencyContactName'] = this.emergencyContactName; - data['EmergencyContactNo'] = this.emergencyContactNo; - data['PatientPayType'] = this.patientPayType; - data['DHCCPatientRefID'] = this.dHCCPatientRefID; - data['IsPatientDummy'] = this.isPatientDummy; - data['Status'] = this.status; - data['IsStatusCleared'] = this.isStatusCleared; - data['PatientIdentificationType'] = this.patientIdentificationType; - data['PatientIdentificationNo'] = this.patientIdentificationNo; - data['ProjectID'] = this.projectID; - data['InfoSourceID'] = this.infoSourceID; - data['Address'] = this.address; - data['Age'] = this.age; - data['AgeDesc'] = this.ageDesc; - data['AreaID'] = this.areaID; - data['CreatedBy'] = this.createdBy; - data['GenderDescription'] = this.genderDescription; - data['IR'] = this.iR; - data['ISOCityID'] = this.iSOCityID; - data['ISOCountryID'] = this.iSOCountryID; - if (this.listPrivilege != null) { - data['ListPrivilege'] = - this.listPrivilege.map((v) => v.toJson()).toList(); - } - data['Marital'] = this.marital; - data['OutSA'] = this.outSA; - data['POBox'] = this.pOBox; - data['ReceiveHealthSummaryReport'] = this.receiveHealthSummaryReport; - data['SourceType'] = this.sourceType; - data['StrDateofBirth'] = this.strDateofBirth; - data['TempAddress'] = this.tempAddress; - data['ZipCode'] = this.zipCode; - - return data; - } -} - -class ListPrivilege { - int iD; - String serviceName; - bool previlege; - dynamic region; - - ListPrivilege({this.iD, this.serviceName, this.previlege, this.region}); - - ListPrivilege.fromJson(Map json) { iD = json['ID']; - serviceName = json['ServiceName']; - previlege = json['Previlege']; - region = json['Region']; + userID = json['UserID']; + password = json['password']; + userName = json['UserName']; + roleID = json['RoleID']; + name = json['Name']; + active = json['Active']; + createdOn = json['CreatedOn']; + createdBy = json['CreatedBy']; + editedOn = json['EditedOn']; + editedBy = json['EditedBy']; + mobileNumber = json['MobileNumber']; + realRoleID = json['RealRoleID']; } Map toJson() { final Map data = new Map(); data['ID'] = this.iD; - data['ServiceName'] = this.serviceName; - data['Previlege'] = this.previlege; - data['Region'] = this.region; + data['UserID'] = this.userID; + data['password'] = this.password; + data['UserName'] = this.userName; + data['RoleID'] = this.roleID; + data['Name'] = this.name; + data['Active'] = this.active; + data['CreatedOn'] = this.createdOn; + data['CreatedBy'] = this.createdBy; + data['EditedOn'] = this.editedOn; + data['EditedBy'] = this.editedBy; + data['MobileNumber'] = this.mobileNumber; + data['RealRoleID'] = this.realRoleID; return data; } } diff --git a/lib/core/model/authentication/login_request.dart b/lib/core/model/authentication/login_request.dart new file mode 100644 index 0000000..0e08b82 --- /dev/null +++ b/lib/core/model/authentication/login_request.dart @@ -0,0 +1,18 @@ +class LoginRequest { + int userID; + String password; + + LoginRequest({this.userID, this.password}); + + LoginRequest.fromJson(Map json) { + userID = json['UserID']; + password = json['Password']; + } + + Map toJson() { + final Map data = new Map(); + data['UserID'] = this.userID; + data['Password'] = this.password; + return data; + } +} \ No newline at end of file diff --git a/lib/core/service/authentication_service.dart b/lib/core/service/authentication_service.dart index ae26b38..266f2ae 100644 --- a/lib/core/service/authentication_service.dart +++ b/lib/core/service/authentication_service.dart @@ -1,29 +1,35 @@ - +import 'package:driverapp/config/config.dart'; +import 'package:driverapp/core/model/authentication/authenticated_user.dart'; +import 'package:driverapp/core/model/authentication/login_request.dart'; import 'package:driverapp/core/service/base_service.dart'; -import 'package:flutter/cupertino.dart'; - class AuthenticationService extends BaseService { String selectedClinicName; bool isLogin = false; bool isLoading = true; + AuthenticatedUser authenticatedUser; + String token; AuthenticationService() { // getUserAuthentication(); } -// void getUserAuthentication() async { -// if (profile != null) { -//// doctorProfile = new DoctorProfileModel.fromJson(profile); -// isLoading = false; -// isLogin = true; -// } else { -// isLoading = false; -// isLogin = false; -// } -// notifyListeners(); -// } - - - + login(LoginRequest loginRequest) async { + hasError = false; + try { + await baseAppClient.post(LOGIN, + onSuccess: (dynamic response, int statusCode) { + authenticatedUser = + AuthenticatedUser.fromJson(response['PatientER_DriverFile']); + token = response['LogInTokenID']; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: loginRequest.toJson()); + } catch (error) { + hasError = true; + super.error = error; + throw error; + } + } } diff --git a/lib/core/viewModels/authentication_view_model.dart b/lib/core/viewModels/authentication_view_model.dart index 53aed7b..32b7df8 100644 --- a/lib/core/viewModels/authentication_view_model.dart +++ b/lib/core/viewModels/authentication_view_model.dart @@ -1,5 +1,8 @@ +import 'package:driverapp/config/shared_pref_kay.dart'; import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/model/authentication/login_request.dart'; import 'package:driverapp/core/service/authentication_service.dart'; +import 'package:driverapp/core/service/client/base_app_client.dart'; import 'package:driverapp/core/viewModels/base_view_model.dart'; import '../../locator.dart'; @@ -21,10 +24,17 @@ class AuthenticationViewModel extends BaseViewModel { } } - login({String userName,String password}){ + login(LoginRequest loginRequest) async { setState(ViewState.BusyLocal); - // call api -// if() -// setState(viewState) + await _authenticationService.login(loginRequest); + if (_authenticationService.hasError) { + error = _authenticationService.error; + setState(ViewState.ErrorLocal); + } else { + sharedPref.setObject( + USER_PROFILE, _authenticationService.authenticatedUser); + sharedPref.setString(TOKEN, _authenticationService.token); + setState(ViewState.Idle); + } } } diff --git a/lib/pages/authentication/login_page.dart b/lib/pages/authentication/login_page.dart index f5dd638..10fb9b6 100644 --- a/lib/pages/authentication/login_page.dart +++ b/lib/pages/authentication/login_page.dart @@ -1,21 +1,34 @@ import 'package:driverapp/app-icons/driver_app_icons.dart'; +import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/model/authentication/login_request.dart'; import 'package:driverapp/core/viewModels/authentication_view_model.dart'; +import 'package:driverapp/core/viewModels/project_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; +import 'package:driverapp/pages/landing/landing_page.dart'; +import 'package:driverapp/uitl/translations_delegate_base.dart'; +import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; +import 'package:driverapp/widgets/data_display/circle-container.dart'; import 'package:driverapp/widgets/input/text_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class LoginPage extends StatelessWidget { + LoginRequest loginRequest = LoginRequest(); + final loginFormKey = GlobalKey(); + ProjectViewModel projectViewModel; + @override Widget build(BuildContext context) { + projectViewModel = Provider.of(context); return AnimatedSwitcher( duration: Duration(microseconds: 350), child: BaseView( builder: (_, model, widget) => Scaffold( //baseViewModel: model, + body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -37,8 +50,12 @@ class LoginPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), margin: EdgeInsets.only( - right: - MediaQuery.of(context).size.width * 0.15), + right: projectViewModel.isArabic + ? 0 + : MediaQuery.of(context).size.width * 0.15, + left: !projectViewModel.isArabic + ? 0 + : MediaQuery.of(context).size.width * 0.15), ), ], ), @@ -72,80 +89,127 @@ class LoginPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ CircleContainer( - child: Text( - "English", - style: TextStyle( - fontSize: 12, color: Colors.white), - ), - color: Theme.of(context).primaryColor, borderWidth: 0,borderColor: Colors.transparent,), + onTap: () => projectViewModel.changeLanguage('en'), + child: Text( + TranslationBase.of(context).lanEnglish, + style: TextStyle( + fontSize: 12, + color: projectViewModel.isArabic + ? Colors.black + : Colors.white), + ), + color: projectViewModel.isArabic + ? Colors.transparent + : Theme.of(context).primaryColor, + borderWidth: projectViewModel.isArabic ? 3 : 0, + borderColor: projectViewModel.isArabic + ? Theme.of(context).primaryColor + : Colors.transparent, + ), SizedBox( width: 20, ), CircleContainer( + onTap: () => + projectViewModel.changeLanguage('ar'), child: Text( - "Arabic", + TranslationBase.of(context).lanArabic, style: TextStyle( - fontSize: 12, color: Colors.black), + fontSize: 12, + color: !projectViewModel.isArabic + ? Colors.black + : Colors.white), ), - color: Colors.transparent, borderColor: Theme.of(context).primaryColor,borderWidth: 3,), + color: !projectViewModel.isArabic + ? Colors.transparent + : Theme.of(context).primaryColor, + borderWidth: !projectViewModel.isArabic ? 3 : 0, + borderColor: !projectViewModel.isArabic + ? Theme.of(context).primaryColor + : Colors.transparent), ], ), SizedBox( height: 10, ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Row( + Form( + key: loginFormKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + TranslationBase.of(context).enterCredentialsMsg, + style: TextStyle( + fontSize: 13, color: Colors.grey), + ), + SizedBox( + height: 10, + ) + ], + ), + ), + SizedBox( + height: 10, + ), + Container( + child: TextFields( + onChanged: (value) => {}, + hintText: TranslationBase.of(context).enterId, + validator: (value) { + if (value.isEmpty) { + return TranslationBase.of(context) + .pleaseEnterYourID; + } + return null; + }, + onSaved: (value) { + loginRequest.userID = int.parse(value.trim()); + }, + ), + ), + SizedBox( + height: 20, + ), + Container( + child: TextFields( + borderRadiusValue: 6, + onChanged: (value) => {}, + hintText: + TranslationBase.of(context).enterPassword, + validator: (value) { + if (value.isEmpty) { + return TranslationBase.of(context) + .pleaseEnterPassword; + } + return null; + }, + onSaved: (value) { + loginRequest.password = value; + }, + ), + ), + SizedBox( + height: 25, + ), + Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text( - "Please insert username and password to login", + TranslationBase.of(context).forgotPassword, style: TextStyle( - fontSize: 13, color: Colors.grey), + fontSize: 14, + color: Theme.of(context).primaryColor), ), - SizedBox( - height: 10, - ) ], ), - ), - SizedBox( - height: 10, - ), - Container( - child: TextFields( - onChanged: (value) => {}, - hintText: "User Name", - ), - ), - SizedBox( - height: 20, - ), - Container( - child: TextFields( - borderRadiusValue: 6, - onChanged: (value) => {}, - hintText: "Password", - ), - ), - SizedBox( - height: 25, - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - "Forgot Password?", - style: TextStyle( - fontSize: 14, - color: Theme.of(context).primaryColor), - ), - ], - ), - ], + ], + ), ), ], ), @@ -164,7 +228,14 @@ class LoginPage extends StatelessWidget { height: MediaQuery.of(context).size.height * 0.12, child: Column( children: [ - SecondaryButton(label: "Login"), + SecondaryButton( + label: TranslationBase.of(context).login, + onTap: () { + login(model, context); + }, + disabled: model.state == ViewState.BusyLocal, + loading: model.state == ViewState.BusyLocal, + ), SizedBox( height: 30, ) @@ -174,32 +245,19 @@ class LoginPage extends StatelessWidget { ), ); } -} - -class CircleContainer extends StatelessWidget { - const CircleContainer( - {this.child, - this.color = Colors.white, - this.borderColor, - this.borderWidth = 2.0}); - final Widget child; - final Color color; - final Color borderColor; - final double borderWidth; - - @override - Widget build(BuildContext context) { - return Container( - child: Center(child: child), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: color, - border: Border.all( - color: borderColor ?? Hexcolor("#707070"), - width: borderWidth)), - height: 60, - width: 60, - ); + login(AuthenticationViewModel model, BuildContext context) async { + if (loginFormKey.currentState.validate()) { + loginFormKey.currentState.save(); + await model.login(loginRequest); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + // Show error + } else { + Navigator.push( + context, MaterialPageRoute(builder: (context) => LandingPage())); + } + } } } + diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 1a61090..400292e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -39,6 +39,19 @@ class TranslationBase { String get logout => localizedValues['logout'][locale.languageCode]; String get booking => localizedValues['booking'][locale.languageCode]; + String get enterId => localizedValues['enterId'][locale.languageCode]; + String get pleaseEnterYourID => + localizedValues['pleaseEnterYourID'][locale.languageCode]; + String get enterPassword => + localizedValues['enterPassword'][locale.languageCode]; + String get pleaseEnterPassword => + localizedValues['pleaseEnterPassword'][locale.languageCode]; + String get english => localizedValues['english'][locale.languageCode]; + + String get arabic => localizedValues['arabic'][locale.languageCode]; + String get enterCredentialsMsg => localizedValues['enterCredentialsMsg'][locale.languageCode]; + String get forgotPassword => localizedValues['forgotPassword'][locale.languageCode]; + String get login => localizedValues['login'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/data_display/circle-container.dart b/lib/widgets/data_display/circle-container.dart new file mode 100644 index 0000000..bb0ebdd --- /dev/null +++ b/lib/widgets/data_display/circle-container.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class CircleContainer extends StatelessWidget { + const CircleContainer( + {this.child, + this.color = Colors.white, + this.borderColor, + this.borderWidth = 2.0, + this.onTap}); + + final Widget child; + final Color color; + final Color borderColor; + final double borderWidth; + final Function onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Container( + child: Center(child: child), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + border: Border.all( + color: borderColor ?? Hexcolor("#707070"), width: borderWidth)), + height: 60, + width: 60, + ), + ); + } +}