import { useCallback, useEffect, useRef, useState } from "react"; import { Button, Card, Checkbox, Col, Form, Input, Modal, Row } from "antd"; import Markdown from "react-markdown"; import { createStructuredSelector } from "reselect"; import { selectCurrentEula, selectCurrentUser } from "../../redux/user/user.selectors"; import { connect } from "react-redux"; import { INSERT_EULA_ACCEPTANCE } from "../../graphql/user.queries"; import { useMutation } from "@apollo/client"; import { acceptEula } from "../../redux/user/user.actions"; import { useTranslation } from "react-i18next"; import dayjs from "../../utils/day"; import "./eula.styles.scss"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; const Eula = ({ currentEula, currentUser, acceptEula }) => { const [formReady, setFormReady] = useState(false); const [hasEverScrolledToBottom, setHasEverScrolledToBottom] = useState(false); const [insertEulaAcceptance] = useMutation(INSERT_EULA_ACCEPTANCE); const [form] = Form.useForm(); const markdownCardRef = useRef(null); const { t } = useTranslation(); const notification = useNotification(); const handleScroll = useCallback( (e) => { const bottom = e.target.scrollHeight - 100 <= e.target.scrollTop + e.target.clientHeight; if (bottom && !hasEverScrolledToBottom) { setHasEverScrolledToBottom(true); } else if (e.target.scrollHeight <= e.target.clientHeight && !hasEverScrolledToBottom) { setHasEverScrolledToBottom(true); } }, [hasEverScrolledToBottom, setHasEverScrolledToBottom] ); useEffect(() => { handleScroll({ target: markdownCardRef.current }); }, [handleScroll]); const handleChange = useCallback(() => { form .validateFields({ validateOnly: true }) .then(() => setFormReady(hasEverScrolledToBottom)) .catch(() => setFormReady(false)); }, [form, hasEverScrolledToBottom]); useEffect(() => { handleChange(); }, [handleChange, hasEverScrolledToBottom, form]); const onFinish = async ({ ...formValues }) => { const eulaId = currentEula.id; const useremail = currentUser.email; try { const { ...otherFormValues } = formValues; // Trim the values of the fields before submitting const trimmedFormValues = Object.entries(otherFormValues).reduce((acc, [key, value]) => { acc[key] = typeof value === "string" ? value?.trim() : value; return acc; }, {}); await insertEulaAcceptance({ variables: { eulaAcceptance: { eulaid: eulaId, useremail, ...otherFormValues, ...trimmedFormValues, date_accepted: new Date() } } }); acceptEula(); } catch (err) { notification.error({ message: t("eula.errors.acceptance.message"), description: t("eula.errors.acceptance.description") }); console.log(`${t("eula.errors.acceptance.message")}`); console.dir({ message: err.message, stack: err.stack }); } }; return ( ( )} closable={false} >
{currentEula?.content?.replace(/\\n|\\r|\\n\\r|\\r\\n/g, "\n")}
{!hasEverScrolledToBottom && (

{t("eula.content.never_scrolled")}

)}
); }; const EulaFormComponent = ({ form, handleChange, onFinish, t }) => (
value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.first_name"))) } ]} > value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.last_name"))) } ]} > value?.trim() !== "" ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.business_name"))) } ]} > { if (dayjs(value).isSame(dayjs(), "day")) { return Promise.resolve(); } return Promise.reject(new Error(t("eula.messages.date_accepted"))); } } ]} > value ? Promise.resolve() : Promise.reject(new Error(t("eula.messages.accepted_terms"))) } ]} > {t("eula.labels.accepted_terms")}
); const mapStateToProps = createStructuredSelector({ currentEula: selectCurrentEula, currentUser: selectCurrentUser }); const mapDispatchToProps = (dispatch) => ({ acceptEula: () => dispatch(acceptEula()) }); export default connect(mapStateToProps, mapDispatchToProps)(Eula);