diff options
| author | Sebastian <sebasjm@gmail.com> | 2021-07-06 12:44:25 -0300 |
|---|---|---|
| committer | Sebastian <sebasjm@gmail.com> | 2021-07-06 12:44:25 -0300 |
| commit | 678a90934c7b819b1d5c864f7429242d7d74a1e6 (patch) | |
| tree | 0711e8268406e0f6044c0a6736d82598da71a758 /packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx | |
| parent | 550905f0e7eed38fa1ef598b4015faf10648cf1b (diff) | |
refactored backup sync UI
Diffstat (limited to 'packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx')
| -rw-r--r-- | packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx | 101 |
1 files changed, 79 insertions, 22 deletions
diff --git a/packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx b/packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx index 59e6cda1b..1b8abf44d 100644 --- a/packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx +++ b/packages/taler-wallet-webextension/src/popup/ProviderDetailPage.tsx @@ -16,7 +16,8 @@ import { BackupBackupProviderTerms, i18n, Timestamp } from "@gnu-taler/taler-util"; -import { ProviderInfo, ProviderPaymentType } from "@gnu-taler/taler-wallet-core"; +import { ProviderInfo, ProviderPaymentStatus, ProviderPaymentType } from "@gnu-taler/taler-wallet-core"; +import { ContractTermsUtil } from "@gnu-taler/taler-wallet-core/src/util/contractTerms"; import { formatDuration, intervalToDuration, format } from "date-fns"; import { Fragment, VNode } from "preact"; import { useRef, useState } from "preact/hooks"; @@ -24,42 +25,45 @@ import { useBackupStatus } from "../hooks/useProvidersByCurrency"; import * as wxApi from "../wxApi"; interface Props { - currency: string; - onAddProvider: (c: string) => void; + pid: string; onBack: () => void; } -export function ProviderDetailPage({ currency, onAddProvider, onBack }: Props): VNode { +export function ProviderDetailPage({ pid, onBack }: Props): VNode { const status = useBackupStatus() if (!status) { return <div>Loading...</div> } - const info = status.providers[currency]; - return <ProviderView currency={currency} info={info} + const idx = parseInt(pid, 10) + if (Number.isNaN(idx) || !(status.providers[idx])) { + onBack() + return <div /> + } + const info = status.providers[idx]; + return <ProviderView info={info} onSync={() => { null }} onDelete={() => { null }} onBack={onBack} - onAddProvider={() => onAddProvider(currency)} + onExtend={() => { null }} />; } export interface ViewProps { - currency: string; - info?: ProviderInfo; + info: ProviderInfo; onDelete: () => void; onSync: () => void; onBack: () => void; - onAddProvider: () => void; + onExtend: () => void; } -export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddProvider }: ViewProps): VNode { +export function ProviderView({ info, onDelete, onSync, onBack, onExtend }: ViewProps): VNode { function Footer() { return <footer style={{ marginTop: 'auto', display: 'flex', flexShrink: 0 }}> <button class="pure-button" onClick={onBack}><i18n.Translate>back</i18n.Translate></button> <div style={{ width: '100%', flexDirection: 'row', justifyContent: 'flex-end', display: 'flex' }}> - {info && <button class="pure-button button-destructive" onClick={onDelete}><i18n.Translate>remove</i18n.Translate></button>} - {info && <button class="pure-button button-secondary" style={{ marginLeft: 5 }} onClick={onSync}><i18n.Translate>sync now</i18n.Translate></button>} - {!info && <button class="pure-button button-success" style={{ marginLeft: 5 }} onClick={onAddProvider}><i18n.Translate>add provider</i18n.Translate></button>} + {info && <button class="pure-button button-destructive" disabled onClick={onDelete}><i18n.Translate>remove</i18n.Translate></button>} + {info && <button class="pure-button button-secondary" disabled style={{ marginLeft: 5 }} onClick={onExtend}><i18n.Translate>extend</i18n.Translate></button>} + {info && <button class="pure-button button-secondary" disabled style={{ marginLeft: 5 }} onClick={onSync}><i18n.Translate>sync now</i18n.Translate></button>} </div> </footer> } @@ -67,7 +71,7 @@ export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddPr if (info?.lastError) { return <Fragment> <div class="errorbox" style={{ marginTop: 10 }} > - <div style={{ height: 0, textAlign: 'right', color: 'gray', fontSize: 'small' }}>{!info.lastAttemptedBackupTimestamp || info.lastAttemptedBackupTimestamp.t_ms === 'never' ? 'never' : format(new Date(info.lastAttemptedBackupTimestamp.t_ms), 'dd/MM/yyyy HH:mm:ss')}</div> + <div style={{ height: 0, textAlign: 'right', color: 'gray', fontSize: 'small' }}>last time tried {!info.lastAttemptedBackupTimestamp || info.lastAttemptedBackupTimestamp.t_ms === 'never' ? 'never' : format(new Date(info.lastAttemptedBackupTimestamp.t_ms), 'dd/MM/yyyy HH:mm:ss')}</div> <p>{info.lastError.hint}</p> </div> </Fragment> @@ -76,7 +80,7 @@ export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddPr switch (info.backupProblem.type) { case "backup-conflicting-device": return <div class="errorbox" style={{ marginTop: 10 }}> - <p>There is another backup from <b>{info.backupProblem.otherDeviceId}</b></p> + <p>There is conflict with another backup from <b>{info.backupProblem.otherDeviceId}</b></p> </div> case "backup-unreadable": return <div class="errorbox" style={{ marginTop: 10 }}> @@ -84,7 +88,7 @@ export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddPr </div> default: return <div class="errorbox" style={{ marginTop: 10 }}> - <p>Unkown backup problem: {JSON.stringify(info.backupProblem)}</p> + <p>Unknown backup problem: {JSON.stringify(info.backupProblem)}</p> </div> } } @@ -110,6 +114,28 @@ export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddPr return undefined } + function descriptionByStatus(status: ProviderPaymentStatus | undefined) { + if (!status) return '' + switch (status.type) { + case ProviderPaymentType.InsufficientBalance: + return 'no enough balance to make the payment' + case ProviderPaymentType.Unpaid: + return 'not pay yet' + case ProviderPaymentType.Paid: + case ProviderPaymentType.TermsChanged: + if (status.paidUntil.t_ms === 'never') { + return 'service paid.' + } else { + return `service paid until ${format(status.paidUntil.t_ms, 'yyyy/MM/dd HH:mm:ss')}` + } + case ProviderPaymentType.Pending: + return '' + default: + break; + } + return undefined + } + return ( <div style={{ height: 'calc(320px - 34px - 16px)', overflow: 'auto' }}> <style>{` @@ -120,18 +146,49 @@ export function ProviderView({ currency, info, onDelete, onSync, onBack, onAddPr <div style={{ display: 'flex', flexDirection: 'column' }}> <section style={{ flex: '1 0 auto', height: 'calc(320px - 34px - 34px - 16px)', overflow: 'auto' }}> <span style={{ padding: 5, display: 'inline-block', backgroundColor: colorByStatus(info?.paymentStatus.type), borderRadius: 5, color: 'white' }}>{info?.paymentStatus.type}</span> - {info && <span style={{ float: "right", fontSize: "small", color: "gray", padding: 5 }}> + {/* {info && <span style={{ float: "right", fontSize: "small", color: "gray", padding: 5 }}> From <b>{info.syncProviderBaseUrl}</b> - </span>} + </span>} */} + {info && <div style={{ float: 'right', fontSize: "large", padding: 5 }}>{info.terms?.annualFee} / year</div>} <Error /> + <h3>{info?.syncProviderBaseUrl}</h3> <div style={{ display: "flex", flexDirection: "row", justifyContent: "space-between", }}> - <h1>{currency}</h1> - {info && <div style={{ marginTop: 'auto', marginBottom: 'auto' }}>{info.terms?.annualFee} / year</div>} + <div>{daysSince(info?.lastSuccessfulBackupTimestamp)} </div> </div> - <div>{daysSince(info?.lastSuccessfulBackupTimestamp)} </div> + <p>{descriptionByStatus(info?.paymentStatus)}</p> + + {info?.paymentStatus.type === ProviderPaymentType.TermsChanged && <div> + <p>terms has changed, extending the service will imply accepting the new terms of service</p> + <table> + <thead> + <tr> + <td></td> + <td>old</td> + <td> -></td> + <td>new</td> + </tr> + </thead> + <tbody> + + <tr> + <td>fee</td> + <td>{info.paymentStatus.oldTerms.annualFee}</td> + <td>-></td> + <td>{info.paymentStatus.newTerms.annualFee}</td> + </tr> + <tr> + <td>storage</td> + <td>{info.paymentStatus.oldTerms.storageLimitInMegabytes}</td> + <td>-></td> + <td>{info.paymentStatus.newTerms.storageLimitInMegabytes}</td> + </tr> + </tbody> + </table> + </div>} + </section> <Footer /> </div> |
