diff --git a/src/pages/App/DesktopLayout.js b/src/pages/App/DesktopLayout.js index 8e1edd0..5d77d6b 100644 --- a/src/pages/App/DesktopLayout.js +++ b/src/pages/App/DesktopLayout.js @@ -120,15 +120,15 @@ export const DesktopLayout = observer(() => {
); diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index f90fdf9..7f6f2a7 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -20,19 +20,18 @@ import { ModalLoaderContext } from "../../utils/modal"; import { useParams } from "react-router-dom"; import { MembershipModal } from "./MembershipModal"; -const { Title, Text } = Typography; +const {Title, Text} = Typography; export const DetailUser = observer(() => { const store = useStore(); const modalLoader = useContext(ModalLoaderContext); - const { id } = useParams(); + const {id} = useParams(); const [visibleModal, setVisibleModal] = useState(false); const [isVisibleTopUpModal, setIsVisibleTopUpModal] = useState(false); const [destination, setDestination] = useState(null); const [initialData, setInitialData] = useState({}); const [confirmLoading, setConfirmLoading] = useState(false); - //console.log(id) useEffect(() => { (async () => { modalLoader.setLoading(true); diff --git a/src/pages/Membership/Membership.js b/src/pages/Membership/Membership.js index 9eb9a91..9f5ddd1 100644 --- a/src/pages/Membership/Membership.js +++ b/src/pages/Membership/Membership.js @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from "react"; +import React, {useContext, useEffect, useState} from "react"; import { Button, Card, @@ -14,19 +14,19 @@ import { Select, Space, Table, - Tag, + Tag } from "antd"; -import { useStore } from "../../utils/useStore"; -import { observer } from "mobx-react-lite"; -import { DownloadOutlined, PlusSquareOutlined } from "@ant-design/icons"; -import { MembershipModal } from "./MembershipModal"; -import { BreadcumbComponent } from "../../component/BreadcumbComponent"; -import { LINKS } from "../../routes/app"; -import { useHistory } from "react-router-dom"; -import { ModalLoaderContext } from "../../utils/modal"; +import {useStore} from "../../utils/useStore"; +import {observer} from "mobx-react-lite"; +import {DownloadOutlined, PlusSquareOutlined} from "@ant-design/icons"; +import {MembershipModal} from "./MembershipModal"; +import {BreadcumbComponent} from "../../component/BreadcumbComponent"; +import {LINKS} from "../../routes/app"; +import {useHistory} from "react-router-dom"; +import {ModalLoaderContext} from "../../utils/modal"; -const { Search } = Input; -const { Option } = Select; +const {Search} = Input; +const {Option} = Select; export const Membership = observer(() => { const history = useHistory(); const [form] = Form.useForm(); diff --git a/src/pages/Payback/PaybackModal.js b/src/pages/Payback/PaybackModal.js index 39ae6b9..1cc8127 100644 --- a/src/pages/Payback/PaybackModal.js +++ b/src/pages/Payback/PaybackModal.js @@ -3,7 +3,6 @@ import {Form, InputNumber, message, Modal, Upload,} from "antd"; import {useStore} from "../../utils/useStore"; import {LoadingOutlined, PlusOutlined} from "@ant-design/icons"; import {ModalLoaderContext} from "../../utils/modal"; -import {http} from "../../utils/http"; import {appConfig} from "../../config/app"; export const PaybackModal = ({initialData}) => { @@ -32,7 +31,7 @@ export const PaybackModal = ({initialData}) => { const uploadHandler = async (args) => { const file = args.file; - const res = await http.upload(file); + const res = await store.payback.uploadImages(file); setImage(`${appConfig.apiUrl}/config/image/${res.body.filename}`); setResponseFilename(res.body.filename); setFileList([{ diff --git a/src/pages/Product/Product.js b/src/pages/Product/Product.js index 8319da3..ee4fd07 100644 --- a/src/pages/Product/Product.js +++ b/src/pages/Product/Product.js @@ -1,22 +1,19 @@ -import React, { useContext, useEffect } from "react"; -import { Button, Card, Col, Input, message, Row, Upload } from "antd"; -import { - FilterOutlined, - PlusSquareOutlined, - UploadOutlined, -} from "@ant-design/icons"; -import { BreadcumbComponent } from "../../component/BreadcumbComponent"; -import { useStore } from "../../utils/useStore"; -import { observer } from "mobx-react-lite"; -import { ProductComponent } from "../../component/ProductComponent"; -import { LINKS } from "../../routes/app"; -import { ModalLoaderContext } from "../../utils/modal"; +import React, {useContext, useEffect, useState} from "react"; +import {Button, Card, Col, Input, message, Row, Upload} from "antd"; +import {FilterOutlined, LoadingOutlined, UploadOutlined,} from "@ant-design/icons"; +import {BreadcumbComponent} from "../../component/BreadcumbComponent"; +import {useStore} from "../../utils/useStore"; +import {observer} from "mobx-react-lite"; +import {ProductComponent} from "../../component/ProductComponent"; +import {LINKS} from "../../routes/app"; +import {ModalLoaderContext} from "../../utils/modal"; -const { Search } = Input; +const {Search} = Input; export const Product = observer(() => { const store = useStore(); const modalLoader = useContext(ModalLoaderContext); + const [loading, setLoading] = useState(false); useEffect(() => { const init = async () => { @@ -49,36 +46,97 @@ export const Product = observer(() => { }, { route: LINKS.PRODUCT, - name: Product, + name: Product, }, ]; + const beforeUpload = (file) => { + let isLt2M; + let allowedFile = [ + "text/csv", "application/csv", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-excel.sheet.binary.macroEnabled.12", + "application/vnd.ms-excel", + "application/vnd.ms-excel.sheet.macroEnabled.12" + ]; + let isValid = allowedFile.includes(file.type); + if (!isValid) { + message.error("You can only upload Excel file!"); + } + isLt2M = file.size / 1024 / 1024 < 10; + if (!isLt2M) { + message.error("File must smaller than 10MB!"); + } + return isValid && isLt2M ? true : Upload.LIST_IGNORE; + }; + + const uploadHandler = async (args) => { + const file = args.file; + const responseUpload = await store.product.uploadExcel(file); + + if (responseUpload.status === 201) { + message.success("Success upload excel!"); + } else { + message.error("Failed upload excel!"); + setLoading(false); + } + + const responseUploadProduct = await handleUploadProduct(responseUpload); + setLoading(false); + }; + + const handleChange = (info) => { + if (info.file.status === 'uploading') { + setLoading(true); + } else { + setLoading(false) + } + }; + + const handleUploadProduct = async (data) => { + const response = await store.product.uploadProduct({fileName: data.body.filename}); + + if (response.status === 201) { + message.success("Success Create Product by Excel!"); + } else { + message.error("Failed Create Product by Excel!"); + setLoading(false); + } + return response; + } + + const loadingState = ( +