R/turbo-listener.R

Defines functions turbo_listener

Documented in turbo_listener

#' @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"),
    ...
  )

}
tjpalanca/hotwire.R documentation built on Dec. 23, 2021, 10:59 a.m.