/* This file is part of TALER (C) 2016 GNUnet e.V. TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. TALER is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with TALER; see the file COPYING. If not, see */ import { i18n, Timestamp } from "@gnu-taler/taler-util"; import { ProviderInfo, ProviderPaymentStatus, ProviderPaymentType, } from "@gnu-taler/taler-wallet-core"; import { format, formatDuration, intervalToDuration } from "date-fns"; import { Fragment, VNode, h } from "preact"; import { ErrorMessage } from "../components/ErrorMessage"; import { Button, ButtonDestructive, ButtonPrimary, PaymentStatus, PopupBox, SmallLightText, } from "../components/styled"; import { useProviderStatus } from "../hooks/useProviderStatus"; interface Props { pid: string; onBack: () => void; } export function ProviderDetailPage({ pid, onBack }: Props): VNode { const status = useProviderStatus(pid); if (!status) { return (
Loading...
); } if (!status.info) { onBack(); return
; } return ( status.remove().then(onBack)} onBack={onBack} onExtend={() => { null; }} /> ); } export interface ViewProps { info: ProviderInfo; onDelete: () => void; onSync: () => void; onBack: () => void; onExtend: () => void; } export function ProviderView({ info, onDelete, onSync, onBack, onExtend, }: ViewProps): VNode { const lb = info?.lastSuccessfulBackupTimestamp; const isPaid = info.paymentStatus.type === ProviderPaymentType.Paid || info.paymentStatus.type === ProviderPaymentType.TermsChanged; return (

{info.name}{" "} {info.syncProviderBaseUrl}

{isPaid ? "Paid" : "Unpaid"}

Last backup:{" "} {lb == null || lb.t_ms == "never" ? "never" : format(lb.t_ms, "dd MMM yyyy")}{" "}

Back up {info.terms && (

Provider fee: {info.terms && info.terms.annualFee} per year

)}

{descriptionByStatus(info.paymentStatus)}

Extend {info.paymentStatus.type === ProviderPaymentType.TermsChanged && (

terms has changed, extending the service will imply accepting the new terms of service

old -> new
fee {info.paymentStatus.oldTerms.annualFee} -> {info.paymentStatus.newTerms.annualFee}
storage {info.paymentStatus.oldTerms.storageLimitInMegabytes} -> {info.paymentStatus.newTerms.storageLimitInMegabytes}
)}
remove provider
); } function daysSince(d?: Timestamp) { if (!d || d.t_ms === "never") return "never synced"; const duration = intervalToDuration({ start: d.t_ms, end: new Date(), }); const str = formatDuration(duration, { delimiter: ", ", format: [ duration?.years ? i18n.str`years` : duration?.months ? i18n.str`months` : duration?.days ? i18n.str`days` : duration?.hours ? i18n.str`hours` : duration?.minutes ? i18n.str`minutes` : i18n.str`seconds`, ], }); return `synced ${str} ago`; } function Error({ info }: { info: ProviderInfo }) { if (info.lastError) { return ; } if (info.backupProblem) { switch (info.backupProblem.type) { case "backup-conflicting-device": return ( There is conflict with another backup from{" "} {info.backupProblem.otherDeviceId} } /> ); case "backup-unreadable": return ; default: return ( Unknown backup problem: {JSON.stringify(info.backupProblem)} } /> ); } } return null; } function colorByStatus(status: ProviderPaymentType) { switch (status) { case ProviderPaymentType.InsufficientBalance: return "rgb(223, 117, 20)"; case ProviderPaymentType.Unpaid: return "rgb(202, 60, 60)"; case ProviderPaymentType.Paid: return "rgb(28, 184, 65)"; case ProviderPaymentType.Pending: return "gray"; case ProviderPaymentType.InsufficientBalance: return "rgb(202, 60, 60)"; case ProviderPaymentType.TermsChanged: return "rgb(202, 60, 60)"; } } function descriptionByStatus(status: ProviderPaymentStatus) { switch (status.type) { // return i18n.str`no enough balance to make the payment` // return i18n.str`not paid yet` case ProviderPaymentType.Paid: case ProviderPaymentType.TermsChanged: if (status.paidUntil.t_ms === "never") { return i18n.str`service paid`; } else { return ( Backup valid until:{" "} {format(status.paidUntil.t_ms, "dd MMM yyyy")} ); } case ProviderPaymentType.Unpaid: case ProviderPaymentType.InsufficientBalance: case ProviderPaymentType.Pending: return ""; } }