From 2ad74097502ac9f52e64464cfdbcebd0d0b36f8b Mon Sep 17 00:00:00 2001 From: Jannis Mattheis Date: Fri, 5 Apr 2019 18:01:40 +0200 Subject: [PATCH] Use extra property to determine the content type --- ui/src/message/Message.tsx | 18 ++++++++++++++++-- ui/src/message/Messages.tsx | 1 + ui/src/message/extras.ts | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 ui/src/message/extras.ts diff --git a/ui/src/message/Message.tsx b/ui/src/message/Message.tsx index cf5defd..1ef21a6 100644 --- a/ui/src/message/Message.tsx +++ b/ui/src/message/Message.tsx @@ -8,6 +8,7 @@ import Container from '../common/Container'; import * as config from '../config'; import {StyleRulesCallback} from '@material-ui/core/styles/withStyles'; import ReactMarkdown from 'react-markdown'; +import {RenderMode, contentType} from './extras'; const styles: StyleRulesCallback = () => ({ header: { @@ -53,6 +54,7 @@ interface IProps { date: string; content: string; fDelete: VoidFunction; + extras?: IMessageExtras; height: (height: number) => void; } @@ -62,8 +64,20 @@ class Message extends React.PureComponent> { public componentDidMount = () => this.props.height(this.node ? this.node.getBoundingClientRect().height : 0); + private renderContent = () => { + const content = this.props.content; + switch (contentType(this.props.extras)) { + case RenderMode.Markdown: + return ; + case RenderMode.Plain: + default: + return content; + } + }; + public render(): React.ReactNode { - const {fDelete, classes, title, date, content, image} = this.props; + const {fDelete, classes, title, date, image} = this.props; + return (
(this.node = ref)}> @@ -93,7 +107,7 @@ class Message extends React.PureComponent> {
- + {this.renderContent()} diff --git a/ui/src/message/Messages.tsx b/ui/src/message/Messages.tsx index c255bce..a6926ad 100644 --- a/ui/src/message/Messages.tsx +++ b/ui/src/message/Messages.tsx @@ -116,6 +116,7 @@ class Messages extends Component, date={message.date} content={message.message} image={message.image} + extras={message.extras} /> ); }; diff --git a/ui/src/message/extras.ts b/ui/src/message/extras.ts new file mode 100644 index 0000000..ceec00f --- /dev/null +++ b/ui/src/message/extras.ts @@ -0,0 +1,29 @@ +export enum RenderMode { + Markdown = 'text/markdown', + Plain = 'text/plain', +} + +export const contentType = (extras?: IMessageExtras): RenderMode => { + const type = extract(extras, 'client::display', 'contentType'); + const valid = Object.keys(RenderMode) + .map((k) => RenderMode[k]) + .some((mode) => mode === type); + return valid ? type : RenderMode.Plain; +}; + +// tslint:disable-next-line:no-any +const extract = (extras: IMessageExtras | undefined, key: string, path: string): any => { + if (!extras) { + return null; + } + + if (!extras[key]) { + return null; + } + + if (!extras[key][path]) { + return null; + } + + return extras[key][path]; +};