## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----eval = FALSE-------------------------------------------------------------
# library(shiny)
# library(shinysnap)
# 
# ui <- fluidPage(
#   sliderInput("n", "Sample size", 10, 500, 100),
#   selectInput("model", "Model", c("simple", "complex")),
#   uiOutput("model_inputs"),
#   snap_download_button("save"),
#   snap_file_input("restore")
# )
# 
# server <- function(input, output, session) {
#   snap_enable(app = "demo", version = "1.0.0")
# 
#   output$model_inputs <- renderUI({
#     if (input$model == "simple") {
#       numericInput("rate", "Rate", 0.05)
#     } else {
#       sliderInput("k", "k", 1, 10, 3)
#     }
#   })
# 
#   snap_download_handler("save")
#   snap_file_restore("restore")
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
library(shinysnap)

snap <- list(
  app = list(name = "demo", version = "1.0.0"),
  created = "2026-09-16T18:22:03Z",
  inputs = list(
    dates = as.Date(c("2024-01-01", "2024-03-01")),
    model = "complex",
    n = 100L,
    rate = 0.025,
    weights = c(0.5, 0.75)
  ),
  values = list(prefs = list(digits = 3L, scientific = FALSE))
)
cat(snap_serialize(snap))

## -----------------------------------------------------------------------------
text <- snap_serialize(snap)
back <- snap_unserialize(text)
str(snap_inputs(back))

## ----eval = FALSE-------------------------------------------------------------
# # Before: a hand-rolled restore (abridged)
# observeEvent(input$restore_file, {
#   saved <- readRDS(input$restore_file$datapath)
#   is_matrix <- vapply(saved$inputs, is.matrix, logical(1))
#   for (id in names(saved$inputs)[!is_matrix]) {
#     session$sendInputMessage(id, list(value = saved$inputs[[id]]))
#   }
#   for (id in names(saved$inputs)[is_matrix]) {
#     updateMatrixInput(session, id, saved$inputs[[id]])
#   }
#   prefs$digits <- saved$prefs$digits
#   prefs$scientific <- if (is.null(saved$prefs$scientific)) FALSE else saved$prefs$scientific
#   # Inputs inside renderUI() do not exist yet: guess how long they take.
#   shinyjs::delay(500, {
#     for (id in c("detail_k", "detail_note")) {
#       if (!is.null(saved$inputs[[id]])) {
#         session$sendInputMessage(id, list(value = saved$inputs[[id]]))
#       }
#     }
#   })
#   shinyjs::delay(1500, {
#     # ... another wave for the inputs that appear after those ...
#   })
# })

## ----eval = FALSE-------------------------------------------------------------
# # After
# snap_enable(app = "myapp", version = "2.4.0", exclude = c("^btn_", "^nav$"))
# snap_track(prefs)
# snap_track(main_options)
# 
# snap_download_handler(c("btn_save_main", "btn_save_details"))
# 
# snap_file_restore(
#   c("btn_restore_main", "btn_restore_details"),
#   validate = function(snap) {
#     if (is.null(snap$inputs$model)) stop("This file was not saved by this app.")
#   },
#   migrate = function(snap, from) {
#     if (is.null(snap$values$prefs$scientific)) snap$values$prefs$scientific <- FALSE
#     snap
#   }
# )

