feature: sync online favorites

This commit is contained in:
2020-05-18 21:36:59 +08:00
parent d6c235d6ef
commit 508bab3395
6 changed files with 215 additions and 9 deletions

View File

@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Pixiview.Resources;
using Pixiview.UI;
using Pixiview.Utils;
using Xamarin.Essentials;
using Xamarin.Forms;
@@ -81,9 +84,105 @@ namespace Pixiview.Illust
return;
}
await ScrollToTopAsync(scrollView);
flag = false;
lastUpdated = default;
StartLoad(true);
IsLoading = true;
var offset = 16 - IndicatorMarginTop;
activityLoading.Margin = new Thickness(0, loadingOffset - offset, 0, offset);
activityLoading.Animate("margin", top =>
{
activityLoading.Margin = new Thickness(0, top, 0, offset);
},
loadingOffset - offset, 16 - offset, easing: Easing.CubicOut, finished: (v, r) =>
{
Task.Run(() =>
{
var list = Stores.LoadOnlineFavorites();
if (list != null && list.Length > 0)
{
MainThread.BeginInvokeOnMainThread(() => ConfirmNext(list));
}
else
{
flag = false;
lastUpdated = default;
MainThread.BeginInvokeOnMainThread(() => StartLoad(true));
}
});
});
}
private async void ConfirmNext(IllustItem[] list)
{
var cancel = ResourceHelper.Cancel;
var combine = ResourceHelper.FavoritesCombine;
var replace = ResourceHelper.FavoritesReplace;
var result = await DisplayActionSheet(
ResourceHelper.FavoritesOperation,
cancel,
combine,
replace);
if (result == cancel)
{
return;
}
if (result == replace)
{
Stores.GetFavoriteObject().Illusts = new FavoriteList(list);
}
else if (result == combine)
{
// combine
var favNow = Stores.GetFavoriteObject();
var nows = favNow.Illusts;
list = list.Where(f => !nows.Any(i => i.Id == f.Id)).ToArray();
for (var i = 0; i < list.Length; i++)
{
list[i].Image = StyleDefinition.DownloadBackground;
}
nows.InsertRange(0, list);
}
else
{
return;
}
ParallelTask.Start(0, list.Length, Configs.MaxPageThreads, i =>
{
var illustItem = list[i];
var data = Stores.LoadIllustPreloadData(illustItem.Id);
if (data != null && data.illust.TryGetValue(illustItem.Id, out var illust))
{
illust.CopyToItem(illustItem);
if (data.user.TryGetValue(illust.userId, out var user))
{
illustItem.ProfileUrl = user.image;
}
return true;
}
App.DebugError("load.favorite", $"cannot fetch preload data, {illustItem.Id}, disposed.");
return false;
}, () =>
{
Stores.SaveFavoritesIllusts();
MainThread.BeginInvokeOnMainThread(() =>
{
var offset = 16 - IndicatorMarginTop;
activityLoading.Animate("margin", top =>
{
activityLoading.Margin = new Thickness(0, top, 0, offset);
},
16 - offset, loadingOffset - offset, easing: Easing.CubicIn, finished: (v, r) =>
{
IsLoading = false;
flag = false;
lastUpdated = default;
StartLoad();
});
});
});
}
private async void ShareFavorites_Clicked(object sender, EventArgs e)

View File

@@ -514,6 +514,11 @@ namespace Pixiview.Illust
}
else
{
var item = favorites[index];
if (illust.BookmarkId == null && item.BookmarkId != null)
{
illust.BookmarkId = item.BookmarkId;
}
illust.IsFavorite = false;
favorites.RemoveAt(index);
FavoriteIcon = fontIconNotLove;