Merge remote-tracking branch 'origin/development_aamir' into development_aamir

merge-requests/131/head
Sikander Saleem 3 years ago
commit 05ff1fcf3f

@ -489,9 +489,11 @@
"sponsoredBy": "برعاية:", "sponsoredBy": "برعاية:",
"question": "سؤال", "question": "سؤال",
"marathoners": "الماراثون", "marathoners": "الماراثون",
"marathoner": "ماراثونر",
"prize": "جائزة:", "prize": "جائزة:",
"winnerSelection": "اختيار الفائز", "winnerSelection": "اختيار الفائز",
"qualifiers": "تصفيات", "qualifiers": "تصفيات",
"qualifier": "المؤهل",
"getReadyForContest": "استعد للمسابقة القادمة:", "getReadyForContest": "استعد للمسابقة القادمة:",
"winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.",
"fingersCrossed": "تشابك الاصابع!!!", "fingersCrossed": "تشابك الاصابع!!!",
@ -516,5 +518,6 @@
"winners": "الفائزين!!!", "winners": "الفائزين!!!",
"noUpcoming": "لا يوجد قادم", "noUpcoming": "لا يوجد قادم",
"fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية", "fakeLocation": ".لقد تتبعنا أنك تحاول استخدام موقع مزيف! يعتبر هذا مخالفة وقد تم إخطار الموارد البشرية",
"noWinner": "حزين! لم يفز أحد اليوم." "noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam" : "فريقي"
} }

@ -478,6 +478,7 @@
"sponsoredBy": "Sponsored By:", "sponsoredBy": "Sponsored By:",
"question": "Question", "question": "Question",
"marathoners": "Marathoners", "marathoners": "Marathoners",
"marathoner": "Marathoner",
"prize": "Prize:", "prize": "Prize:",
"advancedSearch": "Advanced Search", "advancedSearch": "Advanced Search",
"openNot": "Open Notifications", "openNot": "Open Notifications",
@ -492,6 +493,7 @@
"none": "None", "none": "None",
"winnerSelection": "Winner Selection", "winnerSelection": "Winner Selection",
"qualifiers": "Qualifiers", "qualifiers": "Qualifiers",
"qualifier": "Qualifier",
"getReadyForContest": "Get Ready for the coming contest:", "getReadyForContest": "Get Ready for the coming contest:",
"winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.",
"fingersCrossed": "Fingers Crossed!!!", "fingersCrossed": "Fingers Crossed!!!",
@ -516,5 +518,6 @@
"winners": "WINNERS!!!", "winners": "WINNERS!!!",
"noUpcoming": "There is no upcoming", "noUpcoming": "There is no upcoming",
"fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.", "fakeLocation": "We traced out that you try to use a fake location! This is considered a violation, and HR has been notified.",
"noWinner": "Sad! No one won today." "noWinner": "Sad! No one won today.",
"myTeam" : "My Team"
} }

