Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
7386 stevensc 1
import React, { useState, useEffect } from "react";
2
import axios from "axios";
3
import { Button, Modal } from "react-bootstrap";
4
import { useForm } from "react-hook-form";
5
import DescriptionInput from "./DescriptionInput";
6
import { shareModalTypes } from "../redux/share-modal/shareModal.types";
7
import { closeShareModal } from "../redux/share-modal/shareModal.actions";
7387 stevensc 8
import { useDispatch, useSelector } from "react-redux";
7386 stevensc 9
import DropzoneComponent from "./Dropzone/DropzoneComponent";
7476 stevensc 10
import { addFeed, fetchFeeds } from "../redux/feed/feed.actions";
7783 stevensc 11
import { addNotification } from "../redux/notification/notification.actions";
12
import Spinner from "./Spinner";
7386 stevensc 13
 
7387 stevensc 14
const ShareModal = () => {
7386 stevensc 15
 
16
    const [loading, setLoading] = useState(false);
7389 stevensc 17
    const { postUrl, isOpen, modalType } = useSelector(state => state.shareModal)
7476 stevensc 18
    const { currentPage, timelineUrl, feedSharedId } = useSelector(state => state.feed)
7388 stevensc 19
 
7386 stevensc 20
    const dispatch = useDispatch()
21
 
22
    const {
23
        register,
24
        unregister,
25
        errors,
26
        handleSubmit,
27
        setValue,
28
        getValues,
29
        clearErrors,
30
        setError,
31
    } = useForm({
32
        defaultValues: {
33
            description: "",
34
            share_width: "",
7390 stevensc 35
        }
7386 stevensc 36
    });
37
 
38
    useEffect(() => {
39
        register("description", {
40
            required: { value: "true", message: "El campo es requerido" },
41
        });
42
        register("posted_or_shared");
43
        if (
44
            modalType !== shareModalTypes.POST &&
45
            modalType !== shareModalTypes.SHARE
46
        ) {
47
            register("file", {
48
                required: { value: "true", message: "El campo es requerido" },
49
            });
50
        } else {
51
            if (!getValues("file")) unregister("file");
52
        }
53
    }, [modalType]);
54
 
55
    const recomendationText = {
56
        IMAGE: "Tamaño recomendado: 720x720",
57
        FILE: "solo documentos PDF",
58
        VIDEO: "Video de extensión mp4, mpeg, webm"
59
    }
60
 
7390 stevensc 61
    const closeModal = () => {
62
        dispatch(closeShareModal())
63
    }
64
 
7386 stevensc 65
    useEffect(() => {
66
        clearErrors();
67
    }, [isOpen]);
68
 
69
    const onSubmit = async (data, e) => {
70
        setLoading(true);
71
 
72
        const currentFormData = new FormData();
73
        for (let input in data) {
74
            currentFormData.append(input, data[input]);
75
            (`${input}:${data[input]}`);
76
        }
77
 
78
        axios.post(postUrl, currentFormData)
79
            .then(({ data }) => {
80
                const newFeed = data.data;
81
 
7788 stevensc 82
                /* if (data.data.description || data.data.file || data.data.share_width) {
7386 stevensc 83
                    return Object.entries(data.data).map(([key, value]) => {
84
                        setError(key, { type: "required", message: value })
85
                    })
7788 stevensc 86
                } */
7386 stevensc 87
 
88
                if (data.success) {
89
                    e.target.reset();
90
                    setValue("description", "");
91
                    setValue("file", "");
92
                    clearErrors();
7789 stevensc 93
 
94
                    closeModal();
7783 stevensc 95
                    dispatch(addNotification({
96
                        style: "success",
97
                        msg: "La publicación ha sido compartida",
98
                    }))
7386 stevensc 99
 
100
                    if (currentPage && timelineUrl) {
7476 stevensc 101
                        dispatch(fetchFeeds(timelineUrl, currentPage))
7386 stevensc 102
                    }
103
 
104
                    if (feedSharedId) {
7476 stevensc 105
                        return dispatch(addFeed(newFeed, feedSharedId));
7386 stevensc 106
                    }
107
 
7476 stevensc 108
                    return dispatch(addFeed(newFeed));
7386 stevensc 109
                }
110
 
111
 
7783 stevensc 112
                dispatch(addNotification({
113
                    style: "error",
114
                    msg: "Ha ocurrido un error",
115
                }))
7386 stevensc 116
 
117
            })
118
 
119
        setLoading(false);
120
    };
121
 
122
    const onUploadedHandler = (files) => {
123
        setValue("file", files);
124
        clearErrors("file");
125
    };
126
 
7388 stevensc 127
 
7386 stevensc 128
    return (
129
        <Modal
7390 stevensc 130
            show={isOpen}
131
            onHide={closeModal}
7386 stevensc 132
            autoFocus={false}
133
        >
134
            <form encType="multipart/form-data" onSubmit={handleSubmit(onSubmit)}>
135
                <Modal.Header closeButton>
136
                    <Modal.Title>Compartir una publicación</Modal.Title>
137
                </Modal.Header>
138
                <Modal.Body>
7790 stevensc 139
                    <DescriptionInput
140
                        name="description"
141
                        setValue={setValue}
142
                    />
143
                    {errors.description && <p>{errors.description.message}</p>}
7412 stevensc 144
                    {
7790 stevensc 145
                        modalType !== shareModalTypes.POST
146
                        &&
147
                        <DropzoneComponent
148
                            modalType={modalType}
149
                            onUploaded={onUploadedHandler}
150
                            settedFile={getValues("file")}
151
                            recomendationText={recomendationText[modalType]}
152
                        />
7412 stevensc 153
                    }
7790 stevensc 154
                    {errors.file && <p>{errors.file.message}</p>}
7386 stevensc 155
                </Modal.Body>
156
                <Modal.Footer>
157
                    <Button
158
                        size="sm"
159
                        type="submit"
7783 stevensc 160
                        disabled={loading}
7386 stevensc 161
                    >
162
                        Enviar
163
                    </Button>
164
                    <Button
165
                        color="danger"
166
                        size="sm"
167
                        variant="danger"
7390 stevensc 168
                        onClick={closeModal}
7783 stevensc 169
                        disabled={loading}
7386 stevensc 170
                    >
171
                        Cancelar
172
                    </Button>
173
                </Modal.Footer>
174
            </form>
7790 stevensc 175
            {loading
176
                &&
177
                <Spinner />
178
            }
7386 stevensc 179
        </Modal>
180
    );
181
};
182
 
183
export default ShareModal