83 lines
2.4 KiB
JavaScript
83 lines
2.4 KiB
JavaScript
const service = require("../../services/game-service");
|
|
|
|
Page({
|
|
data: {
|
|
code: "",
|
|
name: "我",
|
|
avatar: "我",
|
|
preview: null,
|
|
previewHint: "",
|
|
canJoin: false,
|
|
submitting: false
|
|
},
|
|
|
|
onLoad(options) {
|
|
if (options.code) {
|
|
this.setData({ code: options.code });
|
|
this.previewRoom(options.code);
|
|
}
|
|
},
|
|
|
|
onCodeInput(event) {
|
|
const code = event.detail.value.replace(/\D/g, "").slice(0, 6);
|
|
this.setData({ code, preview: null, previewHint: "", canJoin: false });
|
|
if (code.length === 6) this.previewRoom(code);
|
|
},
|
|
|
|
onNameInput(event) {
|
|
const name = event.detail.value;
|
|
this.setData({ name, avatar: name.slice(0, 1) || "?" });
|
|
},
|
|
|
|
previewRoom(code) {
|
|
const preview = service.getRoom(code);
|
|
let previewHint = "";
|
|
let canJoin = false;
|
|
if (!preview) {
|
|
previewHint = "没有找到这个房间,请检查房间码";
|
|
} else if (preview.status === "finished") {
|
|
previewHint = "这场游戏已经结束";
|
|
} else if (preview.status === "cancelled") {
|
|
previewHint = "房间已被房主取消";
|
|
} else if (preview.status !== "waiting") {
|
|
previewHint = "游戏已经开始,暂时无法加入";
|
|
} else {
|
|
const alreadyJoined = preview.players.some(
|
|
(player) => player.id === service.USER_ID
|
|
);
|
|
canJoin = alreadyJoined || preview.players.length < preview.settings.maxPlayers;
|
|
if (!canJoin) previewHint = "房间人数已满";
|
|
}
|
|
this.setData({ preview, previewHint, canJoin });
|
|
},
|
|
|
|
useDemoCode() {
|
|
this.setData({ code: "731204" });
|
|
this.previewRoom("731204");
|
|
},
|
|
|
|
join() {
|
|
if (this.data.submitting) return;
|
|
if (this.data.code.length !== 6) {
|
|
wx.showToast({ title: "请输入六位房间码", icon: "none" });
|
|
return;
|
|
}
|
|
if (!this.data.name.trim()) {
|
|
wx.showToast({ title: "请输入游戏昵称", icon: "none" });
|
|
return;
|
|
}
|
|
if (!this.data.canJoin) {
|
|
wx.showToast({ title: this.data.previewHint || "当前不能加入房间", icon: "none" });
|
|
return;
|
|
}
|
|
this.setData({ submitting: true });
|
|
try {
|
|
const room = service.joinRoom(this.data.code, this.data.name.trim());
|
|
wx.redirectTo({ url: `/pages/lobby/lobby?code=${room.code}` });
|
|
} catch (error) {
|
|
this.setData({ submitting: false });
|
|
wx.showToast({ title: error.message, icon: "none" });
|
|
}
|
|
}
|
|
});
|