Skip to content
Open
38 changes: 31 additions & 7 deletions app/controllers/attendees_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,41 @@ class AttendeesController < ApplicationController
before_action :set_session

def create
@session.attendees.push(current_user) if @session.attendees.exclude?(current_user)
@user_session_ids = current_user.sessions.pluck(:id)
@session.attendees.push(current_user)
flash[:notice] = I18n.t("controllers.attendees.add_user.notice")

session[:last_action] = "create"
flash[:undo] = {path: undo_session_attendee_path(session_id: @session.id)}

redirect_back_or_to(sessions_path, params: params[:starts_at])
end

def destroy
@session.attendees.delete(current_user) if @session.attendees.include?(current_user)
@user_session_ids = current_user.sessions.pluck(:id)
if URI(request.referer).path == schedule_path
flash[:notice] = I18n.t("controllers.attendees.remove_user.notice")
redirect_back_or_to(sessions_path, params: params[:starts_at])
@session.attendees.delete(current_user)
flash[:notice] = I18n.t("controllers.attendees.remove_user.notice")

session[:last_action] = "destroy"
flash[:undo] = {path: undo_session_attendee_path(session_id: @session.id)}

redirect_back_or_to(sessions_path, params: params[:starts_at])
end

def undo
if session[:last_action].present?
last_action = session[:last_action]

if last_action == "create"
@session.attendees.delete(current_user)
elsif last_action == "destroy"
@session.attendees.push(current_user)
end

session[:last_action] = nil
else
flash[:notice] = I18n.t("controllers.attendees.undo.expired")
end

redirect_back_or_to(sessions_path, params: params[:starts_at])
end

private
Expand Down
7 changes: 5 additions & 2 deletions app/views/layouts/_flash_message.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
<%# locals: (message:) %>
<%# locals: (message:, type:) %>

<div class="flex flex-col items-center justify-center fixed bottom-[64px] pb-safe-area-1 w-full z-30 px-5">
<div data-controller="closable" class="bg-black/70 shadow-simple backdrop-blur-[25px] rounded-lg px-5 py-4 transition-all bottom-0 max-w-screen-sm text-white z-20 sticky">
<div data-controller="closable" class="flex justify-between gap-8 bg-black/70 shadow-simple backdrop-blur-[25px] rounded-lg px-5 py-4 transition-all bottom-0 max-w-screen-sm text-white z-20 sticky">
<%= message %>
<% if type == "notice" && flash[:undo].present? %>
<%= button_to "Undo", flash[:undo]["path"], class: "italic font-bold" %>
<% end %>
</div>
</div>
2 changes: 1 addition & 1 deletion app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
<div id="flash_message">
<% flash.each do |type, message| %>
<% if message.present? && message.is_a?(String) %>
<%= render partial: "layouts/flash_message", locals: { message: message } %>
<%= render partial: "layouts/flash_message", locals: { message: message, type: type } %>
<% end %>
<% end %>
</div>
Expand Down
2 changes: 2 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ en:
notice: "Session was added to My Schedule"
remove_user:
notice: "Session was removed from My Schedule"
undo:
expired: "The undo action has expired."
mailers:
session_mailer:
reminder:
Expand Down
4 changes: 3 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
resource :schedule, only: [:show]

resources :sessions, only: [:index, :show] do
resource :attendee, only: [:create, :destroy]
resource :attendee, only: [:create, :destroy] do
post "undo", on: :collection
end
end
resources :speakers, only: [:show]
resources :profiles, only: [:show, :edit, :update], param: :uuid
Expand Down