Strawberry Shake in Blazor

I'm currently working on a Blazor project fetching data with StraberryShake from a HotChocolate Fusion Gateway and I'm loving it.

But I had few minor issues (mostly the order of execution) getting this Get started with Strawberry Shake and Blazor article to work so I noted down what I had to do and in what order so others could have an easier time than me.

Create a tool manifest

Create a dotnet tool-manifest.

dotnet new tool-manifest

Install StrawberryShake.Tools

Install the tool

dotnet tool install StrawberryShake.Tools

Blazor project setup

Add the StrawberryShake.Blazor nuget package

dotnet add Demo package StrawberryShake.Blazor

Btw my Blazor project is .net 7.0 and Server (not SSR (Static Server Rendered)). I'm using a template that needs to be updated to .net 8.0 before I can try this out with SSR.

Have your GraphQL endpoint running

In my case it was

http://localhost:20999/graphql/

I would open up Terminal and run dotnet run in the project root.

Create .graphqlc.json file

Do that by running the following

dotnet graphql init http://localhost:20999/graphql/ -n GatewayClient 

and you should see in the output something like this

Download schema started.
Download schema completed in 916 ms
Client configuration started.
Client configuration completed in 122 ms

This will also create a schema.graphql file. If you have issues creating the client you should make sure that your types are in there or something might have happened (it did to me but I was also using fusion)

Add namespace to .graphqlc.json

Just something like this

"namespace": "YourNamespace.Gateway"

Add some grapql query file

Add a query file like this GetCustomer.graphql

and populate it

query GetCustomers {
  customer {
    nodes {
      Id
      name
    }
  }
}

Nb. it needs to be a named query. That is GetCustomers

This is all of course assuming that your endpoint has customer with name and id.

Build the Blazor project

In the Blazor root run

dotnet build

and you should see

Generate C# Clients started.
Generate GatewayClient started.
Generate GatewayClient completed in 1192 ms
Generate C# Clients completed in 4019 ms

This will create GatewayClient.Client.cs and GatewayClient.Components.cs for you in the obj\Debug\net7.0\berry folder.

Add the namespace to the _Import.razor file

Now you can add @using YourNamespace.Components into the _Import.razor for the components to show up globally in all pages desired.

Add the graphQL client

Add this code to the Program.cs

builder.Services
.AddGatewayClient()
.ConfigureHttpClient(client => client.BaseAddress = new Uri("http://localhost:20999/graphql"));

Add code to Razor page

Now you can use <UseGetCustomers> in your Razor pages. These types are in the GatewayClient.Components.cs file and are made up of Use+TheNameOfTheNamedQuery

<UseGetCustomers Context="result" Strategy="ExecutionStrategy.CacheFirst">
    <ChildContent>
        <div style="border-style: dotted">

            <h3>This data is coming from the GetCustomers.graphql query</h3>

            @if (result.Customer?.Nodes is not null)
            {
                @foreach (var customer in result.Customer.Nodes)
                {
                    <p>@customer.Name</p>
                }
            }
        </div>
    </ChildContent>
    <ErrorContent>
        Something went wrong ...<br />
        @result.First().Message
    </ErrorContent>
    <LoadingContent>
        Loading ...
    </LoadingContent>
</UseGetCustomers>

You should now have intellisense in you IDE.

Troubleshooting

I think I'm covering everything that happened to me but if not let me know.

Schema issue

Seeing something like the following means that you have not gotten the new schema to the schema.graphql file in the project.

error SS0002: The field `Customer` does not exist on the type `Query`.

Already registered by another type

I had accidentally created another schema.graphql file and got this error.

error HC0065: The name `Query` was already registered by another type.

Deleting one solved the issue.

Final words

I'm just starting to play with this but like what I see.

I have bunch of questions

  • How do I pass variables into these components?
  • Should I use one query for each page or many?
    • And if they are many will the page call once or many times?
  • Caching?
  • If I have many components can I communicate between them? E.g choose id from a drop down in one that fires off a query in the other one?
  • Can I (and how) use paging for a grid?
  • Can I use HTMX in combination with this?

So lots to explore.