diff --git a/components/buffer.js b/components/buffer.js index b92e580..7eb6f24 100644 --- a/components/buffer.js +++ b/components/buffer.js @@ -39,6 +39,46 @@ function Timestamp({ date, url }) { `; } +/** + * Check whether a message can be folded. + * + * Unimportant and noisy messages that may clutter the discussion should be + * folded. + */ +function canFoldMessage(msg) { + switch (msg.command) { + case "JOIN": + case "PART": + case "QUIT": + case "NICK": + return true; + } + return false; +} + +function getFoldableMessageContent(msg, createNick) { + switch (msg.command) { + case "JOIN": + return html` + ${createNick(msg.prefix.name)} has joined + `; + case "PART": + return html` + ${createNick(msg.prefix.name)} has left + `; + case "QUIT": + return html` + ${createNick(msg.prefix.name)} has quit + `; + case "NICK": + var newNick = msg.params[0]; + return html` + ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} + `; + } + throw new Error(`Message "${msg.command}" cannot be folded`); +} + class LogLine extends Component { shouldComponentUpdate(nextProps) { return this.props.message !== nextProps.message; @@ -84,37 +124,16 @@ class LogLine extends Component { lineClass += " highlight"; } break; - case "JOIN": - content = html` - ${createNick(msg.prefix.name)} has joined - `; - break; - case "PART": - content = html` - ${createNick(msg.prefix.name)} has left - `; - break; case "KICK": content = html` ${createNick(msg.params[1])} was kicked by ${createNick(msg.prefix.name)} (${msg.params.slice(2)}) `; break; - case "QUIT": - content = html` - ${createNick(msg.prefix.name)} has quit - `; - break; case "MODE": content = html` * ${createNick(msg.prefix.name)} sets mode ${msg.params.slice(1).join(" ")} `; break; - case "NICK": - var newNick = msg.params[0]; - content = html` - ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} - `; - break; case "TOPIC": var topic = msg.params[1]; content = html` @@ -129,7 +148,11 @@ class LogLine extends Component { if (irc.isError(msg.command) && msg.command != irc.ERR_NOMOTD) { lineClass = "error"; } - content = html`${msg.command} ${msg.params.join(" ")}`; + if (canFoldMessage(msg)) { + content = getFoldableMessageContent(msg, createNick); + } else { + content = html`${msg.command} ${msg.params.join(" ")}`; + } } return html` @@ -142,6 +165,40 @@ class LogLine extends Component { } } +class FoldGroup extends Component { + shouldComponentUpdate(nextProps) { + return this.props.message !== nextProps.message; + } + + render() { + var msgs = this.props.messages; + + var onNickClick = this.props.onNickClick; + function createNick(nick) { + return html` + <${Nick} nick=${nick} onClick=${() => onNickClick(nick)}/> + `; + } + + var content = msgs.map((msg, i) => { + var item = getFoldableMessageContent(msg, createNick); + if (i === 0) { + return item; + } else { + return [", ", item]; + } + }); + + return html` +