"use client"; import style from "./profile.module.css"; //import ProductGallery from "@components/Home/ProductsGallery/ProductGallery"; import WhatsAppIcon from "@mui/icons-material/WhatsApp"; import LocationOnIcon from "@mui/icons-material/LocationOn"; import LocationMap from "@core/app/components/LocationMap/LocationMap"; import Button from "@core/app/components/Button/Button"; import { useNavigation } from "@core/app/hooks/goto"; import { useOrgDataStore } from "@core/Store/OrganizationData.Store"; import { useEffect, useRef, useState } from "react"; import { PublicOrganizationView } from "@core/Models/Company.model"; import { blurElementsOnLoad } from "@core/helpers/blur"; import { ButtonGroup, IconButton } from "@mui/material"; import GridViewOutlinedIcon from "@mui/icons-material/GridViewOutlined"; import SplitscreenOutlinedIcon from "@mui/icons-material/SplitscreenOutlined"; import ProductItem, { FindResultsViewMode } from "@core/app/components/ProductItem/ProductItem"; import { FacebookShareButton, EmailShareButton, WhatsappShareButton, TelegramShareButton, TwitterShareButton, FacebookIcon, WhatsappIcon as WhatsAppShareIcon, EmailIcon, TelegramIcon, TwitterIcon, } from "react-share"; import HeaderConfProvider from "@core/app/components/HeaderConfProvider/HeaderConfProvider"; import useWindowSize from "@core/app/hooks/WindowSize"; import AddIcon from "@mui/icons-material/AddOutlined"; import CloseIcon from "@mui/icons-material/Close"; import QuillEditor from "@core/app/components/QuillEditor/QuillEditor"; import { deletePost, findPostsByOrganization, getPost, moveFixedPost, savePost, toggleFixedPost, } from "./post.service"; import { useSessionStore } from "@core/Store/Sesion.Store"; import { EVENT_TYPES, useEventHandlerStore } from "@core/Store/EventHandler.Store"; import { useAlert } from "@core/Store/Alert.Store"; import { IPost } from "@core/Models/Posts.model"; import { preprocessQuillHtml, transformQuillContentForDisplay } from "@core/app/helpers/htmlSainitize"; import { useSearchParams } from "next/navigation"; import { ThemeProvider } from "@emotion/react"; import MaterialButton from "@mui/material/Button"; import ClipIcon from "@mui/icons-material/AttachFileRounded"; import DeleteIcon from "@mui/icons-material/DeleteOutlineRounded"; import UpIcon from "@mui/icons-material/ArrowUpwardRounded"; import DownIcon from "@mui/icons-material/ArrowDownwardRounded"; import PinIcon from "@mui/icons-material/PushPin"; import EditIcon from "@mui/icons-material/AutoFixHigh"; import turnosXpressTheme from "@core/app/theme/turnosXpress"; import { useParams } from "next/navigation"; import dayjs from "dayjs"; import { useConfirmStore } from "@core/Store/Confirm.Store"; import ReviewsCarousel from "@core/app/components/ReviewsCarousel/ReviewsCarousel"; import { RatingTargetType } from "@core/Models/Ratings.model"; enum VIEW { POSTS = "posts", SERVICES = "services", OPINIONS = "opinions", INFO = "info", } type UrlData = { oid: string; }; export default function OrganizationPublicProfile() { const data = useParams(); const oid = data.oid; const OrganizationData = useOrgDataStore(); const [position, setPosition] = useState<[number, number]>([0, 0]); const [orgData, setOrgData] = useState(); const [viewMode, setViewMode] = useState("grid"); const [shareTitle, setShareTitle] = useState(""); const [view, setView] = useState(VIEW.POSTS); const [wndWidth, wndHeight] = useWindowSize(); const { goTo } = useNavigation(); const refDivContent = useRef(null); const refPostsContainer = useRef(null); const [showAddButton, setShowAddButton] = useState(false); const [showEditor, setShowEditor] = useState(false); const [firstLoad, setFirstLoad] = useState(true); const [editorPostId, setEditorPostId] = useState(""); const [editorContent, setEditorContent] = useState(""); const [posts, setPosts] = useState([]); const [authorizedUsers, setAuthorizedUsers] = useState([]); const [currentPage, setCurrentPage] = useState(1); const SessionInfo = useSessionStore(); const eventHandler = useEventHandlerStore(); const alert = useAlert(); const confirm = useConfirmStore(); const searchParams = useSearchParams(); const tab = searchParams.get("tab") || "posts"; useEffect(() => { blurElementsOnLoad(); if (!tab) { setView(VIEW.POSTS); return; } switch (tab) { case "posts": setView(VIEW.POSTS); break; case "services": setView(VIEW.SERVICES); break; case "opinions": setView(VIEW.OPINIONS); break; case "info": setView(VIEW.INFO); break; default: setView(VIEW.POSTS); break; } }, []); useEffect(() => { requestAnimationFrame(() => { setTimeout(() => { processAddButton(); }, 1000); }); }, [SessionInfo, authorizedUsers]); useEffect(() => { if (!OrganizationData.orgData) return; if (!oid) return; //if (!OrganizationData.orgData.id) return; setOrgData(OrganizationData.orgData); setPosition([OrganizationData.orgData.latitude, OrganizationData.orgData.longitude]); setShareTitle(OrganizationData.orgData.name + " - " + OrganizationData.orgData.description); setCurrentPage(1); setPosts([]); cargarPosts(OrganizationData.orgData.id, 1); }, [OrganizationData.orgData]); useEffect(() => { if (orgData && oid) { //if (orgData && orgData.id) { cargarPosts(orgData.id, currentPage); } }, [currentPage, orgData]); useEffect(() => { const handleScroll = () => { if (refPostsContainer.current) { const { scrollTop, scrollHeight, clientHeight } = refPostsContainer.current; const isAtBottom = scrollTop + clientHeight >= scrollHeight - 50; if (isAtBottom) { setCurrentPage((prevPage) => prevPage + 1); } } }; const currentRef = refPostsContainer.current; if (currentRef) { currentRef.addEventListener("scroll", handleScroll); } return () => { if (currentRef) { currentRef.removeEventListener("scroll", handleScroll); } }; }, [refPostsContainer.current, view, currentPage]); const processAddButton = (currentView: VIEW = view) => { if (currentView != VIEW.POSTS) { setShowAddButton(false); return; } if (!SessionInfo.userId) { setShowAddButton(false); return; } if (!authorizedUsers.includes(SessionInfo.userId)) { setShowAddButton(false); return; } setShowAddButton(true); }; const checkPostButtons = (): boolean => { if (!SessionInfo.userId) { return false; } if (authorizedUsers.includes(SessionInfo.userId)) { return true; } return false; }; const checkShowInfo = (): boolean => { if (wndWidth < 800) { return true; } if (view === VIEW.INFO) { setView(VIEW.POSTS); } return false; }; const getContentHeight = () => { if (!refDivContent.current) return 0; const containerSize = refDivContent.current.getClientRects().item(0); if (!containerSize) return 0; return wndHeight - containerSize.y - 90; }; const getHeaderItemStyle = (item: VIEW): React.CSSProperties => { const returnValue: React.CSSProperties = {}; returnValue.fontWeight = "bold"; returnValue.color = "var(--wine-black)"; returnValue.height = "100%"; returnValue.display = "flex"; returnValue.alignItems = "center"; returnValue.padding = "20px"; returnValue.cursor = "pointer"; if (item === view) { returnValue.borderBottom = "3px solid var(--wine-red)"; } return returnValue; }; const getAddButtonStyle = (): React.CSSProperties => { const returnValue: React.CSSProperties = {}; const buttonWidth = 64; const buttonMargin = 40; returnValue.position = "absolute"; returnValue.backgroundColor = "var(--wine-dark)"; returnValue.width = `${buttonWidth}px`; returnValue.height = `${buttonWidth}px`; returnValue.borderRadius = "50%"; returnValue.display = "flex"; returnValue.justifyContent = "center"; returnValue.alignItems = "center"; returnValue.cursor = "pointer"; returnValue.color = "var(--white)"; returnValue.zIndex = 10; returnValue.right = `${buttonMargin}px`; returnValue.bottom = `${buttonMargin}px`; return returnValue; }; const getEditorStyle = (): React.CSSProperties => { const returnValue: React.CSSProperties = {}; returnValue.position = "fixed"; returnValue.backgroundColor = "var(--white)"; returnValue.top = "60px"; returnValue.left = "0px"; returnValue.right = "0px"; returnValue.bottom = "0px"; returnValue.color = "var(--black)"; returnValue.zIndex = 9999; returnValue.display = "flex"; returnValue.flexDirection = "column"; return returnValue; }; const crearPost = (content: string) => { setShowEditor(false); eventHandler.setEventType(EVENT_TYPES.LOADING); savePost({ content: content, companyId: orgData!.id, postId: editorPostId ? editorPostId : undefined, sessionUser: SessionInfo.userId, }) .then(() => { alert.showSuccess("Post creado"); // After creating a post, reset and reload the first page setCurrentPage(1); setPosts([]); if (orgData) { cargarPosts(orgData.id, 1); } }) .catch((error) => { alert.showError(error.format()); }) .finally(() => { setEditorContent(""); eventHandler.setEventType(EVENT_TYPES.SLEEP); }); }; const cargarPosts = (companyId: string, page: number) => { if (!companyId) { return; } findPostsByOrganization({ companyId: companyId, page: page, limit: 10, sessionUser: SessionInfo.userId, }) .then((response) => { setAuthorizedUsers(response.authorizedUsers); requestAnimationFrame(() => { setPosts((prevPosts) => { if (page === 1) { return response.data; } const newPosts = response.data.filter( (newPost) => !prevPosts.some((prevPost) => prevPost._id === newPost._id) ); return [...prevPosts, ...newPosts]; }); requestAnimationFrame(() => { processAddButton(); }); }); if (firstLoad) { if (view === VIEW.POSTS && response.data.length == 0) { requestAnimationFrame(() => { setView(VIEW.SERVICES); processAddButton(); }); } } setFirstLoad(false); }) .catch((error) => { console.log(error.format()); alert.showError(error.format()); }); }; const fijarPost = (postId: string) => { if (!orgData) { alert.showError("No se pudo determinar la organización."); return; } eventHandler.setEventType(EVENT_TYPES.LOADING); toggleFixedPost({ companyId: orgData.id, postId: postId, sessionUser: SessionInfo.userId, }) .then(() => { alert.showSuccess("Post actualizado"); // After creating a post, reset and reload the first page setCurrentPage(1); setPosts([]); if (orgData) { cargarPosts(oid, 1); //cargarPosts(orgData.id, 1); } }) .catch((error) => { alert.showError(error.format()); }) .finally(() => { eventHandler.setEventType(EVENT_TYPES.SLEEP); }); }; const moverPost = (postId: string, moveLength: number) => { if (!orgData) { alert.showError("No se pudo determinar la organización."); return; } eventHandler.setEventType(EVENT_TYPES.LOADING); moveFixedPost({ companyId: orgData.id, postId: postId, moveLength: moveLength, sessionUser: SessionInfo.userId, }) .then(() => { alert.showSuccess("Post actualizado"); // After creating a post, reset and reload the first page setCurrentPage(1); setPosts([]); if (orgData) { cargarPosts(oid, 1); //cargarPosts(orgData.id, 1); } }) .catch((error) => { alert.showError(error.format()); }) .finally(() => { eventHandler.setEventType(EVENT_TYPES.SLEEP); }); }; const eliminarPost = (postId: string) => { if (!orgData) { alert.showError("No se pudo determinar la organización."); return; } confirm.show( "¿Estás seguro de eliminar el post?", () => { eventHandler.setEventType(EVENT_TYPES.LOADING); deletePost({ companyId: orgData.id, id: postId, sessionUser: SessionInfo.userId, }) .then(() => { setPosts((prevPosts) => prevPosts.filter((post) => post._id !== postId)); alert.showSuccess("Post eliminado"); }) .catch((error) => { alert.showError(error.format()); }) .finally(() => { eventHandler.setEventType(EVENT_TYPES.SLEEP); }); }, () => {} ); }; const editarPost = (postId: string) => { getPost({ id: postId, }) .then((postData) => { setEditorPostId(postId); setEditorContent(postData.content); setShowEditor(true); }) .catch((error) => { alert.showError(error.format()); }); }; const LocationInfo = (data: PublicOrganizationView | null) => { if (!data) { return null; } return ( <>

