import * as React from 'react'; import { formatDate, hasExpired } from '../../shared/account-expiry'; import { DeviceState } from '../../shared/daemon-rpc-types'; import { messages } from '../../shared/gettext'; import { useSelector } from '../redux/store'; import { AccountContainer, AccountOutOfTime, AccountRow, AccountRowLabel, AccountRows, AccountRowValue, DeviceRowValue, StyledSpinnerContainer, } from './AccountStyles'; import AccountTokenLabel from './AccountTokenLabel'; import * as AppButton from './AppButton'; import { AriaDescribed, AriaDescription, AriaDescriptionGroup } from './AriaGroup'; import ImageView from './ImageView'; import { BackAction } from './KeyboardNavigation'; import { Footer, Layout, SettingsContainer } from './Layout'; import { ModalAlert, ModalAlertType, ModalMessage } from './Modal'; import { NavigationBar, NavigationItems, TitleBarItem } from './NavigationBar'; import { RedeemVoucherButton } from './RedeemVoucher'; import SettingsHeader, { HeaderTitle } from './SettingsHeader'; interface IProps { isOffline: boolean; prepareLogout: () => void; cancelLogout: () => void; onLogout: () => void; onClose: () => void; onBuyMore: () => Promise; updateAccountData: () => void; getDeviceState: () => Promise; } interface IState { logoutDialogVisible: boolean; logoutDialogStage?: 'checking-ports' | 'confirm'; } export default class Account extends React.Component { public state: IState = { logoutDialogVisible: false, }; public componentDidMount() { this.props.updateAccountData(); } public render() { return ( { // TRANSLATORS: Title label in navigation bar messages.pgettext('account-view', 'Account') } {messages.pgettext('account-view', 'Account')} {messages.pgettext('device-management', 'Device name')} {messages.pgettext('account-view', 'Account number')} {messages.pgettext('account-view', 'Paid until')}
{messages.gettext('Buy more credit')} {messages.pgettext('account-view', 'Log out')}
{this.renderLogoutDialog()}
); } private renderLogoutDialog() { const modalType = this.state.logoutDialogStage === 'checking-ports' ? undefined : ModalAlertType.warning; const message = this.state.logoutDialogStage === 'checking-ports' ? ( ) : ( { // TRANSLATORS: This is is a further explanation of what happens when logging out. messages.pgettext( 'device-management', 'The ports forwarded to this device will be deleted if you log out.', ) } ); const buttons = this.state.logoutDialogStage === 'checking-ports' ? [] : [ { // TRANSLATORS: Confirmation button when logging out messages.pgettext('device-management', 'Log out anyway') } , {messages.gettext('Back')} , ]; return ( {message} ); } private onTryLogout = async () => { this.setState({ logoutDialogVisible: true, logoutDialogStage: 'checking-ports' }); this.props.prepareLogout(); const deviceState = await this.props.getDeviceState(); if ( deviceState?.type === 'logged in' && deviceState.accountAndDevice.device?.ports !== undefined && deviceState.accountAndDevice.device.ports.length > 0 ) { this.setState({ logoutDialogStage: 'confirm' }); } else { this.confirmLogout(); } }; private confirmLogout = () => { this.onHideLogoutConfirmationDialog(); this.props.onLogout(); }; private cancelLogout = () => { this.props.cancelLogout(); this.onHideLogoutConfirmationDialog(); }; private onHideLogoutConfirmationDialog = () => { this.setState({ logoutDialogVisible: false }); }; } function AccountNumberRow() { const accountToken = useSelector((state) => state.account.accountToken); return ; } function AccountExpiryRow() { const accountExpiry = useSelector((state) => state.account.expiry); const expiryLocale = useSelector((state) => state.userInterface.locale); return ; } function DeviceNameRow() { const deviceName = useSelector((state) => state.account.deviceName); return {deviceName}; } function FormattedAccountExpiry(props: { expiry?: string; locale: string }) { if (props.expiry) { if (hasExpired(props.expiry)) { return ( {messages.pgettext('account-view', 'OUT OF TIME')} ); } else { return {formatDate(props.expiry, props.locale)}; } } else { return ( {messages.pgettext('account-view', 'Currently unavailable')} ); } }