diff --git a/packages/taler-wallet-webextension/src/components/Diagnostics.tsx b/packages/taler-wallet-webextension/src/components/Diagnostics.tsx new file mode 100644 index 000000000..146b0dd3e --- /dev/null +++ b/packages/taler-wallet-webextension/src/components/Diagnostics.tsx @@ -0,0 +1,76 @@ +import { useState, useEffect } from "preact/hooks"; +import { getDiagnostics } from "../wxApi"; +import { PageLink } from "../renderHtml"; +import { WalletDiagnostics } from "@gnu-taler/taler-util"; +import { JSX } from "preact/jsx-runtime"; + + +export 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 ...

; +} diff --git a/packages/taler-wallet-webextension/src/components/PermissionsCheckbox.tsx b/packages/taler-wallet-webextension/src/components/PermissionsCheckbox.tsx new file mode 100644 index 000000000..50f4feb62 --- /dev/null +++ b/packages/taler-wallet-webextension/src/components/PermissionsCheckbox.tsx @@ -0,0 +1,47 @@ +/* + 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 + */ + +import { JSX } from "preact/jsx-runtime"; + +export function PermissionsCheckbox({ enabled, onToggle }: { enabled: boolean; onToggle: () => void; }): JSX.Element { + return ( +
+ + + + (Enabling this option below will make using the wallet faster, but + requires more permissions from your browser.) + +
+ ); +} diff --git a/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.tsx b/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.tsx new file mode 100644 index 000000000..f5c788cf6 --- /dev/null +++ b/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.tsx @@ -0,0 +1,24 @@ +import { useState, useEffect } from "preact/hooks"; +import * as wxApi from "../wxApi"; +import { handleExtendedPerm } from "../wallet/welcome"; + + +export function useExtendedPermissions(): [boolean, () => void] { + const [enabled, setEnabled] = useState(false); + + const toggle = () => { + setEnabled(v => !v); + handleExtendedPerm(enabled).then(result => { + setEnabled(result); + }); + }; + + useEffect(() => { + async function getExtendedPermValue(): Promise { + const res = await wxApi.getExtendedPermissions(); + setEnabled(res.newValue); + } + getExtendedPermValue(); + }, []); + return [enabled, toggle]; +} diff --git a/packages/taler-wallet-webextension/src/pages/welcome.tsx b/packages/taler-wallet-webextension/src/pages/welcome.tsx deleted file mode 100644 index 808143189..000000000 --- a/packages/taler-wallet-webextension/src/pages/welcome.tsx +++ /dev/null @@ -1,206 +0,0 @@ -/* - 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 { useState, useEffect, useMemo, useCallback } from "preact/hooks"; -import { getDiagnostics } from "../wxApi"; -import { PageLink } from "../renderHtml"; -import * as wxApi from "../wxApi"; -import { getPermissionsApi } from "../compat"; -import { extendedPermissions } from "../permissions"; -import { WalletDiagnostics } from "@gnu-taler/taler-util"; -import { Fragment, JSX } from "preact/jsx-runtime"; - -export 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 ...

; -} - - -async function handleExtendedPerm(isEnabled: boolean): Promise { - let nextVal: boolean | undefined; - - if (!isEnabled) { - 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); - nextVal = res.newValue; - } else { - const res = await wxApi.setExtendedPermissions(false); - nextVal = res.newValue; - } - console.log("new permissions applied:", nextVal ?? false); - return nextVal ?? false -} - -export function useExtendedPermissions(): [boolean, () => void] { - const [enabled, setEnabled] = useState(false); - - const toggle = () => { - setEnabled(v => !v) - handleExtendedPerm(enabled).then( result => { - setEnabled(result) - } ) - } - - useEffect(() => { - async function getExtendedPermValue(): Promise { - const res = await wxApi.getExtendedPermissions(); - setEnabled(res.newValue); - } - getExtendedPermValue(); - },[]); - return [enabled, toggle] -} - -export function PermissionsCheckbox({enabled, onToggle}: {enabled:boolean, onToggle: () => void}): JSX.Element { - return ( -
- - - - (Enabling this option below will make using the wallet faster, but - requires more permissions from your browser.) - -
- ); -} - -export function Welcome(): JSX.Element { - const [permissionsEnabled, togglePermissions] = useExtendedPermissions() - return ( - <> -

Thank you for installing the wallet.

- -

Permissions

- -

Next Steps

- - Try the demo » - - - Learn how to top up your wallet balance » - - - ); -} - -/** - * @deprecated to be removed - */ -export function createWelcomePage(): JSX.Element { - return ; -} diff --git a/packages/taler-wallet-webextension/src/pages/popup.stories.tsx b/packages/taler-wallet-webextension/src/popup/popup.stories.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/popup.stories.tsx rename to packages/taler-wallet-webextension/src/popup/popup.stories.tsx diff --git a/packages/taler-wallet-webextension/src/pages/popup.tsx b/packages/taler-wallet-webextension/src/popup/popup.tsx similarity index 99% rename from packages/taler-wallet-webextension/src/pages/popup.tsx rename to packages/taler-wallet-webextension/src/popup/popup.tsx index 7759b1819..0f76d7728 100644 --- a/packages/taler-wallet-webextension/src/pages/popup.tsx +++ b/packages/taler-wallet-webextension/src/popup/popup.tsx @@ -41,12 +41,13 @@ import { } from "@gnu-taler/taler-util"; import { format } from "date-fns"; import { Component, ComponentChildren, Fragment, JSX } from "preact"; -import { route, Route, Router } from 'preact-router'; -import { Match } from 'preact-router/match'; +import { route } from 'preact-router'; import { useEffect, useState } from "preact/hooks"; +import { Diagnostics } from "../components/Diagnostics"; +import { PermissionsCheckbox } from "../components/PermissionsCheckbox"; +import { useExtendedPermissions } from "../hooks/useExtendedPermissions"; import { PageLink, renderAmount } from "../renderHtml"; import * as wxApi from "../wxApi"; -import { PermissionsCheckbox, useExtendedPermissions, Diagnostics } from "./welcome"; export enum Pages { balance = '/balance', diff --git a/packages/taler-wallet-webextension/src/popupEntryPoint.tsx b/packages/taler-wallet-webextension/src/popupEntryPoint.tsx index 0ef5a4896..926ae7aa7 100644 --- a/packages/taler-wallet-webextension/src/popupEntryPoint.tsx +++ b/packages/taler-wallet-webextension/src/popupEntryPoint.tsx @@ -27,7 +27,7 @@ import { useEffect, useState } from "preact/hooks"; import { actionForTalerUri, findTalerUriInActiveTab, Pages, WalletBalanceView, WalletDebug, WalletHistory, WalletNavBar, WalletSettings, WalletTransaction, WalletTransactionView -} from "./pages/popup"; +} from "./popup/popup"; import Match from "preact-router/match"; import Router, { route, Route } from "preact-router"; // import { Application } from "./Application"; diff --git a/packages/taler-wallet-webextension/src/pages/pay.tsx b/packages/taler-wallet-webextension/src/wallet/pay.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/pay.tsx rename to packages/taler-wallet-webextension/src/wallet/pay.tsx diff --git a/packages/taler-wallet-webextension/src/pages/payback.tsx b/packages/taler-wallet-webextension/src/wallet/payback.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/payback.tsx rename to packages/taler-wallet-webextension/src/wallet/payback.tsx diff --git a/packages/taler-wallet-webextension/src/pages/refund.tsx b/packages/taler-wallet-webextension/src/wallet/refund.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/refund.tsx rename to packages/taler-wallet-webextension/src/wallet/refund.tsx diff --git a/packages/taler-wallet-webextension/src/pages/reset-required.tsx b/packages/taler-wallet-webextension/src/wallet/reset-required.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/reset-required.tsx rename to packages/taler-wallet-webextension/src/wallet/reset-required.tsx diff --git a/packages/taler-wallet-webextension/src/pages/return-coins.tsx b/packages/taler-wallet-webextension/src/wallet/return-coins.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/return-coins.tsx rename to packages/taler-wallet-webextension/src/wallet/return-coins.tsx diff --git a/packages/taler-wallet-webextension/src/pages/tip.tsx b/packages/taler-wallet-webextension/src/wallet/tip.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/tip.tsx rename to packages/taler-wallet-webextension/src/wallet/tip.tsx diff --git a/packages/taler-wallet-webextension/src/wallet/welcome.tsx b/packages/taler-wallet-webextension/src/wallet/welcome.tsx new file mode 100644 index 000000000..9be62bf8b --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/welcome.tsx @@ -0,0 +1,83 @@ +/* + 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 * as wxApi from "../wxApi"; +import { getPermissionsApi } from "../compat"; +import { extendedPermissions } from "../permissions"; +import { Fragment, JSX } from "preact/jsx-runtime"; +import { PermissionsCheckbox } from "../components/PermissionsCheckbox"; +import { useExtendedPermissions } from "../hooks/useExtendedPermissions"; +import { Diagnostics } from "../components/Diagnostics"; + +export async function handleExtendedPerm(isEnabled: boolean): Promise { + let nextVal: boolean | undefined; + + if (!isEnabled) { + 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); + nextVal = res.newValue; + } else { + const res = await wxApi.setExtendedPermissions(false); + nextVal = res.newValue; + } + console.log("new permissions applied:", nextVal ?? false); + return nextVal ?? false +} + +export function Welcome(): JSX.Element { + const [permissionsEnabled, togglePermissions] = useExtendedPermissions() + return ( + <> +

