diff --git a/app/views/events/_registration_section.html.erb b/app/views/events/_registration_section.html.erb
new file mode 100644
index 000000000..75e4382bf
--- /dev/null
+++ b/app/views/events/_registration_section.html.erb
@@ -0,0 +1,30 @@
+<% registered = event.event_registrations.exists?(registrant_id: current_user&.id) %>
+<%= tag.div id: dom_id(event.object, :registration_section), class: "registration-section flex flex-col gap-4 mb-6" do %>
+
+
+ <% if registered %>
+ <%= button_to "De-register",
+ event_registrant_registration_path(event_id: event),
+ method: :delete,
+ data: { turbo_confirm: "Are you sure?" },
+ class: "btn btn-secondary-outline" %>
+ <% elsif event.registerable? %>
+ <%= button_to "Register",
+ event_registrant_registration_path(event_id: event),
+ class: "btn btn-primary-outline" %>
+ <% else %>
+ Registration closed
+ <% end %>
+
+ <% if registered %>
+
+ You are registered!
+
+ <% end %>
+
+
+
+ <% if registered %>
+ <%= event.calendar_links %>
+ <% end %>
+<% end %>
diff --git a/app/views/events/registrations/create.turbo_stream.erb b/app/views/events/registrations/create.turbo_stream.erb
index 66e116a29..a317c10c2 100644
--- a/app/views/events/registrations/create.turbo_stream.erb
+++ b/app/views/events/registrations/create.turbo_stream.erb
@@ -1,2 +1,3 @@
-<%= turbo_stream.replace dom_id(@event, :card), partial: "events/card", locals: {event: @event} %>
+<%= turbo_stream.replace dom_id(@event, :card), partial: "events/card", locals: { event: @event } %>
+<%= turbo_stream.replace dom_id(@event, :registration_section), partial: "events/registration_section", locals: { event: @event.decorate } %>
<%= turbo_stream.replace "flash_now", partial: "shared/flash_messages" %>
diff --git a/app/views/events/registrations/destroy.turbo_stream.erb b/app/views/events/registrations/destroy.turbo_stream.erb
index 66e116a29..a317c10c2 100644
--- a/app/views/events/registrations/destroy.turbo_stream.erb
+++ b/app/views/events/registrations/destroy.turbo_stream.erb
@@ -1,2 +1,3 @@
-<%= turbo_stream.replace dom_id(@event, :card), partial: "events/card", locals: {event: @event} %>
+<%= turbo_stream.replace dom_id(@event, :card), partial: "events/card", locals: { event: @event } %>
+<%= turbo_stream.replace dom_id(@event, :registration_section), partial: "events/registration_section", locals: { event: @event.decorate } %>
<%= turbo_stream.replace "flash_now", partial: "shared/flash_messages" %>
diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb
index dacb78a2c..91cc29c9e 100644
--- a/app/views/events/show.html.erb
+++ b/app/views/events/show.html.erb
@@ -34,38 +34,7 @@
<%= @event.labelled_cost %>
<% end %>
-
-
-
- <% registered = @event.event_registrations.exists?(registrant_id: current_user&.id) %>
-
- <% if registered %>
- <%= button_to "De-register",
- event_registrant_registration_path(event_id: @event),
- method: :delete,
- data: {
- turbo_confirm: "Are you sure?",
- },
- class: "btn btn-secondary-outline" %>
- <% elsif @event.registerable? %>
- <%= button_to "Register",
- event_registrant_registration_path(event_id: @event),
- class: "btn btn-primary-outline" %>
- <% else %>
- Registration closed
- <% end %>
-
- <% if registered %>
-
- You are registered!
-
- <% end %>
-
-
- <% if registered %>
-
<%= @event.calendar_links %>
- <% end %>
-
+ <%= render "events/registration_section", event: @event %>
<% if @event.registration_close_date %>
diff --git a/spec/system/events_show_spec.rb b/spec/system/events_show_spec.rb
index ff0efefdf..2b4dcb424 100644
--- a/spec/system/events_show_spec.rb
+++ b/spec/system/events_show_spec.rb
@@ -130,6 +130,47 @@
end
end
+ # --------------------------------------------------
+ # REGISTRATION BUTTON UPDATES VIA TURBO
+ # --------------------------------------------------
+
+ describe "registration button updates via Turbo", js: true do
+ before { driven_by(:selenium_chrome_headless) }
+
+ it "updates Register to De-register and shows badge without full page reload" do
+ sign_in(user)
+ visit event_path(event)
+
+ expect(page).to have_button("Register")
+ expect(page).not_to have_text("You are registered!")
+
+ click_button "Register"
+
+ # Turbo stream replaces the registration section; we stay on the event page
+ expect(page).to have_current_path(event_path(event))
+ expect(page).to have_button("De-register")
+ expect(page).to have_text("You are registered!")
+ expect(page).not_to have_button("Register")
+ end
+
+ it "updates De-register back to Register after de-registering" do
+ create(:event_registration, event: event, registrant: user)
+
+ sign_in(user)
+ visit event_path(event)
+
+ expect(page).to have_button("De-register")
+ accept_confirm do
+ click_button "De-register"
+ end
+
+ expect(page).to have_current_path(event_path(event))
+ expect(page).to have_button("Register")
+ expect(page).not_to have_button("De-register")
+ expect(page).not_to have_text("You are registered!")
+ end
+ end
+
# --------------------------------------------------
# REGISTRATION CLOSE DATE SECTION
# --------------------------------------------------