@ -29,7 +29,6 @@ class MarathonApiClient {
(json) { (json) {
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
AppState().setMarathonToken = marathonModel.data["token"] ?? ""; AppState().setMarathonToken = marathonModel.data["token"] ?? "";
print("marathonToken: ${"AppState(): ${AppState().getMarathonToken}"}");
return marathonModel.data["token"] ?? ""; return marathonModel.data["token"] ?? "";
}, },
ApiConsts.marathonParticipantLoginUrl, ApiConsts.marathonParticipantLoginUrl,

@ -3,8 +3,8 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
class ApiConsts { class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server //static String baseUrl = "http://10.200.204.20:2801/"; // Local server
// static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server
// static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
static String baseUrl = "https://hmgwebservices.com"; // Live server // static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server
static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/";

@ -498,9 +498,11 @@ class CodegenLoader extends AssetLoader {
"sponsoredBy": "برعاية:", "sponsoredBy": "برعاية:",
"question": "سؤال", "question": "سؤال",
"marathoners": "الماراثون", "marathoners": "الماراثون",
"marathoner": "ماراثونر",
"prize": "جائزة:", "prize": "جائزة:",
"winnerSelection": "اختيار الفائز", "winnerSelection": "اختيار الفائز",
"qualifiers": "تصفيات", "qualifiers": "تصفيات",
"qualifier": "المؤهل",
"getReadyForContest": "استعد للمسابقة القادمة:", "getReadyForContest": "استعد للمسابقة القادمة:",
"winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.",
"fingersCrossed": "تشابك الاصابع!!!", "fingersCrossed": "تشابك الاصابع!!!",
@ -1000,6 +1002,7 @@ class CodegenLoader extends AssetLoader {
"sponsoredBy": "Sponsored By:", "sponsoredBy": "Sponsored By:",
"question": "Question", "question": "Question",
"marathoners": "Marathoners", "marathoners": "Marathoners",
"marathoner": "Marathoner",
"prize": "Prize:", "prize": "Prize:",
"advancedSearch": "Advanced Search", "advancedSearch": "Advanced Search",
"openNot": "Open Notifications", "openNot": "Open Notifications",
@ -1014,6 +1017,7 @@ class CodegenLoader extends AssetLoader {
"none": "None", "none": "None",
"winnerSelection": "Winner Selection", "winnerSelection": "Winner Selection",
"qualifiers": "Qualifiers", "qualifiers": "Qualifiers",
"qualifier": "Qualifier",
"getReadyForContest": "Get Ready for the coming contest:", "getReadyForContest": "Get Ready for the coming contest:",
"winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.",
"fingersCrossed": "Fingers Crossed!!!", "fingersCrossed": "Fingers Crossed!!!",

@ -475,9 +475,11 @@ abstract class LocaleKeys {
static const sponsoredBy = 'sponsoredBy'; static const sponsoredBy = 'sponsoredBy';
static const question = 'question'; static const question = 'question';
static const marathoners = 'marathoners'; static const marathoners = 'marathoners';
static const marathoner = 'marathoner';
static const prize = 'prize'; static const prize = 'prize';
static const winnerSelection = 'winnerSelection'; static const winnerSelection = 'winnerSelection';
static const qualifiers = 'qualifiers'; static const qualifiers = 'qualifiers';
static const qualifier = 'qualifier';
static const getReadyForContest = 'getReadyForContest'; static const getReadyForContest = 'getReadyForContest';
static const winnerSelectedRandomly = 'winnerSelectedRandomly'; static const winnerSelectedRandomly = 'winnerSelectedRandomly';
static const fingersCrossed = 'fingersCrossed'; static const fingersCrossed = 'fingersCrossed';
@ -503,5 +505,6 @@ abstract class LocaleKeys {
static const noUpcoming = 'noUpcoming'; static const noUpcoming = 'noUpcoming';
static const fakeLocation = 'fakeLocation'; static const fakeLocation = 'fakeLocation';
static const noWinner = 'noWinner'; static const noWinner = 'noWinner';
static const myTeam = 'myTeam';
} }

@ -61,11 +61,17 @@ class ChatBubble extends StatelessWidget {
required SingleUserChatModel data, required SingleUserChatModel data,
}) async { }) async {
if (data.voice != null && data.voice!.existsSync()) { if (data.voice != null && data.voice!.existsSync()) {
await data.voiceController!.setFilePath(data!.voice!.path);
await data.voiceController!.setLoopMode(LoopMode.off); await data.voiceController!.setLoopMode(LoopMode.off);
Duration? duration = await data.voiceController!.load(); if (Platform.isIOS) {
await data.voiceController!.seek(duration); Duration? duration = await data.voiceController!.setAudioSource(MyCustomStream(data.voice!.readAsBytesSync()));
await data.voiceController!.play(); await data.voiceController!.seek(duration);
data.voiceController!.play();
} else {
await data.voiceController!.setFilePath(data!.voice!.path);
Duration? duration = await data.voiceController!.load();
await data.voiceController!.seek(duration);
await data.voiceController!.play();
}
} else { } else {
Utils.showLoading(context); Utils.showLoading(context);
Uint8List encodedString = await ChatApiClient().downloadURL(fileName: data.contant!, fileTypeDescription: provider.getFileTypeDescription(data.fileTypeResponse!.fileTypeName ?? "")); Uint8List encodedString = await ChatApiClient().downloadURL(fileName: data.contant!, fileTypeDescription: provider.getFileTypeDescription(data.fileTypeResponse!.fileTypeName ?? ""));
@ -74,13 +80,19 @@ class ChatBubble extends StatelessWidget {
File file = File(path!); File file = File(path!);
await file.readAsBytes(); await file.readAsBytes();
data.voice = file; data.voice = file;
Duration? duration = await data.voiceController!.setFilePath(file.path); if (Platform.isIOS) {
await data.voiceController!.setLoopMode(LoopMode.off); Duration? duration = await data.voiceController!.setAudioSource(MyCustomStream(encodedString));
await data.voiceController!.seek(duration); await data.voiceController!.seek(duration);
await data.voiceController!.setVolume(1.0); data.voiceController!.play();
await data.voiceController!.load(); } else {
Utils.hideLoading(context); Duration? duration = await data.voiceController!.setFilePath(file.path);
await data.voiceController!.play(); await data.voiceController!.setLoopMode(LoopMode.off);
await data.voiceController!.seek(duration);
await data.voiceController!.setVolume(1.0);
await data.voiceController!.load();
Utils.hideLoading(context);
await data.voiceController!.play();
}
} catch (e) { } catch (e) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(e.toString()); Utils.showToast(e.toString());
@ -114,7 +126,7 @@ class ChatBubble extends StatelessWidget {
Widget currentUser(BuildContext context) { Widget currentUser(BuildContext context) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: <Widget>[
if (isReplied) if (isReplied)
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(5.0), borderRadius: BorderRadius.circular(5.0),
@ -200,7 +212,7 @@ class ChatBubble extends StatelessWidget {
), ),
), ),
], ],
).paddingOnly(top: 11, left: 13, right: 13, bottom: 5).objectContainerView(disablePadding: true).paddingOnly(left: MediaQuery.of(context).size.width * 0.3); ).paddingOnly(top: 11, left: 13, right: 13, bottom: 5).objectContainerView(disablePadding: true, radius: 10).paddingOnly(left: MediaQuery.of(context).size.width * 0.3);
} }
Widget receiptUser(BuildContext context) { Widget receiptUser(BuildContext context) {
@ -340,6 +352,7 @@ class ChatBubble extends StatelessWidget {
Widget currentWaveBubble(BuildContext context, SingleUserChatModel data) { Widget currentWaveBubble(BuildContext context, SingleUserChatModel data) {
return Container( return Container(
margin: const EdgeInsets.all(0), margin: const EdgeInsets.all(0),
constraints: const BoxConstraints(),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
left: BorderSide(width: 6, color: isCurrentUser ? MyColors.gradiantStartColor : MyColors.white), left: BorderSide(width: 6, color: isCurrentUser ? MyColors.gradiantStartColor : MyColors.white),
@ -411,7 +424,7 @@ class ChatBubble extends StatelessWidget {
child: const CircularProgressIndicator(), child: const CircularProgressIndicator(),
); );
} else if (playing != true) { } else if (playing != true) {
return Icon( return const Icon(
Icons.play_arrow, Icons.play_arrow,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -419,7 +432,7 @@ class ChatBubble extends StatelessWidget {
playVoice(context, data: modelData); playVoice(context, data: modelData);
}); });
} else if (processingState != ProcessingState.completed) { } else if (processingState != ProcessingState.completed) {
return Icon( return const Icon(
Icons.pause, Icons.pause,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -427,7 +440,7 @@ class ChatBubble extends StatelessWidget {
pausePlaying(context, data: modelData); pausePlaying(context, data: modelData);
}); });
} else { } else {
return Icon( return const Icon(
Icons.replay, Icons.replay,
size: 30, size: 30,
color: MyColors.lightGreenColor, color: MyColors.lightGreenColor,
@ -439,3 +452,23 @@ class ChatBubble extends StatelessWidget {
); );
} }
} }
// Feed your own stream of bytes into the player
class MyCustomStream extends StreamAudioSource {
final Uint8List bytes;
MyCustomStream(this.bytes);
@override
Future<StreamAudioResponse> request([int? start, int? end]) async {
start ??= 0;
end ??= bytes.length;
return StreamAudioResponse(
sourceLength: bytes.length,
contentLength: end - start,
offset: start,
stream: Stream.value(bytes.sublist(start, end)),
contentType: 'audio/aac',
);
}
}

@ -275,7 +275,6 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
: null, : null,
), ),
onChanged: (String val) { onChanged: (String val) {
print(val.length);
if (val.isNotEmpty) { if (val.isNotEmpty) {
m.isTextMsg = true; m.isTextMsg = true;
} else { } else {

@ -83,7 +83,7 @@ class _ChatHomeState extends State<ChatHome> {
children: <Widget>[ children: <Widget>[
myTab(LocaleKeys.mychats.tr(), 0), myTab(LocaleKeys.mychats.tr(), 0),
myTab(LocaleKeys.favorite.tr(), 1), myTab(LocaleKeys.favorite.tr(), 1),
AppState().getempStatusIsManager ? myTab("My Team", 2) : const SizedBox(), AppState().getempStatusIsManager ? myTab(LocaleKeys.myTeam.tr(), 2) : const SizedBox(),
], ],
), ),
), ),

@ -72,7 +72,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
children: [ children: [
BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId), BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId, showLoading: false),
12.height, 12.height,
ListView.separated( ListView.separated(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),

@ -136,6 +136,8 @@ class MarathonProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
// 9c47d281-c5b5-4b5d-a90a-08dacb8cbdb6
// MarathonI
//****************TIMERS********** //****************TIMERS**********
int sponsorsSecondsCounter = 0; int sponsorsSecondsCounter = 0;
@ -208,8 +210,6 @@ class MarathonProvider extends ChangeNotifier {
} }
if (totalCurrentQuestionTime == currentGapTime) { if (totalCurrentQuestionTime == currentGapTime) {
totalCurrentQuestionTime--;
updateCardStatusToAnswer(); updateCardStatusToAnswer();
scheduleMicrotask(() async { scheduleMicrotask(() async {
@ -222,20 +222,23 @@ class MarathonProvider extends ChangeNotifier {
}); });
} }
}); });
}
if (totalCurrentQuestionTime == 0) { if (currentQuestionNumber == marathonDetailModel.totalQuestions!) {
gapTimeImage = currentQuestion.gapImage;
gapTimeText = currentQuestion.gapText;
gapTimeType = currentQuestion.gapType;
updateCardData();
if (currentQuestionNumber - 1 == marathonDetailModel.totalQuestions!) {
isGettingQualifiers = true; isGettingQualifiers = true;
updateQuestionCardStatus(QuestionCardStatus.findingWinner); updateQuestionCardStatus(QuestionCardStatus.findingWinner);
timer.cancel(); timer.cancel();
cancelTimer(); cancelTimer();
notifyListeners(); notifyListeners();
} }
totalCurrentQuestionTime--;
}
if (totalCurrentQuestionTime == 0) {
gapTimeImage = currentQuestion.gapImage;
gapTimeText = currentQuestion.gapText;
gapTimeType = currentQuestion.gapType;
updateCardData();
return; return;
} else { } else {
if (totalCurrentQuestionTime != currentGapTime) { if (totalCurrentQuestionTime != currentGapTime) {

@ -10,6 +10,7 @@ import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart';
class CountdownTimerForDetailScreen extends StatelessWidget { class CountdownTimerForDetailScreen extends StatelessWidget {
final int timeToMarathon; final int timeToMarathon;
@ -192,7 +193,8 @@ class CountdownTimerForDetailScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return CountdownTimer( return CountdownTimer(
endTime: timeToMarathon, endTime: dummyTime,
// endTime: timeToMarathon,
onEnd: null, onEnd: null,
widgetBuilder: (BuildContext context, CurrentRemainingTime? time) { widgetBuilder: (BuildContext context, CurrentRemainingTime? time) {
return buildCountdownTimer(time); return buildCountdownTimer(time);

@ -31,7 +31,7 @@ class MarathonProgressContainer extends StatelessWidget {
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8),
child: "${provider.currentQuestionNumber.toString()} / ${provider.marathonDetailModel.totalQuestions.toString()} ${LocaleKeys.question.tr()}".toText12(color: MyColors.white), child: "${provider.currentQuestionNumber.toString()} / ${provider.marathonDetailModel.totalQuestions.toString()} ${LocaleKeys.question.tr()}".toText12(color: MyColors.white),
), ),
"${provider.totalMarathoners} ${LocaleKeys.marathoners.tr()}".toText14(), "${provider.totalMarathoners} ${provider.totalMarathoners == 1 ? LocaleKeys.marathoner.tr() : LocaleKeys.marathoners.tr()}".toText14(),
provider.questionCardStatus == QuestionCardStatus.question provider.questionCardStatus == QuestionCardStatus.question
? "00:${(provider.totalCurrentQuestionTime - provider.currentGapTime) < 10 ? "0${provider.totalCurrentQuestionTime - provider.currentGapTime}" : provider.totalCurrentQuestionTime - provider.currentGapTime}" ? "00:${(provider.totalCurrentQuestionTime - provider.currentGapTime) < 10 ? "0${provider.totalCurrentQuestionTime - provider.currentGapTime}" : provider.totalCurrentQuestionTime - provider.currentGapTime}"
.toText18(color: provider.totalCurrentQuestionTime - provider.currentGapTime < 5 ? MyColors.redColor : MyColors.black) .toText18(color: provider.totalCurrentQuestionTime - provider.currentGapTime < 5 ? MyColors.redColor : MyColors.black)
@ -46,9 +46,7 @@ class MarathonProgressContainer extends StatelessWidget {
children: <Widget>[ children: <Widget>[
"${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / provider.marathonDetailModel.totalQuestions!) * 100).toInt()}% ${LocaleKeys.completed.tr()}" "${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / provider.marathonDetailModel.totalQuestions!) * 100).toInt()}% ${LocaleKeys.completed.tr()}"
.toText14(), .toText14(),
provider.isUserOutOfGame provider.isUserOutOfGame ? LocaleKeys.youAreOutOfContest.tr().toText14(color: MyColors.redColor) : const SizedBox(),
? LocaleKeys.youAreOutOfContest.tr().toText14(color: MyColors.redColor)
: const SizedBox(),
], ],
), ),
], ],
@ -97,21 +95,28 @@ class MarathonProgressContainer extends StatelessWidget {
Widget roundContainer(Color color, bool isNeedLeftBorder) { Widget roundContainer(Color color, bool isNeedLeftBorder) {
if (isNeedLeftBorder) { if (isNeedLeftBorder) {
return Row( return Row(
children: [ children: <Widget>[
Divider(thickness: 6, color: color).expanded, Divider(
thickness: 6,
color: color,
).expanded,
Container( Container(
margin: EdgeInsets.zero,
padding: EdgeInsets.zero,
width: 10, width: 10,
height: 10, height: 10,
decoration: BoxDecoration(shape: BoxShape.circle, color: color), decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)),
), ),
], ],
).expanded; ).expanded;
} }
return Container( return Container(
margin: EdgeInsets.zero,
padding: EdgeInsets.zero,
width: 10, width: 10,
height: 10, height: 10,
decoration: BoxDecoration(shape: BoxShape.circle, color: color), decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)),
); );
} }
} }

@ -57,7 +57,7 @@ class _QualifiersContainerState extends State<QualifiersContainer> {
children: <Widget>[ children: <Widget>[
widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(), widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(),
2.width, 2.width,
LocaleKeys.qualifiers.tr().toText16(color: MyColors.greenColor), (widget.provider.totalQualifiers == 1 ? LocaleKeys.qualifier.tr() : LocaleKeys.qualifiers.tr()).toText16(color: MyColors.greenColor),
], ],
), ),
], ],

@ -136,7 +136,6 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
@override @override
void dispose() { void dispose() {
print("// TODO: implement dispose");
super.dispose(); super.dispose();
provider.chatUsersList = []; provider.chatUsersList = [];
provider.pageNo = 1; provider.pageNo = 1;

Loading…
Cancel
Save