diff options
author | Vitaly Takmazov | 2013-04-01 13:34:49 +0400 |
---|---|---|
committer | Vitaly Takmazov | 2013-04-01 13:34:49 +0400 |
commit | fb1fab2e1593ba13fae8eae519f5482525eb68a1 (patch) | |
tree | f3557b2e8991ec53fde46d05346fab2bd8fce37e /Juick/ViewModels/PageViewModel.cs | |
parent | 57550f203995b61d600fae59832e409fd5feebcd (diff) |
AppViewModel
Diffstat (limited to 'Juick/ViewModels/PageViewModel.cs')
-rw-r--r-- | Juick/ViewModels/PageViewModel.cs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/Juick/ViewModels/PageViewModel.cs b/Juick/ViewModels/PageViewModel.cs new file mode 100644 index 0000000..9b9cae5 --- /dev/null +++ b/Juick/ViewModels/PageViewModel.cs @@ -0,0 +1,111 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Net; +using System.Windows; +using System.Windows.Media.Imaging; +using Juick.Classes; +using JuickApi; +using RestSharp; +using System.Diagnostics; +using System.Windows.Navigation; +using Microsoft.Phone.Controls; +using System.Windows.Controls; + +namespace Juick.ViewModels +{ + public class PageViewModel : ViewModelBase + { + public PageViewModel(AppViewModel context) + { + this.context = context; + Items = new ObservableCollection<PostItem>(); + LoadMessagesPageCommand = new DelegateCommand(LoadData, () => !context.IsDataLoading); + NavigateNextCommand = new DelegateCommand(NavigateToThread, () => true); + } + + private AppViewModel context; + + public string RestUri { get; set; } + public virtual string Caption { get { return "juick"; } } + + /// <summary> + /// A collection for MessageViewModel objects. + /// </summary> + public ObservableCollection<PostItem> Items { get; private set; } + + public DelegateCommand LoadMessagesPageCommand { get; private set; } + + public DelegateCommand NavigateNextCommand { get; private set; } + + public void NavigateToThread(object param) + { + var selectionChangedEventArgs = param as SelectionChangedEventArgs; + if (param != null) + { + ((App)App.Current).NavigateTo(new Uri(string.Format("/ThreadView.xaml?mid={0}", ((PostItem)selectionChangedEventArgs.AddedItems[0]).MID), UriKind.Relative)); + } + + } + + /// <summary> + /// Creates and adds a few MessageViewModel objects into the Items collection. + /// </summary> + public void LoadData(object EventArgs) + { + const int offset = 5; + if (context.IsDataLoading) + { + return; + } + if (EventArgs != null) + { + var item = (EventArgs as LinkUnlinkEventArgs).ContentPresenter.Content; + if (!item.Equals(Items[Items.Count - offset])) { + return; + } + } + + int count = Items.Count; + + + if (string.IsNullOrEmpty(RestUri)) + { + RestUri = "/home?1=1"; + } + + // super-костыли + // todo: rewrite + else if (RestUri.StartsWith("/home?", StringComparison.InvariantCulture) && Items.Count > 0) + { + var lastItem = Items[Items.Count - 1]; + RestUri = string.Format("/home?before_mid={0}", lastItem.MID); + } + else if (RestUri.StartsWith("/messages?", StringComparison.InvariantCulture) && Items.Count > 0) + { + var lastItem = Items[Items.Count - 1]; + RestUri = string.Format("/messages?before_mid={0}", lastItem.MID); + } + + var request = new RestRequest(RestUri + "&rnd=" + Environment.TickCount); + context.Client.Authenticator = new HttpBasicAuthenticator(context.Account.Credentials.UserName, context.Account.Credentials.Password); + context.Client.ExecuteAsync<List<Message>>(request, ProcessResponse); + context.IsDataLoading = true; + } + + void ProcessResponse(IRestResponse<List<Message>> response) + { + context.IsDataLoading = false; + if (response.StatusCode != HttpStatusCode.OK) + { + MessageBox.Show(response.StatusCode.ToString()); + return; + } + + //Items.Clear(); + response.Data.Select(x => new PostItem(x)).ToList().ForEach(i => Items.Add(i)); + } + } +} |