-
Notifications
You must be signed in to change notification settings - Fork 106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: [#177560087] Changed pick psp screen UI #2954
Changes from 4 commits
3920580
523e5f9
65b5064
71ffe8c
c091a76
a283d05
2bdd3d9
75fbf2d
f5f0384
3b36c83
427d032
25cb7e2
b8217e1
b57e37d
2f73650
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,7 +9,7 @@ type AllowedColors = Extract< | |
// tslint:disable-next-line:max-union-size | ||
"blue" | "bluegrey" | "red" | "white" | ||
>; | ||
type AllowedWeight = Extract<IOFontWeight, "Bold">; | ||
type AllowedWeight = Extract<IOFontWeight, "Bold" | "Regular">; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In this case you can use |
||
|
||
type OwnProps = ExternalTypographyProps< | ||
TypographyProps<AllowedWeight, AllowedColors> | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,34 +1,35 @@ | ||||||||||||||||||||||||||||||||||||||
import { AmountInEuroCents, RptId } from "italia-pagopa-commons/lib/pagopa"; | ||||||||||||||||||||||||||||||||||||||
import * as pot from "italia-ts-commons/lib/pot"; | ||||||||||||||||||||||||||||||||||||||
import { Content, Text, View } from "native-base"; | ||||||||||||||||||||||||||||||||||||||
import { Content, View, H3 } from "native-base"; | ||||||||||||||||||||||||||||||||||||||
import * as React from "react"; | ||||||||||||||||||||||||||||||||||||||
import { FlatList, Image, ListRenderItemInfo, StyleSheet } from "react-native"; | ||||||||||||||||||||||||||||||||||||||
import { NavigationInjectedProps } from "react-navigation"; | ||||||||||||||||||||||||||||||||||||||
import { connect } from "react-redux"; | ||||||||||||||||||||||||||||||||||||||
import { PaymentRequestsGetResponse } from "../../../../definitions/backend/PaymentRequestsGetResponse"; | ||||||||||||||||||||||||||||||||||||||
import { ContextualHelp } from "../../../components/ContextualHelp"; | ||||||||||||||||||||||||||||||||||||||
import { LabelSmall } from "../../../components/core/typography/LabelSmall"; | ||||||||||||||||||||||||||||||||||||||
import { Label } from "../../../components/core/typography/Label"; | ||||||||||||||||||||||||||||||||||||||
import { withLightModalContext } from "../../../components/helpers/withLightModalContext"; | ||||||||||||||||||||||||||||||||||||||
import { withLoadingSpinner } from "../../../components/helpers/withLoadingSpinner"; | ||||||||||||||||||||||||||||||||||||||
import ItemSeparatorComponent from "../../../components/ItemSeparatorComponent"; | ||||||||||||||||||||||||||||||||||||||
import BaseScreenComponent, { | ||||||||||||||||||||||||||||||||||||||
ContextualHelpPropsMarkdown | ||||||||||||||||||||||||||||||||||||||
} from "../../../components/screens/BaseScreenComponent"; | ||||||||||||||||||||||||||||||||||||||
import { EdgeBorderComponent } from "../../../components/screens/EdgeBorderComponent"; | ||||||||||||||||||||||||||||||||||||||
import TouchableDefaultOpacity from "../../../components/TouchableDefaultOpacity"; | ||||||||||||||||||||||||||||||||||||||
import IconFont from "../../../components/ui/IconFont"; | ||||||||||||||||||||||||||||||||||||||
import { LightModalContextInterface } from "../../../components/ui/LightModal"; | ||||||||||||||||||||||||||||||||||||||
import Markdown from "../../../components/ui/Markdown"; | ||||||||||||||||||||||||||||||||||||||
import I18n from "../../../i18n"; | ||||||||||||||||||||||||||||||||||||||
import { Dispatch } from "../../../store/actions/types"; | ||||||||||||||||||||||||||||||||||||||
import { paymentFetchAllPspsForPaymentId } from "../../../store/actions/wallet/payment"; | ||||||||||||||||||||||||||||||||||||||
import { GlobalState } from "../../../store/reducers/types"; | ||||||||||||||||||||||||||||||||||||||
import { allPspsSelector } from "../../../store/reducers/wallet/payment"; | ||||||||||||||||||||||||||||||||||||||
import variables from "../../../theme/variables"; | ||||||||||||||||||||||||||||||||||||||
import customVariables from "../../../theme/variables"; | ||||||||||||||||||||||||||||||||||||||
import { Psp, Wallet } from "../../../types/pagopa"; | ||||||||||||||||||||||||||||||||||||||
import { orderPspByAmount } from "../../../utils/payment"; | ||||||||||||||||||||||||||||||||||||||
import { showToast } from "../../../utils/showToast"; | ||||||||||||||||||||||||||||||||||||||
import { formatNumberCentsToAmount } from "../../../utils/stringBuilder"; | ||||||||||||||||||||||||||||||||||||||
import FooterWithButtons from "../../../components/ui/FooterWithButtons"; | ||||||||||||||||||||||||||||||||||||||
import { navigateBack } from "../../../store/actions/navigation"; | ||||||||||||||||||||||||||||||||||||||
import { Body } from "../../../components/core/typography/Body"; | ||||||||||||||||||||||||||||||||||||||
import { dispatchUpdatePspForWalletAndConfirm } from "./common"; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
type NavigationParams = Readonly<{ | ||||||||||||||||||||||||||||||||||||||
|
@@ -59,11 +60,11 @@ const styles = StyleSheet.create({ | |||||||||||||||||||||||||||||||||||||
alignItems: "center", | ||||||||||||||||||||||||||||||||||||||
justifyContent: "space-between" | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
feeText: { | ||||||||||||||||||||||||||||||||||||||
color: variables.brandDarkGray | ||||||||||||||||||||||||||||||||||||||
feeContainer: { | ||||||||||||||||||||||||||||||||||||||
flexDirection: "row", | ||||||||||||||||||||||||||||||||||||||
alignItems: "center" | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
flexStart: { | ||||||||||||||||||||||||||||||||||||||
imageProvider: { | ||||||||||||||||||||||||||||||||||||||
width: 100, | ||||||||||||||||||||||||||||||||||||||
height: 50 | ||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||
|
@@ -77,21 +78,22 @@ const contextualHelpMarkdown: ContextualHelpPropsMarkdown = { | |||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const ICON_SIZE = 24; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
type State = { | ||||||||||||||||||||||||||||||||||||||
hasImageLoadingError: boolean; | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||
* Select a PSP to be used for a the current selected wallet | ||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||
class PickPspScreen extends React.Component<Props> { | ||||||||||||||||||||||||||||||||||||||
private showHelp = () => { | ||||||||||||||||||||||||||||||||||||||
this.props.showModal( | ||||||||||||||||||||||||||||||||||||||
<ContextualHelp | ||||||||||||||||||||||||||||||||||||||
onClose={this.props.hideModal} | ||||||||||||||||||||||||||||||||||||||
title={I18n.t("wallet.pickPsp.contextualHelpTitle")} | ||||||||||||||||||||||||||||||||||||||
body={() => ( | ||||||||||||||||||||||||||||||||||||||
<Markdown>{I18n.t("wallet.pickPsp.contextualHelpContent")}</Markdown> | ||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
class PickPspScreen extends React.Component<Props, State> { | ||||||||||||||||||||||||||||||||||||||
constructor(props: Props) { | ||||||||||||||||||||||||||||||||||||||
super(props); | ||||||||||||||||||||||||||||||||||||||
this.state = { | ||||||||||||||||||||||||||||||||||||||
hasImageLoadingError: false | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private onErrorImageLoading = () => | ||||||||||||||||||||||||||||||||||||||
this.setState({ hasImageLoadingError: true }); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
public componentDidMount() { | ||||||||||||||||||||||||||||||||||||||
// load all psp in order to offer to the user the complete psps list | ||||||||||||||||||||||||||||||||||||||
|
@@ -102,66 +104,98 @@ class PickPspScreen extends React.Component<Props> { | |||||||||||||||||||||||||||||||||||||
this.props.loadAllPsp(idWallet, idPayment); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private headerItem = ( | ||||||||||||||||||||||||||||||||||||||
<View style={styles.padded}> | ||||||||||||||||||||||||||||||||||||||
<View style={styles.line1}> | ||||||||||||||||||||||||||||||||||||||
<LabelSmall weight="Regular" color="bluegrey"> | ||||||||||||||||||||||||||||||||||||||
{I18n.t("wallet.pickPsp.provider")} | ||||||||||||||||||||||||||||||||||||||
</LabelSmall> | ||||||||||||||||||||||||||||||||||||||
<LabelSmall weight="Regular" color="bluegrey"> | ||||||||||||||||||||||||||||||||||||||
{`${I18n.t("wallet.pickPsp.maxFee")} (€)`} | ||||||||||||||||||||||||||||||||||||||
</LabelSmall> | ||||||||||||||||||||||||||||||||||||||
</View> | ||||||||||||||||||||||||||||||||||||||
<View spacer /> | ||||||||||||||||||||||||||||||||||||||
<ItemSeparatorComponent noPadded /> | ||||||||||||||||||||||||||||||||||||||
</View> | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private getListItem = (psp: ListRenderItemInfo<Psp>) => { | ||||||||||||||||||||||||||||||||||||||
const { item } = psp; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||
<TouchableDefaultOpacity | ||||||||||||||||||||||||||||||||||||||
onPress={() => this.props.pickPsp(item.id, this.props.allPsps)} | ||||||||||||||||||||||||||||||||||||||
style={styles.itemContainer} | ||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||
<View style={styles.line1}> | ||||||||||||||||||||||||||||||||||||||
<Image | ||||||||||||||||||||||||||||||||||||||
style={styles.flexStart} | ||||||||||||||||||||||||||||||||||||||
resizeMode={"contain"} | ||||||||||||||||||||||||||||||||||||||
source={{ uri: item.logoPSP }} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
<IconFont | ||||||||||||||||||||||||||||||||||||||
name={"io-right"} | ||||||||||||||||||||||||||||||||||||||
size={ICON_SIZE} | ||||||||||||||||||||||||||||||||||||||
color={customVariables.contentPrimaryBackground} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
{!this.state.hasImageLoadingError ? ( | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is a problem in the way you check if an image has an error. The state is the same for all the items you generate, so if 1 of the images is not reachable also all the others doesn't show the image. What about using the
Suggested change
Of course being a hook you should convert the in component in a function component. |
||||||||||||||||||||||||||||||||||||||
<Image | ||||||||||||||||||||||||||||||||||||||
style={styles.imageProvider} | ||||||||||||||||||||||||||||||||||||||
resizeMode="contain" | ||||||||||||||||||||||||||||||||||||||
source={{ uri: item.logoPSP }} | ||||||||||||||||||||||||||||||||||||||
onError={this.onErrorImageLoading} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
) : ( | ||||||||||||||||||||||||||||||||||||||
<Body>{item.businessName}</Body> | ||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||
<View style={styles.feeContainer}> | ||||||||||||||||||||||||||||||||||||||
<Label>{formatNumberCentsToAmount(item.fixedCost.amount)}</Label> | ||||||||||||||||||||||||||||||||||||||
<IconFont | ||||||||||||||||||||||||||||||||||||||
name="io-right" | ||||||||||||||||||||||||||||||||||||||
size={ICON_SIZE} | ||||||||||||||||||||||||||||||||||||||
color={customVariables.contentPrimaryBackground} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
</View> | ||||||||||||||||||||||||||||||||||||||
</View> | ||||||||||||||||||||||||||||||||||||||
<Text style={styles.feeText}> | ||||||||||||||||||||||||||||||||||||||
{`${I18n.t("wallet.pickPsp.maxFee")} `} | ||||||||||||||||||||||||||||||||||||||
<Text bold={true} style={styles.feeText}> | ||||||||||||||||||||||||||||||||||||||
{formatNumberCentsToAmount(item.fixedCost.amount)} | ||||||||||||||||||||||||||||||||||||||
</Text> | ||||||||||||||||||||||||||||||||||||||
</Text> | ||||||||||||||||||||||||||||||||||||||
</TouchableDefaultOpacity> | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
public render(): React.ReactNode { | ||||||||||||||||||||||||||||||||||||||
const availablePsps = orderPspByAmount(this.props.allPsps); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const backButtonProps = { | ||||||||||||||||||||||||||||||||||||||
block: true, | ||||||||||||||||||||||||||||||||||||||
primary: true, | ||||||||||||||||||||||||||||||||||||||
bordered: true, | ||||||||||||||||||||||||||||||||||||||
onPress: this.props.navigateBack, | ||||||||||||||||||||||||||||||||||||||
title: I18n.t("global.buttons.back") | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||
<BaseScreenComponent | ||||||||||||||||||||||||||||||||||||||
goBack={true} | ||||||||||||||||||||||||||||||||||||||
headerTitle={I18n.t("wallet.pickPsp.title")} | ||||||||||||||||||||||||||||||||||||||
headerTitle={I18n.t("wallet.pickPsp.headerTitle")} | ||||||||||||||||||||||||||||||||||||||
contextualHelpMarkdown={contextualHelpMarkdown} | ||||||||||||||||||||||||||||||||||||||
faqCategories={["payment"]} | ||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||
<Content noPadded={true}> | ||||||||||||||||||||||||||||||||||||||
<View spacer={true} /> | ||||||||||||||||||||||||||||||||||||||
<Content noPadded> | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What do you think about use a
Suggested change
|
||||||||||||||||||||||||||||||||||||||
<View spacer /> | ||||||||||||||||||||||||||||||||||||||
<View style={styles.padded}> | ||||||||||||||||||||||||||||||||||||||
<Text> | ||||||||||||||||||||||||||||||||||||||
<Text bold={true}>{`${I18n.t("wallet.pickPsp.infoBold")} `}</Text> | ||||||||||||||||||||||||||||||||||||||
{`${I18n.t("wallet.pickPsp.info2")} `} | ||||||||||||||||||||||||||||||||||||||
</Text> | ||||||||||||||||||||||||||||||||||||||
<Text link={true} onPress={this.showHelp}> | ||||||||||||||||||||||||||||||||||||||
{I18n.t("wallet.pickPsp.link")} | ||||||||||||||||||||||||||||||||||||||
</Text> | ||||||||||||||||||||||||||||||||||||||
<H3>{I18n.t("wallet.pickPsp.title")}</H3> | ||||||||||||||||||||||||||||||||||||||
<View spacer small /> | ||||||||||||||||||||||||||||||||||||||
<Label weight="Regular" color="bluegreyDark"> | ||||||||||||||||||||||||||||||||||||||
{I18n.t("wallet.pickPsp.info")} | ||||||||||||||||||||||||||||||||||||||
</Label> | ||||||||||||||||||||||||||||||||||||||
<Label weight="Regular" color="bluegreyDark"> | ||||||||||||||||||||||||||||||||||||||
{I18n.t("wallet.pickPsp.info2")} | ||||||||||||||||||||||||||||||||||||||
<Label weight="Bold" color="bluegreyDark">{` ${I18n.t( | ||||||||||||||||||||||||||||||||||||||
"wallet.pickPsp.info2Bold" | ||||||||||||||||||||||||||||||||||||||
)}`}</Label> | ||||||||||||||||||||||||||||||||||||||
</Label> | ||||||||||||||||||||||||||||||||||||||
</View> | ||||||||||||||||||||||||||||||||||||||
<View spacer={true} /> | ||||||||||||||||||||||||||||||||||||||
<View spacer /> | ||||||||||||||||||||||||||||||||||||||
<FlatList | ||||||||||||||||||||||||||||||||||||||
ItemSeparatorComponent={() => <ItemSeparatorComponent />} | ||||||||||||||||||||||||||||||||||||||
removeClippedSubviews={false} | ||||||||||||||||||||||||||||||||||||||
data={availablePsps} | ||||||||||||||||||||||||||||||||||||||
keyExtractor={item => item.id.toString()} | ||||||||||||||||||||||||||||||||||||||
renderItem={this.getListItem} | ||||||||||||||||||||||||||||||||||||||
ListFooterComponent={<EdgeBorderComponent />} | ||||||||||||||||||||||||||||||||||||||
ListHeaderComponent={this.headerItem} | ||||||||||||||||||||||||||||||||||||||
ListFooterComponent={() => <ItemSeparatorComponent />} | ||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||
</Content> | ||||||||||||||||||||||||||||||||||||||
<FooterWithButtons type="SingleButton" leftButton={backButtonProps} /> | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is already a function that returns the props you set in
Suggested change
|
||||||||||||||||||||||||||||||||||||||
</BaseScreenComponent> | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
@@ -177,6 +211,7 @@ const mapStateToProps = (state: GlobalState) => { | |||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const mapDispatchToProps = (dispatch: Dispatch, props: OwnProps) => ({ | ||||||||||||||||||||||||||||||||||||||
navigateBack: () => dispatch(navigateBack()), | ||||||||||||||||||||||||||||||||||||||
loadAllPsp: (idWallet: string, idPayment: string) => { | ||||||||||||||||||||||||||||||||||||||
dispatch( | ||||||||||||||||||||||||||||||||||||||
paymentFetchAllPspsForPaymentId.request({ | ||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These components are mapped with the ones in the UI catalogue.
If is not strictly required is better avoid to modify it.
For example in this case you can use the
H4
component that has the same font-size and already have thebluegreyDark
color