Я использую куки в своем блестящем приложении. Но есть проблема в том, что после того, как cookie установлен в браузере и обновлена страница, cookie сначала не найден. Вы можете увидеть это в примере приложения: после нажатия кнопки «Войти» устанавливается cookie со значением «admin». При нажатии кнопки «Обновить» наблюдатель запускает проверку файлов cookie дважды: в первый раз файл cookie не обнаруживается, только во второй раз файл cookie обнаруживается. Что не так с моей реализацией?
library(shiny)
library(shinyjs)
jsCode <- '
shinyjs.getcookie = function(params) {
var cookie = Cookies.get("id");
if (typeof cookie !== "undefined") {
Shiny.onInputChange("jscookie", cookie);
}
}
shinyjs.setcookie = function(params) {
Cookies.set("id", escape(params), { expires: 0.5 });
Shiny.onInputChange("jscookie", params);
}
shinyjs.rmcookie = function(params) {
Cookies.remove("id");
Shiny.onInputChange("jscookie", "");
}
shinyjs.reload = function() {
history.go(0);
}
'
ui <- fluidPage(
shinyjs::useShinyjs(),
shinyjs::extendShinyjs(text = jsCode),
tags$head(
tags$script(src = "https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js")
),
uiOutput("ui"),
actionButton("login", "login"),
actionButton("logout", "logout"),
actionButton("reload", "reload page")
)
server <- function(input, output, session) {
user <- reactiveVal(NULL)
observe({
output$ui <- renderUI({
h1(paste0("Hello ", user()))
})
})
observe({
print("Checking for cookie")
js$getcookie()
print(input$jscookie)
if (!is.null(input$jscookie) && input$jscookie != "") {
print("Cookie found")
user(input$jscookie)
} else {
print("No cookie found")
user(NULL)
}
})
observeEvent(input$login, {
print("login")
js$setcookie("admin")
})
observeEvent(input$logout, {
print("logout")
js$rmcookie()
})
observeEvent(input$reload, {
print("refresh")
js$reload()
})
}
shinyApp(ui, server)