Proyectos de Subversion LeadersLinked - Backend

Rev

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