|
1 | 1 | using BangumiNet.Api.V0.Models; |
2 | 2 | using ReactiveUI.SourceGenerators; |
3 | 3 | using System.Collections.ObjectModel; |
| 4 | +using System.Linq; |
| 5 | +using System.Threading.Tasks; |
4 | 6 |
|
5 | 7 | namespace BangumiNet.ViewModels; |
6 | 8 |
|
7 | 9 | public partial class EpisodeListViewModel : ViewModelBase |
8 | 10 | { |
9 | | - public EpisodeListViewModel(Paged_Episode? episodes) |
| 11 | + public EpisodeListViewModel(int? subjectId) |
10 | 12 | { |
| 13 | + SubjectId = subjectId; |
11 | 14 | EpisodeViewModels = []; |
12 | | - PageItems = []; |
13 | | - |
14 | | - AddEpisodes(episodes); |
| 15 | + Sources = []; |
15 | 16 | } |
16 | 17 |
|
17 | | - public void AddEpisodes(Paged_Episode? episodes) |
| 18 | + private int lastOffset = 0; |
| 19 | + /// <param name="offset">分页 offset</param> |
| 20 | + /// <param name="limit">每页集数</param> |
| 21 | + /// <returns>是否已取得全部集数</returns> |
| 22 | + public async Task<bool?> LoadEpisodes(int? offset = null, int limit = 100) |
18 | 23 | { |
19 | | - if (episodes?.Data != null) |
20 | | - for (int i = 0; i < episodes.Data.Count; i++) |
21 | | - { |
22 | | - if (episodes.Offset is int offset) |
23 | | - if (PageItems.Contains(offset + 1)) continue; |
24 | | - else PageItems.Add(offset + i); |
25 | | - |
26 | | - EpisodeViewModels.Add(new(episodes.Data[i])); |
27 | | - } |
| 24 | + offset ??= lastOffset; |
| 25 | + if (offset >= EpTotal) return true; |
| 26 | + lastOffset += limit; |
| 27 | + |
| 28 | + var epPage = await ApiC.V0.Episodes.GetAsync(config => |
| 29 | + { |
| 30 | + config.QueryParameters.Limit = limit; |
| 31 | + config.QueryParameters.Offset = 0; |
| 32 | + config.QueryParameters.Type = null; |
| 33 | + config.QueryParameters.SubjectId = SubjectId; |
| 34 | + }); |
| 35 | + |
| 36 | + if (epPage == null) return null; |
| 37 | + Sources.Add(epPage); |
| 38 | + EpTotal = epPage.Total; |
| 39 | + |
| 40 | + if (epPage.Data is { } episodes) |
| 41 | + for (int i = 0; i < episodes.Count; i++) |
| 42 | + if (!EpisodeViewModels.Any(x => x.Id == episodes[i].Id)) |
| 43 | + EpisodeViewModels.Add(new(episodes[i])); |
| 44 | + |
| 45 | + return EpisodeViewModels.Count >= EpTotal; |
28 | 46 | } |
29 | 47 |
|
| 48 | + [Reactive] public partial ObservableCollection<Paged_Episode> Sources { get; set; } |
30 | 49 | [Reactive] public partial ObservableCollection<EpisodeViewModel> EpisodeViewModels { get; set; } |
31 | | - |
32 | | - public ObservableCollection<int> PageItems { get; } |
| 50 | + [Reactive] public partial int? SubjectId { get; set; } |
| 51 | + [Reactive] public partial int? EpTotal { get; set; } |
33 | 52 | } |
0 commit comments