Table of Contents

FeedState Enum

Represents the state of a feed as a flags enumeration.

Namespace: DevBitsLab.Feeds
Assembly: DevBitsLab.Feeds.dll

[Flags]
public enum FeedState

Values

Value Binary Description
None 0000 Initial state — no data loaded
Loading 0001 Currently fetching data
HasValue 0010 Successfully loaded a value
HasError 0100 Error occurred during load
Refreshing 0011 Loading + HasValue
Retrying 0101 Loading + HasError

Understanding Flags

FeedState uses [Flags] to allow combined states:

// Refreshing = Loading | HasValue
if (feed.State == FeedState.Refreshing) {
    ShowRefreshingOverlay();
}

// Check individual flags
if (feed.State.HasFlag(FeedState.Loading)) {
    ShowLoadingIndicator();
}

State Diagram

               ┌────────────┐
     Initial → │    None    │ ← No load function
               │   (0000)   │   or CreateDeferred
               └─────┬──────┘
                     │ RefreshAsync()
                     ▼
               ┌────────────┐
               │  Loading   │
               │   (0001)   │
               └──┬─────┬───┘
          success │     │ error
                  ▼     ▼
          ┌───────────┐   ┌───────────┐
          │ HasValue  │   │ HasError  │
          │  (0010)   │   │  (0100)   │
          └─────┬─────┘   └─────┬─────┘
                │               │
     Refresh ───┤               │── Retry
                ▼               ▼
          ┌───────────┐   ┌───────────┐
          │Refreshing │   │ Retrying  │
          │  (0011)   │   │  (0101)   │
          └───────────┘   └───────────┘

Checking States

if (feed.IsLoading)  // State.HasFlag(Loading)
if (feed.HasValue)   // State.HasFlag(HasValue)
if (feed.HasError)   // State.HasFlag(HasError)

Using HasFlag

// Check if loading (includes Refreshing, Retrying)
if (feed.State.HasFlag(FeedState.Loading)) {
    ShowLoadingIndicator();
}

Exact Match

// Only true during initial load
if (feed.State == FeedState.Loading) {
    ShowFullPageSpinner();
}

// Only true when refreshing existing data
if (feed.State == FeedState.Refreshing) {
    ShowSubtleRefreshIndicator();
}

Common Patterns

UI State Binding

feed.StateChanged += (s, e) => {
    switch (e.NewState) {
        case FeedState.None:
            ShowEmptyState();
            break;
        case FeedState.Loading:
            ShowFullPageLoader();
            break;
        case FeedState.HasValue:
            ShowContent(feed.Value!);
            break;
        case FeedState.HasError:
            ShowError(feed.Error!);
            break;
        case FeedState.Refreshing:
            ShowContent(feed.Value!);
            ShowRefreshIndicator();
            break;
        case FeedState.Retrying:
            ShowError(feed.Error!);
            ShowRetryIndicator();
            break;
    }
};

Layered Loading Indicators

// Full page spinner for initial load only
fullPageSpinner.Visible = feed.State == FeedState.Loading;

// Subtle indicator whenever loading
refreshIndicator.Visible = feed.State.HasFlag(FeedState.Loading);

// Content visible when we have data
content.Visible = feed.State.HasFlag(FeedState.HasValue);

// Error panel when error (but not retrying)
errorPanel.Visible = feed.State == FeedState.HasError;

Detecting Transitions

feed.StateChanged += (s, e) => {
    // Load completed successfully
    if (e.OldState.HasFlag(FeedState.Loading) && 
        e.NewState == FeedState.HasValue) {
        OnLoadSuccess();
    }
    
    // Error just occurred
    if (!e.OldState.HasFlag(FeedState.HasError) && 
        e.NewState.HasFlag(FeedState.HasError)) {
        OnError(feed.Error!);
    }
    
    // Started refreshing
    if (e.OldState == FeedState.HasValue && 
        e.NewState == FeedState.Refreshing) {
        OnRefreshStarted();
    }
};

FeedStateChangedEventArgs

Event data for StateChanged events.

public sealed class FeedStateChangedEventArgs : EventArgs {
    public FeedState OldState { get; }
    public FeedState NewState { get; }
}

Example:

feed.StateChanged += (sender, e) => {
    Log.Info($"Feed state: {e.OldState} → {e.NewState}");
};

See Also