Changes into Rating Bar

dev_v3.13.6_voipcall
Aamir Muhammad 12 months ago
parent 8bdcfcb764
commit b4bc99369f

@ -79,7 +79,7 @@ android {
}
release {
debuggable false
signingConfig signingConfigs.release
signingConfig signingConfigs.debug
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

@ -20,8 +20,8 @@ var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:2018/';
var BASE_URL = 'https://uat.hmgwebservices.com/';
// var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://uat.hmgwebservices.com/';
var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/';

@ -68,9 +68,10 @@ class _MyApp extends State<MyApp> {
//0537503378
//1231755
//2466305493
//0567184134 mobile
//2466305493
// checkForUpdate() {

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HealthCalculator/DiseasesByClinic.dart';
import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/health-calculator/Bariatrics-viewmodel.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -102,11 +103,21 @@ class DoctorList extends StatelessWidget {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(
Icons.star,
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star,
color: CustomColors.accentColor,
),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -341,15 +341,15 @@ class _DoctorProfileState extends State<DoctorProfile> with TickerProviderStateM
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},

@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/models/Clinics/ClinicListResponse.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/DentalComplaints.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/ObGyne/ObGyne-TimeSlots.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
@ -140,12 +141,13 @@ class DoctorView extends StatelessWidget {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
unratedColor: Colors.grey[500],
onRatingUpdate: (rating) {
print(rating);
},

@ -380,11 +380,12 @@ class _AppointmentDetailsState extends State<AppointmentDetails> with SingleTick
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/analytics/google-analytics.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/models/AppointmentType.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
@ -174,11 +175,12 @@ class _ApointmentCardState extends State<AppointmentCard> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -54,7 +54,7 @@ class ToDo extends StatefulWidget {
late MyInAppBrowser browser;
bool isShowAppBar = true;
Function()? onBackClick;
Function()? onBackClick;
bool isFromMyAppointments;
AppoitmentAllHistoryResultList? appointment;
@ -67,7 +67,7 @@ class ToDo extends StatefulWidget {
class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
AppSharedPreferences sharedPref = AppSharedPreferences();
List<ImagesInfo> imagesInfo =[];
List<ImagesInfo> imagesInfo = [];
late ToDoCountProviderModel toDoProvider;
late CountdownTimerController controller;
@ -318,15 +318,15 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -858,7 +858,7 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
});
}
dataLoaded = true;
if(widget.isFromMyAppointments) {
if (widget.isFromMyAppointments) {
getPatientShare(context, widget.appointment!);
}
});
@ -1025,23 +1025,29 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
openPaymentDialog(AppoitmentAllHistoryResultList appo, PatientShareResponse patientShareResponse) {
showGeneralDialog(
barrierColor: Colors.black.withOpacity(0.5),
transitionBuilder: (context, a1, a2, widget) {
final curvedValue = Curves.easeInOutBack.transform(a1.value) - 1.0;
return Transform(
transform: Matrix4.translationValues(0.0, curvedValue * 200, 0.0),
child: Opacity(
opacity: a1.value,
child: PaymentDialog(appo: appo, patientShareResponse: patientShareResponse, onPaymentMethodSelected: (){}, isCashPatient: isCash,),
),
);
},
transitionDuration: Duration(milliseconds: 500),
barrierDismissible: false,
barrierLabel: '',
context: context,
pageBuilder: (context, animation1, animation2) { return SizedBox();})
.then((value) {
barrierColor: Colors.black.withOpacity(0.5),
transitionBuilder: (context, a1, a2, widget) {
final curvedValue = Curves.easeInOutBack.transform(a1.value) - 1.0;
return Transform(
transform: Matrix4.translationValues(0.0, curvedValue * 200, 0.0),
child: Opacity(
opacity: a1.value,
child: PaymentDialog(
appo: appo,
patientShareResponse: patientShareResponse,
onPaymentMethodSelected: () {},
isCashPatient: isCash,
),
),
);
},
transitionDuration: Duration(milliseconds: 500),
barrierDismissible: false,
barrierLabel: '',
context: context,
pageBuilder: (context, animation1, animation2) {
return SizedBox();
}).then((value) {
if (value != null) {
navigateToPaymentMethod(context, value as PatientShareResponse, appo);
projectViewModel.analytics.todoList.to_do_list_confirm_payment_details(appo);

@ -119,11 +119,12 @@ class _TodoListCardState extends State<TodoListCard> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -1,82 +1,82 @@
import 'dart:async';
import 'dart:core';
import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'draggable_cam.dart';
class CamViewWidget extends StatefulWidget {
RTCVideoRenderer? localRenderer;
RTCVideoRenderer? remoteRenderer;
MediaStream? localStream;
BoxConstraints? constraints;
StreamController<bool>? onButtonBarVisibleStreamController;
StreamController<double>? onButtonBarHeightStreamController;
CamViewWidget({this.localRenderer, this.remoteRenderer, this.constraints, this.onButtonBarVisibleStreamController, this.onButtonBarHeightStreamController});
@override
_CamViewWidgetState createState() => _CamViewWidgetState();
}
class _CamViewWidgetState extends State<CamViewWidget> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: double.infinity,
child: Stack(
children: [
FractionallySizedBox(
heightFactor: 1, widthFactor: 1,
child: Container(
color: Colors.black87,
child: RTCVideoView(widget.remoteRenderer!, mirror: true,filterQuality: FilterQuality.medium,),
),
),
if(widget.remoteRenderer!.srcObject == null)
Positioned.fill(child: _buildNoiseBox()),
Positioned.fill(
child: RTCVideoView(widget.remoteRenderer!)
),
DraggableCam(
key: Key('publisher'),
onButtonBarHeight: widget.onButtonBarHeightStreamController!.stream,
onButtonBarVisible: widget.onButtonBarVisibleStreamController!.stream,
availableScreenSize: widget.constraints!.biggest,
child: RTCVideoView(widget.localRenderer!)
),
if(widget.remoteRenderer!.srcObject == null)
Container(
margin: EdgeInsets.all(MediaQuery.of(context).size.width/8),
child: Text(
'Waiting for another participant to connect to the call...',
key: Key('text-wait'),
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
)
),
],
),
);
}
Widget _buildNoiseBox() {
return NoiseBox(
density: NoiseBoxDensity.xHigh,
backgroundColor: Colors.grey.shade900,
);
}
}
// import 'dart:async';
// import 'dart:core';
//
// import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// import 'draggable_cam.dart';
//
// class CamViewWidget extends StatefulWidget {
// RTCVideoRenderer? localRenderer;
// RTCVideoRenderer? remoteRenderer;
// MediaStream? localStream;
// BoxConstraints? constraints;
// StreamController<bool>? onButtonBarVisibleStreamController;
// StreamController<double>? onButtonBarHeightStreamController;
//
// CamViewWidget({this.localRenderer, this.remoteRenderer, this.constraints, this.onButtonBarVisibleStreamController, this.onButtonBarHeightStreamController});
//
// @override
// _CamViewWidgetState createState() => _CamViewWidgetState();
// }
//
// class _CamViewWidgetState extends State<CamViewWidget> {
// @override
// void initState() {
// super.initState();
// }
//
// @override
// Widget build(BuildContext context) {
// return Container(
// width: double.infinity,
// height: double.infinity,
// child: Stack(
// children: [
// FractionallySizedBox(
// heightFactor: 1, widthFactor: 1,
// child: Container(
// color: Colors.black87,
// // child: RTCVideoView(widget.remoteRenderer!, mirror: true,filterQuality: FilterQuality.medium,),
// ),
// ),
//
// if(widget.remoteRenderer!.srcObject == null)
// Positioned.fill(child: _buildNoiseBox()),
//
// // Positioned.fill(
// // child: RTCVideoView(widget.remoteRenderer!)
// // ),
//
// // DraggableCam(
// // key: Key('publisher'),
// // onButtonBarHeight: widget.onButtonBarHeightStreamController!.stream,
// // onButtonBarVisible: widget.onButtonBarVisibleStreamController!.stream,
// // availableScreenSize: widget.constraints!.biggest,
// // child: RTCVideoView(widget.localRenderer!)
// // ),
//
// if(widget.remoteRenderer!.srcObject == null)
// Container(
// margin: EdgeInsets.all(MediaQuery.of(context).size.width/8),
// child: Text(
// 'Waiting for another participant to connect to the call...',
// key: Key('text-wait'),
// textAlign: TextAlign.center,
// style: TextStyle(color: Colors.white),
// )
// ),
// ],
// ),
// );
// }
//
//
// Widget _buildNoiseBox() {
// return NoiseBox(
// density: NoiseBoxDensity.xHigh,
// backgroundColor: Colors.grey.shade900,
// );
// }
// }

@ -10,7 +10,7 @@ import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart' as utils ;
import 'package:diplomaticquarterapp/uitl/utils.dart' as utils;
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/StarRating.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -22,7 +22,6 @@ import 'package:provider/provider.dart';
import 'base/base_view.dart';
dynamic languageID;
class FinalProductsPage extends StatefulWidget {
@ -216,21 +215,19 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
Container(
margin: EdgeInsets.fromLTRB(0, 16, 0, 0),
alignment: Alignment.center,
child: (model.finalProducts[index].images != null &&
model.finalProducts[index].images!.length > 0)
? Image.network(
model.finalProducts[index].images![0].src!,
fit: BoxFit.cover,
height: 80,
width: 80,
)
: Image.asset(
"assets/images/no_image.png",
fit: BoxFit.cover,
height: 80,
width: 80,
),
child: (model.finalProducts[index].images != null && model.finalProducts[index].images!.length > 0)
? Image.network(
model.finalProducts[index].images![0].src!,
fit: BoxFit.cover,
height: 80,
width: 80,
)
: Image.asset(
"assets/images/no_image.png",
fit: BoxFit.cover,
height: 80,
width: 80,
),
// Image.network(
// model.finalProducts[index].images.isNotEmpty
// ? model.finalProducts[index].images[0].thumb
@ -245,12 +242,12 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
padding: EdgeInsets.all(4),
decoration: BoxDecoration(
color: Color(0xffb23838),
// borderRadius: BorderRadius.only(topLeft: Radius.circular(6)
// ),
// borderRadius: BorderRadius.only(topLeft: Radius.circular(6)
// ),
),
child: model.finalProducts[index].rxMessage != null
? Texts(
projectProvider.isArabic ? model.finalProducts[index].rxMessagen : model.finalProducts[index].rxMessage,
projectProvider.isArabic ? model.finalProducts[index].rxMessagen : model.finalProducts[index].rxMessage,
color: Colors.white,
regular: true,
fontSize: 10,
@ -284,7 +281,8 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
),
),
),
Texts(projectViewModel.isArabic ? model.finalProducts[index].namen : model.finalProducts[index].name,
Texts(
projectViewModel.isArabic ? model.finalProducts[index].namen : model.finalProducts[index].name,
// model.finalProducts[index].name,
regular: true,
fontSize: 12,
@ -305,7 +303,7 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
// ? (model.finalProducts[index].approvedRatingSum.toDouble() / model.finalProducts[index].approvedRatingSum.toDouble()).toDouble()
// : 0,
// forceStars: true),
RatingBar(
itemSize: 20.0,
allowHalfRating: true,
@ -313,15 +311,15 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -330,7 +328,6 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
tapOnlyMode: false,
),
Texts(
"(${model.finalProducts[index].approvedTotalReviews})",
regular: true,
@ -409,21 +406,19 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
Container(
margin: EdgeInsets.fromLTRB(0, 0, 0, 8),
alignment: Alignment.center,
child:(model.finalProducts[index].images != null &&
model.finalProducts[index].images!.length > 0)
child: (model.finalProducts[index].images != null && model.finalProducts[index].images!.length > 0)
? Image.network(
model.finalProducts[index].images![0].src!,
fit: BoxFit.cover,
height: 80,
width: 80,
)
model.finalProducts[index].images![0].src!,
fit: BoxFit.cover,
height: 80,
width: 80,
)
: Image.asset(
"assets/images/no_image.png",
fit: BoxFit.cover,
height: 80,
width: 80,
),
"assets/images/no_image.png",
fit: BoxFit.cover,
height: 80,
width: 80,
),
// Image.network(
// model.finalProducts[index].images.isNotEmpty
// ? model.finalProducts[index].images[0].thumb
@ -443,14 +438,14 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
color: Color(0xffb23838),
//borderRadius: BorderRadius.only(topLeft: Radius.circular(5)),
),
child:model.finalProducts[index].rxMessage != null
child: model.finalProducts[index].rxMessage != null
? Texts(
projectProvider.isArabic ? model.finalProducts[index].rxMessagen : model.finalProducts[index].rxMessage,
color: Colors.white,
regular: true,
fontSize: 8,
fontWeight: FontWeight.w600,
)
projectProvider.isArabic ? model.finalProducts[index].rxMessagen : model.finalProducts[index].rxMessage,
color: Colors.white,
regular: true,
fontSize: 8,
fontWeight: FontWeight.w600,
)
: Texts(""),
// Texts(
// model.finalProducts[index].rxMessage != null ? model.finalProducts[index].rxMessage : "",
@ -479,7 +474,8 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
),
Container(
width: MediaQuery.of(context).size.width * 0.55,
child: Texts(projectViewModel.isArabic ? model.finalProducts[index].namen : model.finalProducts[index].name,
child: Texts(
projectViewModel.isArabic ? model.finalProducts[index].namen : model.finalProducts[index].name,
// model.finalProducts[index].name,
regular: true,
fontSize: 13.2,
@ -510,15 +506,15 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -527,8 +523,6 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
tapOnlyMode: false,
),
Texts(
"(${model.finalProducts[index].approvedTotalReviews})",
regular: true,
@ -555,8 +549,6 @@ class _FinalProductsPageState extends State<FinalProductsPage> {
GifLoaderDialogUtils.hideDialog(context);
// Navigator.push(context, FadePage(page: CartOrderPage()));
utils.Utils.navigateToCartPage();
} else {
AppToast.showErrorToast(message: TranslationBase.of(context).needPrescription);
}

@ -435,7 +435,7 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
String caller = callerId.split("*")[3];
String receiver = callerId.split("*")[4];
String host = callerId.split("*")[5];
await Navigator.push(context, MaterialPageRoute(builder: (context) => StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host)));
// await Navigator.push(context, MaterialPageRoute(builder: (context) => StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host)));
}
getNotificationCount(token) async {

@ -238,11 +238,12 @@ class _EyeHomePageState extends State<EyeHomePage> with SingleTickerProviderStat
allowHalfRating: true,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -107,20 +107,20 @@ class ReportListWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
RatingBar(
initialRating:report.actualDoctorRate == null ? 0.0: report.actualDoctorRate!.toDouble(),
initialRating: report.actualDoctorRate == null ? 0.0 : report.actualDoctorRate!.toDouble(),
itemSize: 16,
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},

@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
@ -114,15 +115,15 @@ class MedicalReports extends StatelessWidget {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -130,7 +131,6 @@ class MedicalReports extends StatelessWidget {
updateOnDrag: false,
tapOnlyMode: false,
),
Icon(Icons.email, color: Color(0xff2B353E))
],
),

@ -1,5 +1,6 @@
import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/StarRating.dart';
@ -343,15 +344,15 @@ class _OffersCategorisePageState extends State<OffersCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -539,15 +540,15 @@ class _OffersCategorisePageState extends State<OffersCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},

@ -110,11 +110,12 @@ class OfferAndPackagesDetailState extends State<OfferAndPackagesDetail> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -734,15 +734,15 @@ class _ParentCategorisePageState extends State<ParentCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -890,16 +890,13 @@ class _ParentCategorisePageState extends State<ParentCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
),
color: CustomColors.accentColor, ),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
),
color: CustomColors.accentColor, ),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
),
color: CustomColors.accentColor, ),
),
onRatingUpdate: (double value) {},
unratedColor: Colors.grey[500],

