Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into IOBP-512-fix-error-…
Browse files Browse the repository at this point in the history
…screen-into-wallet-details
  • Loading branch information
Hantex9 committed Jan 23, 2024
2 parents 0a08463 + 9634f37 commit 119714b
Show file tree
Hide file tree
Showing 13 changed files with 428 additions and 326 deletions.
96 changes: 90 additions & 6 deletions locales/de/index.yml
Original file line number Diff line number Diff line change
Expand Up @@ -704,7 +704,7 @@ authentication:
description1_2: "Alternativ kannst du die App auch über ein Login mit der"
description1_3: "höchsten Sicherheitsstufe öffnen."
description1_4: "Diese Art der Authentifizierung erfordert einen Benutzernamen, ein Passwort und ein physisches Medium, wie z.B. eine CIE."
title2: "Wie man den Zugang zu IO entsperrst"
title2: "Möchtest du den Zugang zu IO entsperren?"
listitem1: "Stell sicher, dass du deine digitale Identität abgesichert hast, indem du deine Anmeldedaten bei deinem Identitätsanbieter änderst."
listitem2_1: "Greif über das Internet auf IO zu, indem du deine SPID-Anmeldedaten oder deine CIE verwendest."
listitem2_2: "Geh zur Website"
Expand Down Expand Up @@ -1598,6 +1598,22 @@ wallet:
title: "Gib die Steuernummer der Körperschaft ein"
subtitle: "Sie hat 11 Ziffern und ist neben dem QR-Code zu finden."
placeholder: "Steuernummer der Körperschaft"
abortDialog:
title: "Möchtest du den Vorgang abbrechen?"
confirm: "Ja, abbrechen"
cancel: "Nein, zurück"
methodSelection:
header: "Zahlungsmethode auswählen"
yourMethods: "Deine Zahlungsmethoden"
otherMethods: "Andere Zahlungsmethoden"
alert:
body: "Aufgrund des größeren Betrags sind einige Zahlungsmethoden nicht verfügbar."
cta: "OK, habe verstanden!"
missingMethodsError:
title: "Füge eine Zahlungsmethode für In-App-Zahlungen hinzu"
subtitle: "Die Zahlungsmethode wird in deinem Konto gespeichert, so dass du beim nächsten Mal einfacher bezahlen kannst."
addMethod: "Zahlungsmethode hinzufügen"
notNow: "Jetzt nicht"
psp:
title: "Wähle, von wem die Zahlung abgewickelt werden soll"
description: "Jeder Zahlungsdienstleister (PSP) schlägt eine Provision vor."
Expand All @@ -1612,14 +1628,76 @@ wallet:
default: "Standard"
amount: "Nach Betrag"
name: "Nach Name"
failure:
PAYMENT_UNAVAILABLE:
title: "Es gibt ein technisches Problem mit dieser Zahlungsmitteilung."
PAYMENT_UNKNOWN:
title: "Die Daten der Zahlungsmitteilung sind falsch"
DOMAIN_UNKNOWN:
title: "Die ausstellende Körperschaft hat Probleme bei der Bearbeitung"
subtitle: "Bitte versuche es später noch einmal. Wenn das Problem weiterhin besteht, wende dich bitte an den Support."
PAYMENT_ONGOING:
title: "Es ist bereits eine Zahlung im Gange, bitte versuche es später noch einmal"
subtitle: "Wenn das Problem weiterhin besteht, kannst du ein Ticket erstellen."
PAYMENT_EXPIRED:
title: "Die Zahlungsmitteilung ist abgelaufen und kann nicht mehr bezahlt werden"
subtitle: "Wende dich für weitere Informationen an die Körperschaft."
PAYMENT_CANCELED:
title: "Die ausstellende Körperschaft hat diese Zahlungsmitteilung zurückgezogen"
subtitle: "Wende dich für weitere Informationen an die Körperschaft."
PAYMENT_DUPLICATED:
title: "Diese Zahlungsmitteilung wurde bereits bezahlt!"
GENERIC_ERROR:
title: "Ein unerwarteter Fehler ist aufgetreten"
subtitle: "Versuche es erneut oder wende dich an den Support."
PAA_PAGAMENTO_SCONOSCIUTO:
title: "Wir können die Zahlungsmitteilung nicht finden"
subtitle: "Die Zahlungsmitteilung kann bereits bezahlt worden sein. Wende dich bitte an den ausstellende Körperschaft."
outcome:
SUCCESS:
title: "Du hast {{amount}} bezahlt"
button: "OK, schließen"
banner:
title: "Kannst du uns sagen, wie es lief?"
content: "Erzähl uns von deinen Erfahrungen mit der Zahlung und hilf uns, uns zu verbessern."
action: "Weiter zur Umfrage"
action: "Zur Umfrage"
GENERIC_ERROR:
title: "Es ist ein unerwarteter Fehler aufgetreten"
subtitle: "Es wurde kein Betrag abgebucht."
AUTH_ERROR:
title: "Autorisierung verweigert"
subtitle: "Es wurde kein Betrag abgebucht.\nVergewissere dich, dass du die Anweisungen deiner Bank oder Zahlungsapp korrekt befolgt hast."
INVALID_DATA:
title: "Die Daten der Zahlungsmethode sind falsch"
subtitle: "Wenn du mit einer Debit- oder Kreditkarte bezahlt hast, musst du die Daten wie auf der Karte angegeben eingeben."
TIMEOUT:
title: "Die Sitzung ist abgelaufen"
subtitle: "Es wurde kein Betrag abgebucht.\nZu deiner Sicherheit hast du nur eine begrenzte Zeit, um den Vorgang abzuschließen."
CIRCUIT_ERROR:
title: "Das Kartennetzwerk deiner Karte wird nicht unterstützt"
MISSING_FIELDS:
title: "Es fehlen einige Daten, um mit der Zahlung fortzufahren"
INVALID_CARD:
title: "Die Zahlungsmethode ist abgelaufen oder nicht mehr gültig"
subtitle: "Weitere Informationen erhältst du bei deiner Bank."
CANCELED_BY_USER:
title: "Der Vorgang wurde abgebrochen"
subtitle: "Es wurde kein Betrag abgebucht."
EXCESSIVE_AMOUNT:
title: "Autorisierung verweigert"
subtitle: "Es wurde kein Betrag abgebucht.\nDu hast wahrscheinlich die Obergrenze deiner Zahlungsmethode überschritten."
INVALID_METHOD:
title: "Die Zahlungsmethode wird nicht unterstützt"
support:
button: "Support kontaktieren"
supportTitle: "Support kontaktieren"
phone: "{{phoneNumber}} anrufen"
chat: "Im Chat um Hilfe fragen"
additionalDataTitle: "Zusätzliche Daten"
copyAll: "Alles kopieren"
errorCode: "Fehlercode"
noticeNumber: "Zahlungskodex"
entityCode: "Steuernummer Körperschaft"
saveCard:
saveCard: "Karte speichern"
header: "Möchtest du diese Karte speichern?"
Expand Down Expand Up @@ -2063,13 +2141,13 @@ bonus:
goToDetail: "Die Karte anzeigen"
detail:
cta:
buyers: "CGN Rabatte und Ermäßigungen anzeigen"
buyers: "CGN Ermäßigungen anzeigen"
otp: "Code generieren"
eyca:
copy: "EYCA Kartennummer kopieren"
pending: "EYCA Rabatte und Ermäßigungen anzeigen"
pending: "EYCA Ermäßigungen anzeigen"
bottomSheet: "Besuche die EYCA Website"
showEycaDiscounts: "EYCA Rabatte und Ermäßigungen anzeigen"
showEycaDiscounts: "EYCA Ermäßigungen anzeigen"
information:
active: "Die Karte ist aktiv und kann bis zum {{date}} verwendet werden."
warning: "Achtung! "
Expand Down Expand Up @@ -2373,6 +2451,7 @@ whatsNew:
bonusCard:
validUntil: "Gültig bis {{endDate}}"
expiring: "Verfällt am {{endDate}}"
expired: "Abgelaufen am {{endDate}}"
paused: "In Pause"
removed: "Entfernt"
transaction:
Expand All @@ -2381,6 +2460,7 @@ transaction:
totalAmount: "Insgesamt"
totalFee: "Der Gesamtbetrag umfasst "
totalFeePsp: "Provision, berechnet von {{pspName}}"
totalFeeNoPsp: "Provision, die vom Transaktionsdienstleister (PSP) erhoben wird."
info:
title: "Informationen zur Transaktion"
pspName: "Zahlungsdienstleister (PSP)"
Expand All @@ -2394,7 +2474,7 @@ transaction:
subject: "Zahlungsgrund"
permissionRequest:
gallery:
title: "Erlaube IO den Zugriff auf deine Fotos"
title: "Erlaube IO den Zugriff auf deine Fotos"
subtitle: "Dazu musst du die Rechte in den Einstellungen deines Geräts ändern."
caption: "So geht's:"
step: "Schritt {{step}}"
Expand All @@ -2405,4 +2485,8 @@ permissionRequest:
3: "Wähle “IO”"
4: "Wähle den Punkt App-Berechtigungen"
5: "Lass den Zugriff auf Dateien und Medien zu"
ios:
1: "Geh zu “Einstellungen”"
2: "Wähle “IO”"
3: "Wähle “Fotos” und erlaube den Zugriff"
cta: "Öffne Einstellungen"
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
"idpay_api": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v6.9.1/src/domains/idpay-app/api/idpay_appio_full/openapi.appio.full.yml",
"lollipop_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.25.1-RELEASE/api_lollipop_first_consumer.yaml",
"fast_login_api": "https://raw.githubusercontent.com/pagopa/io-backend/v13.25.1-RELEASE/openapi/generated/api_fast_login.yaml",
"pagopa_api_walletv3": "https://raw.githubusercontent.com/pagopa/pagopa-infra/4cd111e94432ff62580adc391de78a5462a7128e/src/domains/wallet-app/api/payment-wallet/v1/_openapi.json.tpl",
"pagopa_api_ecommerce": "https://raw.githubusercontent.com/pagopa/pagopa-infra/65878f9913fcc0eaff499ba8a1a20427a412c010/src/domains/ecommerce-app/api/ecommerce-io/v1/_openapi.json.tpl",
"pagopa_api_walletv3": "https://raw.githubusercontent.com/pagopa/pagopa-infra/740e7dcc5ea2ea19639316fea6797bbd504dd0ae/src/domains/wallet-app/api/payment-wallet/v1/_openapi.json.tpl",
"pagopa_api_ecommerce": "https://raw.githubusercontent.com/pagopa/pagopa-infra/5190135ac34791cf66c1986735d4134bcaf4096f/src/domains/ecommerce-app/api/ecommerce-io/v1/_openapi.json.tpl",
"private": true,
"scripts": {
"start": "react-native start",
Expand Down
2 changes: 1 addition & 1 deletion ts/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export const remindersOptInEnabled = Config.REMINDERS_OPT_IN_ENABLED === "YES";
export const isNewCduFlow = Config.CDU_NEW_FLOW === "YES";

// version of ToS
export const tosVersion: NonNegativeNumber = 4.7 as NonNegativeNumber;
export const tosVersion: NonNegativeNumber = 4.8 as NonNegativeNumber;

export const fetchTimeout = pipe(
parseInt(Config.FETCH_TIMEOUT_MS, 10),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ type Props = { paymentMethod: WalletInfo };
* - global settings (payment capability, favourite, etc.)
*/
const WalletDetailsPaymentMethodFeatures = ({ paymentMethod }: Props) => {
const isMethodExpired = isPaymentMethodExpired(paymentMethod);
const isMethodExpired = isPaymentMethodExpired(paymentMethod.details);
const isIdpayEnabled = useIOSelector(isIdPayEnabledSelector);

if (isMethodExpired) {
Expand Down
72 changes: 33 additions & 39 deletions ts/features/walletV3/common/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
import _ from "lodash";
import * as O from "fp-ts/lib/Option";
import {
IOLogoPaymentType,
IOPaymentLogos,
ListItemTransactionStatusWithBadge
} from "@pagopa/io-app-design-system";
import I18n from "i18n-js";
import * as O from "fp-ts/lib/Option";
import { pipe } from "fp-ts/lib/function";

import { isExpiredDate } from "../../../../utils/dates";
import I18n from "i18n-js";
import _ from "lodash";
import { Bundle } from "../../../../../definitions/pagopa/ecommerce/Bundle";
import { ServiceNameEnum } from "../../../../../definitions/pagopa/walletv3/ServiceName";
import { PaymentSupportStatus } from "../../../../types/paymentMethodCapabilities";
import {
TypeEnum,
WalletInfoDetails,
WalletInfoDetails1
} from "../../../../../definitions/pagopa/walletv3/WalletInfoDetails";
import { ServiceStatusEnum } from "../../../../../definitions/pagopa/walletv3/ServiceStatus";
import { WalletInfo } from "../../../../../definitions/pagopa/walletv3/WalletInfo";
import { PaymentSupportStatus } from "../../../../types/paymentMethodCapabilities";
import { isExpiredDate } from "../../../../utils/dates";
import { findFirstCaseInsensitive } from "../../../../utils/object";
import { Bundle } from "../../../../../definitions/pagopa/ecommerce/Bundle";
import { UIWalletInfoDetails } from "../../details/types/UIWalletInfoDetails";
import { WalletPaymentPspSortType } from "../../payment/types";

/**
Expand Down Expand Up @@ -50,16 +45,15 @@ export const getBadgeTextByTransactionStatus = (
* left if expiring date can't be evaluated
* @param paymentMethod
*/
export const isPaymentMethodExpired = (paymentMethod: WalletInfo): boolean => {
switch (paymentMethod.details?.type) {
case TypeEnum.PAYPAL:
return false;
case TypeEnum.CARDS:
const cardDetails = paymentMethod.details as WalletInfoDetails1;
return isExpiredDate(cardDetails.expiryDate);
}
return false;
};
export const isPaymentMethodExpired = (
details?: UIWalletInfoDetails
): boolean =>
pipe(
details?.expiryDate,
O.fromNullable,
O.map(isExpiredDate),
O.getOrElse(() => false)
);

/**
* true if the given paymentMethod supports the given walletFunction
Expand Down Expand Up @@ -111,25 +105,25 @@ export const isPaymentSupported = (
};

export const getPaymentLogo = (
selectedMethod: WalletInfoDetails
details: UIWalletInfoDetails
): IOLogoPaymentType | undefined => {
switch (selectedMethod.type) {
case TypeEnum.CARDS:
const cardsType = selectedMethod as WalletInfoDetails1;
const { brand } = cardsType;
return pipe(
brand,
findFirstCaseInsensitive(IOPaymentLogos),
O.fold(
() => undefined,
([logoName, _]) => logoName
)
) as IOLogoPaymentType;
case TypeEnum.PAYPAL:
return "payPal";
default:
return undefined;
if (details.maskedEmail !== undefined) {
return "payPal";
} else if (details.maskedNumber !== undefined) {
return "bancomatPay";
} else if (details.maskedPan !== undefined) {
return pipe(
details.brand,
O.fromNullable,
O.chain(findFirstCaseInsensitive(IOPaymentLogos)),
O.fold(
() => undefined,
([logoName, _]) => logoName
)
) as IOLogoPaymentType;
}

return undefined;
};

export const WALLET_PAYMENT_TERMS_AND_CONDITIONS_URL =
Expand Down
70 changes: 30 additions & 40 deletions ts/features/walletV3/details/screens/WalletDetailsScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ import {
walletDetailsInstrumentSelector
} from "../store";
import { walletDetailsGetInstrument } from "../store/actions";
import {
TypeEnum,
WalletInfoDetails,
WalletInfoDetails1,
WalletInfoDetails2
} from "../../../../../definitions/pagopa/walletv3/WalletInfoDetails";
import { UIWalletInfoDetails } from "../types/UIWalletInfoDetails";
import { getDateFromExpiryDate } from "../../../../utils/dates";

export type WalletDetailsScreenNavigationParams = Readonly<{
walletId: string;
Expand All @@ -36,44 +32,38 @@ export type WalletDetailsScreenRouteProps = RouteProp<
"WALLET_DETAILS_SCREEN"
>;

const generateCardComponent = (walletDetails: WalletInfoDetails) => {
switch (walletDetails.type) {
case TypeEnum.PAYPAL:
const paypalDetails = walletDetails as WalletInfoDetails2;
return (
<PaymentCardBig
testID="CreditCardComponent"
cardType="PAYPAL"
holderEmail={paypalDetails.maskedEmail}
/>
);
case TypeEnum.CARDS:
default:
const cardDetails = walletDetails as WalletInfoDetails1;
return (
<PaymentCardBig
testID="CreditCardComponent"
cardType="CREDIT"
expirationDate={cardDetails.expiryDate}
holderName={cardDetails.holder}
hpan={cardDetails.maskedPan}
cardIcon={cardDetails.brand.toLowerCase() as IOLogoPaymentExtType}
/>
);
const generateCardComponent = (details: UIWalletInfoDetails) => {
if (details.maskedEmail !== undefined) {
return (
<PaymentCardBig
testID="CreditCardComponent"
cardType="PAYPAL"
holderEmail={details.maskedEmail}
/>
);
}

return (
<PaymentCardBig
testID="CreditCardComponent"
cardType="CREDIT"
expirationDate={getDateFromExpiryDate(details.expiryDate)}
holderName={details.holder || ""}
hpan={details.maskedPan || ""}
cardIcon={details.brand?.toLowerCase() as IOLogoPaymentExtType}
/>
);
};

const generateCardHeaderTitle = (walletDetails?: WalletInfoDetails) => {
switch (walletDetails?.type) {
case TypeEnum.CARDS:
const cardDetails = walletDetails as WalletInfoDetails1;
const capitalizedCardCircuit = capitalize(
cardDetails.brand.toLowerCase() ?? ""
);
return `${capitalizedCardCircuit} ••${cardDetails.maskedPan}`;
default:
return "";
const generateCardHeaderTitle = (details?: UIWalletInfoDetails) => {
if (details?.maskedPan !== undefined) {
const capitalizedCardCircuit = capitalize(
details.brand?.toLowerCase() ?? ""
);
return `${capitalizedCardCircuit} ••${details.maskedPan}`;
}

return "";
};

/**
Expand Down
Loading

0 comments on commit 119714b

Please sign in to comment.