您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

295 行
14 KiB

  1. import {
  2. useEffect,
  3. useState
  4. } from "react";
  5. import * as React from "react";
  6. // material-ui
  7. import {
  8. Button,
  9. FormLabel,
  10. Stack,
  11. Typography,
  12. Dialog,
  13. DialogActions,
  14. DialogContent,
  15. DialogContentText,
  16. DialogTitle,
  17. Grid,
  18. Box
  19. } from '@mui/material';
  20. import { useFormik, FormikProvider } from 'formik';
  21. import * as yup from 'yup';
  22. import Loadable from 'components/Loadable';
  23. const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));
  24. import * as FormatUtils from "utils/FormatUtils";
  25. import VisaIcon from "assets/images/icons/visacard.svg";
  26. import MasterIcon from "assets/images/icons/mastercard.svg";
  27. import JcbIcon from "assets/images/icons/jcb.svg";
  28. import UnionPayIcon from "assets/images/icons/unionpay.svg";
  29. import PpsIcon from "assets/images/icons/ppshk.svg";
  30. import FpsIcon from "assets/images/icons/fps.svg";
  31. import {FormattedMessage, useIntl} from "react-intl";
  32. const MultiPaymentWindow = (props) => {
  33. const intl = useIntl();
  34. const windowTitle = intl.formatMessage({id: 'selectPaymentMethod'});
  35. // const [content, setContent] = useState();
  36. const [loadtTransactionData, setLoadtTransactionData] = useState({});
  37. const [loadAvailableMethodData, setLoadAvailableMethodData] = useState([]);
  38. const [paymentMethod, setPaymentMethod] = useState("");
  39. const [transactionData, setTransactionData] = useState({});
  40. const [availableMethodData, setAvailableMethodData] = useState([]);
  41. const [fpsClass, setFpsClass] = useState("");
  42. const [visaClass, setVisaClass] = useState("");
  43. const [mastercardClass, setMastercardClass] = useState("");
  44. const [jCBClass, setJCBClass] = useState("");
  45. const [unionPayClass, setUnionPayClass] = useState("");
  46. const [pPSClass, setPPSlass] = useState("");
  47. const [filteredPaymentMethod, setFilteredPaymentMethod] = useState([]);
  48. // const [onReady, setOnReady] = useState(false);
  49. useEffect(() => {
  50. // console.log(props.transactionData)
  51. if(Object.keys(props.transactionData).length > 0){
  52. setLoadtTransactionData(props.transactionData)
  53. }
  54. }, [props.transactionData]);
  55. useEffect(() => {
  56. // console.log(props.availableMethods)
  57. if(props.availableMethods.length > 0){
  58. setLoadAvailableMethodData(props.availableMethods)
  59. }
  60. }, [props.availableMethods]);
  61. useEffect(() => {
  62. if(Object.keys(loadtTransactionData).length > 0){
  63. setTransactionData(loadtTransactionData)
  64. }
  65. }, [loadtTransactionData]);
  66. useEffect(() => {
  67. if(Object.keys(transactionData).length > 0&&props.availableMethods.length > 0){
  68. setLoadAvailableMethodData(props.availableMethods)
  69. }
  70. }, [transactionData]);
  71. useEffect(() => {
  72. if(loadAvailableMethodData.length > 0){
  73. setAvailableMethodData(loadAvailableMethodData)
  74. }
  75. }, [loadAvailableMethodData]);
  76. // useEffect(() => {
  77. // if(availableMethodData.length > 0 && Object.keys(transactionData).length > 0){
  78. // setOnReady(true)
  79. // }
  80. // }, [availableMethodData]);
  81. useEffect(() => {
  82. // console.log(paymentMethod)
  83. // const subtype = (paymentMethod === "Visa" || paymentMethod === "MasterCard" || paymentMethod === "JCB" || paymentMethod === "UnionPay") ? "CreditCard" : paymentMethod;
  84. // const filteredPaymentMethod = availableMethodData.filter(obj => obj.subtype === subtype);
  85. const filteredPaymentMethod = availableMethodData.filter(obj => {
  86. if (obj.supportedcard && obj.supportedcard.includes(paymentMethod)) {
  87. return obj.subtype === "CreditCard";
  88. }
  89. return obj.subtype === paymentMethod;
  90. });
  91. // console.log(filteredPaymentMethod)
  92. setFilteredPaymentMethod(filteredPaymentMethod);
  93. setFpsClass(paymentMethod == "FPS" || paymentMethod == "" ? "" : "grayscale")
  94. setVisaClass(paymentMethod == "Visa" || paymentMethod == "" ? "" : "grayscale")
  95. setMastercardClass(paymentMethod == "MasterCard" || paymentMethod == "" ? "" : "grayscale")
  96. setJCBClass(paymentMethod == "JCB" || paymentMethod == "" ? "" : "grayscale")
  97. setUnionPayClass(paymentMethod == "UnionPay" || paymentMethod == "" ? "" : "grayscale")
  98. setPPSlass(paymentMethod == "PPS" || paymentMethod == "" ? "" : "grayscale")
  99. // getMethodImgClass(paymentMethod)
  100. }, [paymentMethod]);
  101. const selectedPaymentMethodHandle = (method) => () =>{
  102. setPaymentMethod(method)
  103. props.setSelectedPaymentMethod(method);
  104. };
  105. const confirmPaymentHandle = () => () =>{
  106. props.setConfirmPayment(true);
  107. };
  108. useEffect(() => {
  109. if(props.selectedPaymentMethod === ""){
  110. setPaymentMethod("")
  111. }
  112. }, [availableMethodData]);
  113. const formik = useFormik({
  114. initialValues: ({
  115. username: '',
  116. }),
  117. validationSchema: yup.object().shape({
  118. }),
  119. });
  120. return (
  121. <Dialog
  122. open={props.open}
  123. onClose={() => props.setOpen(false)}
  124. fullWidth={true}
  125. maxWidth={'xl'}
  126. >
  127. <DialogTitle >
  128. <Grid container>
  129. <Grid item>
  130. <Stack direction="row" justifyContent="flex-start" alignItems="center">
  131. <Typography variant="h4">
  132. {windowTitle}
  133. </Typography>
  134. </Stack>
  135. </Grid>
  136. </Grid>
  137. </DialogTitle>
  138. <FormikProvider value={formik}>
  139. <form>
  140. <DialogContent>
  141. <DialogContentText>
  142. <Grid item xs={12} md={12} sx={{ pt: 2 }} style={{ height: '100%' }} width="100%">
  143. <Box xs={12} md={12} sx={{ p: 4, border: '3px solid #eee', borderRadius: '10px' }} >
  144. <Grid container justifyContent="flex-start" alignItems="left" >
  145. <center>
  146. <Grid item xs={12} md={12} width="100%">
  147. <Typography variant="h5" sx={{ textAlign: "left" }}>
  148. <FormattedMessage id="transactionRefNo"/>: {transactionData.transactionid}
  149. </Typography>
  150. {/* <Typography variant="h5" sx={{ textAlign: "left" }}>
  151. 支付金額: HK$ {FormatUtils.currencyFormat(props.totalAmount)}
  152. </Typography> */}
  153. {!props.onReady ?
  154. <LoadingComponent />
  155. :availableMethodData.length>0?
  156. <Grid container spacing={2} direction="column" justifyContent="space-between" alignItems="flex-start">
  157. <Grid item xs={12} md={12}>
  158. <Grid container spacing={1} direction="row" justifyContent="flex-start" alignItems="center">
  159. <Grid item>
  160. <Typography variant="h5" sx={{ textAlign: "left" }}>
  161. <FormattedMessage id="selectPaymentMethod"/>:
  162. </Typography>
  163. </Grid>
  164. <Grid item>
  165. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("FPS")} disabled={props.fpsStatus.active === "N"}>
  166. <img className={fpsClass} src={FpsIcon} width="80" height="80" alt="FPS"></img>
  167. </Button>
  168. </Grid>
  169. <Grid item>
  170. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("Visa")} disabled={props.creditCardStatus.active === "N"}>
  171. <img className={visaClass} src={VisaIcon} width="80" height="80" alt="Visa"></img>
  172. </Button>
  173. </Grid>
  174. <Grid item>
  175. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("MasterCard")} disabled={props.creditCardStatus.active === "N"}>
  176. <img className={mastercardClass} src={MasterIcon} width="80" height="80" alt="MasterCard"></img>
  177. </Button>
  178. </Grid>
  179. <Grid item>
  180. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("UnionPay")} disabled={props.unionPayStatus.active === "N"}>
  181. <img className={unionPayClass} src={UnionPayIcon} width="80" height="80" alt="UnionPay"></img>
  182. </Button>
  183. </Grid>
  184. <Grid item>
  185. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("JCB")} disabled={props.unionPayStatus.active === "N"}>
  186. <img className={jCBClass} src={JcbIcon} width="80" height="80" alt="JCB"></img>
  187. </Button>
  188. </Grid>
  189. <Grid item>
  190. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("PPS")} disabled={props.ppsStatus.active === "N"}>
  191. <img className={pPSClass} src={PpsIcon} width="80" height="80" alt="PPS"></img>
  192. </Button>
  193. </Grid>
  194. </Grid>
  195. </Grid>
  196. {paymentMethod !=""?
  197. <Grid item xs={12} md={12}>
  198. <Grid container direction="row" justifyContent="flex-start" alignItems="center">
  199. <Grid item>
  200. <FormLabel sx={{ fontSize: "20px", color: "#000000", textAlign: "center" }}>
  201. <FormattedMessage id="selectedPaymentMethod"/>:&nbsp;
  202. </FormLabel>
  203. </Grid>
  204. <Grid item>
  205. <FormLabel sx={{ fontSize: "20px", color: "#000000", textAlign: "center" }}>
  206. {paymentMethod}
  207. </FormLabel>
  208. </Grid>
  209. </Grid>
  210. </Grid>
  211. : null}
  212. </Grid>:
  213. <Grid container direction="row" justifyContent="center" alignItems="center">
  214. <FormLabel sx={{ fontSize: "20px", color: "#000000", textAlign: "center"}}>
  215. <FormattedMessage id="paymentMethodNotAvailable"/>。
  216. </FormLabel>
  217. </Grid>
  218. }
  219. </Grid>
  220. <Grid item xs={12} md={12}>
  221. <Grid container >
  222. <Grid item>
  223. <Typography variant="pnspsFormParagraphBold" sx={{ color: "#000000", textAlign: "left" }}>
  224. <FormattedMessage id="payTotal"/>(HK$):&nbsp;
  225. </Typography>
  226. </Grid>
  227. <Grid item>
  228. <Typography variant="pnspsFormParagraphBold" sx={{color: "#000000", textAlign: "left" }}>
  229. {" HK$ " + FormatUtils.currencyFormat(props.totalAmount)}
  230. </Typography>
  231. </Grid>
  232. </Grid>
  233. {paymentMethod !=""?
  234. filteredPaymentMethod.map((availableMethod) => {
  235. return (
  236. <Grid container key={availableMethod.subtype} className={"css-1tx0bae"} sx={{ mt: 1, p:2 }}>
  237. {availableMethod.pointstonote.map((pointstonote) => {
  238. return (
  239. <Grid container key={pointstonote.order} sx={{ p:0.5 }} direction="row" justifyContent="flex-start" alignItems="center">
  240. <Grid item>
  241. <Typography sx={{fontSize: "16px", color: "#000000", textAlign: "left" }}>
  242. {pointstonote.content}
  243. </Typography>
  244. </Grid>
  245. </Grid>
  246. );
  247. })}
  248. </Grid>
  249. );
  250. })
  251. : null}
  252. </Grid>
  253. </center>
  254. </Grid>
  255. </Box>
  256. </Grid>
  257. </DialogContentText>
  258. </DialogContent>
  259. </form>
  260. </FormikProvider>
  261. <Stack direction="row" justifyContent="space-around">
  262. <DialogActions>
  263. <Button variant="contained" onClick={() => props.setOpen(false)} autoFocus >
  264. <FormattedMessage id="cancel"/>
  265. </Button>
  266. </DialogActions>
  267. <DialogActions>
  268. <Button variant="contained" color="success" onClick={confirmPaymentHandle()} disabled={paymentMethod === ""}>
  269. <FormattedMessage id="confirm"/>
  270. </Button>
  271. </DialogActions>
  272. </Stack>
  273. </Dialog>
  274. );
  275. };
  276. export default MultiPaymentWindow;