mirror of
https://codeberg.org/JasterV/spazio-solazzo.git
synced 2026-04-26 18:20:03 +00:00
63 lines
1.9 KiB
Elixir
63 lines
1.9 KiB
Elixir
defmodule SpazioSolazzoWeb.BookingCancellationLive do
|
|
use SpazioSolazzoWeb, :live_view
|
|
|
|
alias SpazioSolazzo.BookingSystem
|
|
alias SpazioSolazzo.BookingSystem.Booking.Token
|
|
|
|
def mount(%{"token" => token}, _session, socket) do
|
|
case Token.verify(token) do
|
|
{:ok, %{booking_id: booking_id, action: :cancel}} ->
|
|
handle_booking(booking_id, socket)
|
|
|
|
{:error, _} ->
|
|
{:ok,
|
|
socket
|
|
|> put_flash(:error, "Invalid or expired cancellation link")
|
|
|> push_navigate(to: "/")}
|
|
end
|
|
end
|
|
|
|
defp handle_booking(booking_id, socket) do
|
|
case Ash.get(SpazioSolazzo.BookingSystem.Booking, booking_id, load: [:space]) do
|
|
{:ok, %{state: state} = booking} when state in [:requested, :accepted] ->
|
|
{:ok,
|
|
assign(socket,
|
|
booking: booking,
|
|
cancellation_reason: "",
|
|
show_success: false
|
|
)}
|
|
|
|
{:ok, _} ->
|
|
{:ok,
|
|
socket
|
|
|> put_flash(:error, "This booking has already been cancelled or completed")
|
|
|> push_navigate(to: "/")}
|
|
|
|
{:error, _} ->
|
|
{:ok,
|
|
socket
|
|
|> put_flash(:error, "Booking not found")
|
|
|> push_navigate(to: "/")}
|
|
end
|
|
end
|
|
|
|
def handle_event("validate", %{"reason" => reason}, socket) do
|
|
{:noreply, assign(socket, cancellation_reason: reason)}
|
|
end
|
|
|
|
def handle_event("cancel_booking", %{"reason" => reason}, socket) do
|
|
if String.trim(reason) == "" do
|
|
{:noreply, put_flash(socket, :error, "Please provide a reason for cancellation")}
|
|
else
|
|
booking = socket.assigns.booking
|
|
|
|
case BookingSystem.cancel_booking(booking, reason) do
|
|
{:ok, _cancelled_booking} ->
|
|
{:noreply, assign(socket, show_success: true)}
|
|
|
|
{:error, _error} ->
|
|
{:noreply, put_flash(socket, :error, "Failed to cancel booking. Please try again.")}
|
|
end
|
|
end
|
|
end
|
|
end
|