diff --git a/app/assets/stylesheets/events.css b/app/assets/stylesheets/events.css index c7ca9a056..bc7181f4d 100644 --- a/app/assets/stylesheets/events.css +++ b/app/assets/stylesheets/events.css @@ -11,3 +11,7 @@ font-size: var(--font-size-small); } } + +.events--none { + padding: calc(3 * var(--block-space)); +} diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 0d75cf63f..fba345a32 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -22,4 +22,8 @@ module EventsHelper 1 end end + + def event_next_page_link(next_day) + tag.div id: "next_page", data: { controller: "fetch-on-visible", fetch_on_visible_url_value: events_path(day: next_day) } + end end diff --git a/app/javascript/controllers/fetch_on_visible_controller.js b/app/javascript/controllers/fetch_on_visible_controller.js new file mode 100644 index 000000000..a486fc4b4 --- /dev/null +++ b/app/javascript/controllers/fetch_on_visible_controller.js @@ -0,0 +1,28 @@ +import { Controller } from "@hotwired/stimulus" +import { get } from "@rails/request.js" + +export default class extends Controller { + static values = { url: String } + + connect() { + this.#observe() + } + + #observe() { + const observer = new IntersectionObserver((entries) => { + const visible = !!entries.find(entry => entry.isIntersecting) + if (visible) { + this.#fetch() + } + }) + + observer.observe(this.element) + } + + async #fetch() { + const resp = await get(this.urlValue, { responseKind: "turbo-stream" }) + const html = await resp.html + + Turbo.renderStreamMessage(html) + } +} diff --git a/app/views/events/_day.html.erb b/app/views/events/_day.html.erb new file mode 100644 index 000000000..865ef94a0 --- /dev/null +++ b/app/views/events/_day.html.erb @@ -0,0 +1,13 @@ +
No activity for this day.
+<% end %> diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb index ee8f75034..3f6f45024 100644 --- a/app/views/events/index.html.erb +++ b/app/views/events/index.html.erb @@ -17,12 +17,8 @@ <% end %> -