Thank you for installing the wallet.

+ +

Permissions

+ +

Next Steps

+ + Try the demo » + + + Learn how to top up your wallet balance » + + + ); +} + +/** + * @deprecated to be removed + */ +export function createWelcomePage(): JSX.Element { + return ; +} diff --git a/packages/taler-wallet-webextension/src/pages/withdraw.stories.tsx b/packages/taler-wallet-webextension/src/wallet/withdraw.stories.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/withdraw.stories.tsx rename to packages/taler-wallet-webextension/src/wallet/withdraw.stories.tsx diff --git a/packages/taler-wallet-webextension/src/pages/withdraw.tsx b/packages/taler-wallet-webextension/src/wallet/withdraw.tsx similarity index 100% rename from packages/taler-wallet-webextension/src/pages/withdraw.tsx rename to packages/taler-wallet-webextension/src/wallet/withdraw.tsx diff --git a/packages/taler-wallet-webextension/src/walletEntryPoint.tsx b/packages/taler-wallet-webextension/src/walletEntryPoint.tsx index 607c87d39..2d1671dd4 100644 --- a/packages/taler-wallet-webextension/src/walletEntryPoint.tsx +++ b/packages/taler-wallet-webextension/src/walletEntryPoint.tsx @@ -25,11 +25,11 @@ import { setupI18n } from "@gnu-taler/taler-util"; import { strings } from "./i18n/strings"; import { createHashHistory } from 'history'; -import { WithdrawalDialog } from "./pages/withdraw"; -import { Welcome } from "./pages/welcome"; -import { TalerPayDialog } from "./pages/pay"; -import { RefundStatusView } from "./pages/refund"; -import { TalerTipDialog } from './pages/tip'; +import { WithdrawalDialog } from "./wallet/withdraw"; +import { Welcome } from "./wallet/welcome"; +import { TalerPayDialog } from "./wallet/pay"; +import { RefundStatusView } from "./wallet/refund"; +import { TalerTipDialog } from './wallet/tip'; import Router, { route, Route } from "preact-router"; @@ -64,7 +64,6 @@ enum Pages { return_coins = '/return-coins', tips = '/tips', withdraw = '/withdraw', - // popup = '/popup/:rest*', } function Application() {