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 }