Add login prompt for game invite links

When unauthenticated users visit a game invite link, show a prompt
with options to log in, register, or continue as guest. After
login/register, redirect back to the original game URL.
This commit is contained in:
Ryan Hamamura
2026-01-22 21:50:50 -10:00
parent 5e1712c4a0
commit dcab4343e5
2 changed files with 78 additions and 2 deletions

54
main.go
View File

@@ -142,7 +142,14 @@ func main() {
c.Session().Set("user_id", user.ID)
c.Session().Set("username", user.Username)
c.Session().Set("nickname", user.Username)
c.Redirect("/")
returnURL := c.Session().GetString("return_url")
if returnURL != "" {
c.Session().Set("return_url", "")
c.Redirect(returnURL)
} else {
c.Redirect("/")
}
})
c.View(func() h.H {
@@ -203,7 +210,14 @@ func main() {
c.Session().Set("user_id", user.ID)
c.Session().Set("username", user.Username)
c.Session().Set("nickname", user.Username)
c.Redirect("/")
returnURL := c.Session().GetString("return_url")
if returnURL != "" {
c.Session().Set("return_url", "")
c.Redirect(returnURL)
} else {
c.Redirect("/")
}
})
c.View(func() h.H {
@@ -226,6 +240,22 @@ func main() {
nickname := c.Signal(sessionNickname)
colSignal := c.Signal(0)
showGuestPrompt := c.Signal(false)
goToLogin := c.Action(func() {
c.Session().Set("return_url", "/game/"+gameID)
c.Redirect("/login")
})
goToRegister := c.Action(func() {
c.Session().Set("return_url", "/game/"+gameID)
c.Redirect("/register")
})
continueAsGuest := c.Action(func() {
showGuestPrompt.SetValue(true)
c.Sync()
})
var gi *game.GameInstance
var gameExists bool
@@ -326,6 +356,14 @@ func main() {
// Need nickname first / not joined yet
if myColor == 0 {
// Unauthenticated user who hasn't chosen to continue as guest
if sessionUserID == "" && !showGuestPrompt.Bool() {
return ui.GameJoinPrompt(
goToLogin.OnClick(),
continueAsGuest.OnClick(),
goToRegister.OnClick(),
)
}
return ui.NicknamePrompt(
nickname.Bind(),
setNickname.OnKeyDown("Enter"),
@@ -643,4 +681,16 @@ const gameCSS = `
font-size: 0.75rem;
color: var(--pico-muted-color);
}
.join-options {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin: 1rem 0;
}
.register-link {
font-size: 0.875rem;
color: var(--pico-muted-color);
}
`