Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

248 linhas
8.4 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. } from '@mui/material';
  19. import { useFormik, FormikProvider } from 'formik';
  20. import * as yup from 'yup';
  21. import Loadable from 'components/Loadable';
  22. const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));
  23. import VisaIcon from "assets/images/icons/visacard.svg";
  24. import MasterIcon from "assets/images/icons/mastercard.svg";
  25. import JcbIcon from "assets/images/icons/jcb.svg";
  26. import UnionPayIcon from "assets/images/icons/unionpay.svg";
  27. import PpsIcon from "assets/images/icons/ppshk.svg";
  28. import FpsIcon from "assets/images/icons/fps.svg";
  29. const MultiPaymentWindow = (props) => {
  30. const windowTitle = "請選擇付款方式";
  31. const [content, setContent] = useState();
  32. const [loadtTransactionData, setLoadtTransactionData] = useState({});
  33. const [loadAvailableMethodData, setLoadAvailableMethodData] = useState([]);
  34. const [paymentMethod, setPaymentMethod] = useState("");
  35. const [transactionData, setTransactionData] = useState({});
  36. const [availableMethodData, setAvailableMethodData] = useState([]);
  37. const [onReady, setOnReady] = useState(false);
  38. useEffect(() => {
  39. console.log(props.transactionData)
  40. if(Object.keys(props.transactionData).length > 0){
  41. setLoadtTransactionData(props.transactionData)
  42. }
  43. }, [props.transactionData]);
  44. useEffect(() => {
  45. console.log(props.availableMethods)
  46. if(props.availableMethods.length > 0){
  47. setLoadAvailableMethodData(props.availableMethods)
  48. }
  49. }, [props.availableMethods]);
  50. useEffect(() => {
  51. if(loadAvailableMethodData.length > 0){
  52. setAvailableMethodData(loadAvailableMethodData)
  53. }
  54. }, [loadAvailableMethodData]);
  55. useEffect(() => {
  56. if(Object.keys(loadtTransactionData).length > 0){
  57. setTransactionData(loadtTransactionData)
  58. }
  59. }, [loadtTransactionData]);
  60. useEffect(() => {
  61. if(availableMethodData.length > 0 && Object.keys(transactionData).length > 0){
  62. setOnReady(true)
  63. }
  64. }, [availableMethodData,transactionData]);
  65. useEffect(() => {
  66. console.log(paymentMethod)
  67. }, [paymentMethod]);
  68. const selectedPaymentMethodHandle = (method) => () =>{
  69. setPaymentMethod(method)
  70. props.setSelectedPaymentMethod(method);
  71. };
  72. const confirmPaymentHandle = () => () =>{
  73. props.setConfirmPayment(true);
  74. };
  75. useEffect(() => {
  76. if(props.selectedPaymentMethod === ""){
  77. setPaymentMethod("")
  78. }
  79. setPaymentMethod
  80. if(availableMethodData.length > 0){
  81. setContent(
  82. <Grid container spacing={2} direction="column" justifyContent="space-between" alignItems="flex-start">
  83. <Grid item xs={12} md={12}>
  84. <Grid container >
  85. <Grid item>
  86. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  87. 交易參考編號:
  88. </FormLabel>
  89. </Grid>
  90. <Grid item>
  91. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  92. {transactionData.transicationId}
  93. </FormLabel>
  94. </Grid>
  95. </Grid>
  96. </Grid>
  97. <Grid item xs={12} md={12}>
  98. <Grid container >
  99. <Grid item>
  100. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  101. 付款金額:
  102. </FormLabel>
  103. </Grid>
  104. <Grid item>
  105. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  106. {"HK$ "+props.totalAmount}
  107. </FormLabel>
  108. </Grid>
  109. </Grid>
  110. </Grid>
  111. <Grid item xs={12} md={12}>
  112. <Grid container spacing={1} direction="row" justifyContent="flex-start" alignItems="center">
  113. <Grid item>
  114. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  115. 付款方式:
  116. </FormLabel>
  117. </Grid>
  118. <Grid item>
  119. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("FPS")} disabled={props.fpsStatus.active === "N"}>
  120. <img src={FpsIcon} width="80" height="80" alt="FPS"></img>
  121. </Button>
  122. </Grid>
  123. <Grid item>
  124. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("Visa")} disabled={props.creditCardStatus.active === "N"}>
  125. <img src={VisaIcon} width="80" height="80" alt="Visa"></img>
  126. </Button>
  127. </Grid>
  128. <Grid item>
  129. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("Mastercard")} disabled={props.creditCardStatus.active === "N"}>
  130. <img src={MasterIcon} width="80" height="80" alt="Mastercard"></img>
  131. </Button>
  132. </Grid>
  133. <Grid item>
  134. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("UnionPay")} disabled={props.unionPayStatus.active === "N"}>
  135. <img src={UnionPayIcon} width="80" height="80" alt="UnionPay"></img>
  136. </Button>
  137. </Grid>
  138. <Grid item>
  139. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("JCB")} disabled={props.unionPayStatus.active === "N"}>
  140. <img src={JcbIcon} width="80" height="80" alt="JCB"></img>
  141. </Button>
  142. </Grid>
  143. <Grid item>
  144. <Button variant="contained" color="white" onClick={selectedPaymentMethodHandle("PPS")} disabled={props.ppsStatus.active === "N"}>
  145. <img src={PpsIcon} width="80" height="80" alt="PPS"></img>
  146. </Button>
  147. </Grid>
  148. </Grid>
  149. </Grid>
  150. {paymentMethod !=""?
  151. <Grid item xs={12} md={12}>
  152. <Grid container direction="row" justifyContent="flex-start" alignItems="center">
  153. <Grid item>
  154. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  155. 已選擇付款方式:
  156. </FormLabel>
  157. </Grid>
  158. <Grid item>
  159. <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
  160. {paymentMethod}
  161. </FormLabel>
  162. </Grid>
  163. </Grid>
  164. </Grid>
  165. : null}
  166. </Grid>
  167. )
  168. }else{
  169. setContent(
  170. <Grid container direction="row" justifyContent="center" alignItems="center">
  171. <FormLabel sx={{ fontSize: "20px", color: "#000000", textAlign: "center" }}>
  172. 付款功能現在不可用。
  173. </FormLabel>
  174. </Grid>
  175. )
  176. }
  177. }, [availableMethodData]);
  178. const formik = useFormik({
  179. initialValues: ({
  180. username: '',
  181. }),
  182. validationSchema: yup.object().shape({
  183. }),
  184. });
  185. return (
  186. <Dialog
  187. open={props.open}
  188. onClose={props.handleClose}
  189. fullWidth={true}
  190. maxWidth={'xl'}
  191. >
  192. <DialogTitle >
  193. <Grid container>
  194. <Grid item>
  195. <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center">
  196. <Typography variant="h4">
  197. {windowTitle}
  198. </Typography>
  199. </Stack>
  200. </Grid>
  201. </Grid>
  202. </DialogTitle>
  203. <FormikProvider value={formik}>
  204. <form>
  205. <DialogContent>
  206. <DialogContentText>
  207. {!onReady ?
  208. <LoadingComponent />
  209. :content
  210. }
  211. </DialogContentText>
  212. </DialogContent>
  213. </form>
  214. </FormikProvider>
  215. <Stack direction="row" justifyContent="space-around">
  216. <DialogActions>
  217. <Button variant="contained" onClick={props.handleClose} autoFocus >
  218. 取消
  219. </Button>
  220. </DialogActions>
  221. <DialogActions>
  222. <Button variant="contained" color="success" onClick={confirmPaymentHandle()} disabled={paymentMethod === ""}>
  223. 確認
  224. </Button>
  225. </DialogActions>
  226. </Stack>
  227. </Dialog>
  228. );
  229. };
  230. export default MultiPaymentWindow;