@ -1,12 +1,12 @@
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/review_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
class MyReviewsPage extends StatefulWidget {
@override
_MyReviewsPageState createState() => _MyReviewsPageState();
@ -139,39 +139,46 @@ reviewDetails(data, rate, myRate) {
Container(
margin: EdgeInsets.all(5),
child: Align(
alignment: languageID == 'ar' ? Alignment.topRight : Alignment.topLeft,
child:
RatingBar(
initialRating: rate,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
),
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
},
)
// RatingBar.readOnly(
// initialRating: rate,
// size: 15.0,
// filledColor: Colors.yellow[700],
// emptyColor: Colors.grey[500],
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: Icons.star,
// ),
alignment: languageID == 'ar' ? Alignment.topRight : Alignment.topLeft,
child: RatingBar(
initialRating: rate,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star,
color: CustomColors.accentColor,
),
),
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
},
)
// RatingBar.readOnly(
// initialRating: rate,
// size: 15.0,
// filledColor: Colors.yellow[700],
// emptyColor: Colors.grey[500],
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: Icons.star,
// ),
),
),
),
],
),
@ -198,37 +205,45 @@ reviewDetails(data, rate, myRate) {
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
padding: languageID == 'ar' ? EdgeInsets.only(right: 60) : EdgeInsets.only(left: 60),
child:
RatingBar(
initialRating: myRate,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
padding: languageID == 'ar' ? EdgeInsets.only(right: 60) : EdgeInsets.only(left: 60),
child: RatingBar(
initialRating: myRate,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star,
color: CustomColors.accentColor,
),
),
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
},
)
// RatingBar.readOnly(
// initialRating: myRate,
// size: 15.0,
// filledColor: Colors.yellow[700],
// emptyColor: Colors.grey[500],
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: Icons.star,
// ),
),
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
},
)
// RatingBar.readOnly(
// initialRating: myRate,
// size: 15.0,
// filledColor: Colors.yellow[700],
// emptyColor: Colors.grey[500],
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: Icons.star,
// ),
),
],
),
),

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
@ -307,11 +308,12 @@ class _ProductNameAndPriceState extends State<ProductNameAndPrice> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/product-details/product-detail.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
@ -303,11 +304,12 @@ class _RecommendedProductsState extends State<RecommendedProducts> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -1,6 +1,7 @@
import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_detail_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
@ -71,18 +72,19 @@ class ReviewsInfo extends StatelessWidget {
// ),
RatingBar(
initialRating: previousModel!
.productDetailService[0]!.reviews![index]!.rating!.toDouble(),
.productDetailService[0].reviews![index].rating!.toDouble(),
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
@ -91,18 +93,19 @@ class ReviewsInfo extends StatelessWidget {
): RatingBar(
initialRating: previousModel!
.productDetailService[0]!.reviews![index]!.rating!.toDouble(),
.productDetailService[0].reviews![index].rating!.toDouble(),
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -295,11 +295,12 @@ class ProductTileItem extends StatelessWidget {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_items_page.dart';
import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/widgets/home/ViewAllHomeWidget.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart';
@ -170,10 +171,11 @@ class PrescriptionsWidget extends StatelessWidget {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
unratedColor: Colors.grey[500],
tapOnlyMode: true,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {

@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -121,11 +122,12 @@ class _ProductReviewPageState extends State<ProductReviewPage> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);
@ -193,11 +195,12 @@ class _ProductReviewPageState extends State<ProductReviewPage> {
itemSize: 20,
ignoreGestures: true,
ratingWidget: RatingWidget(
full: Icon(Icons.star),
half: Icon(Icons.star_half),
empty: Icon(Icons.star),
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star, color: CustomColors.accentColor,),
),
tapOnlyMode: true,
unratedColor: Colors.grey[500],
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
onRatingUpdate: (rating) {
print(rating);

@ -690,15 +690,15 @@ class _SubCategorisePageState extends State<SubCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},
@ -839,15 +839,15 @@ class _SubCategorisePageState extends State<SubCategorisePage> {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Colors.yellow[700],
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Colors.grey[500],
color: CustomColors.accentColor,
),
),
onRatingUpdate: (double value) {},

File diff suppressed because it is too large Load Diff

@ -1,241 +1,241 @@
import 'dart:async';
import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart';
import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/utils/device_info.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:core';
import 'signaling.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
class StartVideoCall extends StatefulWidget {
static String tag = 'webrtc';
final String host;
String caller;
String receiver;
bool iAmCaller;
StartVideoCall({required this.caller, required this.receiver, this.iAmCaller = false, required this.host});
@override
StartVideoCallState createState() => StartVideoCallState(receiverId: receiver, callerId: caller, iAmCaller: iAmCaller);
}
class StartVideoCallState extends State<StartVideoCall> {
late Signaling _signaling;
late SessionOneToOne? _session;
StartVideoCallState({required String callerId, required String receiverId, required bool iAmCaller}){
final self_role = iAmCaller ? "Caller" : "Receiver";
final self_id = iAmCaller ? callerId : receiverId;
final self_user = SocketUser(id: self_id, name: "$self_role-$self_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
final remote_role = !iAmCaller ? "Caller" : "Receiver";
final remote_id = !iAmCaller ? callerId : receiverId;
final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
final session_id = "$callerId-$receiverId";
_session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
}
bool showNoise = true;
final StreamController<bool> _audioButton = StreamController<bool>.broadcast();
final StreamController<bool> _videoButton = StreamController<bool>.broadcast();
final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
final RTCVideoRenderer _localRenderer = RTCVideoRenderer();
final RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
MediaStream get localMediaStream => _signaling.localStream!;
MediaStream get remoteMediaStream => _signaling.remoteStreams.first;
@override
initState() {
super.initState();
initRenderers();
_connect();
}
initRenderers() async {
await _localRenderer.initialize();
await _remoteRenderer.initialize();
}
@override
deactivate() {
super.deactivate();
_signaling?.close();
_localRenderer.dispose();
_remoteRenderer.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
// appBar: AppBar(
// title: Text('P2P Call Sample' + (_session?.local_user != null ? ' [Your ID (${_session?.local_user?.id})] ' : '')),
// actions: <Widget>[
// IconButton(
// icon: const Icon(Icons.settings),
// onPressed: (){
// setState(() {
// });
// },
// tooltip: 'setup',
// ),
// ],
// ),
body: videoCanvasWidgets(),
);
}
LayoutBuilder videoCanvasWidgets() {
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Stack(
children: [
CamViewWidget(
localRenderer: _localRenderer,
remoteRenderer: _remoteRenderer,
constraints: constraints,
onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
),
ConferenceButtonBar(
audioEnabled: _audioButton.stream,
videoEnabled: _videoButton.stream,
onAudioEnabled: _onAudioEnable,
onVideoEnabled: _onVideoEnabled,
onSwitchCamera: _onSwitchCamera,
onHangup: _onHangup,
onPersonAdd: () {},
onPersonRemove: () {},
onHeight: _onHeightBar,
onShow: _onShowBar,
onHide: _onHideBar,
),
],
);
},
);
}
void _connect() async {
if(_session == null)
return;
_signaling ??= Signaling(widget.host, session: _session!)..connect();
_signaling?.onSignalingStateChange = (SignalingState state) {
switch (state) {
case SignalingState.Closed:
case SignalingState.Error:
case SignalingState.Open:
break;
}
};
_signaling?.onCallStateChange = (SessionOneToOne session, CallState state) {
switch (state) {
case CallState.Calling:
setState(() {});
break;
case CallState.Bye:
setState(() {
_localRenderer.srcObject = null;
_remoteRenderer.srcObject = null;
_session = null;
});
break;
case CallState.Invite:
case CallState.Connected:
case CallState.Ringing:
}
};
_signaling?.onConnected = ((event) {
_signaling?.callAccepted(_session!);
});
_signaling?.onRemoteConnected = ((event) {
});
_signaling?.onLocalStream = ((stream) {
_localRenderer.srcObject = stream;
setState(() {
});
});
_signaling?.onAddRemoteStream = ((_, stream) {
_remoteRenderer.srcObject = stream;
setState(() {});
});
_signaling?.onRemoveRemoteStream = ((_, stream) {
setState(() {
_remoteRenderer.srcObject = null;
});
});
}
_hangUp() async{
if (_session != null) {
_signaling?.bye(_session!);
}
}
_switchCamera() {
_signaling?.switchCamera();
}
_muteMic() {
_signaling?.muteMic();
}
Function? _onAudioEnable() {
final audioTrack = localMediaStream.getAudioTracks()[0];
final mute = audioTrack.muted;
Helper.setMicrophoneMute(!mute!, audioTrack);
_audioButton.add(mute);
}
Function? _onVideoEnabled() {
final videoTrack = localMediaStream.getVideoTracks()[0];
bool videoEnabled = videoTrack.enabled;
localMediaStream.getVideoTracks()[0].enabled = !videoEnabled;
_videoButton.add(!videoEnabled);
}
Function? _onSwitchCamera() {
Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
}
void _onShowBar() {
setState(() {
});
_onButtonBarVisibleStreamController.add(true);
}
void _onHeightBar(double height) {
_onButtonBarHeightStreamController.add(height);
}
void _onHideBar() {
setState(() {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]);
});
_onButtonBarVisibleStreamController.add(false);
}
Future<void> _onHangup() async {
_signaling?.finishSessions();
print('onHangup');
Navigator.of(context).pop();
}
}
// import 'dart:async';
//
// import 'package:diplomaticquarterapp/pages/conference/conference_button_bar.dart';
// import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart';
// import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/utils/device_info.dart';
// import 'package:firebase_messaging/firebase_messaging.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'dart:core';
// import 'signaling.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// class StartVideoCall extends StatefulWidget {
// static String tag = 'webrtc';
// final String host;
//
// String caller;
// String receiver;
// bool iAmCaller;
// StartVideoCall({required this.caller, required this.receiver, this.iAmCaller = false, required this.host});
//
// @override
// StartVideoCallState createState() => StartVideoCallState(receiverId: receiver, callerId: caller, iAmCaller: iAmCaller);
// }
//
// class StartVideoCallState extends State<StartVideoCall> {
// late Signaling _signaling;
// late SessionOneToOne? _session;
//
// StartVideoCallState({required String callerId, required String receiverId, required bool iAmCaller}){
//
// final self_role = iAmCaller ? "Caller" : "Receiver";
// final self_id = iAmCaller ? callerId : receiverId;
// final self_user = SocketUser(id: self_id, name: "$self_role-$self_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
//
// final remote_role = !iAmCaller ? "Caller" : "Receiver";
// final remote_id = !iAmCaller ? callerId : receiverId;
// final remote_user = SocketUser(id: remote_id, name: "$remote_role-$remote_id", userAgent: DeviceInfo.userAgent, moreInfo: {});
//
// final session_id = "$callerId-$receiverId";
// _session = SessionOneToOne(id: session_id, local_user: self_user, remote_user: remote_user);
// }
//
// bool showNoise = true;
// final StreamController<bool> _audioButton = StreamController<bool>.broadcast();
// final StreamController<bool> _videoButton = StreamController<bool>.broadcast();
// final StreamController<bool> _onButtonBarVisibleStreamController = StreamController<bool>.broadcast();
// final StreamController<double> _onButtonBarHeightStreamController = StreamController<double>.broadcast();
//
// final RTCVideoRenderer _localRenderer = RTCVideoRenderer();
// final RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
//
// MediaStream get localMediaStream => _signaling.localStream!;
// MediaStream get remoteMediaStream => _signaling.remoteStreams.first;
//
// @override
// initState() {
// super.initState();
// initRenderers();
// _connect();
// }
//
// initRenderers() async {
// await _localRenderer.initialize();
// await _remoteRenderer.initialize();
// }
//
// @override
// deactivate() {
// super.deactivate();
// _signaling?.close();
// _localRenderer.dispose();
// _remoteRenderer.dispose();
// }
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// // appBar: AppBar(
// // title: Text('P2P Call Sample' + (_session?.local_user != null ? ' [Your ID (${_session?.local_user?.id})] ' : '')),
// // actions: <Widget>[
// // IconButton(
// // icon: const Icon(Icons.settings),
// // onPressed: (){
// // setState(() {
// // });
// // },
// // tooltip: 'setup',
// // ),
// // ],
// // ),
// body: videoCanvasWidgets(),
// );
// }
//
// LayoutBuilder videoCanvasWidgets() {
// return LayoutBuilder(
// builder: (BuildContext context, BoxConstraints constraints) {
// return Stack(
// children: [
// CamViewWidget(
// localRenderer: _localRenderer,
// remoteRenderer: _remoteRenderer,
// constraints: constraints,
// onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController,
// onButtonBarHeightStreamController: _onButtonBarHeightStreamController,
// ),
// ConferenceButtonBar(
// audioEnabled: _audioButton.stream,
// videoEnabled: _videoButton.stream,
// onAudioEnabled: _onAudioEnable,
// onVideoEnabled: _onVideoEnabled,
// onSwitchCamera: _onSwitchCamera,
// onHangup: _onHangup,
// onPersonAdd: () {},
// onPersonRemove: () {},
// onHeight: _onHeightBar,
// onShow: _onShowBar,
// onHide: _onHideBar,
// ),
// ],
// );
// },
// );
// }
//
//
// void _connect() async {
// if(_session == null)
// return;
//
// _signaling ??= Signaling(widget.host, session: _session!)..connect();
//
// _signaling?.onSignalingStateChange = (SignalingState state) {
// switch (state) {
// case SignalingState.Closed:
// case SignalingState.Error:
// case SignalingState.Open:
// break;
// }
// };
//
// _signaling?.onCallStateChange = (SessionOneToOne session, CallState state) {
// switch (state) {
// case CallState.Calling:
// setState(() {});
// break;
// case CallState.Bye:
// setState(() {
// _localRenderer.srcObject = null;
// _remoteRenderer.srcObject = null;
// _session = null;
// });
// break;
// case CallState.Invite:
// case CallState.Connected:
// case CallState.Ringing:
// }
// };
//
// _signaling?.onConnected = ((event) {
// _signaling?.callAccepted(_session!);
// });
//
// _signaling?.onRemoteConnected = ((event) {
//
// });
//
// _signaling?.onLocalStream = ((stream) {
// _localRenderer.srcObject = stream;
// setState(() {
// });
// });
//
// _signaling?.onAddRemoteStream = ((_, stream) {
// _remoteRenderer.srcObject = stream;
// setState(() {});
// });
//
// _signaling?.onRemoveRemoteStream = ((_, stream) {
// setState(() {
// _remoteRenderer.srcObject = null;
// });
// });
// }
//
// _hangUp() async{
// if (_session != null) {
// _signaling?.bye(_session!);
// }
// }
//
// _switchCamera() {
// _signaling?.switchCamera();
// }
//
// _muteMic() {
// _signaling?.muteMic();
// }
//
// Function? _onAudioEnable() {
// final audioTrack = localMediaStream.getAudioTracks()[0];
// final mute = audioTrack.muted;
// Helper.setMicrophoneMute(!mute!, audioTrack);
// _audioButton.add(mute);
// }
//
// Function? _onVideoEnabled() {
// final videoTrack = localMediaStream.getVideoTracks()[0];
// bool videoEnabled = videoTrack.enabled;
// localMediaStream.getVideoTracks()[0].enabled = !videoEnabled;
// _videoButton.add(!videoEnabled);
// }
//
// Function? _onSwitchCamera() {
// Helper.switchCamera(localMediaStream.getVideoTracks()[0]);
// }
//
// void _onShowBar() {
// setState(() {
// });
// _onButtonBarVisibleStreamController.add(true);
// }
//
// void _onHeightBar(double height) {
// _onButtonBarHeightStreamController.add(height);
// }
//
// void _onHideBar() {
// setState(() {
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]);
// });
// _onButtonBarVisibleStreamController.add(false);
// }
//
// Future<void> _onHangup() async {
// _signaling?.finishSessions();
// print('onHangup');
// Navigator.of(context).pop();
// }
// }

