File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ import type { Message } from '#models' ;
2+ import { parseNick } from '#utils' ;
3+ import { computed , type Ref } from 'vue' ;
4+
5+ export interface MessageGroup extends Pick < Message , 'nick' | 'type' > {
6+ id : string ;
7+ messages : Message [ ] ;
8+ }
9+
10+ /**
11+ * Group consecutive messages from same user.
12+ * Does not group non-`privmsg` entries.
13+ */
14+ export function useMessageGroups ( messages : Ref < Message [ ] > ) {
15+ const messageGroups = computed ( ( ) => {
16+ const groups : MessageGroup [ ] = [ ] ;
17+ for ( const message of messages . value ) {
18+ const prevGroup = groups . at ( - 1 ) ?? null ;
19+
20+ if (
21+ ! prevGroup ||
22+ message . type !== 'privmsg' ||
23+ prevGroup . type !== 'privmsg' ||
24+ parseNick ( prevGroup . nick ) !== parseNick ( message . nick )
25+ ) {
26+ groups . push ( {
27+ id : `group-${ message . time } -${ message . nick } ` ,
28+ type : message . type ,
29+ messages : [ message ] ,
30+ nick : message . nick ,
31+ } ) ;
32+ } else {
33+ prevGroup . messages . push ( message ) ;
34+ }
35+ }
36+ return groups ;
37+ } ) ;
38+ return { messageGroups } ;
39+ }
You can’t perform that action at this time.
0 commit comments