Newer
Older
BlazorKafkaSignalR / src / BlazingPizza.Client / Pages / OrderDetails.razor
@Derek Comartin Derek Comartin on 1 Jun 2021 3 KB Init
@page "/myorders/{orderId:int}"
@using Microsoft.AspNetCore.SignalR.Client
@implements IAsyncDisposable
@inject NavigationManager _navigationManager
@inject IAccessTokenProvider _tokenProvider;
@inject OrdersClient _ordersClient
@attribute [Authorize]

<div class="main">
    @if (_invalidOrder)
    {
        <h2>Nope</h2>
        <p>Sorry, this order could not be loaded.</p>
    }
    else if (_orderWithStatus == null)
    {
        <text>Loading...</text>
    }
    else
    {
        <div class="track-order">
            <div class="track-order-title">
                <h2>
                    Order placed @_orderWithStatus.Order.CreatedTime.ToLongDateString()
                </h2>
                <p class="ml-auto mb-0">
                    Status: <strong>@_orderWithStatus.StatusText</strong>
                </p>
            </div>
            <div class="track-order-body">
                <div class="track-order-details">
                    <OrderReview Order="_orderWithStatus.Order" />
                </div>
                <div class="track-order-map">
                    <Map Zoom="13" Markers="_orderWithStatus.MapMarkers"></Map>
                </div>
            </div>
        </div>
    }
</div>

@code {
    [Parameter]
    public int OrderId { get; set; }
    private HubConnection _hubConnection;
    private OrderWithStatus _orderWithStatus;
    private bool _invalidOrder;

    protected override async Task OnParametersSetAsync()
    {
        await base.OnParametersSetAsync();
        await GetOrderDetails();
    }

    protected override async Task OnInitializedAsync()
    {
        var tokenResult = await _tokenProvider.RequestAccessToken();
        tokenResult.TryGetToken(out var token);

        _hubConnection = new HubConnectionBuilder()
            .WithUrl(_navigationManager.ToAbsoluteUri("https://localhost:6001/customer/orderhub"), options =>
              {
                  options.AccessTokenProvider = () => Task.FromResult(token.Value);
              })
            .Build();

        _hubConnection.On("OrderBeingPrepared", async () =>
        {
            Console.WriteLine("SignalR Event: OrderBeingPrepared");
            await GetOrderDetails();
            StateHasChanged();
        });

        _hubConnection.On("OrderPickedUpForDelivery", async () =>
        {
            await GetOrderDetails();
            StateHasChanged();
        });

        _hubConnection.On("OrderDelivered", async () =>
        {
            await GetOrderDetails();
            StateHasChanged();
        });

        await _hubConnection.StartAsync();
        await _hubConnection.InvokeAsync("WatchOrder", OrderId);
    }

    private async Task GetOrderDetails()
    {
        try
        {
            _orderWithStatus = await _ordersClient.GetOrder(OrderId);
            StateHasChanged();
        }
        catch (AccessTokenNotAvailableException ex)
        {
            ex.Redirect();
        }
        catch (Exception ex)
        {
            _invalidOrder = true;
            Console.Error.WriteLine(ex);
            StateHasChanged();
        }
    }

    public async ValueTask DisposeAsync()
    {
        await _hubConnection.DisposeAsync();
    }
}