Skip to content

Commit bca0f0a

Browse files
author
topboy
committed
patches/types
1 parent 7e0872b commit bca0f0a

File tree

11 files changed

+169
-121
lines changed

11 files changed

+169
-121
lines changed

src/components/AppSettings.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ export default {
250250
},
251251
data: function data() {
252252
return {
253+
state: 0,
253254
theme: '',
254255
customThemeUrl: '',
255256
pluginUiElements: GlobalApi.singleton().appSettingsPlugins,
@@ -306,10 +307,15 @@ export default {
306307
},
307308
settingLanguage: {
308309
get: function getSettingLanguage() {
310+
// forgive me :'(
311+
// eslint-disable-next-line
312+
this.state;
309313
return this.$state.setting('language') || '';
310314
},
311315
set: function setSettingLanguage(newVal) {
312316
this.$state.setting('language', newVal || null);
317+
this.$state.chgLang(newVal);
318+
this.state = (this.state + 1) % 1024;
313319
},
314320
},
315321
messageLayouts() {

src/components/Container.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
<server-view :network="network" />
4141
</template>
4242
<template v-else>
43-
<message-list :buffer="buffer" />
43+
<message-list
44+
:buffer="buffer"
45+
/>
4446
<sidebar
4547
v-if="!buffer.isSpecial()"
4648
:network="network"

src/components/MessageInfo.vue

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,18 @@
4848
</a>
4949
</input-prompt>
5050
</div>
51-
<template>
52-
<component
53-
:is="plugin.component"
54-
v-for="plugin in pluginUiElements"
55-
:key="plugin.id"
56-
:plugin-props="{
57-
message: message,
58-
buffer: buffer
59-
}"
60-
v-bind="plugin.props"
61-
:buffer="buffer"
62-
:message="message"
63-
/>
64-
</template>
51+
<component
52+
:is="plugin.component"
53+
v-for="plugin in pluginUiElements"
54+
:key="plugin.id"
55+
:plugin-props="{
56+
message: message,
57+
buffer: buffer
58+
}"
59+
v-bind="plugin.props"
60+
:buffer="buffer"
61+
:message="message"
62+
/>
6563
</div>
6664
</div>
6765
</template>
@@ -81,7 +79,6 @@ export default {
8179
},
8280
computed: {
8381
showLinkPreviews() {
84-
window.kiwi.log.debug('Plugins?', this.pluginUiElements);
8582
return this.$state.setting('buffers.show_link_previews');
8683
},
8784
},

src/components/MessageList.vue

Lines changed: 37 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -56,51 +56,44 @@
5656
then each message layout checks for a message.bodyTemplate
5757
custom component to apply only to the body area
5858
-->
59-
<div
60-
:data-message-id="message.id"
61-
v-if="false"
62-
class="kiwi-messagelist-message unloaded"
59+
<component
60+
:is="message.template"
61+
v-if="message.render() && message.template"
62+
v-bind="message.templateProps"
63+
:buffer="buffer"
64+
:message="message"
65+
:prepend="messagePrependPlugins"
66+
:append="messageAppendPlugins"
67+
:idx="filteredMessages.indexOf(message)"
68+
:ml="thisMl"
69+
/>
70+
<message-list-message-modern
71+
v-else-if="listType === 'modern'"
72+
:message="message"
73+
:prepend="messagePrependPlugins"
74+
:append="messageAppendPlugins"
75+
:idx="filteredMessages.indexOf(message)"
76+
:buffer="buffer"
77+
:ml="thisMl"
78+
/>
79+
<message-list-message-inline
80+
v-else-if="listType === 'inline'"
81+
:message="message"
82+
:prepend="messagePrependPlugins"
83+
:append="messageAppendPlugins"
84+
:buffer="buffer"
85+
:idx="filteredMessages.indexOf(message)"
86+
:ml="thisMl"
87+
/>
88+
<message-list-message-compact
89+
v-else-if="listType === 'compact'"
90+
:message="message"
91+
:prepend="messagePrependPlugins"
92+
:append="messageAppendPlugins"
93+
:idx="filteredMessages.indexOf(message)"
94+
:buffer="buffer"
95+
:ml="thisMl"
6396
/>
64-
<template v-else>
65-
<component
66-
:is="message.template"
67-
v-if="message.render() && message.template"
68-
v-bind="message.templateProps"
69-
:buffer="buffer"
70-
:message="message"
71-
:prepend="messagePrependPlugins"
72-
:append="messageAppendPlugins"
73-
:idx="filteredMessages.indexOf(message)"
74-
:ml="thisMl"
75-
/>
76-
<message-list-message-modern
77-
v-else-if="listType === 'modern'"
78-
:message="message"
79-
:prepend="messagePrependPlugins"
80-
:append="messageAppendPlugins"
81-
:idx="filteredMessages.indexOf(message)"
82-
:buffer="buffer"
83-
:ml="thisMl"
84-
/>
85-
<message-list-message-inline
86-
v-else-if="listType === 'inline'"
87-
:message="message"
88-
:prepend="messagePrependPlugins"
89-
:append="messageAppendPlugins"
90-
:buffer="buffer"
91-
:idx="filteredMessages.indexOf(message)"
92-
:ml="thisMl"
93-
/>
94-
<message-list-message-compact
95-
v-else-if="listType === 'compact'"
96-
:message="message"
97-
:prepend="messagePrependPlugins"
98-
:append="messageAppendPlugins"
99-
:idx="filteredMessages.indexOf(message)"
100-
:buffer="buffer"
101-
:ml="thisMl"
102-
/>
103-
</template>
10497
</div>
10598
</template>
10699
<!-- </remove-before-update> -->
@@ -295,22 +288,10 @@ export default {
295288
},
296289
mounted() {
297290
this.addCopyListeners();
298-
this.observer = new IntersectionObserver((entries, observer) => {
299-
entries.forEach((e) => {
300-
if (e?.target?.dataset?.messageId && e.isIntersecting) {
301-
this.$nextTick(() => this.tryRender(e.target));
302-
}
303-
});
304-
}, {
305-
root: this.$refs.scroller,
306-
rootMargin: '0px',
307-
threshold: 0.01,
308-
});
309291
this.$nextTick(() => {
310292
this.scrollToBottom();
311293
// this.smooth_scroll = true;
312294
});
313-
314295
// this watcher was moved here due to it firing before mounted() could scroll
315296
// to the bottom, this resulted in auto_scroll being set to false
316297
watch(() => this.buffer.message_count, () => {
@@ -322,14 +303,6 @@ export default {
322303
// previous check
323304
this.$nextTick(() => {
324305
this.maybeScrollToBottom();
325-
document.querySelectorAll('.kiwi-messagelist-message.unloaded').forEach((i) => {
326-
this.observer.observe(i);
327-
const percent = percentInView(i);
328-
window.kiwi.log.debug('Percent in view for', i, ':', percent);
329-
if (percent > 0.01) {
330-
this.tryRender(i);
331-
}
332-
});
333306
});
334307
}, { deep: true });
335308
@@ -346,19 +319,6 @@ export default {
346319
});
347320
},
348321
methods: {
349-
tryRender(el) {
350-
const msg = this.buffer.messagesObj.messages
351-
.find((m) => m.id.toString() === el.dataset.messageId);
352-
if (msg) {
353-
window.kiwi.log.debug('rendered', el.dataset.messageId, this.buffer.messagesObj.messages.slice(), msg);
354-
msg.seen = true;
355-
this.observer.unobserve(el);
356-
this.keepScroll(2);
357-
} else {
358-
window.kiwi.log.debug('couldnt render', el.dataset.messageId, this.buffer.messagesObj.messages.slice());
359-
this.$nextTick(() => this.tryRender(el));
360-
}
361-
},
362322
isHoveringOverMessage(message) {
363323
return message.nick && message.nick.toLowerCase() === this.hover_nick.toLowerCase();
364324
},

src/components/utils/build-plugin-section.js

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { h } from 'vue';
22

33
const buildPluginSection = (prop) => (props, context, cache) => {
4-
window.kiwi.log.debug('building plugin section....', props, context, cache);
5-
if (!(props[prop] instanceof Array)) return [];
6-
if (!props[prop].length) return [];
7-
const plugins = props[prop].map((plugin) => h({ template: '<p>Hi</p>' }, {
8-
key: plugin.id,
9-
messagelist: props.ml,
10-
buffer: props.ml.buffer,
11-
message: props.message,
12-
color: props.ml.userColour(props.message.user),
13-
pluginProps: plugin.props,
14-
...(plugin.props || {}),
15-
}));
4+
let plugins = [];
5+
if (!(props[prop] instanceof Array)) plugins = [];
6+
if (!props[prop].length) plugins = [];
7+
else {
8+
plugins = props[prop].map((plugin) => h(plugin.component, {
9+
key: plugin.id,
10+
// props: {
11+
messagelist: props.ml,
12+
buffer: props.ml.buffer,
13+
message: props.message,
14+
color: props.ml.userColour(props.message.user),
15+
// },
16+
}));
17+
}
1618
return [h('div', {
1719
class: `kiwi-messagelist-body kiwi-messagelist-body-${prop}-addons`,
1820
}, plugins)];

src/libs/History.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
'kiwi public';
2+
3+
export class History {
4+
constructor(baseUrl) {
5+
/**
6+
* @type {{ enter: () => Promise<void>, leave: () => Promise<void>}[]}
7+
*/
8+
this.handlers = [];
9+
this.history = window.history;
10+
this.currentPage = 0;
11+
this.prepared = false;
12+
this.baseUrl = baseUrl;
13+
}
14+
15+
prepare() {
16+
if (!this.prepared) {
17+
window.addEventListener('popstate', async(e) => {
18+
if (e.state) {
19+
const page = e.state.page;
20+
await this.setPage(page);
21+
}
22+
});
23+
this.prepared = true;
24+
}
25+
}
26+
27+
async setPage(page) {
28+
this.prepare();
29+
const previousHandler = this.handlers[this.currentPage];
30+
const handler = this.handlers[page];
31+
this.currentPage = page;
32+
await previousHandler.leave();
33+
await handler.enter();
34+
}
35+
36+
push({
37+
enter,
38+
leave,
39+
path,
40+
}) {
41+
const url = new URL(this.baseUrl);
42+
url.pathname += path;
43+
if (this.currentPage < this.handlers.length - 1) {
44+
this.handlers.splice(this.currentPage + 1);
45+
}
46+
const page = this.handlers.length;
47+
this.history.pushState({
48+
page,
49+
}, '', url);
50+
this.handlers.push({ enter, leave });
51+
return this.setPage(page);
52+
}
53+
54+
async replace({ enter, leave, path }) {
55+
const url = new URL(this.baseUrl);
56+
url.pathname += path;
57+
const page = this.currentPage;
58+
this.history.replaceState({
59+
page,
60+
}, '', url);
61+
const previousHandler = this.handlers[page];
62+
const handler = { enter, leave };
63+
this.handlers[page] = handler;
64+
previousHandler && await previousHandler.leave();
65+
await handler.enter();
66+
}
67+
}

src/libs/InputHandler.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export default class InputHandler {
119119

120120
// Plugins may tap into this event to handle a command themselves
121121
this.state.$emit('input.command.' + command, eventObj, command, params);
122+
this.state.$emit('input.command.*', eventObj, command, params);
122123
if (eventObj.handled) {
123124
return;
124125
}
@@ -128,7 +129,7 @@ export default class InputHandler {
128129
}
129130

130131
if (!eventObj.handled) {
131-
network.ircClient.raw(line);
132+
network.ircClient.raw(rawLine);
132133
}
133134
}
134135
}
@@ -197,6 +198,7 @@ function handleMessage(type, event, command, line) {
197198
nick: network.nick,
198199
message: messageBody,
199200
type: type,
201+
tags: event.tags,
200202
};
201203

202204
this.state.addMessage(buffer, newMessage);
@@ -208,7 +210,7 @@ function handleMessage(type, event, command, line) {
208210
notice: 'notice',
209211
};
210212
let fnName = fnNames[type] || 'say';
211-
network.ircClient[fnName](bufferName, message);
213+
network.ircClient[fnName](bufferName, message, event.tags);
212214
}
213215

214216
inputCommands.msg = function inputCommandMsg(event, command, line) {

src/libs/IrcClient.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,7 @@ function clientMiddleware(state, network) {
11091109
if (buffer) {
11101110
// Join all the same mode changes together so they can be shown on one
11111111
// line such as "prawnsalad sets +b on nick1, nick2"
1112-
event.modes.forEach((mode) => {
1112+
!historical && event.modes.forEach((mode) => {
11131113
modeStrs[mode.mode] = modeStrs[mode.mode] || [];
11141114

11151115
// If this mode has a user prefix then we need to update the user object
@@ -1199,9 +1199,9 @@ function clientMiddleware(state, network) {
11991199
let modeChar = mode.mode.substr(1);
12001200

12011201
if (adding) {
1202-
state.$set(buffer.modes, modeChar, mode.param);
1202+
buffer.modes[modeChar] = mode.param;
12031203
} else if (!adding) {
1204-
state.$delete(buffer.modes, modeChar);
1204+
delete buffer.modes[modeChar];
12051205
}
12061206

12071207
modeStrs[mode.mode].push({ target: buffer.name, param: mode.param });

0 commit comments

Comments
 (0)