/* This file is part of GNU Taler (C) 2019 Taler Systems SA GNU 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. GNU 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 GNU Taler; see the file COPYING. If not, see */ /** * Welcome page, shown on first installs. * * @author Florian Dold */ import React, { useState, useEffect } from "react"; import { getDiagnostics } from "../wxApi"; import { PageLink } from "../renderHtml"; import * as wxApi from "../wxApi"; import { getPermissionsApi } from "../compat"; import { extendedPermissions } from "../permissions"; import { WalletDiagnostics } from "taler-wallet-core"; function Diagnostics(): JSX.Element | null { const [timedOut, setTimedOut] = useState(false); const [diagnostics, setDiagnostics] = useState( undefined, ); useEffect(() => { let gotDiagnostics = false; setTimeout(() => { if (!gotDiagnostics) { console.error("timed out"); setTimedOut(true); } }, 1000); const doFetch = async (): Promise => { const d = await getDiagnostics(); console.log("got diagnostics", d); gotDiagnostics = true; setDiagnostics(d); }; console.log("fetching diagnostics"); doFetch(); }, []); if (timedOut) { return

Diagnostics timed out. Could not talk to the wallet backend.

; } if (diagnostics) { if (diagnostics.errors.length === 0) { return null; } else { return (

Problems detected:

    {diagnostics.errors.map((errMsg) => (
  1. {errMsg}
  2. ))}
{diagnostics.firefoxIdbProblem ? (

Please check in your about:config settings that you have IndexedDB enabled (check the preference name{" "} dom.indexedDB.enabled).

) : null} {diagnostics.dbOutdated ? (

Your wallet database is outdated. Currently automatic migration is not supported. Please go{" "} here to reset the wallet database.

) : null}
); } } return

Running diagnostics ...

; } export function PermissionsCheckbox(): JSX.Element { const [extendedPermissionsEnabled, setExtendedPermissionsEnabled] = useState( false, ); async function handleExtendedPerm(requestedVal: boolean): Promise { let nextVal: boolean | undefined; if (requestedVal) { const granted = await new Promise((resolve, reject) => { // We set permissions here, since apparently FF wants this to be done // as the result of an input event ... getPermissionsApi().request(extendedPermissions, (granted: boolean) => { if (chrome.runtime.lastError) { console.error("error requesting permissions"); console.error(chrome.runtime.lastError); reject(chrome.runtime.lastError); return; } console.log("permissions granted:", granted); resolve(granted); }); }); const res = await wxApi.setExtendedPermissions(granted); console.log(res); nextVal = res.newValue; } else { const res = await wxApi.setExtendedPermissions(false); console.log(res); nextVal = res.newValue; } console.log("new permissions applied:", nextVal); setExtendedPermissionsEnabled(nextVal ?? false); } useEffect(() => { async function getExtendedPermValue(): Promise { const res = await wxApi.getExtendedPermissions(); setExtendedPermissionsEnabled(res.newValue); } getExtendedPermValue(); }); return (
handleExtendedPerm(x.target.checked)} type="checkbox" id="checkbox-perm" style={{ width: "1.5em", height: "1.5em", verticalAlign: "middle" }} /> (Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)
); } function Welcome(): JSX.Element { return ( <>

Thank you for installing the wallet.

Permissions

Next Steps

Try the demo » Learn how to top up your wallet balance » ); } export function createWelcomePage(): JSX.Element { return ; }