3900-MyRecipes-backup / Client / Pages / PublicProfile.razor
PublicProfile.razor
Raw
@page "/PublicProfile/{Id}"
@using Microsoft.AspNetCore.Authorization;
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
@using MyRecipes2.Shared;
@using MyRecipes2.Client.Services;
@inject HttpClient Http;
@inject AuthenticationStateProvider AuthenticationStateProvider;
@inject UtilityService UtilityService;
@inject NavigationManager NavManager;

@if (userDetails == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <div>
        <h1>Profile</h1>
        <h2>@userDetails.Username</h2>
    </div>

    <div>
        @if (subscribeFromId == subscribeToId)
        {
            <button @onclick="() => ClickEdit()" class="btn btn-primary">Edit</button>
        }
    </div>
    <div>
        <AuthorizeView>
            <Authorized>
                @if (subscribed == false && subscribeFromId != subscribeToId)
                {
                    <button @onclick="Subscribe" class="btn btn-primary mb-2">Subscribe</button>
                }
                else if (subscribed == true && subscribeFromId != subscribeToId)
                {
                    <button @onclick="() => OpenUnsubPrompt()" class="btn btn-secondary btn-sm mb-2">Unsubscribe</button>
                }
                @if (UnsubPromptOpen)
                {
                    <Modal Title="You are about to unsubscribe from this user" Text="Unsubscribe?"
                           OnClose="@OnUnsubPromptClose" PromptType="Modal.ModalType.UnsubscribeCancel"></Modal>
                }
            </Authorized>
        </AuthorizeView>
    </div>

    <div class="row">
        <div class="col-6">
            <div style="border-radius: 50%; width: 20rem; height: 20rem; background-image: url(@userDetails.ProfileImageUrl); background-size: cover;">

            </div>
        </div>
        <div class="col-6">
            @userDetails.Bio
        </div>
    </div>

    <div>
        <table class="table">
            <thead>
                <tr>
                    <th>Recipe</th>
                    <th>Photo</th>
                    <th>View</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var recipe in recipes)
                {
                    <tr>
                        <td>@recipe.Name</td>
                        <td>
                            <img src="@recipe.ImageUrl" style="width:128px;height:auto;" />
                        </td>
                        <td>
                            <button @onclick="() => ClickView(recipe)" class="btn btn-primary">View</button>
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
}
@code {
    private List<RecipeDto> recipes;
    private UserDto userDetails;

    private string subscribeToId;
    private string subscribeFromId;
    private bool subscribed;

    public bool UnsubPromptOpen { get; set; }

    [Parameter]
    public string Id { get; set; }

    private async void Subscribe()
    {
        subscribed = true;
        SubscriptionRequestDto request = new();
        request.subscribeFromId = subscribeFromId;
        request.subscribeToId = subscribeToId;
        await Http.PostAsJsonAsync<SubscriptionRequestDto>("Subscription", request);
        return;
    }

    private async Task OnUnsubPromptClose(bool accepted)
    {
        if (accepted)
        {
            subscribed = false;
            await Http.DeleteAsync("Subscription/DeleteSubscription/" + subscribeFromId + "/" + subscribeToId);
        }

        UnsubPromptOpen = false;
        StateHasChanged();
    }

    private void OpenUnsubPrompt()
    {
        UnsubPromptOpen = true;
        StateHasChanged();
    }
    private async void Unsubscribe()
    {
        subscribed = false;
        await Http.DeleteAsync("Subscription/DeleteSubscription/" + subscribeFromId + "/" + subscribeToId);
        return;
    }

    protected void ClickView(RecipeDto recipe)
    {
        NavManager.NavigateTo($"ViewRecipe/{recipe.Id}");
    }

    protected void ClickEdit()
    {
        Console.WriteLine(userDetails);
        NavManager.NavigateTo($"/EditPublicProfile");
    }


    protected override async Task OnInitializedAsync()
    {
        try
        {
            // List of recipes
            recipes = await Http.GetFromJsonAsync<List<RecipeDto>>($"Recipe/MyRecipes/{Id}");

            // Get user details
            userDetails = await Http.GetFromJsonAsync<UserDto>($"PublicProfile/Data/{Id}");

            if (await UtilityService.GetUserId() == null)
            {
                subscribed = false;
            }
            else
            {
                // initialise subscription data
                subscribeFromId = await UtilityService.GetUserId();
                subscribeToId = this.Id;
                subscribed = await Http.GetFromJsonAsync<bool>("Subscription/CheckSubscription/" + subscribeFromId + "/" + subscribeToId);
            }
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}