mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 16:15:42 -06:00
110 lines
2.6 KiB
TypeScript
110 lines
2.6 KiB
TypeScript
import React, { PureComponent } from 'react';
|
|
import { isLiveChannelMessageEvent, LiveChannelScope } from '@grafana/data';
|
|
import { getBackendSrv, getGrafanaLiveSrv } from '@grafana/runtime';
|
|
import { Unsubscribable } from 'rxjs';
|
|
|
|
import { CommentView } from './CommentView';
|
|
import { Message, MessagePacket } from './types';
|
|
|
|
export interface Props {
|
|
objectType: string;
|
|
objectId: string;
|
|
}
|
|
|
|
export interface State {
|
|
messages: Message[];
|
|
value: string;
|
|
}
|
|
|
|
export class CommentManager extends PureComponent<Props, State> {
|
|
subscription?: Unsubscribable;
|
|
packetCounter = 0;
|
|
|
|
constructor(props: Props) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
messages: [],
|
|
value: '',
|
|
};
|
|
}
|
|
|
|
async componentDidMount() {
|
|
const resp = await getBackendSrv().post('/api/comments/get', {
|
|
objectType: this.props.objectType,
|
|
objectId: this.props.objectId,
|
|
});
|
|
this.packetCounter++;
|
|
this.setState({
|
|
messages: resp.comments,
|
|
});
|
|
this.updateSubscription();
|
|
}
|
|
|
|
getLiveChannel = () => {
|
|
const live = getGrafanaLiveSrv();
|
|
if (!live) {
|
|
console.error('Grafana live not running, enable "live" feature toggle');
|
|
return undefined;
|
|
}
|
|
|
|
const address = this.getLiveAddress();
|
|
if (!address) {
|
|
return undefined;
|
|
}
|
|
|
|
return live.getStream<MessagePacket>(address);
|
|
};
|
|
|
|
getLiveAddress = () => {
|
|
return {
|
|
scope: LiveChannelScope.Grafana,
|
|
namespace: 'comment',
|
|
path: `${this.props.objectType}/${this.props.objectId}`,
|
|
};
|
|
};
|
|
|
|
updateSubscription = () => {
|
|
if (this.subscription) {
|
|
this.subscription.unsubscribe();
|
|
this.subscription = undefined;
|
|
}
|
|
|
|
const channel = this.getLiveChannel();
|
|
if (channel) {
|
|
this.subscription = channel.subscribe({
|
|
next: (msg) => {
|
|
if (isLiveChannelMessageEvent(msg)) {
|
|
const { commentCreated } = msg.message;
|
|
if (commentCreated) {
|
|
this.setState((prevState) => ({
|
|
messages: [...prevState.messages, commentCreated],
|
|
}));
|
|
this.packetCounter++;
|
|
}
|
|
}
|
|
},
|
|
});
|
|
}
|
|
};
|
|
|
|
addComment = async (comment: string): Promise<boolean> => {
|
|
const response = await getBackendSrv().post('/api/comments/create', {
|
|
objectType: this.props.objectType,
|
|
objectId: this.props.objectId,
|
|
content: comment,
|
|
});
|
|
|
|
// TODO: set up error handling
|
|
console.log(response);
|
|
|
|
return true;
|
|
};
|
|
|
|
render() {
|
|
return (
|
|
<CommentView comments={this.state.messages} packetCounter={this.packetCounter} addComment={this.addComment} />
|
|
);
|
|
}
|
|
}
|