@hhgtech/hhg-components 1.18.55 → 1.18.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/care.js +1 -1
- package/build/components.js +1 -1
- package/build/{cookieHelper-8f8e1c23.js → cookieHelper-ed78a7f1.js} +2 -2
- package/build/{cookieHelper-8f8e1c23.js.map → cookieHelper-ed78a7f1.js.map} +1 -1
- package/build/core.js +1 -1
- package/build/esm/care.js +1 -1
- package/build/esm/components.js +1 -1
- package/build/esm/{cookieHelper-ebb85a98.js → cookieHelper-00386d56.js} +2 -2
- package/build/esm/{cookieHelper-ebb85a98.js.map → cookieHelper-00386d56.js.map} +1 -1
- package/build/esm/core.js +1 -1
- package/build/esm/{index-3a83d01f.js → index-2017ad6a.js} +2 -2
- package/build/esm/{index-3a83d01f.js.map → index-2017ad6a.js.map} +1 -1
- package/build/esm/{index-071a48db.js → index-3e8dfdf1.js} +2 -2
- package/build/esm/{index-071a48db.js.map → index-3e8dfdf1.js.map} +1 -1
- package/build/esm/{index-e875bc07.js → index-6f3f75e7.js} +2 -2
- package/build/esm/{index-e875bc07.js.map → index-6f3f75e7.js.map} +1 -1
- package/build/esm/{index-52510d7b.js → index-9d13187e.js} +2 -2
- package/build/esm/{index-52510d7b.js.map → index-9d13187e.js.map} +1 -1
- package/build/esm/index.js +1 -1
- package/build/esm/{index.styled-1243f793.js → index.styled-6a37c4e2.js} +2 -2
- package/build/esm/{index.styled-1243f793.js.map → index.styled-6a37c4e2.js.map} +1 -1
- package/build/esm/navigation.js +1 -1
- package/build/esm/together.js +1 -1
- package/build/esm/{types-af8b0751.js → types-7b676b4a.js} +2 -2
- package/build/esm/{types-af8b0751.js.map → types-7b676b4a.js.map} +1 -1
- package/build/esm/{types-c6e69efa.js → types-f30bb23e.js} +2 -2
- package/build/esm/{types-c6e69efa.js.map → types-f30bb23e.js.map} +1 -1
- package/build/esm/useTranslations-5638eb68.js +2 -0
- package/build/esm/{useTranslations-3c1ac581.js.map → useTranslations-5638eb68.js.map} +1 -1
- package/build/{index-e1e94319.js → index-7d558dd3.js} +2 -2
- package/build/{index-e1e94319.js.map → index-7d558dd3.js.map} +1 -1
- package/build/{index-d6e5d160.js → index-8ced00dc.js} +2 -2
- package/build/{index-d6e5d160.js.map → index-8ced00dc.js.map} +1 -1
- package/build/{index-22beab5e.js → index-bc92ff85.js} +2 -2
- package/build/{index-22beab5e.js.map → index-bc92ff85.js.map} +1 -1
- package/build/{index-9ab35cbd.js → index-fdf894ed.js} +2 -2
- package/build/{index-9ab35cbd.js.map → index-fdf894ed.js.map} +1 -1
- package/build/index.js +1 -1
- package/build/{index.styled-b3f123fe.js → index.styled-22a0a8fe.js} +2 -2
- package/build/{index.styled-b3f123fe.js.map → index.styled-22a0a8fe.js.map} +1 -1
- package/build/navigation.js +1 -1
- package/build/together.js +1 -1
- package/build/{types-c01e247a.js → types-6d50fb9d.js} +2 -2
- package/build/{types-c01e247a.js.map → types-6d50fb9d.js.map} +1 -1
- package/build/{types-fc46d076.js → types-effeb886.js} +2 -2
- package/build/{types-fc46d076.js.map → types-effeb886.js.map} +1 -1
- package/build/useTranslations-00e7c0dc.js +2 -0
- package/build/{useTranslations-423301d0.js.map → useTranslations-00e7c0dc.js.map} +1 -1
- package/package.json +4 -1
- package/build/esm/useTranslations-3c1ac581.js +0 -2
- package/build/useTranslations-423301d0.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-c01e247a.js","sources":["../src/together/components/atoms/cardLink/index.tsx","../src/together/components/atoms/tagTopic/index.tsx","../src/hooks/useDragScroll.ts","../src/together/components/atoms/labelSortPin/labelPin.tsx","../src/together/utils/notification.ts","../src/together/utils/apiActions/post.ts","../src/hooks/useImagesPicker.ts","../src/together/components/molecules/createPostDescription/index.tsx","../src/together/components/molecules/createPostTitle/index.tsx","../src/together/components/molecules/topicSelectList/index.tsx","../src/together/components/molecules/popupDanger/index.tsx","../src/together/utils/apiActions/comment.tsx","../src/together/components/molecules/inputCommentBar/index.tsx","../src/together/components/molecules/submitReportForm/index.tsx","../src/together/components/molecules/postContent/index.tsx","../src/together/components/molecules/postImagePreview/imagePreviewPopup.tsx","../src/together/components/molecules/postImagePreview/postSingleImageViewPopup/index.tsx","../src/together/components/molecules/postImagePreview/index.tsx","../src/together/components/molecules/socialLinkPreview/index.tsx","../src/together/components/organisms/cardReply/cardReplyPopover.tsx","../src/together/components/organisms/cardReply/index.tsx","../src/together/components/organisms/cardPost/cardPostPopover.tsx","../src/together/components/organisms/cardPost/index.tsx","../src/together/components/molecules/createNewPostContent/index.tsx"],"sourcesContent":["import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Heading } from 'components/atoms/heading'\nimport { Text } from 'components/atoms/text'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { StyledCardLink } from './index.styled'\n\nexport type Props = {\n title?: string\n url: string\n image?: string\n logo?: string\n className?: string\n noRefetch?: boolean\n style?: CSSProperties\n}\n\nconst CardLink = ({\n title,\n url,\n image,\n logo,\n className,\n style,\n noRefetch,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const [hideLogo, setHideLogo] = useState(false)\n\n const noRefetchRef = useRef(noRefetch)\n noRefetchRef.current = noRefetch\n const [previewData, setPreviewData] = useState<{\n title?: string\n url?: string\n image?: string\n isFetching?: boolean\n logo?: string\n } | null>(null)\n useEffect(() => {\n ;(async () => {\n if (noRefetchRef.current) return\n if (!url) return setPreviewData(null)\n setPreviewData((_data) => ({\n ..._data,\n isFetching: true,\n }))\n callApi(\n getApiPath(PATHS.FETCH_PREVIEW, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n link: url,\n },\n },\n )\n .then((res) => {\n setHideLogo(false)\n setPreviewData({\n title: res?.data?.title,\n url,\n image: res?.data?.image || res?.data?.logo,\n // logo: meta.logo,\n })\n })\n .catch(() => {\n setPreviewData(null)\n })\n })()\n }, [url])\n\n const displayImage = previewData?.image || image\n const displayTitle = previewData?.title || title\n const displayLogo = previewData?.logo || logo\n const displayUrl = previewData?.url || url\n const urlParts = displayUrl\n .replace('http://', '')\n .replace('https://', '')\n .split(/[/?#]/)\n const domain = urlParts[0]\n const showDefaultRef = useRef(false)\n return (\n <StyledCardLink\n data-is-marrybaby={isMarryBaby}\n className={`${className} no-replace-click`}\n style={style}\n >\n <a href={displayUrl} target=\"_blank\" rel=\"noreferrer\">\n {displayImage && (\n <div className=\"link-image-wrapper\">\n {!isMarryBaby && (\n <img\n className=\"link-image-blur\"\n src={displayImage}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n )}\n <img\n className=\"link-image\"\n src={displayImage}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n </div>\n )}\n <div className=\"link-info-container\">\n <Text size=\"n1\">\n {isMarryBaby && displayLogo && !hideLogo && (\n <img\n className=\"link-logo\"\n src={displayLogo}\n onError={(e) => setHideLogo(true)}\n />\n )}\n {domain}\n </Text>\n <Heading tag=\"h6\">{displayTitle}</Heading>\n </div>\n </a>\n </StyledCardLink>\n )\n}\n\nexport { CardLink }\n","import React, { CSSProperties, useContext } from 'react'\n\nimport { Text } from 'components/atoms/text'\nimport { useDragScroll } from 'hooks/useDragScroll'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { Topic } from '../../../interfaces/types'\nimport { StyledTagTopic } from './index.styled'\n\nexport type Props = {\n onClick?: () => void\n className?: string\n style?: CSSProperties\n topics: Topic[]\n}\n\nconst TagTopic = ({ topics, onClick, className, style }: Props) => {\n const { sliding, mouseDownHandler, sliderRef: slider } = useDragScroll()\n const {\n data: {\n env: { togetherBasePath },\n },\n action: { sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n\n return (\n <StyledTagTopic\n ref={slider}\n onClick={onClick}\n onMouseDown={(e: React.MouseEvent<HTMLDivElement>) => mouseDownHandler(e)}\n className={`${className} ${sliding ? 'sliding' : ''}`}\n style={style}\n >\n {topics.map((topic, index) => (\n <a\n className=\"tag-link-item\"\n key={index}\n href={\n topic.isActive && !topic.isHidden\n ? `${togetherBasePath}${topic.url}`\n : undefined\n }\n >\n <Text size=\"p3\">\n <span\n dangerouslySetInnerHTML={{\n __html: sanitizeFunction?.(topic.name) || topic.name,\n }}\n ></span>\n </Text>\n </a>\n ))}\n </StyledTagTopic>\n )\n}\n\nexport { TagTopic }\n","import { useState, useRef } from 'react'\n\nexport const useDragScroll = () => {\n const [sliding, setSliding] = useState(false)\n const slider = useRef<HTMLDivElement>(null)\n const pos = useRef<{\n left: number\n x: number\n } | null>(null)\n const timeoutRef = useRef<NodeJS.Timeout>()\n\n const mouseDownHandler = function (e: React.MouseEvent<HTMLDivElement>) {\n // Change the cursor and prevent user from selecting the text\n if (slider.current) {\n timeoutRef.current = setTimeout(() => {\n setSliding(true)\n }, 500)\n pos.current = {\n left: slider.current.scrollLeft,\n x: e.clientX,\n }\n\n const mouseMoveHandler = function (e: MouseEvent) {\n // How far the mouse has been moved\n const currentPos = pos.current\n if (currentPos) {\n const dx = e.clientX - currentPos.x\n // const dy = e.clientY - pos.y;\n\n // Scroll the element\n // ele.scrollTop = pos.top - dy;\n if (slider.current) slider.current.scrollLeft = currentPos.left - dx\n }\n }\n const mouseUpHandler = function () {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = undefined\n }\n setSliding(false)\n document.removeEventListener('mousemove', mouseMoveHandler)\n document.removeEventListener('mouseup', mouseUpHandler)\n }\n document.addEventListener('mousemove', mouseMoveHandler)\n document.addEventListener('mouseup', mouseUpHandler)\n }\n }\n\n return {\n sliding,\n mouseDownHandler,\n sliderRef: slider,\n pos,\n }\n}\n","import React, { CSSProperties, useContext } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport MBPinOrange from '../../../assets/marrybaby/svg/pinOrange.svg'\nimport IconPinYellow from '../../../assets/svg/icon-pin-yellow.svg'\nimport { LabelSortPin } from './index'\n\nexport type Props = {\n onClick?: () => void\n color?: 'gray' | 'white'\n className?: string\n style?: CSSProperties\n}\n\nconst LabelPin = ({ onClick, color, className, style }: Props) => {\n const {\n data: {\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n return (\n <LabelSortPin\n label={\n <>\n {isMarryBaby && (\n <img className=\"label-sort-pin-icon\" src={MBPinOrange} />\n )}{' '}\n {t('label.pinnedPost')}\n </>\n }\n rightLabel={\n !isMarryBaby && (\n <img className=\"label-sort-pin-icon\" src={IconPinYellow} />\n )\n }\n onClick={onClick}\n color={'white' || color}\n className={`label-pinned ${className}`}\n style={style}\n />\n )\n}\n\nexport { LabelPin }\n","import { PushNotificationPayloadType } from 'together/togetherComponentGlobalContext'\n\ntype TranslateFunction = (\n k: string,\n option?: {\n [key: string]: any\n },\n) => any\n\nexport const getDefaultSuccessNoti = (t: TranslateFunction) =>\n ({\n message: t('notification.success'),\n type: 'success',\n } as PushNotificationPayloadType)\n\nexport const getDefaultFailNoti = (t: TranslateFunction) =>\n ({\n message: t('notification.failure'),\n type: 'danger',\n } as PushNotificationPayloadType)\n","import { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../api/utils'\nimport {\n encodePostContent,\n getMentionIdsFromString,\n removeBannedWordWrapper,\n uploadAndGetSrc,\n} from '../post'\n\nexport const likeUnlikePost = async ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n}) => {\n if (!id) return\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.LIKE, {\n id,\n _locale: locale,\n }),\n 'GET',\n )\n return res\n}\n\nexport const deletePost = async ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n}) => {\n if (!id) return\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.DELETE, {\n id,\n _locale: locale,\n }),\n 'DELETE',\n )\n return res\n}\n\nexport const getPostFormData = async ({\n title,\n description,\n communityId,\n imageFiles,\n previewUrl,\n topicIds,\n locale,\n sanitizeFunction,\n categoryCommunityId,\n categoryTopicIds,\n\n // admin only\n introUrl,\n bannerUrl,\n scheduleTime,\n}: {\n title: string\n description: string\n communityId?: string\n categoryCommunityId?: string\n imageFiles?: (string | File)[]\n previewUrl?: {\n title?: string\n description?: string\n url?: string\n image?: string\n }\n topicIds?: string[]\n categoryTopicIds?: string[]\n locale: string\n sanitizeFunction?: (h: string) => string\n // admin only\n introUrl?: string\n bannerUrl?: string | File\n scheduleTime?: string\n}) => {\n const bodyFormData = new FormData()\n const submitDescription = removeBannedWordWrapper(description)\n const submitTitle = removeBannedWordWrapper(title)\n const mentionIds = getMentionIdsFromString(submitDescription)\n\n bodyFormData.append('title', submitTitle)\n bodyFormData.append(\n 'description',\n encodePostContent(submitDescription, sanitizeFunction),\n )\n if (categoryCommunityId) {\n bodyFormData.append('category_community', String(categoryCommunityId))\n } else if (communityId) {\n bodyFormData.append('community_id', String(communityId))\n }\n\n previewUrl?.title && bodyFormData.append('preview_title', previewUrl.title)\n previewUrl?.description &&\n bodyFormData.append('preview_description', previewUrl.description)\n previewUrl?.url && bodyFormData.append('preview_link', previewUrl.url)\n previewUrl?.image && bodyFormData.append('preview_image', previewUrl.image)\n\n topicIds?.forEach((topicId) => {\n bodyFormData.append('topics[]', String(topicId || ''))\n })\n categoryTopicIds?.forEach((topicId) => {\n bodyFormData.append('category_topics[]', String(topicId || ''))\n })\n if (!!imageFiles?.length) {\n const imageSrcs = await Promise.all(\n imageFiles.map(\n (file, index) =>\n new Promise<string>((resolve) => {\n setTimeout(() => {\n resolve(uploadAndGetSrc(file, locale))\n }, index * 2000)\n }),\n ),\n )\n imageSrcs\n ?.filter(Boolean)\n .slice(0, MAX_IMAGE_UPLOADS)\n .forEach((imageFile, index) => {\n bodyFormData.append(`images[${index}]`, imageFile)\n })\n } else {\n bodyFormData.append(`images`, '')\n }\n mentionIds?.forEach((mentionId) => {\n bodyFormData.append(`mention_ids[]`, mentionId)\n })\n\n // Admin only\n bodyFormData.append('intro_url', introUrl || '')\n bodyFormData.append('banner', bannerUrl || '')\n if (scheduleTime) {\n bodyFormData.append('post_type', 'scheduled')\n bodyFormData.append('schedule_datetime', scheduleTime)\n }\n return bodyFormData\n}\n\nexport const createPost = async ({\n locale,\n formData,\n isArticleComment,\n}: {\n locale: string\n formData: FormData\n isArticleComment?: boolean\n}) => {\n const res = await callApiWithAuth(\n getApiPath(\n isArticleComment ? PATHS.POST.CREATE_ARTICLE_COMMENT : PATHS.POST.CREATE,\n {\n _locale: locale,\n },\n ),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n return res\n}\n\nexport const editPost = async ({\n id,\n locale,\n formData,\n}: {\n id: number | string\n locale: string\n formData: FormData\n}) => {\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.UPDATE, {\n id,\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n },\n )\n return res\n}\n\nexport const followUnfollowPost = ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n followValue?: boolean\n}) => {\n return callApiWithAuth(\n getApiPath(PATHS.POST.FOLLOW, {\n id,\n _locale: locale,\n }),\n 'GET',\n )\n}\n\nexport const reportPost = ({\n id,\n reason,\n locale,\n}: {\n id: number | string\n reason: string\n locale: string\n}) => {\n const formData = new FormData()\n formData.append('reason', reason)\n return callApiWithAuth(\n getApiPath(PATHS.POST.REPORT, {\n _locale: locale,\n id,\n }),\n 'POST',\n {\n data: formData,\n },\n )\n}\n","import { ChangeEvent, useMemo, useState } from 'react'\nexport const useImagePicker = (\n imageFilesProp?: (File | string)[],\n onImageFilesChange?: (f: (File | string)[]) => void,\n) => {\n const [imageFiles, setImageFiles] = useState<(File | string)[]>(\n imageFilesProp || [],\n )\n const imageSrcs = useMemo(\n () =>\n (imageFilesProp || imageFiles).map((file) =>\n typeof file === 'string' ? file : URL.createObjectURL(file),\n ),\n [imageFilesProp, imageFiles],\n )\n const onSelectImages = (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files) {\n if (onImageFilesChange && imageFilesProp) {\n const _files = imageFilesProp || imageFiles\n onImageFilesChange(_files.concat(Array.from(files)))\n } else\n setImageFiles((imgs) => {\n const _imgs = imageFilesProp || imgs\n onImageFilesChange &&\n onImageFilesChange(_imgs.concat(Array.from(files)))\n return _imgs.concat(Array.from(files))\n })\n }\n }\n const onRemoveImage = (index: number) => {\n if (onImageFilesChange && imageFilesProp) {\n const _files = imageFilesProp\n _files.splice(index, 1)\n onImageFilesChange(_files.slice())\n } else {\n setImageFiles((imgs) => {\n const _imgs = imageFilesProp || imgs\n _imgs.splice(index, 1)\n onImageFilesChange && onImageFilesChange(_imgs.slice())\n return _imgs.slice()\n })\n }\n }\n const onRemoveAllImages = () => {\n onImageFilesChange ? onImageFilesChange([]) : setImageFiles([])\n }\n\n return {\n onSelectImages,\n onRemoveImage,\n onRemoveAllImages,\n imageSrcs,\n imageFiles: imageFilesProp || imageFiles,\n }\n}\n","import React, { CSSProperties, useEffect, useRef, useState } from 'react'\n\nimport { Text } from 'components/atoms'\nimport { useImagePicker } from 'hooks/useImagesPicker'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { theme } from 'misc/theme'\nimport { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport IconAlertCircleWarning from '../../../assets/svg/icon-alert-circle-warning.svg'\nimport IconCloseCircle from '../../../assets/svg/icon-close-circle.svg'\nimport { CardLink } from '../../atoms/cardLink'\nimport { Loading } from '../../atoms/loading'\nimport { RichTextEditor } from './editor'\nimport { StyledCreatePostDescription } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n bannedWords?: string[]\n value?: string\n onChange?: (v: string) => void\n onPreviewUrlChange?: (\n v: {\n title: string\n url: string\n image: string\n description: string\n } | null,\n ) => void\n onInvalidUrlsChange?: (v: string[]) => void\n imageFiles?: (File | string)[]\n onImageFilesChange?: (v: (File | string)[]) => void\n isReplying?: boolean\n}\n\nexport const CreatePostDescription = ({\n className,\n style,\n bannedWords = [],\n value,\n onChange,\n onPreviewUrlChange,\n onInvalidUrlsChange,\n onImageFilesChange,\n imageFiles: imageFilesProp,\n isReplying,\n}: Props) => {\n const { t } = useTranslations()\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n rawUrl?: string\n description?: string\n isFetching?: boolean\n } | null>(null)\n const imagePicker = useRef<HTMLInputElement>(null)\n\n const {\n onSelectImages,\n onRemoveImage,\n imageSrcs,\n // imageFiles,\n } = useImagePicker(imageFilesProp, onImageFilesChange)\n\n useEffect(() => {\n if (onPreviewUrlChange) {\n if (previewUrl?.url)\n onPreviewUrlChange({\n title: previewUrl.title || '',\n url: previewUrl.url || '',\n image: previewUrl.image || '',\n description: previewUrl.description || '',\n })\n else onPreviewUrlChange(null)\n }\n }, [previewUrl])\n\n return (\n <StyledCreatePostDescription className={className} style={style}>\n <Text size=\"p4\" className=\"description-label\">\n {t('createPost.popup.description')}\n </Text>\n <div className={`textarea-control`}>\n <div className=\"textarea-wrapper\">\n <RichTextEditor\n html={value || ''} // innerHTML of the editable div\n onChange={onChange}\n bannedWords={bannedWords}\n onImagePickerClick={() => imagePicker.current?.click()}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={onInvalidUrlsChange}\n isReplying={isReplying}\n />\n </div>\n {/* <div className=\"control-tool\">\n <div\n className=\"tool-button\"\n color=\"transparent\"\n onClick={() => imagePicker.current?.click()}\n >\n <img className=\"image-icon\" src=\"./svg/icon-image-input.svg\" />\n </div>\n </div> */}\n </div>\n <Text size=\"p4\" className=\"count-string\">\n {t('character')}: {innertext(value || '').length}\n </Text>\n {(!imageSrcs || imageSrcs.length === 0) && previewUrl && (\n <div className=\"link-preview-wrapper\">\n {previewUrl.isFetching ? (\n <Loading />\n ) : (\n <>\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url || '#'}\n image={previewUrl.image}\n noRefetch\n />\n <img\n src={IconCloseCircle}\n className=\"icon-close\"\n onClick={() => setPreviewUrl(null)}\n />\n </>\n )}\n </div>\n )}\n <input\n ref={imagePicker}\n type=\"file\"\n accept=\"image/png, image/gif, image/jpeg\"\n multiple={true}\n style={{ display: 'none' }}\n onChange={onSelectImages}\n />\n {imageSrcs.length > MAX_IMAGE_UPLOADS ? (\n <div className=\"input-notification\">\n <img src={IconAlertCircleWarning} />\n <Text size=\"p4\" color={theme.colors.alertWarning}>\n {t(`createPost.popup.warningImage`)}\n </Text>\n </div>\n ) : null}\n {imageSrcs.length > 0 && (\n <div className=\"image-gallery\">\n {imageSrcs.map((src, i) => (\n <div key={i} className=\"image-item\">\n <img src={src} />\n <img\n className=\"close-btn\"\n src={IconCloseCircle}\n onClick={() => onRemoveImage(i)}\n />\n </div>\n ))}\n </div>\n )}\n </StyledCreatePostDescription>\n )\n}\n","import React, {\n CSSProperties,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Input } from 'components/atoms/input'\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport debounce from 'lodash/debounce'\nimport ContentEditable from 'react-contenteditable'\n\nimport { highlightBadWords } from '../../../utils/post'\nimport { StyledCreatePostTitle } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n bannedWords?: string[]\n value?: string\n onChange?: (v: string) => void\n}\n\nconst TITLE_LIMIT = 120\n\nconst inputModify = (\n value: string,\n opts?: { limit?: number; bannedWords?: string[] },\n) => {\n if (!opts) return value\n const { limit, bannedWords = [] } = opts\n const shorten =\n typeof limit === 'number' && limit >= 0 ? value.substring(0, limit) : value\n const processedValue = highlightBadWords(shorten, bannedWords)\n return processedValue\n}\nexport const CreatePostTitle = ({\n className,\n style,\n bannedWords = [],\n value,\n onChange,\n}: Props) => {\n const { t } = useTranslations()\n const [titleValue, setTitleValue] = useState('')\n const titleRef = useRef<HTMLElement>(null)\n\n useEffect(() => {\n if (titleRef.current) {\n const pasteHandler = (e: ClipboardEvent) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text/plain')\n document.execCommand('insertHTML', false, text)\n }\n const contentDiv = titleRef.current\n contentDiv.addEventListener('paste', pasteHandler)\n return () => contentDiv.removeEventListener('paste', pasteHandler)\n }\n }, [titleRef])\n const bannedString = bannedWords?.join(',') || ''\n\n useEffect(() => {\n if (bannedString) {\n const titleText = titleRef.current?.innerText\n if (titleText) {\n const titleValueWithBanned = highlightBadWords(titleText, bannedWords)\n if (titleValueWithBanned !== titleText) {\n onChange && onChange(titleValueWithBanned)\n setTitleValue(titleValueWithBanned)\n }\n }\n }\n }, [bannedString])\n\n const debounceInputModify = useCallback(\n debounce((v: string) => {\n if (titleRef.current) {\n const shortenString = inputModify(titleRef.current.innerText, {\n limit: TITLE_LIMIT,\n bannedWords,\n })\n onChange && onChange(shortenString)\n setTitleValue(shortenString)\n }\n }, 300),\n [],\n )\n\n useEffect(() => {\n setTimeout(() => {\n titleRef.current?.focus()\n }, 500)\n }, [])\n\n return (\n <StyledCreatePostTitle className={className} style={style}>\n <Input\n name=\"title\"\n value={value || titleValue}\n size=\"md\"\n label={t('createPost.title')}\n CustomInput={\n <ContentEditable\n innerRef={titleRef}\n html={value || titleValue} // innerHTML of the editable div\n onChange={(evt) => {\n if (\n titleRef.current &&\n titleRef.current.innerText !== (value || titleValue)\n ) {\n const initialValue = inputModify(titleRef.current.innerText, {\n bannedWords,\n })\n onChange && onChange(initialValue)\n setTitleValue(initialValue)\n debounceInputModify(titleRef.current.innerText)\n }\n }} // handle innerHTML change\n className=\"title-input\"\n />\n }\n />\n <Text size=\"p4\" className=\"count-string\">\n {t('createPost.popup.wordCount', {\n count: titleRef.current?.innerText.length || 0,\n max: TITLE_LIMIT,\n })}\n </Text>\n </StyledCreatePostTitle>\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { formatTopic } from '../../../api/dataTransform'\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { Topic, TopicApi } from '../../../interfaces/types'\nimport { Loading } from '../../atoms/loading'\nimport { StyledTopicSelectList } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n communityId?: number\n isLoading?: boolean\n topics?: Topic[]\n forceTopics?: Topic[]\n selectedTopics?: Topic[]\n disabled?: boolean\n onChange?: (v: Topic[]) => void\n noFetch?: boolean\n}\nexport const TopicSelectList = ({\n className,\n style,\n topics: topicsProp,\n communityId,\n onChange,\n isLoading,\n disabled,\n forceTopics,\n selectedTopics: selectedTopicsProp,\n noFetch,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const [topics, setTopics] = useState<Topic[]>(\n topicsProp ? [...topicsProp] : [],\n )\n const [selectedTopics, setSelectedTopics] = useState<Topic[]>(\n selectedTopicsProp ? [...selectedTopicsProp] : [],\n )\n const [isLoadingTopics, setIsLoadingTopics] = useState<boolean>(false)\n const topicsPropRef = useRef(topicsProp)\n topicsPropRef.current = topicsProp\n useEffect(() => {\n if (communityId && !noFetch && !topicsPropRef.current?.length) {\n setTopics([])\n setIsLoadingTopics(true)\n ;(async () => {\n try {\n const res = await callApi(\n getApiPath(PATHS.TOPIC.LIST, {\n communityId: communityId,\n _locale: locale,\n }),\n 'GET',\n )\n\n const topicRes: TopicApi[] | undefined = res?.data?.topics\n if (Array.isArray(topicRes)) {\n setTopics(\n () =>\n topicRes\n ?.map<Topic>(formatTopic)\n .sort(\n (t1: Topic, t2: Topic) => (t1.order || 0) - (t2.order || 0),\n ) || [],\n )\n }\n } catch (e) {\n console.log(e)\n setIsLoadingTopics(false)\n }\n setIsLoadingTopics(false)\n })()\n }\n }, [communityId, noFetch])\n const topicsPropString = topicsProp?.map((t) => t.id).join('-')\n const topicsStateString = topics?.map((t) => t.id).join('-')\n const forceTopicsPropString = forceTopics?.map((t) => t.id).join('-')\n useEffect(() => {\n if (\n topicsProp &&\n typeof topicsPropString !== 'undefined' &&\n topicsPropString !== topicsStateString\n ) {\n setTopics(topicsProp)\n }\n }, [topicsProp, topicsPropString, topicsStateString])\n const topicsWithoutForced = useMemo(\n () =>\n topics.filter(\n (t) =>\n !forceTopics?.some(\n (ft) =>\n (ft.id && ft.id === t.id) ||\n (ft.mappedCategoryId &&\n ft.mappedCategoryId === t.mappedCategoryId),\n ),\n ),\n [topicsStateString, forceTopicsPropString],\n )\n return (\n <StyledTopicSelectList\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n >\n {forceTopics.map((topic) => (\n <TopicItem\n key={`${topic.id}-${topic.mappedCategoryId}`}\n topic={topic}\n disabled\n selected\n ></TopicItem>\n ))}\n {topicsWithoutForced.map((topic) => (\n <TopicItem\n key={`${topic.id}-${topic.mappedCategoryId}`}\n topic={topic}\n disabled={disabled}\n selected={(selectedTopicsProp || selectedTopics).some(\n (t) =>\n (t.id && t.id === topic.id) ||\n (t.mappedCategoryId &&\n t.mappedCategoryId === topic.mappedCategoryId),\n )}\n onClick={() => {\n const _selected = selectedTopicsProp || selectedTopics\n const foundIndex = _selected.findIndex(\n (_selected) =>\n (_selected.id && _selected.id === topic.id) ||\n (_selected.mappedCategoryId &&\n _selected.mappedCategoryId === topic.mappedCategoryId),\n )\n if (foundIndex !== -1) {\n _selected.splice(foundIndex, 1)\n } else {\n _selected.push(topic)\n }\n if (onChange && selectedTopicsProp) {\n onChange(_selected.slice())\n } else {\n onChange && onChange(_selected.slice())\n setSelectedTopics(_selected.slice())\n }\n }}\n ></TopicItem>\n ))}\n {(isLoading || isLoadingTopics) && <Loading className=\"topic-spinner\" />}\n </StyledTopicSelectList>\n )\n}\n\nconst TopicItem = ({\n topic,\n disabled,\n selected,\n onClick,\n}: {\n topic: Topic\n disabled?: boolean\n selected?: boolean\n onClick?: () => void\n}) => (\n <div\n className={'tag-item' + (selected ? ' --active' : '')}\n data-disabled={disabled}\n onClick={!disabled ? onClick : undefined}\n >\n {topic.name}\n </div>\n)\n","import React, { CSSProperties, useContext, useEffect, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Heading } from 'components/atoms/heading'\nimport { Text } from 'components/atoms/text'\nimport { toggleNoScroll } from 'misc/utils'\nimport * as ReactDOM from 'react-dom'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PopupFrame } from '../popupFrame/index'\nimport { StyledPopupDanger } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n isMarryBaby?: boolean\n title?: string\n description?: string\n acceptText?: string\n cancelText?: string\n onAccept?: () => void\n thumbnail?: string\n isThumbnailIcon?: boolean\n onClose?: () => void\n}\n\nexport const PopupDanger = ({\n className,\n isMarryBaby: isMarryBabyProp,\n style,\n title,\n description,\n acceptText,\n cancelText,\n onAccept,\n thumbnail,\n isThumbnailIcon,\n onClose,\n}: Props) => {\n const {\n data: {\n env: { isMarryBaby: isMarryBabyContext },\n },\n } = useContext(TogetherComponentGlobalContext)\n const isMarryBaby =\n typeof isMarryBabyProp === 'boolean' ? isMarryBabyProp : isMarryBabyContext\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n toggleNoScroll(true)\n setTimeout(() => setIsOpen(true), 0)\n return () => toggleNoScroll(false)\n }, [])\n return ReactDOM.createPortal(\n <StyledPopupDanger\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n data-open={isOpen}\n >\n <PopupFrame className=\"popup-frame\" isOpen={isOpen} onClose={onClose}>\n <div className=\"confirm-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"confirm-content\">\n {thumbnail && (\n <div\n className={`thumbnail-container ${\n isThumbnailIcon ? 'is-icon' : ''\n }`}\n >\n <img className=\"thumbnail\" src={thumbnail} />\n </div>\n )}\n <Heading className=\"title\" tag=\"h2\">\n {title}\n </Heading>\n <Text className=\"desc\" size=\"lg\">\n {description}\n </Text>\n <div className=\"btn-group\">\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n size=\"md\"\n color=\"secondary\"\n onClick={() => {\n onAccept?.()\n onClose?.()\n }}\n >\n {acceptText}\n </Button>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n size=\"md\"\n onClick={onClose}\n >\n {cancelText}\n </Button>\n </div>\n </div>\n </div>\n {isMarryBaby && thumbnail && (\n <div\n className={`thumbnail-container is-mobile ${\n isThumbnailIcon ? 'is-icon' : ''\n }`}\n >\n <img className=\"thumbnail\" src={thumbnail} />\n </div>\n )}\n </PopupFrame>\n </StyledPopupDanger>,\n document.body,\n )\n}\n","import { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../api/utils'\nimport {\n encodePostContent,\n getMentionIdsFromString,\n uploadAndGetSrc,\n} from '../post'\n\nexport const BANNED_STATUS = ['SYSTEM_WITHHELD', 'PREMOD', 'REJECTED']\nexport const BANNED_MESSAGE_INTL_ID: { [key: string]: string } = {\n SYSTEM_WITHHELD: 'notification.comment.systemWithheld',\n PREMOD: 'notification.comment.premod',\n REJECTED: 'notification.comment.rejected',\n}\n\nexport const getCommentFormBody = async ({\n postId,\n message,\n photos,\n link,\n locale,\n sanitizeFunction,\n\n replyingUserId,\n replyingUserName,\n replyingId,\n}: {\n locale: string\n postId: string\n message: string\n photos?: File[]\n link?: string\n sanitizeFunction?: (text: string) => string\n\n replyingId?: string\n replyingUserId?: string\n replyingUserName?: string\n}) => {\n const formData = new FormData()\n let submitText = encodePostContent(\n message.replace(/(\\ )+/g, ' '),\n sanitizeFunction,\n )\n const mentionIds = getMentionIdsFromString(submitText)\n if (photos && photos.length > 0) {\n const imageSrcs = await Promise.all(\n photos?.map((file) => uploadAndGetSrc(file, locale)),\n )\n imageSrcs\n .filter(Boolean)\n .slice(0, MAX_IMAGE_UPLOADS)\n .forEach((photo) => {\n formData.append('images[]', photo)\n })\n }\n if (link) formData.append('link', link)\n mentionIds?.forEach((mentionId) => {\n formData.append(`mention_ids[]`, mentionId)\n })\n formData.append('post_id', postId)\n\n replyingId && formData.append('parent_id', replyingId)\n if (replyingUserId) {\n mentionIds.unshift(replyingUserId)\n submitText = `[mention+id=\"${replyingUserId}\"+name=\"${(\n replyingUserName || ''\n ).replace('\"', \"'\")}\"]${submitText}`\n formData.append('parent_user_id', String(replyingUserId))\n }\n formData.append('content', submitText)\n formData.append('content', submitText)\n\n return formData\n}\n\nexport const submitComment = async (\n formData: FormData,\n locale: string,\n): Promise<any | null> => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.CREATE, {\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n}\n\nexport type CommentBodyData = {\n text: string\n replyingTo?: string\n}\n\nexport const decodeCommentBody = (s: string): CommentBodyData => {\n try {\n const authorRegex = s.match(/\\[@([^\\]]+)\\]/)\n const replyingTo = authorRegex\n ? authorRegex[0].replace('[@', '').replace(']', '')\n : ''\n const text = s.replace(/\\[@([^\\]]+)\\]/, '')\n return {\n text: text.trim(),\n replyingTo,\n }\n } catch (e) {}\n return {\n text: '',\n }\n}\n\nexport const submitReply = async (\n formData: FormData,\n locale: string,\n): Promise<any | null> => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.REPLY, {\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n}\n\nexport const likeUnlikeComment = async ({\n commentId,\n setLike = false,\n locale,\n}: {\n commentId: string\n setLike?: boolean\n locale: string\n}) => {\n return callApiWithAuth(\n getApiPath(setLike ? PATHS.COMMENT.LIKE : PATHS.COMMENT.UNLIKE, {\n _locale: locale,\n id: commentId,\n }),\n 'GET',\n )\n}\n\nexport const deleteComment = ({\n id,\n locale,\n}: {\n id: string\n locale: string\n}) => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.DELETE, {\n _locale: locale,\n id: id,\n }),\n 'DELETE',\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Input } from 'components/atoms/input'\nimport { Text } from 'components/atoms/text'\nimport { useImagePicker } from 'hooks/useImagesPicker'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { formatComment } from '../../../api/dataTransform'\nimport IconCloseCircleLine from '../../../assets/svg/icon-close-circle-line.svg'\nimport IconCloseCircle from '../../../assets/svg/icon-close-circle.svg'\nimport IconEnter from '../../../assets/svg/icon-enter.svg'\nimport IconTabEditPrimary from '../../../assets/svg/icon-tab-edit-primary.svg'\nimport { DEFAULT_AVATAR_IMG } from '../../../interfaces/constants'\nimport { Comment, Post, UserInfo } from '../../../interfaces/types'\nimport {\n getCommentFormBody,\n submitComment,\n submitReply,\n} from '../../../utils/apiActions/comment'\nimport { CardLink } from '../../atoms/cardLink'\nimport { Loading } from '../../atoms/loading'\nimport { UserAvatar } from '../../atoms/userAvatar'\nimport { RichTextEditor } from '../createPostDescription/editor'\nimport { StyledInputCommentBar } from './index.styled'\nimport { MainInputTriggerContext } from './mainInputTriggerContext'\n\nexport type Props = {\n className?: string\n onClose?: () => void\n replyToName?: string\n replyToUrl?: string\n replyingId?: string\n replyingUser?: UserInfo\n replyingUserExpertId?: string\n style?: CSSProperties\n onPostSuccess?: (c: Comment) => void\n isMainCmt?: boolean\n post?: Post\n isReply?: boolean\n isMarryBaby?: boolean\n}\nconst InputCommentBar = ({\n isReply,\n className,\n onClose,\n replyToName,\n style,\n replyingId,\n replyingUser,\n onPostSuccess,\n isMainCmt = false,\n post,\n isMarryBaby: isMarryBabyProp,\n}: Props) => {\n const {\n action: { pushNotifications, sanitizeFunction },\n data: {\n userInfo,\n locale,\n env: { isMarryBaby: isMarryBabyContext },\n },\n } = useContext(TogetherComponentGlobalContext)\n const isMarryBaby =\n typeof isMarryBabyProp === 'boolean' ? isMarryBabyProp : isMarryBabyContext\n const { t } = useTranslations()\n\n const {\n onSelectImages,\n onRemoveImage,\n imageSrcs,\n onRemoveAllImages,\n imageFiles,\n } = useImagePicker()\n const [text, setText] = useState<string>('')\n const { trigger } = useContext(MainInputTriggerContext)\n const [isSubmitLoading, setIsSubmitLoading] = useState<boolean>(false)\n const imagePicker = useRef<HTMLInputElement>(null)\n const contentEditable = useRef<HTMLElement | null>(null)\n const mainInput = useRef<HTMLDivElement>(null)\n\n const [invalidUrls, setInvalidUrls] = useState<string[]>([])\n const [bannedWords, setBannedWords] = useState<string[]>([])\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n rawUrl?: string\n description?: string\n isFetching?: boolean\n } | null>(null)\n\n const onSubmitComment = async () => {\n if (!post?.id || isSubmitLoading) return\n setIsSubmitLoading(true)\n try {\n const handleSuccess = (res: any) => {\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n const newComment = formatComment(res.data)\n if (typeof newComment.images === 'string') {\n newComment.images = JSON.parse(newComment.images)\n }\n onPostSuccess && onPostSuccess(newComment)\n }\n\n const formBody = await getCommentFormBody({\n message: text,\n photos: imageFiles as File[],\n\n postId: String(post.id),\n link: previewUrl?.url,\n sanitizeFunction,\n locale,\n ...(isReply && replyingId\n ? {\n replyingUserId: String(\n replyingUser?.id || post?.author?.id || '',\n ),\n replyingId,\n replyingUserName:\n replyingUser?.name || replyingUser?.username || '',\n }\n : {}),\n })\n\n const res = await (isReply && replyingId\n ? submitReply(formBody, locale)\n : submitComment(formBody, locale))\n\n const resData = res?.data\n if (resData?.id && !res?.messages?.moderation?.type) {\n handleSuccess(res)\n } else {\n if (res?.messages?.moderation?.type === 'banned') {\n pushNotifications({\n title: t('notification.comment.blocked.title'),\n message: t('notification.comment.blocked.message'),\n type: 'danger',\n })\n if (res.messages.moderation.words) {\n setBannedWords(res.messages.moderation.words)\n }\n } else if (res?.messages?.moderation?.type === 'suspect') {\n pushNotifications({\n title: t('notification.comment.suspect.title'),\n message: t('notification.comment.suspect.message'),\n type: 'warning',\n })\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n } else if (\n res?.messages?.find((m: string) => !!m?.includes?.('suspend'))\n ) {\n pushNotifications({\n message: t('notification.suspend.message'),\n type: 'warning',\n })\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n } else {\n pushNotifications({\n title: '',\n message:\n res?.messages?.[0] || t('notification.comment.somethingWrong'),\n type: 'danger',\n })\n }\n }\n } catch (e) {\n pushNotifications({\n title: '',\n message: t('notification.comment.somethingWrong'),\n type: 'danger',\n })\n }\n setIsSubmitLoading(false)\n }\n\n useEffect(() => {\n mainInput.current?.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n })\n setTimeout(() => {\n contentEditable.current?.focus()\n }, 400)\n }, [trigger])\n\n return (\n <StyledInputCommentBar\n data-is-reply={isReply}\n className={className}\n style={style}\n >\n {isReply && (\n <div className=\"reply-to-container\">\n <Text size=\"p4\">\n <span\n dangerouslySetInnerHTML={{\n __html: t('inputComment.replyTo', {\n name: `<span style=\"color: #2D87F3; cursor: pointer\">@${\n replyToName || ''\n }</span>`,\n }),\n }}\n ></span>\n </Text>\n <img\n src={IconCloseCircleLine}\n className=\"icon-close-comment\"\n onClick={() => onClose && onClose()}\n />\n </div>\n )}\n <div className=\"input-container\" ref={mainInput}>\n <UserAvatar\n className={`avatar-wrapper ${isReply ? 'avatar-wrapper-reply' : ''}`}\n avatar={userInfo?.id ? userInfo.avatar : DEFAULT_AVATAR_IMG}\n username={userInfo?.name || userInfo?.username}\n />\n <input\n ref={imagePicker}\n onChange={onSelectImages}\n type=\"file\"\n multiple\n accept=\"image/png,image/jpeg\"\n name=\"images\"\n style={{ display: 'none' }}\n />\n <Input\n // actionIcon={\n // !isPost ? (\n // <label className=\"images-input-label\">\n // <img\n // className=\"icon-images-input\"\n // src=\"./svg/icon-image-input.svg\"\n // />\n // <input\n // onChange={onSelectImages}\n // type=\"file\"\n // multiple\n // accept=\"image/png,image/jpeg\"\n // name=\"images\"\n // style={{ display: 'none' }}\n // />\n // </label>\n // ) : undefined\n // }\n value={text}\n name=\"input\"\n size=\"md\"\n className=\"input-wrapper\"\n displayIcon={<img src={IconTabEditPrimary} />}\n CustomInput={\n <div className=\"as-input\">\n <RichTextEditor\n className=\"textarea\"\n html={text}\n onChange={setText}\n onImagePickerClick={() => imagePicker.current?.click()}\n bannedWords={bannedWords}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={setInvalidUrls}\n setEditorRef={(div) => (contentEditable.current = div)}\n isReplying={isReply}\n />\n </div>\n }\n ></Input>\n\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"send-button\"\n size=\"sm\"\n onClick={onSubmitComment}\n isLoading={isSubmitLoading}\n isDisabled={\n !!invalidUrls?.length ||\n isSubmitLoading ||\n !text ||\n text?.length < 2 ||\n !text.trim()\n }\n >\n <img src={IconEnter} className=\"icon-enter\" />\n </Button>\n </div>\n {!!invalidUrls?.length ? (\n <div className=\"error-text\">{t('notification.limitUrlDomain')}</div>\n ) : null}\n {(!imageSrcs || imageSrcs.length === 0) && previewUrl && (\n <div className=\"link-preview-wrapper\">\n {previewUrl.isFetching ? (\n <Loading />\n ) : (\n <>\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url || '#'}\n image={previewUrl.image}\n noRefetch\n />\n <img\n src={IconCloseCircle}\n className=\"icon-close\"\n onClick={() => setPreviewUrl(null)}\n />\n </>\n )}\n </div>\n )}\n {imageSrcs && imageSrcs.length > 0 && (\n <div className=\"preview-images-container\">\n {imageSrcs.map((src, index) => (\n <div key={index} className=\"image-src-wrapper\">\n <img className=\"preview-image\" src={src} />\n <img\n src={IconCloseCircle}\n className=\"icon-close-circle\"\n onClick={() => onRemoveImage(index)}\n />\n </div>\n ))}\n </div>\n )}\n </StyledInputCommentBar>\n )\n}\n\nexport { InputCommentBar }\n","import React, { useContext, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { theme } from 'misc/theme'\nimport { CSSProperties } from 'styled-components'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport IconAlertCircle from '../../../assets/svg/icon-alert-circle.svg'\nimport { reportPost } from '../../../utils/apiActions/post'\nimport { StyledSubmitReportForm } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n reason: string\n reasonText: string\n postId?: number\n onClose?: () => void\n}\n\nexport const SubmitReportForm = ({\n className,\n style,\n reason,\n reasonText,\n onClose,\n postId,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [loading, setLoading] = useState(false)\n return (\n <StyledSubmitReportForm\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n >\n <ul className=\"report-list\">\n <li className=\"report-item\">\n <img src={IconAlertCircle} />\n <Text className=\"__label\" color={theme.colors.gray800} size=\"p4\">\n {reasonText}\n </Text>\n </li>\n </ul>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"report-submit\"\n size=\"lg\"\n color=\"primary\"\n isLoading={loading}\n onClick={async () => {\n if (!postId || loading) return\n setLoading(true)\n try {\n const res = await reportPost({\n id: postId,\n reason,\n locale,\n })\n if (res?.status === 1) {\n pushNotifications({\n message: 'Post reported',\n type: 'success',\n })\n onClose && onClose()\n }\n } catch {}\n setLoading(false)\n }}\n >\n {t('submit')}\n </Button>\n </StyledSubmitReportForm>\n )\n}\n","import React, { CSSProperties, useContext, useMemo, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { UserInfo } from 'together/interfaces/types'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { decodeMention, decodePostUrl } from '../../../utils/post'\nimport { PopupExpert } from '../popupExpert'\nimport { StyledPostContent } from './index.styled'\n\nexport type Props = {\n description?: string\n replyingTo?: string\n disableShortenContent?: boolean\n className?: string\n style?: CSSProperties\n mentionedUser?: UserInfo\n mentions?: {\n id: number\n name: string\n }[]\n}\n\nexport const PostContent = ({\n className,\n style,\n replyingTo,\n mentionedUser,\n description: rawDescription,\n disableShortenContent,\n mentions = [],\n}: Props) => {\n const [showAll, setShowAll] = useState(false)\n const { t } = useTranslations()\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n const [openPopupExpert, setOpenPopupExpert] = useState(false)\n const description = decodeMention(\n decodePostUrl(rawDescription || '', 'display'),\n mentions,\n )\n const {\n action: { sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n const shortenSanitizedContentData = useMemo(() => {\n const sanitizedContent = sanitizeFunction(description || '')\n if (disableShortenContent || showAll)\n return {\n showContent: sanitizedContent,\n hasSeeMore: false,\n }\n const firstRound = sanitizedContent.slice(0, 200)\n const newLineCompensateLength =\n 200 - ((firstRound.match(/<\\/div>/g) || []).length - 1) * 27\n const shortenFirstRound = (firstRound || '').slice(\n 0,\n newLineCompensateLength < 40 ? 40 : newLineCompensateLength,\n )\n\n // remove < if we cut off right before start of a new html tag\n const secondRound = sanitizeFunction(\n shortenFirstRound.replace(/(<|<\\/)( +|[a-zA-Z]*)$/gi, ''),\n )\n // don't show see more if not much difference\n const hasSeeMore = secondRound.length < sanitizedContent.length - 10\n return {\n showContent: hasSeeMore ? secondRound : sanitizedContent,\n hasSeeMore,\n }\n }, [disableShortenContent, showAll, description])\n\n const replyName = mentionedUser?.name || replyingTo\n const hasExpert =\n mentionedUser?.role === 'expert' && !!mentionedUser?.partnerId\n return (\n <>\n {hasExpert && (\n <PopupExpert\n isOpen={openPopupExpert}\n onClose={() => setOpenPopupExpert(false)}\n expertId={String(mentionedUser?.partnerId)}\n ></PopupExpert>\n )}\n <StyledPostContent\n className={`${className} no-replace-click`}\n style={style}\n >\n {replyName && (\n <span\n onClick={() => hasExpert && setOpenPopupExpert(true)}\n className=\"post-content-replying\"\n >\n @{replyName}\n </span>\n )}\n {rawDescription?.startsWith('[mention+id=') && (\n <span className=\"post-content-replying tag-only\">@</span>\n )}\n <span\n dangerouslySetInnerHTML={{\n __html: shortenSanitizedContentData.showContent,\n }}\n className={`post-content ${\n shortenSanitizedContentData.hasSeeMore ? 'has-see-more' : ''\n }`}\n ></span>\n {shortenSanitizedContentData.hasSeeMore && !showAll && (\n <span>\n {`... `}\n <span\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n authActionWrapper(() => setShowAll(true))\n }}\n className=\"see-more-text\"\n >\n {t('post.seeMore')}\n </span>\n </span>\n )}\n </StyledPostContent>\n </>\n )\n}\n","import React, { CSSProperties, useEffect, useState } from 'react'\n\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport * as ReactDOM from 'react-dom'\n\nimport IconArrowLeft from '../../../assets/svg/icon-arrow-left.svg'\nimport { StyledImagePreviewPopup } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n images: string[]\n authorName: string\n onClose?: () => void\n onOpenSingleView?: (index: number) => void\n}\n\nexport const ImagePreviewPopup = ({\n className,\n style,\n authorName,\n images,\n onClose,\n onOpenSingleView,\n}: Props) => {\n const { t } = useTranslations()\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n setTimeout(() => {\n setIsOpen(true)\n }, 0)\n }, [])\n return ReactDOM.createPortal(\n <StyledImagePreviewPopup\n className={className}\n style={style}\n data-open={isOpen}\n >\n <div className=\"top-bar\">\n <img\n className=\"icon-arrow-left\"\n src={IconArrowLeft}\n onClick={onClose}\n alt=\"go back\"\n ></img>\n <Text\n size=\"p2\"\n type=\"bold\"\n style={{\n textAlign: 'center',\n }}\n >\n {t('previewPhotos.title', {\n name: authorName,\n })}\n </Text>\n </div>\n <div className=\"container\">\n {images.map((image, index) => (\n <img\n className=\"img-preview\"\n key={index}\n src={image}\n onClick={() => onOpenSingleView?.(index)}\n alt=\"post img\"\n />\n ))}\n </div>\n </StyledImagePreviewPopup>,\n document.body,\n )\n}\n","import React, { useEffect, useState } from 'react'\n\nimport * as ReactDOM from 'react-dom'\n\nimport ChevronRightIcon from '../../../../assets/svg/icon-chevron-right-white.svg'\nimport CloseIcon from '../../../../assets/svg/icon-close.svg'\nimport {\n StyledArrowWrapper,\n StyledCircleArrow,\n StyledImagePreviewContainer,\n StyledImagePreviewTopbar,\n StyledImagePreviewWrapper,\n} from './index.styled'\n\nexport type Props = {\n images: string[]\n initialViewIndex: number\n onClose?: () => void\n}\nexport const PostSingleImageViewPopup = ({\n initialViewIndex,\n images,\n onClose,\n}: Props) => {\n const [viewIndex, setViewIndex] = useState(initialViewIndex)\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n setTimeout(() => {\n setIsOpen(true)\n }, 0)\n }, [])\n const previewImg = images?.[viewIndex]\n const leftDisabled = viewIndex === 0\n const rightDisabled = !images?.length || viewIndex === images?.length - 1\n return ReactDOM.createPortal(\n <StyledImagePreviewContainer data-open={isOpen && !!previewImg}>\n <StyledImagePreviewTopbar>\n <img\n src={CloseIcon}\n className=\"icon-close\"\n onClick={onClose}\n alt=\"close\"\n />\n </StyledImagePreviewTopbar>\n {previewImg && viewIndex >= 0 && (\n <>\n <StyledImagePreviewWrapper>\n <img className=\"img-preview\" src={previewImg} alt=\"post img open\" />\n <StyledArrowWrapper\n data-disabled={leftDisabled}\n onClick={() => !leftDisabled && setViewIndex(viewIndex - 1)}\n >\n <StyledCircleArrow>\n <img\n src={ChevronRightIcon}\n style={{\n transform: 'rotate(180deg)',\n }}\n alt=\"left arrow\"\n data-disabled={leftDisabled}\n />\n </StyledCircleArrow>\n </StyledArrowWrapper>\n <StyledArrowWrapper\n data-right\n data-disabled={rightDisabled}\n onClick={() => !rightDisabled && setViewIndex(viewIndex + 1)}\n >\n <StyledCircleArrow>\n <img\n src={ChevronRightIcon}\n alt=\"right arrow\"\n data-disabled={rightDisabled}\n />\n </StyledCircleArrow>\n </StyledArrowWrapper>\n </StyledImagePreviewWrapper>\n </>\n )}\n </StyledImagePreviewContainer>,\n document.body,\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Heading } from 'components/atoms/heading'\nimport { lazyLoadInstance } from 'misc/lazyLoad'\nimport { toggleNoScroll } from 'misc/utils'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { ImagePreviewPopup } from './imagePreviewPopup'\nimport { StyledPostImagePreview } from './index.styled'\nimport { PostSingleImageViewPopup } from './postSingleImageViewPopup'\n\nexport type Props = {\n images?: string[]\n authorName?: string\n className?: string\n style?: CSSProperties\n}\n\nconst PostImagePreview = ({\n className,\n images = [],\n style,\n authorName,\n}: Props) => {\n const {\n data: {\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const moreImageCount = `+ ${(images.length || 0) - 4}`\n const [isOpenImagePreview, setIsOpenImagePreview] = useState(false)\n const [singleImageViewIndex, setSingleImageViewIndex] = useState(-1)\n\n useEffect(() => {\n setTimeout(() => lazyLoadInstance?.update(), 100)\n }, [images?.slice(0, 5).join('|')])\n const hasMore = images.length > 5\n // Check if this component has set no scroll previously and clean it up\n const hasSetNoScroll = useRef(false)\n useEffect(() => {\n return () => {\n if (hasSetNoScroll.current) {\n toggleNoScroll(false)\n }\n }\n }, [])\n useEffect(() => {\n if (isOpenImagePreview || singleImageViewIndex >= 0) {\n toggleNoScroll(true)\n hasSetNoScroll.current = true\n } else {\n toggleNoScroll(false)\n hasSetNoScroll.current = false\n }\n }, [isOpenImagePreview, singleImageViewIndex])\n return (\n <>\n <StyledPostImagePreview\n className={className}\n style={style}\n data-image-count={hasMore ? 5 : images.length || 0}\n data-is-marrybaby={isMarryBaby}\n >\n {images?.slice(0, 5).map((image, index) => (\n <div\n className={`img-wrapper`}\n key={index}\n onClick={() => {\n if (index >= 4 && hasMore) {\n setIsOpenImagePreview(true)\n } else {\n setSingleImageViewIndex(index)\n }\n }}\n >\n {!isMarryBaby && (\n <img className=\"lazy img-preview-blur\" data-src={image} />\n )}\n <img className=\"lazy img-preview\" data-src={image} />\n {index === 4 && hasMore && (\n <div className=\"img-more-overlay\">\n <Heading tag=\"h1\" color=\"white\">\n {moreImageCount}\n </Heading>\n </div>\n )}\n </div>\n ))}\n </StyledPostImagePreview>\n {isOpenImagePreview && (\n <ImagePreviewPopup\n authorName={authorName || ''}\n images={images}\n onClose={() => setIsOpenImagePreview(false)}\n onOpenSingleView={setSingleImageViewIndex}\n />\n )}\n {singleImageViewIndex >= 0 && (\n <PostSingleImageViewPopup\n images={images}\n initialViewIndex={singleImageViewIndex}\n onClose={() => setSingleImageViewIndex(-1)}\n />\n )}\n </>\n )\n}\n\nexport { PostImagePreview }\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { facebookVidIdGetter, youtubeVidIdGetter } from '../../../utils/post'\nimport { Loading } from '../../atoms/loading'\nimport { StyledSocialLinkPreview } from './index.styled'\n\nexport type Props = {\n url: string\n image?: string\n className?: string\n style?: CSSProperties\n}\n\nconst SocialLinkPreview = ({ url, image, className, style }: Props) => {\n const {\n data: { locale },\n } = useContext(TogetherComponentGlobalContext)\n\n const [previewData, setPreviewData] = useState<{\n url?: string\n image?: string\n isFetching?: boolean\n } | null>(null)\n useEffect(() => {\n ;(async () => {\n if (image) return\n if (!url) return setPreviewData(null)\n setPreviewData((_data) => ({\n ..._data,\n isFetching: true,\n }))\n\n // fetch('./api/fetch-meta?url=' + encodeURIComponent(url))\n // .then((res) => res.json())\n // .then((res) =>\n // setPreviewData({\n // url,\n // image: res?.image || res?.logo,\n // }),\n // )\n callApi(\n getApiPath(PATHS.FETCH_PREVIEW, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n link: url,\n },\n },\n )\n .then((res) => {\n setPreviewData({\n url,\n image: res?.data?.image || res?.data?.logo,\n })\n })\n .catch(() => {\n setPreviewData(null)\n })\n })()\n }, [url, image])\n\n const displayImage = previewData?.image || image\n const displayUrl = previewData?.url || url\n\n const youtubeVidId = useMemo(() => {\n return youtubeVidIdGetter(displayUrl)\n }, [displayUrl])\n const facebookVidId = useMemo(() => {\n return facebookVidIdGetter(displayUrl)\n }, [displayUrl])\n const responsiveWidth = useRef(0)\n const responsiveHeight = useRef(0)\n const [forceRerenderFB, setForceRerenderFB] = useState(false)\n\n // FACEBOOK Video is not responsive for desktop browser\n // => hack: set size to same as container, if size change too large, re-render facebook iframe with new config\n useEffect(() => {\n const handleResize = () => {\n const containerRect = containerRef.current?.getBoundingClientRect()\n let toChangeSize = false\n if (\n containerRect &&\n (!responsiveWidth.current ||\n Math.abs(\n (responsiveWidth.current - containerRect.width) /\n containerRect?.width,\n ) > 0.2)\n ) {\n responsiveWidth.current = Math.floor(containerRect.width)\n toChangeSize = true\n }\n if (\n containerRect &&\n (!responsiveHeight.current ||\n Math.abs(\n (responsiveHeight.current - containerRect.height) /\n containerRect?.height,\n ) > 0.2)\n ) {\n responsiveHeight.current = Math.floor(containerRect.height)\n toChangeSize = true\n }\n if (toChangeSize) {\n setForceRerenderFB((v) => !v)\n }\n }\n handleResize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [])\n const containerRef = useRef<HTMLDivElement>(null)\n const showDefaultRef = useRef(false)\n return (\n <StyledSocialLinkPreview\n className={`${className} no-replace-click`}\n style={style}\n ref={containerRef}\n >\n {!image && (youtubeVidId || facebookVidId) ? (\n <div className=\"link-image-wrapper\">\n {youtubeVidId ? (\n <iframe\n width=\"100%\"\n height=\"100%\"\n src={`https://www.youtube.com/embed/${youtubeVidId}?&autoplay=1&mute=1`}\n frameBorder=\"0\"\n allowFullScreen\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n border: 'none',\n overflow: 'hidden',\n }}\n ></iframe>\n ) : facebookVidId ? (\n <iframe\n key={String(forceRerenderFB)}\n src={`https://www.facebook.com/plugins/video.php?href=${encodeURIComponent(\n displayUrl,\n )}&autoplay=1&show_text=false&t=0&width=${\n responsiveWidth.current\n }&height=${responsiveHeight.current}`}\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n border: 'none',\n overflow: 'hidden',\n height: responsiveHeight.current,\n width: responsiveWidth.current,\n transform: 'translate(-50%, -50%)',\n }}\n scrolling=\"no\"\n frameBorder=\"0\"\n allowFullScreen\n allow=\"autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share\"\n ></iframe>\n ) : null}\n </div>\n ) : (\n <a href={displayUrl} target=\"_blank\" rel=\"noreferrer\">\n <div\n className={`link-image-wrapper ${\n previewData?.isFetching ? 'fetching' : ''\n }`}\n >\n {previewData?.isFetching ? (\n <Loading className=\"loading-spinner\" />\n ) : (\n <img\n className=\"link-image\"\n src={displayImage || DEFAULT_IMG}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n )}\n </div>\n </a>\n )}\n </StyledSocialLinkPreview>\n )\n}\n\nexport { SocialLinkPreview }\n","import React, { useContext, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport MBMoreSolid from '../../../assets/marrybaby/svg/moreSolid.svg'\nimport IconDelete from '../../../assets/svg/delete.svg'\nimport IconKebab from '../../../assets/svg/icon-kebab.svg'\nimport IconTrashBin from '../../../assets/svg/icon-trash-bin.svg'\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { deleteComment } from '../../../utils/apiActions/comment'\nimport { PopupDanger } from '../../molecules/popupDanger'\nimport { TreePopoverMenu } from '../popoverMenu/treePopoverMenu'\n\nexport const CardReplyPopover = ({\n onDeleteComment,\n commentId,\n className = '',\n popoverClassName = '',\n}: {\n className?: string\n popoverClassName?: string\n onDeleteComment?: () => void\n commentId: string\n}) => {\n const {\n data: {\n env: { isMarryBaby },\n locale,\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [isOpenLeavePopup, setIsOpenLeavePopup] = useState(false)\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n return (\n <div\n className={className}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n {isOpenLeavePopup && (\n <PopupDanger\n thumbnail={IconDelete}\n isThumbnailIcon={true}\n title={t('popup.deleteComment.title')}\n description={t('popup.deleteComment.description')}\n acceptText={t('popup.deletePost.accept')}\n cancelText={t('popup.deletePost.cancel')}\n onAccept={async () => {\n if (!commentId) return\n const res = await deleteComment({ id: commentId, locale })\n if (res?.status === 1) {\n onDeleteComment && onDeleteComment()\n pushNotifications({\n title: '',\n message: t('notification.success'),\n type: 'success',\n })\n } else {\n pushNotifications({\n title: '',\n message: res?.messages?.[0] || t('notification.failure'),\n type: 'danger',\n })\n }\n }}\n onClose={() => setIsOpenLeavePopup(false)}\n />\n )}\n <TreePopoverMenu\n position=\"bottom\"\n align=\"end\"\n data={{\n isShowheader: false,\n type: 'list',\n list: [\n // {\n // icon: _href('/svg/icon-share-on-media.svg'),\n // label: f({ id: 'morePopover.share' }),\n // subTree: {\n // title: f({ id: 'morePopover.shareOn' }),\n // isShowheader: true,\n // type: 'jsx',\n // jsxType: TreeJSXType.share,\n // data: {\n // shareUrl: shareUrl,\n // shareTitle: shareTitle,\n // },\n // },\n // },\n // {\n // icon: _href('/svg/icon-tab-edit-2.svg'),\n // label: f({ id: 'actionPopover.edit' }),\n // onClick: onEditPost,\n // },\n {\n icon: IconTrashBin,\n label: t('actionPopover.delete'),\n onClick: () => {\n authActionWrapper(() => {\n setIsOpenLeavePopup(true)\n })\n },\n },\n ],\n }}\n className={popoverClassName}\n toggleButtonContent={\n <img src={isMarryBaby ? MBMoreSolid : IconKebab} />\n }\n buttonProps={\n {\n // isLoading: loading,\n }\n }\n />\n </div>\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Divider } from 'components/atoms/divider'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { domainLocales } from 'src/interfaces/constants'\nimport { CARE_PATHS } from 'src/together/api/paths'\nimport { callApi, getCarePath } from 'src/together/api/utils'\nimport {\n decodeCommentBody,\n likeUnlikeComment,\n} from 'together/utils/apiActions/comment'\n\nimport ChevronRightActive from '../../../assets/svg/chevronRightActive.svg'\nimport {\n TogetherAuthConfigContextProvider,\n useTogetherAuthRequiredAction,\n} from '../../../hooks/useTogetherAuthRequiredAction'\nimport { Comment, DoctorInfo, Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { CardLink } from '../../atoms/cardLink'\nimport { CardReactions } from '../../atoms/cardReactions'\nimport { CardReactionType } from '../../atoms/cardReactions/index'\nimport { CardAuthor } from '../../molecules/cardAuthor'\nimport { InputCommentBar } from '../../molecules/inputCommentBar'\nimport { HospitalInfo } from '../../molecules/popupHospital'\nimport { PostContent } from '../../molecules/postContent'\nimport { PostImagePreview } from '../../molecules/postImagePreview'\nimport { CardReplyPopover } from './cardReplyPopover'\nimport { StyledCardPost } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n type?: 'comment' | 'reply' | 'most-engaging'\n level?: number\n replyingId?: string\n comment: Comment\n onPostCommentSuccess?: (c: Comment) => void\n refetchComment?: (c: Comment) => void\n post?: Post\n onDeleteComment?: () => void\n hasQuickBookingEnable?: boolean\n handleMakeAppointment?: (doctorId?: string, hospitalId?: string) => void\n}\n\nconst COMMENT_LIMIT = 4\n\nconst CardReply = ({\n className,\n style,\n comment: CommentProps,\n type = 'comment',\n level = 0,\n replyingId,\n onPostCommentSuccess,\n post,\n onDeleteComment,\n refetchComment,\n hasQuickBookingEnable,\n handleMakeAppointment,\n}: Props) => {\n const {\n data: {\n locale,\n userInfo,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [comment, setComment] = useState<Comment>(CommentProps || null)\n const {\n id,\n countReplies,\n countLikes,\n content,\n createdAt,\n replies = [],\n images = [],\n author,\n liked,\n link,\n mentionedUser,\n mentions,\n } = comment\n\n const { text, replyingTo } = decodeCommentBody(content)\n const { authActionWrapper } = useTogetherAuthRequiredAction({\n _joinCommunityIds: [post?.community?.id],\n _joinTopicIds: post?.topics?.map((t) => t.id),\n })\n const [maxRepliesShow, setMaxRepliesShow] = useState(COMMENT_LIMIT)\n const isCommented = userInfo?.id\n ? replies?.some((c) => c.author.id === userInfo.id)\n : false\n\n const addNewReply = (comment: Comment) => {\n setComment((old) => {\n old.replies.unshift(comment)\n const newComment = {\n ...old,\n replies: old.replies.slice(),\n countReplies: old.countReplies + 1,\n }\n refetchComment && refetchComment(newComment)\n return newComment\n })\n }\n const [showInputComment, setShowInputComment] = useState(false)\n\n const sortedReplies = useMemo(() => {\n if (type !== 'comment' || !replies || replies.length == 0) return replies\n return replies.sort((a, b) => {\n const timeA = new Date(a.createdAt).getTime()\n const timeB = new Date(b.createdAt).getTime()\n if (timeA > timeB) return -1\n if (timeA < timeB) return 1\n\n return 0\n })\n }, [type, replies])\n\n const mergeCountReplies = replies?.length || 0\n const hasPopover =\n String(author?.email) &&\n userInfo?.email &&\n String(author?.email) === String(userInfo?.email)\n\n const name = author?.name || author?.username || ''\n const avatar = author?.avatar\n const username = author?.username || author?.name || ''\n\n const [hospitalInfo, setHospitalInfo] = useState<HospitalInfo | null>(null)\n const [doctorInfo, setDoctorInfo] = useState<DoctorInfo | null>(null)\n\n useEffect(() => {\n if (author?.hospitalId) {\n const fetchHospitalDetail = async (hospitalId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_HOSPITAL_INFO, {\n hospital_branch_id: hospitalId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.branch) {\n setHospitalInfo(response?._data.branch)\n }\n }\n fetchHospitalDetail(author.hospitalId)\n }\n if (author?.doctorId) {\n const fetchDoctorDetail = async (doctorId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_DOCTOR_INFO, {\n doctorId: doctorId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.doctor) {\n setDoctorInfo(response?._data.doctor)\n }\n }\n fetchDoctorDetail(author.doctorId)\n }\n }, [author.hospitalId, author.doctorId])\n\n const isDoctorAvailable =\n doctorInfo?.valid_outpatient || doctorInfo?.valid_telemedicine\n const isHospitalAvailable =\n (hospitalInfo?.total_available_service ||\n hospitalInfo?.total_available_doctor) > 0\n const hasQuickBooking =\n hasQuickBookingEnable && (isDoctorAvailable || isHospitalAvailable)\n\n return (\n <TogetherAuthConfigContextProvider\n defaultParams={{\n _joinCommunityIds: [post?.community?.id],\n _joinTopicIds: post?.topics?.map((t) => t.id),\n }}\n >\n <StyledCardPost\n className={className}\n style={style}\n data-is-reply={!!level}\n data-is-marrybaby={isMarryBaby}\n data-has-booking={hasQuickBooking}\n >\n {type === 'reply' && <Divider className=\"top-divider\" type=\"solid\" />}\n <CardAuthor\n avatar={avatar}\n name={name}\n username={username}\n email={author?.email}\n time={createdAt}\n // community={community}\n // miniIcon=\"./svg/icon-tag.svg\"\n // authorLabelType={getAuthorLabelFromRoles(author?.role || [])}\n className={`post-author ${hasPopover ? 'with-popover' : ''}`}\n type={type}\n userId={author?.id}\n role={author?.role}\n expertId={author?.partnerId}\n title={author?.title}\n doctorId={author?.doctorId}\n hospitalId={author?.hospitalId}\n hasQuickBooking={hasQuickBooking}\n handleMakeAppointment={handleMakeAppointment}\n />\n <PostContent\n className=\"post-content-wrapper\"\n replyingTo={replyingTo}\n mentionedUser={mentionedUser}\n description={text}\n mentions={mentions}\n />\n <span></span>\n <span></span>\n {images && images.length > 0 ? (\n <div\n key=\"image-preview\"\n className=\"image-preview-wrapper\"\n data-is-reply={true}\n >\n <PostImagePreview images={images} authorName={author?.username} />\n </div>\n ) : null}\n {(!images || images.length === 0) && link ? (\n <div\n key=\"link-preview\"\n className=\"link-preview-wrapper\"\n data-is-reply={true}\n >\n <CardLink url={link} />\n </div>\n ) : null}\n\n {type !== 'most-engaging' ? (\n <>\n <CardReactions\n type={CardReactionType.reply}\n loveCount={countLikes}\n replyCount={mergeCountReplies}\n className=\"post-reaction\"\n liked={liked}\n isReplied={isCommented}\n hideCommentIcon={type === 'reply'}\n onCommentClick={() =>\n authActionWrapper(() => setShowInputComment((v) => !v))\n }\n onCommentCountClick={() =>\n authActionWrapper(() => {\n setShowInputComment(true)\n })\n }\n onLikeClick={() =>\n authActionWrapper(async () => {\n if (id) {\n const res = await likeUnlikeComment({\n commentId: id,\n setLike: !liked,\n locale,\n })\n if (res.status === 1) {\n setComment((old) => {\n return {\n ...old,\n liked: !liked,\n countLikes: old.countLikes + (!liked ? 1 : -1),\n }\n })\n }\n }\n })\n }\n />\n {showInputComment && (\n <InputCommentBar\n replyingId={replyingId || comment.id}\n replyToName={author.name || author.username || ''}\n isReply\n onClose={() => setShowInputComment(false)}\n onPostSuccess={(comment) => {\n if (type === 'reply') {\n onPostCommentSuccess && onPostCommentSuccess(comment)\n } else {\n addNewReply(comment)\n }\n }}\n post={post}\n replyingUser={author}\n />\n )}\n {type === 'comment' && replies && replies.length > 0 ? (\n <div className=\"comment-reply-wrapper\">\n {sortedReplies?.slice(0, maxRepliesShow)?.map((reply) => (\n <CardReply\n key={reply.id}\n comment={reply}\n type=\"reply\"\n className=\"comment-reply-item\"\n level={level + 1}\n replyingId={id}\n onPostCommentSuccess={addNewReply}\n post={post}\n onDeleteComment={() => {\n setComment((old) => {\n return {\n ...old,\n replies: old.replies.filter((r) => r.id !== reply.id),\n countReplies: old.countReplies - 1,\n }\n })\n }}\n handleMakeAppointment={handleMakeAppointment}\n hasQuickBookingEnable={hasQuickBookingEnable}\n />\n ))}\n {mergeCountReplies > maxRepliesShow && (\n <>\n <Divider className=\"top-divider\" type=\"solid\" />\n <Button\n className=\"more-cmt\"\n size=\"lg\"\n color=\"ghost\"\n onClick={() =>\n setMaxRepliesShow((m) => m + COMMENT_LIMIT)\n }\n >\n {t('comment.seeMoreReplies', {\n count: mergeCountReplies - maxRepliesShow,\n })}\n <img className=\"chevron-right\" src={ChevronRightActive} />\n </Button>\n </>\n )}\n </div>\n ) : null}\n </>\n ) : null}\n\n {hasPopover && (\n <CardReplyPopover\n onDeleteComment={onDeleteComment}\n className=\"popover\"\n commentId={comment.id}\n />\n )}\n </StyledCardPost>\n </TogetherAuthConfigContextProvider>\n )\n}\n\nexport { CardReply }\n","/* eslint-disable react/display-name */\nimport React, { useContext, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TranslationsKey } from 'i18n/translations'\nimport { REPORT_REASON_MAP } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../../api/utils'\nimport MBMoreSolid from '../../../assets/marrybaby/svg/moreSolid.svg'\nimport IconDelete from '../../../assets/svg/delete.svg'\nimport IconAlertCircle from '../../../assets/svg/icon-alert-circle.svg'\nimport IconBookmarkFill from '../../../assets/svg/icon-bookmark-fill.svg'\nimport IconBookmark from '../../../assets/svg/icon-bookmark.svg'\nimport IconKebab from '../../../assets/svg/icon-kebab.svg'\nimport IconShareOnMedia from '../../../assets/svg/icon-share-on-media.svg'\nimport IconTabEdit from '../../../assets/svg/icon-tab-edit-2.svg'\nimport IconTrashBin from '../../../assets/svg/icon-trash-bin.svg'\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { deletePost } from '../../../utils/apiActions/post'\nimport { PopupDanger } from '../../molecules/popupDanger'\nimport { SharePopup } from '../../molecules/popupFrame/popupShare'\nimport { SubmitReportForm } from '../../molecules/submitReportForm/index'\nimport { TreePopoverMenu } from '../popoverMenu/treePopoverMenu'\n\n// import IconBellOff from '../../../assets/svg/icon-bell-off.svg'\n// import IconBellOn from '../../../assets/svg/icon-bell-on.svg'\n\nexport const CardPostPopoverMore = ({\n authorEmail,\n onDeletePost,\n shareUrl,\n post,\n className = '',\n popoverClassName = '',\n onBookmark,\n onRemoveBookmark,\n onEditPost,\n}: {\n className?: string\n popoverClassName?: string\n authorId?: string\n authorEmail?: string\n onDeletePost?: () => void\n shareUrl?: string\n post?: Post\n onBookmark?: () => void\n onRemoveBookmark?: () => void\n onEditPost?: () => void\n}) => {\n const {\n data: {\n locale,\n userInfo,\n togetherUserId,\n env: { isMarryBaby },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n // const [localHasNoti, setLocalHasNoti] = useState(false)\n const [loading, setLoading] = useState(false)\n const [isOpenLeavePopup, setIsOpenLeavePopup] = useState(false)\n const [isOpenSharePopup, setIsOpenSharePopup] = useState(false)\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n const isAuthor =\n authorEmail && userInfo?.email && authorEmail === String(userInfo?.email)\n return (\n <div\n className={className}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n {isOpenSharePopup && (\n <SharePopup\n url={shareUrl}\n text={post?.title}\n onClose={() => setIsOpenSharePopup(false)}\n />\n )}\n {isOpenLeavePopup && (\n <PopupDanger\n thumbnail={'./svg/delete.svg'}\n isThumbnailIcon\n title={t('popup.deletePost.title')}\n description={t('popup.deletePost.description')}\n acceptText={t('popup.deletePost.accept')}\n cancelText={t('popup.deletePost.cancel')}\n onAccept={async () => {\n if (!post?.id || loading) return\n setLoading(true)\n try {\n const res = await deletePost({\n id: post.id,\n locale,\n })\n if (res?.status === 1) onDeletePost?.()\n } catch {}\n setLoading(false)\n }}\n onClose={() => setIsOpenLeavePopup(false)}\n />\n )}\n <TreePopoverMenu\n className={popoverClassName}\n toggleButtonContent={\n <img src={isMarryBaby ? MBMoreSolid : IconKebab} />\n }\n position=\"bottom\"\n align=\"end\"\n buttonProps={{\n isLoading: loading,\n }}\n data={\n isAuthor\n ? {\n isShowheader: false,\n type: 'list',\n list: [\n {\n icon: IconShareOnMedia,\n label: t('morePopover.share'),\n onClick: () => setIsOpenSharePopup(true),\n },\n {\n icon: IconTabEdit,\n label: t('actionPopover.edit'),\n onClick: onEditPost,\n },\n {\n icon: IconTrashBin,\n label: t('actionPopover.delete'),\n onClick: () => {\n authActionWrapper(() => setIsOpenLeavePopup(true))\n },\n },\n ],\n }\n : {\n isShowheader: false,\n type: 'list',\n list: [\n {\n icon: IconShareOnMedia,\n label: t('morePopover.share'),\n onClick: () => setIsOpenSharePopup(true),\n },\n {\n icon: !!post?.bookmarked ? IconBookmarkFill : IconBookmark,\n label: !!post?.bookmarked\n ? t('morePopover.unsavePost')\n : t('morePopover.savePost'),\n onClick: () => {\n authActionWrapper(async () => {\n if (!userInfo?.id || !post?.id) return\n if (post?.bookmarked) {\n const res = await callApiWithAuth(\n getApiPath(PATHS.BOOKMARK.DELETE, {\n _locale: locale,\n }),\n 'DELETE',\n {\n data: {\n post_id: String(post.id),\n },\n },\n )\n if (res?.status === 1) {\n pushNotifications({\n title: '',\n message: 'Removed saved post',\n type: 'success',\n displayIcon: IconBookmark,\n })\n\n onRemoveBookmark && onRemoveBookmark()\n } else {\n pushNotifications({\n title: '',\n message: 'Remove failed',\n type: 'danger',\n displayIcon: IconBookmark,\n })\n }\n } else {\n const res = await callApiWithAuth(\n getApiPath(PATHS.BOOKMARK.CREATE, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n user_id: togetherUserId || userInfo.id,\n post_id: post.id,\n },\n },\n )\n if (res?.status === 1) {\n pushNotifications({\n title: '',\n message: 'Post saved',\n type: 'success',\n displayIcon: IconBookmarkFill,\n })\n\n onBookmark && onBookmark()\n } else {\n pushNotifications({\n title: '',\n message: 'Post saved failed',\n type: 'danger',\n displayIcon: IconBookmark,\n })\n }\n }\n })\n },\n },\n // {\n // icon: togetherBasePath + '/svg/icon-bell-on.svg',\n // label: !localHasNoti\n // ? t( 'morePopover.turnOnNotifications' })\n // : t( 'morePopover.turnOffNotifications' }),\n // onClick: () => {\n // authActionWrapper(async () => {\n // if (!post?.id || loading) return\n // setLoading(true)\n // try {\n // const res = await followUnfollowPost({\n // id: post?.id,\n // locale,\n // })\n // if (res?.status === 1) {\n // pushNotifications({\n // message: !localHasNoti\n // ? 'Notification on'\n // : 'Notification off',\n // type: !localHasNoti ? 'success' : 'danger',\n // displayIcon: !localHasNoti ? IconBellOn : IconBellOff,\n // })\n // setLocalHasNoti((v) => !v)\n // }\n // } catch {}\n // setLoading(false)\n // })\n // },\n // },\n {\n icon: IconAlertCircle,\n label: t('morePopover.report'),\n subTree: {\n title: t('morePopover.report.title'), //'Report this post',\n description: t('morePopover.report.description'), // 'Help us understand what’s happening with this post. How would you describe it?',\n isShowheader: true,\n type: 'list',\n list: Object.keys(REPORT_REASON_MAP)\n .map((k) => ({\n label: REPORT_REASON_MAP[k].label,\n reason: REPORT_REASON_MAP[k].reportReasonText,\n reasonValue: k,\n }))\n .map((item) => ({\n label: t(item.label as TranslationsKey),\n subTree: {\n title: t('morePopover.reportSubmit.title'), //'Submit report?',\n description: t(\n 'morePopover.reportSubmit.description',\n ), //'We won’t tell them who reported it. Please check these details:',\n isShowheader: true,\n type: 'jsx',\n jsxRenderer: (setShow) => (\n <SubmitReportForm\n reason={item.reasonValue}\n reasonText={t(item.reason as TranslationsKey)}\n postId={post?.id}\n onClose={() => setShow && setShow(false)}\n />\n ),\n },\n })),\n },\n },\n ],\n }\n }\n />\n </div>\n )\n}\n","import React, {\n CSSProperties,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Heading } from 'components/atoms/heading'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { getDefaultFailNoti } from 'together/utils/notification'\n\nimport { formatComment } from '../../../api/dataTransform'\nimport { CARE_PATHS, PATHS } from '../../../api/paths'\nimport {\n callApi,\n callApiWithOptionalAuth,\n domainLocales,\n getApiPath,\n getCarePath,\n getCurrentBaseUrl,\n} from '../../../api/utils'\nimport {\n TogetherAuthConfigContextProvider,\n useTogetherAuthRequiredAction,\n} from '../../../hooks/useTogetherAuthRequiredAction'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { Comment, DoctorInfo, Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { likeUnlikePost } from '../../../utils/apiActions/post'\nimport { CardLink } from '../../atoms/cardLink'\nimport { CardReactions } from '../../atoms/cardReactions'\nimport { CardReactionType } from '../../atoms/cardReactions/index'\nimport { LabelPin } from '../../atoms/labelSortPin/labelPin'\nimport { TagTopic } from '../../atoms/tagTopic'\nimport { CardAuthor } from '../../molecules/cardAuthor'\nimport { InputCommentBar } from '../../molecules/inputCommentBar'\nimport { SharePopup } from '../../molecules/popupFrame/popupShare'\nimport { HospitalInfo } from '../../molecules/popupHospital'\nimport { PostContent } from '../../molecules/postContent'\nimport { PostImagePreview } from '../../molecules/postImagePreview'\nimport { SocialLinkPreview } from '../../molecules/socialLinkPreview'\nimport { CardReply } from '../cardReply'\nimport { CardPostPopoverMore } from './cardPostPopover'\nimport { StyledCardPost } from './index.styled'\n\nconst getMostEngagingComment = async (postId: number, locale: string) => {\n const commentsRes = await callApiWithOptionalAuth(\n getApiPath(PATHS.COMMENT.LIST, {\n postId: postId,\n _locale: locale,\n sort: 'popularity',\n perPage: 1,\n withoutReply: 1,\n }),\n 'GET',\n )\n return commentsRes?.data?.comments?.map(formatComment)?.[0]\n}\n\nexport type Props = {\n post: Post\n\n hideViewMoreComment?: boolean\n showMostEngaging?: boolean\n className?: string\n disableCardLink?: boolean\n disableShortenContent?: boolean\n style?: CSSProperties\n onCommentClick?: () => void\n onMostEngagingCommentClick?: () => void\n onCommentCountClick?: () => void\n onPostCommentSuccess?: (c: Comment) => void\n onDeletePost?: () => void\n onEditPost?: () => void\n mostEngagingComment?: Comment | null\n onDeleteComment?: (c: Comment) => void\n showInputComment?: boolean\n hasQuickBookingEnable?: boolean\n doctorId?: string\n hospitalId?: string\n InlineCommentsComponent?: ReactNode\n handleMakeAppointment?: (doctorId?: string, hospitalId?: string) => void\n}\n\nconst CardPost = ({\n className,\n style,\n hideViewMoreComment,\n showMostEngaging,\n onCommentClick,\n onCommentCountClick,\n onMostEngagingCommentClick,\n onPostCommentSuccess: onPostCommentSuccessProp,\n disableCardLink,\n disableShortenContent,\n onDeletePost,\n onEditPost,\n post: postProp,\n mostEngagingComment: mostEngagingCommentProp,\n onDeleteComment: onDeleteCommentProp,\n showInputComment: propsShowInputComment,\n InlineCommentsComponent,\n hasQuickBookingEnable,\n handleMakeAppointment,\n}: Props) => {\n const [post, setPost] = useState(postProp)\n const [isOpenSharePopup, setIsOpenSharePopup] = useState(false)\n const [mostEngagingComment, setMostEngagingComment] = useState(\n mostEngagingCommentProp,\n )\n const {\n community,\n topics,\n author,\n slug,\n isPin,\n liked,\n scheduleDateTime,\n createdAt,\n photos,\n mentions,\n title,\n description,\n previewUrl,\n likesCount,\n commentsCount,\n id,\n commented,\n } = post\n const {\n data: {\n locale,\n env: { isMarryBaby, togetherBasePath },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [showInputComment, setShowInputComment] = useState(\n propsShowInputComment,\n )\n\n const postRelativeHref = `${togetherBasePath}/${community?.slug || '_'}/${\n slug || ''\n }`\n const postHref = `${getCurrentBaseUrl(locale)}${postRelativeHref}`\n const { authActionWrapper } = useTogetherAuthRequiredAction(\n community?.slug\n ? {\n _joinCommunityIds: [community.id],\n _joinTopicIds: topics?.map((t) => t.id),\n // _location: postHref,\n }\n : undefined,\n )\n const [isLikeLoading, setIsLikeLoading] = useState(false)\n useEffect(() => {\n setShowInputComment(propsShowInputComment)\n }, [propsShowInputComment])\n\n const name = author?.name || author?.username || ''\n const username = author?.username || author?.name || ''\n const avatar = author?.avatar\n const [hospitalInfo, setHospitalInfo] = useState<HospitalInfo | null>(null)\n const [doctorInfo, setDoctorInfo] = useState<DoctorInfo | null>(null)\n\n useEffect(() => {\n if (author?.hospitalId) {\n const fetchHospitalDetail = async (hospitalId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_HOSPITAL_INFO, {\n hospital_branch_id: hospitalId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.branch) {\n setHospitalInfo(response?._data.branch)\n }\n }\n fetchHospitalDetail(author.hospitalId)\n }\n if (author?.doctorId) {\n const fetchDoctorDetail = async (doctorId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_DOCTOR_INFO, {\n doctorId: doctorId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.doctor) {\n setDoctorInfo(response?._data.doctor)\n }\n }\n fetchDoctorDetail(author.doctorId)\n }\n }, [author.hospitalId, author.doctorId])\n const isDoctorAvailable =\n doctorInfo?.valid_outpatient || doctorInfo?.valid_telemedicine\n const isHospitalAvailable =\n (hospitalInfo?.total_available_service ||\n hospitalInfo?.total_available_doctor) > 0\n const hasQuickBooking =\n hasQuickBookingEnable && (isDoctorAvailable || isHospitalAvailable)\n\n useEffect(() => {\n ;(async () => {\n if (\n id &&\n commentsCount &&\n showMostEngaging &&\n !mostEngagingCommentProp?.id\n ) {\n const comment = await getMostEngagingComment(id, locale)\n setMostEngagingComment(comment)\n }\n })()\n }, [id, locale, commentsCount, showMostEngaging, mostEngagingCommentProp?.id])\n useEffect(() => {\n setMostEngagingComment(mostEngagingCommentProp)\n }, [mostEngagingCommentProp?.id])\n const onPostCommentSuccess = (comment: Comment) => {\n if (commentsCount === 0 && !mostEngagingComment?.id) {\n setMostEngagingComment(comment)\n }\n setPost((p) => ({\n ...p,\n commentsCount: p.commentsCount + 1,\n commented: true,\n }))\n onPostCommentSuccessProp && onPostCommentSuccessProp(comment)\n }\n\n const onDeleteComment = async (comment: Comment) => {\n if (\n commentsCount > 1 &&\n mostEngagingComment?.id &&\n mostEngagingComment?.id === comment?.id\n ) {\n const newMostEngaging = await getMostEngagingComment(id, locale)\n setMostEngagingComment(newMostEngaging)\n }\n setPost((p) => ({\n ...p,\n commentsCount: p.commentsCount - 1,\n }))\n onDeleteCommentProp && onDeleteCommentProp(comment)\n }\n return (\n <TogetherAuthConfigContextProvider\n defaultParams={\n community?.slug\n ? {\n _joinCommunityIds: [community.id],\n _joinTopicIds: topics?.map((t) => t.id),\n // _location: postHref,\n }\n : undefined\n }\n >\n {isOpenSharePopup && (\n <SharePopup\n url={postHref}\n avatar={DEFAULT_IMG}\n text={title}\n onClose={() => setIsOpenSharePopup(false)}\n />\n )}\n <StyledCardPost\n className={className}\n style={style}\n data-is-marrybaby={isMarryBaby}\n >\n {isPin ? <LabelPin className=\"post-pin\" /> : null}\n <div style={{ position: 'relative' }}>\n <CardAuthor\n avatar={avatar}\n name={name}\n username={username}\n url={disableCardLink ? undefined : postRelativeHref}\n email={author?.email}\n time={scheduleDateTime || createdAt}\n community={community}\n // miniIcon=\"./svg/icon-tag.svg\"\n className=\"post-author\"\n role={author?.role}\n userId={author?.id}\n expertId={author?.partnerId}\n doctorId={author?.doctorId}\n hospitalId={author?.hospitalId}\n title={author?.title}\n hasQuickBooking={hasQuickBooking}\n handleMakeAppointment={handleMakeAppointment}\n />\n <CardPostPopoverMore\n authorEmail={String(author?.email)}\n onDeletePost={onDeletePost}\n shareUrl={postHref}\n post={post}\n className=\"popover\"\n onEditPost={onEditPost}\n />\n </div>\n <a\n href={disableCardLink ? undefined : postRelativeHref}\n className=\"post-content-link-wrapper\"\n >\n {title && (\n <Heading\n className=\"post-content-title\"\n as=\"h1\"\n tag=\"h5\"\n fontWeight=\"bold\"\n >\n {innertext(title)}\n </Heading>\n )}\n <PostContent\n className=\"post-content-wrapper\"\n description={description}\n disableShortenContent={disableShortenContent}\n mentions={mentions}\n />\n </a>\n <span></span>\n <span></span>\n <div key=\"tag-topic\">\n {topics && topics.length > 0 ? (\n <TagTopic topics={topics} className=\"post-topics\" />\n ) : null}\n </div>\n <div key=\"social-preview\">\n {post?.introUrl ? (\n <div\n className={`social-preview-wrapper ${\n !!photos?.length ? 'has-image' : ''\n }`}\n >\n <SocialLinkPreview url={post.introUrl} image={post.bannerImage} />\n </div>\n ) : null}\n </div>\n <div key=\"image-preview\">\n {!!photos?.length ? (\n <div className=\"image-preview-wrapper\">\n <PostImagePreview images={photos} authorName={author?.name} />\n </div>\n ) : null}\n </div>\n <div key=\"link-preview\">\n {!post?.introUrl && !photos?.length && previewUrl?.url ? (\n <div className=\"link-preview-wrapper\">\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url}\n image={previewUrl.image}\n />\n </div>\n ) : null}\n </div>\n <CardReactions\n type={CardReactionType.post}\n loveCount={likesCount}\n replyCount={commentsCount}\n className={`post-reaction ${\n photos?.length || previewUrl?.url ? 'hide-top-border' : ''\n }`}\n liked={isLikeLoading ? !liked : liked}\n isReplied={commented}\n onCommentClick={() =>\n authActionWrapper(() => {\n onCommentClick ? onCommentClick() : setShowInputComment((v) => !v)\n })\n }\n onCommentCountClick={() => {\n authActionWrapper(() => {\n isMarryBaby\n ? setShowInputComment(true)\n : onCommentCountClick\n ? onCommentCountClick()\n : !disableCardLink && (window.location.href = postRelativeHref)\n })\n }}\n onShareClick={() => {\n setIsOpenSharePopup(true)\n }}\n onLikeClick={async () => {\n if (!id || isLikeLoading) return\n setIsLikeLoading(true)\n try {\n const res = await likeUnlikePost({\n id,\n locale,\n })\n if (res?.status !== 1) {\n pushNotifications(getDefaultFailNoti(t))\n } else {\n setPost((p) => ({\n ...p,\n likesCount: (p.likesCount || 0) + (!p.liked ? 1 : -1),\n liked: !p.liked,\n }))\n }\n } catch {\n pushNotifications(getDefaultFailNoti(t))\n }\n setIsLikeLoading(false)\n }}\n showingMostEngaging={!!(showMostEngaging && mostEngagingComment?.id)}\n />\n {showInputComment && (\n <InputCommentBar\n isMainCmt={!propsShowInputComment}\n onClose={() => setShowInputComment(false)}\n onPostSuccess={onPostCommentSuccess}\n post={post}\n />\n )}\n {showMostEngaging && mostEngagingComment?.id ? (\n <div\n className=\"most-engaging-wrapper\"\n onClick={(e) => {\n if (onMostEngagingCommentClick) {\n e.stopPropagation()\n onMostEngagingCommentClick()\n } else window.location.href = postRelativeHref\n }}\n >\n <CardReply\n hasQuickBookingEnable={hasQuickBookingEnable}\n handleMakeAppointment={handleMakeAppointment}\n comment={mostEngagingComment}\n onDeleteComment={() => {\n onDeleteComment && onDeleteComment(mostEngagingComment)\n }}\n className=\"most-engaging-comment\"\n type=\"most-engaging\"\n key={mostEngagingComment.id}\n />\n {commentsCount > 1 && !hideViewMoreComment && (\n <Button className=\"see-more-comments\" color=\"ghost\" size=\"md\">\n {t('comment.seeMoreComments', {\n count: commentsCount - 1,\n })}\n </Button>\n )}\n </div>\n ) : null}\n {InlineCommentsComponent}\n </StyledCardPost>\n </TogetherAuthConfigContextProvider>\n )\n}\n\nexport { CardPost }\n","import React, { CSSProperties, useContext, useEffect, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Text } from 'components/atoms/text'\nimport { Dropdown } from 'components/molecules/dropdown'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { theme } from 'misc/theme'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\nimport { getDefaultFailNoti } from 'together/utils/notification'\n\nimport { formatPost } from '../../../api/dataTransform'\nimport IconAlertCirclePrimary from '../../../assets/svg/icon-alert-circle-primary.svg'\nimport IconAlertCircleWarning from '../../../assets/svg/icon-alert-circle-warning.svg'\nimport { MAX_IMAGE_UPLOADS } from '../../../interfaces/constants'\nimport { Community, Post, PostApi, Topic } from '../../../interfaces/types'\nimport { editPost, getPostFormData } from '../../../utils/apiActions/post'\nimport { createPost } from '../../../utils/apiActions/post'\nimport {\n decodeMention,\n decodePostUrl,\n encodePostContent,\n getMentionIdsFromString,\n removeBannedWordWrapper,\n} from '../../../utils/post'\nimport { CreatePostDescription } from '../createPostDescription'\nimport { CreatePostTitle } from '../createPostTitle/index'\nimport { TopicSelectList } from '../topicSelectList'\nimport { StyledCreateNewPost } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n onPostCreatedEdited?: (post: Post, isEdit?: boolean) => void\n onClose?: () => void\n communities?: Community[]\n forceSelectCommunity?: Community\n forceSelectTopics?: Topic[]\n articleId?: string\n optionalTopic?: boolean\n noFetchTopic?: boolean\n editPostData?: Post\n defaultCommunity?: Community\n defaultTopics?: Topic[]\n hideTopicList?: boolean\n}\n\nexport const CreateNewPostContent = ({\n className,\n style,\n onPostCreatedEdited,\n onClose,\n communities = [],\n forceSelectCommunity,\n forceSelectTopics,\n articleId,\n optionalTopic,\n editPostData,\n defaultCommunity,\n defaultTopics,\n noFetchTopic,\n hideTopicList,\n}: Props) => {\n const isInEditMode = !!editPostData?.id\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n action: { pushNotifications, sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [titleValue, setTitleValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [communityValue, setCommunityValue] = useState(\n forceSelectCommunity\n ? {\n label: forceSelectCommunity.name,\n value: `${forceSelectCommunity.id || ''}-${\n forceSelectCommunity.mappedCategoryId || ''\n }`,\n }\n : {\n label: t('community.choose'),\n value: '',\n },\n )\n const [selectedTopics, setSelectedTopics] = useState<Topic[]>(\n [...forceSelectTopics] || [],\n )\n const [imageFiles, setImageFiles] = useState<(File | string)[]>([])\n const [bannedWords, setBannedWords] = useState<string[]>([])\n\n const currentCommunity =\n forceSelectCommunity ||\n communities.find(\n (c) =>\n `${c.id || ''}-${c.mappedCategoryId || ''}` === communityValue.value,\n )\n\n const communitiesList = forceSelectCommunity\n ? [forceSelectCommunity]\n : communities\n .filter((c) => c.isActive)\n .sort((a, b) => {\n if (a.name > b.name) return 1\n if (a.name < b.name) return -1\n return 0\n })\n\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n description?: string\n } | null>(null)\n const [invalidUrls, setInvalidUrls] = useState<string[]>([])\n\n const isReadyToSubmit =\n titleValue &&\n innertext(descriptionValue) &&\n (optionalTopic || (!optionalTopic && selectedTopics.length > 0)) &&\n currentCommunity &&\n (!imageFiles || imageFiles.length <= MAX_IMAGE_UPLOADS) &&\n !invalidUrls?.length &&\n !isSubmitting\n // HANDLE etra action when OPEN AND CLOSE\n useEffect(() => {\n if (editPostData) {\n const post = editPostData\n setTitleValue(post.title || '')\n setDescriptionValue(\n decodeMention(\n decodePostUrl(post.description || '', 'edit'),\n post.mentions,\n ),\n )\n setCommunityValue({\n label: post.community.name,\n value: `${post.community.id || ''}-${\n post.community.mappedCategoryId || ''\n }`,\n })\n setSelectedTopics(post.topics || [])\n setImageFiles(post.photos || [])\n } else {\n if (defaultCommunity) {\n setCommunityValue({\n label: defaultCommunity.name,\n value: `${defaultCommunity.id || ''}-${\n defaultCommunity.mappedCategoryId || ''\n }`,\n })\n }\n if (defaultTopics) {\n setSelectedTopics(defaultTopics)\n }\n }\n }, [])\n\n const onCreateEditSuccess = (res: PostApi) => {\n if (onPostCreatedEdited) {\n onPostCreatedEdited(formatPost(res), isInEditMode)\n }\n onClose && onClose()\n }\n\n const submitPost = async () => {\n const bodyFormData = await getPostFormData({\n title: titleValue,\n description: descriptionValue,\n communityId: String(currentCommunity?.id || ''),\n imageFiles,\n previewUrl,\n topicIds: selectedTopics\n ?.map((topic) => String(topic.id || ''))\n .filter(Boolean),\n locale,\n sanitizeFunction,\n categoryCommunityId: String(currentCommunity?.mappedCategoryId || ''),\n categoryTopicIds: selectedTopics\n ?.map((topic) => String(topic.mappedCategoryId || ''))\n .filter(Boolean),\n })\n if (articleId) {\n bodyFormData.append('article_id', articleId)\n }\n\n let res: any\n if (isInEditMode) {\n if (editPostData?.id) {\n res = await editPost({\n id: editPostData.id,\n formData: bodyFormData,\n locale,\n })\n }\n } else {\n res = await createPost({\n formData: bodyFormData,\n locale,\n isArticleComment:\n !currentCommunity?.id && !!currentCommunity?.mappedCategoryId,\n })\n }\n const resData = res?.data\n if (resData?.id && !res?.messages?.moderation?.type) {\n pushNotifications({\n message: t('createPost.popup.success'),\n type: 'success',\n })\n onCreateEditSuccess(resData)\n } else {\n if (res?.messages?.moderation?.type === 'banned') {\n pushNotifications({\n title: t('notification.post.blocked.title'),\n message: t('notification.post.blocked.message'),\n type: 'danger',\n })\n if (res.messages.moderation.words) {\n setBannedWords(res.messages.moderation.words)\n }\n } else if (res?.messages?.moderation?.type === 'suspect') {\n pushNotifications({\n title: t('notification.post.suspect.title'),\n message: t('notification.post.suspect.message'),\n type: 'warning',\n })\n onClose && onClose()\n } else if (\n res?.messages?.find?.((m: string) => !!m?.includes?.('suspend'))\n ) {\n pushNotifications({\n message: t('notification.suspend.message'),\n type: 'danger',\n })\n onClose && onClose()\n } else {\n pushNotifications({\n message: res?.messages?.[0] || t('notification.failure'),\n type: 'danger',\n })\n }\n }\n }\n\n return (\n <StyledCreateNewPost className={className} style={style}>\n <div className=\"input-group-container\">\n <CreatePostTitle\n className=\"input-group\"\n bannedWords={bannedWords}\n value={titleValue}\n onChange={setTitleValue}\n />\n <CreatePostDescription\n className=\"input-group\"\n bannedWords={bannedWords}\n value={descriptionValue}\n onChange={setDescriptionValue}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={setInvalidUrls}\n onImageFilesChange={setImageFiles}\n imageFiles={imageFiles}\n />\n <div className=\"input-group\">\n <Text size=\"p4\" className=\"input-group-label\">\n {t('admin.community')}\n </Text>\n <Dropdown\n options={\n communitiesList?.map((c, index) => ({\n label: c.name,\n value: `${c.id || ''}-${c.mappedCategoryId || ''}`,\n })) || []\n }\n id=\"community-picker\"\n placeholder={t('community.choose')}\n value={communityValue}\n onChange={(option) => {\n setCommunityValue({\n label: option.label as string,\n value: String(option.value),\n })\n setSelectedTopics([])\n }}\n disabled={!!forceSelectCommunity}\n />\n <Text size=\"sm\" className=\"warning\" color={theme.colors.gray400}>\n * {t('commentPopup.warning.newPost')}\n </Text>\n </div>\n {!hideTopicList && (\n <div className=\"input-group\">\n <Text size=\"p4\" className=\"input-group-label\">\n {t('tab.topic')}\n </Text>\n <div className=\"input-notification\">\n <img\n src={\n currentCommunity\n ? IconAlertCirclePrimary\n : IconAlertCircleWarning\n }\n />\n <Text size=\"base\" color={theme.colors.gray500}>\n {t(\n currentCommunity\n ? 'createPost.popup.primary'\n : 'createPost.popup.warning',\n )}\n </Text>\n </div>\n {currentCommunity && (\n <TopicSelectList\n className=\"tag-list\"\n communityId={currentCommunity.id}\n forceTopics={forceSelectTopics}\n onChange={setSelectedTopics}\n selectedTopics={selectedTopics}\n noFetch={noFetchTopic}\n />\n )}\n </div>\n )}\n </div>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"submit-btn\"\n size=\"lg\"\n onClick={async () => {\n if (isReadyToSubmit && !isSubmitting) {\n setIsSubmitting(true)\n try {\n await submitPost()\n } catch (e) {\n console.error(e)\n pushNotifications(getDefaultFailNoti(t))\n }\n setIsSubmitting(false)\n }\n }}\n isDisabled={!isReadyToSubmit}\n isLoading={isSubmitting}\n >\n {t('createPost.popup.submit')}\n </Button>\n </StyledCreateNewPost>\n )\n}\n"],"names":["CardLink","_a","title","url","image","logo","className","style","noRefetch","_b","useContext","TogetherComponentGlobalContext","data","locale","isMarryBaby","env","_c","useState","hideLogo","setHideLogo","noRefetchRef","useRef","current","_d","previewData","setPreviewData","useEffect","__awaiter","_data","__assign","isFetching","callApi","getApiPath","PATHS","FETCH_PREVIEW","_locale","link","then","res","catch","displayImage","displayTitle","displayLogo","displayUrl","domain","replace","split","showDefaultRef","React","createElement","StyledCardLink","concat","href","target","rel","src","onError","e","currentTarget","DEFAULT_IMG","Text","size","Heading","tag","TagTopic","topics","onClick","sliding","setSliding","slider","pos","timeoutRef","mouseDownHandler","setTimeout","left","scrollLeft","x","clientX","mouseMoveHandler_1","currentPos","dx","mouseUpHandler_1","clearTimeout","undefined","document","removeEventListener","addEventListener","sliderRef","useDragScroll","togetherBasePath","sanitizeFunction","action","StyledTagTopic","ref","onMouseDown","map","topic","index","key","isActive","isHidden","dangerouslySetInnerHTML","__html","name","LabelPin","color","t","useTranslations","LabelSortPin","label","Fragment","rightLabel","getDefaultFailNoti","message","type","likeUnlikePost","id","callApiWithAuth","POST","LIKE","sent","deletePost","DELETE","getPostFormData","description","communityId","imageFiles","previewUrl","topicIds","categoryCommunityId","categoryTopicIds","introUrl","bannerUrl","scheduleTime","bodyFormData","FormData","submitDescription","removeBannedWordWrapper","submitTitle","mentionIds","getMentionIdsFromString","append","encodePostContent","String","forEach","topicId","length","Promise","all","file","resolve","uploadAndGetSrc","imageSrcs","filter","Boolean","slice","MAX_IMAGE_UPLOADS","imageFile","mentionId","createPost","formData","isArticleComment","CREATE_ARTICLE_COMMENT","CREATE","headers","editPost","UPDATE","reportPost","reason","REPORT","useImagePicker","imageFilesProp","onImageFilesChange","setImageFiles","onSelectImages","files","Array","from","imgs","_imgs","onRemoveImage","_files","splice","onRemoveAllImages","useMemo","URL","createObjectURL","CreatePostDescription","bannedWords","value","onChange","onPreviewUrlChange","onInvalidUrlsChange","isReplying","setPreviewUrl","imagePicker","StyledCreatePostDescription","RichTextEditor","html","onImagePickerClick","click","innertext","Loading","IconCloseCircle","accept","multiple","display","IconAlertCircleWarning","theme","colors","alertWarning","i","inputModify","opts","limit","shorten","substring","highlightBadWords","CreatePostTitle","titleValue","setTitleValue","titleRef","pasteHandler_1","preventDefault","text","clipboardData","getData","execCommand","contentDiv_1","bannedString","join","titleText","innerText","titleValueWithBanned","debounceInputModify","useCallback","debounce","v","shortenString","focus","StyledCreatePostTitle","Input","CustomInput","ContentEditable","innerRef","evt","initialValue","count","max","TopicSelectList","topicsProp","isLoading","disabled","forceTopics","selectedTopicsProp","selectedTopics","noFetch","setTopics","setSelectedTopics","_e","isLoadingTopics","setIsLoadingTopics","topicsPropRef","TOPIC","LIST","topicRes_1","isArray","formatTopic","sort","t1","t2","order","console","log","e_1","topicsPropString","topicsStateString","forceTopicsPropString","topicsWithoutForced","some","ft","mappedCategoryId","StyledTopicSelectList","TopicItem","selected","_selected","foundIndex","findIndex","push","PopupDanger","isMarryBabyProp","acceptText","cancelText","onAccept","thumbnail","isThumbnailIcon","onClose","isMarryBabyContext","isOpen","setIsOpen","toggleNoScroll","ReactDOM","createPortal","StyledPopupDanger","PopupFrame","stopPropagation","Button","body","getCommentFormBody","postId","photos","replyingUserId","replyingUserName","replyingId","submitText","photo","unshift","submitComment","COMMENT","submitReply","REPLY","likeUnlikeComment","commentId","setLike","UNLIKE","deleteComment","InputCommentBar","isReply","replyToName","replyingUser","onPostSuccess","post","pushNotifications","userInfo","_f","_g","setText","trigger","MainInputTriggerContext","_h","isSubmitLoading","setIsSubmitLoading","contentEditable","mainInput","_j","invalidUrls","setInvalidUrls","_k","setBannedWords","_l","scrollIntoView","behavior","block","StyledInputCommentBar","UserAvatar","avatar","DEFAULT_AVATAR_IMG","username","displayIcon","setEditorRef","div","handleSuccess","newComment","formatComment","images","JSON","parse","author","formBody","resData","messages","moderation","words","find","m","includes","call","isDisabled","trim","SubmitReportForm","reasonText","loading","setLoading","StyledSubmitReportForm","IconAlertCircle","gray800","status","PostContent","replyingTo","mentionedUser","rawDescription","disableShortenContent","mentions","showAll","setShowAll","authActionWrapper","useTogetherAuthRequiredAction","openPopupExpert","setOpenPopupExpert","decodeMention","decodePostUrl","shortenSanitizedContentData","sanitizedContent","showContent","hasSeeMore","firstRound","newLineCompensateLength","match","shortenFirstRound","secondRound","replyName","hasExpert","role","partnerId","PopupExpert","expertId","StyledPostContent","startsWith","ImagePreviewPopup","authorName","onOpenSingleView","StyledImagePreviewPopup","alt","textAlign","PostSingleImageViewPopup","initialViewIndex","viewIndex","setViewIndex","previewImg","leftDisabled","rightDisabled","StyledImagePreviewContainer","StyledImagePreviewTopbar","CloseIcon","StyledImagePreviewWrapper","StyledArrowWrapper","StyledCircleArrow","ChevronRightIcon","transform","PostImagePreview","moreImageCount","isOpenImagePreview","setIsOpenImagePreview","singleImageViewIndex","setSingleImageViewIndex","lazyLoadInstance","update","hasMore","hasSetNoScroll","StyledPostImagePreview","SocialLinkPreview","youtubeVidId","youtubeVidIdGetter","facebookVidId","facebookVidIdGetter","responsiveWidth","responsiveHeight","forceRerenderFB","setForceRerenderFB","handleResize","containerRect","containerRef","getBoundingClientRect","toChangeSize","Math","abs","width","floor","height","window","StyledSocialLinkPreview","frameBorder","allowFullScreen","position","top","border","overflow","encodeURIComponent","scrolling","allow","CardReplyPopover","onDeleteComment","popoverClassName","isOpenLeavePopup","setIsOpenLeavePopup","TreePopoverMenu","align","isShowheader","list","icon","IconTrashBin","toggleButtonContent","MBMoreSolid","IconKebab","buttonProps","CardReply","CommentProps","level","onPostCommentSuccess","refetchComment","hasQuickBookingEnable","handleMakeAppointment","comment","setComment","countReplies","countLikes","content","createdAt","replies","_m","liked","_o","s","authorRegex","decodeCommentBody","_joinCommunityIds","community","_joinTopicIds","_p","maxRepliesShow","setMaxRepliesShow","isCommented","c","addNewReply","old","_q","showInputComment","setShowInputComment","sortedReplies","a","b","timeA","Date","getTime","timeB","mergeCountReplies","hasPopover","email","_r","hospitalInfo","setHospitalInfo","_s","doctorInfo","setDoctorInfo","hospitalId","getCarePath","CARE_PATHS","GET_HOSPITAL_INFO","hospital_branch_id","website_url","domainLocales","response","branch","doctorId","GET_DOCTOR_INFO","doctor","isDoctorAvailable","valid_outpatient","valid_telemedicine","isHospitalAvailable","total_available_service","total_available_doctor","hasQuickBooking","TogetherAuthConfigContextProvider","defaultParams","StyledCardPost","Divider","CardAuthor","time","userId","CardReactions","CardReactionType","reply","loveCount","replyCount","isReplied","hideCommentIcon","onCommentClick","onCommentCountClick","onLikeClick","r","CardPostPopoverMore","authorEmail","onDeletePost","shareUrl","onBookmark","onRemoveBookmark","onEditPost","togetherUserId","isOpenSharePopup","setIsOpenSharePopup","isAuthor","SharePopup","IconShareOnMedia","bookmarked","IconBookmarkFill","IconBookmark","BOOKMARK","post_id","user_id","subTree","Object","keys","REPORT_REASON_MAP","k","reportReasonText","reasonValue","item","jsxRenderer","setShow","getMostEngagingComment","callApiWithOptionalAuth","perPage","withoutReply","commentsRes","comments","hideViewMoreComment","showMostEngaging","onMostEngagingCommentClick","onPostCommentSuccessProp","disableCardLink","postProp","mostEngagingCommentProp","mostEngagingComment","onDeleteCommentProp","propsShowInputComment","InlineCommentsComponent","setPost","setMostEngagingComment","slug","isPin","scheduleDateTime","likesCount","commentsCount","commented","postRelativeHref","postHref","getCurrentBaseUrl","isLikeLoading","setIsLikeLoading","newMostEngaging","p","StyledCardPost$1","as","fontWeight","innertext_1","bannerImage","location","onShareClick","showingMostEngaging","isMainCmt","onPostCreatedEdited","communities","forceSelectCommunity","forceSelectTopics","articleId","optionalTopic","editPostData","defaultCommunity","defaultTopics","noFetchTopic","hideTopicList","isInEditMode","isSubmitting","setIsSubmitting","descriptionValue","setDescriptionValue","communityValue","setCommunityValue","__spreadArray","currentCommunity","communitiesList","isReadyToSubmit","submitPost","formatPost","onCreateEditSuccess","StyledCreateNewPost","Dropdown","options","placeholder","option","gray400","gray500","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types-6d50fb9d.js","sources":["../src/together/components/atoms/cardLink/index.tsx","../src/together/components/atoms/tagTopic/index.tsx","../src/hooks/useDragScroll.ts","../src/together/components/atoms/labelSortPin/labelPin.tsx","../src/together/utils/notification.ts","../src/together/utils/apiActions/post.ts","../src/hooks/useImagesPicker.ts","../src/together/components/molecules/createPostDescription/index.tsx","../src/together/components/molecules/createPostTitle/index.tsx","../src/together/components/molecules/topicSelectList/index.tsx","../src/together/components/molecules/popupDanger/index.tsx","../src/together/utils/apiActions/comment.tsx","../src/together/components/molecules/inputCommentBar/index.tsx","../src/together/components/molecules/submitReportForm/index.tsx","../src/together/components/molecules/postContent/index.tsx","../src/together/components/molecules/postImagePreview/imagePreviewPopup.tsx","../src/together/components/molecules/postImagePreview/postSingleImageViewPopup/index.tsx","../src/together/components/molecules/postImagePreview/index.tsx","../src/together/components/molecules/socialLinkPreview/index.tsx","../src/together/components/organisms/cardReply/cardReplyPopover.tsx","../src/together/components/organisms/cardReply/index.tsx","../src/together/components/organisms/cardPost/cardPostPopover.tsx","../src/together/components/organisms/cardPost/index.tsx","../src/together/components/molecules/createNewPostContent/index.tsx"],"sourcesContent":["import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Heading } from 'components/atoms/heading'\nimport { Text } from 'components/atoms/text'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { StyledCardLink } from './index.styled'\n\nexport type Props = {\n title?: string\n url: string\n image?: string\n logo?: string\n className?: string\n noRefetch?: boolean\n style?: CSSProperties\n}\n\nconst CardLink = ({\n title,\n url,\n image,\n logo,\n className,\n style,\n noRefetch,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const [hideLogo, setHideLogo] = useState(false)\n\n const noRefetchRef = useRef(noRefetch)\n noRefetchRef.current = noRefetch\n const [previewData, setPreviewData] = useState<{\n title?: string\n url?: string\n image?: string\n isFetching?: boolean\n logo?: string\n } | null>(null)\n useEffect(() => {\n ;(async () => {\n if (noRefetchRef.current) return\n if (!url) return setPreviewData(null)\n setPreviewData((_data) => ({\n ..._data,\n isFetching: true,\n }))\n callApi(\n getApiPath(PATHS.FETCH_PREVIEW, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n link: url,\n },\n },\n )\n .then((res) => {\n setHideLogo(false)\n setPreviewData({\n title: res?.data?.title,\n url,\n image: res?.data?.image || res?.data?.logo,\n // logo: meta.logo,\n })\n })\n .catch(() => {\n setPreviewData(null)\n })\n })()\n }, [url])\n\n const displayImage = previewData?.image || image\n const displayTitle = previewData?.title || title\n const displayLogo = previewData?.logo || logo\n const displayUrl = previewData?.url || url\n const urlParts = displayUrl\n .replace('http://', '')\n .replace('https://', '')\n .split(/[/?#]/)\n const domain = urlParts[0]\n const showDefaultRef = useRef(false)\n return (\n <StyledCardLink\n data-is-marrybaby={isMarryBaby}\n className={`${className} no-replace-click`}\n style={style}\n >\n <a href={displayUrl} target=\"_blank\" rel=\"noreferrer\">\n {displayImage && (\n <div className=\"link-image-wrapper\">\n {!isMarryBaby && (\n <img\n className=\"link-image-blur\"\n src={displayImage}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n )}\n <img\n className=\"link-image\"\n src={displayImage}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n </div>\n )}\n <div className=\"link-info-container\">\n <Text size=\"n1\">\n {isMarryBaby && displayLogo && !hideLogo && (\n <img\n className=\"link-logo\"\n src={displayLogo}\n onError={(e) => setHideLogo(true)}\n />\n )}\n {domain}\n </Text>\n <Heading tag=\"h6\">{displayTitle}</Heading>\n </div>\n </a>\n </StyledCardLink>\n )\n}\n\nexport { CardLink }\n","import React, { CSSProperties, useContext } from 'react'\n\nimport { Text } from 'components/atoms/text'\nimport { useDragScroll } from 'hooks/useDragScroll'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { Topic } from '../../../interfaces/types'\nimport { StyledTagTopic } from './index.styled'\n\nexport type Props = {\n onClick?: () => void\n className?: string\n style?: CSSProperties\n topics: Topic[]\n}\n\nconst TagTopic = ({ topics, onClick, className, style }: Props) => {\n const { sliding, mouseDownHandler, sliderRef: slider } = useDragScroll()\n const {\n data: {\n env: { togetherBasePath },\n },\n action: { sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n\n return (\n <StyledTagTopic\n ref={slider}\n onClick={onClick}\n onMouseDown={(e: React.MouseEvent<HTMLDivElement>) => mouseDownHandler(e)}\n className={`${className} ${sliding ? 'sliding' : ''}`}\n style={style}\n >\n {topics.map((topic, index) => (\n <a\n className=\"tag-link-item\"\n key={index}\n href={\n topic.isActive && !topic.isHidden\n ? `${togetherBasePath}${topic.url}`\n : undefined\n }\n >\n <Text size=\"p3\">\n <span\n dangerouslySetInnerHTML={{\n __html: sanitizeFunction?.(topic.name) || topic.name,\n }}\n ></span>\n </Text>\n </a>\n ))}\n </StyledTagTopic>\n )\n}\n\nexport { TagTopic }\n","import { useState, useRef } from 'react'\n\nexport const useDragScroll = () => {\n const [sliding, setSliding] = useState(false)\n const slider = useRef<HTMLDivElement>(null)\n const pos = useRef<{\n left: number\n x: number\n } | null>(null)\n const timeoutRef = useRef<NodeJS.Timeout>()\n\n const mouseDownHandler = function (e: React.MouseEvent<HTMLDivElement>) {\n // Change the cursor and prevent user from selecting the text\n if (slider.current) {\n timeoutRef.current = setTimeout(() => {\n setSliding(true)\n }, 500)\n pos.current = {\n left: slider.current.scrollLeft,\n x: e.clientX,\n }\n\n const mouseMoveHandler = function (e: MouseEvent) {\n // How far the mouse has been moved\n const currentPos = pos.current\n if (currentPos) {\n const dx = e.clientX - currentPos.x\n // const dy = e.clientY - pos.y;\n\n // Scroll the element\n // ele.scrollTop = pos.top - dy;\n if (slider.current) slider.current.scrollLeft = currentPos.left - dx\n }\n }\n const mouseUpHandler = function () {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = undefined\n }\n setSliding(false)\n document.removeEventListener('mousemove', mouseMoveHandler)\n document.removeEventListener('mouseup', mouseUpHandler)\n }\n document.addEventListener('mousemove', mouseMoveHandler)\n document.addEventListener('mouseup', mouseUpHandler)\n }\n }\n\n return {\n sliding,\n mouseDownHandler,\n sliderRef: slider,\n pos,\n }\n}\n","import React, { CSSProperties, useContext } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport MBPinOrange from '../../../assets/marrybaby/svg/pinOrange.svg'\nimport IconPinYellow from '../../../assets/svg/icon-pin-yellow.svg'\nimport { LabelSortPin } from './index'\n\nexport type Props = {\n onClick?: () => void\n color?: 'gray' | 'white'\n className?: string\n style?: CSSProperties\n}\n\nconst LabelPin = ({ onClick, color, className, style }: Props) => {\n const {\n data: {\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n return (\n <LabelSortPin\n label={\n <>\n {isMarryBaby && (\n <img className=\"label-sort-pin-icon\" src={MBPinOrange} />\n )}{' '}\n {t('label.pinnedPost')}\n </>\n }\n rightLabel={\n !isMarryBaby && (\n <img className=\"label-sort-pin-icon\" src={IconPinYellow} />\n )\n }\n onClick={onClick}\n color={'white' || color}\n className={`label-pinned ${className}`}\n style={style}\n />\n )\n}\n\nexport { LabelPin }\n","import { PushNotificationPayloadType } from 'together/togetherComponentGlobalContext'\n\ntype TranslateFunction = (\n k: string,\n option?: {\n [key: string]: any\n },\n) => any\n\nexport const getDefaultSuccessNoti = (t: TranslateFunction) =>\n ({\n message: t('notification.success'),\n type: 'success',\n } as PushNotificationPayloadType)\n\nexport const getDefaultFailNoti = (t: TranslateFunction) =>\n ({\n message: t('notification.failure'),\n type: 'danger',\n } as PushNotificationPayloadType)\n","import { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../api/utils'\nimport {\n encodePostContent,\n getMentionIdsFromString,\n removeBannedWordWrapper,\n uploadAndGetSrc,\n} from '../post'\n\nexport const likeUnlikePost = async ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n}) => {\n if (!id) return\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.LIKE, {\n id,\n _locale: locale,\n }),\n 'GET',\n )\n return res\n}\n\nexport const deletePost = async ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n}) => {\n if (!id) return\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.DELETE, {\n id,\n _locale: locale,\n }),\n 'DELETE',\n )\n return res\n}\n\nexport const getPostFormData = async ({\n title,\n description,\n communityId,\n imageFiles,\n previewUrl,\n topicIds,\n locale,\n sanitizeFunction,\n categoryCommunityId,\n categoryTopicIds,\n\n // admin only\n introUrl,\n bannerUrl,\n scheduleTime,\n}: {\n title: string\n description: string\n communityId?: string\n categoryCommunityId?: string\n imageFiles?: (string | File)[]\n previewUrl?: {\n title?: string\n description?: string\n url?: string\n image?: string\n }\n topicIds?: string[]\n categoryTopicIds?: string[]\n locale: string\n sanitizeFunction?: (h: string) => string\n // admin only\n introUrl?: string\n bannerUrl?: string | File\n scheduleTime?: string\n}) => {\n const bodyFormData = new FormData()\n const submitDescription = removeBannedWordWrapper(description)\n const submitTitle = removeBannedWordWrapper(title)\n const mentionIds = getMentionIdsFromString(submitDescription)\n\n bodyFormData.append('title', submitTitle)\n bodyFormData.append(\n 'description',\n encodePostContent(submitDescription, sanitizeFunction),\n )\n if (categoryCommunityId) {\n bodyFormData.append('category_community', String(categoryCommunityId))\n } else if (communityId) {\n bodyFormData.append('community_id', String(communityId))\n }\n\n previewUrl?.title && bodyFormData.append('preview_title', previewUrl.title)\n previewUrl?.description &&\n bodyFormData.append('preview_description', previewUrl.description)\n previewUrl?.url && bodyFormData.append('preview_link', previewUrl.url)\n previewUrl?.image && bodyFormData.append('preview_image', previewUrl.image)\n\n topicIds?.forEach((topicId) => {\n bodyFormData.append('topics[]', String(topicId || ''))\n })\n categoryTopicIds?.forEach((topicId) => {\n bodyFormData.append('category_topics[]', String(topicId || ''))\n })\n if (!!imageFiles?.length) {\n const imageSrcs = await Promise.all(\n imageFiles.map(\n (file, index) =>\n new Promise<string>((resolve) => {\n setTimeout(() => {\n resolve(uploadAndGetSrc(file, locale))\n }, index * 2000)\n }),\n ),\n )\n imageSrcs\n ?.filter(Boolean)\n .slice(0, MAX_IMAGE_UPLOADS)\n .forEach((imageFile, index) => {\n bodyFormData.append(`images[${index}]`, imageFile)\n })\n } else {\n bodyFormData.append(`images`, '')\n }\n mentionIds?.forEach((mentionId) => {\n bodyFormData.append(`mention_ids[]`, mentionId)\n })\n\n // Admin only\n bodyFormData.append('intro_url', introUrl || '')\n bodyFormData.append('banner', bannerUrl || '')\n if (scheduleTime) {\n bodyFormData.append('post_type', 'scheduled')\n bodyFormData.append('schedule_datetime', scheduleTime)\n }\n return bodyFormData\n}\n\nexport const createPost = async ({\n locale,\n formData,\n isArticleComment,\n}: {\n locale: string\n formData: FormData\n isArticleComment?: boolean\n}) => {\n const res = await callApiWithAuth(\n getApiPath(\n isArticleComment ? PATHS.POST.CREATE_ARTICLE_COMMENT : PATHS.POST.CREATE,\n {\n _locale: locale,\n },\n ),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n return res\n}\n\nexport const editPost = async ({\n id,\n locale,\n formData,\n}: {\n id: number | string\n locale: string\n formData: FormData\n}) => {\n const res = await callApiWithAuth(\n getApiPath(PATHS.POST.UPDATE, {\n id,\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n },\n )\n return res\n}\n\nexport const followUnfollowPost = ({\n id,\n locale,\n}: {\n id: number | string\n locale: string\n followValue?: boolean\n}) => {\n return callApiWithAuth(\n getApiPath(PATHS.POST.FOLLOW, {\n id,\n _locale: locale,\n }),\n 'GET',\n )\n}\n\nexport const reportPost = ({\n id,\n reason,\n locale,\n}: {\n id: number | string\n reason: string\n locale: string\n}) => {\n const formData = new FormData()\n formData.append('reason', reason)\n return callApiWithAuth(\n getApiPath(PATHS.POST.REPORT, {\n _locale: locale,\n id,\n }),\n 'POST',\n {\n data: formData,\n },\n )\n}\n","import { ChangeEvent, useMemo, useState } from 'react'\nexport const useImagePicker = (\n imageFilesProp?: (File | string)[],\n onImageFilesChange?: (f: (File | string)[]) => void,\n) => {\n const [imageFiles, setImageFiles] = useState<(File | string)[]>(\n imageFilesProp || [],\n )\n const imageSrcs = useMemo(\n () =>\n (imageFilesProp || imageFiles).map((file) =>\n typeof file === 'string' ? file : URL.createObjectURL(file),\n ),\n [imageFilesProp, imageFiles],\n )\n const onSelectImages = (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files) {\n if (onImageFilesChange && imageFilesProp) {\n const _files = imageFilesProp || imageFiles\n onImageFilesChange(_files.concat(Array.from(files)))\n } else\n setImageFiles((imgs) => {\n const _imgs = imageFilesProp || imgs\n onImageFilesChange &&\n onImageFilesChange(_imgs.concat(Array.from(files)))\n return _imgs.concat(Array.from(files))\n })\n }\n }\n const onRemoveImage = (index: number) => {\n if (onImageFilesChange && imageFilesProp) {\n const _files = imageFilesProp\n _files.splice(index, 1)\n onImageFilesChange(_files.slice())\n } else {\n setImageFiles((imgs) => {\n const _imgs = imageFilesProp || imgs\n _imgs.splice(index, 1)\n onImageFilesChange && onImageFilesChange(_imgs.slice())\n return _imgs.slice()\n })\n }\n }\n const onRemoveAllImages = () => {\n onImageFilesChange ? onImageFilesChange([]) : setImageFiles([])\n }\n\n return {\n onSelectImages,\n onRemoveImage,\n onRemoveAllImages,\n imageSrcs,\n imageFiles: imageFilesProp || imageFiles,\n }\n}\n","import React, { CSSProperties, useEffect, useRef, useState } from 'react'\n\nimport { Text } from 'components/atoms'\nimport { useImagePicker } from 'hooks/useImagesPicker'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { theme } from 'misc/theme'\nimport { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport IconAlertCircleWarning from '../../../assets/svg/icon-alert-circle-warning.svg'\nimport IconCloseCircle from '../../../assets/svg/icon-close-circle.svg'\nimport { CardLink } from '../../atoms/cardLink'\nimport { Loading } from '../../atoms/loading'\nimport { RichTextEditor } from './editor'\nimport { StyledCreatePostDescription } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n bannedWords?: string[]\n value?: string\n onChange?: (v: string) => void\n onPreviewUrlChange?: (\n v: {\n title: string\n url: string\n image: string\n description: string\n } | null,\n ) => void\n onInvalidUrlsChange?: (v: string[]) => void\n imageFiles?: (File | string)[]\n onImageFilesChange?: (v: (File | string)[]) => void\n isReplying?: boolean\n}\n\nexport const CreatePostDescription = ({\n className,\n style,\n bannedWords = [],\n value,\n onChange,\n onPreviewUrlChange,\n onInvalidUrlsChange,\n onImageFilesChange,\n imageFiles: imageFilesProp,\n isReplying,\n}: Props) => {\n const { t } = useTranslations()\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n rawUrl?: string\n description?: string\n isFetching?: boolean\n } | null>(null)\n const imagePicker = useRef<HTMLInputElement>(null)\n\n const {\n onSelectImages,\n onRemoveImage,\n imageSrcs,\n // imageFiles,\n } = useImagePicker(imageFilesProp, onImageFilesChange)\n\n useEffect(() => {\n if (onPreviewUrlChange) {\n if (previewUrl?.url)\n onPreviewUrlChange({\n title: previewUrl.title || '',\n url: previewUrl.url || '',\n image: previewUrl.image || '',\n description: previewUrl.description || '',\n })\n else onPreviewUrlChange(null)\n }\n }, [previewUrl])\n\n return (\n <StyledCreatePostDescription className={className} style={style}>\n <Text size=\"p4\" className=\"description-label\">\n {t('createPost.popup.description')}\n </Text>\n <div className={`textarea-control`}>\n <div className=\"textarea-wrapper\">\n <RichTextEditor\n html={value || ''} // innerHTML of the editable div\n onChange={onChange}\n bannedWords={bannedWords}\n onImagePickerClick={() => imagePicker.current?.click()}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={onInvalidUrlsChange}\n isReplying={isReplying}\n />\n </div>\n {/* <div className=\"control-tool\">\n <div\n className=\"tool-button\"\n color=\"transparent\"\n onClick={() => imagePicker.current?.click()}\n >\n <img className=\"image-icon\" src=\"./svg/icon-image-input.svg\" />\n </div>\n </div> */}\n </div>\n <Text size=\"p4\" className=\"count-string\">\n {t('character')}: {innertext(value || '').length}\n </Text>\n {(!imageSrcs || imageSrcs.length === 0) && previewUrl && (\n <div className=\"link-preview-wrapper\">\n {previewUrl.isFetching ? (\n <Loading />\n ) : (\n <>\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url || '#'}\n image={previewUrl.image}\n noRefetch\n />\n <img\n src={IconCloseCircle}\n className=\"icon-close\"\n onClick={() => setPreviewUrl(null)}\n />\n </>\n )}\n </div>\n )}\n <input\n ref={imagePicker}\n type=\"file\"\n accept=\"image/png, image/gif, image/jpeg\"\n multiple={true}\n style={{ display: 'none' }}\n onChange={onSelectImages}\n />\n {imageSrcs.length > MAX_IMAGE_UPLOADS ? (\n <div className=\"input-notification\">\n <img src={IconAlertCircleWarning} />\n <Text size=\"p4\" color={theme.colors.alertWarning}>\n {t(`createPost.popup.warningImage`)}\n </Text>\n </div>\n ) : null}\n {imageSrcs.length > 0 && (\n <div className=\"image-gallery\">\n {imageSrcs.map((src, i) => (\n <div key={i} className=\"image-item\">\n <img src={src} />\n <img\n className=\"close-btn\"\n src={IconCloseCircle}\n onClick={() => onRemoveImage(i)}\n />\n </div>\n ))}\n </div>\n )}\n </StyledCreatePostDescription>\n )\n}\n","import React, {\n CSSProperties,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Input } from 'components/atoms/input'\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport debounce from 'lodash/debounce'\nimport ContentEditable from 'react-contenteditable'\n\nimport { highlightBadWords } from '../../../utils/post'\nimport { StyledCreatePostTitle } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n bannedWords?: string[]\n value?: string\n onChange?: (v: string) => void\n}\n\nconst TITLE_LIMIT = 120\n\nconst inputModify = (\n value: string,\n opts?: { limit?: number; bannedWords?: string[] },\n) => {\n if (!opts) return value\n const { limit, bannedWords = [] } = opts\n const shorten =\n typeof limit === 'number' && limit >= 0 ? value.substring(0, limit) : value\n const processedValue = highlightBadWords(shorten, bannedWords)\n return processedValue\n}\nexport const CreatePostTitle = ({\n className,\n style,\n bannedWords = [],\n value,\n onChange,\n}: Props) => {\n const { t } = useTranslations()\n const [titleValue, setTitleValue] = useState('')\n const titleRef = useRef<HTMLElement>(null)\n\n useEffect(() => {\n if (titleRef.current) {\n const pasteHandler = (e: ClipboardEvent) => {\n e.preventDefault()\n const text = e.clipboardData?.getData('text/plain')\n document.execCommand('insertHTML', false, text)\n }\n const contentDiv = titleRef.current\n contentDiv.addEventListener('paste', pasteHandler)\n return () => contentDiv.removeEventListener('paste', pasteHandler)\n }\n }, [titleRef])\n const bannedString = bannedWords?.join(',') || ''\n\n useEffect(() => {\n if (bannedString) {\n const titleText = titleRef.current?.innerText\n if (titleText) {\n const titleValueWithBanned = highlightBadWords(titleText, bannedWords)\n if (titleValueWithBanned !== titleText) {\n onChange && onChange(titleValueWithBanned)\n setTitleValue(titleValueWithBanned)\n }\n }\n }\n }, [bannedString])\n\n const debounceInputModify = useCallback(\n debounce((v: string) => {\n if (titleRef.current) {\n const shortenString = inputModify(titleRef.current.innerText, {\n limit: TITLE_LIMIT,\n bannedWords,\n })\n onChange && onChange(shortenString)\n setTitleValue(shortenString)\n }\n }, 300),\n [],\n )\n\n useEffect(() => {\n setTimeout(() => {\n titleRef.current?.focus()\n }, 500)\n }, [])\n\n return (\n <StyledCreatePostTitle className={className} style={style}>\n <Input\n name=\"title\"\n value={value || titleValue}\n size=\"md\"\n label={t('createPost.title')}\n CustomInput={\n <ContentEditable\n innerRef={titleRef}\n html={value || titleValue} // innerHTML of the editable div\n onChange={(evt) => {\n if (\n titleRef.current &&\n titleRef.current.innerText !== (value || titleValue)\n ) {\n const initialValue = inputModify(titleRef.current.innerText, {\n bannedWords,\n })\n onChange && onChange(initialValue)\n setTitleValue(initialValue)\n debounceInputModify(titleRef.current.innerText)\n }\n }} // handle innerHTML change\n className=\"title-input\"\n />\n }\n />\n <Text size=\"p4\" className=\"count-string\">\n {t('createPost.popup.wordCount', {\n count: titleRef.current?.innerText.length || 0,\n max: TITLE_LIMIT,\n })}\n </Text>\n </StyledCreatePostTitle>\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { formatTopic } from '../../../api/dataTransform'\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { Topic, TopicApi } from '../../../interfaces/types'\nimport { Loading } from '../../atoms/loading'\nimport { StyledTopicSelectList } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n communityId?: number\n isLoading?: boolean\n topics?: Topic[]\n forceTopics?: Topic[]\n selectedTopics?: Topic[]\n disabled?: boolean\n onChange?: (v: Topic[]) => void\n noFetch?: boolean\n}\nexport const TopicSelectList = ({\n className,\n style,\n topics: topicsProp,\n communityId,\n onChange,\n isLoading,\n disabled,\n forceTopics,\n selectedTopics: selectedTopicsProp,\n noFetch,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const [topics, setTopics] = useState<Topic[]>(\n topicsProp ? [...topicsProp] : [],\n )\n const [selectedTopics, setSelectedTopics] = useState<Topic[]>(\n selectedTopicsProp ? [...selectedTopicsProp] : [],\n )\n const [isLoadingTopics, setIsLoadingTopics] = useState<boolean>(false)\n const topicsPropRef = useRef(topicsProp)\n topicsPropRef.current = topicsProp\n useEffect(() => {\n if (communityId && !noFetch && !topicsPropRef.current?.length) {\n setTopics([])\n setIsLoadingTopics(true)\n ;(async () => {\n try {\n const res = await callApi(\n getApiPath(PATHS.TOPIC.LIST, {\n communityId: communityId,\n _locale: locale,\n }),\n 'GET',\n )\n\n const topicRes: TopicApi[] | undefined = res?.data?.topics\n if (Array.isArray(topicRes)) {\n setTopics(\n () =>\n topicRes\n ?.map<Topic>(formatTopic)\n .sort(\n (t1: Topic, t2: Topic) => (t1.order || 0) - (t2.order || 0),\n ) || [],\n )\n }\n } catch (e) {\n console.log(e)\n setIsLoadingTopics(false)\n }\n setIsLoadingTopics(false)\n })()\n }\n }, [communityId, noFetch])\n const topicsPropString = topicsProp?.map((t) => t.id).join('-')\n const topicsStateString = topics?.map((t) => t.id).join('-')\n const forceTopicsPropString = forceTopics?.map((t) => t.id).join('-')\n useEffect(() => {\n if (\n topicsProp &&\n typeof topicsPropString !== 'undefined' &&\n topicsPropString !== topicsStateString\n ) {\n setTopics(topicsProp)\n }\n }, [topicsProp, topicsPropString, topicsStateString])\n const topicsWithoutForced = useMemo(\n () =>\n topics.filter(\n (t) =>\n !forceTopics?.some(\n (ft) =>\n (ft.id && ft.id === t.id) ||\n (ft.mappedCategoryId &&\n ft.mappedCategoryId === t.mappedCategoryId),\n ),\n ),\n [topicsStateString, forceTopicsPropString],\n )\n return (\n <StyledTopicSelectList\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n >\n {forceTopics.map((topic) => (\n <TopicItem\n key={`${topic.id}-${topic.mappedCategoryId}`}\n topic={topic}\n disabled\n selected\n ></TopicItem>\n ))}\n {topicsWithoutForced.map((topic) => (\n <TopicItem\n key={`${topic.id}-${topic.mappedCategoryId}`}\n topic={topic}\n disabled={disabled}\n selected={(selectedTopicsProp || selectedTopics).some(\n (t) =>\n (t.id && t.id === topic.id) ||\n (t.mappedCategoryId &&\n t.mappedCategoryId === topic.mappedCategoryId),\n )}\n onClick={() => {\n const _selected = selectedTopicsProp || selectedTopics\n const foundIndex = _selected.findIndex(\n (_selected) =>\n (_selected.id && _selected.id === topic.id) ||\n (_selected.mappedCategoryId &&\n _selected.mappedCategoryId === topic.mappedCategoryId),\n )\n if (foundIndex !== -1) {\n _selected.splice(foundIndex, 1)\n } else {\n _selected.push(topic)\n }\n if (onChange && selectedTopicsProp) {\n onChange(_selected.slice())\n } else {\n onChange && onChange(_selected.slice())\n setSelectedTopics(_selected.slice())\n }\n }}\n ></TopicItem>\n ))}\n {(isLoading || isLoadingTopics) && <Loading className=\"topic-spinner\" />}\n </StyledTopicSelectList>\n )\n}\n\nconst TopicItem = ({\n topic,\n disabled,\n selected,\n onClick,\n}: {\n topic: Topic\n disabled?: boolean\n selected?: boolean\n onClick?: () => void\n}) => (\n <div\n className={'tag-item' + (selected ? ' --active' : '')}\n data-disabled={disabled}\n onClick={!disabled ? onClick : undefined}\n >\n {topic.name}\n </div>\n)\n","import React, { CSSProperties, useContext, useEffect, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Heading } from 'components/atoms/heading'\nimport { Text } from 'components/atoms/text'\nimport { toggleNoScroll } from 'misc/utils'\nimport * as ReactDOM from 'react-dom'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PopupFrame } from '../popupFrame/index'\nimport { StyledPopupDanger } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n isMarryBaby?: boolean\n title?: string\n description?: string\n acceptText?: string\n cancelText?: string\n onAccept?: () => void\n thumbnail?: string\n isThumbnailIcon?: boolean\n onClose?: () => void\n}\n\nexport const PopupDanger = ({\n className,\n isMarryBaby: isMarryBabyProp,\n style,\n title,\n description,\n acceptText,\n cancelText,\n onAccept,\n thumbnail,\n isThumbnailIcon,\n onClose,\n}: Props) => {\n const {\n data: {\n env: { isMarryBaby: isMarryBabyContext },\n },\n } = useContext(TogetherComponentGlobalContext)\n const isMarryBaby =\n typeof isMarryBabyProp === 'boolean' ? isMarryBabyProp : isMarryBabyContext\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n toggleNoScroll(true)\n setTimeout(() => setIsOpen(true), 0)\n return () => toggleNoScroll(false)\n }, [])\n return ReactDOM.createPortal(\n <StyledPopupDanger\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n data-open={isOpen}\n >\n <PopupFrame className=\"popup-frame\" isOpen={isOpen} onClose={onClose}>\n <div className=\"confirm-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"confirm-content\">\n {thumbnail && (\n <div\n className={`thumbnail-container ${\n isThumbnailIcon ? 'is-icon' : ''\n }`}\n >\n <img className=\"thumbnail\" src={thumbnail} />\n </div>\n )}\n <Heading className=\"title\" tag=\"h2\">\n {title}\n </Heading>\n <Text className=\"desc\" size=\"lg\">\n {description}\n </Text>\n <div className=\"btn-group\">\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n size=\"md\"\n color=\"secondary\"\n onClick={() => {\n onAccept?.()\n onClose?.()\n }}\n >\n {acceptText}\n </Button>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n size=\"md\"\n onClick={onClose}\n >\n {cancelText}\n </Button>\n </div>\n </div>\n </div>\n {isMarryBaby && thumbnail && (\n <div\n className={`thumbnail-container is-mobile ${\n isThumbnailIcon ? 'is-icon' : ''\n }`}\n >\n <img className=\"thumbnail\" src={thumbnail} />\n </div>\n )}\n </PopupFrame>\n </StyledPopupDanger>,\n document.body,\n )\n}\n","import { MAX_IMAGE_UPLOADS } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../api/utils'\nimport {\n encodePostContent,\n getMentionIdsFromString,\n uploadAndGetSrc,\n} from '../post'\n\nexport const BANNED_STATUS = ['SYSTEM_WITHHELD', 'PREMOD', 'REJECTED']\nexport const BANNED_MESSAGE_INTL_ID: { [key: string]: string } = {\n SYSTEM_WITHHELD: 'notification.comment.systemWithheld',\n PREMOD: 'notification.comment.premod',\n REJECTED: 'notification.comment.rejected',\n}\n\nexport const getCommentFormBody = async ({\n postId,\n message,\n photos,\n link,\n locale,\n sanitizeFunction,\n\n replyingUserId,\n replyingUserName,\n replyingId,\n}: {\n locale: string\n postId: string\n message: string\n photos?: File[]\n link?: string\n sanitizeFunction?: (text: string) => string\n\n replyingId?: string\n replyingUserId?: string\n replyingUserName?: string\n}) => {\n const formData = new FormData()\n let submitText = encodePostContent(\n message.replace(/(\\ )+/g, ' '),\n sanitizeFunction,\n )\n const mentionIds = getMentionIdsFromString(submitText)\n if (photos && photos.length > 0) {\n const imageSrcs = await Promise.all(\n photos?.map((file) => uploadAndGetSrc(file, locale)),\n )\n imageSrcs\n .filter(Boolean)\n .slice(0, MAX_IMAGE_UPLOADS)\n .forEach((photo) => {\n formData.append('images[]', photo)\n })\n }\n if (link) formData.append('link', link)\n mentionIds?.forEach((mentionId) => {\n formData.append(`mention_ids[]`, mentionId)\n })\n formData.append('post_id', postId)\n\n replyingId && formData.append('parent_id', replyingId)\n if (replyingUserId) {\n mentionIds.unshift(replyingUserId)\n submitText = `[mention+id=\"${replyingUserId}\"+name=\"${(\n replyingUserName || ''\n ).replace('\"', \"'\")}\"]${submitText}`\n formData.append('parent_user_id', String(replyingUserId))\n }\n formData.append('content', submitText)\n formData.append('content', submitText)\n\n return formData\n}\n\nexport const submitComment = async (\n formData: FormData,\n locale: string,\n): Promise<any | null> => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.CREATE, {\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n}\n\nexport type CommentBodyData = {\n text: string\n replyingTo?: string\n}\n\nexport const decodeCommentBody = (s: string): CommentBodyData => {\n try {\n const authorRegex = s.match(/\\[@([^\\]]+)\\]/)\n const replyingTo = authorRegex\n ? authorRegex[0].replace('[@', '').replace(']', '')\n : ''\n const text = s.replace(/\\[@([^\\]]+)\\]/, '')\n return {\n text: text.trim(),\n replyingTo,\n }\n } catch (e) {}\n return {\n text: '',\n }\n}\n\nexport const submitReply = async (\n formData: FormData,\n locale: string,\n): Promise<any | null> => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.REPLY, {\n _locale: locale,\n }),\n 'POST',\n {\n data: formData,\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n )\n}\n\nexport const likeUnlikeComment = async ({\n commentId,\n setLike = false,\n locale,\n}: {\n commentId: string\n setLike?: boolean\n locale: string\n}) => {\n return callApiWithAuth(\n getApiPath(setLike ? PATHS.COMMENT.LIKE : PATHS.COMMENT.UNLIKE, {\n _locale: locale,\n id: commentId,\n }),\n 'GET',\n )\n}\n\nexport const deleteComment = ({\n id,\n locale,\n}: {\n id: string\n locale: string\n}) => {\n return callApiWithAuth(\n getApiPath(PATHS.COMMENT.DELETE, {\n _locale: locale,\n id: id,\n }),\n 'DELETE',\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Input } from 'components/atoms/input'\nimport { Text } from 'components/atoms/text'\nimport { useImagePicker } from 'hooks/useImagesPicker'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { formatComment } from '../../../api/dataTransform'\nimport IconCloseCircleLine from '../../../assets/svg/icon-close-circle-line.svg'\nimport IconCloseCircle from '../../../assets/svg/icon-close-circle.svg'\nimport IconEnter from '../../../assets/svg/icon-enter.svg'\nimport IconTabEditPrimary from '../../../assets/svg/icon-tab-edit-primary.svg'\nimport { DEFAULT_AVATAR_IMG } from '../../../interfaces/constants'\nimport { Comment, Post, UserInfo } from '../../../interfaces/types'\nimport {\n getCommentFormBody,\n submitComment,\n submitReply,\n} from '../../../utils/apiActions/comment'\nimport { CardLink } from '../../atoms/cardLink'\nimport { Loading } from '../../atoms/loading'\nimport { UserAvatar } from '../../atoms/userAvatar'\nimport { RichTextEditor } from '../createPostDescription/editor'\nimport { StyledInputCommentBar } from './index.styled'\nimport { MainInputTriggerContext } from './mainInputTriggerContext'\n\nexport type Props = {\n className?: string\n onClose?: () => void\n replyToName?: string\n replyToUrl?: string\n replyingId?: string\n replyingUser?: UserInfo\n replyingUserExpertId?: string\n style?: CSSProperties\n onPostSuccess?: (c: Comment) => void\n isMainCmt?: boolean\n post?: Post\n isReply?: boolean\n isMarryBaby?: boolean\n}\nconst InputCommentBar = ({\n isReply,\n className,\n onClose,\n replyToName,\n style,\n replyingId,\n replyingUser,\n onPostSuccess,\n isMainCmt = false,\n post,\n isMarryBaby: isMarryBabyProp,\n}: Props) => {\n const {\n action: { pushNotifications, sanitizeFunction },\n data: {\n userInfo,\n locale,\n env: { isMarryBaby: isMarryBabyContext },\n },\n } = useContext(TogetherComponentGlobalContext)\n const isMarryBaby =\n typeof isMarryBabyProp === 'boolean' ? isMarryBabyProp : isMarryBabyContext\n const { t } = useTranslations()\n\n const {\n onSelectImages,\n onRemoveImage,\n imageSrcs,\n onRemoveAllImages,\n imageFiles,\n } = useImagePicker()\n const [text, setText] = useState<string>('')\n const { trigger } = useContext(MainInputTriggerContext)\n const [isSubmitLoading, setIsSubmitLoading] = useState<boolean>(false)\n const imagePicker = useRef<HTMLInputElement>(null)\n const contentEditable = useRef<HTMLElement | null>(null)\n const mainInput = useRef<HTMLDivElement>(null)\n\n const [invalidUrls, setInvalidUrls] = useState<string[]>([])\n const [bannedWords, setBannedWords] = useState<string[]>([])\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n rawUrl?: string\n description?: string\n isFetching?: boolean\n } | null>(null)\n\n const onSubmitComment = async () => {\n if (!post?.id || isSubmitLoading) return\n setIsSubmitLoading(true)\n try {\n const handleSuccess = (res: any) => {\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n const newComment = formatComment(res.data)\n if (typeof newComment.images === 'string') {\n newComment.images = JSON.parse(newComment.images)\n }\n onPostSuccess && onPostSuccess(newComment)\n }\n\n const formBody = await getCommentFormBody({\n message: text,\n photos: imageFiles as File[],\n\n postId: String(post.id),\n link: previewUrl?.url,\n sanitizeFunction,\n locale,\n ...(isReply && replyingId\n ? {\n replyingUserId: String(\n replyingUser?.id || post?.author?.id || '',\n ),\n replyingId,\n replyingUserName:\n replyingUser?.name || replyingUser?.username || '',\n }\n : {}),\n })\n\n const res = await (isReply && replyingId\n ? submitReply(formBody, locale)\n : submitComment(formBody, locale))\n\n const resData = res?.data\n if (resData?.id && !res?.messages?.moderation?.type) {\n handleSuccess(res)\n } else {\n if (res?.messages?.moderation?.type === 'banned') {\n pushNotifications({\n title: t('notification.comment.blocked.title'),\n message: t('notification.comment.blocked.message'),\n type: 'danger',\n })\n if (res.messages.moderation.words) {\n setBannedWords(res.messages.moderation.words)\n }\n } else if (res?.messages?.moderation?.type === 'suspect') {\n pushNotifications({\n title: t('notification.comment.suspect.title'),\n message: t('notification.comment.suspect.message'),\n type: 'warning',\n })\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n } else if (\n res?.messages?.find((m: string) => !!m?.includes?.('suspend'))\n ) {\n pushNotifications({\n message: t('notification.suspend.message'),\n type: 'warning',\n })\n setText('')\n onRemoveAllImages()\n onClose && onClose()\n } else {\n pushNotifications({\n title: '',\n message:\n res?.messages?.[0] || t('notification.comment.somethingWrong'),\n type: 'danger',\n })\n }\n }\n } catch (e) {\n pushNotifications({\n title: '',\n message: t('notification.comment.somethingWrong'),\n type: 'danger',\n })\n }\n setIsSubmitLoading(false)\n }\n\n useEffect(() => {\n mainInput.current?.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n })\n setTimeout(() => {\n contentEditable.current?.focus()\n }, 400)\n }, [trigger])\n\n return (\n <StyledInputCommentBar\n data-is-reply={isReply}\n className={className}\n style={style}\n >\n {isReply && (\n <div className=\"reply-to-container\">\n <Text size=\"p4\">\n <span\n dangerouslySetInnerHTML={{\n __html: t('inputComment.replyTo', {\n name: `<span style=\"color: #2D87F3; cursor: pointer\">@${\n replyToName || ''\n }</span>`,\n }),\n }}\n ></span>\n </Text>\n <img\n src={IconCloseCircleLine}\n className=\"icon-close-comment\"\n onClick={() => onClose && onClose()}\n />\n </div>\n )}\n <div className=\"input-container\" ref={mainInput}>\n <UserAvatar\n className={`avatar-wrapper ${isReply ? 'avatar-wrapper-reply' : ''}`}\n avatar={userInfo?.id ? userInfo.avatar : DEFAULT_AVATAR_IMG}\n username={userInfo?.name || userInfo?.username}\n />\n <input\n ref={imagePicker}\n onChange={onSelectImages}\n type=\"file\"\n multiple\n accept=\"image/png,image/jpeg\"\n name=\"images\"\n style={{ display: 'none' }}\n />\n <Input\n // actionIcon={\n // !isPost ? (\n // <label className=\"images-input-label\">\n // <img\n // className=\"icon-images-input\"\n // src=\"./svg/icon-image-input.svg\"\n // />\n // <input\n // onChange={onSelectImages}\n // type=\"file\"\n // multiple\n // accept=\"image/png,image/jpeg\"\n // name=\"images\"\n // style={{ display: 'none' }}\n // />\n // </label>\n // ) : undefined\n // }\n value={text}\n name=\"input\"\n size=\"md\"\n className=\"input-wrapper\"\n displayIcon={<img src={IconTabEditPrimary} />}\n CustomInput={\n <div className=\"as-input\">\n <RichTextEditor\n className=\"textarea\"\n html={text}\n onChange={setText}\n onImagePickerClick={() => imagePicker.current?.click()}\n bannedWords={bannedWords}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={setInvalidUrls}\n setEditorRef={(div) => (contentEditable.current = div)}\n isReplying={isReply}\n />\n </div>\n }\n ></Input>\n\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"send-button\"\n size=\"sm\"\n onClick={onSubmitComment}\n isLoading={isSubmitLoading}\n isDisabled={\n !!invalidUrls?.length ||\n isSubmitLoading ||\n !text ||\n text?.length < 2 ||\n !text.trim()\n }\n >\n <img src={IconEnter} className=\"icon-enter\" />\n </Button>\n </div>\n {!!invalidUrls?.length ? (\n <div className=\"error-text\">{t('notification.limitUrlDomain')}</div>\n ) : null}\n {(!imageSrcs || imageSrcs.length === 0) && previewUrl && (\n <div className=\"link-preview-wrapper\">\n {previewUrl.isFetching ? (\n <Loading />\n ) : (\n <>\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url || '#'}\n image={previewUrl.image}\n noRefetch\n />\n <img\n src={IconCloseCircle}\n className=\"icon-close\"\n onClick={() => setPreviewUrl(null)}\n />\n </>\n )}\n </div>\n )}\n {imageSrcs && imageSrcs.length > 0 && (\n <div className=\"preview-images-container\">\n {imageSrcs.map((src, index) => (\n <div key={index} className=\"image-src-wrapper\">\n <img className=\"preview-image\" src={src} />\n <img\n src={IconCloseCircle}\n className=\"icon-close-circle\"\n onClick={() => onRemoveImage(index)}\n />\n </div>\n ))}\n </div>\n )}\n </StyledInputCommentBar>\n )\n}\n\nexport { InputCommentBar }\n","import React, { useContext, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { theme } from 'misc/theme'\nimport { CSSProperties } from 'styled-components'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport IconAlertCircle from '../../../assets/svg/icon-alert-circle.svg'\nimport { reportPost } from '../../../utils/apiActions/post'\nimport { StyledSubmitReportForm } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n reason: string\n reasonText: string\n postId?: number\n onClose?: () => void\n}\n\nexport const SubmitReportForm = ({\n className,\n style,\n reason,\n reasonText,\n onClose,\n postId,\n}: Props) => {\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [loading, setLoading] = useState(false)\n return (\n <StyledSubmitReportForm\n data-is-marrybaby={isMarryBaby}\n className={className}\n style={style}\n >\n <ul className=\"report-list\">\n <li className=\"report-item\">\n <img src={IconAlertCircle} />\n <Text className=\"__label\" color={theme.colors.gray800} size=\"p4\">\n {reasonText}\n </Text>\n </li>\n </ul>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"report-submit\"\n size=\"lg\"\n color=\"primary\"\n isLoading={loading}\n onClick={async () => {\n if (!postId || loading) return\n setLoading(true)\n try {\n const res = await reportPost({\n id: postId,\n reason,\n locale,\n })\n if (res?.status === 1) {\n pushNotifications({\n message: 'Post reported',\n type: 'success',\n })\n onClose && onClose()\n }\n } catch {}\n setLoading(false)\n }}\n >\n {t('submit')}\n </Button>\n </StyledSubmitReportForm>\n )\n}\n","import React, { CSSProperties, useContext, useMemo, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { UserInfo } from 'together/interfaces/types'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { decodeMention, decodePostUrl } from '../../../utils/post'\nimport { PopupExpert } from '../popupExpert'\nimport { StyledPostContent } from './index.styled'\n\nexport type Props = {\n description?: string\n replyingTo?: string\n disableShortenContent?: boolean\n className?: string\n style?: CSSProperties\n mentionedUser?: UserInfo\n mentions?: {\n id: number\n name: string\n }[]\n}\n\nexport const PostContent = ({\n className,\n style,\n replyingTo,\n mentionedUser,\n description: rawDescription,\n disableShortenContent,\n mentions = [],\n}: Props) => {\n const [showAll, setShowAll] = useState(false)\n const { t } = useTranslations()\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n const [openPopupExpert, setOpenPopupExpert] = useState(false)\n const description = decodeMention(\n decodePostUrl(rawDescription || '', 'display'),\n mentions,\n )\n const {\n action: { sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n const shortenSanitizedContentData = useMemo(() => {\n const sanitizedContent = sanitizeFunction(description || '')\n if (disableShortenContent || showAll)\n return {\n showContent: sanitizedContent,\n hasSeeMore: false,\n }\n const firstRound = sanitizedContent.slice(0, 200)\n const newLineCompensateLength =\n 200 - ((firstRound.match(/<\\/div>/g) || []).length - 1) * 27\n const shortenFirstRound = (firstRound || '').slice(\n 0,\n newLineCompensateLength < 40 ? 40 : newLineCompensateLength,\n )\n\n // remove < if we cut off right before start of a new html tag\n const secondRound = sanitizeFunction(\n shortenFirstRound.replace(/(<|<\\/)( +|[a-zA-Z]*)$/gi, ''),\n )\n // don't show see more if not much difference\n const hasSeeMore = secondRound.length < sanitizedContent.length - 10\n return {\n showContent: hasSeeMore ? secondRound : sanitizedContent,\n hasSeeMore,\n }\n }, [disableShortenContent, showAll, description])\n\n const replyName = mentionedUser?.name || replyingTo\n const hasExpert =\n mentionedUser?.role === 'expert' && !!mentionedUser?.partnerId\n return (\n <>\n {hasExpert && (\n <PopupExpert\n isOpen={openPopupExpert}\n onClose={() => setOpenPopupExpert(false)}\n expertId={String(mentionedUser?.partnerId)}\n ></PopupExpert>\n )}\n <StyledPostContent\n className={`${className} no-replace-click`}\n style={style}\n >\n {replyName && (\n <span\n onClick={() => hasExpert && setOpenPopupExpert(true)}\n className=\"post-content-replying\"\n >\n @{replyName}\n </span>\n )}\n {rawDescription?.startsWith('[mention+id=') && (\n <span className=\"post-content-replying tag-only\">@</span>\n )}\n <span\n dangerouslySetInnerHTML={{\n __html: shortenSanitizedContentData.showContent,\n }}\n className={`post-content ${\n shortenSanitizedContentData.hasSeeMore ? 'has-see-more' : ''\n }`}\n ></span>\n {shortenSanitizedContentData.hasSeeMore && !showAll && (\n <span>\n {`... `}\n <span\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n authActionWrapper(() => setShowAll(true))\n }}\n className=\"see-more-text\"\n >\n {t('post.seeMore')}\n </span>\n </span>\n )}\n </StyledPostContent>\n </>\n )\n}\n","import React, { CSSProperties, useEffect, useState } from 'react'\n\nimport { Text } from 'components/atoms/text'\nimport { useTranslations } from 'hooks/useTranslations'\nimport * as ReactDOM from 'react-dom'\n\nimport IconArrowLeft from '../../../assets/svg/icon-arrow-left.svg'\nimport { StyledImagePreviewPopup } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n images: string[]\n authorName: string\n onClose?: () => void\n onOpenSingleView?: (index: number) => void\n}\n\nexport const ImagePreviewPopup = ({\n className,\n style,\n authorName,\n images,\n onClose,\n onOpenSingleView,\n}: Props) => {\n const { t } = useTranslations()\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n setTimeout(() => {\n setIsOpen(true)\n }, 0)\n }, [])\n return ReactDOM.createPortal(\n <StyledImagePreviewPopup\n className={className}\n style={style}\n data-open={isOpen}\n >\n <div className=\"top-bar\">\n <img\n className=\"icon-arrow-left\"\n src={IconArrowLeft}\n onClick={onClose}\n alt=\"go back\"\n ></img>\n <Text\n size=\"p2\"\n type=\"bold\"\n style={{\n textAlign: 'center',\n }}\n >\n {t('previewPhotos.title', {\n name: authorName,\n })}\n </Text>\n </div>\n <div className=\"container\">\n {images.map((image, index) => (\n <img\n className=\"img-preview\"\n key={index}\n src={image}\n onClick={() => onOpenSingleView?.(index)}\n alt=\"post img\"\n />\n ))}\n </div>\n </StyledImagePreviewPopup>,\n document.body,\n )\n}\n","import React, { useEffect, useState } from 'react'\n\nimport * as ReactDOM from 'react-dom'\n\nimport ChevronRightIcon from '../../../../assets/svg/icon-chevron-right-white.svg'\nimport CloseIcon from '../../../../assets/svg/icon-close.svg'\nimport {\n StyledArrowWrapper,\n StyledCircleArrow,\n StyledImagePreviewContainer,\n StyledImagePreviewTopbar,\n StyledImagePreviewWrapper,\n} from './index.styled'\n\nexport type Props = {\n images: string[]\n initialViewIndex: number\n onClose?: () => void\n}\nexport const PostSingleImageViewPopup = ({\n initialViewIndex,\n images,\n onClose,\n}: Props) => {\n const [viewIndex, setViewIndex] = useState(initialViewIndex)\n const [isOpen, setIsOpen] = useState(false)\n useEffect(() => {\n setTimeout(() => {\n setIsOpen(true)\n }, 0)\n }, [])\n const previewImg = images?.[viewIndex]\n const leftDisabled = viewIndex === 0\n const rightDisabled = !images?.length || viewIndex === images?.length - 1\n return ReactDOM.createPortal(\n <StyledImagePreviewContainer data-open={isOpen && !!previewImg}>\n <StyledImagePreviewTopbar>\n <img\n src={CloseIcon}\n className=\"icon-close\"\n onClick={onClose}\n alt=\"close\"\n />\n </StyledImagePreviewTopbar>\n {previewImg && viewIndex >= 0 && (\n <>\n <StyledImagePreviewWrapper>\n <img className=\"img-preview\" src={previewImg} alt=\"post img open\" />\n <StyledArrowWrapper\n data-disabled={leftDisabled}\n onClick={() => !leftDisabled && setViewIndex(viewIndex - 1)}\n >\n <StyledCircleArrow>\n <img\n src={ChevronRightIcon}\n style={{\n transform: 'rotate(180deg)',\n }}\n alt=\"left arrow\"\n data-disabled={leftDisabled}\n />\n </StyledCircleArrow>\n </StyledArrowWrapper>\n <StyledArrowWrapper\n data-right\n data-disabled={rightDisabled}\n onClick={() => !rightDisabled && setViewIndex(viewIndex + 1)}\n >\n <StyledCircleArrow>\n <img\n src={ChevronRightIcon}\n alt=\"right arrow\"\n data-disabled={rightDisabled}\n />\n </StyledCircleArrow>\n </StyledArrowWrapper>\n </StyledImagePreviewWrapper>\n </>\n )}\n </StyledImagePreviewContainer>,\n document.body,\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { Heading } from 'components/atoms/heading'\nimport { lazyLoadInstance } from 'misc/lazyLoad'\nimport { toggleNoScroll } from 'misc/utils'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { ImagePreviewPopup } from './imagePreviewPopup'\nimport { StyledPostImagePreview } from './index.styled'\nimport { PostSingleImageViewPopup } from './postSingleImageViewPopup'\n\nexport type Props = {\n images?: string[]\n authorName?: string\n className?: string\n style?: CSSProperties\n}\n\nconst PostImagePreview = ({\n className,\n images = [],\n style,\n authorName,\n}: Props) => {\n const {\n data: {\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const moreImageCount = `+ ${(images.length || 0) - 4}`\n const [isOpenImagePreview, setIsOpenImagePreview] = useState(false)\n const [singleImageViewIndex, setSingleImageViewIndex] = useState(-1)\n\n useEffect(() => {\n setTimeout(() => lazyLoadInstance?.update(), 100)\n }, [images?.slice(0, 5).join('|')])\n const hasMore = images.length > 5\n // Check if this component has set no scroll previously and clean it up\n const hasSetNoScroll = useRef(false)\n useEffect(() => {\n return () => {\n if (hasSetNoScroll.current) {\n toggleNoScroll(false)\n }\n }\n }, [])\n useEffect(() => {\n if (isOpenImagePreview || singleImageViewIndex >= 0) {\n toggleNoScroll(true)\n hasSetNoScroll.current = true\n } else {\n toggleNoScroll(false)\n hasSetNoScroll.current = false\n }\n }, [isOpenImagePreview, singleImageViewIndex])\n return (\n <>\n <StyledPostImagePreview\n className={className}\n style={style}\n data-image-count={hasMore ? 5 : images.length || 0}\n data-is-marrybaby={isMarryBaby}\n >\n {images?.slice(0, 5).map((image, index) => (\n <div\n className={`img-wrapper`}\n key={index}\n onClick={() => {\n if (index >= 4 && hasMore) {\n setIsOpenImagePreview(true)\n } else {\n setSingleImageViewIndex(index)\n }\n }}\n >\n {!isMarryBaby && (\n <img className=\"lazy img-preview-blur\" data-src={image} />\n )}\n <img className=\"lazy img-preview\" data-src={image} />\n {index === 4 && hasMore && (\n <div className=\"img-more-overlay\">\n <Heading tag=\"h1\" color=\"white\">\n {moreImageCount}\n </Heading>\n </div>\n )}\n </div>\n ))}\n </StyledPostImagePreview>\n {isOpenImagePreview && (\n <ImagePreviewPopup\n authorName={authorName || ''}\n images={images}\n onClose={() => setIsOpenImagePreview(false)}\n onOpenSingleView={setSingleImageViewIndex}\n />\n )}\n {singleImageViewIndex >= 0 && (\n <PostSingleImageViewPopup\n images={images}\n initialViewIndex={singleImageViewIndex}\n onClose={() => setSingleImageViewIndex(-1)}\n />\n )}\n </>\n )\n}\n\nexport { PostImagePreview }\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApi, getApiPath } from '../../../api/utils'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { facebookVidIdGetter, youtubeVidIdGetter } from '../../../utils/post'\nimport { Loading } from '../../atoms/loading'\nimport { StyledSocialLinkPreview } from './index.styled'\n\nexport type Props = {\n url: string\n image?: string\n className?: string\n style?: CSSProperties\n}\n\nconst SocialLinkPreview = ({ url, image, className, style }: Props) => {\n const {\n data: { locale },\n } = useContext(TogetherComponentGlobalContext)\n\n const [previewData, setPreviewData] = useState<{\n url?: string\n image?: string\n isFetching?: boolean\n } | null>(null)\n useEffect(() => {\n ;(async () => {\n if (image) return\n if (!url) return setPreviewData(null)\n setPreviewData((_data) => ({\n ..._data,\n isFetching: true,\n }))\n\n // fetch('./api/fetch-meta?url=' + encodeURIComponent(url))\n // .then((res) => res.json())\n // .then((res) =>\n // setPreviewData({\n // url,\n // image: res?.image || res?.logo,\n // }),\n // )\n callApi(\n getApiPath(PATHS.FETCH_PREVIEW, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n link: url,\n },\n },\n )\n .then((res) => {\n setPreviewData({\n url,\n image: res?.data?.image || res?.data?.logo,\n })\n })\n .catch(() => {\n setPreviewData(null)\n })\n })()\n }, [url, image])\n\n const displayImage = previewData?.image || image\n const displayUrl = previewData?.url || url\n\n const youtubeVidId = useMemo(() => {\n return youtubeVidIdGetter(displayUrl)\n }, [displayUrl])\n const facebookVidId = useMemo(() => {\n return facebookVidIdGetter(displayUrl)\n }, [displayUrl])\n const responsiveWidth = useRef(0)\n const responsiveHeight = useRef(0)\n const [forceRerenderFB, setForceRerenderFB] = useState(false)\n\n // FACEBOOK Video is not responsive for desktop browser\n // => hack: set size to same as container, if size change too large, re-render facebook iframe with new config\n useEffect(() => {\n const handleResize = () => {\n const containerRect = containerRef.current?.getBoundingClientRect()\n let toChangeSize = false\n if (\n containerRect &&\n (!responsiveWidth.current ||\n Math.abs(\n (responsiveWidth.current - containerRect.width) /\n containerRect?.width,\n ) > 0.2)\n ) {\n responsiveWidth.current = Math.floor(containerRect.width)\n toChangeSize = true\n }\n if (\n containerRect &&\n (!responsiveHeight.current ||\n Math.abs(\n (responsiveHeight.current - containerRect.height) /\n containerRect?.height,\n ) > 0.2)\n ) {\n responsiveHeight.current = Math.floor(containerRect.height)\n toChangeSize = true\n }\n if (toChangeSize) {\n setForceRerenderFB((v) => !v)\n }\n }\n handleResize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n window.removeEventListener('resize', handleResize)\n }\n }, [])\n const containerRef = useRef<HTMLDivElement>(null)\n const showDefaultRef = useRef(false)\n return (\n <StyledSocialLinkPreview\n className={`${className} no-replace-click`}\n style={style}\n ref={containerRef}\n >\n {!image && (youtubeVidId || facebookVidId) ? (\n <div className=\"link-image-wrapper\">\n {youtubeVidId ? (\n <iframe\n width=\"100%\"\n height=\"100%\"\n src={`https://www.youtube.com/embed/${youtubeVidId}?&autoplay=1&mute=1`}\n frameBorder=\"0\"\n allowFullScreen\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n border: 'none',\n overflow: 'hidden',\n }}\n ></iframe>\n ) : facebookVidId ? (\n <iframe\n key={String(forceRerenderFB)}\n src={`https://www.facebook.com/plugins/video.php?href=${encodeURIComponent(\n displayUrl,\n )}&autoplay=1&show_text=false&t=0&width=${\n responsiveWidth.current\n }&height=${responsiveHeight.current}`}\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n border: 'none',\n overflow: 'hidden',\n height: responsiveHeight.current,\n width: responsiveWidth.current,\n transform: 'translate(-50%, -50%)',\n }}\n scrolling=\"no\"\n frameBorder=\"0\"\n allowFullScreen\n allow=\"autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share\"\n ></iframe>\n ) : null}\n </div>\n ) : (\n <a href={displayUrl} target=\"_blank\" rel=\"noreferrer\">\n <div\n className={`link-image-wrapper ${\n previewData?.isFetching ? 'fetching' : ''\n }`}\n >\n {previewData?.isFetching ? (\n <Loading className=\"loading-spinner\" />\n ) : (\n <img\n className=\"link-image\"\n src={displayImage || DEFAULT_IMG}\n onError={(e) => {\n if (!showDefaultRef.current) {\n showDefaultRef.current = true\n e.currentTarget.src = DEFAULT_IMG\n }\n }}\n />\n )}\n </div>\n </a>\n )}\n </StyledSocialLinkPreview>\n )\n}\n\nexport { SocialLinkPreview }\n","import React, { useContext, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\n\nimport MBMoreSolid from '../../../assets/marrybaby/svg/moreSolid.svg'\nimport IconDelete from '../../../assets/svg/delete.svg'\nimport IconKebab from '../../../assets/svg/icon-kebab.svg'\nimport IconTrashBin from '../../../assets/svg/icon-trash-bin.svg'\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { deleteComment } from '../../../utils/apiActions/comment'\nimport { PopupDanger } from '../../molecules/popupDanger'\nimport { TreePopoverMenu } from '../popoverMenu/treePopoverMenu'\n\nexport const CardReplyPopover = ({\n onDeleteComment,\n commentId,\n className = '',\n popoverClassName = '',\n}: {\n className?: string\n popoverClassName?: string\n onDeleteComment?: () => void\n commentId: string\n}) => {\n const {\n data: {\n env: { isMarryBaby },\n locale,\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [isOpenLeavePopup, setIsOpenLeavePopup] = useState(false)\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n return (\n <div\n className={className}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n {isOpenLeavePopup && (\n <PopupDanger\n thumbnail={IconDelete}\n isThumbnailIcon={true}\n title={t('popup.deleteComment.title')}\n description={t('popup.deleteComment.description')}\n acceptText={t('popup.deletePost.accept')}\n cancelText={t('popup.deletePost.cancel')}\n onAccept={async () => {\n if (!commentId) return\n const res = await deleteComment({ id: commentId, locale })\n if (res?.status === 1) {\n onDeleteComment && onDeleteComment()\n pushNotifications({\n title: '',\n message: t('notification.success'),\n type: 'success',\n })\n } else {\n pushNotifications({\n title: '',\n message: res?.messages?.[0] || t('notification.failure'),\n type: 'danger',\n })\n }\n }}\n onClose={() => setIsOpenLeavePopup(false)}\n />\n )}\n <TreePopoverMenu\n position=\"bottom\"\n align=\"end\"\n data={{\n isShowheader: false,\n type: 'list',\n list: [\n // {\n // icon: _href('/svg/icon-share-on-media.svg'),\n // label: f({ id: 'morePopover.share' }),\n // subTree: {\n // title: f({ id: 'morePopover.shareOn' }),\n // isShowheader: true,\n // type: 'jsx',\n // jsxType: TreeJSXType.share,\n // data: {\n // shareUrl: shareUrl,\n // shareTitle: shareTitle,\n // },\n // },\n // },\n // {\n // icon: _href('/svg/icon-tab-edit-2.svg'),\n // label: f({ id: 'actionPopover.edit' }),\n // onClick: onEditPost,\n // },\n {\n icon: IconTrashBin,\n label: t('actionPopover.delete'),\n onClick: () => {\n authActionWrapper(() => {\n setIsOpenLeavePopup(true)\n })\n },\n },\n ],\n }}\n className={popoverClassName}\n toggleButtonContent={\n <img src={isMarryBaby ? MBMoreSolid : IconKebab} />\n }\n buttonProps={\n {\n // isLoading: loading,\n }\n }\n />\n </div>\n )\n}\n","import React, {\n CSSProperties,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Divider } from 'components/atoms/divider'\nimport { useTranslations } from 'hooks/useTranslations'\nimport { domainLocales } from 'src/interfaces/constants'\nimport { CARE_PATHS } from 'src/together/api/paths'\nimport { callApi, getCarePath } from 'src/together/api/utils'\nimport {\n decodeCommentBody,\n likeUnlikeComment,\n} from 'together/utils/apiActions/comment'\n\nimport ChevronRightActive from '../../../assets/svg/chevronRightActive.svg'\nimport {\n TogetherAuthConfigContextProvider,\n useTogetherAuthRequiredAction,\n} from '../../../hooks/useTogetherAuthRequiredAction'\nimport { Comment, DoctorInfo, Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { CardLink } from '../../atoms/cardLink'\nimport { CardReactions } from '../../atoms/cardReactions'\nimport { CardReactionType } from '../../atoms/cardReactions/index'\nimport { CardAuthor } from '../../molecules/cardAuthor'\nimport { InputCommentBar } from '../../molecules/inputCommentBar'\nimport { HospitalInfo } from '../../molecules/popupHospital'\nimport { PostContent } from '../../molecules/postContent'\nimport { PostImagePreview } from '../../molecules/postImagePreview'\nimport { CardReplyPopover } from './cardReplyPopover'\nimport { StyledCardPost } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n type?: 'comment' | 'reply' | 'most-engaging'\n level?: number\n replyingId?: string\n comment: Comment\n onPostCommentSuccess?: (c: Comment) => void\n refetchComment?: (c: Comment) => void\n post?: Post\n onDeleteComment?: () => void\n hasQuickBookingEnable?: boolean\n handleMakeAppointment?: (doctorId?: string, hospitalId?: string) => void\n}\n\nconst COMMENT_LIMIT = 4\n\nconst CardReply = ({\n className,\n style,\n comment: CommentProps,\n type = 'comment',\n level = 0,\n replyingId,\n onPostCommentSuccess,\n post,\n onDeleteComment,\n refetchComment,\n hasQuickBookingEnable,\n handleMakeAppointment,\n}: Props) => {\n const {\n data: {\n locale,\n userInfo,\n env: { isMarryBaby },\n },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [comment, setComment] = useState<Comment>(CommentProps || null)\n const {\n id,\n countReplies,\n countLikes,\n content,\n createdAt,\n replies = [],\n images = [],\n author,\n liked,\n link,\n mentionedUser,\n mentions,\n } = comment\n\n const { text, replyingTo } = decodeCommentBody(content)\n const { authActionWrapper } = useTogetherAuthRequiredAction({\n _joinCommunityIds: [post?.community?.id],\n _joinTopicIds: post?.topics?.map((t) => t.id),\n })\n const [maxRepliesShow, setMaxRepliesShow] = useState(COMMENT_LIMIT)\n const isCommented = userInfo?.id\n ? replies?.some((c) => c.author.id === userInfo.id)\n : false\n\n const addNewReply = (comment: Comment) => {\n setComment((old) => {\n old.replies.unshift(comment)\n const newComment = {\n ...old,\n replies: old.replies.slice(),\n countReplies: old.countReplies + 1,\n }\n refetchComment && refetchComment(newComment)\n return newComment\n })\n }\n const [showInputComment, setShowInputComment] = useState(false)\n\n const sortedReplies = useMemo(() => {\n if (type !== 'comment' || !replies || replies.length == 0) return replies\n return replies.sort((a, b) => {\n const timeA = new Date(a.createdAt).getTime()\n const timeB = new Date(b.createdAt).getTime()\n if (timeA > timeB) return -1\n if (timeA < timeB) return 1\n\n return 0\n })\n }, [type, replies])\n\n const mergeCountReplies = replies?.length || 0\n const hasPopover =\n String(author?.email) &&\n userInfo?.email &&\n String(author?.email) === String(userInfo?.email)\n\n const name = author?.name || author?.username || ''\n const avatar = author?.avatar\n const username = author?.username || author?.name || ''\n\n const [hospitalInfo, setHospitalInfo] = useState<HospitalInfo | null>(null)\n const [doctorInfo, setDoctorInfo] = useState<DoctorInfo | null>(null)\n\n useEffect(() => {\n if (author?.hospitalId) {\n const fetchHospitalDetail = async (hospitalId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_HOSPITAL_INFO, {\n hospital_branch_id: hospitalId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.branch) {\n setHospitalInfo(response?._data.branch)\n }\n }\n fetchHospitalDetail(author.hospitalId)\n }\n if (author?.doctorId) {\n const fetchDoctorDetail = async (doctorId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_DOCTOR_INFO, {\n doctorId: doctorId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.doctor) {\n setDoctorInfo(response?._data.doctor)\n }\n }\n fetchDoctorDetail(author.doctorId)\n }\n }, [author.hospitalId, author.doctorId])\n\n const isDoctorAvailable =\n doctorInfo?.valid_outpatient || doctorInfo?.valid_telemedicine\n const isHospitalAvailable =\n (hospitalInfo?.total_available_service ||\n hospitalInfo?.total_available_doctor) > 0\n const hasQuickBooking =\n hasQuickBookingEnable && (isDoctorAvailable || isHospitalAvailable)\n\n return (\n <TogetherAuthConfigContextProvider\n defaultParams={{\n _joinCommunityIds: [post?.community?.id],\n _joinTopicIds: post?.topics?.map((t) => t.id),\n }}\n >\n <StyledCardPost\n className={className}\n style={style}\n data-is-reply={!!level}\n data-is-marrybaby={isMarryBaby}\n data-has-booking={hasQuickBooking}\n >\n {type === 'reply' && <Divider className=\"top-divider\" type=\"solid\" />}\n <CardAuthor\n avatar={avatar}\n name={name}\n username={username}\n email={author?.email}\n time={createdAt}\n // community={community}\n // miniIcon=\"./svg/icon-tag.svg\"\n // authorLabelType={getAuthorLabelFromRoles(author?.role || [])}\n className={`post-author ${hasPopover ? 'with-popover' : ''}`}\n type={type}\n userId={author?.id}\n role={author?.role}\n expertId={author?.partnerId}\n title={author?.title}\n doctorId={author?.doctorId}\n hospitalId={author?.hospitalId}\n hasQuickBooking={hasQuickBooking}\n handleMakeAppointment={handleMakeAppointment}\n />\n <PostContent\n className=\"post-content-wrapper\"\n replyingTo={replyingTo}\n mentionedUser={mentionedUser}\n description={text}\n mentions={mentions}\n />\n <span></span>\n <span></span>\n {images && images.length > 0 ? (\n <div\n key=\"image-preview\"\n className=\"image-preview-wrapper\"\n data-is-reply={true}\n >\n <PostImagePreview images={images} authorName={author?.username} />\n </div>\n ) : null}\n {(!images || images.length === 0) && link ? (\n <div\n key=\"link-preview\"\n className=\"link-preview-wrapper\"\n data-is-reply={true}\n >\n <CardLink url={link} />\n </div>\n ) : null}\n\n {type !== 'most-engaging' ? (\n <>\n <CardReactions\n type={CardReactionType.reply}\n loveCount={countLikes}\n replyCount={mergeCountReplies}\n className=\"post-reaction\"\n liked={liked}\n isReplied={isCommented}\n hideCommentIcon={type === 'reply'}\n onCommentClick={() =>\n authActionWrapper(() => setShowInputComment((v) => !v))\n }\n onCommentCountClick={() =>\n authActionWrapper(() => {\n setShowInputComment(true)\n })\n }\n onLikeClick={() =>\n authActionWrapper(async () => {\n if (id) {\n const res = await likeUnlikeComment({\n commentId: id,\n setLike: !liked,\n locale,\n })\n if (res.status === 1) {\n setComment((old) => {\n return {\n ...old,\n liked: !liked,\n countLikes: old.countLikes + (!liked ? 1 : -1),\n }\n })\n }\n }\n })\n }\n />\n {showInputComment && (\n <InputCommentBar\n replyingId={replyingId || comment.id}\n replyToName={author.name || author.username || ''}\n isReply\n onClose={() => setShowInputComment(false)}\n onPostSuccess={(comment) => {\n if (type === 'reply') {\n onPostCommentSuccess && onPostCommentSuccess(comment)\n } else {\n addNewReply(comment)\n }\n }}\n post={post}\n replyingUser={author}\n />\n )}\n {type === 'comment' && replies && replies.length > 0 ? (\n <div className=\"comment-reply-wrapper\">\n {sortedReplies?.slice(0, maxRepliesShow)?.map((reply) => (\n <CardReply\n key={reply.id}\n comment={reply}\n type=\"reply\"\n className=\"comment-reply-item\"\n level={level + 1}\n replyingId={id}\n onPostCommentSuccess={addNewReply}\n post={post}\n onDeleteComment={() => {\n setComment((old) => {\n return {\n ...old,\n replies: old.replies.filter((r) => r.id !== reply.id),\n countReplies: old.countReplies - 1,\n }\n })\n }}\n handleMakeAppointment={handleMakeAppointment}\n hasQuickBookingEnable={hasQuickBookingEnable}\n />\n ))}\n {mergeCountReplies > maxRepliesShow && (\n <>\n <Divider className=\"top-divider\" type=\"solid\" />\n <Button\n className=\"more-cmt\"\n size=\"lg\"\n color=\"ghost\"\n onClick={() =>\n setMaxRepliesShow((m) => m + COMMENT_LIMIT)\n }\n >\n {t('comment.seeMoreReplies', {\n count: mergeCountReplies - maxRepliesShow,\n })}\n <img className=\"chevron-right\" src={ChevronRightActive} />\n </Button>\n </>\n )}\n </div>\n ) : null}\n </>\n ) : null}\n\n {hasPopover && (\n <CardReplyPopover\n onDeleteComment={onDeleteComment}\n className=\"popover\"\n commentId={comment.id}\n />\n )}\n </StyledCardPost>\n </TogetherAuthConfigContextProvider>\n )\n}\n\nexport { CardReply }\n","/* eslint-disable react/display-name */\nimport React, { useContext, useState } from 'react'\n\nimport { useTranslations } from 'hooks/useTranslations'\nimport { TranslationsKey } from 'i18n/translations'\nimport { REPORT_REASON_MAP } from 'together/interfaces/constants'\n\nimport { PATHS } from '../../../api/paths'\nimport { callApiWithAuth, getApiPath } from '../../../api/utils'\nimport MBMoreSolid from '../../../assets/marrybaby/svg/moreSolid.svg'\nimport IconDelete from '../../../assets/svg/delete.svg'\nimport IconAlertCircle from '../../../assets/svg/icon-alert-circle.svg'\nimport IconBookmarkFill from '../../../assets/svg/icon-bookmark-fill.svg'\nimport IconBookmark from '../../../assets/svg/icon-bookmark.svg'\nimport IconKebab from '../../../assets/svg/icon-kebab.svg'\nimport IconShareOnMedia from '../../../assets/svg/icon-share-on-media.svg'\nimport IconTabEdit from '../../../assets/svg/icon-tab-edit-2.svg'\nimport IconTrashBin from '../../../assets/svg/icon-trash-bin.svg'\nimport { useTogetherAuthRequiredAction } from '../../../hooks/useTogetherAuthRequiredAction'\nimport { Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { deletePost } from '../../../utils/apiActions/post'\nimport { PopupDanger } from '../../molecules/popupDanger'\nimport { SharePopup } from '../../molecules/popupFrame/popupShare'\nimport { SubmitReportForm } from '../../molecules/submitReportForm/index'\nimport { TreePopoverMenu } from '../popoverMenu/treePopoverMenu'\n\n// import IconBellOff from '../../../assets/svg/icon-bell-off.svg'\n// import IconBellOn from '../../../assets/svg/icon-bell-on.svg'\n\nexport const CardPostPopoverMore = ({\n authorEmail,\n onDeletePost,\n shareUrl,\n post,\n className = '',\n popoverClassName = '',\n onBookmark,\n onRemoveBookmark,\n onEditPost,\n}: {\n className?: string\n popoverClassName?: string\n authorId?: string\n authorEmail?: string\n onDeletePost?: () => void\n shareUrl?: string\n post?: Post\n onBookmark?: () => void\n onRemoveBookmark?: () => void\n onEditPost?: () => void\n}) => {\n const {\n data: {\n locale,\n userInfo,\n togetherUserId,\n env: { isMarryBaby },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n // const [localHasNoti, setLocalHasNoti] = useState(false)\n const [loading, setLoading] = useState(false)\n const [isOpenLeavePopup, setIsOpenLeavePopup] = useState(false)\n const [isOpenSharePopup, setIsOpenSharePopup] = useState(false)\n const { authActionWrapper } = useTogetherAuthRequiredAction()\n const isAuthor =\n authorEmail && userInfo?.email && authorEmail === String(userInfo?.email)\n return (\n <div\n className={className}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n {isOpenSharePopup && (\n <SharePopup\n url={shareUrl}\n text={post?.title}\n onClose={() => setIsOpenSharePopup(false)}\n />\n )}\n {isOpenLeavePopup && (\n <PopupDanger\n thumbnail={'./svg/delete.svg'}\n isThumbnailIcon\n title={t('popup.deletePost.title')}\n description={t('popup.deletePost.description')}\n acceptText={t('popup.deletePost.accept')}\n cancelText={t('popup.deletePost.cancel')}\n onAccept={async () => {\n if (!post?.id || loading) return\n setLoading(true)\n try {\n const res = await deletePost({\n id: post.id,\n locale,\n })\n if (res?.status === 1) onDeletePost?.()\n } catch {}\n setLoading(false)\n }}\n onClose={() => setIsOpenLeavePopup(false)}\n />\n )}\n <TreePopoverMenu\n className={popoverClassName}\n toggleButtonContent={\n <img src={isMarryBaby ? MBMoreSolid : IconKebab} />\n }\n position=\"bottom\"\n align=\"end\"\n buttonProps={{\n isLoading: loading,\n }}\n data={\n isAuthor\n ? {\n isShowheader: false,\n type: 'list',\n list: [\n {\n icon: IconShareOnMedia,\n label: t('morePopover.share'),\n onClick: () => setIsOpenSharePopup(true),\n },\n {\n icon: IconTabEdit,\n label: t('actionPopover.edit'),\n onClick: onEditPost,\n },\n {\n icon: IconTrashBin,\n label: t('actionPopover.delete'),\n onClick: () => {\n authActionWrapper(() => setIsOpenLeavePopup(true))\n },\n },\n ],\n }\n : {\n isShowheader: false,\n type: 'list',\n list: [\n {\n icon: IconShareOnMedia,\n label: t('morePopover.share'),\n onClick: () => setIsOpenSharePopup(true),\n },\n {\n icon: !!post?.bookmarked ? IconBookmarkFill : IconBookmark,\n label: !!post?.bookmarked\n ? t('morePopover.unsavePost')\n : t('morePopover.savePost'),\n onClick: () => {\n authActionWrapper(async () => {\n if (!userInfo?.id || !post?.id) return\n if (post?.bookmarked) {\n const res = await callApiWithAuth(\n getApiPath(PATHS.BOOKMARK.DELETE, {\n _locale: locale,\n }),\n 'DELETE',\n {\n data: {\n post_id: String(post.id),\n },\n },\n )\n if (res?.status === 1) {\n pushNotifications({\n title: '',\n message: 'Removed saved post',\n type: 'success',\n displayIcon: IconBookmark,\n })\n\n onRemoveBookmark && onRemoveBookmark()\n } else {\n pushNotifications({\n title: '',\n message: 'Remove failed',\n type: 'danger',\n displayIcon: IconBookmark,\n })\n }\n } else {\n const res = await callApiWithAuth(\n getApiPath(PATHS.BOOKMARK.CREATE, {\n _locale: locale,\n }),\n 'POST',\n {\n data: {\n user_id: togetherUserId || userInfo.id,\n post_id: post.id,\n },\n },\n )\n if (res?.status === 1) {\n pushNotifications({\n title: '',\n message: 'Post saved',\n type: 'success',\n displayIcon: IconBookmarkFill,\n })\n\n onBookmark && onBookmark()\n } else {\n pushNotifications({\n title: '',\n message: 'Post saved failed',\n type: 'danger',\n displayIcon: IconBookmark,\n })\n }\n }\n })\n },\n },\n // {\n // icon: togetherBasePath + '/svg/icon-bell-on.svg',\n // label: !localHasNoti\n // ? t( 'morePopover.turnOnNotifications' })\n // : t( 'morePopover.turnOffNotifications' }),\n // onClick: () => {\n // authActionWrapper(async () => {\n // if (!post?.id || loading) return\n // setLoading(true)\n // try {\n // const res = await followUnfollowPost({\n // id: post?.id,\n // locale,\n // })\n // if (res?.status === 1) {\n // pushNotifications({\n // message: !localHasNoti\n // ? 'Notification on'\n // : 'Notification off',\n // type: !localHasNoti ? 'success' : 'danger',\n // displayIcon: !localHasNoti ? IconBellOn : IconBellOff,\n // })\n // setLocalHasNoti((v) => !v)\n // }\n // } catch {}\n // setLoading(false)\n // })\n // },\n // },\n {\n icon: IconAlertCircle,\n label: t('morePopover.report'),\n subTree: {\n title: t('morePopover.report.title'), //'Report this post',\n description: t('morePopover.report.description'), // 'Help us understand what’s happening with this post. How would you describe it?',\n isShowheader: true,\n type: 'list',\n list: Object.keys(REPORT_REASON_MAP)\n .map((k) => ({\n label: REPORT_REASON_MAP[k].label,\n reason: REPORT_REASON_MAP[k].reportReasonText,\n reasonValue: k,\n }))\n .map((item) => ({\n label: t(item.label as TranslationsKey),\n subTree: {\n title: t('morePopover.reportSubmit.title'), //'Submit report?',\n description: t(\n 'morePopover.reportSubmit.description',\n ), //'We won’t tell them who reported it. Please check these details:',\n isShowheader: true,\n type: 'jsx',\n jsxRenderer: (setShow) => (\n <SubmitReportForm\n reason={item.reasonValue}\n reasonText={t(item.reason as TranslationsKey)}\n postId={post?.id}\n onClose={() => setShow && setShow(false)}\n />\n ),\n },\n })),\n },\n },\n ],\n }\n }\n />\n </div>\n )\n}\n","import React, {\n CSSProperties,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Heading } from 'components/atoms/heading'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { getDefaultFailNoti } from 'together/utils/notification'\n\nimport { formatComment } from '../../../api/dataTransform'\nimport { CARE_PATHS, PATHS } from '../../../api/paths'\nimport {\n callApi,\n callApiWithOptionalAuth,\n domainLocales,\n getApiPath,\n getCarePath,\n getCurrentBaseUrl,\n} from '../../../api/utils'\nimport {\n TogetherAuthConfigContextProvider,\n useTogetherAuthRequiredAction,\n} from '../../../hooks/useTogetherAuthRequiredAction'\nimport { DEFAULT_IMG } from '../../../interfaces/constants'\nimport { Comment, DoctorInfo, Post } from '../../../interfaces/types'\nimport { TogetherComponentGlobalContext } from '../../../togetherComponentGlobalContext'\nimport { likeUnlikePost } from '../../../utils/apiActions/post'\nimport { CardLink } from '../../atoms/cardLink'\nimport { CardReactions } from '../../atoms/cardReactions'\nimport { CardReactionType } from '../../atoms/cardReactions/index'\nimport { LabelPin } from '../../atoms/labelSortPin/labelPin'\nimport { TagTopic } from '../../atoms/tagTopic'\nimport { CardAuthor } from '../../molecules/cardAuthor'\nimport { InputCommentBar } from '../../molecules/inputCommentBar'\nimport { SharePopup } from '../../molecules/popupFrame/popupShare'\nimport { HospitalInfo } from '../../molecules/popupHospital'\nimport { PostContent } from '../../molecules/postContent'\nimport { PostImagePreview } from '../../molecules/postImagePreview'\nimport { SocialLinkPreview } from '../../molecules/socialLinkPreview'\nimport { CardReply } from '../cardReply'\nimport { CardPostPopoverMore } from './cardPostPopover'\nimport { StyledCardPost } from './index.styled'\n\nconst getMostEngagingComment = async (postId: number, locale: string) => {\n const commentsRes = await callApiWithOptionalAuth(\n getApiPath(PATHS.COMMENT.LIST, {\n postId: postId,\n _locale: locale,\n sort: 'popularity',\n perPage: 1,\n withoutReply: 1,\n }),\n 'GET',\n )\n return commentsRes?.data?.comments?.map(formatComment)?.[0]\n}\n\nexport type Props = {\n post: Post\n\n hideViewMoreComment?: boolean\n showMostEngaging?: boolean\n className?: string\n disableCardLink?: boolean\n disableShortenContent?: boolean\n style?: CSSProperties\n onCommentClick?: () => void\n onMostEngagingCommentClick?: () => void\n onCommentCountClick?: () => void\n onPostCommentSuccess?: (c: Comment) => void\n onDeletePost?: () => void\n onEditPost?: () => void\n mostEngagingComment?: Comment | null\n onDeleteComment?: (c: Comment) => void\n showInputComment?: boolean\n hasQuickBookingEnable?: boolean\n doctorId?: string\n hospitalId?: string\n InlineCommentsComponent?: ReactNode\n handleMakeAppointment?: (doctorId?: string, hospitalId?: string) => void\n}\n\nconst CardPost = ({\n className,\n style,\n hideViewMoreComment,\n showMostEngaging,\n onCommentClick,\n onCommentCountClick,\n onMostEngagingCommentClick,\n onPostCommentSuccess: onPostCommentSuccessProp,\n disableCardLink,\n disableShortenContent,\n onDeletePost,\n onEditPost,\n post: postProp,\n mostEngagingComment: mostEngagingCommentProp,\n onDeleteComment: onDeleteCommentProp,\n showInputComment: propsShowInputComment,\n InlineCommentsComponent,\n hasQuickBookingEnable,\n handleMakeAppointment,\n}: Props) => {\n const [post, setPost] = useState(postProp)\n const [isOpenSharePopup, setIsOpenSharePopup] = useState(false)\n const [mostEngagingComment, setMostEngagingComment] = useState(\n mostEngagingCommentProp,\n )\n const {\n community,\n topics,\n author,\n slug,\n isPin,\n liked,\n scheduleDateTime,\n createdAt,\n photos,\n mentions,\n title,\n description,\n previewUrl,\n likesCount,\n commentsCount,\n id,\n commented,\n } = post\n const {\n data: {\n locale,\n env: { isMarryBaby, togetherBasePath },\n },\n action: { pushNotifications },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [showInputComment, setShowInputComment] = useState(\n propsShowInputComment,\n )\n\n const postRelativeHref = `${togetherBasePath}/${community?.slug || '_'}/${\n slug || ''\n }`\n const postHref = `${getCurrentBaseUrl(locale)}${postRelativeHref}`\n const { authActionWrapper } = useTogetherAuthRequiredAction(\n community?.slug\n ? {\n _joinCommunityIds: [community.id],\n _joinTopicIds: topics?.map((t) => t.id),\n // _location: postHref,\n }\n : undefined,\n )\n const [isLikeLoading, setIsLikeLoading] = useState(false)\n useEffect(() => {\n setShowInputComment(propsShowInputComment)\n }, [propsShowInputComment])\n\n const name = author?.name || author?.username || ''\n const username = author?.username || author?.name || ''\n const avatar = author?.avatar\n const [hospitalInfo, setHospitalInfo] = useState<HospitalInfo | null>(null)\n const [doctorInfo, setDoctorInfo] = useState<DoctorInfo | null>(null)\n\n useEffect(() => {\n if (author?.hospitalId) {\n const fetchHospitalDetail = async (hospitalId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_HOSPITAL_INFO, {\n hospital_branch_id: hospitalId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.branch) {\n setHospitalInfo(response?._data.branch)\n }\n }\n fetchHospitalDetail(author.hospitalId)\n }\n if (author?.doctorId) {\n const fetchDoctorDetail = async (doctorId: string) => {\n const response = await callApi(\n getCarePath(CARE_PATHS.GET_DOCTOR_INFO, {\n doctorId: doctorId,\n website_url: domainLocales[locale],\n }),\n 'get',\n )\n if (response?._data?.doctor) {\n setDoctorInfo(response?._data.doctor)\n }\n }\n fetchDoctorDetail(author.doctorId)\n }\n }, [author.hospitalId, author.doctorId])\n const isDoctorAvailable =\n doctorInfo?.valid_outpatient || doctorInfo?.valid_telemedicine\n const isHospitalAvailable =\n (hospitalInfo?.total_available_service ||\n hospitalInfo?.total_available_doctor) > 0\n const hasQuickBooking =\n hasQuickBookingEnable && (isDoctorAvailable || isHospitalAvailable)\n\n useEffect(() => {\n ;(async () => {\n if (\n id &&\n commentsCount &&\n showMostEngaging &&\n !mostEngagingCommentProp?.id\n ) {\n const comment = await getMostEngagingComment(id, locale)\n setMostEngagingComment(comment)\n }\n })()\n }, [id, locale, commentsCount, showMostEngaging, mostEngagingCommentProp?.id])\n useEffect(() => {\n setMostEngagingComment(mostEngagingCommentProp)\n }, [mostEngagingCommentProp?.id])\n const onPostCommentSuccess = (comment: Comment) => {\n if (commentsCount === 0 && !mostEngagingComment?.id) {\n setMostEngagingComment(comment)\n }\n setPost((p) => ({\n ...p,\n commentsCount: p.commentsCount + 1,\n commented: true,\n }))\n onPostCommentSuccessProp && onPostCommentSuccessProp(comment)\n }\n\n const onDeleteComment = async (comment: Comment) => {\n if (\n commentsCount > 1 &&\n mostEngagingComment?.id &&\n mostEngagingComment?.id === comment?.id\n ) {\n const newMostEngaging = await getMostEngagingComment(id, locale)\n setMostEngagingComment(newMostEngaging)\n }\n setPost((p) => ({\n ...p,\n commentsCount: p.commentsCount - 1,\n }))\n onDeleteCommentProp && onDeleteCommentProp(comment)\n }\n return (\n <TogetherAuthConfigContextProvider\n defaultParams={\n community?.slug\n ? {\n _joinCommunityIds: [community.id],\n _joinTopicIds: topics?.map((t) => t.id),\n // _location: postHref,\n }\n : undefined\n }\n >\n {isOpenSharePopup && (\n <SharePopup\n url={postHref}\n avatar={DEFAULT_IMG}\n text={title}\n onClose={() => setIsOpenSharePopup(false)}\n />\n )}\n <StyledCardPost\n className={className}\n style={style}\n data-is-marrybaby={isMarryBaby}\n >\n {isPin ? <LabelPin className=\"post-pin\" /> : null}\n <div style={{ position: 'relative' }}>\n <CardAuthor\n avatar={avatar}\n name={name}\n username={username}\n url={disableCardLink ? undefined : postRelativeHref}\n email={author?.email}\n time={scheduleDateTime || createdAt}\n community={community}\n // miniIcon=\"./svg/icon-tag.svg\"\n className=\"post-author\"\n role={author?.role}\n userId={author?.id}\n expertId={author?.partnerId}\n doctorId={author?.doctorId}\n hospitalId={author?.hospitalId}\n title={author?.title}\n hasQuickBooking={hasQuickBooking}\n handleMakeAppointment={handleMakeAppointment}\n />\n <CardPostPopoverMore\n authorEmail={String(author?.email)}\n onDeletePost={onDeletePost}\n shareUrl={postHref}\n post={post}\n className=\"popover\"\n onEditPost={onEditPost}\n />\n </div>\n <a\n href={disableCardLink ? undefined : postRelativeHref}\n className=\"post-content-link-wrapper\"\n >\n {title && (\n <Heading\n className=\"post-content-title\"\n as=\"h1\"\n tag=\"h5\"\n fontWeight=\"bold\"\n >\n {innertext(title)}\n </Heading>\n )}\n <PostContent\n className=\"post-content-wrapper\"\n description={description}\n disableShortenContent={disableShortenContent}\n mentions={mentions}\n />\n </a>\n <span></span>\n <span></span>\n <div key=\"tag-topic\">\n {topics && topics.length > 0 ? (\n <TagTopic topics={topics} className=\"post-topics\" />\n ) : null}\n </div>\n <div key=\"social-preview\">\n {post?.introUrl ? (\n <div\n className={`social-preview-wrapper ${\n !!photos?.length ? 'has-image' : ''\n }`}\n >\n <SocialLinkPreview url={post.introUrl} image={post.bannerImage} />\n </div>\n ) : null}\n </div>\n <div key=\"image-preview\">\n {!!photos?.length ? (\n <div className=\"image-preview-wrapper\">\n <PostImagePreview images={photos} authorName={author?.name} />\n </div>\n ) : null}\n </div>\n <div key=\"link-preview\">\n {!post?.introUrl && !photos?.length && previewUrl?.url ? (\n <div className=\"link-preview-wrapper\">\n <CardLink\n title={previewUrl.title}\n url={previewUrl.url}\n image={previewUrl.image}\n />\n </div>\n ) : null}\n </div>\n <CardReactions\n type={CardReactionType.post}\n loveCount={likesCount}\n replyCount={commentsCount}\n className={`post-reaction ${\n photos?.length || previewUrl?.url ? 'hide-top-border' : ''\n }`}\n liked={isLikeLoading ? !liked : liked}\n isReplied={commented}\n onCommentClick={() =>\n authActionWrapper(() => {\n onCommentClick ? onCommentClick() : setShowInputComment((v) => !v)\n })\n }\n onCommentCountClick={() => {\n authActionWrapper(() => {\n isMarryBaby\n ? setShowInputComment(true)\n : onCommentCountClick\n ? onCommentCountClick()\n : !disableCardLink && (window.location.href = postRelativeHref)\n })\n }}\n onShareClick={() => {\n setIsOpenSharePopup(true)\n }}\n onLikeClick={async () => {\n if (!id || isLikeLoading) return\n setIsLikeLoading(true)\n try {\n const res = await likeUnlikePost({\n id,\n locale,\n })\n if (res?.status !== 1) {\n pushNotifications(getDefaultFailNoti(t))\n } else {\n setPost((p) => ({\n ...p,\n likesCount: (p.likesCount || 0) + (!p.liked ? 1 : -1),\n liked: !p.liked,\n }))\n }\n } catch {\n pushNotifications(getDefaultFailNoti(t))\n }\n setIsLikeLoading(false)\n }}\n showingMostEngaging={!!(showMostEngaging && mostEngagingComment?.id)}\n />\n {showInputComment && (\n <InputCommentBar\n isMainCmt={!propsShowInputComment}\n onClose={() => setShowInputComment(false)}\n onPostSuccess={onPostCommentSuccess}\n post={post}\n />\n )}\n {showMostEngaging && mostEngagingComment?.id ? (\n <div\n className=\"most-engaging-wrapper\"\n onClick={(e) => {\n if (onMostEngagingCommentClick) {\n e.stopPropagation()\n onMostEngagingCommentClick()\n } else window.location.href = postRelativeHref\n }}\n >\n <CardReply\n hasQuickBookingEnable={hasQuickBookingEnable}\n handleMakeAppointment={handleMakeAppointment}\n comment={mostEngagingComment}\n onDeleteComment={() => {\n onDeleteComment && onDeleteComment(mostEngagingComment)\n }}\n className=\"most-engaging-comment\"\n type=\"most-engaging\"\n key={mostEngagingComment.id}\n />\n {commentsCount > 1 && !hideViewMoreComment && (\n <Button className=\"see-more-comments\" color=\"ghost\" size=\"md\">\n {t('comment.seeMoreComments', {\n count: commentsCount - 1,\n })}\n </Button>\n )}\n </div>\n ) : null}\n {InlineCommentsComponent}\n </StyledCardPost>\n </TogetherAuthConfigContextProvider>\n )\n}\n\nexport { CardPost }\n","import React, { CSSProperties, useContext, useEffect, useState } from 'react'\n\nimport { Button } from 'components/atoms/button'\nimport { Text } from 'components/atoms/text'\nimport { Dropdown } from 'components/molecules/dropdown'\nimport { useTranslations } from 'hooks/useTranslations'\nimport innertext from 'innertext'\nimport { theme } from 'misc/theme'\nimport { TogetherComponentGlobalContext } from 'together/togetherComponentGlobalContext'\nimport { getDefaultFailNoti } from 'together/utils/notification'\n\nimport { formatPost } from '../../../api/dataTransform'\nimport IconAlertCirclePrimary from '../../../assets/svg/icon-alert-circle-primary.svg'\nimport IconAlertCircleWarning from '../../../assets/svg/icon-alert-circle-warning.svg'\nimport { MAX_IMAGE_UPLOADS } from '../../../interfaces/constants'\nimport { Community, Post, PostApi, Topic } from '../../../interfaces/types'\nimport { editPost, getPostFormData } from '../../../utils/apiActions/post'\nimport { createPost } from '../../../utils/apiActions/post'\nimport {\n decodeMention,\n decodePostUrl,\n encodePostContent,\n getMentionIdsFromString,\n removeBannedWordWrapper,\n} from '../../../utils/post'\nimport { CreatePostDescription } from '../createPostDescription'\nimport { CreatePostTitle } from '../createPostTitle/index'\nimport { TopicSelectList } from '../topicSelectList'\nimport { StyledCreateNewPost } from './index.styled'\n\nexport type Props = {\n className?: string\n style?: CSSProperties\n onPostCreatedEdited?: (post: Post, isEdit?: boolean) => void\n onClose?: () => void\n communities?: Community[]\n forceSelectCommunity?: Community\n forceSelectTopics?: Topic[]\n articleId?: string\n optionalTopic?: boolean\n noFetchTopic?: boolean\n editPostData?: Post\n defaultCommunity?: Community\n defaultTopics?: Topic[]\n hideTopicList?: boolean\n}\n\nexport const CreateNewPostContent = ({\n className,\n style,\n onPostCreatedEdited,\n onClose,\n communities = [],\n forceSelectCommunity,\n forceSelectTopics,\n articleId,\n optionalTopic,\n editPostData,\n defaultCommunity,\n defaultTopics,\n noFetchTopic,\n hideTopicList,\n}: Props) => {\n const isInEditMode = !!editPostData?.id\n const {\n data: {\n locale,\n env: { isMarryBaby },\n },\n action: { pushNotifications, sanitizeFunction },\n } = useContext(TogetherComponentGlobalContext)\n const { t } = useTranslations()\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [titleValue, setTitleValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [communityValue, setCommunityValue] = useState(\n forceSelectCommunity\n ? {\n label: forceSelectCommunity.name,\n value: `${forceSelectCommunity.id || ''}-${\n forceSelectCommunity.mappedCategoryId || ''\n }`,\n }\n : {\n label: t('community.choose'),\n value: '',\n },\n )\n const [selectedTopics, setSelectedTopics] = useState<Topic[]>(\n [...forceSelectTopics] || [],\n )\n const [imageFiles, setImageFiles] = useState<(File | string)[]>([])\n const [bannedWords, setBannedWords] = useState<string[]>([])\n\n const currentCommunity =\n forceSelectCommunity ||\n communities.find(\n (c) =>\n `${c.id || ''}-${c.mappedCategoryId || ''}` === communityValue.value,\n )\n\n const communitiesList = forceSelectCommunity\n ? [forceSelectCommunity]\n : communities\n .filter((c) => c.isActive)\n .sort((a, b) => {\n if (a.name > b.name) return 1\n if (a.name < b.name) return -1\n return 0\n })\n\n const [previewUrl, setPreviewUrl] = useState<{\n title?: string\n url?: string\n image?: string\n description?: string\n } | null>(null)\n const [invalidUrls, setInvalidUrls] = useState<string[]>([])\n\n const isReadyToSubmit =\n titleValue &&\n innertext(descriptionValue) &&\n (optionalTopic || (!optionalTopic && selectedTopics.length > 0)) &&\n currentCommunity &&\n (!imageFiles || imageFiles.length <= MAX_IMAGE_UPLOADS) &&\n !invalidUrls?.length &&\n !isSubmitting\n // HANDLE etra action when OPEN AND CLOSE\n useEffect(() => {\n if (editPostData) {\n const post = editPostData\n setTitleValue(post.title || '')\n setDescriptionValue(\n decodeMention(\n decodePostUrl(post.description || '', 'edit'),\n post.mentions,\n ),\n )\n setCommunityValue({\n label: post.community.name,\n value: `${post.community.id || ''}-${\n post.community.mappedCategoryId || ''\n }`,\n })\n setSelectedTopics(post.topics || [])\n setImageFiles(post.photos || [])\n } else {\n if (defaultCommunity) {\n setCommunityValue({\n label: defaultCommunity.name,\n value: `${defaultCommunity.id || ''}-${\n defaultCommunity.mappedCategoryId || ''\n }`,\n })\n }\n if (defaultTopics) {\n setSelectedTopics(defaultTopics)\n }\n }\n }, [])\n\n const onCreateEditSuccess = (res: PostApi) => {\n if (onPostCreatedEdited) {\n onPostCreatedEdited(formatPost(res), isInEditMode)\n }\n onClose && onClose()\n }\n\n const submitPost = async () => {\n const bodyFormData = await getPostFormData({\n title: titleValue,\n description: descriptionValue,\n communityId: String(currentCommunity?.id || ''),\n imageFiles,\n previewUrl,\n topicIds: selectedTopics\n ?.map((topic) => String(topic.id || ''))\n .filter(Boolean),\n locale,\n sanitizeFunction,\n categoryCommunityId: String(currentCommunity?.mappedCategoryId || ''),\n categoryTopicIds: selectedTopics\n ?.map((topic) => String(topic.mappedCategoryId || ''))\n .filter(Boolean),\n })\n if (articleId) {\n bodyFormData.append('article_id', articleId)\n }\n\n let res: any\n if (isInEditMode) {\n if (editPostData?.id) {\n res = await editPost({\n id: editPostData.id,\n formData: bodyFormData,\n locale,\n })\n }\n } else {\n res = await createPost({\n formData: bodyFormData,\n locale,\n isArticleComment:\n !currentCommunity?.id && !!currentCommunity?.mappedCategoryId,\n })\n }\n const resData = res?.data\n if (resData?.id && !res?.messages?.moderation?.type) {\n pushNotifications({\n message: t('createPost.popup.success'),\n type: 'success',\n })\n onCreateEditSuccess(resData)\n } else {\n if (res?.messages?.moderation?.type === 'banned') {\n pushNotifications({\n title: t('notification.post.blocked.title'),\n message: t('notification.post.blocked.message'),\n type: 'danger',\n })\n if (res.messages.moderation.words) {\n setBannedWords(res.messages.moderation.words)\n }\n } else if (res?.messages?.moderation?.type === 'suspect') {\n pushNotifications({\n title: t('notification.post.suspect.title'),\n message: t('notification.post.suspect.message'),\n type: 'warning',\n })\n onClose && onClose()\n } else if (\n res?.messages?.find?.((m: string) => !!m?.includes?.('suspend'))\n ) {\n pushNotifications({\n message: t('notification.suspend.message'),\n type: 'danger',\n })\n onClose && onClose()\n } else {\n pushNotifications({\n message: res?.messages?.[0] || t('notification.failure'),\n type: 'danger',\n })\n }\n }\n }\n\n return (\n <StyledCreateNewPost className={className} style={style}>\n <div className=\"input-group-container\">\n <CreatePostTitle\n className=\"input-group\"\n bannedWords={bannedWords}\n value={titleValue}\n onChange={setTitleValue}\n />\n <CreatePostDescription\n className=\"input-group\"\n bannedWords={bannedWords}\n value={descriptionValue}\n onChange={setDescriptionValue}\n onPreviewUrlChange={setPreviewUrl}\n onInvalidUrlsChange={setInvalidUrls}\n onImageFilesChange={setImageFiles}\n imageFiles={imageFiles}\n />\n <div className=\"input-group\">\n <Text size=\"p4\" className=\"input-group-label\">\n {t('admin.community')}\n </Text>\n <Dropdown\n options={\n communitiesList?.map((c, index) => ({\n label: c.name,\n value: `${c.id || ''}-${c.mappedCategoryId || ''}`,\n })) || []\n }\n id=\"community-picker\"\n placeholder={t('community.choose')}\n value={communityValue}\n onChange={(option) => {\n setCommunityValue({\n label: option.label as string,\n value: String(option.value),\n })\n setSelectedTopics([])\n }}\n disabled={!!forceSelectCommunity}\n />\n <Text size=\"sm\" className=\"warning\" color={theme.colors.gray400}>\n * {t('commentPopup.warning.newPost')}\n </Text>\n </div>\n {!hideTopicList && (\n <div className=\"input-group\">\n <Text size=\"p4\" className=\"input-group-label\">\n {t('tab.topic')}\n </Text>\n <div className=\"input-notification\">\n <img\n src={\n currentCommunity\n ? IconAlertCirclePrimary\n : IconAlertCircleWarning\n }\n />\n <Text size=\"base\" color={theme.colors.gray500}>\n {t(\n currentCommunity\n ? 'createPost.popup.primary'\n : 'createPost.popup.warning',\n )}\n </Text>\n </div>\n {currentCommunity && (\n <TopicSelectList\n className=\"tag-list\"\n communityId={currentCommunity.id}\n forceTopics={forceSelectTopics}\n onChange={setSelectedTopics}\n selectedTopics={selectedTopics}\n noFetch={noFetchTopic}\n />\n )}\n </div>\n )}\n </div>\n <Button\n theme={isMarryBaby ? 'marryBaby' : 'helloSites'}\n className=\"submit-btn\"\n size=\"lg\"\n onClick={async () => {\n if (isReadyToSubmit && !isSubmitting) {\n setIsSubmitting(true)\n try {\n await submitPost()\n } catch (e) {\n console.error(e)\n pushNotifications(getDefaultFailNoti(t))\n }\n setIsSubmitting(false)\n }\n }}\n isDisabled={!isReadyToSubmit}\n isLoading={isSubmitting}\n >\n {t('createPost.popup.submit')}\n </Button>\n </StyledCreateNewPost>\n )\n}\n"],"names":["CardLink","_a","title","url","image","logo","className","style","noRefetch","_b","useContext","TogetherComponentGlobalContext","data","locale","isMarryBaby","env","_c","useState","hideLogo","setHideLogo","noRefetchRef","useRef","current","_d","previewData","setPreviewData","useEffect","__awaiter","_data","__assign","isFetching","callApi","getApiPath","PATHS","FETCH_PREVIEW","_locale","link","then","res","catch","displayImage","displayTitle","displayLogo","displayUrl","domain","replace","split","showDefaultRef","React","createElement","StyledCardLink","concat","href","target","rel","src","onError","e","currentTarget","DEFAULT_IMG","Text","size","Heading","tag","TagTopic","topics","onClick","sliding","setSliding","slider","pos","timeoutRef","mouseDownHandler","setTimeout","left","scrollLeft","x","clientX","mouseMoveHandler_1","currentPos","dx","mouseUpHandler_1","clearTimeout","undefined","document","removeEventListener","addEventListener","sliderRef","useDragScroll","togetherBasePath","sanitizeFunction","action","StyledTagTopic","ref","onMouseDown","map","topic","index","key","isActive","isHidden","dangerouslySetInnerHTML","__html","name","LabelPin","color","t","useTranslations","LabelSortPin","label","Fragment","rightLabel","getDefaultFailNoti","message","type","likeUnlikePost","id","callApiWithAuth","POST","LIKE","sent","deletePost","DELETE","getPostFormData","description","communityId","imageFiles","previewUrl","topicIds","categoryCommunityId","categoryTopicIds","introUrl","bannerUrl","scheduleTime","bodyFormData","FormData","submitDescription","removeBannedWordWrapper","submitTitle","mentionIds","getMentionIdsFromString","append","encodePostContent","String","forEach","topicId","length","Promise","all","file","resolve","uploadAndGetSrc","imageSrcs","filter","Boolean","slice","MAX_IMAGE_UPLOADS","imageFile","mentionId","createPost","formData","isArticleComment","CREATE_ARTICLE_COMMENT","CREATE","headers","editPost","UPDATE","reportPost","reason","REPORT","useImagePicker","imageFilesProp","onImageFilesChange","setImageFiles","onSelectImages","files","Array","from","imgs","_imgs","onRemoveImage","_files","splice","onRemoveAllImages","useMemo","URL","createObjectURL","CreatePostDescription","bannedWords","value","onChange","onPreviewUrlChange","onInvalidUrlsChange","isReplying","setPreviewUrl","imagePicker","StyledCreatePostDescription","RichTextEditor","html","onImagePickerClick","click","innertext","Loading","IconCloseCircle","accept","multiple","display","IconAlertCircleWarning","theme","colors","alertWarning","i","inputModify","opts","limit","shorten","substring","highlightBadWords","CreatePostTitle","titleValue","setTitleValue","titleRef","pasteHandler_1","preventDefault","text","clipboardData","getData","execCommand","contentDiv_1","bannedString","join","titleText","innerText","titleValueWithBanned","debounceInputModify","useCallback","debounce","v","shortenString","focus","StyledCreatePostTitle","Input","CustomInput","ContentEditable","innerRef","evt","initialValue","count","max","TopicSelectList","topicsProp","isLoading","disabled","forceTopics","selectedTopicsProp","selectedTopics","noFetch","setTopics","setSelectedTopics","_e","isLoadingTopics","setIsLoadingTopics","topicsPropRef","TOPIC","LIST","topicRes_1","isArray","formatTopic","sort","t1","t2","order","console","log","e_1","topicsPropString","topicsStateString","forceTopicsPropString","topicsWithoutForced","some","ft","mappedCategoryId","StyledTopicSelectList","TopicItem","selected","_selected","foundIndex","findIndex","push","PopupDanger","isMarryBabyProp","acceptText","cancelText","onAccept","thumbnail","isThumbnailIcon","onClose","isMarryBabyContext","isOpen","setIsOpen","toggleNoScroll","ReactDOM","createPortal","StyledPopupDanger","PopupFrame","stopPropagation","Button","body","getCommentFormBody","postId","photos","replyingUserId","replyingUserName","replyingId","submitText","photo","unshift","submitComment","COMMENT","submitReply","REPLY","likeUnlikeComment","commentId","setLike","UNLIKE","deleteComment","InputCommentBar","isReply","replyToName","replyingUser","onPostSuccess","post","pushNotifications","userInfo","_f","_g","setText","trigger","MainInputTriggerContext","_h","isSubmitLoading","setIsSubmitLoading","contentEditable","mainInput","_j","invalidUrls","setInvalidUrls","_k","setBannedWords","_l","scrollIntoView","behavior","block","StyledInputCommentBar","UserAvatar","avatar","DEFAULT_AVATAR_IMG","username","displayIcon","setEditorRef","div","handleSuccess","newComment","formatComment","images","JSON","parse","author","formBody","resData","messages","moderation","words","find","m","includes","call","isDisabled","trim","SubmitReportForm","reasonText","loading","setLoading","StyledSubmitReportForm","IconAlertCircle","gray800","status","PostContent","replyingTo","mentionedUser","rawDescription","disableShortenContent","mentions","showAll","setShowAll","authActionWrapper","useTogetherAuthRequiredAction","openPopupExpert","setOpenPopupExpert","decodeMention","decodePostUrl","shortenSanitizedContentData","sanitizedContent","showContent","hasSeeMore","firstRound","newLineCompensateLength","match","shortenFirstRound","secondRound","replyName","hasExpert","role","partnerId","PopupExpert","expertId","StyledPostContent","startsWith","ImagePreviewPopup","authorName","onOpenSingleView","StyledImagePreviewPopup","alt","textAlign","PostSingleImageViewPopup","initialViewIndex","viewIndex","setViewIndex","previewImg","leftDisabled","rightDisabled","StyledImagePreviewContainer","StyledImagePreviewTopbar","CloseIcon","StyledImagePreviewWrapper","StyledArrowWrapper","StyledCircleArrow","ChevronRightIcon","transform","PostImagePreview","moreImageCount","isOpenImagePreview","setIsOpenImagePreview","singleImageViewIndex","setSingleImageViewIndex","lazyLoadInstance","update","hasMore","hasSetNoScroll","StyledPostImagePreview","SocialLinkPreview","youtubeVidId","youtubeVidIdGetter","facebookVidId","facebookVidIdGetter","responsiveWidth","responsiveHeight","forceRerenderFB","setForceRerenderFB","handleResize","containerRect","containerRef","getBoundingClientRect","toChangeSize","Math","abs","width","floor","height","window","StyledSocialLinkPreview","frameBorder","allowFullScreen","position","top","border","overflow","encodeURIComponent","scrolling","allow","CardReplyPopover","onDeleteComment","popoverClassName","isOpenLeavePopup","setIsOpenLeavePopup","TreePopoverMenu","align","isShowheader","list","icon","IconTrashBin","toggleButtonContent","MBMoreSolid","IconKebab","buttonProps","CardReply","CommentProps","level","onPostCommentSuccess","refetchComment","hasQuickBookingEnable","handleMakeAppointment","comment","setComment","countReplies","countLikes","content","createdAt","replies","_m","liked","_o","s","authorRegex","decodeCommentBody","_joinCommunityIds","community","_joinTopicIds","_p","maxRepliesShow","setMaxRepliesShow","isCommented","c","addNewReply","old","_q","showInputComment","setShowInputComment","sortedReplies","a","b","timeA","Date","getTime","timeB","mergeCountReplies","hasPopover","email","_r","hospitalInfo","setHospitalInfo","_s","doctorInfo","setDoctorInfo","hospitalId","getCarePath","CARE_PATHS","GET_HOSPITAL_INFO","hospital_branch_id","website_url","domainLocales","response","branch","doctorId","GET_DOCTOR_INFO","doctor","isDoctorAvailable","valid_outpatient","valid_telemedicine","isHospitalAvailable","total_available_service","total_available_doctor","hasQuickBooking","TogetherAuthConfigContextProvider","defaultParams","StyledCardPost","Divider","CardAuthor","time","userId","CardReactions","CardReactionType","reply","loveCount","replyCount","isReplied","hideCommentIcon","onCommentClick","onCommentCountClick","onLikeClick","r","CardPostPopoverMore","authorEmail","onDeletePost","shareUrl","onBookmark","onRemoveBookmark","onEditPost","togetherUserId","isOpenSharePopup","setIsOpenSharePopup","isAuthor","SharePopup","IconShareOnMedia","bookmarked","IconBookmarkFill","IconBookmark","BOOKMARK","post_id","user_id","subTree","Object","keys","REPORT_REASON_MAP","k","reportReasonText","reasonValue","item","jsxRenderer","setShow","getMostEngagingComment","callApiWithOptionalAuth","perPage","withoutReply","commentsRes","comments","hideViewMoreComment","showMostEngaging","onMostEngagingCommentClick","onPostCommentSuccessProp","disableCardLink","postProp","mostEngagingCommentProp","mostEngagingComment","onDeleteCommentProp","propsShowInputComment","InlineCommentsComponent","setPost","setMostEngagingComment","slug","isPin","scheduleDateTime","likesCount","commentsCount","commented","postRelativeHref","postHref","getCurrentBaseUrl","isLikeLoading","setIsLikeLoading","newMostEngaging","p","StyledCardPost$1","as","fontWeight","innertext_1","bannerImage","location","onShareClick","showingMostEngaging","isMainCmt","onPostCreatedEdited","communities","forceSelectCommunity","forceSelectTopics","articleId","optionalTopic","editPostData","defaultCommunity","defaultTopics","noFetchTopic","hideTopicList","isInEditMode","isSubmitting","setIsSubmitting","descriptionValue","setDescriptionValue","communityValue","setCommunityValue","__spreadArray","currentCommunity","communitiesList","isReadyToSubmit","submitPost","formatPost","onCreateEditSuccess","StyledCreateNewPost","Dropdown","options","placeholder","option","gray400","gray500","error"],"mappings":"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"}
|