renderUI and uiOutput Example Code

library(shiny)
library(bs4Dash)

new_message <- data.frame(
  message = "New message",
  from = "Paul",
  time = "yesterday",
  color = "success"
)

shinyApp(
  ui = dashboardPage(
    dark = FALSE,
    header = dashboardHeader(
      rightUi = uiOutput("messages", container = tags$li)
    ),
    sidebar = dashboardSidebar(),
    controlbar = dashboardControlbar(),
    footer = dashboardFooter(),
    title = "test",
    body = dashboardBody(actionButton("add", "Add message"))
  ),
  server = function(input, output) {
    
    messages <- reactiveValues(
      items = data.frame(
        message = rep("A message", 10),
        from = LETTERS[1:10],
        time = rep("yesterday", 10),
        color = rep("success", 10)
      )
    )
    
    observeEvent(input$add, {
      messages$items <- rbind(messages$items, new_message)
    })
    
    output$messages <- renderUI({
      lapply(seq_len(nrow(messages$items)), function(i) {
        items_i <- messages$items[i, ]
        bs4Dash::messageItem(
          message = items_i$message,
          from = items_i$from,
          time = items_i$time,
          color = items_i$color
        )
      }) |>
        c(badgeStatus = "danger",
          type = "messages") |>
        do.call(what = "dropdownMenu")
    })
  }
)