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 ViewModelBase : INotifyPropertyChanged { static readonly string IsDataLoadingPropertyName = ExpressionHelper.GetPropertyName(x => x.IsDataLoading); bool isDataLoading; public ViewModelBase() { Items = new ObservableCollection(); LoadMessagesPageCommand = new DelegateCommand(LoadData, () => !IsDataLoading); NavigateNextCommand = new DelegateCommand(NavigateToThread, () => true); } public string RestUri { get; set; } public virtual string Caption { get { return "juick"; } } /// /// A collection for MessageViewModel objects. /// public ObservableCollection Items { get; private set; } public DelegateCommand LoadMessagesPageCommand { get; private set; } public DelegateCommand NavigateNextCommand { get; private set; } public bool IsDataLoading { get { return isDataLoading; } set { isDataLoading = value; NotifyPropertyChanged(IsDataLoadingPropertyName); LoadMessagesPageCommand.NotifyCanExecuteChanged(); } } 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)); } } /// /// Creates and adds a few MessageViewModel objects into the Items collection. /// public void LoadData(object EventArgs) { const int offset = 5; if (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); App.Client.Authenticator = new HttpBasicAuthenticator(App.Account.Credentials.UserName, App.Account.Credentials.Password); App.Client.ExecuteAsync>(request, ProcessResponse); IsDataLoading = true; } void ProcessResponse(IRestResponse> response) { 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)); } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }