import { Grid, Typography, Stack, Box, Button, FormHelperText, CircularProgress } from '@mui/material';
import * as React from "react";
import { useFormik } from 'formik';
import * as yup from 'yup';
import * as HttpUtils from "utils/HttpUtils";
import * as UrlUtils from "utils/ApiPathConst";
import * as DateUtils from "utils/DateUtils";
import * as FieldUtils from "utils/FieldUtils";
import * as ComboData from "utils/ComboData";
import { getObjectByType } from "utils/CommonFunction";
import { isORGLoggedIn, isPrimaryLoggedIn } from "utils/Utils";
import Loadable from "components/Loadable";
import { lazy } from "react";
import MainCard from "components/MainCard";
import ForwardIcon from "@mui/icons-material/Forward";
import { useNavigate } from "react-router-dom";
import titleBackgroundImg from "assets/images/dashboard/gazette-bar.png";
import { FormattedMessage, useIntl } from "react-intl";
import usePageTitle from "components/usePageTitle";
import { PNSPS_BUTTON_THEME } from "themes/buttonConst";
import { PRIMARY_CONTAINED_BUTTON_SX } from "themes/colorConst";
import { ThemeProvider } from "@emotion/react";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
import dayjs from "dayjs";
import { DemoItem } from "@mui/x-date-pickers/internals/demo";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material";
import BrStatusDialog from "components/BrStatusDialog";
const LoadingComponent = Loadable(lazy(() => import("pages/extra-pages/LoadingComponent")));
const UploadFileTable = Loadable(lazy(() => import("pages/Proof/Reply_Public/UploadFileTable")));
const BackgroundHead = {
backgroundImage: `url(${titleBackgroundImg})`,
width: "100%",
height: "100%",
backgroundSize: "contain",
backgroundRepeat: "no-repeat",
backgroundColor: "#0C489E",
backgroundPosition: "right"
};
const SubmitBrPage = () => {
usePageTitle("submitBrCertificate");
const intl = useIntl();
const navigate = useNavigate();
const [formData, setFormData] = React.useState({});
const [isLoading, setLoading] = React.useState(true);
const [errorMsg, setErrorMsg] = React.useState("");
const [attachments, setAttachments] = React.useState([]);
const attachmentsRef = React.useRef([]);
attachmentsRef.current = attachments;
const [warningText, setWarningText] = React.useState("");
const [isWarningPopUp, setIsWarningPopUp] = React.useState(false);
const [showSubmittedDialog, setShowSubmittedDialog] = React.useState(false);
const fileInputRef = React.useRef(null);
const minDate = React.useMemo(() => new Date().setDate(new Date().getDate() + 1), []);
React.useEffect(() => {
if (!isORGLoggedIn()) {
navigate("/dashboard");
return;
}
HttpUtils.get({
url: UrlUtils.GET_PUB_ORG_PATH,
onSuccess: (response) => {
const data = response.data || {};
if (!data.canSubmitBr) {
navigate(isPrimaryLoggedIn() ? "/org" : "/dashboard");
return;
}
data.country = getObjectByType(ComboData.country, "type", data.addressTemp?.country);
data.district = getObjectByType(ComboData.district, "type", data.addressTemp?.district);
data.addressLine1 = data.addressTemp?.addressLine1;
data.addressLine2 = data.addressTemp?.addressLine2;
data.addressLine3 = data.addressTemp?.addressLine3;
setFormData(data);
setLoading(false);
},
onFail: () => {
navigate("/dashboard");
},
onError: () => {
navigate("/dashboard");
}
});
}, [navigate]);
const displayErrorMsg = (msg) => {msg};
const getFileExtension = (fileName) => {
const name = (fileName || "").toLowerCase();
const dot = name.lastIndexOf(".");
if (dot <= 0 || dot === name.length - 1) {
return "";
}
return name.substring(dot + 1);
};
const isAcceptedFile = (fileName) => ["pdf", "jpg", "jpeg", "png"].includes(getFileExtension(fileName));
const initialValues = React.useMemo(() => ({
...formData,
chCompanyName: formData.chCompanyName ?? "",
brExpiryDate: null,
certificateFile: null,
}), [formData]);
const formik = useFormik({
enableReinitialize: true,
initialValues,
validationSchema: yup.object().shape({
enCompanyName: yup.string().trim().max(150).required(displayErrorMsg(intl.formatMessage({ id: "userRequireEnglishName" }))),
chCompanyName: yup.string().max(150).nullable(),
addressLine1: yup.string().trim().max(40).required(displayErrorMsg(intl.formatMessage({ id: "validateAddressLine1" }))),
addressLine2: yup.string().max(40, displayErrorMsg(intl.formatMessage({ id: "noMoreThen40Words" }))),
addressLine3: yup.string().max(40, displayErrorMsg(intl.formatMessage({ id: "noMoreThen40Words" }))),
brExpiryDate: yup.mixed().required(displayErrorMsg(intl.formatMessage({ id: "pleaseFillInBusinessRegCertValidityDate" }))),
certificateFile: yup.mixed().required(displayErrorMsg(intl.formatMessage({ id: "requireValidFileWithProofReplyFormat" }))),
country: yup.mixed().required(displayErrorMsg(intl.formatMessage({ id: "pleaseFillInCountry" }))),
district: yup.mixed().nullable().test(
"hk-district",
displayErrorMsg(intl.formatMessage({ id: "pleaseFillInDistrict" })),
function (value) {
const country = this.parent.country;
if (country && country.type === "hongKong") {
return value != null;
}
return true;
}
),
}),
onSubmit: (values, { setSubmitting }) => {
setErrorMsg("");
const files = attachmentsRef.current;
if (!values.brExpiryDate || !files || files.length === 0 || values.country == null
|| (values.country.type === "hongKong" && values.district == null)) {
setSubmitting(false);
return;
}
return new Promise((resolve, reject) => {
HttpUtils.postWithFiles({
url: UrlUtils.POST_PUB_ORG_SUBMIT_BR,
params: {
enCompanyName: values.enCompanyName,
chCompanyName: values.chCompanyName?.trim() || "",
brExpiryDate: DateUtils.dateValue(values.brExpiryDate),
address: {
country: values.country.type,
district: values.district?.type,
addressLine1: values.addressLine1,
addressLine2: values.addressLine2,
addressLine3: values.addressLine3,
},
},
files: files,
onSuccess: (response) => {
if (response?.msg) {
setErrorMsg(intl.formatMessage({ id: response.msg, defaultMessage: response.msg }));
reject();
return;
}
setShowSubmittedDialog(true);
resolve();
},
onFail: () => reject(),
onError: () => reject(),
});
});
}
});
const setCertificateFiles = (files) => {
const next = files || [];
setAttachments(next);
formik.setFieldValue("certificateFile", next[0] || null, true);
};
const handleSelectCertificate = (event) => {
const file = event.target.files[0];
if (!file) {
return;
}
if (!isAcceptedFile(file.name)) {
setWarningText(intl.formatMessage({ id: "requireValidFileWithProofReplyFormat" }));
setIsWarningPopUp(true);
event.target.value = "";
return;
}
if (file.size >= (10 * 1024 * 1034)) {
setWarningText(intl.formatMessage({ id: "fileSizeWarning" }));
setIsWarningPopUp(true);
event.target.value = "";
return;
}
file.id = 0;
setCertificateFiles([file]);
event.target.value = "";
};
return (
isLoading ?
:
{
setShowSubmittedDialog(false);
navigate(isPrimaryLoggedIn() ? "/org" : "/dashboard");
}}
/>
);
};
export default SubmitBrPage;