@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();
}
}
}