message counts

This commit is contained in:
Sam Hoffman
2026-01-11 17:06:01 -05:00
parent 0da4cd2b83
commit 31eff22d95
3 changed files with 42 additions and 20 deletions

View File

@@ -1,17 +1,23 @@
<script setup> <script setup>
import { computed } from "vue";
import { useIRCStore } from "@/stores/irc"; import { useIRCStore } from "@/stores/irc";
const { buffers } = useIRCStore();
const store = useIRCStore(); const { setActiveBuffer, buffers, activeBufferName } = useIRCStore();
const bufferList = computed(() => {
return Object.keys(buffers);
});
</script> </script>
<template> <template>
<v-list> <v-list
<v-list-item v-for="buf in bufferList" @click="store.setActiveBuffer(buf)"> selectable
{{ buf }} :selected="[activeBufferName]"
@click:select="(item) => setActiveBuffer(item.id)"
>
<v-list-item :value="bufName" v-for="(bufValue, bufName) in buffers">
{{ bufName }}
<template v-slot:append>
<v-badge
:content="bufValue.messages.length - bufValue.lastSeenIdx"
inline
/>
</template>
</v-list-item> </v-list-item>
</v-list> </v-list>
</template> </template>

View File

@@ -5,21 +5,26 @@ import { useIRCStore } from "@/stores/irc";
const store = useIRCStore(); const store = useIRCStore();
const inputBuffer = ref(); const inputBuffer = ref();
onMounted(() => { onMounted(store.connect);
store.connect();
});
function send() { function send() {
store.sendActiveBuffer(inputBuffer.value); store.sendActiveBuffer(inputBuffer.value);
inputBuffer.value = ""; inputBuffer.value = "";
} }
</script> </script>
<template> <template>
<div class="d-flex flex-row" style="height: 100vh"> <div class="d-flex flex-row" style="height: 100vh">
<v-sheet border class="buffers"> <v-sheet border class="buffers">
<BufferList /> <BufferList />
</v-sheet> </v-sheet>
<div class="messages d-flex flex-column"> <div class="messages d-flex flex-column">
<v-toolbar density="compact">
<v-toolbar-title>
<p>{{ store.activeBufferName }}</p>
{{ store.activeBuffer?.topic }}
</v-toolbar-title>
</v-toolbar>
<MessageList <MessageList
:messages="store.activeBuffer?.messages" :messages="store.activeBuffer?.messages"
:me="store.clientInfo.nick" :me="store.clientInfo.nick"
@@ -49,7 +54,7 @@ function send() {
.messages { .messages {
height: 100%; height: 100%;
flex: 2; flex: 3;
justify-content: space-between; justify-content: space-between;
} }

View File

@@ -29,6 +29,13 @@ export const useIRCStore = defineStore("irc", () => {
function setActiveBuffer(bufferName) { function setActiveBuffer(bufferName) {
activeBufferName.value = bufferName; activeBufferName.value = bufferName;
resetBufferLastSeen(bufferName);
}
function resetBufferLastSeen(bufferName) {
const buffer = getBuffer(bufferName);
if (!buffer) return;
buffer.lastSeenIdx = buffer.messages.length;
} }
const client = new Client({ const client = new Client({
@@ -51,13 +58,6 @@ export const useIRCStore = defineStore("irc", () => {
function sendActiveBuffer(message) { function sendActiveBuffer(message) {
client.say(activeBufferName.value, message); client.say(activeBufferName.value, message);
// const buffer = getBuffer(activeBufferName.value);
//
// buffer.messages.push({
// nick: clientInfo.value.nick,
// message,
// time: Date.now(),
// });
} }
function isMe(target) { function isMe(target) {
@@ -69,6 +69,7 @@ export const useIRCStore = defineStore("irc", () => {
messages: [], messages: [],
topic: "", topic: "",
users: [], users: [],
lastSeenIdx: 0,
}; };
return buffers.value[bufferName]; return buffers.value[bufferName];
} }
@@ -121,6 +122,10 @@ export const useIRCStore = defineStore("irc", () => {
buffer = getBuffer(message.target); buffer = getBuffer(message.target);
} }
buffer.messages.push(message); buffer.messages.push(message);
if (activeBufferName.value) {
resetBufferLastSeen(activeBufferName.value);
}
}); });
client.on("join", (ev) => { client.on("join", (ev) => {
@@ -152,6 +157,12 @@ export const useIRCStore = defineStore("irc", () => {
} }
}); });
client.on("topic", ({ topic, channel }) => {
const buffer = getBuffer(channel);
if (!buffer) return;
buffer.topic = topic;
});
client.on("part", ({ nick, channel }) => { client.on("part", ({ nick, channel }) => {
if (isMe(nick)) { if (isMe(nick)) {
delBuffer(channel); delBuffer(channel);