import * as React from 'react'; import { colors, links } from '../../config.json'; import { hasExpired, formatRemainingTime } from '../../shared/account-expiry'; import { messages } from '../../shared/gettext'; import History from '../lib/history'; import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; import * as Cell from './cell'; import { Layout } from './Layout'; import { CloseBarItem, NavigationBar, NavigationContainer, NavigationItems, TitleBarItem, } from './NavigationBar'; import SettingsHeader, { HeaderTitle } from './SettingsHeader'; import { StyledCellIcon, StyledCellSpacer, StyledContainer, StyledContent, StyledNavigationScrollbars, StyledOutOfTimeSubText, StyledQuitButton, } from './SettingsStyles'; import { LoginState } from '../redux/account/reducers'; export interface IProps { preferredLocaleDisplayName: string; loginState: LoginState; connectedToDaemon: boolean; accountExpiry?: string; appVersion: string; consistentVersion: boolean; upToDateVersion: boolean; suggestedIsBeta: boolean; isOffline: boolean; onQuit: () => void; onClose: () => void; onViewSelectLanguage: () => void; onViewAccount: () => void; onViewSupport: () => void; onViewPreferences: () => void; onViewAdvancedSettings: () => void; onExternalLink: (url: string) => void; updateAccountData: () => void; history: History; } export default class Settings extends React.Component { public componentDidMount() { if (this.props.history.action === 'PUSH') { this.props.updateAccountData(); } } public render() { const showLargeTitle = this.props.loginState.type !== 'ok'; return ( { // TRANSLATORS: Title label in navigation bar messages.pgettext('navigation-bar', 'Settings') } {showLargeTitle && ( {messages.pgettext('navigation-bar', 'Settings')} )} {this.renderTopButtons()} {this.renderMiddleButtons()} {this.renderBottomButtons()} {this.renderQuitButton()} ); } private openDownloadLink = () => this.props.onExternalLink(this.props.suggestedIsBeta ? links.betaDownload : links.download); private openFaqLink = () => this.props.onExternalLink(links.faq); private renderQuitButton() { return ( {messages.pgettext('settings-view', 'Quit app')} ); } private renderTopButtons() { const isLoggedIn = this.props.loginState.type === 'ok'; if (!isLoggedIn || !this.props.connectedToDaemon) { return null; } const isOutOfTime = this.props.accountExpiry ? hasExpired(this.props.accountExpiry) : false; const formattedExpiry = this.props.accountExpiry ? formatRemainingTime(this.props.accountExpiry).toUpperCase() : ''; const outOfTimeMessage = messages.pgettext('settings-view', 'OUT OF TIME'); return ( <> { // TRANSLATORS: Navigation button to the 'Account' view messages.pgettext('settings-view', 'Account') } {isOutOfTime ? outOfTimeMessage : formattedExpiry} { // TRANSLATORS: Navigation button to the 'Preferences' view messages.pgettext('settings-view', 'Preferences') } { // TRANSLATORS: Navigation button to the 'Advanced' settings view messages.pgettext('settings-view', 'Advanced') } ); } private renderMiddleButtons() { let icon; let footer; if (!this.props.consistentVersion || !this.props.upToDateVersion) { const inconsistentVersionMessage = messages.pgettext( 'settings-view', 'App is out of sync. Please quit and restart.', ); const updateAvailableMessage = messages.pgettext( 'settings-view', 'Update available. Install the latest app version to stay up to date.', ); const message = !this.props.consistentVersion ? inconsistentVersionMessage : updateAvailableMessage; icon = ; footer = ( {message} ); } else { footer = ; } return ( {icon} {messages.pgettext('settings-view', 'App version')} {this.props.appVersion} {footer} ); } private renderBottomButtons() { return ( <> { // TRANSLATORS: Navigation button to the 'Report a problem' help view messages.pgettext('settings-view', 'Report a problem') } { // TRANSLATORS: Link to the webpage messages.pgettext('settings-view', 'FAQs & Guides') } { // TRANSLATORS: Navigation button to the 'Language' settings view messages.pgettext('settings-view', 'Language') } {this.props.preferredLocaleDisplayName} ); } }