1
0
mirror of https://github.com/citizenfx/cfx-server-data.git synced 2025-01-11 00:03:18 +08:00
cfx-server-data/resources/[system]/chat/html/App.js
Jonas Dellinger ffa9488e9a Betterchat v1
2017-05-17 19:22:20 +02:00

167 lines
4.0 KiB
JavaScript

window.APP = {
template: '#app_template',
name: 'app',
data() {
return {
showInput: false,
showWindow: false,
suggestions: [],
message: '',
messages: [],
oldMessages: [],
oldMessagesIndex: -1,
};
},
destroyed() {
clearInterval(this.focusTimer);
window.removeEventListener('message', this.listener);
},
mounted() {
axios.post('http://betterchat/loaded', {});
this.listener = window.addEventListener('message', (event) => {
const item = event.data || event.detail; //'detail' is for debuging via browsers
if (this[item.type]) {
this[item.type](item);
}
});
},
watch: {
messages() {
if (this.showWindowTimer) {
clearTimeout(this.showWindowTimer);
}
this.showWindow = true;
this.showWindowTimer = setTimeout(() => {
if (!this.showInput) {
this.showWindow = false;
}
}, window.CONFIG.fadeTimeout);
const messagesObj = this.$refs.messages;
this.$nextTick(() => {
messagesObj.scrollTop = messagesObj.scrollHeight;
});
},
},
methods: {
ON_OPEN() {
this.showInput = true;
this.showWindow = true;
if (this.showWindowTimer) {
clearTimeout(this.showWindowTimer);
}
this.focusTimer = setInterval(() => {
if (this.$refs.input) {
this.$refs.input.focus();
} else {
clearInterval(this.focusTimer);
}
}, 100);
},
ON_MESSAGE(data) {
this.messages.push(data.message);
},
ON_SUGGESTION_ADD(data) {
const suggestion = data.suggestion;
if (!suggestion.params) {
suggestion.params = [];
}
this.suggestions.push(suggestion);
},
ON_SUGGESTION_REMOVE() {
},
keyUp() {
this.resize();
},
keyDown(e) {
if (e.which === 38 || e.which === 40) {
e.preventDefault();
this.moveOldMessageIndex(e.which === 38);
}
},
moveOldMessageIndex(up) {
if (up && this.oldMessages.length > this.oldMessagesIndex + 1) {
this.oldMessagesIndex += 1;
this.message = this.oldMessages[this.oldMessagesIndex];
} else if (!up && this.oldMessagesIndex - 1 >= 0) {
this.oldMessagesIndex -= 1;
this.message = this.oldMessages[this.oldMessagesIndex];
} else if (!up && this.oldMessagesIndex - 1 === -1) {
this.oldMessagesIndex = -1;
this.message = '';
}
},
resize() {
const input = this.$refs.input;
input.style.height = '5px';
input.style.height = `${input.scrollHeight + 2}px`;
},
addLine() {
this.message += '\n';
this.resize();
},
send(e) {
if (e.shiftKey || this.message === '') {
return;
}
axios.post('http://betterchat/chatResult', {
message: this.message,
});
this.oldMessages.unshift(this.message);
this.message = '';
this.showInput = false;
this.showWindowTimer = setTimeout(() => {
this.showWindow = false;
}, window.CONFIG.fadeTimeout);
},
hideInput(canceled) {
if (canceled) {
axios.post('http://betterchat/chatResult', {
canceled,
});
}
this.showInput = false;
clearInterval(this.focusTimer);
this.showWindowTimer = setTimeout(() => {
this.showWindow = false;
}, window.CONFIG.fadeTimeout);
},
},
components: {
Message: window.MESSAGE,
Suggestions: window.SUGGESTIONS,
},
};
window.emulate_open = () => {
window.dispatchEvent(new CustomEvent('message', {
detail: {
type: 'ON_OPEN',
},
}));
};
window.emulate_suggestion = (name, help, params = []) => {
window.dispatchEvent(new CustomEvent('message', {
detail: {
type: 'ON_SUGGESTION_ADD',
suggestion: {
name,
help,
params,
},
},
}));
};
window.emulate_message = (message) => {
window.dispatchEvent(new CustomEvent('message', {
detail: {
type: 'ON_MESSAGE',
message,
},
}));
};