blob: b20a21c6d894b477304739a8039c79d992b96c58 [file] [log] [blame]
// Functions used by more than one element.
import { diffDate } from 'common-sk/modules/human'
import { unsafeHTML } from 'lit-html/directives/unsafe-html'
import { html, render } from 'lit-html'
const linkRe = /(http[s]?:\/\/[^\s]*)/gm;
/**
* Formats the text for a silence header.
*
* silence - The silence being displayed.
*/
export function displaySilence(silence) {
let ret = [];
for (let key in silence.param_set) {
if (key.startsWith('__')) {
continue
}
ret.push(`${silence.param_set[key].join(', ')}`);
}
let s = ret.join(' ');
if (s.length > 33) {
s = s.slice(0, 30) + '...';
}
if (!s.length) {
s = '(*)';
}
return s;
}
/**
* Returns the params.abbr to be appended to a string, if present.
*/
export function abbr(ele) {
let s = ele.params['abbr'];
if (s) {
return ` - ${s}`;
} else {
return ``
}
}
/**
* Convert all URLs in a string into links in a lit-html TemplateResult.
*/
export function linkify(s) {
return unsafeHTML(s.replace(linkRe, '<a href="$&" rel=noopener target=_blank>$&</a>'));
}
/**
* Templates notes to be displayed.
*/
export function notes(ele) {
if (!ele._state.notes) {
return [];
}
return ele._state.notes.map((note, index) => html`<section class=note>
<p>${linkify(note.text)}</p>
<div class=meta>
<span class=author>${note.author}</span>
<span class=date>${diffDate(note.ts*1000)}</span>
<delete-icon-sk title='Delete comment.' @click=${(e) => ele._deleteNote(e, index)}></delete-icon-sk>
</div>
</section>`);
}
const TIME_DELTAS = [
{ units: "w", delta: 7*24*60*60 },
{ units: "d", delta: 24*60*60 },
{ units: "h", delta: 60*60 },
{ units: "m", delta: 60 },
{ units: "s", delta: 1 },
];
/**
* Returns the parsed duration in seconds.
*
* @param {string} d - The duration, e.g. "2h" or "4d".
* @returns {number} The duration in seconds.
*
* TODO(jcgregorio) Move into common-sk/modules/human.js with tests.
*/
export function parseDuration(d) {
let units = d.slice(-1);
let scalar = +d.slice(0, -1);
for (let i = 0; i < TIME_DELTAS.length; i++) {
let o = TIME_DELTAS[i];
if (o.units === units) {
return o.delta * scalar;
}
}
return 0
}
export function expiresIn(silence) {
if (silence.active) {
return diffDate((silence.created + parseDuration(silence.duration))*1000)
} else {
return ''
}
}