@hhgtech/hhg-components 1.18.64 → 1.18.67

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.
Files changed (41) hide show
  1. package/build/components/atoms/index.d.ts +6 -3
  2. package/build/components/molecules/index.d.ts +16 -8
  3. package/build/components/organisms/navigationLayout/navigationBar/index.d.ts +1 -1
  4. package/build/components.js +1 -1
  5. package/build/esm/components/atoms/index.d.ts +6 -3
  6. package/build/esm/components/molecules/index.d.ts +16 -8
  7. package/build/esm/components/organisms/navigationLayout/navigationBar/index.d.ts +1 -1
  8. package/build/esm/components.js +1 -1
  9. package/build/esm/{index-773ec0fc.js → index-02015689.js} +2 -2
  10. package/build/esm/{index-773ec0fc.js.map → index-02015689.js.map} +1 -1
  11. package/build/esm/{index-6dc161c2.js → index-1b1f72cf.js} +2 -2
  12. package/build/esm/{index-6dc161c2.js.map → index-1b1f72cf.js.map} +1 -1
  13. package/build/esm/{index-ec347944.js → index-2481fb33.js} +2 -2
  14. package/build/esm/{index-ec347944.js.map → index-2481fb33.js.map} +1 -1
  15. package/build/esm/{index-335ef676.js → index-8492ba6c.js} +2 -2
  16. package/build/esm/{index-335ef676.js.map → index-8492ba6c.js.map} +1 -1
  17. package/build/esm/index.js +1 -1
  18. package/build/esm/{index.styled-e833993c.js → index.styled-c3644bb3.js} +2 -2
  19. package/build/esm/index.styled-c3644bb3.js.map +1 -0
  20. package/build/esm/navigation.js +1 -1
  21. package/build/esm/together.js +1 -1
  22. package/build/esm/{types-57296778.js → types-3adcc0f7.js} +2 -2
  23. package/build/esm/{types-57296778.js.map → types-3adcc0f7.js.map} +1 -1
  24. package/build/{index-7d955e63.js → index-9894ab41.js} +2 -2
  25. package/build/{index-7d955e63.js.map → index-9894ab41.js.map} +1 -1
  26. package/build/{index-a439fdab.js → index-a01cbfaa.js} +2 -2
  27. package/build/{index-a439fdab.js.map → index-a01cbfaa.js.map} +1 -1
  28. package/build/{index-7bfe3e4b.js → index-b8921c86.js} +2 -2
  29. package/build/{index-7bfe3e4b.js.map → index-b8921c86.js.map} +1 -1
  30. package/build/{index-b30cc5ed.js → index-ea7c6be1.js} +2 -2
  31. package/build/{index-b30cc5ed.js.map → index-ea7c6be1.js.map} +1 -1
  32. package/build/index.js +1 -1
  33. package/build/{index.styled-be645089.js → index.styled-719b0f7e.js} +2 -2
  34. package/build/index.styled-719b0f7e.js.map +1 -0
  35. package/build/navigation.js +1 -1
  36. package/build/together.js +1 -1
  37. package/build/{types-6be2db53.js → types-75086329.js} +2 -2
  38. package/build/{types-6be2db53.js.map → types-75086329.js.map} +1 -1
  39. package/package.json +1 -1
  40. package/build/esm/index.styled-e833993c.js.map +0 -1
  41. package/build/index.styled-be645089.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types-57296778.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/createNewPostContent/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"],"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 { 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","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(/(\\&nbsp;)+/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"],"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","CreateNewPostContent","onPostCreatedEdited","onClose","communities","forceSelectCommunity","forceSelectTopics","articleId","optionalTopic","editPostData","defaultCommunity","defaultTopics","noFetchTopic","hideTopicList","isInEditMode","pushNotifications","_f","isSubmitting","setIsSubmitting","_g","_h","descriptionValue","setDescriptionValue","_j","communityValue","setCommunityValue","_k","__spreadArray","_l","_m","setBannedWords","currentCommunity","find","c","communitiesList","a","b","_o","_p","invalidUrls","setInvalidUrls","isReadyToSubmit","post","decodeMention","decodePostUrl","mentions","community","photos","submitPost","resData","messages","moderation","formatPost","onCreateEditSuccess","words","call","m","includes","StyledCreateNewPost","Dropdown","options","placeholder","option","gray400","gray500","Button","error","isDisabled","PopupDanger","isMarryBabyProp","acceptText","cancelText","onAccept","thumbnail","isThumbnailIcon","isMarryBabyContext","isOpen","setIsOpen","toggleNoScroll","ReactDOM","createPortal","StyledPopupDanger","PopupFrame","stopPropagation","body","getCommentFormBody","postId","replyingUserId","replyingUserName","replyingId","submitText","photo","unshift","submitComment","COMMENT","submitReply","REPLY","likeUnlikeComment","commentId","setLike","UNLIKE","deleteComment","InputCommentBar","isReply","replyToName","replyingUser","onPostSuccess","userInfo","setText","trigger","MainInputTriggerContext","isSubmitLoading","setIsSubmitLoading","contentEditable","mainInput","scrollIntoView","behavior","block","StyledInputCommentBar","UserAvatar","avatar","DEFAULT_AVATAR_IMG","username","displayIcon","setEditorRef","div","handleSuccess","newComment","formatComment","images","JSON","parse","author","formBody","trim","SubmitReportForm","reasonText","loading","setLoading","StyledSubmitReportForm","IconAlertCircle","gray800","status","PostContent","replyingTo","mentionedUser","rawDescription","disableShortenContent","showAll","setShowAll","authActionWrapper","useTogetherAuthRequiredAction","openPopupExpert","setOpenPopupExpert","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","liked","s","authorRegex","decodeCommentBody","_joinCommunityIds","_joinTopicIds","maxRepliesShow","setMaxRepliesShow","isCommented","addNewReply","old","_q","showInputComment","setShowInputComment","sortedReplies","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","CardPost","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","as","fontWeight","bannerImage","location","onShareClick","showingMostEngaging","isMainCmt"],"mappings":"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"}
1
+ {"version":3,"file":"types-3adcc0f7.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/createNewPostContent/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"],"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 { 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","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(/(\\&nbsp;)+/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"],"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","CreateNewPostContent","onPostCreatedEdited","onClose","communities","forceSelectCommunity","forceSelectTopics","articleId","optionalTopic","editPostData","defaultCommunity","defaultTopics","noFetchTopic","hideTopicList","isInEditMode","pushNotifications","_f","isSubmitting","setIsSubmitting","_g","_h","descriptionValue","setDescriptionValue","_j","communityValue","setCommunityValue","_k","__spreadArray","_l","_m","setBannedWords","currentCommunity","find","c","communitiesList","a","b","_o","_p","invalidUrls","setInvalidUrls","isReadyToSubmit","post","decodeMention","decodePostUrl","mentions","community","photos","submitPost","resData","messages","moderation","formatPost","onCreateEditSuccess","words","call","m","includes","StyledCreateNewPost","Dropdown","options","placeholder","option","gray400","gray500","Button","error","isDisabled","PopupDanger","isMarryBabyProp","acceptText","cancelText","onAccept","thumbnail","isThumbnailIcon","isMarryBabyContext","isOpen","setIsOpen","toggleNoScroll","ReactDOM","createPortal","StyledPopupDanger","PopupFrame","stopPropagation","body","getCommentFormBody","postId","replyingUserId","replyingUserName","replyingId","submitText","photo","unshift","submitComment","COMMENT","submitReply","REPLY","likeUnlikeComment","commentId","setLike","UNLIKE","deleteComment","InputCommentBar","isReply","replyToName","replyingUser","onPostSuccess","userInfo","setText","trigger","MainInputTriggerContext","isSubmitLoading","setIsSubmitLoading","contentEditable","mainInput","scrollIntoView","behavior","block","StyledInputCommentBar","UserAvatar","avatar","DEFAULT_AVATAR_IMG","username","displayIcon","setEditorRef","div","handleSuccess","newComment","formatComment","images","JSON","parse","author","formBody","trim","SubmitReportForm","reasonText","loading","setLoading","StyledSubmitReportForm","IconAlertCircle","gray800","status","PostContent","replyingTo","mentionedUser","rawDescription","disableShortenContent","showAll","setShowAll","authActionWrapper","useTogetherAuthRequiredAction","openPopupExpert","setOpenPopupExpert","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","liked","s","authorRegex","decodeCommentBody","_joinCommunityIds","_joinTopicIds","maxRepliesShow","setMaxRepliesShow","isCommented","addNewReply","old","_q","showInputComment","setShowInputComment","sortedReplies","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","CardPost","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","as","fontWeight","bannerImage","location","onShareClick","showingMostEngaging","isMainCmt"],"mappings":"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"}