/* tslint:disable:max-line-length */ "use strict"; import React, { Component } from "react"; import semver from "semver"; import options, { Options } from "../../lib/options"; import { BridgeInfo } from "../../lib/bridge"; import { getNextEllipsis } from "../../lib/utils"; const _ = browser.i18n.getMessage; interface BridgeStatsProps { info: BridgeInfo; } const BridgeStats = (props: BridgeStatsProps) => (
{ _("optionsBridgeStatsName") } { props.info.name }
{ _("optionsBridgeStatsVersion") } { props.info.version }
{ _("optionsBridgeStatsExpectedVersion") } { props.info.expectedVersion }
{ _("optionsBridgeStatsCompatibility") } { props.info.isVersionCompatible ? props.info.isVersionExact ? _("optionsBridgeCompatible") : _("optionsBridgeLikelyCompatible") : _("optionsBridgeIncompatible") }
{ _("optionsBridgeStatsRecommendedAction") } { props.info.isVersionCompatible ? _("optionsBridgeNoAction") : props.info.isVersionOlder ? _("optionsBridgeOlderAction") : props.info.isVersionNewer ? _("optionsBridgeNewerAction") : _("optionsBridgeNoAction") }
); interface BridgeProps { info?: BridgeInfo; loading: boolean; loadingTimedOut: boolean; options?: Options; onChange: (ev: React.ChangeEvent) => void; } interface BridgeState { isCheckingUpdates: boolean; isUpdateAvailable: boolean; wasErrorCheckingUpdates: boolean; checkUpdatesEllipsis: string; updateStatus?: string; } export default class Bridge extends Component { private updateData: any; private updateStatusTimeout?: number; constructor (props: BridgeProps) { super(props); this.state = { isCheckingUpdates: false , isUpdateAvailable: false , wasErrorCheckingUpdates: false , checkUpdatesEllipsis: "..." }; this.onCheckUpdates = this.onCheckUpdates.bind(this); this.onCheckUpdatesResponse = this.onCheckUpdatesResponse.bind(this); this.onCheckUpdatesError = this.onCheckUpdatesError.bind(this); this.onUpdate = this.onUpdate.bind(this); } public render () { const [ backupMessageStart, backupMessageEnd ] = _("optionsBridgeBackupEnabled", "\0").split("\0"); return (
{ this.props.loading ? (
{ _("optionsBridgeLoading") }
) : this.renderStatus() } { !this.props.loading && this.props.options &&
} { !this.props.loading &&
{ this.state.isUpdateAvailable ? (

{ _("optionsBridgeUpdateAvailable") }

) : ( )}
{ this.state.updateStatus && !this.state.isUpdateAvailable && this.state.updateStatus }
}
); } private renderStatus () { const infoClasses = `bridge__info ${!this.props.info ? this.props.loadingTimedOut ? "bridge__info--timed-out" : "bridge__info--not-found" : "bridge__info--found"}`; let statusIcon: string; let statusTitle: string; let statusText: (string | null) = null; if (this.props.loadingTimedOut) { statusIcon = "assets/icons8-warn-120.png"; statusTitle = _("optionsBridgeIssueStatusTitle"); } else if (!this.props.info) { statusIcon = "assets/icons8-cancel-120.png"; statusTitle = _("optionsBridgeNotFoundStatusTitle"); statusText = _("optionsBridgeNotFoundStatusText"); } else { if (this.props.info.isVersionCompatible) { statusIcon = "assets/icons8-ok-120.png"; statusTitle = _("optionsBridgeFoundStatusTitle"); } else { statusIcon = "assets/icons8-warn-120.png"; statusTitle = _("optionsBridgeIssueStatusTitle"); } } return (

{ statusTitle }

{ statusText &&

{ statusText }

}
{ this.props.info && }
); } private onCheckUpdates () { this.setState({ isCheckingUpdates: true }); const timeout = window.setInterval(() => { this.setState(state => ({ checkUpdatesEllipsis: getNextEllipsis( state.checkUpdatesEllipsis) })); }, 500); fetch("https://api.github.com/repos/hensm/fx_cast/releases/latest") .then(res => { window.clearTimeout(timeout); return res.json(); }) .then(this.onCheckUpdatesResponse) .catch(this.onCheckUpdatesError); } private async onCheckUpdatesResponse (res: any) { const isUpdateAvailable = !this.props.info || semver.lt(this.props.info.version, res.tag_name); if (isUpdateAvailable) { this.updateData = res; } this.setState({ isCheckingUpdates: false , isUpdateAvailable }); if (!isUpdateAvailable) { this.setState({ updateStatus: _("optionsBridgeUpdateStatusNoUpdates") }); } this.showUpdateStatus(); } private onCheckUpdatesError () { this.setState({ isCheckingUpdates: false , wasErrorCheckingUpdates: true , updateStatus: _("optionsBridgeUpdateStatusError") }); this.showUpdateStatus(); } private showUpdateStatus () { if (this.updateStatusTimeout) { window.clearTimeout(this.updateStatusTimeout); } this.updateStatusTimeout = window.setTimeout(() => { this.setState({ updateStatus: undefined }); }, 1500); } private async onUpdate () { // Open downloads page if (this.updateData.html_url) { browser.tabs.create({ url: this.updateData.html_url }); } } }