mami/src/mami.js/ui/hooks.js
flash cf71bab92d Rewrote connection handling.
This has been in the works for over a month and might break things because it's a very radical change.
If it causes you to be unable to join chat, report it on the forum or try joining using the legacy chat on https://sockchat.flashii.net.
2024-04-17 15:42:50 +00:00

150 lines
5.1 KiB
JavaScript

#include channels.js
#include users.js
#include utility.js
#include ui/channels.js
#include ui/messages.jsx
#include ui/users.js
#include ui/view.js
Umi.UI.Hooks = (function() {
let sendMessage;
let switchChannel;
return {
SetCallbacks: (sendMessageFunc, switchChannelFunc) => {
sendMessage = sendMessageFunc;
switchChannel = switchChannelFunc;
},
AddHooks: function() {
Umi.Users.OnAdd.push(function(user) {
Umi.UI.Users.Add(user);
});
Umi.Users.OnRemove.push(function(user) {
Umi.UI.Users.Remove(user);
});
Umi.Users.OnClear.push(function() {
Umi.UI.Users.RemoveAll();
});
Umi.Users.OnUpdate.push(function(id, user) {
Umi.UI.Users.Update(user);
});
Umi.Channels.OnAdd.push(function(channel) {
Umi.UI.Channels.Add(channel);
});
Umi.Channels.OnRemove.push(function(channel) {
Umi.UI.Channels.Remove(channel);
});
Umi.Channels.OnClear.push(function() {
Umi.UI.Channels.RemoveAll();
});
Umi.Channels.OnUpdate.push(function(name, channel) {
Umi.UI.Channels.Update(name, channel);
});
Umi.Channels.OnSwitch.push(function(name, channel) {
Umi.UI.Channels.Reload(name === null);
if(typeof switchChannel === 'function')
switchChannel(channel);
});
window.addEventListener('keydown', function(ev) {
if((ev.ctrlKey && ev.key !== 'v') || ev.altKey)
return;
if(!ev.target.matches('input, textarea, select'))
$i('umi-msg-text').focus();
});
$i('umi-msg-form').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);
}
});
$i('umi-msg-text').addEventListener('input', function(ev) {
const elemInput = $i('umi-msg-text');
const elemParent = elemInput.parentNode;
let height = 40;
if(mami.settings.get('expandTextBox') && elemInput.scrollHeight > elemInput.clientHeight)
height = elemInput.scrollHeight;
if(height > 40)
elemParent.style.height = height.toString() + 'px';
else
elemParent.style.height = null;
});
$i('umi-msg-text').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) {
ev.preventDefault();
$i('umi-msg-form').requestSubmit();
return;
}
});
},
};
})();