Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7796 | Rev 14838 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useState, useEffect } from "react";
import axios from "axios";
import { Button, Modal } from "react-bootstrap";
import { useForm } from "react-hook-form";
import DescriptionInput from "./DescriptionInput";
import { shareModalTypes } from "../redux/share-modal/shareModal.types";
import { closeShareModal } from "../redux/share-modal/shareModal.actions";
import { useDispatch, useSelector } from "react-redux";
import DropzoneComponent from "./Dropzone/DropzoneComponent";
import { addFeed, fetchFeeds } from "../redux/feed/feed.actions";
import { addNotification } from "../redux/notification/notification.actions";
import Spinner from "./Spinner";

const ShareModal = () => {

    const [loading, setLoading] = useState(false);
    const { postUrl, isOpen, modalType } = useSelector(state => state.shareModal)
    const { currentPage, timelineUrl, feedSharedId } = useSelector(state => state.feed)

    const dispatch = useDispatch()

    const {
        register,
        unregister,
        errors,
        handleSubmit,
        setValue,
        getValues,
        clearErrors,
        setError,
    } = useForm({
        defaultValues: {
            description: "",
            share_width: "",
        }
    });

    useEffect(() => {
        register("description", {
            required: { value: "true", message: "El campo es requerido" },
        });
        register("posted_or_shared");
        if (
            modalType !== shareModalTypes.POST &&
            modalType !== shareModalTypes.SHARE
        ) {
            register("file", {
                required: { value: "true", message: "El campo es requerido" },
            });
        } else {
            if (!getValues("file")) unregister("file");
        }
    }, [modalType]);

    const recomendationText = {
        IMAGE: "Tamaño recomendado: 720x720",
        FILE: "solo documentos PDF",
        VIDEO: "Video de extensión mp4, mpeg, webm"
    }

    const closeModal = () => {
        dispatch(closeShareModal())
    }

    useEffect(() => {
        clearErrors();
    }, [isOpen]);

    const onSubmit = (data, e) => {

        setLoading(true);

        const currentFormData = new FormData();
        for (let input in data) {
            currentFormData.append(input, data[input]);
            (`${input}:${data[input]}`);
        }

        axios.post(postUrl, currentFormData)
            .then(({ data }) => {
                const newFeed = data.data;

                /* if (data.data.description || data.data.file || data.data.share_width) {
                    return Object.entries(data.data).map(([key, value]) => {
                        setError(key, { type: "required", message: value })
                    })
                } */

                if (data.success) {
                    setLoading(false);
                    e.target.reset();
                    setValue("description", "");
                    setValue("file", "");
                    clearErrors();

                    closeModal();
                    dispatch(addNotification({
                        style: "success",
                        msg: "La publicación ha sido compartida",
                    }))

                    if (currentPage && timelineUrl) {
                        dispatch(fetchFeeds(timelineUrl, currentPage))
                    }

                    if (feedSharedId) {
                        return dispatch(addFeed(newFeed, feedSharedId));
                    }

                    return dispatch(addFeed(newFeed));
                }


                dispatch(addNotification({
                    style: "error",
                    msg: "Ha ocurrido un error",
                }))

            })

    };

    const onUploadedHandler = (files) => {
        setValue("file", files);
        clearErrors("file");
    };


    return (
        <Modal
            show={isOpen}
            onHide={closeModal}
            autoFocus={false}
        >
            <form encType="multipart/form-data" onSubmit={handleSubmit(onSubmit)}>
                <Modal.Header closeButton>
                    <Modal.Title>Compartir una publicación</Modal.Title>
                </Modal.Header>
                <Modal.Body>
                    {loading
                        ?
                        <Spinner />
                        :
                        <>
                            <DescriptionInput
                                name="description"
                                setValue={setValue}
                            />
                            {errors.description && <p>{errors.description.message}</p>}
                            {
                                modalType !== shareModalTypes.POST
                                &&
                                <DropzoneComponent
                                    modalType={modalType}
                                    onUploaded={onUploadedHandler}
                                    settedFile={getValues("file")}
                                    recomendationText={recomendationText[modalType]}
                                />
                            }
                            {errors.file && <p>{errors.file.message}</p>}
                        </>
                    }
                </Modal.Body>
                <Modal.Footer>
                    <Button
                        size="sm"
                        type="submit"
                        disabled={loading}
                    >
                        Enviar
                    </Button>
                    <Button
                        color="danger"
                        size="sm"
                        variant="danger"
                        onClick={closeModal}
                        disabled={loading}
                    >
                        Cancelar
                    </Button>
                </Modal.Footer>
            </form>
        </Modal>
    );
};

export default ShareModal