Proyectos de Subversion LeadersLinked - Backend

Rev

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