Información Útil

  • {data.address}
  • {data.phone}
)}
{LocationInfo(orgData)}
{ setView(VIEW.POSTS); processAddButton(VIEW.POSTS); }} > Posts
{ setView(VIEW.SERVICES); processAddButton(VIEW.SERVICES); }} > Servicios
{checkShowInfo() && (
{ setView(VIEW.INFO); processAddButton(VIEW.INFO); }} > Contacto
)}
{view === VIEW.SERVICES && (
setViewMode("card")}> setViewMode("grid")}>
)}
{view === VIEW.POSTS && (
{showAddButton && (
{ setEditorPostId(""); setEditorContent(""); setShowEditor(true); }} >
)} {posts.length === 0 && (
Nada por aquí
)} {posts.map((post: IPost) => { return (
{dayjs(post.createdAt).format("DD MMMM YYYY HH:mm")}
{post.fixed && (
Anclado
)}
{checkPostButtons() && (
} onClick={() => { fijarPost(`${post._id}`); }} > {post.fixed ? "Liberar" : "Fijar"} {post.fixed && ( <> } onClick={() => { moverPost(`${post._id}`, -1); }} > Subir } onClick={() => { moverPost(`${post._id}`, 1); }} > Bajar )} { editarPost(`${post._id}`); }} > { eliminarPost(`${post._id}`); }} >
)}
); })}
)} {view === VIEW.SERVICES && (
{orgData.services.data.map((service) => ( ))}
)} {view === VIEW.INFO && checkShowInfo() && (
{LocationInfo(orgData)}
)}
)} ); }