diff --git a/assets/images/wrong_answer.gif b/assets/images/wrong_answer.gif
new file mode 100644
index 0000000..44f1d38
Binary files /dev/null and b/assets/images/wrong_answer.gif differ
diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json
index 1c5851a..59c0814 100644
--- a/assets/langs/ar-SA.json
+++ b/assets/langs/ar-SA.json
@@ -500,5 +500,9 @@
"codeExpire": "انتهت صلاحية رمز التحقق",
"typeheretoreply": "اكتب هنا للرد",
"favorite": "مفضلتي",
- "searchfromchat": "البحث من الدردشة"
+ "searchfromchat": "البحث من الدردشة",
+ "yourAnswerCorrect": "إجابتك صحيحة",
+ "youMissedTheQuestion": "فاتك !! أنت خارج اللعبة. لكن يمكنك المتابعة.",
+ "wrongAnswer": "إجابة خاطئة! أنت خارج اللعبة. لكن يمكنك المتابعة."
+
}
\ No newline at end of file
diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json
index b4b06f0..b0ab50e 100644
--- a/assets/langs/en-US.json
+++ b/assets/langs/en-US.json
@@ -500,6 +500,9 @@
"allQuestionsCorrect": "You have answered all questions correct",
"typeheretoreply": "Type here to reply",
"favorite" : "My Favorites",
- "searchfromchat": "Search from chat"
+ "searchfromchat": "Search from chat",
+ "yourAnswerCorrect": "Your answer is correct",
+ "youMissedTheQuestion": "You Missed !! You are out of the game. But you can follow up.",
+ "wrongAnswer": "Wrong Answer! You are out of the game. But you can follow up."
}
\ No newline at end of file
diff --git a/ios/.gitignore b/ios/.gitignore
index 151026b..d032e39 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -31,3 +31,8 @@ Runner/GeneratedPluginRegistrant.*
!default.mode2v3
!default.pbxuser
!default.perspectivev3
+
+ios/Podfile
+ios/Runner/Runner.entitlements
+
+
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
new file mode 100644
index 0000000..304aa00
--- /dev/null
+++ b/ios/Runner/Runner.entitlements
@@ -0,0 +1,30 @@
+
+
+
+
+ aps-environment
+ development
+ com.apple.developer.icloud-container-identifiers
+
+ iCloud.com.cloudsolutions.mohemm
+
+ com.apple.developer.icloud-services
+
+ CloudDocuments
+
+ com.apple.developer.networking.HotspotConfiguration
+
+ com.apple.developer.networking.networkextension
+
+ com.apple.developer.networking.wifi-info
+
+ com.apple.developer.nfc.readersession.formats
+
+ TAG
+
+ com.apple.developer.ubiquity-container-identifiers
+
+ iCloud.com.cloudsolutions.mohemm
+
+
+
diff --git a/lib/api/marathon/marathon_api_client.dart b/lib/api/marathon/marathon_api_client.dart
new file mode 100644
index 0000000..1ec117d
--- /dev/null
+++ b/lib/api/marathon/marathon_api_client.dart
@@ -0,0 +1,178 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:http/http.dart';
+import 'package:logger/logger.dart' as L;
+import 'package:logging/logging.dart';
+import 'package:mohem_flutter_app/api/api_client.dart';
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/consts.dart';
+import 'package:mohem_flutter_app/models/marathon/marathon_generic_model.dart';
+import 'package:mohem_flutter_app/models/marathon/marathon_model.dart';
+import 'package:mohem_flutter_app/models/marathon/question_model.dart';
+import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
+import 'package:provider/provider.dart';
+import 'package:signalr_netcore/http_connection_options.dart';
+import 'package:signalr_netcore/hub_connection.dart';
+import 'package:signalr_netcore/hub_connection_builder.dart';
+
+class MarathonApiClient {
+ Future getMarathonToken() async {
+ String employeeUserName = AppState().getUserName ?? "";
+ String employeeSession = AppState().postParamsObject?.pSessionId.toString() ?? "";
+
+ Map jsonObject = {"userName": employeeUserName, "password": employeeSession};
+ Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonParticipantLoginUrl, jsonObject);
+
+ var json = jsonDecode(response.body);
+
+ MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
+
+ if (marathonModel.statusCode == 200) {
+ if (marathonModel.data != null && marathonModel.isSuccessful == true) {
+ AppState().setMarathonToken = marathonModel.data["token"] ?? "";
+ print("bearer: ${AppState().getMarathonToken}");
+ return marathonModel.data["token"] ?? "";
+ } else {
+ //TODO : DO ERROR HANDLING HERE
+ return "";
+ }
+ } else {
+ //TODO : DO ERROR HANDLING HERE
+ return "";
+ }
+ }
+
+ Future getProjectId() async {
+ Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonProjectGetUrl, {}, token: AppState().getMarathonToken ?? await getMarathonToken());
+
+ var json = jsonDecode(response.body);
+ MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
+
+ if (marathonModel.statusCode == 200) {
+ if (marathonModel.data != null && marathonModel.isSuccessful == true) {
+ logger.i("message: ${marathonModel.data[0]["id"]}");
+ AppState().setMarathonProjectId = marathonModel.data[0]["id"] ?? "";
+ return marathonModel.data[0]["id"] ?? "";
+ } else {
+ //TODO : DO ERROR HANDLING HERE
+ return "";
+ }
+ } else {
+ //TODO : DO ERROR HANDLING HERE
+ return "";
+ }
+ }
+
+ Future getMarathonDetails() async {
+ String payrollString = AppState().postParamsObject?.payrollCodeStr.toString() ?? "CS";
+
+ Response response = await ApiClient().getJsonForResponse(ApiConsts.marathonUpcomingUrl + payrollString, token: AppState().getMarathonToken ?? await getMarathonToken());
+
+ var json = jsonDecode(response.body);
+
+ MarathonGenericModel marathonGenericModel = MarathonGenericModel.fromJson(json);
+
+ MarathonDetailModel marathonDetailModel = MarathonDetailModel.fromJson(marathonGenericModel.data);
+
+ AppState().setMarathonProjectId = marathonDetailModel.id!;
+
+ return marathonDetailModel;
+ }
+
+ late HubConnection hubConnection;
+ L.Logger logger = L.Logger();
+
+ Future buildHubConnection(BuildContext context) async {
+ HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
+ hubConnection = HubConnectionBuilder()
+ .withUrl(
+ ApiConsts.marathonHubConnectionUrl + "?employeeNumber=${AppState().memberInformationList!.eMPLOYEENUMBER ?? ""}&employeeName=${AppState().memberInformationList!.eMPLOYEENAME ?? ""}",
+ options: httpOptions,
+ )
+ .withAutomaticReconnect(
+ retryDelays: [2000, 5000, 10000, 20000],
+ )
+ .configureLogging(
+ Logger("Logging"),
+ )
+ .build();
+ hubConnection.onclose(
+ ({Exception? error}) {
+ logger.i("onclose");
+ },
+ );
+ hubConnection.onreconnecting(
+ ({Exception? error}) {
+ logger.i("onreconnecting");
+ },
+ );
+ hubConnection.onreconnected(
+ ({String? connectionId}) {
+ logger.i("onreconnected");
+ },
+ );
+ if (hubConnection.state != HubConnectionState.Connected) {
+ await hubConnection.start();
+ logger.i("Started HubConnection");
+
+ await hubConnection.invoke(
+ "AddParticipant",
+ args: