/// <summary> /// ChatsListToStack loads all the users conversation onto the specified stacklayout from the local DB /// </summary> /// <param name="Stack"></param> /// <param name="Con"></param> public static async Task <bool> LocalChatsListToStack(StackLayout Stack, ContentPage Con) { Dictionary <int, String[]> ChatData = new Dictionary <int, string[]>(); Dictionary <int, List <Object> > ReceiversData = new Dictionary <int, List <Object> >(); //gather the last ConversationID to be used for sorting the data Dictionary <int, int> LastConversationID = new Dictionary <int, int>(); bool MadeChanges = false; ///for chatlist get all the people user has conversed with ///receiverlist gets the information of all the people the current user has conversed with var ReceiversList = await ReceiverHandler.GetReceiversInfo(); ///check if the current users chats is empty, if it is do not load into stack int MyChatCounter = await ChatHandler.MyChatCounter(); //System.Diagnostics.Debug.WriteLine("MyChatCounter " + MyChatCounter); if (ReceiversList.Count > 0 && MyChatCounter > 0) { System.Diagnostics.Debug.WriteLine(ReceiversList.Count); Device.BeginInvokeOnMainThread(() => { Stack.Children.Clear(); }); ///1) get all conversations for the chat list all stack int ccc = 0; try { foreach (KeyValuePair <int, List <object> > ReceiverInfo in ReceiversList) { //var LastMessageInfo = await ChatHandler.GetLastConversation((int)ReceiverInfo.Value[2]); int ID = (int)ReceiverInfo.Value[2]; ID = (Utilities.ID == ID) ? (int)ReceiverInfo.Value[4] : ID; //System.Diagnostics.Debug.WriteLine("Receiver INfo " + ReceiverInfo.Value.Count + "["+ Utilities.ID + "-" + ID +"]"); //System.Diagnostics.Debug.WriteLine("Receiver INfo Dets " + ReceiverInfo.Value[0] + ", " + ReceiverInfo.Value[1] + ", " + ReceiverInfo.Value[2] + ", " + ReceiverInfo.Value[3] + ", " + ReceiverInfo.Value[4] + " "); var LastMessageInfo = await ChatHandler.GetLastUniqueConversation(ID); ccc = LastMessageInfo.Count; if (ReceiversData.Count == 0 || (!ReceiversData.ContainsKey(ID))) { ReceiversData.Add(ID, LastMessageInfo); } ///add the last server chat id to a different dictionary for sorting //System.Diagnostics.Debug.WriteLine("Last MEssage INfo " + LastMessageInfo.Count); if (LastConversationID.Count == 0 || (!LastConversationID.ContainsKey(ID))) { LastConversationID.Add(ID, (int)LastMessageInfo[7]); } } } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Alert", "1st \n" + ex.Message + " : " + ccc, "Ok"); } System.Diagnostics.Debug.WriteLine("=========================="); ///2) sort conversations desc List <KeyValuePair <int, int> > SortedList = new List <KeyValuePair <int, int> >(); try { SortedList = new List <KeyValuePair <int, int> >(LastConversationID); SortedList.Sort(delegate(KeyValuePair <int, int> FirstPair, KeyValuePair <int, int> SecondPair) { return(FirstPair.Value.CompareTo(SecondPair.Value)); }); } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Alert", "2nd \n" + ex.Message, "Ok"); } ///3) populate stack based on sortedlist try { foreach (KeyValuePair <int, int> Pair in SortedList) { int ReceiversID = (Utilities.ID == (int)ReceiversData[Pair.Key][4]) ? (int)ReceiversData[Pair.Key][6] : (int)ReceiversData[Pair.Key][4]; var MedicID = await ReceiverHandler.GetMedicID(ReceiversID); var ReceiverInfo = await ReceiverHandler.GetReceiverInfoById(ReceiversID); await Utilities.RunTask(delegate { StackLayout ChildStack; //{Appointment Accepted, Default Message} is the default sent message, create different view for it if (ReceiversData[Pair.Key][1].Equals("{Appointment Accepted, Default Message}")) { /// create notification to show the appointment has been accepted List <Object> ListForNotification = new List <object>(); ListForNotification.Add(ReceiversData[Pair.Key][1].ToString().Replace(", Default Message", "").Replace("{", "").Replace("}", "") + " - " + ReceiverInfo[0].ReceiverName); //index 0 message ListForNotification.Add(ReceiversData[Pair.Key][2]); //index 1 time ListForNotification.Add(NotificationType.Appointment); //index 2 notificationtype ListForNotification.Add(ReceiversID); // index 3 id NotificationPage.NotificationData.Add(NotificationPage.NotificationData.Count, ListForNotification); ReceiversData[Pair.Key][1] = ReceiversData[Pair.Key][1].ToString().Replace(", Default Message", "").Replace("{", "").Replace("}", ""); ChildStack = ListAllChatTemplate.CreateNewStackType01(ReceiverInfo[0].ReceiverName, "", ((bool)ReceiversData[Pair.Key][5]) ? "You: " + ReceiversData[Pair.Key][1].ToString() : ReceiversData[Pair.Key][1].ToString(), Utilities.GetValidatedTime(DateTime.Parse(ReceiversData[Pair.Key][2].ToString()), ChatSectionType.ChatList), Con, ReceiversID, 0, MedicID); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + Pair.Key + "-" + ReceiversData[Pair.Key][7] + "-0"); System.Diagnostics.Debug.WriteLine(Utilities.ID + "-" + Pair.Key + "-" + ReceiversData[Pair.Key][7] + "-0"); Device.BeginInvokeOnMainThread(delegate { Stack.Children.Add(ChildStack); }); } else { ChildStack = ListAllChatTemplate.CreateNewStackType01(ReceiverInfo[0].ReceiverName, "", ((bool)ReceiversData[Pair.Key][5]) ? "You: " + ReceiversData[Pair.Key][1].ToString() : ReceiversData[Pair.Key][1].ToString(), Utilities.GetValidatedTime(DateTime.Parse(ReceiversData[Pair.Key][2].ToString()), ChatSectionType.ChatList), Con, ReceiversID, 0, MedicID); System.Diagnostics.Debug.WriteLine(Utilities.ID + "-" + Pair.Key + "-" + ReceiversData[Pair.Key][7] + "-0"); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + Pair.Key + "-" + ReceiversData[Pair.Key][7] + "-0"); Device.BeginInvokeOnMainThread(delegate { Stack.Children.Add(ChildStack); }); } }); } } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Alert", "3rd \n" + ex.Message, "Ok"); } MadeChanges = true; } else { Device.BeginInvokeOnMainThread(() => { if (Stack.Children.Count == 0) { Stack.Children.Add(new Label { Text = (!Utilities.IsMedic) ? "Chats will appear after booking an appointment." : "Chats will appear after accepting an appointment.", Style = App.Current.Resources["_EmptyLabelTemplate"] as Style }); } }); } return(MadeChanges); }
/// <summary> /// ChatsListToStack loads all the users conversation onto the specified stacklayout /// </summary> /// <param name="Stack"></param> /// <param name="Con"></param> public static async Task ChatsListToStack(StackLayout Stack, ContentPage Con, bool IsLocalLoaded = false) { if (!IsLocalLoaded) { Device.BeginInvokeOnMainThread(() => { Stack.Children.Clear(); }); } do { System.Diagnostics.Debug.WriteLine("Stack Child COunt" + Stack.Children.Count); try { Dictionary <int, String[]> ChatData = new Dictionary <int, string[]>(); Dictionary <int, String[]> Data = new Dictionary <int, string[]> { { 0, new String[] { "sender", Utilities.ID.ToString() } }, }; String ChatListResponseJson = await ChatModel.Chat(Utilities.PostDataEncoder(Data), "chat/get-list"); var ChatListDecodedJson = JObject.Parse(ChatListResponseJson); foreach (var Contact in ChatListDecodedJson["contacts"]) { ChatData.Add((int)Contact["info"]["id"], new string[5]); // key = receivers id ChatData[(int)Contact["info"]["id"]][0] = Contact["info"]["name"].ToString(); //index 0 = name String ConversationResponseJson = await ChatModel.Chat(Utilities.PostDataEncoder(new Dictionary <int, string[]> { { 0, new String[] { "sender", Utilities.ID.ToString() } }, { 1, new String[] { "receiver", Contact["info"]["id"].ToString() } }, }), "chat/conversations"); //System.Diagnostics.Debug.WriteLine(ConversationResponseJson); var ConversationDecodedJson = JObject.Parse(ConversationResponseJson); //System.Diagnostics.Debug.WriteLine("JSON" + ConversationDecodedJson["conversations"].Last); //System.Diagnostics.Debug.WriteLine("JSON" + ConversationDecodedJson["conversations"].Last["message"]); if (ConversationDecodedJson["conversations"].Last["message"].ToString() == "{Appointment Accepted, Default Message}") { ChatData[(int)Contact["info"]["id"]][1] = ConversationDecodedJson["conversations"].Last["message"].ToString();//index 1 = message } else { ChatData[(int)Contact["info"]["id"]][1] = ((bool)ConversationDecodedJson["conversations"].Last["sent"] ? "You: " : ""); ChatData[(int)Contact["info"]["id"]][1] += ConversationDecodedJson["conversations"].Last["message"].ToString(); } //System.Diagnostics.Debug.WriteLine("DICT" + ChatData[(int)Contact["info"]["id"]][1]); ChatData[(int)Contact["info"]["id"]][2] = ConversationDecodedJson["conversations"].Last["time"].ToString(); // index 2 = date try { ChatData[(int)Contact["info"]["id"]][3] = Contact["info"]["medic_id"].ToString(); //index 3 = medic id } catch { ///exception thrown and caught as the current receiver doesnt have a medic id since he/she is a normal user(patient) ChatData[(int)Contact["info"]["id"]][3] = "0"; } //last conversation id, index 4 = id of the last message for the current convo on the online db ChatData[(int)Contact["info"]["id"]][4] = ConversationDecodedJson["conversations"].Last["id"].ToString(); ///if local receiver doesnt exist, add to local db int Result = await ReceiverHandler.CheckReceiver((int)Contact["info"]["id"]); if (Result == 0) { await ReceiverHandler.NewReceiver(ChatData[(int)Contact["info"]["id"]][0], (int)Contact["info"]["id"], "", Convert.ToInt32(ChatData[(int)Contact["info"]["id"]][3])); } } await Utilities.RunTask(delegate { if (ChatData.Count > 0) { foreach (int key in ChatData.Keys) { if (Stack.Children.Count >= 4) { continue; } System.Diagnostics.Debug.WriteLine(" Count " + ChatData.Count + " [0] " + ChatData[key][0] + " [1] " + ChatData[key][1] + " [2] " + ChatData[key][2] + " [3] " + ChatData[key][3] + " [4] " + ChatData[key][4]); Device.BeginInvokeOnMainThread(async() => { StackLayout ChildStack; if (Stack.Children.Count > 0 && Stack.Children[0].GetType() == typeof(Label)) { ///clear message stack if default 'no chat message is shown' Stack.Children.Clear(); } if (Stack.Children.Count > 0) { ///IsNewConversation is true by default, the value is changed if the conversation exists on the chat list stack bool IsNewConversation = true; for (int i = 0; i < Stack.Children.Count; i++) { var child = Stack.Children[i]; //if the child is already on stack, recreate that child if different values String[] ChildStackTag = ControlTagger <String> .GetTag(child).Split('-'); ///receiver exists in stack if (key == Convert.ToInt32(ChildStackTag[1])) { System.Diagnostics.Debug.WriteLine("Is Old Convo :- False"); int NewMessageCount = await GetCountOfNewMessages(key, Convert.ToInt32(ChildStackTag[2])); System.Diagnostics.Debug.WriteLine("Child in Stack With Tag [" + ChildStackTag[0] + "-" + ChildStackTag[1] + "-" + ChildStackTag[2] + "-" + ChildStackTag[3] + "] Tag [" + Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + NewMessageCount + "] Last Server ID " + Convert.ToInt32(ChatData[key][4])); //receiver if ((Convert.ToInt32(ChildStackTag[2]) < Convert.ToInt32(ChatData[key][4]))) { /// create notification to show mew message List <Object> ListForNotification = new List <object>(); if (ChatData[key][1].Equals("{Appointment Accepted, Default Message}")) { ListForNotification.Add(ChatData[key][1].Replace(", Default Message", "").Replace("{", "").Replace("}", ""));//index 0 message } else { //ListForNotification.Add(ChatData[key][1]);//index 0 message ListForNotification.Add("" + NewMessageCount + " new messages from " + ChatData[key][0]);//index 0 message } ListForNotification.Add(ChatData[key][2]); //index 1 time ListForNotification.Add(NotificationType.Chat); //index 2 notificationtype ListForNotification.Add(key); // index 3 id NotificationPage.NotificationData.Add(NotificationPage.NotificationData.Count, ListForNotification); Stack.Children.RemoveAt(i); ChildStack = ListAllChatTemplate.CreateNewStackType01(ChatData[key][0], "", ChatData[key][1], Utilities.GetValidatedTime(DateTime.Parse(ChatData[key][2]), ChatSectionType.ChatList), Con, key, NewMessageCount, Convert.ToInt32(ChatData[key][3])); //ChildStack = new StackLayout { BackgroundColor = Color.Tomato }; ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + NewMessageCount); //Stack.Children.Add(ChildStack); Stack.Children.Insert(0, ChildStack); } ///IsNewConversation is false as the current key exists in the chat list stack IsNewConversation = false; } } System.Diagnostics.Debug.WriteLine("Done, Status :- " + IsNewConversation); ///If IsNewConversation is true, this key is a new conversaton, create new childstack if (IsNewConversation) { ///{Appointment Accepted, Default Message} is the default sent message, create different view for it if (ChatData[key][1].Equals("{Appointment Accepted, Default Message}")) { ChatData[key][1] = ChatData[key][1].Replace(", Default Message", "").Replace("{", "").Replace("}", ""); ChildStack = ListAllChatTemplate.CreateNewStackType01(ChatData[key][0], "", ChatData[key][1], Utilities.GetValidatedTime(DateTime.Parse(ChatData[key][2]), ChatSectionType.ChatList), Con, key, 0, Convert.ToInt32(ChatData[key][3])); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + 0); Stack.Children.Insert(Stack.Children.Count, ChildStack); } else { ChildStack = ListAllChatTemplate.CreateNewStackType01(ChatData[key][0], "", ChatData[key][1], Utilities.GetValidatedTime(DateTime.Parse(ChatData[key][2]), ChatSectionType.ChatList), Con, key, 0, Convert.ToInt32(ChatData[key][3])); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + 0); Stack.Children.Insert(Stack.Children.Count, ChildStack); } } } else { ///{Appointment Accepted, Default Message} is the default sent message, create different view for it if (ChatData[key][1].Equals("{Appointment Accepted, Default Message}")) { /// create notification to show the appointment has been accepted List <Object> ListForNotification = new List <object>(); ListForNotification.Add(ChatData[key][1].Replace(", Default Message", "").Replace("{", "").Replace("}", "")); //index 0 message ListForNotification.Add(ChatData[key][2]); //index 1 time ListForNotification.Add(NotificationType.Appointment); //index 2 notificationtype ListForNotification.Add(key); // index 3 id NotificationPage.NotificationData.Add(NotificationPage.NotificationData.Count, ListForNotification); System.Diagnostics.Debug.WriteLine("Adding"); ChatData[key][1] = ChatData[key][1].Replace(", Default Message", "").Replace("{", "").Replace("}", ""); ChildStack = ListAllChatTemplate.CreateNewStackType01(ChatData[key][0], "", ChatData[key][1], Utilities.GetValidatedTime(DateTime.Parse(ChatData[key][2]), ChatSectionType.ChatList), Con, key, 0, Convert.ToInt32(ChatData[key][3])); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + 0); Stack.Children.Insert(Stack.Children.Count, ChildStack); } else { ChildStack = ListAllChatTemplate.CreateNewStackType01(ChatData[key][0], "", ChatData[key][1], Utilities.GetValidatedTime(DateTime.Parse(ChatData[key][2]), ChatSectionType.ChatList), Con, key, 0, Convert.ToInt32(ChatData[key][3])); ControlTagger <String> .SetTag(ChildStack, Utilities.ID + "-" + key + "-" + ChatData[key][4] + "-" + 0); Stack.Children.Insert(Stack.Children.Count, ChildStack); } } }); } } else { Device.BeginInvokeOnMainThread(() => { if (Stack.Children.Count == 0) { Stack.Children.Add(new Label { Text = (!Utilities.IsMedic) ? "Chats will appear after booking an appointment." : "Chats will appear after accepting an appointment.", Style = App.Current.Resources["_EmptyLabelTemplate"] as Style }); } }); } }); } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Alert", ex.StackTrace, "Ok"); } } while (ListenForChatListUpdate); }