summaryrefslogtreecommitdiff
path: root/Juick/ViewModels/PageViewModel.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Juick/ViewModels/PageViewModel.cs')
-rw-r--r--Juick/ViewModels/PageViewModel.cs111
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));
+ }
+ }
+}