/// <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); }
public static async Task LoadNotifications(Dictionary <int, List <Object> > NotificationData, StackLayout ParentStack) { //parent stack not empty, update existing views if different if (ParentStack.Children.Count > 0) { if (ParentStack.Children.Count == 1 && ParentStack.Children[0].GetType() == typeof(Label)) { ParentStack.Children.Clear(); } foreach (int Key in NotificationData.Keys) { bool MadeChanges = false; for (int i = 0; i < ParentStack.Children.Count; i++) { var Child = ParentStack.Children[i]; String[] ChildTag = ControlTagger <String> .GetTag(Child).Split('-'); if (ChildTag[0] == NotificationData[Key][3].ToString() && ChildTag[1] == NotificationData[Key][1].ToString()) { Device.BeginInvokeOnMainThread(delegate { ParentStack.Children.RemoveAt(i); var ChildStack = NotificationTemplate.Notification01("", NotificationData[Key][0].ToString(), Utilities.GetValidatedTime(DateTime.Parse(NotificationData[Key][1].ToString()), ChatSectionType.ChatList), (NotificationType)NotificationData[Key][2], (int)NotificationData[Key][3]); ControlTagger <String> .SetTag(ChildStack, NotificationData[Key][3].ToString() + "-" + NotificationData[Key][1].ToString()); ParentStack.Children.Add(Child); }); MadeChanges = true; break; } } if (!MadeChanges) { Device.BeginInvokeOnMainThread(delegate { var ChildStack = NotificationTemplate.Notification01("", NotificationData[Key][0].ToString(), Utilities.GetValidatedTime(DateTime.Parse(NotificationData[Key][1].ToString()), ChatSectionType.ChatList), (NotificationType)NotificationData[Key][2], (int)NotificationData[Key][3]); ControlTagger <String> .SetTag(ChildStack, NotificationData[Key][3].ToString() + "-" + NotificationData[Key][1].ToString()); ParentStack.Children.Add(ChildStack); }); } } } else { foreach (int Key in NotificationData.Keys) { Device.BeginInvokeOnMainThread(() => { var Child = NotificationTemplate.Notification01("", NotificationData[Key][0].ToString(), Utilities.GetValidatedTime(DateTime.Parse(NotificationData[Key][1].ToString()), ChatSectionType.ChatList), (NotificationType)NotificationData[Key][2], (int)NotificationData[Key][3]); ControlTagger <String> .SetTag(Child, NotificationData[Key][3].ToString() + "-" + NotificationData[Key][1].ToString()); ParentStack.Children.Add(Child); }); } } if (NotificationData.Count == 0 && ParentStack.Children.Count == 0) { Device.BeginInvokeOnMainThread(() => { ParentStack.Children.Add(new Label { Text = "No recent notifications.", Style = App.Current.Resources["_EmptyLabelTemplate"] as Style }); }); } }