Draft: big refactor
This commit is contained in:
89
plays/joinRoom.go
Normal file
89
plays/joinRoom.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package plays
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"gitea.konchin.com/ytshih/inp2025/game/types"
|
||||
ea "github.com/charmbracelet/bubbletea"
|
||||
)
|
||||
|
||||
type JoinRoom struct {
|
||||
*Base
|
||||
rooms []types.Room
|
||||
cursor int
|
||||
choice *types.Room
|
||||
}
|
||||
|
||||
func NewJoinRoom(base *Base, rooms []types.Room) *JoinRoom {
|
||||
return &JoinRoom{
|
||||
Base: base,
|
||||
rooms: rooms,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *JoinRoom) Init() ea.Cmd {
|
||||
return ea.ClearScreen
|
||||
}
|
||||
|
||||
func (m *JoinRoom) Update(msg ea.Msg) (ea.Model, ea.Cmd) {
|
||||
switch msg := msg.(type) {
|
||||
case ea.KeyMsg:
|
||||
switch msg.String() {
|
||||
case "ctrl+c", "q":
|
||||
return m, ea.Quit
|
||||
case "enter":
|
||||
if m.cursor < len(m.rooms) {
|
||||
m.choice = &m.rooms[m.cursor]
|
||||
}
|
||||
return m, ea.Quit
|
||||
case "up":
|
||||
if m.cursor > 0 {
|
||||
m.cursor--
|
||||
}
|
||||
case "down":
|
||||
if m.cursor < len(m.rooms)-1 {
|
||||
m.cursor++
|
||||
}
|
||||
}
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (m *JoinRoom) View() string {
|
||||
var b strings.Builder
|
||||
b.WriteString("Select a room to join:\n\n")
|
||||
|
||||
for i, room := range m.rooms {
|
||||
if m.cursor == i {
|
||||
b.WriteString("(•) ")
|
||||
} else {
|
||||
b.WriteString("( ) ")
|
||||
}
|
||||
b.WriteString(room.View() + "\n")
|
||||
}
|
||||
|
||||
return b.String()
|
||||
}
|
||||
|
||||
func (m *JoinRoom) Next(queue *[]*ea.Program) error {
|
||||
if m.choice == nil {
|
||||
*queue = append(*queue, ea.NewProgram(NewLobby(m.Base)))
|
||||
return nil
|
||||
}
|
||||
|
||||
resp, err := m.Base.client.R().
|
||||
SetResult(&types.Room{}).
|
||||
Post(fmt.Sprintf("/api/rooms/%s/join", m.choice.ID))
|
||||
|
||||
if err != nil || resp.StatusCode() != http.StatusOK {
|
||||
*queue = append(*queue, ea.NewProgram(NewRedirect("Failed to join room")))
|
||||
*queue = append(*queue, ea.NewProgram(NewLobby(m.Base)))
|
||||
return nil
|
||||
}
|
||||
|
||||
room := resp.Result().(*types.Room)
|
||||
*queue = append(*queue, ea.NewProgram(NewRoomWaiting(m.Base, room.ID)))
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user