Light12306/Web12306/js/ui/chat/roomsession.js
2014-08-14 21:33:47 +08:00

158 lines
4.6 KiB
JavaScript

define(function (require, exports, module) {
var EventObject = require("../../platform/EventObject.js");
var ep = require("../../platform/extensionPort.js");
var port = ep.port;
var mp = require("../widget_message_popup.js");
var sessMgr = require("../../account/sessionMgr.js");
var param = require("../../data.js");
var page = $("#chat_container");
var user = sessMgr.current;
sessMgr.on("sessionChanged", function () {
user = sessMgr.current;
});
var RoomSession = function () {
EventObject.apply(this);
var that = this;
var room;
var chatListContainer = page.find("article.chat-items");
var chatListContainerDom = chatListContainer[0];
var roomStateTemplate = $("#chat_connect_server").doT();
var roomSystemNoticeTemplate = $("#chat_sys_alert").doT();
this.enterRoom = function (targetRoom) {
if (targetRoom === room)
return;
room = targetRoom;
//UI
$("#chat_frame>section").removeClass("chat-page-current");
page.addClass("chat-page-current");
page.find(">header>span:eq(0)").html(room.name);
chatListContainer.empty();
that.refreshOnlineCount();
page.find("button.button-primary").prop("disabled", true);
port.postMessage("enterChatRoom", room);
that.fireEvent("enterRoom");
};
this.refreshOnlineCount = function () {
page.find(">header>span:eq(1)").html("当前在线 " + room.onlinecount + " 人");
};
this.exitRoom = function () {
room = null;
port.postMessage("disconnectChatRoom");
that.fireEvent("exitRoom");
};
this.appendMessageItem = function (html) {
chatListContainer.append(html);
chatListContainerDom.scrollTop = chatListContainerDom.clientHeight;
};
this.clearDisplay = function () {
chatListContainer.empty();
};
this.sendMsg = function (msg) {
var data = {
items: [msg],
from: {
realname: user.dispname,
username: user.username
},
target: []
}
port.postMessage("chatRoomSendMsg", data);
};
Object.defineProperty(this, "room", {
get: function () {
return room;
}
});
port.on("chatRoomConnecting", function () {
that.appendMessageItem(roomStateTemplate({ state: "connecting", stateIcon: "fa-spin fa-spinner", msg: "正在连接服务器中..." }));
that.fireEvent("chatRoomConnecting");
});
port.on("chatRoomConnected", function () {
page.find("button.button-primary").prop("disabled", false);
chatListContainer.find(".chat-state").remove();
that.appendMessageItem(roomSystemNoticeTemplate(room));
that.fireEvent("chatRoomConnected");
});
port.on("chatRoomReceiveMsg", function (e, data) {
that.fireEvent("chatRoomReceiveMsg");
alert(JSON.stringify(data))
});
port.on("chatRoomDisconnected", function () {
that.appendMessageItem(roomStateTemplate({ state: "disconnect", stateIcon: "fa-spin fa-spinner", msg: "服务器已断开连接。" }));
that.fireEvent("chatRoomDisconnected");
page.find("button.button-primary").prop("disabled", true);
});
return this;
};
RoomSession.prototype = Object.create(EventObject);
RoomSession.constructor = RoomSession;
var session = new RoomSession();
(function chatEditor() {
var editor = page.find("section.chat-editor");
var sendBtn = editor.find(">footer>button.button-primary");
var initEditor = function () {
if (!sessMgr.current)
return;
var color = sessMgr.current.options.chatColor || "#000000";
editor.find(">header .chat-editor-color").val(color);
editor.find(".chat-editor-container").css("color", color);
};
var delayEnableSend = function () {
sendBtn.prop("disabled", true);
setTimeout(function () {
sendBtn.prop("disabled", false);
}, param.chatSendMsgDelay);
};
initEditor();
editor.find(".chat-editor-container").keyup(function(e) {
if (e.keyCode === 13 && e.ctrlKey) {
sendBtn.click();
}
});
sessMgr.on("sessionChanged", function () {
initEditor();
});
editor.find(">header .chat-btn-cls").click(function () {
session.clearDisplay();
});
editor.find(">header .chat-editor-color").change(function () {
user.options.chatColor = this.value;
editor.find(".chat-editor-container").css("color", this.value);
sessMgr.save();
});
editor.find(">footer>button.button-default").click(function () {
session.exitRoom();
});
editor.find(">footer>button.button-primary").click(function () {
var msg = {
color: user.options.chatColor,
text: $.trim(editor.find(".chat-editor-container").text())
}
if (!msg.text)
return;
editor.find(".chat-editor-container").empty();
session.sendMsg(msg);
delayEnableSend();
});
})();
return {
session: session,
enterRoom: session.enterRoom
}
});