185 lines
7.3 KiB
C#
185 lines
7.3 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.AspNetCore.Components.Web.Virtualization;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Neighbourhood.omg.lol.Models {
|
|
public class State {
|
|
|
|
public Page CurrentPage { get; set; }
|
|
public AccountResponseData? AccountInfo { get; set; }
|
|
public AddressResponseList? AddressList { get; set; }
|
|
|
|
public string? Name { get => AccountInfo?.Name; }
|
|
public string? Email { get => AccountInfo?.Email; }
|
|
public IEnumerable<string>? AddressNames { get => AddressList?.Select(a => a.Address); }
|
|
public AddressResponseData? SelectedAddress { get; set; }
|
|
public string? SelectedAddressName { get => SelectedAddress?.Address; }
|
|
|
|
public List<Status>? Statuses { get; set; }
|
|
public List<Pic>? Pics { get; set; }
|
|
public List<NowData>? NowGarden { get; set; }
|
|
public List<MarkupString>? EphemeralMessages { get; set; }
|
|
|
|
public List<Status>? CachedAddressStatuses { get; set; }
|
|
public List<Pic>? CachedAddressPics { get; set; }
|
|
public MarkupString? CachedAddressBio { get; set; }
|
|
private string? _cachedAddress;
|
|
public string? CachedAddress {
|
|
get => _cachedAddress;
|
|
set {
|
|
if (_cachedAddress != value) {
|
|
_cachedAddress = value;
|
|
CachedAddressStatuses = new List<Status>();
|
|
CachedAddressPics = new List<Pic>();
|
|
CachedAddressBio = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public async Task PopulateAccountDetails(string token) {
|
|
RestService api = new RestService(token);
|
|
|
|
string accountJson = Preferences.Default.Get("accountdetails", string.Empty);
|
|
string addressJson = Preferences.Default.Get("accountaddresses", string.Empty);
|
|
string selectedAddressJson = Preferences.Default.Get("selectedaddress", string.Empty);
|
|
|
|
if (!string.IsNullOrEmpty(accountJson)) AccountInfo = JsonSerializer.Deserialize<AccountResponseData>(accountJson);
|
|
if (!string.IsNullOrEmpty(addressJson)) AddressList = JsonSerializer.Deserialize<AddressResponseList>(addressJson);
|
|
if (!string.IsNullOrEmpty(selectedAddressJson)) SelectedAddress = JsonSerializer.Deserialize<AddressResponseData>(selectedAddressJson);
|
|
|
|
// if we haven't got account info, attempt to retrieve it.
|
|
if (AccountInfo == null) {
|
|
AccountInfo = await api.AccountInfo();
|
|
if (AccountInfo != null) {
|
|
Preferences.Default.Set("accountdetails", JsonSerializer.Serialize(AccountInfo));
|
|
}
|
|
}
|
|
|
|
// if we don't have the list of addresses, attempt to retrieve that.
|
|
if (AddressList == null) {
|
|
AddressList = await api.Addresses();
|
|
if (AddressList != null) {
|
|
Preferences.Default.Set("accountaddresses", JsonSerializer.Serialize(AddressList));
|
|
SelectedAddress = AddressList.FirstOrDefault();
|
|
Preferences.Default.Set("selectedaddress", JsonSerializer.Serialize(SelectedAddress));
|
|
}
|
|
}
|
|
}
|
|
|
|
public async Task RemoveAccountDetails() {
|
|
Preferences.Default.Clear();
|
|
AccountInfo = null;
|
|
AddressList = null;
|
|
SelectedAddress = null;
|
|
}
|
|
|
|
public async Task<MarkupString?> GetBio(string address, bool forceRefresh = false) {
|
|
CachedAddress = address;
|
|
if (forceRefresh || CachedAddressBio == null) {
|
|
RestService api = new RestService();
|
|
CachedAddressBio = await api.StatuslogBio(address);
|
|
}
|
|
return CachedAddressBio;
|
|
}
|
|
|
|
public async Task<List<MarkupString>?> GetEphemeralMessages(bool forceRefresh = false) {
|
|
RestService api = new RestService();
|
|
if(forceRefresh || this.EphemeralMessages == null || this.EphemeralMessages.Count == 0) {
|
|
this.EphemeralMessages = await api.Ephemeral();
|
|
}
|
|
return this.EphemeralMessages;
|
|
}
|
|
|
|
public async Task<List<Status>?> GetStatuses(bool forceRefresh = false) {
|
|
RestService api = new RestService();
|
|
if (forceRefresh || this.Statuses == null || this.Statuses.Count == 0) {
|
|
this.Statuses = await api.StatuslogLatest();
|
|
}
|
|
return this.Statuses;
|
|
}
|
|
|
|
public async Task<List<Status>?> GetStatuses(string address, bool forceRefresh = false) {
|
|
this.CachedAddress = address;
|
|
RestService api = new RestService();
|
|
if (forceRefresh || this.CachedAddressStatuses == null || this.CachedAddressStatuses.Count == 0) {
|
|
this.CachedAddressStatuses = await api.Statuslog(address);
|
|
}
|
|
return this.CachedAddressStatuses;
|
|
}
|
|
|
|
public async Task<List<NowData>?> GetNowGarden(bool forceRefresh = false) {
|
|
RestService api = new RestService();
|
|
if (forceRefresh || this.NowGarden == null || this.NowGarden.Count == 0) {
|
|
this.NowGarden = await api.NowGarden();
|
|
}
|
|
return this.NowGarden;
|
|
}
|
|
|
|
public async Task<List<Pic>?> GetPics(bool forceRefresh = false) {
|
|
if(forceRefresh || this.Pics == null || this.Pics.Count == 0) {
|
|
RestService api = new RestService();
|
|
this.Pics = await api.SomePics();
|
|
}
|
|
return this.Pics;
|
|
}
|
|
|
|
public async Task<List<Pic>?> GetPics(string address, bool forceRefresh = false) {
|
|
CachedAddress = address;
|
|
if (forceRefresh || this.CachedAddressPics == null || this.CachedAddressPics.Count == 0) {
|
|
RestService api = new RestService();
|
|
CachedAddressPics = (await api.SomePics(address)) ?? new List<Pic>();
|
|
}
|
|
return CachedAddressPics;
|
|
}
|
|
|
|
public async Task<long> FileSize(FileResult file) {
|
|
using var fileStream = await file.OpenReadAsync();
|
|
return fileStream.Length;
|
|
}
|
|
|
|
public async Task<string> Base64FromFile(FileResult file) {
|
|
using var memoryStream = new MemoryStream();
|
|
using var fileStream = await file.OpenReadAsync();
|
|
await fileStream.CopyToAsync(memoryStream);
|
|
byte[] bytes = memoryStream.ToArray();
|
|
return Convert.ToBase64String(bytes);
|
|
}
|
|
|
|
public async Task RefreshStatuses() => await GetStatuses(forceRefresh: true);
|
|
public async Task RefreshPics() => await GetPics(forceRefresh: true);
|
|
public async Task RefreshNow() => await GetNowGarden(forceRefresh: true);
|
|
|
|
public static string RelativeTimeFromUnix(long unix) {
|
|
DateTimeOffset createdTime = DateTimeOffset.UnixEpoch.AddSeconds(unix);
|
|
TimeSpan offset = DateTimeOffset.UtcNow - createdTime;
|
|
|
|
var offsetString = string.Empty;
|
|
if (Math.Floor(offset.TotalDays) == 1) offsetString = $"{Math.Floor(offset.TotalDays)} day ago";
|
|
else if (offset.TotalDays > 1) offsetString = $"{Math.Floor(offset.TotalDays)} days ago";
|
|
else if (Math.Floor(offset.TotalHours) == 1) offsetString = $"{Math.Floor(offset.TotalHours)} hour ago";
|
|
else if (offset.TotalHours > 1) offsetString = $"{Math.Floor(offset.TotalHours)} hours ago";
|
|
else if (Math.Floor(offset.TotalMinutes) == 1) offsetString = $"{Math.Floor(offset.TotalMinutes)} minute ago";
|
|
else if (offset.TotalMinutes > 1) offsetString = $"{Math.Floor(offset.TotalMinutes)} minutes ago";
|
|
else if (Math.Floor(offset.TotalSeconds) == 1) offsetString = $"{Math.Floor(offset.TotalSeconds)} second ago";
|
|
else offsetString = $"{Math.Floor(offset.TotalSeconds)} seconds ago";
|
|
|
|
return offsetString;
|
|
}
|
|
}
|
|
|
|
public enum Page {
|
|
None = 0,
|
|
Status,
|
|
Pics,
|
|
Ephemeral,
|
|
NowGarden,
|
|
Other
|
|
}
|
|
}
|