This commit is contained in:
2026-03-23 21:13:38 +08:00
parent 5210b8309f
commit 632a0267a4
4 changed files with 498 additions and 76 deletions

View File

@@ -4,6 +4,8 @@ import { useRouter } from 'vue-router'
import { AuthExpiredError, type AuthSession } from '../api/authed-request'
import { createRoom, joinRoom, listRooms, type RoomItem } from '../api/mahjong'
import { getUserInfo, type UserInfo } from '../api/user'
import { hydrateActiveRoomFromSelection } from '../state/active-room'
import type { RoomPlayerState } from '../state/active-room'
import type { StoredAuth } from '../types/session'
import { clearAuth, readStoredAuth, writeStoredAuth } from '../utils/auth-storage'
@@ -121,6 +123,16 @@ function isMyRoom(room: RoomItem): boolean {
return Boolean(currentUserId.value) && room.owner_id === currentUserId.value
}
function mapRoomPlayers(room: RoomItem): RoomPlayerState[] {
return (room.players ?? [])
.map((item, fallbackIndex) => ({
index: Number.isFinite(item.index) ? item.index : fallbackIndex,
playerId: item.player_id,
ready: Boolean(item.ready),
}))
.filter((item) => Boolean(item.playerId))
}
function toSession(source: StoredAuth): AuthSession {
return {
token: source.token,
@@ -220,6 +232,18 @@ async function submitCreateRoom(): Promise<void> {
)
createdRoom.value = room
hydrateActiveRoomFromSelection({
roomId: room.room_id,
roomName: room.name,
gameType: room.game_type,
ownerId: room.owner_id,
maxPlayers: room.max_players,
playerCount: room.player_count,
status: room.status,
createdAt: room.created_at,
updatedAt: room.updated_at,
players: mapRoomPlayers(room),
})
quickJoinRoomId.value = room.room_id
createRoomForm.value.name = ''
showCreateModal.value = false
@@ -251,18 +275,27 @@ async function handleJoinRoom(room?: { roomId?: string; roomName?: string }): Pr
return
}
const targetRoomName =
room?.roomName ?? rooms.value.find((item) => item.room_id === targetRoomId)?.name ?? ''
roomSubmitting.value = true
try {
await joinRoom(session, { roomId: targetRoomId }, syncAuth)
quickJoinRoomId.value = targetRoomId
successMessage.value = `已加入房间:${targetRoomId}`
const joinedRoom = await joinRoom(session, { roomId: targetRoomId }, syncAuth)
hydrateActiveRoomFromSelection({
roomId: joinedRoom.room_id,
roomName: joinedRoom.name,
gameType: joinedRoom.game_type,
ownerId: joinedRoom.owner_id,
maxPlayers: joinedRoom.max_players,
playerCount: joinedRoom.player_count,
status: joinedRoom.status,
createdAt: joinedRoom.created_at,
updatedAt: joinedRoom.updated_at,
players: mapRoomPlayers(joinedRoom),
})
quickJoinRoomId.value = joinedRoom.room_id
successMessage.value = `已加入房间:${joinedRoom.room_id}`
await refreshRooms()
await router.push({
path: `/game/chengdu/${targetRoomId}`,
query: targetRoomName ? { roomName: targetRoomName } : undefined,
path: `/game/chengdu/${joinedRoom.room_id}`,
query: joinedRoom.name ? { roomName: joinedRoom.name } : undefined,
})
} catch (error) {
if (error instanceof AuthExpiredError) {
@@ -298,6 +331,18 @@ async function enterCreatedRoom(): Promise<void> {
}
showCreatedModal.value = false
hydrateActiveRoomFromSelection({
roomId: createdRoom.value.room_id,
roomName: createdRoom.value.name,
gameType: createdRoom.value.game_type,
ownerId: createdRoom.value.owner_id,
maxPlayers: createdRoom.value.max_players,
playerCount: createdRoom.value.player_count,
status: createdRoom.value.status,
createdAt: createdRoom.value.created_at,
updatedAt: createdRoom.value.updated_at,
players: mapRoomPlayers(createdRoom.value),
})
await router.push({
path: `/game/chengdu/${createdRoom.value.room_id}`,
query: { roomName: createdRoom.value.name },