| @@ -20,7 +20,6 @@ const ChatCommands = (props) => { | |||
| <Commands> | |||
| <PhoneIconContainer | |||
| onClick={(event) => { | |||
| console.log(event); | |||
| setShowPhonePopover(true); | |||
| setPhonePopoverAnchorEl(event.currentTarget); | |||
| }} | |||
| @@ -1,4 +1,4 @@ | |||
| import React, { useEffect } from "react"; | |||
| import React from "react"; | |||
| import PropTypes from "prop-types"; | |||
| import { FilterFooterContainer } from "./FilterFooter.styled"; | |||
| import selectedTheme from "../../../../themes"; | |||
| @@ -14,9 +14,6 @@ const FilterFooter = (props) => { | |||
| filters.apply(); | |||
| props.toggleFilters(); | |||
| }; | |||
| useEffect(() => { | |||
| console.log(isMobile); | |||
| }, [isMobile]) | |||
| return ( | |||
| <FilterFooterContainer responsiveOpen={isMobile}> | |||
| {isMobile && ( | |||
| @@ -17,16 +17,16 @@ const MessageCard = (props) => { | |||
| const dateString = formatDateTime(new Date(message._created)); | |||
| return ( | |||
| <MessageCardContainer isMyMessage={props.isMyMessage}> | |||
| <MessageCardContainer ismymessage={props.isMyMessage}> | |||
| {/* <ProfileImage src={props.image} /> */} | |||
| <ProfileImage | |||
| src={getImageUrl(props.image, variants.chatMessage, isMobile)} | |||
| /> | |||
| <MessageContent isMyMessage={props.isMyMessage}> | |||
| <MessageText isMyMessage={props.isMyMessage}> | |||
| <MessageContent ismymessage={props.isMyMessage}> | |||
| <MessageText ismymessage={props.isMyMessage}> | |||
| {props.message.text} | |||
| </MessageText> | |||
| <MessageDate isMyMessage={props.isMyMessage}>{dateString}</MessageDate> | |||
| <MessageDate ismymessage={props.isMyMessage}>{dateString}</MessageDate> | |||
| </MessageContent> | |||
| </MessageCardContainer> | |||
| ); | |||
| @@ -4,7 +4,7 @@ import selectedTheme from "../../../themes"; | |||
| export const MessageCardContainer = styled(Box)` | |||
| display: flex; | |||
| flex-direction: ${props => props.isMyMessage ? `row-reverse` : `row`}; | |||
| flex-direction: ${props => props.ismymessage ? `row-reverse` : `row`}; | |||
| margin-bottom: 18px; | |||
| `; | |||
| export const ProfileImage = styled.img` | |||
| @@ -18,11 +18,11 @@ export const ProfileImage = styled.img` | |||
| `; | |||
| export const MessageContent = styled(Box)` | |||
| background-color: ${(props) => | |||
| props.isMyMessage | |||
| props.ismymessage | |||
| ? selectedTheme.primaryPurple | |||
| : selectedTheme.messageBackground}; | |||
| border-radius: ${(props) => | |||
| props.isMyMessage ? "9px 0px 9px 9px" : "0px 9px 9px 9px"}; | |||
| props.ismymessage ? "9px 0px 9px 9px" : "0px 9px 9px 9px"}; | |||
| padding: 9px; | |||
| position: relative; | |||
| min-height: 65px; | |||
| @@ -36,10 +36,10 @@ export const MessageText = styled(Typography)` | |||
| font-family: "DM Sans"; | |||
| font-size: 16px; | |||
| line-height: 22px; | |||
| color: ${props => props.isMyMessage ? `white` : selectedTheme.messageText}; | |||
| color: ${props => props.ismymessage ? `white` : selectedTheme.messageText}; | |||
| `; | |||
| export const MessageDate = styled(Typography)` | |||
| color: ${props => props.isMyMessage ? selectedTheme.messageMyDate : selectedTheme.messageDate}; | |||
| color: ${props => props.ismymessage ? selectedTheme.messageMyDate : selectedTheme.messageDate}; | |||
| font-size: 12px; | |||
| font-style: italic; | |||
| position: absolute; | |||
| @@ -43,8 +43,6 @@ const DirectChat = () => { | |||
| }, [chat, location.state]); | |||
| const interlocutorObject = useMemo(() => { | |||
| console.log("offer", offer); | |||
| console.log("chat", chat); | |||
| if (location?.state?.offerId) { | |||
| return { | |||
| image: offer?.companyData?.image, | |||
| @@ -28,7 +28,6 @@ const DirectChatContent = (props) => { | |||
| props.refreshChat(); | |||
| }; | |||
| useEffect(() => { | |||
| console.dir(messagesRef.current) | |||
| // const offsetBottom = | |||
| // messagesRef.current?.offsetTop + messagesRef.current?.offsetHeight; | |||
| messagesRef.current?.scrollTo({ top: messagesRef.current.scrollHeight, behaviour: "smooth" }); | |||
| @@ -23,7 +23,6 @@ const DirectChatContentHeader = (props) => { | |||
| const { isMobile } = useIsMobile(); | |||
| const togglePhonePopover = (event) => { | |||
| console.log(event); | |||
| setShowPhonePopover(true); | |||
| setPhonePopoverAnchorEl(event.currentTarget); | |||
| }; | |||
| @@ -27,7 +27,6 @@ import { useHistory, useLocation } from "react-router-dom"; | |||
| const DirectChatNewMessage = (props) => { | |||
| const [typedValue, setTypedValue] = useState(""); | |||
| const [isFocused, setIsFocused] = useState(false); | |||
| console.log(props); | |||
| const dispatch = useDispatch(); | |||
| const { t } = useTranslation(); | |||
| const location = useLocation(); | |||
| @@ -48,7 +47,6 @@ const DirectChatNewMessage = (props) => { | |||
| // }) | |||
| // ); | |||
| // } | |||
| console.log(props.chatId, typedValue, props.interlucator.userId); | |||
| if (props.chatId) { | |||
| sendMessage(props.chatId, userId, typedValue, props.interlucator.userId); | |||
| dispatch( | |||
| @@ -8,7 +8,6 @@ import { selectAboutRouteSelected } from "../../../store/selectors/appSelectors" | |||
| import { useHistory } from "react-router-dom"; | |||
| const AboutHeader = () => { | |||
| console.log("about header"); | |||
| const history = useHistory(); | |||
| const { t } = useTranslation(); | |||
| const aboutRouteSelected = useSelector(selectAboutRouteSelected); | |||
| @@ -55,7 +55,6 @@ const ImagePicker = (props) => { | |||
| // reader.readAsBinaryString(file); | |||
| reader.onload = () => { | |||
| if (props.setImage) props.setImage(file); | |||
| console.log(reader.result); | |||
| setImage(reader.result); | |||
| }; | |||
| reader.onerror = (error) => { | |||
| @@ -15,7 +15,7 @@ const CategoryDetail = (props) => { | |||
| <DetailIcon color={selectedTheme.iconStrokeColor} size="22px"> | |||
| <Category width={"22px"} /> | |||
| </DetailIcon> | |||
| <DetailText isMyProfile={props.isMyProfile}> | |||
| <DetailText ismyprofile={props.isMyProfile}> | |||
| {offer?.companyData?.company?.contacts?.location} | |||
| </DetailText> | |||
| </DetailContainer> | |||
| @@ -27,7 +27,7 @@ export const DetailIcon = styled(Icon)` | |||
| `; | |||
| export const DetailText = styled(Typography)` | |||
| font-family: "DM Sans"; | |||
| color: ${props => props.isMyProfile ? "white" : selectedTheme.primaryText}; | |||
| color: ${props => props.ismyprofile ? "white" : selectedTheme.primaryText}; | |||
| line-height: 16px; | |||
| font-size: 16px; | |||
| position: relative; | |||
| @@ -62,9 +62,7 @@ const Login = () => { | |||
| const handleSubmit = (values) => { | |||
| const { email, password } = values; | |||
| if (!formik.isValid) { | |||
| console.log("invalid"); | |||
| } else { | |||
| if (formik.isValid) { | |||
| dispatch(clearLoginErrors()); | |||
| dispatch( | |||
| fetchLogin({ | |||
| @@ -74,7 +72,6 @@ const Login = () => { | |||
| handleApiResponseError, | |||
| }) | |||
| ); | |||
| console.log(values); | |||
| } | |||
| }; | |||
| @@ -19,46 +19,58 @@ import { | |||
| import { useTranslation } from "react-i18next"; | |||
| import useIsMobile from "../../../hooks/useIsMobile"; | |||
| import { getImageUrl, variants } from "../../../util/helpers/imageUrlGetter"; | |||
| import { useMemo } from "react"; | |||
| const HeaderPopover = (props) => { | |||
| const { t } = useTranslation(); | |||
| const {isMobile} = useIsMobile(); | |||
| const { isMobile } = useIsMobile(); | |||
| const items = useMemo(() => props.items, [props.items]); | |||
| return ( | |||
| <HeaderPopoverContainer> | |||
| <PopoverTitle p={2}>{props.title}</PopoverTitle> | |||
| <PopoverList> | |||
| {props.items?.length > 0 ? ( | |||
| props.items.map((item, index) => ( | |||
| <PopoverListItem key={index}> | |||
| <PopoverListItemAvatarContainer> | |||
| {props.isProfile ? ( | |||
| <PopoverListItemProfileAvatar | |||
| alt={item.alt} | |||
| src={getImageUrl(item.src, variants.profileCard, isMobile)} | |||
| onClick={item?.onClick} | |||
| /> | |||
| ) : ( | |||
| <PopoverListItemAvatar | |||
| alt={item.alt} | |||
| src={getImageUrl(item.src, variants.profileCard, isMobile)} | |||
| onClick={item?.onClick} | |||
| /> | |||
| )} | |||
| </PopoverListItemAvatarContainer> | |||
| <PopoverListItemTextContainer | |||
| primaryTypographyProps={{ | |||
| onClick: item.onClick, | |||
| }} | |||
| primary={item.title} | |||
| secondary={ | |||
| <SecondaryTextContainer> | |||
| <SecondaryText>{item.text}</SecondaryText> | |||
| <NameOfProduct>{item?.bigText}</NameOfProduct> | |||
| </SecondaryTextContainer> | |||
| } | |||
| ></PopoverListItemTextContainer> | |||
| </PopoverListItem> | |||
| )) | |||
| {items?.length > 0 ? ( | |||
| items.map((item, index) => { | |||
| return ( | |||
| <PopoverListItem key={index}> | |||
| <PopoverListItemAvatarContainer> | |||
| {props.isProfile ? ( | |||
| <PopoverListItemProfileAvatar | |||
| alt={item.alt} | |||
| src={getImageUrl( | |||
| item.src, | |||
| variants.profileCard, | |||
| isMobile | |||
| )} | |||
| onClick={item?.onClick} | |||
| /> | |||
| ) : ( | |||
| <PopoverListItemAvatar | |||
| alt={item.alt} | |||
| src={getImageUrl( | |||
| item.src, | |||
| variants.profileCard, | |||
| isMobile | |||
| )} | |||
| onClick={item?.onClick} | |||
| /> | |||
| )} | |||
| </PopoverListItemAvatarContainer> | |||
| <PopoverListItemTextContainer | |||
| primaryTypographyProps={{ | |||
| onClick: item.onClick, | |||
| }} | |||
| primary={item.title} | |||
| secondary={ | |||
| <SecondaryTextContainer> | |||
| <SecondaryText>{item.text}</SecondaryText> | |||
| <NameOfProduct>{item?.bigText}</NameOfProduct> | |||
| </SecondaryTextContainer> | |||
| } | |||
| ></PopoverListItemTextContainer> | |||
| </PopoverListItem> | |||
| ); | |||
| }) | |||
| ) : ( | |||
| <PopoverNoItemsText>{t("header.noItems")}</PopoverNoItemsText> | |||
| )} | |||
| @@ -7,6 +7,7 @@ import { selectLatestChats } from "../../../store/selectors/chatSelectors"; | |||
| import { selectUserId } from "../../../store/selectors/loginSelectors"; | |||
| import HeaderPopover from "../HeaderPopover/HeaderPopover"; | |||
| import PropTypes from "prop-types"; | |||
| import { makeErrorToastMessage } from "../../../store/utils/makeToastMessage"; | |||
| export const MyMessages = (props) => { | |||
| const { t } = useTranslation(); | |||
| @@ -17,14 +18,13 @@ export const MyMessages = (props) => { | |||
| const [lastChats, setLastChats] = useState([]); | |||
| const convertMessages = (messages) => { | |||
| console.log(messages) | |||
| return messages | |||
| .map((item) => ({ | |||
| src: item.interlocutorData.image, | |||
| title: item.interlocutorData.name, | |||
| onClick: () => goToMessage(item?.chat?._id), | |||
| text: "Proizvod: ", | |||
| bigText: item.offerData.name | |||
| bigText: item.offerData.name, | |||
| })) | |||
| .slice(0, 2); | |||
| }; | |||
| @@ -40,8 +40,13 @@ export const MyMessages = (props) => { | |||
| } | |||
| }, [chats]); | |||
| const goToMessages = () => { | |||
| history.push(`/messages/${chats[0].chat?._id}`); | |||
| props.closePopover(); | |||
| if (lastChats.length !== 0) { | |||
| history.push(`/messages/${chats[0].chat?._id}`); | |||
| props.closePopover(); | |||
| } else { | |||
| makeErrorToastMessage(t("messages.noMessagesToast")); | |||
| props.closePopover(); | |||
| } | |||
| }; | |||
| const goToMessage = (chatId) => { | |||
| history.push(`/messages/${chatId}`); | |||
| @@ -24,6 +24,7 @@ import { fetchMineOffers } from "../../../store/actions/offers/offersActions"; | |||
| import { selectProfileName } from "../../../store/selectors/profileSelectors"; | |||
| import { useHistory } from "react-router-dom"; | |||
| import { MY_OFFERS_PAGE } from "../../../constants/pages"; | |||
| import { useMemo } from "react"; | |||
| export const MyPosts = (props) => { | |||
| const { t } = useTranslation(); | |||
| @@ -36,40 +37,42 @@ export const MyPosts = (props) => { | |||
| dispatch(fetchMineOffers()); | |||
| }, []); | |||
| useEffect(() => { | |||
| if (mineOffers?.length > 0) { | |||
| if (mineOffers.length > 1) { | |||
| setArrayOfMineOffers( | |||
| [mineOffers[0], mineOffers[1]].map((item) => ({ | |||
| src: item.images[0], | |||
| title: item.name, | |||
| onClick: () => goToOffer(item._id), | |||
| text: ( | |||
| <React.Fragment> | |||
| <PostsImgSuit /> {name} | |||
| </React.Fragment> | |||
| ), | |||
| })) | |||
| ); | |||
| } else if (mineOffers.length > 0) { | |||
| setArrayOfMineOffers( | |||
| [mineOffers[0]].map((item) => ({ | |||
| alt: "Photo", | |||
| src: item.images[0], | |||
| title: item.name, | |||
| onClick: () => goToOffer(item._id), | |||
| text: ( | |||
| <React.Fragment> | |||
| <PostsImgSuit /> {name} | |||
| </React.Fragment> | |||
| ), | |||
| })) | |||
| ); | |||
| } else { | |||
| setArrayOfMineOffers([]); | |||
| } | |||
| if (mineOffers.length > 1) { | |||
| setArrayOfMineOffers( | |||
| [mineOffers[0], mineOffers[1]].map((item) => ({ | |||
| src: item.images[0], | |||
| title: item.name, | |||
| onClick: () => goToOffer(item._id), | |||
| text: ( | |||
| <React.Fragment> | |||
| <PostsImgSuit /> {name} | |||
| </React.Fragment> | |||
| ), | |||
| })) | |||
| ); | |||
| } else if (mineOffers.length > 0) { | |||
| setArrayOfMineOffers( | |||
| [mineOffers[0]].map((item) => ({ | |||
| alt: "Photo", | |||
| src: item.images[0], | |||
| title: item.name, | |||
| onClick: () => goToOffer(item._id), | |||
| text: ( | |||
| <React.Fragment> | |||
| <PostsImgSuit /> {name} | |||
| </React.Fragment> | |||
| ), | |||
| })) | |||
| ); | |||
| } else { | |||
| setArrayOfMineOffers([]); | |||
| } | |||
| }, [mineOffers]); | |||
| const mineOffersToRender = useMemo(() => { | |||
| return [...arrayOfMineOffers]; | |||
| }, [arrayOfMineOffers, mineOffers]); | |||
| const goToOffer = (id) => { | |||
| history.push(`/proizvodi/${id}`); | |||
| props.closePopover(); | |||
| @@ -81,7 +84,7 @@ export const MyPosts = (props) => { | |||
| return ( | |||
| <HeaderPopover | |||
| title={t("header.myOffers")} | |||
| items={arrayOfMineOffers} | |||
| items={mineOffersToRender} | |||
| buttonText={t("header.checkEverything")} | |||
| buttonOnClick={goToMySwaps} | |||
| /> | |||
| @@ -37,7 +37,6 @@ const ProfileOffers = (props) => { | |||
| const isLoadingMineOffers = useSelector( | |||
| selectIsLoadingByActionType(OFFERS_PROFILE_SCOPE) | |||
| ); | |||
| console.log("isLoadingMineOffers", isLoadingMineOffers); | |||
| const searchRef = useRef(null); | |||
| const chats = useSelector(selectLatestChats); | |||
| const profileOffers = useSelector(selectProfileOffers); | |||
| @@ -57,7 +57,6 @@ const EditProfile = (props) => { | |||
| }; | |||
| const handleSubmit = (values) => { | |||
| console.log(values); | |||
| dispatch(editMineProfile({ ...values, handleApiResponseSuccess })); | |||
| props.closeModalHandler(); | |||
| }; | |||
| @@ -25,7 +25,6 @@ const UserReviews = (props) => { | |||
| const dispatch = useDispatch(); | |||
| useEffect(() => { | |||
| console.log(routeMatch); | |||
| if (props.profileReviews && routeMatch.params?.idProfile) { | |||
| let idProfile = routeMatch.params.idProfile; | |||
| dispatch(fetchReviews(idProfile)); | |||
| @@ -33,7 +33,6 @@ const useSearch = (applyAllFilters) => { | |||
| clear(); | |||
| } | |||
| const queryObject = new URLSearchParams(history.location.search); | |||
| console.log(queryObject.toString()) | |||
| if (queryObject.has(KEY_SEARCH)) { | |||
| searchOffers(queryObject.get(KEY_SEARCH)); | |||
| } else { | |||
| @@ -43,7 +42,6 @@ const useSearch = (applyAllFilters) => { | |||
| // On every local change of search string, global state of search string should be also updated | |||
| useEffect(() => { | |||
| console.log('ovde') | |||
| if (isInitallyLoaded && applyAllFilters) { | |||
| dispatch(setSearchString(searchStringLocally)); | |||
| } | |||
| @@ -55,7 +53,6 @@ const useSearch = (applyAllFilters) => { | |||
| }; | |||
| const clear = () => { | |||
| console.log('ovde2') | |||
| setSearchStringLocally(""); | |||
| }; | |||
| @@ -208,6 +208,7 @@ export default { | |||
| send: "Pošalji", | |||
| sendPlaceholder: "Poruka...", | |||
| seeChats: "Pogledaj ćaskanje", | |||
| noMessagesToast: "Nemate ni jednu poruku!" | |||
| }, | |||
| editProfile: { | |||
| website: "Web Sajt*", | |||
| @@ -40,14 +40,13 @@ const AboutPage = () => { | |||
| const yAxis = privacyPolicyRef.current.offsetTop - 64; | |||
| window.scrollTo({ top: yAxis, behavior: "smooth" }); | |||
| if (aboutRouteSelected !== scrollConstants.about.privacyPolicyPage) { | |||
| dispatch(setAboutRouteSelected(scrollConstants.about.privacyPolicyPage)); | |||
| dispatch( | |||
| setAboutRouteSelected(scrollConstants.about.privacyPolicyPage) | |||
| ); | |||
| } | |||
| } | |||
| location.state = {}; | |||
| } | |||
| return () => { | |||
| console.log(location); | |||
| }; | |||
| }, [location]); | |||
| useEffect(() => { | |||
| @@ -56,7 +55,6 @@ const AboutPage = () => { | |||
| window.scrollY > | |||
| pricesRef.current.offsetTop - window.innerHeight / 2 | |||
| ) { | |||
| console.log(true); | |||
| if ( | |||
| window.scrollY > | |||
| privacyPolicyRef.current.offsetTop - window.innerHeight / 2 | |||
| @@ -21,7 +21,6 @@ const ItemDetailsPage = (props) => { | |||
| }, []); | |||
| useEffect(() => { | |||
| console.log("effect: selectedOffer", selectedOffer, " isInitiallyLoaded: ", isInitiallyLoaded) | |||
| if (!selectedOffer?.offer && isInitiallyLoaded) { | |||
| dispatch(fetchOneOffer(offerId)); | |||
| } | |||
| @@ -40,7 +40,6 @@ const FirstPartOfRegistration = (props) => { | |||
| const handleSubmitForm = (event) => { | |||
| event.preventDefault(); | |||
| console.log(formik); | |||
| if (!formik.isValid) { | |||
| if (formik.errors.mail) { | |||
| formik.setFieldValue("mail", ""); | |||
| @@ -1,4 +1,4 @@ | |||
| import React, { useEffect, useState } from "react"; | |||
| import React, { useState } from "react"; | |||
| import PropTypes from "prop-types"; | |||
| import { | |||
| RegisterPageContainer, | |||
| @@ -71,11 +71,6 @@ const Register = () => { | |||
| } | |||
| }; | |||
| useEffect(() => { | |||
| console.log("informations", informations) | |||
| }, [informations]) | |||
| const registerUser = (values) => { | |||
| dispatch( | |||
| fetchRegisterUser({ values, handleResponseSuccess, handleResponseError }) | |||
| @@ -39,7 +39,6 @@ function clearChats() { | |||
| function addNewMessage(state, { payload }) { | |||
| let allChats = [...state.latestChats]; | |||
| let chat = allChats.find((item) => item.chat._id === payload._id); | |||
| console.log(chat); | |||
| chat = { | |||
| ...chat, | |||
| chat: { | |||
| @@ -50,9 +49,8 @@ function addNewMessage(state, { payload }) { | |||
| allChats = allChats.filter((item) => item.chat._id !== chat.chat._id); | |||
| allChats = [chat, ...allChats]; | |||
| let newSelectedChat = { ...state.selectedChat }; | |||
| console.log(chat); | |||
| console.log(newSelectedChat); | |||
| if (newSelectedChat.chat._id === chat.chat._id) newSelectedChat = { ...newSelectedChat, chat: chat.chat }; | |||
| if (newSelectedChat.chat._id === chat.chat._id) | |||
| newSelectedChat = { ...newSelectedChat, chat: chat.chat }; | |||
| return { | |||
| ...state, | |||
| latestChats: [...allChats], | |||
| @@ -94,12 +94,11 @@ function* changeMineProfile(payload) { | |||
| requestBody.append("company[contacts][web]", payload.payload.firmWebsite); | |||
| const userId = yield select(selectUserId); | |||
| const data = yield call(attemptEditProfile, userId, requestBody); | |||
| yield call(attemptEditProfile, userId, requestBody); | |||
| yield put(editMineProfileSuccess()); | |||
| if (payload.payload.handleApiResponseSuccess) { | |||
| yield call(payload.payload.handleApiResponseSuccess); | |||
| } | |||
| console.log(data); | |||
| } catch (e) { | |||
| yield put(editMineProfileError()); | |||
| console.dir(e); | |||
| @@ -22,7 +22,6 @@ import i18next from "i18next"; | |||
| function* fetchRegisterUser({ payload }) { | |||
| try { | |||
| const requestBody = new FormData(); | |||
| console.log("requeest body image", payload.values.image); | |||
| requestBody.append("email", payload.values.mail); | |||
| requestBody.append("password", payload.values.password); | |||
| requestBody.append("file", payload.values.image); | |||
| @@ -1,10 +1,8 @@ | |||
| import history from "../../store/utils/history"; | |||
| export const startChat = (chats, offer, userId) => { | |||
| console.log(offer); | |||
| const chatItem = chats.find( | |||
| (item) => | |||
| item.chat.offerId === offer?._id && offer?.userId !== userId | |||
| (item) => item.chat.offerId === offer?._id && offer?.userId !== userId | |||
| ); | |||
| if (chatItem !== undefined) { | |||
| history.push(`/messages/${chatItem.chat._id}`); | |||
| @@ -21,7 +21,7 @@ const cloudFlareVariants = { | |||
| offerDetails: "primary", | |||
| offerDetailsMobile: "primary", | |||
| profileImage: "primary", | |||
| profileImageMobile: "profileImage", | |||
| profileImageMobile: "profileMobile", | |||
| reviewCard: "review", | |||
| reviewCardMobile: "review", | |||
| chatHeader: "chatHeader", | |||