import moment from 'moment'; import { logger } from '../logger'; import { RevealableTypes } from '../sketchObjects/Revealable'; import store from '../store'; export interface Commit { url: string; message: string; time: string; } export interface InfoMessageType { type: RevealableTypes; headline: string; innerHTML: string; imgUrl?: string; url?: string; commits?: Commit[]; version?: string; } export class InfoMessage { type: RevealableTypes; name: string; infoMessage: HTMLElement; infoMessageSubheadline: HTMLElement; infoMessageHeadline: HTMLElement; infoMessageContents: HTMLElement; infoMessageClose: HTMLElement; infoMessageImgRef: HTMLImageElement; infoMessageLinkRef: HTMLAnchorElement; infoMessageCommitsHeadlineRef: HTMLElement; infoMessageCommitsRef: HTMLElement; infoMessageVersionRef: HTMLElement; backdrop: HTMLElement; constructor() { this.infoMessage = document.getElementById('info-message'); this.infoMessageHeadline = document.getElementById('info-message-headline'); this.infoMessageSubheadline = document.getElementById('info-message-subheadline'); this.infoMessageContents = document.getElementById('info-message-contents'); this.infoMessageClose = document.getElementById('info-message-close'); this.infoMessageImgRef = document.getElementById('info-message-img') as HTMLImageElement; this.infoMessageLinkRef = document.getElementById('info-message-link') as HTMLAnchorElement; this.infoMessageCommitsRef = document.getElementById('info-message-contents-commits'); this.infoMessageCommitsHeadlineRef = document.getElementById( 'info-message-content-commits-headline' ); this.infoMessageVersionRef = document.getElementById('info-message-contents-version'); this.backdrop = document.getElementById('backdrop'); this.backdrop.addEventListener('click', this.onBackdropClick); this.infoMessageClose.addEventListener('click', this.onCloseClick); store.subscribe((state, prevState) => { if (state.infoMessageShown) { this.show(); } else { this.hide(); } if (state.infoMessages.length > prevState.infoMessages.length) { const newMessage = state.infoMessages[state.infoMessages.length - 1]; this.setContents(newMessage.headline, newMessage.innerHTML); this.type = newMessage.type; this.name = newMessage.headline; this.infoMessageSubheadline.innerHTML = this.getTextForType(); if (newMessage.imgUrl) { this.setImg(newMessage.imgUrl); } else { this.infoMessageImgRef.style.display = 'none'; } if (newMessage.url) { this.setLink(newMessage.url); } else { this.infoMessageLinkRef.style.display = 'none'; } if (this.type === RevealableTypes.CONTRIBUTOR) { this.infoMessageCommitsRef.style.display = 'block'; this.infoMessageCommitsHeadlineRef.style.display = 'block'; this.setCommits(newMessage.commits); } else { this.infoMessageCommitsRef.style.display = 'none'; this.infoMessageCommitsHeadlineRef.style.display = 'none'; } if (this.type === RevealableTypes.PACKAGE) { this.infoMessageVersionRef.style.display = 'block'; this.setVersion(newMessage.version); } else { this.infoMessageVersionRef.style.display = 'none'; } store.setState({ infoMessageShown: true }); } }); } private getTextForType(): string { if (this.type === RevealableTypes.CONTRIBUTOR) { return 'Contributor'; } else if (this.type === RevealableTypes.PACKAGE) { return 'NPM Package'; } else { return 'Legacy Alert'; } } private setContents(headline: string, innerHTML: string) { this.infoMessageHeadline.innerText = headline; // this.infoMessageContents.innerHTML = innerHTML; } private setVersion(version: string) { this.infoMessageVersionRef.innerHTML = `This package is installed at

${version}

`; } private setCommits(commits: Commit[]) { const commitEls = commits.map( ({ message, url, time }) => `

${message}

${moment(time).format( 'LLL' )}Take a look on Github
` ); console.log(commitEls); this.infoMessageCommitsRef.innerHTML = commitEls.join(''); } private setImg(imgUrl: string) { this.infoMessageImgRef.src = imgUrl; this.infoMessageImgRef.style.display = 'block'; } private setLink(url: string) { this.infoMessageLinkRef.href = url; this.infoMessageLinkRef.style.display = 'block'; } private show() { this.infoMessage.style.display = 'block'; this.backdrop.style.display = 'block'; } private hide() { this.infoMessage.style.display = 'none'; this.backdrop.style.display = 'none'; } private onBackdropClick() { logger.log({ type: this.type === RevealableTypes.CONTRIBUTOR ? 'NC' : this.type === RevealableTypes.LEGACY ? 'LC' : 'PC', timestamp: Date.now(), message: `Closing info message for ${this.name}`, }); store.setState({ infoMessageShown: false }); } private onCloseClick() { logger.log({ type: this.type === RevealableTypes.CONTRIBUTOR ? 'NC' : this.type === RevealableTypes.LEGACY ? 'LC' : 'PC', timestamp: Date.now(), message: `Closing info message for ${this.name}`, }); store.setState({ infoMessageShown: false }); } }