@ -1,242 +1,242 @@
import 'dart:convert';
// import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
typedef void StreamStateCallback(MediaStream stream);
class Signaling {
Map<String, dynamic> configuration = {
'iceServers': [
{
'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
}
]
};
late RTCPeerConnection peerConnection;
late MediaStream localStream;
late MediaStream remoteStream;
late String roomId;
late String currentRoomText;
late StreamStateCallback onAddRemoteStream;
Future<String> createRoom(RTCVideoRenderer remoteRenderer) async {
// FirebaseFirestore db = FirebaseFirestore.instance;
// DocumentReference roomRef = db.collection('rooms').doc();
print('Create PeerConnection with configuration: $configuration');
peerConnection = await createPeerConnection(configuration);
registerPeerConnectionListeners();
localStream.getTracks().forEach((track) {
peerConnection?.addTrack(track, localStream);
});
// Code for collecting ICE candidates below
// var callerCandidatesCollection = roomRef.collection('callerCandidates');
peerConnection?.onIceCandidate = (RTCIceCandidate candidate) {
print('Got candidate: ${candidate.toMap()}');
// callerCandidatesCollection.add(candidate.toMap());
};
// Finish Code for collecting ICE candidate
// Add code for creating a room
RTCSessionDescription offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
print('Created offer: $offer');
Map<String, dynamic> roomWithOffer = {'offer': offer.toMap()};
// await roomRef.set(roomWithOffer);
// var roomId = roomRef.id;
print('New room created with SDK offer. Room ID: $roomId');
currentRoomText = 'Current room is $roomId - You are the caller!';
// Created a Room
peerConnection?.onTrack = (RTCTrackEvent event) {
print('Got remote track: ${event.streams[0]}');
event.streams[0].getTracks().forEach((track) {
print('Add a track to the remoteStream $track');
remoteStream?.addTrack(track);
});
};
// Listening for remote session description below
// roomRef.snapshots().listen((snapshot) async {
// print('Got updated room: ${snapshot.data()}');
//
// Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
// if (peerConnection?.getRemoteDescription() != null && data['answer'] != null) {
// var answer = RTCSessionDescription(
// data['answer']['sdp'],
// data['answer']['type'],
// );
//
// print("Someone tried to connect");
// await peerConnection?.setRemoteDescription(answer);
// }
// });
// // Listening for remote session description above
//
// // Listen for remote Ice candidates below
// roomRef.collection('calleeCandidates').snapshots().listen((snapshot) {
// snapshot.docChanges.forEach((change) {
// if (change.type == DocumentChangeType.added) {
// Map<String, dynamic> data = change.doc.data() as Map<String, dynamic>;
// print('Got new remote ICE candidate: ${jsonEncode(data)}');
// peerConnection.addCandidate(
// RTCIceCandidate(
// data['candidate'],
// data['sdpMid'],
// data['sdpMLineIndex'],
// ),
// );
// }
// });
// });
// Listen for remote ICE candidates above
return roomId;
}
Future<void> joinRoom(String roomId, RTCVideoRenderer remoteVideo) async {
// FirebaseFirestore db = FirebaseFirestore.instance;
// DocumentReference roomRef = db.collection('rooms').doc('$roomId');
// var roomSnapshot = await roomRef.get();
// print('Got room ${roomSnapshot.exists}');
// if (roomSnapshot.exists) {
// print('Create PeerConnection with configuration: $configuration');
// peerConnection = await createPeerConnection(configuration);
//
// registerPeerConnectionListeners();
//
// localStream.getTracks().forEach((track) {
// peerConnection?.addTrack(track, localStream);
// });
//
// // Code for collecting ICE candidates below
// // var calleeCandidatesCollection = roomRef.collection('calleeCandidates');
// peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
// if (candidate == null) {
// print('onIceCandidate: complete!');
// return;
// }
// print('onIceCandidate: ${candidate.toMap()}');
// // calleeCandidatesCollection.add(candidate.toMap());
// };
// // Code for collecting ICE candidate above
//
// peerConnection?.onTrack = (RTCTrackEvent event) {
// print('Got remote track: ${event.streams[0]}');
// event.streams[0].getTracks().forEach((track) {
// print('Add a track to the remoteStream: $track');
// remoteStream?.addTrack(track);
// });
// };
//
// // Code for creating SDP answer below
// var data = roomSnapshot.data() as Map<String, dynamic>;
// print('Got offer $data');
// var offer = data['offer'];
// await peerConnection?.setRemoteDescription(
// RTCSessionDescription(offer['sdp'], offer['type']),
// );
// var answer = await peerConnection.createAnswer();
// print('Created Answer $answer');
//
// await peerConnection.setLocalDescription(answer);
//
// Map<String, dynamic> roomWithAnswer = {
// 'answer': {'type': answer.type, 'sdp': answer.sdp}
// };
//
// await roomRef.update(roomWithAnswer);
// // Finished creating SDP answer
//
// // Listening for remote ICE candidates below
// // roomRef.collection('callerCandidates').snapshots().listen((snapshot) {
// // snapshot.docChanges.forEach((document) {
// // var data = document.doc.data() as Map<String, dynamic>;
// // print(data);
// // print('Got new remote ICE candidate: $data');
// // peerConnection.addCandidate(
// // RTCIceCandidate(
// // data['candidate'],
// // data['sdpMid'],
// // data['sdpMLineIndex'],
// // ),
// // );
// // });
// // });
// }
}
Future<void> openUserMedia(
RTCVideoRenderer localVideo,
RTCVideoRenderer remoteVideo,
) async {
var stream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': false});
localVideo.srcObject = stream;
localStream = stream;
remoteVideo.srcObject = await createLocalMediaStream('key');
}
Future<void> hangUp(RTCVideoRenderer localVideo) async {
List<MediaStreamTrack> tracks = localVideo.srcObject!.getTracks();
tracks.forEach((track) {
track.stop();
});
if (remoteStream != null) {
remoteStream.getTracks().forEach((track) => track.stop());
}
if (peerConnection != null) peerConnection.close();
if (roomId != null) {
// var db = FirebaseFirestore.instance;
// var roomRef = db.collection('rooms').doc(roomId);
// var calleeCandidates = await roomRef.collection('calleeCandidates').get();
// calleeCandidates.docs.forEach((document) => document.reference.delete());
// var callerCandidates = await roomRef.collection('callerCandidates').get();
// callerCandidates.docs.forEach((document) => document.reference.delete());
// await roomRef.delete();
}
localStream.dispose();
remoteStream?.dispose();
}
void registerPeerConnectionListeners() {
peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
print('ICE gathering state changed: $state');
};
peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
print('Connection state change: $state');
};
peerConnection?.onSignalingState = (RTCSignalingState state) {
print('Signaling state change: $state');
};
peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
print('ICE connection state change: $state');
};
peerConnection?.onAddStream = (MediaStream stream) {
print("Add remote stream");
onAddRemoteStream?.call(stream);
remoteStream = stream;
};
}
}
// import 'dart:convert';
//
// // import 'package:cloud_firestore/cloud_firestore.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart';
//
// typedef void StreamStateCallback(MediaStream stream);
//
// class Signaling {
// Map<String, dynamic> configuration = {
// 'iceServers': [
// {
// 'urls': ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']
// }
// ]
// };
//
// late RTCPeerConnection peerConnection;
// late MediaStream localStream;
// late MediaStream remoteStream;
// late String roomId;
// late String currentRoomText;
// late StreamStateCallback onAddRemoteStream;
//
// Future<String> createRoom(RTCVideoRenderer remoteRenderer) async {
// // FirebaseFirestore db = FirebaseFirestore.instance;
// // DocumentReference roomRef = db.collection('rooms').doc();
//
// print('Create PeerConnection with configuration: $configuration');
//
// peerConnection = await createPeerConnection(configuration);
//
// registerPeerConnectionListeners();
//
// localStream.getTracks().forEach((track) {
// peerConnection?.addTrack(track, localStream);
// });
//
// // Code for collecting ICE candidates below
// // var callerCandidatesCollection = roomRef.collection('callerCandidates');
//
// peerConnection?.onIceCandidate = (RTCIceCandidate candidate) {
// print('Got candidate: ${candidate.toMap()}');
// // callerCandidatesCollection.add(candidate.toMap());
// };
// // Finish Code for collecting ICE candidate
//
// // Add code for creating a room
// RTCSessionDescription offer = await peerConnection.createOffer();
// await peerConnection.setLocalDescription(offer);
// print('Created offer: $offer');
//
// Map<String, dynamic> roomWithOffer = {'offer': offer.toMap()};
//
// // await roomRef.set(roomWithOffer);
// // var roomId = roomRef.id;
// print('New room created with SDK offer. Room ID: $roomId');
// currentRoomText = 'Current room is $roomId - You are the caller!';
// // Created a Room
//
// peerConnection?.onTrack = (RTCTrackEvent event) {
// print('Got remote track: ${event.streams[0]}');
//
// event.streams[0].getTracks().forEach((track) {
// print('Add a track to the remoteStream $track');
// remoteStream?.addTrack(track);
// });
// };
//
// // Listening for remote session description below
// // roomRef.snapshots().listen((snapshot) async {
// // print('Got updated room: ${snapshot.data()}');
// //
// // Map<String, dynamic> data = snapshot.data() as Map<String, dynamic>;
// // if (peerConnection?.getRemoteDescription() != null && data['answer'] != null) {
// // var answer = RTCSessionDescription(
// // data['answer']['sdp'],
// // data['answer']['type'],
// // );
// //
// // print("Someone tried to connect");
// // await peerConnection?.setRemoteDescription(answer);
// // }
// // });
// // // Listening for remote session description above
// //
// // // Listen for remote Ice candidates below
// // roomRef.collection('calleeCandidates').snapshots().listen((snapshot) {
// // snapshot.docChanges.forEach((change) {
// // if (change.type == DocumentChangeType.added) {
// // Map<String, dynamic> data = change.doc.data() as Map<String, dynamic>;
// // print('Got new remote ICE candidate: ${jsonEncode(data)}');
// // peerConnection.addCandidate(
// // RTCIceCandidate(
// // data['candidate'],
// // data['sdpMid'],
// // data['sdpMLineIndex'],
// // ),
// // );
// // }
// // });
// // });
// // Listen for remote ICE candidates above
//
// return roomId;
// }
//
// Future<void> joinRoom(String roomId, RTCVideoRenderer remoteVideo) async {
// // FirebaseFirestore db = FirebaseFirestore.instance;
// // DocumentReference roomRef = db.collection('rooms').doc('$roomId');
// // var roomSnapshot = await roomRef.get();
// // print('Got room ${roomSnapshot.exists}');
//
// // if (roomSnapshot.exists) {
// // print('Create PeerConnection with configuration: $configuration');
// // peerConnection = await createPeerConnection(configuration);
// //
// // registerPeerConnectionListeners();
// //
// // localStream.getTracks().forEach((track) {
// // peerConnection?.addTrack(track, localStream);
// // });
// //
// // // Code for collecting ICE candidates below
// // // var calleeCandidatesCollection = roomRef.collection('calleeCandidates');
// // peerConnection.onIceCandidate = (RTCIceCandidate candidate) {
// // if (candidate == null) {
// // print('onIceCandidate: complete!');
// // return;
// // }
// // print('onIceCandidate: ${candidate.toMap()}');
// // // calleeCandidatesCollection.add(candidate.toMap());
// // };
// // // Code for collecting ICE candidate above
// //
// // peerConnection?.onTrack = (RTCTrackEvent event) {
// // print('Got remote track: ${event.streams[0]}');
// // event.streams[0].getTracks().forEach((track) {
// // print('Add a track to the remoteStream: $track');
// // remoteStream?.addTrack(track);
// // });
// // };
// //
// // // Code for creating SDP answer below
// // var data = roomSnapshot.data() as Map<String, dynamic>;
// // print('Got offer $data');
// // var offer = data['offer'];
// // await peerConnection?.setRemoteDescription(
// // RTCSessionDescription(offer['sdp'], offer['type']),
// // );
// // var answer = await peerConnection.createAnswer();
// // print('Created Answer $answer');
// //
// // await peerConnection.setLocalDescription(answer);
// //
// // Map<String, dynamic> roomWithAnswer = {
// // 'answer': {'type': answer.type, 'sdp': answer.sdp}
// // };
// //
// // await roomRef.update(roomWithAnswer);
// // // Finished creating SDP answer
// //
// // // Listening for remote ICE candidates below
// // // roomRef.collection('callerCandidates').snapshots().listen((snapshot) {
// // // snapshot.docChanges.forEach((document) {
// // // var data = document.doc.data() as Map<String, dynamic>;
// // // print(data);
// // // print('Got new remote ICE candidate: $data');
// // // peerConnection.addCandidate(
// // // RTCIceCandidate(
// // // data['candidate'],
// // // data['sdpMid'],
// // // data['sdpMLineIndex'],
// // // ),
// // // );
// // // });
// // // });
// // }
// }
//
// Future<void> openUserMedia(
// RTCVideoRenderer localVideo,
// RTCVideoRenderer remoteVideo,
// ) async {
// var stream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': false});
//
// localVideo.srcObject = stream;
// localStream = stream;
//
// remoteVideo.srcObject = await createLocalMediaStream('key');
// }
//
// Future<void> hangUp(RTCVideoRenderer localVideo) async {
// List<MediaStreamTrack> tracks = localVideo.srcObject!.getTracks();
// tracks.forEach((track) {
// track.stop();
// });
//
// if (remoteStream != null) {
// remoteStream.getTracks().forEach((track) => track.stop());
// }
// if (peerConnection != null) peerConnection.close();
//
// if (roomId != null) {
// // var db = FirebaseFirestore.instance;
// // var roomRef = db.collection('rooms').doc(roomId);
// // var calleeCandidates = await roomRef.collection('calleeCandidates').get();
// // calleeCandidates.docs.forEach((document) => document.reference.delete());
//
// // var callerCandidates = await roomRef.collection('callerCandidates').get();
// // callerCandidates.docs.forEach((document) => document.reference.delete());
//
// // await roomRef.delete();
// }
//
// localStream.dispose();
// remoteStream?.dispose();
// }
//
// void registerPeerConnectionListeners() {
// peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
// print('ICE gathering state changed: $state');
// };
//
// peerConnection?.onConnectionState = (RTCPeerConnectionState state) {
// print('Connection state change: $state');
// };
//
// peerConnection?.onSignalingState = (RTCSignalingState state) {
// print('Signaling state change: $state');
// };
//
// peerConnection?.onIceGatheringState = (RTCIceGatheringState state) {
// print('ICE connection state change: $state');
// };
//
// peerConnection?.onAddStream = (MediaStream stream) {
// print("Add remote stream");
// onAddRemoteStream?.call(stream);
// remoteStream = stream;
// };
// }
// }

