Skip to content

Commit 506cbca

Browse files
committed
fix behavior when a task has been previously loaded, add an option ShowRefresherFromChildrenStrategy for the CompositeTaskLoader
1 parent 893a00c commit 506cbca

File tree

6 files changed

+62
-6
lines changed

6 files changed

+62
-6
lines changed

Sharpnado.TaskLoaderView/CompositeTaskLoaderNotifier.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,19 @@
1010

1111
namespace Sharpnado.Presentation.Forms
1212
{
13-
public enum CompositionAutoResetCondition
13+
public enum ShowRefresherFromChildrenStrategy
1414
{
15-
AnyCompleted = 0,
16-
AllCompleted,
15+
Never = 0,
16+
WhenAll,
17+
WhenAny,
1718
}
1819

1920
public class CompositeTaskLoaderNotifier : ITaskLoaderNotifier
2021
{
2122
protected const string Tag = "CompositeNotifier";
2223

24+
private readonly ShowRefresherFromChildrenStrategy _showRefresherFromChildrenStrategy;
25+
2326
private readonly ITaskLoaderNotifier[] _loaders;
2427

2528
private bool _showLoader;
@@ -35,9 +38,16 @@ public class CompositeTaskLoaderNotifier : ITaskLoaderNotifier
3538

3639
private Exception _lastError;
3740

41+
public CompositeTaskLoaderNotifier(params ITaskLoaderNotifier[] taskLoaderNotifiers)
42+
: this(ShowRefresherFromChildrenStrategy.Never, taskLoaderNotifiers)
43+
{
44+
}
45+
3846
public CompositeTaskLoaderNotifier(
47+
ShowRefresherFromChildrenStrategy showRefresherFromChildrenStrategy,
3948
params ITaskLoaderNotifier[] taskLoaderNotifiers)
4049
{
50+
_showRefresherFromChildrenStrategy = showRefresherFromChildrenStrategy;
4151
_loaders = taskLoaderNotifiers;
4252

4353
Subscribe();
@@ -169,6 +179,11 @@ public Exception LastError
169179

170180
public TimeSpan AutoResetDelay { get; } = TimeSpan.Zero;
171181

182+
public void OnTaskOverloaded()
183+
{
184+
InternalLogger.Debug(Tag, () => $"OnTaskOverloaded() : let the child tasks handle their states");
185+
}
186+
172187
public void Load(bool isRefreshing = false)
173188
{
174189
InternalLogger.Debug(Tag, () => $"Load()");
@@ -262,7 +277,16 @@ private void LoaderOnPropertyChanged(object sender, PropertyChangedEventArgs e)
262277
break;
263278

264279
case nameof(ShowRefresher):
265-
ShowRefresher = _loaders.Any(l => l.ShowRefresher);
280+
switch (_showRefresherFromChildrenStrategy)
281+
{
282+
case ShowRefresherFromChildrenStrategy.WhenAny:
283+
ShowLoader = _loaders.Any(l => l.ShowLoader);
284+
break;
285+
case ShowRefresherFromChildrenStrategy.WhenAll:
286+
ShowLoader = _loaders.All(l => l.ShowLoader);
287+
break;
288+
}
289+
266290
break;
267291

268292
case nameof(ShowResult):

Sharpnado.TaskLoaderView/ITaskLoaderNotifier.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,7 @@ public interface ITaskLoaderNotifier : INotifyPropertyChanged
5050
void Load(bool isRefreshing = false);
5151

5252
void Reset();
53+
54+
void OnTaskOverloaded();
5355
}
5456
}

Sharpnado.TaskLoaderView/NotStartedTaskLoaderNotifier.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public void Reset()
6868
{
6969
}
7070

71+
public void OnTaskOverloaded()
72+
{
73+
}
74+
7175
private static void DoNothing()
7276
{
7377
}

Sharpnado.TaskLoaderView/TaskLoaderNotifier.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ public TaskLoaderNotifier(TimeSpan autoResetDelay, Func<bool, Task> loadingTaskS
3232

3333
public override bool IsNotStarted => CurrentLoadingTask == TaskMonitor.NotStartedTask;
3434

35+
public void UpdateLoadingTaskSource(Func<bool, Task> loadingTaskSource)
36+
{
37+
InternalLogger.Debug(Tag, () => $"UpdateLoadingTaskSource()");
38+
_loadingTaskSource = loadingTaskSource;
39+
}
40+
3541
/// <summary>
3642
/// Load a task previously set.
3743
/// </summary>
@@ -49,7 +55,7 @@ public void Load(Func<bool, Task> loadingTaskSource, bool isRefreshing = false)
4955
if (CurrentLoadingTask != TaskMonitor.NotStartedTask && CurrentLoadingTask.IsNotCompleted)
5056
{
5157
InternalLogger.Warn("A loading task is currently running: discarding previous call");
52-
Reset();
58+
OnTaskOverloaded();
5359
return;
5460
}
5561

Sharpnado.TaskLoaderView/TaskLoaderNotifierBase.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,20 @@ public virtual void Reset()
186186
RaisePropertyChanged(nameof(IsFaulted));
187187
}
188188

189+
/// <summary>
190+
/// We'll need to just cancel the current task and keep all the states cause a new task will be loaded
191+
/// </summary>
192+
public void OnTaskOverloaded()
193+
{
194+
lock (SyncRoot)
195+
{
196+
if (!IsNotStarted)
197+
{
198+
CurrentLoadingTask?.CancelCallbacks();
199+
}
200+
}
201+
}
202+
189203
public override string ToString()
190204
{
191205
var builder = new StringBuilder($"{Tag} => ");

Sharpnado.TaskLoaderView/TaskLoaderNotifier{T}.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ public override void Load(bool isRefreshing = false)
6161
Load(_loadingTaskSource, isRefreshing);
6262
}
6363

64+
public void UpdateLoadingTaskSource(Func<bool, Task<TData>> loadingTaskSource)
65+
{
66+
InternalLogger.Debug(Tag, () => $"UpdateLoadingTaskSource()");
67+
_loadingTaskSource = loadingTaskSource;
68+
}
69+
6470
public void Load(Func<bool, Task<TData>> loadingTaskSource, bool isRefreshing = false)
6571
{
6672
InternalLogger.Debug(Tag, () => $"Load( isRefreshing: {isRefreshing} )");
@@ -69,7 +75,7 @@ public void Load(Func<bool, Task<TData>> loadingTaskSource, bool isRefreshing =
6975
if (CurrentLoadingTask != TaskMonitor<TData>.NotStartedTask && CurrentLoadingTask.IsNotCompleted)
7076
{
7177
InternalLogger.Warn("A loading task is currently running: discarding previous call");
72-
Reset();
78+
OnTaskOverloaded();
7379
}
7480

7581
if (CurrentLoadingTask == TaskMonitor<TData>.NotStartedTask && loadingTaskSource == null)

0 commit comments

Comments
 (0)