feature: sync online favorites
This commit is contained in:
@@ -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)
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user