Pixiview/Gallery/AppShell.xaml.cs

188 lines
6.1 KiB
C#

using System;
using System.Threading.Tasks;
using Gallery.Login;
using Gallery.Resources;
using Gallery.UI;
using Gallery.Utils;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace Gallery
{
public partial class AppShell : Shell
{
public static new AppShell Current => Shell.Current as AppShell;
public static Thickness NavigationBarOffset { get; private set; }
public static Thickness HalfNavigationBarOffset { get; private set; }
public static Thickness TotalBarOffset { get; private set; }
public static readonly BindableProperty UserProfileImageProperty = BindableProperty.Create(
nameof(UserProfileImage), typeof(ImageSource), typeof(AppShell), StyleDefinition.ProfileNone);
public static readonly BindableProperty UserProfileNameProperty = BindableProperty.Create(
nameof(UserProfileName), typeof(string), typeof(AppShell), ResourceHelper.Guest);
public static readonly BindableProperty UserProfileIdProperty = BindableProperty.Create(
nameof(UserProfileId), typeof(string), typeof(AppShell));
public static readonly BindableProperty IsLoadingProperty = BindableProperty.Create(
nameof(IsLoading), typeof(bool), typeof(AppShell));
public ImageSource UserProfileImage
{
get => (ImageSource)GetValue(UserProfileImageProperty);
set => SetValue(UserProfileImageProperty, value);
}
public string UserProfileName
{
get => (string)GetValue(UserProfileNameProperty);
set => SetValue(UserProfileNameProperty, value);
}
public string UserProfileId
{
get => (string)GetValue(UserProfileIdProperty);
set => SetValue(UserProfileIdProperty, value);
}
public bool IsLoading
{
get => (bool)GetValue(IsLoadingProperty);
set => SetValue(IsLoadingProperty, value);
}
public event EventHandler<BarHeightEventArgs> NavigationBarHeightChanged;
public event EventHandler<BarHeightEventArgs> StatusBarHeightChanged;
private bool firstLoading = true;
public AppShell()
{
BindingContext = this;
InitializeComponent();
#if LOG
App.DebugPrint($"folder: {Stores.PersonalFolder}");
App.DebugPrint($"cache: {Stores.CacheFolder}");
#endif
}
protected override void OnNavigated(ShellNavigatedEventArgs args)
{
if (firstLoading)
{
firstLoading = false;
// login info
Task.Run(() => DoLoginInformation(true));
}
}
public void SetNavigationBarHeight(double height)
{
NavigationBarOffset = new Thickness(0, height, 0, 0);
HalfNavigationBarOffset = new Thickness(0, height / 2, 0, 0);
NavigationBarHeightChanged?.Invoke(this, new BarHeightEventArgs
{
NavigationBarHeight = height
});
}
public void SetStatusBarHeight(double navigation, double height)
{
TotalBarOffset = new Thickness(0, navigation + height, 0, 0);
StatusBarHeightChanged?.Invoke(this, new BarHeightEventArgs
{
StatusBarHeight = height
});
}
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
if (UserProfileId != null)
{
if (IsLoading)
{
return;
}
IsLoading = true;
Task.Run(() =>
{
DoLoginInformation(true);
IsLoading = false;
});
}
else
{
PushToLogin(() =>
{
Task.Run(() => DoLoginInformation(true));
});
}
}
private bool isLoginOpened;
public void PushToLogin(Action after)
{
if (isLoginOpened)
{
return;
}
isLoginOpened = true;
var loginPage = new LoginPage(()=>
{
isLoginOpened = false;
after?.Invoke();
});
loginPage.Disappearing += (sender, e) =>
{
isLoginOpened = false;
};
MainThread.BeginInvokeOnMainThread(async () =>
{
await Navigation.PushModalAsync(loginPage);
});
}
public void DoLoginInformation(bool force = false)
{
string name = null;
string userId = null;
string img = null;
if (!force)
{
name = Preferences.Get(Configs.ProfileNameKey, null);
userId = Preferences.Get(Configs.ProfileIdKey, null);
img = Preferences.Get(Configs.ProfileImageKey, null);
}
if (name == null || userId == null)
{
var global = Stores.LoadGlobalData(force);
if (global == null || global.userData == null)
{
App.DebugError("login.info", "user data is null");
return;
}
name = global.userData.name;
userId = global.userData.pixivId;
img = global.userData.profileImgBig;
Preferences.Set(Configs.ProfileNameKey, name);
Preferences.Set(Configs.ProfileIdKey, userId);
Preferences.Set(Configs.ProfileImageKey, img);
}
UserProfileName = name ?? ResourceHelper.Guest;
UserProfileId = string.IsNullOrEmpty(userId)
? string.Empty
: $"@{userId}";
UserProfileImage = img == null
? StyleDefinition.ProfileNone
: Stores.LoadUserProfileImage(img, true);
}
}
public class BarHeightEventArgs : EventArgs
{
public double NavigationBarHeight { get; set; }
public double StatusBarHeight { get; set; }
}
}