From 85b3a3f89e074cc936df38557b695871d2cb1ce2 Mon Sep 17 00:00:00 2001
From: efim
Date: Sat, 25 Nov 2023 08:42:13 +0000
Subject: [PATCH] feat: separate 'speaker controls'
specifically for 'i have finished speaking' and not allowing to change
the state
---
routes/room_page.go | 63 +++++++++++-----
routes/room_page_templates_preview.go | 3 +
routes/static/out.css | 5 ++
routes/templates/room.gohtml | 103 +++++++++++++++-----------
4 files changed, 111 insertions(+), 63 deletions(-)
diff --git a/routes/room_page.go b/routes/room_page.go
index c68b70b..47413ac 100644
--- a/routes/room_page.go
+++ b/routes/room_page.go
@@ -41,6 +41,8 @@ func registerPageRoutes(
http.StripPrefix(subscribeRoomPath, streamingRoomStates(templateFs, roomsM))))
http.HandleFunc("/rooms/preview-templates", roomTemplatesPreview(templateFs))
+
+ http.HandleFunc("/rooms/speakerControls", speakerControlsRoute(templateFs))
}
func streamingRoomStates(
@@ -77,7 +79,7 @@ func streamingRoomStates(
roomStream := roomsM.Subscribe(r.Context(), roomName)
for room := range roomStream {
// log.Printf("/rooms/streamingRoom iterating with %+v", room)
- fmt.Fprint(w, "data: ")
+ fmt.Fprint(w, "event: roomTableUpdate\ndata: ")
var buffer bytes.Buffer
@@ -96,6 +98,11 @@ func streamingRoomStates(
fmt.Fprint(w, "\n\n")
w.(http.Flusher).Flush()
+ if session.PersonId == room.CurrentSpeaker {
+ log.Printf("/rooms/subscribe sending 'become-speaker' to %s", session.PersonId)
+ fmt.Fprint(w, "event: become-speaker\ndata:yo\n\n")
+ w.(http.Flusher).Flush()
+ }
}
}
}
@@ -119,8 +126,10 @@ func raiseGestureHandRoute(
// TODO return error i guess
return
}
+ var room rooms.Room
err = roomsM.Update(r.Context(), session.RoomId, func(fromRoom rooms.Room) (toRoom rooms.Room) {
toRoom = fromRoom.RaiseHand(session.PersonId, selectedGesture)
+ room = toRoom
return toRoom
})
if err != nil {
@@ -132,19 +141,24 @@ func raiseGestureHandRoute(
tmpl := template.Must(
template.New("").ParseFS(templateFs, tableTemplates))
- var gesturesData []GestureData
- for _, gesture := range rooms.GesturesHighToLow {
- gesturesData = append(gesturesData, GestureData{
- Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
- Gesture: gesture,
- IsSelected: selectedGesture == gesture,
- })
- }
- err = tmpl.ExecuteTemplate(w, "controls", &gesturesData)
- if err != nil {
- log.Printf("/rooms/releaseHand error saving hand: %s\n", err)
+ if session.PersonId == room.CurrentSpeaker {
+ tmpl.ExecuteTemplate(w, "speakerControls", nil)
return
- // TODO return error i guess
+ } else {
+ var gesturesData []GestureData
+ for _, gesture := range rooms.GesturesHighToLow {
+ gesturesData = append(gesturesData, GestureData{
+ Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
+ Gesture: gesture,
+ IsSelected: selectedGesture == gesture,
+ })
+ }
+ err = tmpl.ExecuteTemplate(w, "controls", &gesturesData)
+ if err != nil {
+ log.Printf("/rooms/releaseHand error saving hand: %s\n", err)
+ return
+ // TODO return error i guess
+ }
}
}
}
@@ -178,8 +192,8 @@ func releaseHandRoute(
var gesturesData []GestureData
for _, gesture := range rooms.GesturesHighToLow {
gesturesData = append(gesturesData, GestureData{
- Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
- Gesture: gesture,
+ Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
+ Gesture: gesture,
IsSelected: false,
})
}
@@ -192,7 +206,6 @@ func releaseHandRoute(
}
}
-
func roomPageRoute(
templateFs *embed.FS,
roomsM rooms.RoomManager,
@@ -236,8 +249,8 @@ func roomPageRoute(
selectedGesture, isSelected := room.ParticipantHands[session.PersonId]
for _, gesture := range rooms.GesturesHighToLow {
gesturesData = append(gesturesData, GestureData{
- Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
- Gesture: gesture,
+ Url: fmt.Sprintf("%s%d", raiseHandPath, gesture),
+ Gesture: gesture,
IsSelected: isSelected && selectedGesture == gesture,
})
}
@@ -269,8 +282,18 @@ func roomPageRoute(
}
}
+func speakerControlsRoute(
+ templateFs *embed.FS,
+) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ templateFile := "templates/room.gohtml"
+ tmpl := template.Must(template.ParseFS(templateFs, templateFile))
+ tmpl.ExecuteTemplate(w, "speakerControls", nil)
+ }
+}
+
type GestureData struct {
- Url string
- Gesture rooms.HandGesture
+ Url string
+ Gesture rooms.HandGesture
IsSelected bool
}
diff --git a/routes/room_page_templates_preview.go b/routes/room_page_templates_preview.go
index fb4ef6b..0254bbd 100644
--- a/routes/room_page_templates_preview.go
+++ b/routes/room_page_templates_preview.go
@@ -57,6 +57,9 @@ func (r *roomTableData) Tangens() float64 {
}
return math.Tan(math.Pi / float64(r.Total())) // Math.tan(Math.PI/m);
}
+func (r *roomTableData) IsViewerTheSpeaker() bool {
+ return r.currentPerson == r.CurrentSpeaker
+}
type arrowData struct {
IsVisible bool
diff --git a/routes/static/out.css b/routes/static/out.css
index cdaa914..cbb908e 100644
--- a/routes/static/out.css
+++ b/routes/static/out.css
@@ -734,6 +734,11 @@ video {
background-color: hsl(var(--color) / 0.5);
}
+.bg-blue-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(219 234 254 / var(--tw-bg-opacity));
+}
+
.bg-green-300 {
--tw-bg-opacity: 1;
background-color: rgb(134 239 172 / var(--tw-bg-opacity));
diff --git a/routes/templates/room.gohtml b/routes/templates/room.gohtml
index be677c2..7651283 100644
--- a/routes/templates/room.gohtml
+++ b/routes/templates/room.gohtml
@@ -26,54 +26,71 @@
{{ define "main-content" }}
-
-
-
- {{/* This is dynamic table, updated from SSE */}}
-
+
- {{ block "simpleRoomShow" .Room }}
-
-
-
-
- {{ template "roomPeople" . }}
-
+ sse-connect="/rooms/subscribe?roomName={{ .Room.Name }}">
+ {{/* This is dynamic table, updated from SSE */}}
+
+ {{ block "simpleRoomShow" .Room }}
+
+
+
+
+ {{ template "roomPeople" . }}
- {{ end }}
- {{/* This is personal hand controls */}}
-
- {{ block "controls" .Gestures }}
- {{ range . }}
+ {{ end }}
+
+ {{/* This is personal hand controls */}}
+ {{ if not .Room.IsViewerTheSpeaker }}
+ {{ block "controls" .Gestures }}
+
+ {{ range . }}
- {{/* expects routes.GestureData */}}
-
+ {{/* expects routes.GestureData */}}
+
- {{ end }}
- {{ end }}
-
-
+ {{ end }}
+
+ {{ end }}
+ {{ else }}
+ {{ block "speakerControls" . }}
+
+
+
+ {{ end }}
+ {{ end }}
{{ end }}