Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7796 | Rev 11166 | 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
                    }))
7806 stevensc 101
 
7386 stevensc 102
                    if (currentPage && timelineUrl) {
7476 stevensc 103
                        dispatch(fetchFeeds(timelineUrl, currentPage))
7386 stevensc 104
                    }
7806 stevensc 105
 
7386 stevensc 106
                    if (feedSharedId) {
7476 stevensc 107
                        return dispatch(addFeed(newFeed, feedSharedId));
7386 stevensc 108
                    }
7806 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>
7806 stevensc 140
                    {loading
141
                        ?
142
                        <Spinner />
143
                        :
144
                        <>
145
                            <DescriptionInput
146
                                name="description"
147
                                setValue={setValue}
148
                            />
149
                            {errors.description && <p>{errors.description.message}</p>}
150
                            {
151
                                modalType !== shareModalTypes.POST
152
                                &&
153
                                <DropzoneComponent
154
                                    modalType={modalType}
155
                                    onUploaded={onUploadedHandler}
156
                                    settedFile={getValues("file")}
157
                                    recomendationText={recomendationText[modalType]}
158
                                />
159
                            }
160
                            {errors.file && <p>{errors.file.message}</p>}
161
                        </>
7412 stevensc 162
                    }
7386 stevensc 163
                </Modal.Body>
164
                <Modal.Footer>
165
                    <Button
166
                        size="sm"
167
                        type="submit"
7783 stevensc 168
                        disabled={loading}
7386 stevensc 169
                    >
170
                        Enviar
171
                    </Button>
172
                    <Button
173
                        color="danger"
174
                        size="sm"
175
                        variant="danger"
7390 stevensc 176
                        onClick={closeModal}
7783 stevensc 177
                        disabled={loading}
7386 stevensc 178
                    >
179
                        Cancelar
180
                    </Button>
181
                </Modal.Footer>
182
            </form>
183
        </Modal>
184
    );
185
};
186
 
187
export default ShareModal