@ -123,7 +123,7 @@ class LocationUtils {
latitude: location.latitude!,
longitude: location.longitude!,
altitude: location.altitude!,
timestamp: null,
timestamp: DateTime.now(),
accuracy: 1.0,
heading: 0.0,
speed: 0.0,

@ -212,17 +212,17 @@ class DoctorCard extends StatelessWidget {
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: CustomColors.accentColor,
),
color: CustomColors.accentColor, ),
empty: Icon(
Icons.star_border,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
),
unratedColor: Colors.grey[500],
onRatingUpdate: (double value) {}),
],
),

@ -150,6 +150,7 @@ class DoctorHeader extends StatelessWidget {
color: CustomColors.accentColor,
),
),
unratedColor: Colors.grey[500],
onRatingUpdate: (double value) {}),
SizedBox(width: 6),
Text(
@ -299,21 +300,22 @@ class DoctorHeader extends StatelessWidget {
itemSize: 20.0,
allowHalfRating: true,
initialRating:
this.headerModel!.decimalDoctorRate! != null ? double.tryParse(this.headerModel!.decimalDoctorRate!)! : this.headerModel!.actualDoctorRate!.toDouble(),
this.headerModel.decimalDoctorRate != null ? double.tryParse(this.headerModel.decimalDoctorRate)! : this.headerModel.actualDoctorRate!.toDouble(),
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
half: Icon(
Icons.star_half,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
empty: Icon(
Icons.star_border,
color: Color(0XFFD02127),
color: CustomColors.accentColor,
),
),
unratedColor: Colors.grey[500],
onRatingUpdate: (double value) {}),
// RatingBar(
// initialRating: this.headerModel!.decimalDoctorRate! != null ? double.tryParse(this.headerModel!.decimalDoctorRate!)! : this.headerModel!.actualDoctorRate!.toDouble(),

@ -47,7 +47,11 @@ class PackagesItemCardState extends State<PackagesItemCard> {
aspectRatio: 144 / 144,
child: ClipRRect(
borderRadius: BorderRadius.circular(12.0),
child: Image.network(widget.itemModel!.images!.isNotEmpty ? widget.itemModel!.images![0].src! : "https://mdlaboratories.com/offersdiscounts/images/thumbs/0000162_dermatology-testing.jpeg", fit: BoxFit.fill, height: 180.0, width: 180.0),
child: Image.network(
widget.itemModel!.images!.isNotEmpty ? widget.itemModel!.images![0].src! : "https://mdlaboratories.com/offersdiscounts/images/thumbs/0000162_dermatology-testing.jpeg",
fit: BoxFit.fill,
height: 180.0,
width: 180.0),
),
),
SizedBox(height: 6),
@ -100,20 +104,27 @@ class PackagesItemCardState extends State<PackagesItemCard> {
),
),
RatingBar(
initialRating: 4.5, // todo ask haroon about parameter for rating
// size: 18.0,
// filledColor: Color(0XFFD02127),
// emptyColor: Color(0XFFD02127),
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: ,
//
ratingWidget: RatingWidget( full:Icon(Icons.star, color:Color(0XFFD02127)), half:Icon(Icons.star_half, color: Color(0XFFD02127)), empty: Icon(Icons.star_border,color: Color(0XFFD02127)) ,
), onRatingUpdate: (double value) { }),
initialRating: 4.5, // todo ask haroon about parameter for rating
// size: 18.0,
// filledColor: Color(0XFFD02127),
// emptyColor: Color(0XFFD02127),
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: ,
//
ratingWidget: RatingWidget(
full: Icon(Icons.star, color: CustomColors.accentColor,),
half: Icon(Icons.star_half, color: CustomColors.accentColor,),
empty: Icon(Icons.star_border, color: CustomColors.accentColor,),
),
ignoreGestures: true,
updateOnDrag: false,
unratedColor: Colors.grey[500],
onRatingUpdate: (double value) {}),
],
),
if(widget.onCartClick != null)
if (widget.onCartClick != null)
InkWell(
child: SvgPicture.asset("assets/images/new/add_to_cart.svg"),
onTap: () {

@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/product_deta
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-page/cart-order-page.dart';
import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
@ -13,7 +14,6 @@ import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
class productTile extends StatelessWidget {
final String? productName;
final String? productPrice;
@ -99,10 +99,7 @@ class productTile extends StatelessWidget {
child: RichText(
text: TextSpan(
text: productName,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
style: TextStyle(color: Colors.black54, fontSize: 15, fontWeight: FontWeight.bold),
),
),
)
@ -111,10 +108,7 @@ class productTile extends StatelessWidget {
child: RichText(
text: TextSpan(
text: productName,
style: TextStyle(
color: Colors.black54,
fontSize: 15,
fontWeight: FontWeight.bold),
style: TextStyle(color: Colors.black54, fontSize: 15, fontWeight: FontWeight.bold),
),
),
),
@ -127,10 +121,7 @@ class productTile extends StatelessWidget {
child: RichText(
text: TextSpan(
text: 'SAR $productPrice',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.black, fontSize: 13),
),
),
)
@ -139,10 +130,7 @@ class productTile extends StatelessWidget {
child: RichText(
text: TextSpan(
text: 'SAR $productPrice',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 13),
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.black, fontSize: 13),
),
),
),
@ -164,23 +152,18 @@ class productTile extends StatelessWidget {
// halfFilledIcon: Icons.star_half,
// filledIcon: Icons.star,
// emptyIcon: Icons.star,
itemBuilder: (BuildContext context, int index) => Icon(
itemBuilder: (BuildContext context, int index) => Icon(
Icons.star,
color: Colors.yellow[700],
color: CustomColors.accentColor,
size: 15,
), onRatingUpdate: (double value) {
},
),
onRatingUpdate: (double value) {},
),
),
),
Text(
'${approvedTotalReviews} ${TranslationBase.of(context).reviews}',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey,
fontSize: 13),
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.grey, fontSize: 13),
),
],
)
@ -218,9 +201,7 @@ class productTile extends StatelessWidget {
GifLoaderDialogUtils.hideDialog(context);
Utils.navigateToCartPage();
} else {
AppToast.showErrorToast(
message: TranslationBase.of(context)
.needPrescription);
AppToast.showErrorToast(message: TranslationBase.of(context).needPrescription);
}
},
),
@ -239,13 +220,8 @@ class productTile extends StatelessWidget {
margin: EdgeInsets.only(bottom: 5.0),
child: RichText(
text: TextSpan(
text: TranslationBase.of(context).quantity +
"" +
'$qyt',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey,
fontSize: 13),
text: TranslationBase.of(context).quantity + "" + '$qyt',
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.grey, fontSize: 13),
),
),
),
@ -271,10 +247,7 @@ class productTile extends StatelessWidget {
RichText(
text: TextSpan(
text: ' $totalPrice SAR',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 15),
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.black, fontSize: 15),
),
),
],
@ -304,7 +277,26 @@ class productTile extends StatelessWidget {
// isHalfAllowed: true,
// halfFilledIcon: Icons.star_half,
// filledIcon: ,
ratingWidget: RatingWidget(full: Icon(Icons.star, color:Colors.yellow[700], size: 15,), half: Icon(Icons.star_half, color:Colors.grey[500], size: 15), empty: Icon(Icons.star_half, color:Colors.grey[500], size: 15)), onRatingUpdate: (double value) { },
ratingWidget: RatingWidget(
full: Icon(
Icons.star,
color: CustomColors.accentColor,
size: 15,
),
half: Icon(
Icons.star_half,
color: CustomColors.accentColor,
size: 15,
),
empty: Icon(
Icons.star_half,
color: CustomColors.accentColor,
size: 15,
),
),
updateOnDrag: false,
unratedColor: Colors.grey[500],
onRatingUpdate: (double value) {},
),
),
),
@ -314,33 +306,21 @@ class productTile extends StatelessWidget {
// alignment: Alignment.topLeft,
child: RichText(
text: TextSpan(
text:
'${productReviews} ${TranslationBase.of(context).reviews}',
text: '${productReviews} ${TranslationBase.of(context).reviews}',
// text: '($productReviews reviews)',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey,
fontSize: 13),
style: TextStyle(fontWeight: FontWeight.bold, color: Colors.grey, fontSize: 13),
),
),
),
),
InkWell(
onTap: () {
Navigator.push(
context, FadePage(page: ProductReviewPage(product!)));
Navigator.push(context, FadePage(page: ProductReviewPage(product!)));
},
child: Container(
padding:
EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0),
padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0),
height: 30.0,
decoration: BoxDecoration(
border: Border.all(
color: Colors.orange,
style: BorderStyle.solid,
width: 1.0),
color: Colors.transparent,
borderRadius: BorderRadius.circular(5.0)),
decoration: BoxDecoration(border: Border.all(color: Colors.orange, style: BorderStyle.solid, width: 1.0), color: Colors.transparent, borderRadius: BorderRadius.circular(5.0)),
child: Text(
TranslationBase.of(context).writeReview,
style: TextStyle(

@ -126,7 +126,7 @@ dependencies:
jiffy: ^6.2.1
#Flutter WebRTC
flutter_webrtc: ^0.9.7
#flutter_webrtc: ^0.9.7
screen_brightness: ^0.2.2+1
google_maps_place_picker_mb: ^3.0.0
map_launcher: ^3.0.1
@ -149,7 +149,7 @@ dependencies:
badges: ^3.1.2
flutter_app_icon_badge: ^2.0.0
dropdown_search: 5.0.6
youtube_player_flutter: ^8.0.0
youtube_player_flutter: ^8.1.2
shimmer: ^3.0.0
carousel_slider: ^4.0.0

Loading…
Cancel
Save