Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7790 | Rev 7806 | 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
 
7796 stevensc 69
    const onSubmit = (data, e) => {
70
 
7386 stevensc 71
        setLoading(true);
72
 
73
        const currentFormData = new FormData();
74
        for (let input in data) {
75
            currentFormData.append(input, data[input]);
76
            (`${input}:${data[input]}`);
77
        }
78
 
79
        axios.post(postUrl, currentFormData)
80
            .then(({ data }) => {
81
                const newFeed = data.data;
82
 
7788 stevensc 83
                /* if (data.data.description || data.data.file || data.data.share_width) {
7386 stevensc 84
                    return Object.entries(data.data).map(([key, value]) => {
85
                        setError(key, { type: "required", message: value })
86
                    })
7788 stevensc 87
                } */
7386 stevensc 88
 
89
                if (data.success) {
7796 stevensc 90
                    setLoading(false);
7386 stevensc 91
                    e.target.reset();
92
                    setValue("description", "");
93
                    setValue("file", "");
94
                    clearErrors();
7789 stevensc 95
 
96
                    closeModal();
7783 stevensc 97
                    dispatch(addNotification({
98
                        style: "success",
99
                        msg: "La publicación ha sido compartida",
100
                    }))
7796 stevensc 101
 
7386 stevensc 102
                    if (currentPage && timelineUrl) {
7476 stevensc 103
                        dispatch(fetchFeeds(timelineUrl, currentPage))
7386 stevensc 104
                    }
7796 stevensc 105
 
7386 stevensc 106
                    if (feedSharedId) {
7476 stevensc 107
                        return dispatch(addFeed(newFeed, feedSharedId));
7386 stevensc 108
                    }
7796 stevensc 109
 
7476 stevensc 110
                    return dispatch(addFeed(newFeed));
7386 stevensc 111
                }
112
 
113
 
7783 stevensc 114
                dispatch(addNotification({
115
                    style: "error",
116
                    msg: "Ha ocurrido un error",
117
                }))
7386 stevensc 118
 
119
            })
120
 
121
    };
122
 
123
    const onUploadedHandler = (files) => {
124
        setValue("file", files);
125
        clearErrors("file");
126
    };
127
 
7388 stevensc 128
 
7386 stevensc 129
    return (
130
        <Modal
7390 stevensc 131
            show={isOpen}
132
            onHide={closeModal}
7386 stevensc 133
            autoFocus={false}
134
        >
135
            <form encType="multipart/form-data" onSubmit={handleSubmit(onSubmit)}>
136
                <Modal.Header closeButton>
137
                    <Modal.Title>Compartir una publicación</Modal.Title>
138
                </Modal.Header>
139
                <Modal.Body>
7790 stevensc 140
                    <DescriptionInput
141
                        name="description"
142
                        setValue={setValue}
143
                    />
144
                    {errors.description && <p>{errors.description.message}</p>}
7412 stevensc 145
                    {
7790 stevensc 146
                        modalType !== shareModalTypes.POST
147
                        &&
148
                        <DropzoneComponent
149
                            modalType={modalType}
150
                            onUploaded={onUploadedHandler}
151
                            settedFile={getValues("file")}
152
                            recomendationText={recomendationText[modalType]}
153
                        />
7412 stevensc 154
                    }
7790 stevensc 155
                    {errors.file && <p>{errors.file.message}</p>}
7386 stevensc 156
                </Modal.Body>
157
                <Modal.Footer>
158
                    <Button
159
                        size="sm"
160
                        type="submit"
7783 stevensc 161
                        disabled={loading}
7386 stevensc 162
                    >
163
                        Enviar
164
                    </Button>
165
                    <Button
166
                        color="danger"
167
                        size="sm"
168
                        variant="danger"
7390 stevensc 169
                        onClick={closeModal}
7783 stevensc 170
                        disabled={loading}
7386 stevensc 171
                    >
172
                        Cancelar
173
                    </Button>
174
                </Modal.Footer>
175
            </form>
7790 stevensc 176
            {loading
177
                &&
178
                <Spinner />
179
            }
7386 stevensc 180
        </Modal>
181
    );
182
};
183
 
184
export default ShareModal