Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7788 | Rev 7790 | 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>
7412 stevensc 139
                    {
7789 stevensc 140
                        loading
141
                            ? <Spinner />
142
                            :
143
                            <>
144
                                <DescriptionInput
145
                                    name="description"
146
                                    setValue={setValue}
147
                                />
148
                                {errors.description && <p>{errors.description.message}</p>}
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
                                {errors.file && <p>{errors.file.message}</p>}
160
                            </>
7412 stevensc 161
                    }
7386 stevensc 162
                </Modal.Body>
163
                <Modal.Footer>
164
                    <Button
165
                        size="sm"
166
                        type="submit"
7783 stevensc 167
                        disabled={loading}
7386 stevensc 168
                    >
169
                        Enviar
170
                    </Button>
171
                    <Button
172
                        color="danger"
173
                        size="sm"
174
                        variant="danger"
7390 stevensc 175
                        onClick={closeModal}
7783 stevensc 176
                        disabled={loading}
7386 stevensc 177
                    >
178
                        Cancelar
179
                    </Button>
180
                </Modal.Footer>
181
            </form>
182
        </Modal>
183
    );
184
};
185
 
186
export default ShareModal