mami/src/mami.js/ui/hooks.js
flashwave afe5acd328 Just always show the markup bar.
The focus behaviour was hateful I never want to experience it ever again.
2024-06-27 19:12:52 +00:00

110 lines
4 KiB
JavaScript

#include users.js
#include utility.js
#include ui/messages.jsx
#include ui/view.js
Umi.UI.Hooks = (function() {
let sendMessage;
return {
SetCallbacks: (sendMessageFunc) => {
sendMessage = sendMessageFunc;
},
AddHooks: function() {
const msgForm = $i('umi-msg-form');
const msgText = $i('umi-msg-text');
window.addEventListener('keydown', function(ev) {
if((ev.ctrlKey && ev.key !== 'v') || ev.altKey)
return;
if(!ev.target.matches('input, textarea, select, button'))
msgText.focus();
});
msgForm.addEventListener('submit', ev => {
ev.preventDefault();
if(typeof sendMessage !== 'function')
return;
const textField = ev.target.elements.namedItem('text');
if(textField instanceof HTMLTextAreaElement) {
let text = textField.value;
textField.value = '';
text = text.replace(/\t/g, ' ');
if(text.length > 0)
sendMessage(text);
}
});
msgText.addEventListener('keyup', function(ev) {
const isScrolledToBottom = Umi.UI.Messages.IsScrolledToBottom();
const elemParent = msgText.parentNode;
let height = 40;
if(mami.settings.get('expandTextBox') && msgText.scrollHeight > msgText.clientHeight)
height = msgText.scrollHeight;
if(height > 40)
elemParent.style.height = height.toString() + 'px';
else
elemParent.style.height = null;
if(isScrolledToBottom)
Umi.UI.Messages.ScrollIfNeeded();
});
msgText.addEventListener('keydown', function(ev) {
if(ev.key === 'Tab' && (!ev.shiftKey || !ev.ctrlKey)) {
ev.preventDefault();
const text = Umi.UI.View.GetText();
if(text.length < 1)
return;
const start = Umi.UI.View.GetPosition();
let position = start,
snippet = '';
while(position >= 0 && text.charAt(position - 1) !== ' ' && text.charAt(position - 1) !== "\n") {
--position;
snippet = text.charAt(position) + snippet;
}
let insertText = undefined;
if(snippet.indexOf(':') === 0) {
let emoteRank = 0;
if(Umi.User.hasCurrentUser())
emoteRank = Umi.User.getCurrentUser().perms.rank;
const emotes = MamiEmotes.findByName(emoteRank, snippet.substring(1), true);
if(emotes.length > 0)
insertText = ':' + emotes[0] + ':';
} else {
const users = Umi.Users.Find(snippet);
if(users.length === 1)
insertText = users[0].name;
}
if(insertText !== undefined) {
Umi.UI.View.SetText(text.slice(0, start - snippet.length) + text.slice(start));
Umi.UI.View.SetPosition(start - snippet.length);
Umi.UI.View.EnterAtCursor(insertText);
Umi.UI.View.SetPosition(Umi.UI.View.GetPosition() + insertText.length);
Umi.UI.View.SetPosition(Umi.UI.View.GetPosition(), true);
}
return;
}
if((ev.key === 'Enter' || ev.key === 'NumpadEnter') && ev.shiftKey === mami.settings.get('newLineOnEnter')) {
ev.preventDefault();
msgForm.requestSubmit();
return;
}
});
},
};
})();