|
- library(shiny)
- library(frappeCharts)
-
- options(scipen = 1e3)
-
- typingSpeedInput <- function(inputId, label, placeholder = NULL) {
- .label <- label
- htmltools::withTags(
- div(
- class = "form-group typing-speed",
- label(class = "control-label", `for` = inputId, .label),
- textarea(id = inputId, class = "form-control", placeholder = placeholder),
- htmltools::htmlDependency(
- name = "typingSpeed",
- version = "0.0.1",
- src = ".",
- script = "typing.js",
- all_files = FALSE
- )
- )
- )
- }
-
- resetTypingSpeed <- function(inputId, session = getDefaultReactiveDomain()) {
- session$sendInputMessage("typing", TRUE)
- }
-
- ui <- fluidPage(
- # textAreaInput("typing", "Type here..."),
- typingSpeedInput("typing", "Type here..."),
- actionButton("reset", "Reset"),
- frappeCharts::frappeChartOutput("chart_typing_speed")
- # verbatimTextOutput("debug")
- )
-
- server <- function(input, output, session) {
- output$debug <- renderPrint({
- str(list(typing = input$typing, typing_reset = input$typing_reset))
- })
-
- observeEvent(input$reset, {
- resetTypingSpeed("typing")
- })
-
- wpm <- reactiveValues(time = c(), wpm = c())
-
- observeEvent(input$typing_reset, {
- wpm$time <- c()
- wpm$wpm <- c()
- })
-
- observeEvent(input$typing, {
- req(input$typing)
- wpm$time <- c(wpm$time, input$typing$time)
- wpm$wpm <- c(wpm$wpm, input$typing$wpm)
- })
-
- output$chart_typing_speed <- frappeCharts::renderFrappeChart({
- frappeCharts::frappeChart(
- data.frame(time = 0, wpm = 0),
- type = "line",
- title = "Your Typing Speed",
- is_navigable = FALSE,
- axisOptions = list(xIsSeries = TRUE),
- lineOptions = list(regionFill = TRUE)
- )
- })
-
- observeEvent(wpm$time, {
- frappeCharts::updateFrappeChart(
- inputId = "chart_typing_speed",
- data = data.frame(time = wpm$time, wpm = wpm$wpm)
- )
- })
- }
-
- shinyApp(ui, server)
|