Improve message history

This commit is contained in:
Thomas Nordquist
2019-04-03 17:55:39 +02:00
parent 9e5d944df3
commit f23f6c908f
2 changed files with 44 additions and 8 deletions

View File

@@ -51,17 +51,22 @@ class MessageHistory extends React.Component<Props, State> {
} }
const history = node.messageHistory.toArray() const history = node.messageHistory.toArray()
const historyElements = history.reverse().map(message => ({ let previousMessage: q.Message | undefined = node.message
title: <DateFormatter date={message.received} />, const historyElements = history.reverse().map((message) => {
const element = {
title: <span><DateFormatter date={message.received} /> {previousMessage ? <i>(-<DateFormatter date={message.received} intervalSince={previousMessage.received} />)</i> : null}</span>,
value: message.value ? Base64Message.toUnicodeString(message.value) : '', value: message.value ? Base64Message.toUnicodeString(message.value) : '',
selected: message && message === this.props.selected, selected: message && message === this.props.selected,
})) }
previousMessage = message
return element
})
const numericMessages = history const numericMessages = history
.map((message: q.Message) => { .map((message: q.Message) => {
const number = message.value ? parseFloat(Base64Message.toUnicodeString(message.value)) : NaN const value = message.value ? parseFloat(Base64Message.toUnicodeString(message.value)) : NaN
return { x: number, y: message.received.getTime() } return { x: message.received.getTime(), y: value }
}).filter(data => !isNaN(data.x)) }).filter(data => !isNaN(data.y))
const showPlot = numericMessages.length >= 2 const showPlot = numericMessages.length >= 2
return ( return (

View File

@@ -3,14 +3,30 @@ import * as moment from 'moment'
interface Props { interface Props {
date: Date date: Date
intervalSince?: Date
}
const unitMapping = {
s: 'seconds',
m: 'minutes',
h: 'hours',
} }
class DateFormatter extends React.Component<Props, {}> { class DateFormatter extends React.Component<Props, {}> {
public render() { public render() {
const locale = window.navigator.language const locale = window.navigator.language
if (this.props.intervalSince) {
return <span>{this.intervalSince(this.props.intervalSince)}</span>
}
return <span>{locale ? this.localizedDate(locale) : this.legacyDate()}</span> return <span>{locale ? this.localizedDate(locale) : this.legacyDate()}</span>
} }
private intervalSince(intervalSince: Date) {
const interval = intervalSince.getTime() - this.props.date.getTime()
const unit = this.unitForInterval(interval)
return `${moment.duration(interval).as(unit)} ${unitMapping[unit]}`
}
private legacyDate() { private legacyDate() {
return `${this.props.date.toLocaleDateString()} ${this.props.date.toLocaleTimeString()}` return `${this.props.date.toLocaleDateString()} ${this.props.date.toLocaleTimeString()}`
} }
@@ -18,6 +34,21 @@ class DateFormatter extends React.Component<Props, {}> {
private localizedDate(locale: string) { private localizedDate(locale: string) {
return moment(this.props.date).locale(locale).format('L LTS') return moment(this.props.date).locale(locale).format('L LTS')
} }
private unitForInterval(millis: number) {
const oneMinute = 1000 * 60
const oneHour = oneMinute * 60
if (millis > oneHour * 2) {
return 'h'
}
if (millis > oneMinute * 2) {
return 'm'
}
return 's'
}
} }
export default DateFormatter export default DateFormatter