Introduce MiniMessage rendering system for structured chat formatting and interaction
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import {inject, Injectable, OnDestroy} from '@angular/core';
|
||||
import {Subject} from 'rxjs';
|
||||
import {inject, Injectable, OnDestroy, signal} from '@angular/core';
|
||||
import {AuthService} from '@services/auth.service';
|
||||
import {EventSourcePolyfill} from 'event-source-polyfill';
|
||||
import {ChatMessage} from '@pages/altitude/chat/objects/chat-message.object';
|
||||
import {MiniMessageComponent} from '@pages/altitude/chat/mini-message/mini-message.types';
|
||||
import {RawChatMessage} from '@pages/altitude/chat/objects/raw-chat-message.object';
|
||||
|
||||
export interface ChatEvent {
|
||||
type: string;
|
||||
@@ -15,8 +17,9 @@ interface SsePayloadEvent {
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ChatService implements OnDestroy {
|
||||
private eventSource?: EventSourcePolyfill;
|
||||
private events$ = new Subject<ChatEvent>();
|
||||
private readonly authService: AuthService = inject(AuthService)
|
||||
private readonly _messages = signal<ChatMessage[]>([])
|
||||
public readonly messages = this._messages.asReadonly()
|
||||
|
||||
connect() {
|
||||
if (this.eventSource) {
|
||||
@@ -39,11 +42,21 @@ export class ChatService implements OnDestroy {
|
||||
this.eventSource = source;
|
||||
|
||||
this.on(source, 'connected', (event) => {
|
||||
console.log('SSE connected:', event.data);
|
||||
const raw = JSON.parse(event.data) as RawChatMessage[];
|
||||
const messages: ChatMessage[] = raw.map((m) => ({
|
||||
...m,
|
||||
messageJson: JSON.parse(m.messageJson) as MiniMessageComponent,
|
||||
}));
|
||||
this._messages.update((old) => [...old, ...messages]);
|
||||
});
|
||||
|
||||
this.on(source, 'chat-message', (event) => {
|
||||
this.events$.next({type: 'chat-message', data: JSON.parse(event.data)});
|
||||
const raw = JSON.parse(event.data) as RawChatMessage[];
|
||||
const messages: ChatMessage[] = raw.map((m) => ({
|
||||
...m,
|
||||
messageJson: JSON.parse(m.messageJson) as MiniMessageComponent,
|
||||
}));
|
||||
this._messages.update((old) => [...old, ...messages]);
|
||||
});
|
||||
|
||||
source.onerror = (err) => {
|
||||
@@ -58,11 +71,6 @@ export class ChatService implements OnDestroy {
|
||||
.addEventListener(eventName, handler);
|
||||
}
|
||||
|
||||
|
||||
onEvent() {
|
||||
return this.events$.asObservable();
|
||||
}
|
||||
|
||||
disconnect(): void {
|
||||
this.eventSource?.close();
|
||||
this.eventSource = undefined;
|
||||
|
||||
Reference in New Issue
Block a user