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; 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); } 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 bool IsDataLoading { get { return isDataLoading; } set { isDataLoading = value; NotifyPropertyChanged(IsDataLoadingPropertyName); LoadMessagesPageCommand.NotifyCanExecuteChanged(); } } /// /// Creates and adds a few MessageViewModel objects into the Items collection. /// public void LoadData() { if (IsDataLoading) { return; } const int PageSize = 1; 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}&page={1}", lastItem.MID, PageSize); } else if (RestUri.StartsWith("/messages?", StringComparison.InvariantCulture) && Items.Count > 0) { var lastItem = Items[Items.Count - 1]; RestUri = string.Format("/messages?before_mid={0}&page={1}", lastItem.MID, PageSize); } 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)); } } } }