package pages import ( "fmt" "github.com/ryanhamamura/c4/features/common/components" "github.com/ryanhamamura/c4/features/common/layouts" snakecomponents "github.com/ryanhamamura/c4/features/snakegame/components" "github.com/ryanhamamura/c4/snake" "github.com/starfederation/datastar-go/datastar" ) // keydownScript builds the inline JS for a single data-on:keydown handler // that dispatches WASD/arrow keys to direction POST endpoints. func keydownScript(gameID string) string { return fmt.Sprintf( "const k=evt.key;"+ "if(k==='w'||k==='ArrowUp'){evt.preventDefault();%s}"+ "else if(k==='s'||k==='ArrowDown'){evt.preventDefault();%s}"+ "else if(k==='a'||k==='ArrowLeft'){evt.preventDefault();%s}"+ "else if(k==='d'||k==='ArrowRight'){evt.preventDefault();%s}", datastar.PostSSE("/snake/%s/dir?d=0", gameID), datastar.PostSSE("/snake/%s/dir?d=1", gameID), datastar.PostSSE("/snake/%s/dir?d=2", gameID), datastar.PostSSE("/snake/%s/dir?d=3", gameID), ) } templ GamePage(sg *snake.SnakeGame, mySlot int, messages []snakecomponents.ChatMessage, gameID string) { @layouts.Base("Snake") {
@components.BackToLobby()

~~~~

@snakecomponents.PlayerList(sg, mySlot) @snakecomponents.StatusBanner(sg, mySlot, gameID) if sg.Status == snake.StatusInProgress || sg.Status == snake.StatusFinished { if sg.Mode == snake.ModeMultiplayer {
@snakecomponents.Board(sg) @snakecomponents.Chat(messages, gameID)
} else { @snakecomponents.Board(sg) } } else if sg.Mode == snake.ModeMultiplayer { @snakecomponents.Chat(messages, gameID) } if sg.Mode == snake.ModeMultiplayer && (sg.Status == snake.StatusWaitingForPlayers || sg.Status == snake.StatusCountdown) { @snakecomponents.InviteLink(gameID) }
} } templ JoinPage(gameID string) { @layouts.Base("Snake - Join") { @components.GameJoinPrompt( fmt.Sprintf("/login?return_url=/snake/%s", gameID), fmt.Sprintf("/register?return_url=/snake/%s", gameID), fmt.Sprintf("/snake/%s", gameID), ) } } templ NicknamePage(gameID string) { @layouts.Base("Snake - Join") { @components.NicknamePrompt(fmt.Sprintf("/snake/%s/join", gameID)) } }