package component import ( "bytes" "context" "fmt" "forge.cadoles.com/wpetit/kouiz/internal/http/form" common "forge.cadoles.com/wpetit/kouiz/internal/http/handler/webui/common/component" "forge.cadoles.com/wpetit/kouiz/internal/store" "github.com/pkg/errors" "github.com/yuin/goldmark" "log/slog" "slices" "strconv" "time" ) type QuizPageVModel struct { Player *store.Player CurrentTurn *store.QuizTurn PlayDelay time.Duration IsOffDay bool } func NewSelectEntryForm() *form.Form { return form.New( form.NewField( "entry", form.Attrs{}, form.NonEmpty("Ce champ ne doit pas être vide."), ), ) } func NewAnswerForm() *form.Form { return form.New( form.NewField( "answer", form.Attrs{}, form.NonEmpty("Ce champ ne doit pas être vide."), ), ) } templ QuizPage(vmodel QuizPageVModel) { @common.AppPage(common.WithPageOptions( common.WithTitle(fmt.Sprintf("Tour #%d", vmodel.CurrentTurn.ID)), )) {

Tour #{ strconv.FormatUint(uint64(vmodel.CurrentTurn.ID), 10) }

if vmodel.IsOffDay {

Jeu désactivé aujourd'hui

Désolé, le jeu est désactivé pour la journée. Revenez prochainement pour le prochain tour !

} else if vmodel.Player.PlayedAt.After(vmodel.CurrentTurn.StartedAt) {

En attente du prochain tour

Il commencera dans { vmodel.CurrentTurn.EndedAt.Local().Sub(time.Now().Local()).Round(time.Second).String() }.

} else if vmodel.Player.SelectedEntry == nil || vmodel.Player.SelectedTurn == nil || *vmodel.Player.SelectedTurn != vmodel.CurrentTurn.ID { @QuizQuestionSelector(vmodel) } else { @QuizQuestion(vmodel) } } } templ QuizQuestionSelector(vmodel QuizPageVModel) {

Choisissez votre prochaine question

Attention, une fois la thématique sélectionnée vous aurez { vmodel.PlayDelay.String() } pour répondre. Faites le bon choix !

for _, entry := range vmodel.CurrentTurn.Entries {

{ entry.Category.Theme }

{ entry.Category.Name }

{ entry.Category.Description }

{ store.DifficultyLevel(entry.Level) }
+{ strconv.FormatInt(int64((entry.Level+1)*2), 10) } points

}
} templ QuizQuestion(vmodel QuizPageVModel) { {{ selectedEntryIndex := slices.IndexFunc(vmodel.CurrentTurn.Entries, func(e *store.QuizEntry) bool { return vmodel.Player.SelectedEntry != nil && *vmodel.Player.SelectedEntry == e.ID }) }} {{ selectedEntry := vmodel.CurrentTurn.Entries[selectedEntryIndex] }}

{ selectedEntry.Question }

{ selectedEntry.Category.Name } - { selectedEntry.Category.Theme }

for index, proposition := range selectedEntry.Propositions {

{ strconv.FormatInt(int64(index), 10) }. { proposition }

}
{{ remainingSeconds := vmodel.Player.SelectedAt.Add(vmodel.PlayDelay).Sub(time.Now().UTC()).Seconds() }} } func markdownToHTML(ctx context.Context, text string) string { var buff bytes.Buffer if err := goldmark.Convert([]byte(text), &buff); err != nil { slog.ErrorContext(ctx, "could not convert markdown to html", slog.Any("error", errors.WithStack(err))) return "" } return buff.String() }