EventosDetalle.js 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. import React, { useEffect, useMemo, useState } from "react";
  2. import {
  3. Col,
  4. Row,
  5. Form,
  6. Input,
  7. Modal,
  8. Table,
  9. Select,
  10. Button,
  11. Upload,
  12. Divider,
  13. Checkbox,
  14. DatePicker,
  15. message,
  16. Tooltip,
  17. } from "antd";
  18. import {
  19. SaveOutlined,
  20. UploadOutlined,
  21. ArrowLeftOutlined,
  22. PlusCircleOutlined,
  23. MinusCircleOutlined,
  24. } from "@ant-design/icons";
  25. import "moment/locale/es-mx";
  26. import moment from "moment";
  27. import locale from "antd/es/date-picker/locale/es_ES";
  28. import { useHistory } from "react-router-dom";
  29. import { push, ref as refDatabase } from "firebase/database";
  30. import {
  31. addDoc,
  32. collection,
  33. doc,
  34. getDoc,
  35. updateDoc,
  36. onSnapshot,
  37. query as firebseQuery,
  38. getDocs,
  39. where,
  40. } from "firebase/firestore";
  41. import {
  42. ref as refStorage,
  43. uploadBytes,
  44. deleteObject,
  45. getStorage,
  46. getDownloadURL,
  47. } from "firebase/storage";
  48. import { useModel, useModels, useQuery } from "../../../hooks";
  49. import { ViewLoading } from "../../../components";
  50. import { DefaultLayout } from "../../../components/layouts";
  51. import { firestore, storage, database } from "../../../services/firebase";
  52. import Uploader from "../../../components/Uploader";
  53. import { emptyRequest } from "../../../constants/requests";
  54. import HttpService from "../../../services/httpService";
  55. import { respuestas } from "../../../utilities";
  56. const EventosDetalle = () => {
  57. const urlweb = "/administracion/eventos";
  58. const query = useQuery();
  59. const history = useHistory();
  60. const { TextArea, Search } = Input;
  61. const { Option } = Select;
  62. const id = query.get("id");
  63. const editando = !!id;
  64. const [form] = Form.useForm();
  65. const [evento, setEvento] = useState([]);
  66. const [cargandoEvento, setCargandoEvento] = useState(true);
  67. const [guadandoCargando, setGuardandoCargando] = useState(false);
  68. const [sinFechaFin, setSinFechaFin] = useState(false);
  69. const [visible, setVisible] = useState(false);
  70. const [cargandoGrupos, setCargandoGrupos] = useState(true);
  71. // const [grupos, setGrupos] = useState([]);
  72. const [filteredResults, setFilteredResults] = useState([]);
  73. const [searchInput, setSearchInput] = useState("");
  74. const [selectedGrupos, setSelectedGrupos] = useState([]);
  75. const [selectedFile, setSelectedFile] = useState(null);
  76. const [selectedFileList, setSelectedFileList] = useState([]);
  77. const [previaImg, setPreviaImg] = useState(null);
  78. const [redes, setRedes] = useState([]);
  79. const [listaArchivos, setListaArchivos] = useState();
  80. const [referencias, setReferencias] = useState();
  81. const [requestGrupos, setRequestGrupos] = useState(emptyRequest);
  82. const [request, setRequest] = useState(emptyRequest);
  83. const requestParams = useMemo(() => ({
  84. name: 'v1/evento',
  85. id: id,
  86. expand: 'media,grupos,eventoAcciones'
  87. }), [id]);
  88. const gruposParams = useMemo(() => ({
  89. name: 'v1/grupo'
  90. }), []);
  91. const {
  92. model,
  93. modelLoading
  94. } = useModel(request);
  95. const [
  96. grupos,
  97. gruposLoading,
  98. ,
  99. ,
  100. ,
  101. ] = useModels(requestGrupos)
  102. const defaultText = (prop) =>
  103. prop || <span style={{ color: "#c7c3c3" }}>---</span>;
  104. const multipleButtonData = [
  105. {
  106. text: "Volver",
  107. to: () => history.goBack(),
  108. icon: <ArrowLeftOutlined />,
  109. props: { disabled: false, type: "primary" },
  110. },
  111. ];
  112. const columns = [
  113. {
  114. title: "Nombre",
  115. dataIndex: "nombre",
  116. key: "nombre",
  117. render: defaultText,
  118. },
  119. {
  120. title: "Ciudad",
  121. dataIndex: "ciudad",
  122. key: "ciudad",
  123. render: defaultText,
  124. },
  125. {
  126. title: "Creado",
  127. dataIndex: "timestamp",
  128. key: "timestamp",
  129. render: (_, item) =>
  130. moment(item?.timestamp?.toDate()).format("DD-MM-YYYY"),
  131. },
  132. ];
  133. const redesSociales = [
  134. "Facebook",
  135. "Twitter",
  136. "Instagram",
  137. "Whatsapp",
  138. "YouTube",
  139. "TikTok",
  140. "Otro",
  141. ];
  142. const acciones = [
  143. { id: 0, value: "Ver", label: "Ver", icon: "👁" },
  144. { id: 1, value: "Me gusta", label: "Me gusta", icon: "👍" },
  145. { id: 2, value: "Compartir", label: "Compartir", icon: "🔄" },
  146. ];
  147. const rowSelection = {
  148. onChange: (selectedRowKeys, _) => {
  149. setSelectedGrupos(selectedRowKeys);
  150. },
  151. };
  152. const obtenerUsuariosGrupo = async () => {
  153. try {
  154. const q = firebseQuery(
  155. collection(firestore, "usuarios"),
  156. where("grupos", "array-contains-any", selectedGrupos),
  157. );
  158. const querySnapshot = await getDocs(q);
  159. const docs = [];
  160. querySnapshot.forEach((doc) => {
  161. const data = doc.data();
  162. if (data?.estatus) {
  163. docs.push({
  164. grupos: data?.grupos,
  165. facebook: data?.facebook,
  166. twitter: data?.twitter,
  167. instagram: data?.instagram,
  168. telefono: data?.telefono,
  169. nombre: data?.nombre,
  170. uid: data?.uid,
  171. id: doc.id,
  172. facebookVerificado: data?.facebookVerificado,
  173. instagramVerificado: data?.instagramVerificado,
  174. twitterVerificado: data?.twitterVerificado,
  175. });
  176. }
  177. });
  178. return docs;
  179. } catch (error) {
  180. console.log("error al obtener grupos: ", error);
  181. }
  182. };
  183. const normFile = (e) => {
  184. if (Array.isArray(e)) {
  185. return e;
  186. }
  187. return e && e.fileList;
  188. };
  189. const dummyRequest = ({ onSuccess }) => {
  190. setTimeout(() => {
  191. onSuccess("ok");
  192. }, 0);
  193. };
  194. const onChangeFile = (info) => {
  195. let src = URL.createObjectURL(info.file.originFileObj);
  196. setPreviaImg(src);
  197. switch (info.file.status) {
  198. case "uploading":
  199. setSelectedFileList([info.file]);
  200. break;
  201. case "done":
  202. setSelectedFile(info.file);
  203. setSelectedFileList([info.file]);
  204. break;
  205. default:
  206. setSelectedFile(null);
  207. setSelectedFileList([]);
  208. }
  209. };
  210. const eliminarImagen = async (fileRoute) => {
  211. const storage = getStorage();
  212. const desertRef = refStorage(storage, fileRoute);
  213. deleteObject(desertRef)
  214. .then((e) => { })
  215. .catch((error) => {
  216. console.log(error);
  217. });
  218. };
  219. const onSearch = (searchValue) => {
  220. setSearchInput(searchValue);
  221. if (searchValue !== "") {
  222. const filteredData = grupos.filter((item) => {
  223. return Object.values(item)
  224. .join("")
  225. .toLowerCase()
  226. .includes(searchValue.toLowerCase());
  227. });
  228. setFilteredResults(filteredData);
  229. } else {
  230. setFilteredResults(grupos);
  231. }
  232. };
  233. const onFinish = async (values) => {
  234. try {
  235. // debugger
  236. const {
  237. accion,
  238. ciudad,
  239. descripcion,
  240. fechaFinal,
  241. fechaInicio,
  242. nombre,
  243. redSocial,
  244. url,
  245. } = values;
  246. setGuardandoCargando(true);
  247. let file = selectedFile ? selectedFile.originFileObj : null;
  248. if (!editando && referencias?.length === 0) {
  249. Modal.warning({
  250. title: "Atención",
  251. content: "Debes subir una imagen del evento.",
  252. style: { marginTop: "20vh" },
  253. });
  254. }
  255. let rutaFoto = evento?.fotoEvento;
  256. let pathFirebase = evento?.pathFirebase;
  257. if (file) {
  258. /* if (editando) {
  259. await eliminarImagen(evento?.fotoEvento);
  260. }
  261. const postListRef = refDatabase(database, "fotosEventos");
  262. const newPostRef = push(postListRef);
  263. rutaFoto = `fotosEventos/${newPostRef?.key}`;
  264. const fotoRefStorage = refStorage(storage, rutaFoto);
  265. try {
  266. let res = await uploadBytes(fotoRefStorage, file);
  267. pathFirebase = await getDownloadURL(res?.ref);
  268. } catch (error) {
  269. console.log("Error en el uploadbytes: ", error);
  270. } */
  271. }
  272. /* const docsUsuarios = await obtenerUsuariosGrupo();
  273. let resultado = { ...evento?.resultado };
  274. let usuarios = [];
  275. for (let u = 0; u < docsUsuarios?.length; u++) {
  276. if (resultado[docsUsuarios[u]?.uid] === undefined) {
  277. resultado[docsUsuarios[u]?.uid] = [];
  278. }
  279. if (resultado[docsUsuarios[u]?.uid]?.length < 1) {
  280. resultado = {
  281. ...resultado,
  282. [docsUsuarios[u].uid]: [],
  283. };
  284. }
  285. usuarios.push({
  286. id: docsUsuarios[u]?.id,
  287. uid: docsUsuarios[u]?.uid,
  288. grupos: docsUsuarios[u]?.grupos,
  289. nombre: docsUsuarios[u]?.nombre,
  290. twitter: docsUsuarios[u]?.twitter,
  291. telefono: docsUsuarios[u]?.telefono,
  292. facebook: docsUsuarios[u]?.facebook,
  293. instagram: docsUsuarios[u]?.instagram,
  294. facebookVerificado: Boolean(docsUsuarios[u]?.facebookVerificado),
  295. instagramVerificado: Boolean(docsUsuarios[u]?.instagramVerificado),
  296. twitterVerificado: Boolean(docsUsuarios[u]?.twitterVerificado),
  297. });
  298. } */
  299. let body = {
  300. accion: accion || [],
  301. ciudad: ciudad || "",
  302. descripcion: descripcion || "",
  303. fechaFinal: fechaFinal ? moment(fechaFinal)?.format() : null,
  304. fechaInicio: fechaInicio ? moment(fechaInicio)?.format() : null,
  305. sinFechaFin: sinFechaFin,
  306. nombre: nombre || "",
  307. redSocial: redSocial || "",
  308. url: url || "",
  309. grupos: selectedGrupos,
  310. fotoEvento: rutaFoto,
  311. pathFirebase: pathFirebase,
  312. timestamp: editando ? evento?.timestamp : new Date(),
  313. estatus: editando ? evento?.estatus : true,
  314. media: referencias,
  315. // usuarios: usuarios,
  316. redes: redes,
  317. // resultado: resultado,
  318. sincronizado: null,
  319. };
  320. let tag = '';
  321. if (!editando) {
  322. tag = makeid(8);
  323. } else if (editando && id) {
  324. body.id = id;
  325. if (model?.tag) {
  326. tag = model?.tag;
  327. }
  328. }
  329. body.tag = tag;
  330. let grupoEventoRef = null;
  331. //Crear grupo de eventos
  332. if (redes.length > 0) {
  333. let grupoEvento = {
  334. accion: accion,
  335. ciudad: ciudad,
  336. descripcion: descripcion,
  337. fechaFinal: fechaFinal?.toString() || "",
  338. fechaInicio: fechaInicio?.toString(),
  339. sinFechaFin: sinFechaFin,
  340. nombre: nombre || "",
  341. grupos: selectedGrupos,
  342. fotoEvento: rutaFoto,
  343. pathFirebase: pathFirebase,
  344. timestamp: editando ? evento?.timestamp : new Date(),
  345. estatus: editando ? evento?.estatus : true,
  346. // tag: tag,
  347. redes: redes,
  348. // usuarios: usuarios,
  349. // resultado: resultado,
  350. };
  351. /* grupoEventoRef = await addDoc(
  352. collection(firestore, "gruposEvento"),
  353. grupoEvento,
  354. ); */
  355. }
  356. if (editando) {
  357. const res = await HttpService.post('v1/evento', body);
  358. respuestas(res);
  359. if (res?.status === 200) {
  360. // history.push(`${urlweb}/detalleGrupo?id=${grupoEventoRef.id}&tag=${tag}`);
  361. history.push(`${urlweb}`);
  362. }
  363. } else {
  364. const res = await HttpService.post('v1/evento/guardar-grupo', body);
  365. respuestas(res);
  366. if (res?.status === 200) {
  367. // history.push(`${urlweb}/detalleGrupo?id=${grupoEventoRef.id}&tag=${tag}`);
  368. history.push(`${urlweb}`);
  369. }
  370. }
  371. /* for (let i = 0; i < redes?.length; i++) {
  372. body = {
  373. ...body,
  374. redSocial: redes[i]?.redSocial,
  375. url: redes[i]?.url,
  376. };
  377. if (!editando) {
  378. body["tag"] = tag;
  379. }
  380. // await addDoc(collection(firestore, "eventos"), body);
  381. } */
  382. // Modal.success({
  383. // title: "Éxito",
  384. // content: "Evento guardado correctamente",
  385. // });
  386. } catch (error) {
  387. Modal.warning({
  388. title: "Atención",
  389. content: "Hubo un problema al guardar, intentalo de nuevo.",
  390. });
  391. console.log("Error al guardar evento: ", error);
  392. } finally {
  393. setGuardandoCargando(false);
  394. }
  395. };
  396. const onFinishFailed = () => {
  397. Modal.warning({
  398. title: "Atención",
  399. content: "Por favor revise los datos.",
  400. style: { marginTop: "20vh" },
  401. });
  402. };
  403. function makeid(length) {
  404. let result = "";
  405. const characters =
  406. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  407. const charactersLength = characters.length;
  408. for (var i = 0; i < length; i++) {
  409. result += characters.charAt(Math.floor(Math.random() * charactersLength));
  410. }
  411. return result;
  412. }
  413. const agregarRedSocial = () => {
  414. const key = makeid(6);
  415. const datos = [...redes];
  416. const url = form.getFieldValue("url");
  417. const red = form.getFieldValue("redSocial");
  418. if (!url) {
  419. message.warning({
  420. content: "Ingresa una URL",
  421. });
  422. return;
  423. }
  424. if (!red) {
  425. message.warning({
  426. content: "Selecciona una red social",
  427. });
  428. return;
  429. }
  430. let existe = false;
  431. for (let i = 0; i < redes.length; i++) {
  432. if (redes[i]?.redSocial === red) existe = true;
  433. break;
  434. }
  435. if (existe) {
  436. message.warning({
  437. content: "Esta red social ya existe, elige otra diferente.",
  438. });
  439. return;
  440. }
  441. datos.push({
  442. key: key,
  443. url: url,
  444. redSocial: red,
  445. });
  446. setRedes(datos);
  447. form.setFieldsValue({
  448. url: null,
  449. redSocial: null,
  450. });
  451. };
  452. const quitarRedSocial = (key) => {
  453. let data = [...redes];
  454. for (let i = 0; i < data?.length; i++) {
  455. if (redes[i].key === key) {
  456. data.splice(i, 1);
  457. break;
  458. }
  459. }
  460. setRedes(data);
  461. };
  462. const leerLink = (evento) => {
  463. let link = evento?.target?.value;
  464. const facebook =
  465. /https?:\/\/(www\.)?facebook\.com\/[a-zA-Z0-9.-]+\/?/ ||
  466. /https?:\/\/(www\.)?fb\.com\/[a-zA-Z0-9.-]+\/?/;
  467. const x = /https?:\/\/(www\.)?x\.com\/[a-zA-Z0-9.-]+\/?/;
  468. const instagram = /https?:\/\/(www\.)?instagram\.com\/[a-zA-Z0-9.-]+\/?/;
  469. const whatsapp = /https?:\/\/(www\.)?wa\.me\/[a-zA-Z0-9.-]+\/?/;
  470. const youtube = /https?:\/\/(www\.)?youtube\.com\/[a-zA-Z0-9.-]+\/?/g;
  471. const ytShort = /https?:\/\/(www\.)?youtu\.be\/[a-zA-Z0-9.-]+\/?/g;
  472. const tiktok = /https?:\/\/(?:www\.)?tiktok\.com\/.*?/g;
  473. if (facebook.test(link)) {
  474. form.setFieldsValue({ redSocial: "Facebook" });
  475. } else if (x.test(link)) {
  476. form.setFieldsValue({ redSocial: "Twitter" });
  477. } else if (instagram.test(link)) {
  478. form.setFieldsValue({ redSocial: "Instagram" });
  479. } else if (whatsapp.test(link)) {
  480. form.setFieldsValue({ redSocial: "Whatsapp" });
  481. } else if (youtube.test(link) || ytShort.test(link)) {
  482. form.setFieldsValue({ redSocial: "YouTube" });
  483. } else if (tiktok.test(link)) {
  484. form.setFieldsValue({ redSocial: "TikTok" });
  485. } else {
  486. form.setFieldsValue({ redSocial: "Otro" });
  487. }
  488. };
  489. useEffect(() => {
  490. setRequest(requestParams);
  491. return () => setRequest(emptyRequest);
  492. }, [requestParams])
  493. // Grupos
  494. useEffect(() => {
  495. setRequestGrupos(gruposParams);
  496. return () => {
  497. setRequestGrupos(emptyRequest);
  498. }
  499. }, [gruposParams]);
  500. /* useEffect(() => {
  501. try {
  502. onSnapshot(collection(firestore, "grupos"), (querySnapshot) => {
  503. const docs = [];
  504. querySnapshot.forEach((doc) => {
  505. if (doc.data()?.estatus) {
  506. docs.push({ ...doc.data(), id: doc.id });
  507. }
  508. });
  509. setGrupos(docs);
  510. });
  511. } catch (error) {
  512. console.log("error al cargar grupos de firebase: ", error);
  513. } finally {
  514. setCargandoGrupos(false);
  515. }
  516. }, []); */
  517. // Limpiar imagen
  518. useEffect(() => {
  519. if (!selectedFile) {
  520. setPreviaImg(null);
  521. }
  522. }, [selectedFile]);
  523. // Obtener detalles del evento.
  524. /* useEffect(() => {
  525. let mounted = true;
  526. if (mounted && editando) {
  527. try {
  528. setTimeout(async () => {
  529. const docRef = doc(firestore, "eventos", id);
  530. const docSnap = await getDoc(docRef);
  531. setEvento(docSnap.data());
  532. }, 0);
  533. } catch (error) {
  534. console.log("error al obtener evento: ", error);
  535. } finally {
  536. setCargandoEvento(false);
  537. }
  538. }
  539. return () => (mounted = false);
  540. }, [editando, id]); */
  541. useEffect(() => {
  542. let mounted = true;
  543. if (mounted && model && editando) {
  544. setReferencias([model?.media])
  545. // setPreviaImg(model?.media?.ruta);
  546. setSinFechaFin(model?.sinFechaFin);
  547. setSelectedGrupos(model?.grupos?.map((g) => g.id));
  548. form.setFieldsValue({
  549. ...model,
  550. fechaFinal: model?.fechaFinal ? moment(model?.fechaFinal) : null,
  551. fechaInicio: model?.fechaInicio ? moment(model?.fechaInicio) : null,
  552. accion: model?.eventoAcciones ? model?.eventoAcciones.map((i) => i.accion) : null
  553. });
  554. }
  555. return () => (mounted = false);
  556. }, [editando, form, model]);
  557. useEffect(() => {
  558. if (referencias && referencias?.length > 0) {
  559. setPreviaImg(referencias[0]?.ruta)
  560. }
  561. }, [referencias])
  562. if (cargandoEvento && editando) return <ViewLoading />;
  563. console.log('model: ', model)
  564. return (
  565. <DefaultLayout multipleButtonData={multipleButtonData}>
  566. <Modal
  567. title="Agregar grupos"
  568. centered
  569. open={visible}
  570. onOk={() => setVisible(false)}
  571. onCancel={() => setVisible(false)}
  572. okText="Guardar"
  573. width={800}
  574. >
  575. <Search
  576. placeholder="Buscar..."
  577. enterButton="Buscar"
  578. size="large"
  579. style={{ width: "100%" }}
  580. onSearch={onSearch}
  581. />
  582. <Divider />
  583. <Table
  584. dataSource={searchInput?.length > 1 ? filteredResults : grupos}
  585. rowKey="id"
  586. pagination={{
  587. pageSize: 5,
  588. }}
  589. rowSelection={{
  590. type: "checkbox",
  591. selectedRowKeys: selectedGrupos,
  592. ...rowSelection,
  593. }}
  594. loading={gruposLoading}
  595. columns={columns}
  596. size="small"
  597. scroll={{ x: 700 }}
  598. />
  599. </Modal>
  600. <Form
  601. name="form"
  602. form={form}
  603. autoComplete="off"
  604. layout="vertical"
  605. onFinish={onFinish}
  606. onFinishFailed={onFinishFailed}
  607. >
  608. {/* Imagen - Nombre - Ciudad - Descripción - Url - Red social */}
  609. <Row gutter={10}>
  610. {/* Columna 1 */}
  611. <Col
  612. className="gutter-row"
  613. xs={{ span: 24 }}
  614. sm={{ span: 24 }}
  615. md={{ span: 8 }}
  616. lg={{ span: 8 }}
  617. >
  618. <Row
  619. gutter={10}
  620. style={{
  621. display: "flex",
  622. flexDirection: "row",
  623. height: "100%",
  624. }}
  625. >
  626. <Col span={24}>
  627. <Form.Item
  628. name="upload"
  629. label="Imagen del evento"
  630. valuePropName="fileList"
  631. /* rules={[
  632. { required: editando ? false : true, message: "Requerido" },
  633. ]} */
  634. getValueFromEvent={normFile}
  635. extra={editando && evento ? evento?.fotoEvento : null}
  636. >
  637. <Uploader
  638. maxCount="1"
  639. endPoint={'v1/subir-archivo/guardar'}
  640. setListaArchivos={setListaArchivos}
  641. listaArchivos={listaArchivos}
  642. setReferencias={setReferencias}
  643. />
  644. {/* <Upload
  645. accept="image/gif, image/jpeg, image/png"
  646. fileList={selectedFileList}
  647. customRequest={dummyRequest}
  648. onChange={onChangeFile}
  649. name="fotoEvento"
  650. multiple={false}
  651. maxCount={1}
  652. >
  653. <Button icon={<UploadOutlined />}>Elegir imagen</Button>
  654. </Upload> */}
  655. </Form.Item>
  656. </Col>
  657. <Col span={24}>
  658. {previaImg ? <img src={previaImg} width="100%" alt="" /> : null}
  659. </Col>
  660. <Col span={24} style={{ marginTop: 133 }}>
  661. <Button
  662. block
  663. type="dashed"
  664. icon={<PlusCircleOutlined />}
  665. onClick={() => setVisible(true)}
  666. >
  667. Agregar grupos ({selectedGrupos?.length})
  668. </Button>
  669. </Col>
  670. </Row>
  671. </Col>
  672. {/* Columna 2 */}
  673. <Col
  674. className="gutter-row"
  675. xs={{ span: 24 }}
  676. sm={{ span: 24 }}
  677. md={{ span: 16 }}
  678. lg={{ span: 16 }}
  679. >
  680. {/* Nombre evento - Ciuad */}
  681. <Row gutter={10}>
  682. <Col
  683. className="gutter-row"
  684. xs={{ span: 24 }}
  685. sm={{ span: 24 }}
  686. md={{ span: 12 }}
  687. lg={{ span: 12 }}
  688. >
  689. <Form.Item
  690. label="Nombre del evento"
  691. name="nombre"
  692. rules={[{ required: true, message: "Requerido" }]}
  693. >
  694. <Input />
  695. </Form.Item>
  696. </Col>
  697. <Col
  698. className="gutter-row"
  699. xs={{ span: 24 }}
  700. sm={{ span: 24 }}
  701. md={{ span: 12 }}
  702. lg={{ span: 12 }}
  703. >
  704. <Form.Item
  705. label="Ciudad"
  706. name="ciudad"
  707. rules={[{ required: true, message: "Requerido" }]}
  708. >
  709. <Input />
  710. </Form.Item>
  711. </Col>
  712. </Row>
  713. {/* Descripción */}
  714. <Row gutter={10}>
  715. <Col className="gutter-row" span={24}>
  716. <Form.Item
  717. label="Descripción"
  718. name="descripcion"
  719. rules={[{ required: true, message: "Requerido" }]}
  720. >
  721. <TextArea placeholder="Ingrese una descripción..." rows={4} />
  722. </Form.Item>
  723. </Col>
  724. </Row>
  725. </Col>
  726. </Row>
  727. {/* Fecha de inicio - Fecha fin - sin fecha - Accion */}
  728. <Row gutter={10} style={{ marginTop: 30 }}>
  729. <Col
  730. className="gutter-row"
  731. xs={{ span: 24 }}
  732. sm={{ span: 24 }}
  733. md={{ span: 6 }}
  734. lg={{ span: 6 }}
  735. >
  736. <Form.Item
  737. rules={[{ required: true, message: "Requerido" }]}
  738. label="Fecha de inicio"
  739. name="fechaInicio"
  740. >
  741. <DatePicker
  742. format="YYYY-MM-DD HH:mm"
  743. style={{ width: "100%" }}
  744. locale={locale}
  745. showTime={{
  746. defaultValue: moment("00:00", "HH:mm"),
  747. }}
  748. />
  749. </Form.Item>
  750. </Col>
  751. <Col
  752. className="gutter-row"
  753. xs={{ span: 24 }}
  754. sm={{ span: 24 }}
  755. md={{ span: 6 }}
  756. lg={{ span: 6 }}
  757. >
  758. <Form.Item
  759. rules={[{ required: !sinFechaFin, message: "Requerido" }]}
  760. label="Fecha de finalización"
  761. name="fechaFinal"
  762. >
  763. <DatePicker
  764. disabled={sinFechaFin}
  765. format="YYYY-MM-DD HH:mm"
  766. style={{ width: "100%" }}
  767. locale={locale}
  768. showTime={{
  769. defaultValue: moment("00:00", "HH:mm"),
  770. }}
  771. />
  772. </Form.Item>
  773. </Col>
  774. <Col
  775. className="gutter-row"
  776. xs={{ span: 24 }}
  777. sm={{ span: 24 }}
  778. md={{ span: 6 }}
  779. lg={{ span: 6 }}
  780. >
  781. <Form.Item label="&nbsp;">
  782. <Checkbox
  783. checked={sinFechaFin}
  784. onChange={(e) => setSinFechaFin(e.target.checked)}
  785. >
  786. Sin fecha de finalización
  787. </Checkbox>
  788. </Form.Item>
  789. </Col>
  790. <Col
  791. className="gutter-row"
  792. xs={{ span: 24 }}
  793. sm={{ span: 24 }}
  794. md={{ span: 6 }}
  795. lg={{ span: 6 }}
  796. >
  797. <Form.Item label="Acción" name="accion">
  798. <Select
  799. mode="multiple"
  800. style={{ width: "100%" }}
  801. placeholder="Selecciona una o más opciones"
  802. optionLabelProp="label"
  803. >
  804. {acciones?.map((item) => (
  805. <Option
  806. value={item?.value}
  807. label={item?.label}
  808. key={item?.id}
  809. >
  810. <div className="demo-option-label-item">
  811. <span role="img" aria-label={item?.label}>
  812. {item?.icon}
  813. </span>
  814. {item?.label}
  815. </div>
  816. </Option>
  817. ))}
  818. </Select>
  819. </Form.Item>
  820. </Col>
  821. </Row>
  822. {/* URL - Red Social - Agregar [+] */}
  823. <Row gutter={10}>
  824. <Col
  825. className="gutter-row"
  826. xs={{ span: 24 }}
  827. sm={{ span: 24 }}
  828. md={{ span: 12 }}
  829. lg={{ span: 12 }}
  830. >
  831. <Form.Item label="URL" name="url">
  832. <Input onChange={(v) => leerLink(v)} />
  833. </Form.Item>
  834. </Col>
  835. <Col
  836. className="gutter-row"
  837. xs={{ span: 24 }}
  838. sm={{ span: 24 }}
  839. md={{ span: editando ? 12 : 9 }}
  840. lg={{ span: editando ? 12 : 9 }}
  841. >
  842. <Form.Item label="Red social" name="redSocial">
  843. <Select style={{ width: "100%" }} placeholder="Selecciona">
  844. {redesSociales?.map((item) => (
  845. <Option key={item} value={item}>
  846. {item === "Twitter" ? "X" : item}
  847. </Option>
  848. ))}
  849. </Select>
  850. </Form.Item>
  851. </Col>
  852. {!editando && (
  853. <Col
  854. className="gutter-row"
  855. xs={{ span: 24 }}
  856. sm={{ span: 24 }}
  857. md={{ span: 3 }}
  858. lg={{ span: 3 }}
  859. >
  860. <Form.Item label="&nbsp;">
  861. <Button
  862. type="primary"
  863. icon={<PlusCircleOutlined />}
  864. block
  865. onClick={agregarRedSocial}
  866. />
  867. </Form.Item>
  868. </Col>
  869. )}
  870. </Row>
  871. {redes.map((item) => (
  872. <Row key={item.key} gutter={10}>
  873. <Col
  874. className="gutter-row"
  875. xs={{ span: 24 }}
  876. sm={{ span: 24 }}
  877. md={{ span: 12 }}
  878. lg={{ span: 12 }}
  879. >
  880. <Form.Item label="&nbsp;">
  881. <Input readOnly value={item?.url} />
  882. </Form.Item>
  883. </Col>
  884. <Col
  885. className="gutter-row"
  886. xs={{ span: 24 }}
  887. sm={{ span: 24 }}
  888. md={{ span: 9 }}
  889. lg={{ span: 9 }}
  890. >
  891. <Form.Item label="&nbsp;">
  892. <Input readOnly value={item?.redSocial} />
  893. </Form.Item>
  894. </Col>
  895. <Col
  896. className="gutter-row"
  897. xs={{ span: 24 }}
  898. sm={{ span: 24 }}
  899. md={{ span: 3 }}
  900. lg={{ span: 3 }}
  901. >
  902. <Form.Item label="&nbsp;">
  903. <Tooltip title="Remover">
  904. <Button
  905. type="danger"
  906. icon={<MinusCircleOutlined />}
  907. block
  908. onClick={() => quitarRedSocial(item?.key)}
  909. />
  910. </Tooltip>
  911. </Form.Item>
  912. </Col>
  913. </Row>
  914. ))}
  915. <Row gutter={10}>
  916. <Col
  917. xs={{ span: 24 }}
  918. sm={{ span: 24 }}
  919. md={{ span: 12 }}
  920. lg={{ span: 8 }}
  921. >
  922. <Button
  923. type="primary"
  924. htmlType="submit"
  925. icon={<SaveOutlined />}
  926. block
  927. size="large"
  928. loading={guadandoCargando}
  929. >
  930. Guardar
  931. </Button>
  932. </Col>
  933. </Row>
  934. </Form>
  935. </DefaultLayout>
  936. );
  937. };
  938. export default EventosDetalle;