#' @title
#' Turbo Listener
#'
#' @description
#' Script that attaches a listener to the Turbo Event
#'
#' @param event (str) event to listen for:
#' * `before-visit` - before visiting a location, except when navigating
#' by history.
#' * `event.detail.url` contains the URL
#' * `before-render` - pause rendering and prepare before fetching;
#' useful for animations
#' * `before-fetch-request` - pause rendering and prepare the request;
#' useful for attaching information to request.
#' * `event.detail.url` contains the URL
#' * `event.detail.fetchOptions` contains fetch options
#' * `event.target` - the element that triggered it
#' * `event.detail.resume()` - resumes the request
#' * `click` - when a Turbo-enabled link is clicked
#' * `event.detail.url` contains the URL
#' * cancelling will fall through to normal navigation
#' * `visit` - immediately after a visit starts
#' * `event.detail.url` contains the requested location
#' * `event.detail.action` contains the action
#' * `submit-start` - form submission
#' * `event.detail.formSubmission` - contains the `FormSubmission`
#' * `before-fetch-response` - when the network request completes
#' * `event.detail` - contains fetch options
#' * `event.target` - contains the firing element
#' * `submit-end` - fires after the form submission-initiaited network
#' request completes.
#' * `event.detail.formSubmission` - contains the `FormSubmission`
#' * `event.detail` - `FormSubmissionResult`
#' * `before-cache` - before Turbo saves the current page to cache
#' * `before-render` - before rendering the page.
#' * `event.detail.newBody` - new body elemetn
#' * `event.detail.resume()` - canceling and continuing the rendering
#' * `before-stream-render` - fires before a page update is rendered
#' * `render` - fires after Turbo renders the page, if the page is cached
#' then fires both when rendering cached and fresh version.
#' * `load` - fires after the initial page load and every visit
#' * `event.detail.timing` - visit timings
#' * `frame-render` - fires right after a turbo frame renders
#' * `event.target` - the frame
#' * `event.detail.fetchResponse` - the `FetchResponse` object
#' * `frame-load` - fires when Turbo frame is after `frame-render`
#' * `event.target` - the frame
#' @param ... (arg) passed to [`html_script`]
#' @param code (js) JS code inside the listener (exclude function parts).
#'
#' @family Turbo
#' @export
turbo_listener <- function(event = c("before-visit",
"before-render",
"before-fetch-request",
"click",
"visit",
"submit-start",
"before-fetch_response",
"submit-end",
"before-cache",
"before-render",
"before-stream-render",
"render",
"load",
"frame-render",
"frame-load"),
code,
...) {
event <- match_arg(event)
assert_string(event)
assert_character(code, min.len = 1L)
html_script(
text = "
document.addEventListener(
'turbo:{{event}}',
(event) => {
{{code}}
}
);",
event = event,
code = paste0(code, collapse = "\n"),
...
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.