UI/SpawnMenu/Dupes/DupesWorkshop.razor
@using Sandbox;
@using Sandbox.UI;
@using Sandbox.Mounting;
@inherits Panel
@namespace Sandbox

<SpawnMenuContent>

    <Header>
        <SpawnMenuToolbar>
            <Left>
                <TextEntry Placeholder="#spawnmenu.common.search" class="filter menu-input" Value:bind=@Filter />
            </Left>
            <Right>
                <DropDown Value:bind=@SortOrder />
            </Right>
        </SpawnMenuToolbar>
    </Header>

    <Body>
		
        <VirtualGrid Items=@Items ItemSize=@(200) OnLastCell="@(() => { _ = QueryNext(); })">
            <Item Context="context">

				@if (context is Storage.QueryItem item)
                {
					<WorkshopIcon Item="@item" @onclick=@( () => _ = DuplicatorTool.FromWorkshop( item ) )></WorkshopIcon>
                }

            </Item>
        </VirtualGrid>
    </Body>

</SpawnMenuContent>

@code
{
    string _filter;
    public string Filter
    {
        get => _filter;
        set
        {
            if ( _filter == value ) return;
            _filter = value;
            Rebuild();
        }
    }

    WorkshopSortMode _sortOrder = WorkshopSortMode.Popular;
    public WorkshopSortMode SortOrder
    {
        get => _sortOrder;
        set
        {
            if ( _sortOrder == value ) return;
            _sortOrder = value;
            Rebuild();
        }
    }

    public string Category { get; set; }

    protected override async Task OnParametersSetAsync()
    {
        Items.Clear();
        await QueryNext();
    }

    List<Storage.QueryItem> Items = new();
    Storage.QueryResult LastResult;

    async Task QueryNext()
    {
        if ( LastResult != null )
        {
            // No more items to load
            if (!LastResult.HasMoreResults())
                return;

            LastResult = await LastResult.GetNextResults();
            if (LastResult.Items == null) return;

            Items.AddRange(LastResult.Items);
            StateHasChanged();
            return;
        }

		var query = new Storage.Query();
		query.KeyValues["package"] = "facepunch.sandbox";
		query.KeyValues["type"] = "dupe";
		query.SortOrder = SortOrder.ToSortOrder();

        if ( !string.IsNullOrWhiteSpace( Filter ) ) query.SearchText = Filter;
        if (Category != null) query.KeyValues["Category"] = Category;

		LastResult = await query.Run();
		if ( LastResult.Items == null ) return;

		Items.AddRange( LastResult.Items );
		StateHasChanged();
	}

    async void Rebuild()
    {
        Items.Clear();
        LastResult = null;
        await QueryNext();
    }
}