From 5b2fddddc126f9b1dae9a42994387347ad6bb64b Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 3 Mar 2023 13:15:36 +0100 Subject: [PATCH] lives: Stop existing timer when changing mind --- direct.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/direct.go b/direct.go index 0ccdf8a..d1319d4 100644 --- a/direct.go +++ b/direct.go @@ -309,6 +309,7 @@ func SurveyWSAdmin(c *gin.Context) { go func(c chan WSMessage, sid int) { var v WSMessage var err error + var surveyTimer *time.Timer for { // Reset variable state v.Corrected = false @@ -326,14 +327,24 @@ func SurveyWSAdmin(c *gin.Context) { if survey, err := getSurvey(sid); err != nil { log.Println("Unable to retrieve survey:", err) } else { + // Skip any existing scheduled timer + if surveyTimer != nil { + if !surveyTimer.Stop() { + <-surveyTimer.C + } + surveyTimer = nil + } + survey.Direct = v.QuestionId if v.Timer > 0 { survey.Corrected = false survey.Update() - go func(corrected bool) { - time.Sleep(time.Duration(OffsetQuestionTimer+v.Timer) * time.Millisecond) + // Save corrected state for the callback + corrected := v.Corrected + surveyTimer = time.AfterFunc(time.Duration(OffsetQuestionTimer+v.Timer)*time.Millisecond, func() { + surveyTimer = nil if corrected { survey.Corrected = v.Corrected survey.Update() @@ -347,7 +358,7 @@ func SurveyWSAdmin(c *gin.Context) { survey.WSWriteAll(WSMessage{Action: "pause"}) WSAdminWriteAll(WSMessage{Action: "pause", SurveyId: &survey.Id}) } - }(v.Corrected) + }) v.Corrected = false } else { survey.Corrected = v.Corrected