Skip to content

Commit

Permalink
Add checkout page
Browse files Browse the repository at this point in the history
  • Loading branch information
kuro-vale committed Sep 3, 2022
1 parent 7fd5457 commit b065ab2
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Models/Order.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ public decimal GetTotalPrice()
{
return GetToppingsPrice() + (decimal)Dessert!.Price * Size / DefaultSize;
}

public decimal GetDessertPrice()
{
return (decimal)Dessert!.Price * Size / DefaultSize;
}
}

public class OrderResponse
Expand Down
137 changes: 137 additions & 0 deletions Pages/Checkout.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
@page "/Checkout"
@using kuro_desserts.Services
@using kuro_desserts.Models
@using System.Text.Json
@using System.Net.Http.Headers
@inject CartService CartService
@inject HttpClient HttpClient
@inject NavigationManager NavigationManager
@inject IJSRuntime JsRuntime;

<PageTitle>Cart</PageTitle>

@if (Cart.Orders!.Any())
{
<h4>Your cart</h4>
<div class="overflow-auto">
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Dessert</th>
<th>Flavor</th>
<th>Toppings</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@{
var i = 1;
}
@foreach (var order in Cart.Orders!)
{
<tr>
<td>@i</td>
<td>@order.Dessert!.Name</td>
<td>@order.Flavor!.Name</td>
<td></td>
<td>@order.GetDessertPrice().ToString("C")</td>
</tr>
i += 1;
@if (order.Toppings!.Any())
{
@foreach (var topping in order.Toppings!)
{
<tr>
<td></td>
<td></td>
<td></td>
<td>@topping.Topping!.Name</td>
<td>@topping.Topping.Price.ToString("C")</td>
</tr>
}
}
}
<tr>
<td></td>
<td>Total</td>
<td></td>
<td></td>
<td>@Cart.GetTotalPrice().ToString("C")</td>
</tr>
</tbody>
</table>
</div>
@if (_addresses != null)
{
<select class="form-select my-3" @onchange="SelectAddress">
<option value="" selected>Select an address</option>
@foreach (var address in _addresses)
{
<option value="@address.Id">@address.Line</option>
}
</select>
<button class="btn btn-success my-3 @(_addressSelected ? "" : "disabled")" @onclick="ConfirmCheckout">Checkout</button>
}
else
{
<NavLink href="/profile/create" class="btn btn-danger my-3">You don't have any address, Click here to add one</NavLink>
}
}
else
{
<h1>You have nothing in your cart, go to buy something</h1>
}

@code {
Cart Cart => CartService.Cart;
Address[]? _addresses;
string? _token;
bool _addressSelected;

protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
_token = await JsRuntime.InvokeAsync<string?>("ReadCookie.ReadCookie", "token");
HttpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse(_token);
try
{
_addresses = await HttpClient.GetFromJsonAsync<Address[]?>($"{NavigationManager.BaseUri}api/addresses");
}
catch (JsonException)
{
_addresses = null;
}
StateHasChanged();
}
}

void SelectAddress(ChangeEventArgs e)
{
if (e.Value!.ToString() != "")
{
Cart.AddressId = Guid.Parse(e.Value.ToString()!);
_addressSelected = true;
}
else
{
_addressSelected = false;
}
}

async Task ConfirmCheckout()
{
var toppings = Cart.Orders!.SelectMany(order => order.Toppings!).ToList();
var checkoutRequest = new CheckoutRequest
{
Cart = new Cart { AddressId = Cart.AddressId },
Orders = Cart.Orders!,
OrderToppings = toppings
};
HttpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse(_token);
await HttpClient.PostAsJsonAsync($"{NavigationManager.BaseUri}api/checkout", checkoutRequest);
NavigationManager.NavigateTo("/orders", forceLoad: true);
}

}
2 changes: 1 addition & 1 deletion Shared/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<NavLink class="nav-link fw-bold py-1 px-0" href="/orders">My Orders</NavLink>
<NavLink class="nav-link fw-bold py-1 px-0" href="/profile">Profile</NavLink>
<p class="nav-link fw-bold py-1 px-0" @onclick="AuthService.ShowLogoutModal">Logout</p>
<NavLink class="nav-link py-1 px-0 position-relative" href="/cart">
<NavLink class="nav-link py-1 px-0 position-relative" href="/checkout">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path d="M8 9h-7.161l-.839-2h8v2zm0 2h-6.322l.839 2h5.483v-2zm8.53-4h-6.53v2h5.966l.564-2zm-1.694 6l.564-2h-5.4v2h4.836zm-6.336 5c-.828 0-1.5.672-1.5 1.5 0 .829.672 1.5 1.5 1.5s1.5-.671 1.5-1.5c0-.828-.672-1.5-1.5-1.5zm11.305-15l-3.432 12h-13.017l.839 2h13.659l3.474-12h1.929l.743-2h-4.195zm-6.305 15c-.828 0-1.5.671-1.5 1.5s.672 1.5 1.5 1.5 1.5-.671 1.5-1.5c0-.828-.672-1.5-1.5-1.5z"/>
</svg>
Expand Down

0 comments on commit b065ab2

Please sign in to comment.