Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inputs and outputs don't work correctly when a modal fires too quickly after a closed modal #48

Closed
daattali opened this issue Feb 22, 2021 · 3 comments

Comments

@daattali
Copy link
Owner

Related to #46

In the following example, a modal is opened, closed, and another modal with a shiny input immediately opens. The input doesn't get bound to shiny (same thing happens with outputs).

library(shiny)

ui <- fluidPage(
  actionButton("go", "go")
)

server <- function(input, output, session) {
  observeEvent(input$go, {
    shinyalert::shinyalert("test 1")
    shinyalert::closeAlert()
    shinyalert::shinyalert("test 2", textInput("text", "text", "test"), html = TRUE)
  })
  
  observe({
    message(input$text)
  })
}

shinyApp(ui, server)

If I add a 500ms delay (either using Sys.sleep() or shinyjs::delay()) after closing the first modal but before showing the second, then the input binding works.

@daattali daattali added the bug label Feb 22, 2021
@ghost
Copy link

ghost commented Aug 24, 2021

I am having a similar issue when creating an authentication interface. Basically, I ask an user for ID and password, then trigger another reactive to validate the ID & password. If the validation fails, I trigger the shinyalert that asked for the ID and password to begin with. I noticed that, if a new value is entered, then the values in input do not get updated.

For example:

  • ID and password entered are: 'x', '123'
  • After clicking the "Ok" button: we have input$id return 'x' and input$password return '123';
  • Ask user to enter ID and password again use the same shinyalert. New ID and password entered are: 'y', '000'
  • After clicking the "Ok" button: we have input$id still return 'x' and input$password still return 123

@daattali
Copy link
Owner Author

Yes this is a known issue

@ch0c0l8ra1n
Copy link
Contributor

ch0c0l8ra1n commented Mar 20, 2024

The problem lies in swalservice. The way this.__swal.close is defined creates problems when you try to close and open up another sweetalert immediately. Specifically the settimeout. It's trigerring the close function after the 2nd shinyalert is already starting to initialize.

initialize: function() {
  var service = this;
  var originalClose = this.__swal.close;
  this.__swal.close = function() {
    service.isClosing = true;
    originalClose();
    service.currentSwal = null;
    setTimeout(function() {
      service.onClosed();
    }, 400);
  };
}

I can have a PR sent with this fixed but once again, this involves modifying the underlying sweetalert source.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants