R/turbo-assets.R

Defines functions turbo_assets

Documented in turbo_assets

#' @title Turbo CSS/JS dependencies
#'
#' @description Generates the Turbo JS dependencies with specific configurations
#' applied. Include this in any page to enable Turbo functionality in it.
#'
#' @param root          (str) path of the turbo root
#' @param libs          (str) path of the libraries
#' @param force_reload  (flg) whether this page will force a reload
#' @param progress_bar  (flg) whether progress bar is visible
#' @param pb_height     (css) height of progress bar (top)
#' @param pb_delay      (int) milliseconds of delay before progress bar appears
#' @param pb_color      (css) color fo the progress bar
#' @param cache_control (str) whether to avoid previewing or caching the page
#' @param turbo_opt_in  (flg) if TRUE, then turbo is disabled across the page
#' @param turbo_socket  (flg) add the turbo web socket
#' @param app_version   (str) a string indicating the version, or NA to
#'                            disable; used to force reload when assets change
#'
#' @family Turbo
#' @export
turbo_assets <- function(root          = NULL,
                         libs          = "assets",
                         force_reload  = FALSE,
                         progress_bar  = TRUE,
                         pb_height     = "5px",
                         pb_color      = "#008080",
                         pb_delay      = 500,
                         cache_control = c("no-preview", "no-cache"),
                         turbo_opt_in  = FALSE,
                         turbo_socket  = TRUE,
                         app_version   = NA_character_) {

  assert_string(app_version, na.ok = TRUE)
  assert_string(root, null.ok = TRUE)
  assert_string(libs, null.ok = TRUE)
  assert_flag(force_reload)
  assert_flag(progress_bar)
  assert_flag(turbo_socket)
  cache_control <- match_arg(cache_control)

  tagList(
    html_dependency(
      name    = "turbo",
      version = "7.0.0",
      src     = "turbo",
      script  = list(src = "dist/turbo.es2017-esm.js", type = "module"),
      package = pkg_name,
      meta    = list() %>%
        when(!is.null(root),
             append(., list(`turbo-root` = root))) %>%
        when(force_reload,
             append(., list(`turbo-visit-control` = "reload"))) %>%
        when(!is.null(cache_control),
             append(., list(`turbo-cache-control` = cache_control)))
    ),
    if (progress_bar) {
      html_tags(head(style(HTML(paste(
        ".turbo-progress-bar {",
        css(
          height = validateCssUnit(pb_height),
          background_color = parseCssColors(pb_color)
        ),
        "}",
        collapse = "/"
      )))))
    } else {
      html_tags(head(style(HTML(
        ".turbo-progress-bar { visibility: hidden; }"
      ))))
    },
    if (turbo_socket) {
      tagList(
        html_dependency(
          name    = "turbo-webtools",
          version = pkg_vers(),
          src     = "turbo-webtools",
          script  = list(src = "socket.js", type = "module"),
          package = pkg_name
        ),
        html_script(
          type      = "module",
          file      = pkg_inst("turbo-webtools/main.js"),
          libs      = libs %||% "",
          version   = pkg_vers(),
          singleton = TRUE,
          head      = TRUE
        )
      )
    },
    html_script(
      text = "
      if (typeof(Turbo) == 'undefined') {
        document.addEventListener('DOMContentLoaded', function() {
          Turbo.session.drive = {{turbo_opt_in}};
        });
      } else {
        Turbo.session.drive = {{turbo_opt_in}};
      }
      ",
      turbo_opt_in = if (turbo_opt_in) "false" else "true",
      singleton    = TRUE
    ),
    html_script(
      text = "
        if (typeof(Turbo) == 'undefined') {
          document.addEventListener('DOMContentLoaded', function() {
            Turbo.setProgressBarDelay({{pb_delay}});
          });
        } else {
          Turbo.setProgressBarDelay({{pb_delay}});
        }
      ",
      pb_delay = pb_delay,
      singleton = TRUE
    ),
    if (!is.na(app_version)) {
      html_dependency(
        name       = "turbo-app-version",
        version    = app_version,
        src        = "turbo-app-version",
        script     = list(src = "version.js", `data-turbo-track` = "reload"),
        package    = pkg_name,
        all_files  = FALSE
      )
    }
  )

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