import { LoadingButton } from "@/components/frontend"; import { BOOKING_STATUS } from "@/utils/constants"; import * as yup from "yup"; import { yupResolver } from "@hookform/resolvers/yup"; import React, { useContext } from "react"; import { useForm } from "react-hook-form"; import MkdSDK from "@/utils/MkdSDK"; import { useSearchParams } from "react-router-dom"; import { GlobalContext } from "@/globalContext"; const ImagePreviewModal = ({ activeRoom, getRooms, setMessages, state, setRooms, spaceId, setShowImagePreviewModal, activeBooking }) => { const [imageSrc, setImageSrc] = React.useState(""); const [messageError, setMessageError] = React.useState(""); const [uploadedFile, setUploadedFile] = React.useState(); const [loading, setLoading] = React.useState(false); const [searchParams, setSearchParams] = useSearchParams(); const { state: globalState, dispatch: globalDispatch } = useContext(GlobalContext); const sdk = new MkdSDK(); const schema = yup .object({ photo: yup.string() }) .required(); const { register, handleSubmit, setError, formState: { errors }, } = useForm({ resolver: yupResolver(schema), }); function handleFilePreview(file){ if (file) { setUploadedFile(file[0]) setImageSrc(URL.createObjectURL(file[0])); } }; async function sendImageMessage() { if (imageSrc === "") { setMessageError("Please select an Image"); return; } setLoading(true); const handleImageUpload = async (file) => { const formData = new FormData(); formData.append("file", file); try { const upload = await sdk.uploadImage(formData); return upload; } catch (err) { console.log("err", err); return ""; } }; const upload = await handleImageUpload(uploadedFile); if (upload?.id) { setLoading(false); } try { let date = new Date().toISOString().split("T")[0]; let date2 = new Date().toISOString().replace("T", " ").split(".")[0]; // if its temporary chat then create new room before message let result = null; let is_temp_chat = activeRoom?.is_temp_chat; let room_id = searchParams.get("room_id"); if (is_temp_chat && room_id === "temp") { sdk.setTable("room"); result = await sdk.callRestAPI( { user_id: state.user, other_user_id: Number(activeRoom?.other_user_id), booking_id: activeRoom.booking_id === null ? null : Number(activeRoom?.booking_id), property_id: spaceId, user_update_at: date2, other_user_update_at: date2, chat_id: -1, }, "POST", ) setRooms((prev) => { const copy = [...prev]; copy[prev.findIndex((rm) => rm?.is_temp_chat)].id = result?.message; return copy; }) // setRooms((prev) => [...prev,r]) setActiveRoom((prev) => ({ ...prev, id: result.message })); } await sdk.postMessage({ room_id: room_id === "temp" ? result?.message : Number(room_id), user_id: state.user, message: upload.url, date, other_user_id: activeRoom.other_user_id, }); let newMessageObj = { room_id: activeRoom.id, chat: { message: upload.url, user_id: state.user, // other_user_id: activeRoom.other_user_id, is_image: true, timestamp: new Date(), }, unread: 1, create_at: new Date().toISOString(), update_at: new Date().toISOString(), }; setMessages((prev) => { const copy = { ...prev }; copy[room_id === "temp" ? result?.message : Number(room_id)] = [...copy[room_id === "temp" ? result?.message : Number(room_id)], newMessageObj]; return copy; }); // is_temp_chat = false; setLoading(false); setShowImagePreviewModal(false); getRooms() // send email alert // sendEmailAlert(activeRoom.other_user_id, activeBooking.property_name, message, activeRoom.id); } catch (err) { console.log(err) globalDispatch({ type: "SHOW_ERROR", payload: { heading: "Sending image failed", message: err.message, }, }); } setLoading(false); } return ( <>