import React, { useState, useEffect, useRef } from "react"; import * as Yup from "yup"; import { Formik, Form, Field } from "formik"; import { toast } from "react-toastify"; import { makeStyles } from "@material-ui/core/styles"; import { green } from "@material-ui/core/colors"; import Button from "@material-ui/core/Button"; import TextField from "@material-ui/core/TextField"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; import CircularProgress from "@material-ui/core/CircularProgress"; import { i18n } from "../../translate/i18n"; import api from "../../services/api"; import toastError from "../../errors/toastError"; import ColorPicker from "../ColorPicker"; import { FormControl, Grid, IconButton, InputAdornment, InputLabel, MenuItem, Paper, Select, Tab, Tabs, } from "@material-ui/core"; import { Colorize } from "@material-ui/icons"; import { QueueOptions } from "../QueueOptions"; import SchedulesForm from "../SchedulesForm"; const useStyles = makeStyles((theme) => ({ root: { display: "flex", flexWrap: "wrap", }, textField: { marginRight: theme.spacing(1), flex: 1, }, btnWrapper: { position: "relative", }, buttonProgress: { color: green[500], position: "absolute", top: "50%", left: "50%", marginTop: -12, marginLeft: -12, }, formControl: { margin: theme.spacing(1), minWidth: 120, }, colorAdorment: { width: 20, height: 20, }, })); const QueueSchema = Yup.object().shape({ name: Yup.string() .min(2, i18n.t("queueModal.form.nameShort")) .max(50, i18n.t("queueModal.form.nameLong")) .required(i18n.t("queueModal.form.nameRequired")), color: Yup.string() .min(3, i18n.t("queueModal.form.colorShort")) .max(9, i18n.t("queueModal.form.colorLong")) .required(), greetingMessage: Yup.string(), }); const QueueModal = ({ open, onClose, queueId }) => { const classes = useStyles(); const initialState = { name: "", color: "", greetingMessage: "", outOfHoursMessage: "", orderQueue: "", integrationId: "", promptId: "", }; const [colorPickerModalOpen, setColorPickerModalOpen] = useState(false); const [queue, setQueue] = useState(initialState); const [tab, setTab] = useState(0); const [schedulesEnabled, setSchedulesEnabled] = useState(false); const greetingRef = useRef(); const [integrations, setIntegrations] = useState([]); const [schedules, setSchedules] = useState([ { weekday: "Segunda-feira", weekdayEn: "monday", startTime: "08:00", endTime: "18:00", }, { weekday: "Terça-feira", weekdayEn: "tuesday", startTime: "08:00", endTime: "18:00", }, { weekday: "Quarta-feira", weekdayEn: "wednesday", startTime: "08:00", endTime: "18:00", }, { weekday: "Quinta-feira", weekdayEn: "thursday", startTime: "08:00", endTime: "18:00", }, { weekday: "Sexta-feira", weekdayEn: "friday", startTime: "08:00", endTime: "18:00", }, { weekday: "Sábado", weekdayEn: "saturday", startTime: "08:00", endTime: "12:00", }, { weekday: "Domingo", weekdayEn: "sunday", startTime: "00:00", endTime: "00:00", }, ]); const [selectedPrompt, setSelectedPrompt] = useState(null); const [prompts, setPrompts] = useState([]); useEffect(() => { (async () => { try { const { data } = await api.get("/prompt"); setPrompts(data.prompts); } catch (err) { toastError(err); } })(); }, []); useEffect(() => { api.get(`/settings`).then(({ data }) => { if (Array.isArray(data)) { const scheduleType = data.find((d) => d.key === "scheduleType"); if (scheduleType) { setSchedulesEnabled(scheduleType.value === "queue"); } } }); }, []); useEffect(() => { (async () => { try { const { data } = await api.get("/queueIntegration"); setIntegrations(data.queueIntegrations); } catch (err) { toastError(err); } })(); }, []); useEffect(() => { (async () => { if (!queueId) return; try { const { data } = await api.get(`/queue/${queueId}`); setQueue((prevState) => { return { ...prevState, ...data }; }); data.promptId ? setSelectedPrompt(data.promptId) : setSelectedPrompt(null); setSchedules(data.schedules); } catch (err) { toastError(err); } })(); return () => { setQueue({ name: "", color: "", greetingMessage: "", outOfHoursMessage: "", orderQueue: "", integrationId: "", }); }; }, [queueId, open]); const handleClose = () => { onClose(); setQueue(initialState); }; const handleSaveQueue = async (values) => { try { if (queueId) { await api.put(`/queue/${queueId}`, { ...values, schedules, promptId: selectedPrompt ? selectedPrompt : null, }); } else { await api.post("/queue", { ...values, schedules, promptId: selectedPrompt ? selectedPrompt : null, }); } toast.success(i18n.t("queueModal.toasts.success")); handleClose(); } catch (err) { toastError(err); } }; const handleSaveSchedules = async (values) => { toast.success(i18n.t("queueModal.toasts.info")); setSchedules(values); setTab(0); }; const handleChangePrompt = (e) => { setSelectedPrompt(e.target.value); }; return (
{queueId ? `${i18n.t("queueModal.title.edit")}` : `${i18n.t("queueModal.title.add")}`} setTab(v)} aria-label="disabled tabs example" > {schedulesEnabled && } {tab === 0 && ( { setTimeout(() => { handleSaveQueue(values); actions.setSubmitting(false); }, 400); }} > {({ touched, errors, isSubmitting, values }) => (
{ setColorPickerModalOpen(true); greetingRef.current.focus(); }} error={touched.color && Boolean(errors.color)} helperText={touched.color && errors.color} InputProps={{ startAdornment: (
), endAdornment: ( setColorPickerModalOpen(true)} > ), }} variant="outlined" margin="dense" className={classes.textField} /> setColorPickerModalOpen(false)} onChange={(color) => { values.color = color; setQueue(() => { return { ...values, color }; }); }} />
{i18n.t("queueModal.form.integrationId")} {"Nenhum"} {integrations.map((integration) => ( {integration.name} ))} {i18n.t("whatsappModal.form.prompt")}
{schedulesEnabled && ( )}
)}
)} {tab === 1 && ( )}
); }; export default QueueModal;