import React, { 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 ({ acceptTerms, ...formValues }) => { const eulaId = currentEula.id; const useremail = currentUser.email; try { const { accepted_terms, ...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 ( <> (