take translator from transaltion context

This commit is contained in:
Sebastian 2022-03-14 15:20:32 -03:00
parent 1d7c8f7083
commit 08959f83bc
No known key found for this signature in database
GPG Key ID: BE4FF68352439FC1
37 changed files with 175 additions and 213 deletions

View File

@ -27,7 +27,7 @@
import { VNode, h } from "preact";
import { JustInDevMode } from "./components/JustInDevMode";
import { NavigationHeader, NavigationHeaderHolder } from "./components/styled";
import { useTranslationContext } from "./context/translation.js";
import { useTranslationContext } from "./context/translation";
/**
* List of pages used by the wallet

View File

@ -17,7 +17,7 @@
import { PaytoUri } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
import { useTranslationContext } from "../context/translation.js";
import { useTranslationContext } from "../context/translation";
import { CopiedIcon, CopyIcon } from "../svg";
import { ButtonBox, TooltipRight } from "./styled";

View File

@ -14,8 +14,8 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useTranslationContext } from "../context/translation";
export function DebugCheckbox({
enabled,
@ -24,6 +24,8 @@ export function DebugCheckbox({
enabled: boolean;
onToggle: () => void;
}): VNode {
const { i18n } = useTranslationContext();
return (
<div>
<input

View File

@ -14,8 +14,9 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n, WalletDiagnostics } from "@gnu-taler/taler-util";
import { WalletDiagnostics } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useTranslationContext } from "../context/translation";
import { PageLink } from "../renderHtml";
interface Props {
@ -24,6 +25,7 @@ interface Props {
}
export function Diagnostics({ timedOut, diagnostics }: Props): VNode {
const { i18n } = useTranslationContext();
if (timedOut) {
return (
<p>

View File

@ -14,9 +14,9 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useRef, useState } from "preact/hooks";
import { useTranslationContext } from "../context/translation";
interface Props {
value: string;
@ -32,6 +32,7 @@ export function EditableText({
label,
description,
}: Props): VNode {
const { i18n } = useTranslationContext();
const [editing, setEditing] = useState(false);
const ref = useRef<HTMLInputElement>(null);
let InputText;

View File

@ -13,13 +13,30 @@
You should have received a copy of the GNU General Public License along with
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { Fragment, h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
import { useTranslationContext } from "../context/translation";
import { CenteredText } from "./styled";
export function Loading(): VNode {
const { i18n } = useTranslationContext();
const [tooLong, setTooLong] = useState(false);
useEffect(() => {
const id = setTimeout(() => {
setTooLong(true);
}, 500);
return () => {
clearTimeout(id);
};
});
if (tooLong) {
return (
<div>
<section style={{ margin: "auto" }}>
<CenteredText>
<i18n.Translate>Loading</i18n.Translate>...
</div>
</CenteredText>
</section>
);
}
return <Fragment />;
}

View File

@ -14,8 +14,8 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useTranslationContext } from "../context/translation";
import { NiceSelect } from "./styled";
interface Props {
@ -39,6 +39,7 @@ export function SelectList({
description,
canBeNull,
}: Props): VNode {
const { i18n } = useTranslationContext();
return (
<Fragment>
<label

View File

@ -21,23 +21,18 @@ import {
Timestamp,
Transaction,
TransactionType,
i18n,
} from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import imageBank from "../../static/img/ri-bank-line.svg";
import imageHandHeart from "../../static/img/ri-hand-heart-line.svg";
import imageRefresh from "../../static/img/ri-refresh-line.svg";
import imageRefund from "../../static/img/ri-refund-2-line.svg";
import imageShoppingCart from "../../static/img/ri-shopping-cart-line.svg";
import { useTranslationContext } from "../context/translation";
import { Avatar } from "../mui/Avatar";
import { Pages } from "../NavigationBar";
import {
Column,
ExtraLargeText,
HistoryRow,
SmallLightText,
LargeText,
LightText,
SmallLightText,
} from "./styled";
import { Time } from "./Time";
@ -121,6 +116,7 @@ export function TransactionItem(props: { tx: Transaction }): VNode {
}
function TransactionLayout(props: TransactionLayoutProps): VNode {
const { i18n } = useTranslationContext();
return (
<HistoryRow
href={Pages.balance_transaction.replace(":tid", props.id)}
@ -183,6 +179,7 @@ interface TransactionAmountProps {
}
function TransactionAmount(props: TransactionAmountProps): VNode {
const { i18n } = useTranslationContext();
let sign: string;
switch (props.debitCreditIndicator) {
case "credit":

View File

@ -31,7 +31,8 @@ interface Type {
lang: string;
supportedLang: { [id in keyof typeof supportedLang]: string }
changeLanguage: (l: string) => void;
i18n: typeof i18n
i18n: typeof i18n;
isSaved: boolean;
}
const supportedLang = {
@ -44,7 +45,8 @@ const supportedLang = {
it: "Italiano [it]",
// ko: "한국어 [ko]",
// ru: "Ру́сский язы́к [ru]",
tr: "Türk [tr]"
tr: "Türk [tr]",
navigator: "Defined by navigator",
};
@ -54,7 +56,8 @@ const initial = {
changeLanguage: () => {
// do not change anything
},
i18n
i18n,
isSaved: false,
};
const Context = createContext<Type>(initial);
@ -69,7 +72,7 @@ export const TranslationProvider = ({
children,
forceLang,
}: Props): VNode => {
const [lang, changeLanguage] = useLang(initial);
const [lang, changeLanguage, isSaved] = useLang(initial);
useEffect(() => {
if (forceLang) {
changeLanguage(forceLang);
@ -83,7 +86,7 @@ export const TranslationProvider = ({
} else {
setupI18n(lang, strings);
}
return h(Context.Provider, { value: { lang, changeLanguage, supportedLang, i18n }, children });
return h(Context.Provider, { value: { lang, changeLanguage, supportedLang, i18n, isSaved }, children });
};
export const useTranslationContext = (): Type => useContext(Context);

View File

@ -22,7 +22,6 @@
/**
* Imports.
*/
// import * as i18n from "../i18n";
import {
AmountJson,
@ -31,7 +30,6 @@ import {
ConfirmPayResult,
ConfirmPayResultType,
ContractTerms,
i18n,
NotificationType,
PreparePayResult,
PreparePayResultType,
@ -49,6 +47,7 @@ import {
WalletAction,
WarningBox,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
@ -58,6 +57,7 @@ interface Props {
}
export function DepositPage({ talerPayUri, goBack }: Props): VNode {
const { i18n } = useTranslationContext();
const [payStatus, setPayStatus] = useState<PreparePayResult | undefined>(
undefined,
);
@ -199,6 +199,7 @@ export function PaymentRequestView({
}: PaymentRequestViewProps): VNode {
let totalFees: AmountJson = Amounts.getZero(payStatus.amountRaw);
const contractTerms: ContractTerms = payStatus.contractTerms;
const { i18n } = useTranslationContext();
return (
<WalletAction>

View File

@ -22,7 +22,6 @@
/**
* Imports.
*/
// import * as i18n from "../i18n";
import {
AmountJson,
@ -32,12 +31,10 @@ import {
ConfirmPayResultDone,
ConfirmPayResultType,
ContractTerms,
i18n,
NotificationType,
PreparePayResult,
PreparePayResultType,
Product,
Translate,
} from "@gnu-taler/taler-util";
import { OperationFailedError } from "@gnu-taler/taler-wallet-core";
import { Fragment, h, VNode } from "preact";
@ -50,13 +47,13 @@ import { Part } from "../components/Part";
import { QR } from "../components/QR";
import {
ButtonSuccess,
LightText,
LinkSuccess,
SmallLightText,
SuccessBox,
WalletAction,
WarningBox,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
@ -89,6 +86,7 @@ export function PayPage({
goToWalletManualWithdraw,
goBack,
}: Props): VNode {
const { i18n } = useTranslationContext();
const [payResult, setPayResult] = useState<ConfirmPayResult | undefined>(
undefined,
);
@ -166,6 +164,7 @@ export function PaymentRequestView({
goToWalletManualWithdraw,
balance,
}: PaymentRequestViewProps): VNode {
const { i18n } = useTranslationContext();
let totalFees: AmountJson = Amounts.getZero(payStatus.amountRaw);
const contractTerms: ContractTerms = payStatus.contractTerms;
@ -412,6 +411,7 @@ export function PaymentRequestView({
}
function ProductList({ products }: { products: Product[] }): VNode {
const { i18n } = useTranslationContext();
return (
<Fragment>
<SmallLightText style={{ margin: ".5em" }}>

View File

@ -20,9 +20,10 @@
* @author sebasjm
*/
import { Amounts, ApplyRefundResponse, i18n } from "@gnu-taler/taler-util";
import { Amounts, ApplyRefundResponse } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
import { useTranslationContext } from "../context/translation";
import { AmountView } from "../renderHtml";
import * as wxApi from "../wxApi";
@ -33,6 +34,7 @@ export interface ViewProps {
applyResult: ApplyRefundResponse;
}
export function View({ applyResult }: ViewProps): VNode {
const { i18n } = useTranslationContext();
return (
<section class="main">
<h1>GNU Taler Wallet</h1>
@ -71,6 +73,7 @@ export function RefundPage({ talerRefundUri }: Props): VNode {
const [applyResult, setApplyResult] = useState<
ApplyRefundResponse | undefined
>(undefined);
const { i18n } = useTranslationContext();
const [errMsg, setErrMsg] = useState<string | undefined>(undefined);
useEffect(() => {

View File

@ -1,4 +1,3 @@
import { i18n, Translate } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { CheckboxOutlined } from "../components/CheckboxOutlined";
import { ExchangeXmlTos } from "../components/ExchangeToS";
@ -10,6 +9,7 @@ import {
WarningBox,
WarningText,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { TermsState } from "../utils/index";
interface Props {
@ -26,6 +26,7 @@ export function TermsOfServiceSection({
onAccept,
onReview,
}: Props): VNode {
const { i18n } = useTranslationContext();
if (!reviewing) {
if (!reviewed) {
if (!onReview) {

View File

@ -20,10 +20,11 @@
* @author sebasjm <dold@taler.net>
*/
import { PrepareTipResult, i18n } from "@gnu-taler/taler-util";
import { PrepareTipResult } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
import { Loading } from "../components/Loading";
import { useTranslationContext } from "../context/translation";
import { AmountView } from "../renderHtml";
import * as wxApi from "../wxApi";
@ -40,6 +41,7 @@ export function View({
onAccept,
onIgnore,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
return (
<section class="main">
<h1>GNU Taler Wallet</h1>
@ -77,6 +79,7 @@ export function View({
}
export function TipPage({ talerTipUri }: Props): VNode {
const { i18n } = useTranslationContext();
const [updateCounter, setUpdateCounter] = useState<number>(0);
const [prepareTipResult, setPrepareTipResult] = useState<
PrepareTipResult | undefined

View File

@ -25,7 +25,6 @@ import {
AmountJson,
Amounts,
ExchangeListItem,
i18n,
Translate,
WithdrawUriInfoResponse,
} from "@gnu-taler/taler-util";
@ -52,6 +51,7 @@ import {
} from "../utils/index";
import * as wxApi from "../wxApi";
import { TermsOfServiceSection } from "./TermsOfServiceSection";
import { useTranslationContext } from "../context/translation";
interface Props {
talerWithdrawUri?: string;
@ -84,6 +84,7 @@ export function View({
onAccept,
reviewed,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
const [withdrawError, setWithdrawError] = useState<
OperationFailedError | undefined
>(undefined);
@ -236,12 +237,10 @@ export function WithdrawPageWithParsedURI({
uri: string;
uriInfo: WithdrawUriInfoResponse;
}): VNode {
const { i18n } = useTranslationContext();
const [customExchange, setCustomExchange] = useState<string | undefined>(
undefined,
);
// const [errorAccepting, setErrorAccepting] = useState<string | undefined>(
// undefined,
// );
const [reviewing, setReviewing] = useState<boolean>(false);
const [reviewed, setReviewed] = useState<boolean>(false);
@ -332,6 +331,7 @@ export function WithdrawPageWithParsedURI({
);
}
export function WithdrawPage({ talerWithdrawUri }: Props): VNode {
const { i18n } = useTranslationContext();
const uriInfoHook = useAsyncAsHook(() =>
!talerWithdrawUri
? Promise.reject(undefined)

View File

@ -1,112 +0,0 @@
/*
This file is part of TALER
(C) 2017 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 <http://www.gnu.org/licenses/>
*/
/**
* Page to inform the user when a database reset is required.
*
* @author sebasjm
*/
import { i18n } from "@gnu-taler/taler-util";
import { Component, h, VNode } from "preact";
import * as wxApi from "../wxApi";
interface State {
/**
* Did the user check the confirmation check box?
*/
checked: boolean;
/**
* Do we actually need to reset the db?
*/
resetRequired: boolean;
}
class ResetNotification extends Component<any, State> {
constructor(props: any) {
super(props);
this.state = { checked: false, resetRequired: true };
setInterval(() => this.update(), 500);
}
async update(): Promise<void> {
const res = await wxApi.checkUpgrade();
this.setState({ resetRequired: res.dbResetRequired });
}
render(): VNode {
if (this.state.resetRequired) {
return (
<div>
<h1>
<i18n.Translate>Manual Reset Required</i18n.Translate>
</h1>
<p>
<i18n.Translate>
The wallet&apos;s database in your browser is incompatible with
the currently installed wallet. Please reset manually.
</i18n.Translate>
</p>
<p>
<i18n.Translate>
Once the database format has stabilized, we will provide automatic
upgrades.
</i18n.Translate>
</p>
<input
id="check"
type="checkbox"
checked={this.state.checked}
onChange={() => {
this.setState((prev) => ({ checked: prev.checked }));
}}
/>{" "}
<label htmlFor="check">
<i18n.Translate>
I understand that I will lose all my data
</i18n.Translate>
</label>
<br />
<button
class="pure-button"
disabled={!this.state.checked}
onClick={() => wxApi.resetDb()}
>
<i18n.Translate>Reset</i18n.Translate>
</button>
</div>
);
}
return (
<div>
<h1>
<i18n.Translate>Everything is fine!</i18n.Translate>
</h1>
<p>
<i18n.Translate>
A reset is not required anymore, you can close this page.
</i18n.Translate>
</p>
</div>
);
}
}
/**
* @deprecated to be removed
*/
export function createResetRequiredPage(): VNode {
return <ResetNotification />;
}

View File

@ -14,8 +14,8 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useTranslationContext } from "../context/translation";
/**
* Return coins to own bank account.
*
@ -26,6 +26,7 @@ import { h, VNode } from "preact";
* Imports.
*/
export function createReturnCoinsPage(): VNode {
const { i18n } = useTranslationContext();
return (
<span>
<i18n.Translate>Not implemented yet.</i18n.Translate>

View File

@ -22,7 +22,7 @@ function getBrowserLang(): string | undefined {
return undefined;
}
export function useLang(initial?: string): [string, (s: string) => void] {
export function useLang(initial?: string): [string, (s: string) => void, boolean] {
const defaultLang = (getBrowserLang() || initial || "en").substring(0, 2);
return useNotNullLocalStorage("lang-preference", defaultLang);
}

View File

@ -56,7 +56,7 @@ export function useLocalStorage(
export function useNotNullLocalStorage(
key: string,
initialValue: string,
): [string, StateUpdater<string>] {
): [string, StateUpdater<string>, boolean] {
const [storedValue, setStoredValue] = useState<string>((): string => {
return typeof window !== "undefined"
? window.localStorage.getItem(key) || initialValue
@ -75,5 +75,6 @@ export function useNotNullLocalStorage(
}
};
return [storedValue, setValue];
const isSaved = window.localStorage.getItem(key) !== null;
return [storedValue, setValue, isSaved];
}

View File

@ -17,7 +17,6 @@
import {
Amounts,
Balance,
i18n,
NotificationType,
Transaction,
} from "@gnu-taler/taler-util";
@ -29,6 +28,7 @@ import { Loading } from "../components/Loading";
import { LoadingError } from "../components/LoadingError";
import { MultiActionButton } from "../components/MultiActionButton";
import { ButtonBoxPrimary, ButtonPrimary } from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { AddNewActionView } from "../wallet/AddNewActionView";
import * as wxApi from "../wxApi";
@ -44,6 +44,7 @@ export function BalancePage({
goToWalletDeposit,
goToWalletHistory,
}: Props): VNode {
const { i18n } = useTranslationContext();
const [addingAction, setAddingAction] = useState(false);
const state = useAsyncAsHook(wxApi.getBalance, [
NotificationType.WithdrawGroupFinished,
@ -92,6 +93,7 @@ export function BalanceView({
goToWalletHistory,
goToAddAction,
}: BalanceViewProps): VNode {
const { i18n } = useTranslationContext();
const currencyWithNonZeroAmount = balances
.filter((b) => !Amounts.isZero(b.available))
.map((b) => b.available.split(":")[0]);

View File

@ -21,7 +21,6 @@ import {
ExchangeListItem,
NotificationType,
Translate,
i18n,
} from "@gnu-taler/taler-util";
import { PendingTaskInfo } from "@gnu-taler/taler-wallet-core";
import { format } from "date-fns";
@ -30,6 +29,7 @@ import { useRef, useState } from "preact/hooks";
import { Diagnostics } from "../components/Diagnostics";
import { NotifyUpdateFadeOut } from "../components/styled";
import { Time } from "../components/Time";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { useDiagnostics } from "../hooks/useDiagnostics";
import * as wxApi from "../wxApi";
@ -110,6 +110,7 @@ export function View({
coins,
onDownloadDatabase,
}: Props): VNode {
const { i18n } = useTranslationContext();
const [downloadedDatabase, setDownloadedDatabase] = useState<
{ time: Date; content: string } | undefined
>(undefined);
@ -153,7 +154,13 @@ export function View({
<p>
<i18n.Translate>Debug tools</i18n.Translate>:
</p>
<button onClick={confirmReset}>
<button
onClick={() =>
confirmReset(
i18n.str`Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?`,
)
}
>
<i18n.Translate>reset</i18n.Translate>
</button>
<br />
@ -262,6 +269,7 @@ function ShowAllCoins({
coins: SplitedCoinInfo;
currencies: { [ex: string]: string };
}) {
const { i18n } = useTranslationContext();
const [collapsedSpent, setCollapsedSpent] = useState(true);
const [collapsedUnspent, setCollapsedUnspent] = useState(false);
const total = coins.usable.reduce((prev, cur) => prev + cur.denom_value, 0);
@ -372,12 +380,10 @@ export function reload(): void {
function runIntegrationTest() {}
export async function confirmReset(): Promise<void> {
if (
confirm(
i18n.str`Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?`,
)
) {
export async function confirmReset(
confirmTheResetMessage: string,
): Promise<void> {
if (confirm(confirmTheResetMessage)) {
await wxApi.resetDb();
window.close();
}

View File

@ -1,12 +1,13 @@
import { i18n } from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { ButtonBoxWarning, WarningBox } from "../components/styled";
import { useTranslationContext } from "../context/translation";
export function NoBalanceHelp({
goToWalletManualWithdraw,
}: {
goToWalletManualWithdraw: () => void;
}): VNode {
const { i18n } = useTranslationContext();
return (
<WarningBox>
<p>

View File

@ -19,9 +19,10 @@
* @author Sebastian Javier Marchano (sebasjm)
*/
import { classifyTalerUri, TalerUriType, i18n } from "@gnu-taler/taler-util";
import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util";
import { Fragment, h } from "preact";
import { ButtonPrimary, ButtonSuccess } from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { actionForTalerUri } from "../utils/index";
export interface Props {
@ -49,6 +50,7 @@ async function navigateTo(url?: string) {
export function TalerActionFound({ url, onDismiss }: Props) {
const uriType = classifyTalerUri(url);
const { i18n } = useTranslationContext();
return (
<Fragment>
<section>

View File

@ -1,32 +1,18 @@
import { classifyTalerUri, TalerUriType, i18n } from "@gnu-taler/taler-util";
import { classifyTalerUri, TalerUriType } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { Button, ButtonSuccess, InputWithLabel } from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { actionForTalerUri } from "../utils/index";
export interface Props {
onCancel: () => void;
}
function buttonLabelByTalerType(type: TalerUriType): VNode {
switch (type) {
case TalerUriType.TalerNotifyReserve:
return <i18n.Translate>Open reserve page</i18n.Translate>;
case TalerUriType.TalerPay:
return <i18n.Translate>Open pay page</i18n.Translate>;
case TalerUriType.TalerRefund:
return <i18n.Translate>Open refund page</i18n.Translate>;
case TalerUriType.TalerTip:
return <i18n.Translate>Open tip page</i18n.Translate>;
case TalerUriType.TalerWithdraw:
return <i18n.Translate>Open withdraw page</i18n.Translate>;
}
return <Fragment />;
}
export function AddNewActionView({ onCancel }: Props): VNode {
const [url, setUrl] = useState("");
const uriType = classifyTalerUri(url);
const { i18n } = useTranslationContext();
return (
<Fragment>
@ -57,7 +43,21 @@ export function AddNewActionView({ onCancel }: Props): VNode {
chrome.tabs.create({ url: actionForTalerUri(uriType, url) });
}}
>
{buttonLabelByTalerType(uriType)}
{(() => {
switch (uriType) {
case TalerUriType.TalerNotifyReserve:
return <i18n.Translate>Open reserve page</i18n.Translate>;
case TalerUriType.TalerPay:
return <i18n.Translate>Open pay page</i18n.Translate>;
case TalerUriType.TalerRefund:
return <i18n.Translate>Open refund page</i18n.Translate>;
case TalerUriType.TalerTip:
return <i18n.Translate>Open tip page</i18n.Translate>;
case TalerUriType.TalerWithdraw:
return <i18n.Translate>Open withdraw page</i18n.Translate>;
}
return <Fragment />;
})()}
</ButtonSuccess>
)}
</footer>

View File

@ -14,7 +14,7 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n, Timestamp, Translate } from "@gnu-taler/taler-util";
import { Timestamp, Translate } from "@gnu-taler/taler-util";
import {
ProviderInfo,
ProviderPaymentPaid,
@ -40,6 +40,7 @@ import {
SmallLightText,
SmallText,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { Pages } from "../NavigationBar";
import * as wxApi from "../wxApi";
@ -65,6 +66,7 @@ interface Props {
// }
export function BackupPage({ onAddProvider }: Props): VNode {
const { i18n } = useTranslationContext();
const status = useAsyncAsHook(wxApi.getBackupInfo);
if (!status) {
return <Loading />;
@ -110,6 +112,7 @@ export function BackupView({
onAddProvider,
onSyncAll,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
return (
<Fragment>
<section>
@ -164,6 +167,7 @@ interface TransactionLayoutProps {
}
function BackupLayout(props: TransactionLayoutProps): VNode {
const { i18n } = useTranslationContext();
const date = !props.timestamp ? undefined : new Date(props.timestamp.t_ms);
const dateStr = date?.toLocaleString([], {
dateStyle: "medium",
@ -205,6 +209,7 @@ function BackupLayout(props: TransactionLayoutProps): VNode {
}
function ExpirationText({ until }: { until: Timestamp }): VNode {
const { i18n } = useTranslationContext();
return (
<Fragment>
<CenteredText>

View File

@ -19,7 +19,7 @@
* @author Sebastian Javier Marchano (sebasjm)
*/
import { AmountJson, Amounts, i18n, Translate } from "@gnu-taler/taler-util";
import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { ErrorMessage } from "../components/ErrorMessage";
@ -34,6 +34,7 @@ import {
LightText,
LinkPrimary,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
export interface Props {
error: string | undefined;
@ -52,6 +53,7 @@ export function CreateManualWithdraw({
onCreate,
onAddExchange,
}: Props): VNode {
const { i18n } = useTranslationContext();
const exchangeSelectList = Object.keys(exchangeList);
const currencySelectList = Object.values(exchangeList);
const exchangeMap = exchangeSelectList.reduce(

View File

@ -19,7 +19,6 @@ import {
Amounts,
AmountString,
PaytoUri,
i18n,
} from "@gnu-taler/taler-util";
import { DepositFee } from "@gnu-taler/taler-wallet-core/src/operations/deposits";
import { Fragment, h, VNode } from "preact";
@ -34,6 +33,7 @@ import {
InputWithLabel,
WarningBox,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
@ -103,6 +103,7 @@ export function View({
onSend,
onCalculateFee,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
const accountMap = createLabelsForBankAccount(knownBankAccounts);
const [accountIdx, setAccountIdx] = useState(0);
const [amount, setAmount] = useState<number | undefined>(undefined);

View File

@ -1,7 +1,7 @@
import { i18n, Translate } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { Button, ButtonSuccess, ButtonWarning } from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { TermsOfServiceSection } from "../cta/TermsOfServiceSection";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { buildTermsOfServiceState, TermsState } from "../utils/index";
@ -77,6 +77,7 @@ export function View({
onConfirm,
onCancel,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
const needsReview =
!terms || terms.status === "changed" || terms.status === "new";
const [reviewed, setReviewed] = useState<boolean>(false);

View File

@ -1,8 +1,6 @@
import {
canonicalizeBaseUrl,
i18n,
TalerConfigResponse,
Translate,
} from "@gnu-taler/taler-util";
import { Fragment, h } from "preact";
import { useEffect, useState } from "preact/hooks";
@ -14,6 +12,7 @@ import {
LightText,
WarningBox,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
export interface Props {
initialValue?: string;
@ -81,6 +80,7 @@ export function ExchangeSetUrlPage({
onVerify,
onConfirm,
}: Props) {
const { i18n } = useTranslationContext();
const { loading, result, endpoint, updateEndpoint, error } =
useEndpointStatus(initialValue ?? "", onVerify);

View File

@ -19,7 +19,6 @@ import {
Balance,
NotificationType,
Transaction,
i18n,
} from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
@ -37,6 +36,7 @@ import {
} from "../components/styled";
import { Time } from "../components/Time";
import { TransactionItem } from "../components/TransactionItem";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { NoBalanceHelp } from "../popup/NoBalanceHelp";
import * as wxApi from "../wxApi";
@ -51,6 +51,7 @@ export function HistoryPage({
goToWalletManualWithdraw,
goToWalletDeposit,
}: Props): VNode {
const { i18n } = useTranslationContext();
const balance = useAsyncAsHook(wxApi.getBalance);
const balanceWithoutError = balance?.hasError
? []
@ -106,6 +107,7 @@ export function HistoryView({
transactions: Transaction[];
balances: Balance[];
}): VNode {
const { i18n } = useTranslationContext();
const currencies = balances.map((b) => b.available.split(":")[0]);
const defaultCurrencyIndex = currencies.findIndex(

View File

@ -19,12 +19,12 @@ import {
AmountJson,
Amounts,
NotificationType,
i18n,
} from "@gnu-taler/taler-util";
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { Loading } from "../components/Loading";
import { LoadingError } from "../components/LoadingError";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import { Pages } from "../NavigationBar";
import * as wxApi from "../wxApi";
@ -51,6 +51,7 @@ export function ManualWithdrawPage({ currency, onCancel }: Props): VNode {
const state = useAsyncAsHook(wxApi.listExchanges, [
NotificationType.ExchangeAdded,
]);
const { i18n } = useTranslationContext();
async function doCreate(
exchangeBaseUrl: string,

View File

@ -18,7 +18,6 @@ import {
Amounts,
BackupBackupProviderTerms,
canonicalizeBaseUrl,
i18n,
Translate,
} from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
@ -32,6 +31,7 @@ import {
LightText,
SmallLightText,
} from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { queryToSlashConfig } from "../utils/index";
import * as wxApi from "../wxApi";
@ -90,6 +90,7 @@ export function SetUrlView({
onConfirm,
withError,
}: SetUrlViewProps) {
const { i18n } = useTranslationContext();
const [value, setValue] = useState<string>(initialValue || "");
const [urlError, setUrlError] = useState(false);
const [name, setName] = useState<string | undefined>(undefined);
@ -190,6 +191,7 @@ export function ConfirmProviderView({
onConfirm,
}: ConfirmProviderViewProps) {
const [accepted, setAccepted] = useState(false);
const { i18n } = useTranslationContext();
return (
<Fragment>

View File

@ -14,7 +14,7 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { i18n } from "@gnu-taler/taler-util";
import * as utils from "@gnu-taler/taler-util";
import {
ProviderInfo,
ProviderPaymentStatus,
@ -32,6 +32,7 @@ import {
SmallLightText,
} from "../components/styled";
import { Time } from "../components/Time";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
@ -41,6 +42,7 @@ interface Props {
}
export function ProviderDetailPage({ pid: providerURL, onBack }: Props): VNode {
const { i18n } = useTranslationContext();
async function getProviderInfo(): Promise<ProviderInfo | null> {
//create a first list of backup info by currency
const status = await wxApi.getBackupInfo();
@ -100,6 +102,7 @@ export function ProviderView({
onBack,
onExtend,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
if (info === null) {
return (
<Fragment>
@ -156,7 +159,7 @@ export function ProviderView({
</p>
</Fragment>
)}
<p>{descriptionByStatus(info.paymentStatus)}</p>
<p>{descriptionByStatus(info.paymentStatus, i18n)}</p>
<ButtonPrimary disabled onClick={onExtend}>
<i18n.Translate>Extend</i18n.Translate>
</ButtonPrimary>
@ -219,6 +222,7 @@ export function ProviderView({
}
function Error({ info }: { info: ProviderInfo }): VNode {
const { i18n } = useTranslationContext();
if (info.lastError) {
return (
<ErrorMessage
@ -267,7 +271,10 @@ function Error({ info }: { info: ProviderInfo }): VNode {
return <Fragment />;
}
function descriptionByStatus(status: ProviderPaymentStatus): VNode {
function descriptionByStatus(
status: ProviderPaymentStatus,
i18n: typeof utils.i18n,
): VNode {
switch (status.type) {
case ProviderPaymentType.Paid:
case ProviderPaymentType.TermsChanged:

View File

@ -1,7 +1,6 @@
import {
AmountJson,
parsePaytoUri,
i18n,
Amounts,
segwitMinAmount,
generateFakeSegwitAddress,
@ -10,6 +9,7 @@ import { Fragment, h, VNode } from "preact";
import { BankDetailsByPaytoType } from "../components/BankDetailsByPaytoType";
import { QR } from "../components/QR";
import { ButtonDestructive, WarningBox } from "../components/styled";
import { useTranslationContext } from "../context/translation";
import { amountToString } from "../utils/index";
export interface Props {
reservePub: string;
@ -26,6 +26,7 @@ export function ReserveCreated({
exchangeBaseUrl,
amount,
}: Props): VNode {
const { i18n } = useTranslationContext();
const paytoURI = parsePaytoUri(payto);
if (!paytoURI) {
return (

View File

@ -14,9 +14,10 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { ExchangeListItem, i18n, Translate } from "@gnu-taler/taler-util";
import { ExchangeListItem } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { Checkbox } from "../components/Checkbox";
import { JustInDevMode } from "../components/JustInDevMode";
import { SelectList } from "../components/SelectList";
import {
DestructiveText,
@ -80,24 +81,11 @@ export function SettingsView({
developerMode,
toggleDeveloperMode,
}: ViewProps): VNode {
const { lang, supportedLang, changeLanguage } = useTranslationContext();
const { i18n, lang, supportedLang, changeLanguage } = useTranslationContext();
return (
<Fragment>
<section>
<h2>
<i18n.Translate>Display</i18n.Translate>
</h2>
<Input>
<SelectList
label={<i18n.Translate>Current Language</i18n.Translate>}
list={supportedLang}
name="lang"
value={lang}
onChange={(v) => changeLanguage(v)}
/>
</Input>
<h2>
<i18n.Translate>Navigator</i18n.Translate>
</h2>
@ -206,6 +194,21 @@ export function SettingsView({
enabled={developerMode}
onToggle={toggleDeveloperMode}
/>
<JustInDevMode>
<h2>
<i18n.Translate>Display</i18n.Translate>
</h2>
<Input>
<SelectList
label={<i18n.Translate>Current Language</i18n.Translate>}
list={supportedLang}
name="lang"
value={lang}
onChange={(v) => changeLanguage(v)}
/>
</Input>
</JustInDevMode>
</section>
</Fragment>
);

View File

@ -17,7 +17,6 @@
import {
AmountLike,
Amounts,
i18n,
NotificationType,
parsePaytoUri,
Transaction,
@ -46,6 +45,7 @@ import {
WarningBox,
} from "../components/styled";
import { Time } from "../components/Time";
import { useTranslationContext } from "../context/translation";
import { useAsyncAsHook } from "../hooks/useAsyncAsHook";
import * as wxApi from "../wxApi";
@ -54,6 +54,7 @@ interface Props {
goToWalletHistory: (currency?: string) => void;
}
export function TransactionPage({ tid, goToWalletHistory }: Props): VNode {
const { i18n } = useTranslationContext();
async function getTransaction(): Promise<Transaction> {
const res = await wxApi.getTransactions();
const ts = res.transactions.filter((t) => t.transactionId === tid);
@ -127,6 +128,8 @@ export function TransactionView({
}
}
const { i18n } = useTranslationContext();
function TransactionTemplate({
children,
}: {

View File

@ -20,10 +20,11 @@
* @author sebasjm
*/
import { i18n, WalletDiagnostics } from "@gnu-taler/taler-util";
import { WalletDiagnostics } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { Checkbox } from "../components/Checkbox";
import { Diagnostics } from "../components/Diagnostics";
import { useTranslationContext } from "../context/translation";
import { useDiagnostics } from "../hooks/useDiagnostics";
import { useExtendedPermissions } from "../hooks/useExtendedPermissions";
@ -52,6 +53,7 @@ export function View({
diagnostics,
timedOut,
}: ViewProps): VNode {
const { i18n } = useTranslationContext();
return (
<Fragment>
<h1>