Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7476 | Rev 7788 | 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
 
82
                if (data.data.description || data.data.file || data.data.share_width) {
83
                    return Object.entries(data.data).map(([key, value]) => {
84
                        setError(key, { type: "required", message: value })
85
                    })
86
                }
87
 
88
                if (data.success) {
7390 stevensc 89
                    closeModal();
7386 stevensc 90
                    // reset data
91
                    e.target.reset();
92
                    setValue("description", "");
93
                    setValue("file", "");
94
                    clearErrors();
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>
7412 stevensc 139
                    {
7783 stevensc 140
                        loading
141
                            ?
142
                            <Spinner />
143
                            :
144
                            <>
145
                                <DescriptionInput
146
                                    name="description"
147
                                    setValue={setValue}
148
                                />
149
                                {
150
                                    modalType !== shareModalTypes.POST
151
                                    &&
152
                                    <DropzoneComponent
153
                                        modalType={modalType}
154
                                        onUploaded={onUploadedHandler}
155
                                        settedFile={getValues("file")}
156
                                        recomendationText={recomendationText[modalType]}
157
                                    />
158
                                }
159
                            </>
7412 stevensc 160
                    }
7386 stevensc 161
                </Modal.Body>
162
                <Modal.Footer>
163
                    <Button
164
                        size="sm"
165
                        type="submit"
7783 stevensc 166
                        disabled={loading}
7386 stevensc 167
                    >
168
                        Enviar
169
                    </Button>
170
                    <Button
171
                        color="danger"
172
                        size="sm"
173
                        variant="danger"
7390 stevensc 174
                        onClick={closeModal}
7783 stevensc 175
                        disabled={loading}
7386 stevensc 176
                    >
177
                        Cancelar
178
                    </Button>
179
                </Modal.Footer>
180
            </form>
181
        </Modal>
182
    );
183
};
184
 
185
export default ShareModal