/// <summary> /// LoadConversationToStack Loads the users conversation /// </summary> /// <param name="Stack"> the parent stack</param> /// <param name="RecepientID"> the ID of the receiver</param> public static async Task LoadConversationToStack(StackLayout Stack, int RecepientID, bool IsLocalLoaded, Grid ChatControlGrid, int LastID = 0) { int LastMessageID = LastID; JObject ConversationDecodedJson = new JObject(); String ConversationResponseJson = ""; //if false, then local db is empty else info is loaded from local db if (!IsLocalLoaded) { Device.BeginInvokeOnMainThread(delegate { Stack.Children.Clear(); }); System.Diagnostics.Debug.WriteLine("IN IF, Old Last Server " + LastServerChatId); ConversationResponseJson = await ChatModel.Chat(Utilities.PostDataEncoder(new Dictionary <int, string[]> { { 0, new String[] { "sender", Utilities.ID.ToString() } }, { 1, new String[] { "receiver", RecepientID.ToString() } }, }), "chat/conversations"); ConversationDecodedJson = JObject.Parse(ConversationResponseJson); LastMessageID = (int)ConversationDecodedJson["conversations"].Last["id"]; var LastMessageDate = DateTime.Parse(ConversationDecodedJson["conversations"].Last["time"].ToString()); if ((DateTime.Now.Day - LastMessageDate.Day) >= 7)///one week since last chat disabled messaging { Device.BeginInvokeOnMainThread(delegate { ChatControlGrid.IsVisible = false; }); } await Utilities.RunTask(async delegate { foreach (var conversation in ConversationDecodedJson["conversations"]) { await ChatHandler.InsertMessage(conversation["message"].ToString(), conversation["time"].ToString(), (bool)conversation["sent"], RecepientID, MessageType.Text, true, (int)conversation["id"], Utilities.ID.ToString() + "-" + RecepientID); if (conversation["message"].ToString() == "{Appointment Accepted, Default Message}") { var ChildStack = new Grid { HorizontalOptions = LayoutOptions.FillAndExpand, Padding = new Thickness(10, 2, 10, 2) }; ChildStack.Children.Add(new Label { Text = conversation["message"].ToString().Replace(", Default Message", "").Replace("{", "").Replace("}", ""), BackgroundColor = (Color)App.Current.Resources["_MedAppBlack"], TextColor = Color.White, HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center, HeightRequest = 30, HorizontalOptions = LayoutOptions.FillAndExpand }); Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(ChildStack); ControlTagger <String> .SetTag(Stack, conversation["id"].ToString()); }); } else { DateTime MessageTime = DateTime.Parse(conversation["time"].ToString()); String MessageTimeString = ""; if (MessageTime.Day != DateTime.Now.Day && MessageTime.Month == DateTime.Now.Month) { MessageTimeString = MessageTime.ToString(""); } Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(SingleMessageTemplate.CreateMessage01((Convert.ToBoolean(conversation["sent"]) ? 1 : 0), conversation["message"].ToString(), Utilities.GetValidatedTime(MessageTime, ChatSectionType.Chat))); ControlTagger <String> .SetTag(Stack, conversation["id"].ToString()); }); } } }); } ///Update chat in Background while (ListenForNewConversation) { ConversationResponseJson = await ChatModel.Chat(Utilities.PostDataEncoder(new Dictionary <int, string[]> { { 0, new String[] { "sender", Utilities.ID.ToString() } }, { 1, new String[] { "receiver", RecepientID.ToString() } }, }), "chat/conversations"); ConversationDecodedJson = JObject.Parse(ConversationResponseJson); if (LastMessageID < (int)ConversationDecodedJson["conversations"].Last["id"]) { await Utilities.RunTask(async delegate { foreach (var conversation in ConversationDecodedJson["conversations"]) { if ((int)conversation["id"] > LastMessageID) { LastServerChatId = (int)conversation["id"]; ///save updates locally await ChatHandler.InsertMessage(conversation["message"].ToString(), conversation["time"].ToString(), (bool)conversation["sent"], RecepientID, MessageType.Text, true, (int)conversation["id"], Utilities.ID + "-" + RecepientID); if (conversation["message"].ToString() == "{Appointment Accepted, Default Message}") { var ChildStack = new Grid { HorizontalOptions = LayoutOptions.FillAndExpand, Padding = new Thickness(10, 2, 10, 2) }; ChildStack.Children.Add(new Label { Text = conversation["message"].ToString().Replace(", Default Message", "").Replace("{", "").Replace("}", ""), BackgroundColor = (Color)App.Current.Resources["_MedAppBlack"], TextColor = Color.White, HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center, HeightRequest = 30, HorizontalOptions = LayoutOptions.FillAndExpand }); Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(ChildStack); ControlTagger <int> .SetTag(Stack, (int)conversation["id"]); }); } else { DateTime MessageTime = DateTime.Parse(conversation["time"].ToString()); String MessageTimeString = ""; if (MessageTime.Day != DateTime.Now.Day && MessageTime.Month == DateTime.Now.Month) { MessageTimeString = MessageTime.ToString(""); } Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(SingleMessageTemplate.CreateMessage01((Convert.ToBoolean(conversation["sent"]) ? 1 : 0), conversation["message"].ToString(), Utilities.GetValidatedTime(MessageTime, ChatSectionType.Chat))); ControlTagger <int> .SetTag(Stack, (int)conversation["id"]); }); } } } }); LastMessageID = (int)ConversationDecodedJson["conversations"].Last["id"]; } } }
/// /// Local Database Controllers /// /// <summary> /// /// </summary> /// <param name="Stack"></param> /// <param name="RecepientID"></param> /// <returns></returns> public static async Task <Dictionary <String, String> > LocalConversationToStack(StackLayout Stack, int RecepientID) { Device.BeginInvokeOnMainThread(delegate { Stack.Children.Clear(); }); Dictionary <String, String> ReturnedResult = new Dictionary <string, string>(); int LastServerChatID = 0; bool MadeChanges = false; var Result = await ChatHandler.GetConversation(RecepientID); if (Result.Count > 0) { await Utilities.RunTask(delegate { foreach (KeyValuePair <int, List <Object> > Pair in Result) { LastServerChatID = (int)Pair.Value[6]; if (Pair.Value[0].ToString() == "{Appointment Accepted, Default Message}") { var ChildStack = new Grid { HorizontalOptions = LayoutOptions.FillAndExpand, Padding = new Thickness(10, 2, 10, 2) }; ChildStack.Children.Add(new Label { Text = Pair.Value[0].ToString().Replace(", Default Message", "").Replace("{", "").Replace("}", ""), BackgroundColor = (Color)App.Current.Resources["_MedAppBlack"], TextColor = Color.White, HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center, HeightRequest = 30, HorizontalOptions = LayoutOptions.FillAndExpand }); Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(ChildStack); }); } else { DateTime MessageTime = DateTime.Parse(Pair.Value[1].ToString()); String MessageTimeString = ""; if (MessageTime.Day != DateTime.Now.Day && MessageTime.Month == DateTime.Now.Month) { MessageTimeString = MessageTime.ToString(""); } Device.BeginInvokeOnMainThread(() => { Stack.Children.Add(SingleMessageTemplate.CreateMessage01((Convert.ToBoolean(Pair.Value[4]) ? 1 : 0), Pair.Value[0].ToString(), Utilities.GetValidatedTime(MessageTime, ChatSectionType.Chat))); ControlTagger <String> .SetTag(Stack, Pair.Key.ToString()); }); } } System.Diagnostics.Debug.WriteLine("Done With Local"); System.Diagnostics.Debug.WriteLine("Last Local ID " + LastServerChatID); }); MadeChanges = true; } ReturnedResult.Add("MadeChanges", MadeChanges.ToString()); ReturnedResult.Add("LastID", LastServerChatID.ToString()); return(ReturnedResult); }