{"version":3,"sources":["webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/gallery-label.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/label-switcher-visible.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/current-gallery-article.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/swiper.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/nested-swiper.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/enable-index-for-recommend.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/current-article-related-post.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/layout-strategy.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/atoms/load-article-related-posts.ts","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/dot-indicator-section/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/end-recommend/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/gallery-index/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/gallery-label/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/gallery-slide/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/gallery-swiper/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/label-switcher/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/main-swiper/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/swiper-action/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/components/warning-label-section/index.tsx","webpack://@lemon8/webapp-seo/./src/components/article-gallery/index.tsx","webpack://@lemon8/webapp-seo/./src/components/avatar/index.tsx","webpack://@lemon8/webapp-seo/./src/components/end-recommend-card/index.tsx","webpack://@lemon8/webapp-seo/./src/components/simple-video/index.tsx","webpack://@lemon8/webapp-seo/./src/components/topic-card/topic-article-card/index.tsx","webpack://@lemon8/webapp-seo/./src/components/topic-card/index.tsx","webpack://@lemon8/webapp-seo/./src/components/video-end-recommend/index.tsx","webpack://@lemon8/webapp-seo/./src/components/warning-label/index.tsx","webpack://@lemon8/webapp-seo/./src/models/portal/simple-cta-modal.ts","webpack://@lemon8/webapp-seo/./src/utils/active/use-active-to-article.ts","webpack://@lemon8/webapp-seo/./src/utils/active/use-active-to-feed.ts","webpack://@lemon8/webapp-seo/./src/utils/format/time-ago-formatter.ts","webpack://@lemon8/webapp-seo/./src/utils/pending-queue.ts","webpack://@lemon8/webapp-seo/./src/utils/use-route-loader.ts"],"names":["$LabelVisible","atom","debugLabel","$LabelSwitcherVisible","get","galleryLabels","$CurrentGalleryArticle","currentGallerySlide","$CurrentGallerySlide","currentSlideLabels","filter","g","imageIndex","Boolean","length","$MainSwiper","$CurrentMainSlide","$GallerySwiper","$EndRecommendSwiper","$CurrentEndRecommendSlide","useMountCurrentSlideWithSwiper","$swiper","$slide","swiper","useScopedAtomValue","setSlide","useSetScopedAtom","useEffect","callback","activeIndex","on","off","$NestedSwiperSlideInfo","enableIndexForRecommend","$EnableIndexForRecommend","imageList","currentMainSlide","current","$SlideToNestedIndex","mainSwiper","gallerySwiper","index","nextMainSwiperIndex","slides","nextGallerySwiperIndex","_clamp","slideTo","$CurrentArticleRelatedPost","$CurrentArticleLoadableRelatedPost","loadable","EArticleGalleryLayoutStrategy","$LayoutStrategy","$RootPaddingBottom","firstImage","height","width","$LoadArticleRelatedPosts","DotIndicatorSection","nestedSwiperSlideInfo","slideToNestedIndex","ref","useRef","handleIndicatorChange","changeTo","Math","min","jsx","DotIndicator","className","count","onChange","EndRecommendContentLoading","children","Loading","variant","shadow","EndRecommendContentEmpty","t","useTranslation","EndRecommendContent","groupId","endRecommendSwiper","setEndRecommendSwiper","useScopedAtom","loadableRelatedPost","items","hasMore","useMemo","state","data","endRecommendItems","item","slice","handleProgress","_s","progress","allowSlidePrev","Swiper","resistanceRatio","slidesPerView","onSwiper","nested","map","rank","SwiperSlide","EndRecommendCard","article","size","EndRecommendSection","activeToFeed","useActiveToFeedForyou","loader","seeMoreObservedRef","useViewTracking","onView","useCallback","window","Tea","current_page_module","ModuleType","group_id","current_position","ClickPosition","handleEndRecommendBtnClick","useReflowClick","clickEvent","reflowBehavior","defaultBehavior","jsxs","Button","ButtonSize","onClick","title","displayName","GalleryIndex","galleryIndexShow","setGalleryIndexShow","useState","hiddenTimeout","clearTimeout","setTimeout","cls","hidden","concat","GalleryLabel","props","label","show","direction","id","name","xPct","yPct","nameRef","region","useAtomValue","$Locale","isLeft","galleryName","e","stopPropagation","addEventListener","removeEventListener","handleClick","calcPos","pos","isShow","style","left","top","Link","to","right","GallerySlide","image","author","isTranslatedVersion","nickName","labelVisible","isMobileUser","$IsMobileUser","setSimpleCTAModal","useSetAtom","$SimpleCTAModalShow","activeToArticle","useActiveToArticle","rootPaddingBottom","isBot","$UserAgent","imgAutoGenDesc","imgOcrText","showCaption","imageHeight","aspectRadio","rootAspectRatio","scale","currentPosition","body","handleClickConfirm","Image","src","url","alt","replace","String","GallerySection","_ref","setGallerySwiper","ocrText","imageAutoGenDesp","imageListWithExtraInfo","_objectSpread","galleryInit","ctaModalHasOpened","LabelVisibleSwitcher","labelSwitcherVisible","setLabelVisible","handleLabelSwitcherClick","raw","label_shown","shown","Tag","TagFill","MainSwiper","setMainSwiper","paddingBottom","effect","creativeEffect","prev","translate","next","opacity","modules","EffectCreative","SwiperAction","handleClickLeft","handleClickRight","StepScrollUI","onClickLeft","onClickRight","WarningLabelSection","WarningLabel","illegalInfo","ArticleGalleryImpl","Fragment","ArticleGallery","articleRelatedPosts","layoutStrategy","loadArticleRelated","ScopedProvider","atoms","atomsWithHydration","Avatar","useActiveToArticleBySimpleArticle","avatar","authorAvatar","userId","articleClass","articleLikes","largeImage","canonicalUri","formatNum","useNumFormatter","cardObservedRef","media_id","article_class","impr_id","imprId","handleEventClick","page_click_id","articleLink","linkName","split","authorLink","imageSrc","PlayFillIcon","HeartIcon","Number","VideoStatus","SimpleVideo","videoSrc","posterSrc","autoPlay","loop","videoRef","status","setStatus","muted","setMuted","useImperativeHandle","video","seek","time","currentTime","play","_a","catch","pause","mute","unmute","p0","p1","p2","handlePlayEvent","handlePauseEvent","handleEndEvent","playsInline","poster","onPause","onPlay","onEnded","Array","forwardRef","TopicArticleCard","topic","topicId","shortContent","active","usePageActive","articleHref","handleArticleClick","_","bundle","schemaOption","pageType","ArticleClass","ampExtra","enter_position","event","draggable","target","VideoIcon","MIN_HASHTAG_ARTICLE_COUNT","MAX_HASHTAG_ARTICLE_COUNT","TopicCard","$PageLevelTraffic","isKEPPage","EPageType","isOnlyWord","currentPageModule","$CurrentPageModule","topicHref","topicName","handleHashtagClick","query","hashtagId","description","num","viewCount","hashtagRef","NumberIcon","articles","StepScroll","VideoEndRecommendNoContent","VideoEndRecommendLoading","VideoEndRecommend","activeToFeedForyou","relatedPost","onClickReplay","activeToCurrentArticle","observedRef","mainSeeMoreRef","is_cta","replayBtnRef","handleReplayBtnClick","itemsToShow","ArrowClockwise","ExclamationMark","warningLabel","atomWithReset","position","EArticleClass","authorId","enter_page_click_id","useActiveToArticleAuthor","categoryId","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","ONE_WEEK","EIGHT_DAY","formatTimeAgo","now","Date","after","seconds","floor","minutes","hours","days","weeks","timeDayjs","dayjs","year","format","useTimeAgoFormatter","PendingQueue","constructor","_tasks","_doInterval","console","log","forEach","task","setInterval","push","pendingQueue","getAtom","key","res","includes","atomKey","args","decodeArgs","a","decodeURIComponent","atomFamily","atomFamilies","error","useRouteLoader","method","params","store","useStore","fetcher","useFetcher","load","searchParams","URLSearchParams","set","Object","entries","value","location","pathname","toString","_ref2","startsWith","atomToSet"],"mappings":"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","file":"897-4810aa2b2481d881bd1a.js","sourcesContent":["import { atom } from 'jotai';\n\nexport const $LabelVisible = atom(true);\n","import { atom } from 'jotai';\nimport { $CurrentGalleryArticle, $CurrentGallerySlide } from '.';\n\nexport const $LabelSwitcherVisible = atom((get) => {\n const { galleryLabels } = get($CurrentGalleryArticle);\n const currentGallerySlide = get($CurrentGallerySlide);\n\n const currentSlideLabels = galleryLabels.filter((g) => g.imageIndex === currentGallerySlide);\n\n return Boolean(currentSlideLabels.length);\n});\n","import { atom } from 'jotai';\nimport { IGalleryArticleDetail } from 'shared/models';\n\nexport const $CurrentGalleryArticle = atom({} as IGalleryArticleDetail);\n","import { atom, PrimitiveAtom } from 'jotai';\nimport { Swiper as SwiperClass } from 'swiper/types';\nimport { useScopedAtomValue, useSetScopedAtom } from '@lemon8/webapp-shared';\nimport { useEffect } from 'react';\n\ntype TSwiperOrNot = SwiperClass | null;\n\nexport const $MainSwiper = atom(null as TSwiperOrNot);\nexport const $CurrentMainSlide = atom(0);\n\nexport const $GallerySwiper = atom(null as TSwiperOrNot);\nexport const $CurrentGallerySlide = atom(0);\n\nexport const $EndRecommendSwiper = atom(null as TSwiperOrNot);\nexport const $CurrentEndRecommendSlide = atom(0);\n\n/**\n * bind current-slide atom to a swiper atom.\n */\nexport const useMountCurrentSlideWithSwiper = (\n $swiper: PrimitiveAtom,\n $slide: PrimitiveAtom,\n): void => {\n const swiper = useScopedAtomValue($swiper);\n const setSlide = useSetScopedAtom($slide);\n\n useEffect(() => {\n if (!swiper) {\n return;\n }\n\n const callback = (swiper: SwiperClass): void => {\n setSlide(swiper.activeIndex);\n };\n\n swiper.on('slideChange', callback);\n\n return () => {\n swiper.off('slideChange', callback);\n };\n }, [swiper, setSlide]);\n};\n","import { atom } from 'jotai';\nimport {\n $EnableIndexForRecommend,\n $GallerySwiper,\n $MainSwiper,\n $CurrentGalleryArticle,\n $CurrentMainSlide,\n $CurrentGallerySlide,\n} from '.';\nimport _clamp from 'lodash/clamp';\n\ninterface INestedSwiper {\n length: number;\n /**\n * current index for nested gallery swiper\n *\n * starts from 0\n */\n current: number;\n}\n\nexport const $NestedSwiperSlideInfo = atom((get) => {\n const enableIndexForRecommend = get($EnableIndexForRecommend);\n const { imageList } = get($CurrentGalleryArticle);\n const currentMainSlide = get($CurrentMainSlide);\n const currentGallerySlide = get($CurrentGallerySlide);\n\n if (enableIndexForRecommend) {\n return {\n length: imageList.length + 1,\n current: currentGallerySlide + currentMainSlide,\n };\n }\n\n return {\n length: imageList.length,\n current: currentGallerySlide,\n };\n});\n\nexport const $SlideToNestedIndex = atom((get) => {\n const enableIndexForRecommend = get($EnableIndexForRecommend);\n const mainSwiper = get($MainSwiper);\n const gallerySwiper = get($GallerySwiper);\n\n return (index: number): void => {\n if (!mainSwiper || !gallerySwiper) {\n return;\n }\n\n let nextMainSwiperIndex: 1 | 0;\n if (enableIndexForRecommend) {\n nextMainSwiperIndex = index >= gallerySwiper.slides.length ? 1 : 0;\n } else {\n nextMainSwiperIndex = 0;\n }\n\n const nextGallerySwiperIndex = _clamp(index - nextMainSwiperIndex, 0, gallerySwiper.slides.length - 1);\n\n mainSwiper.slideTo(nextMainSwiperIndex);\n gallerySwiper.slideTo(nextGallerySwiperIndex);\n };\n});\n","import { atom } from 'jotai';\n\n/**\n * enable additional index or dot for End Recommendation Section\n */\nexport const $EnableIndexForRecommend = atom(false);\n","import { atom } from 'jotai';\nimport { loadable } from 'node_modules/jotai/utils';\nimport { IArticleRelatedPost } from 'shared/atoms';\nimport { PromiseOrValue } from 'shared/utils/promise-or-value';\n\nexport const $CurrentArticleRelatedPost = atom({} as PromiseOrValue);\nexport const $CurrentArticleLoadableRelatedPost = loadable($CurrentArticleRelatedPost);\n","import { atom } from 'jotai';\nimport { $CurrentGalleryArticle } from './current-gallery-article';\nimport _clamp from 'lodash/clamp';\n\nexport enum EArticleGalleryLayoutStrategy {\n SQUARE,\n RECTANGLE,\n}\n\nexport const $LayoutStrategy = atom(EArticleGalleryLayoutStrategy.SQUARE);\n\nexport const $RootPaddingBottom = atom((get) => {\n const layoutStrategy = get($LayoutStrategy);\n\n if (layoutStrategy === EArticleGalleryLayoutStrategy.SQUARE) {\n return 100;\n }\n\n const { imageList } = get($CurrentGalleryArticle);\n const firstImage = imageList[0];\n if (!firstImage) {\n return 100;\n }\n\n return 100 * _clamp(firstImage.height / firstImage.width, 3 / 4, 4 / 3);\n});\n","import { atom } from 'jotai';\n\ninterface ILoadArticleRelatedPostsValue {\n loader?: () => void;\n}\n\nexport const $LoadArticleRelatedPosts = atom({});\n","import { DotIndicator, DotIndicatorRef } from '~/components/dot-indicator';\nimport { useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { FC, useEffect, useRef } from 'react';\nimport { $NestedSwiperSlideInfo, $SlideToNestedIndex } from '~/components/article-gallery/atoms';\n\nimport './style.scss';\n\nexport const DotIndicatorSection: FC = () => {\n const nestedSwiperSlideInfo = useScopedAtomValue($NestedSwiperSlideInfo);\n const slideToNestedIndex = useScopedAtomValue($SlideToNestedIndex);\n const ref = useRef(null);\n\n const handleIndicatorChange = (index: number): void => slideToNestedIndex(index);\n\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n ref.current.changeTo(Math.min(nestedSwiperSlideInfo.current, nestedSwiperSlideInfo.length));\n }, [nestedSwiperSlideInfo.current]);\n\n return (\n \n );\n};\n","import { Button, ButtonSize } from '@lemon8/design';\nimport { FC, useCallback, useEffect, useMemo } from 'react';\nimport { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';\nimport { useTranslation } from 'react-i18next';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { Article } from '@lemon8/webapp-seo-shared';\nimport { EndRecommendCard } from '~/components/end-recommend-card';\nimport { ModuleType } from '~/utils/module-type';\nimport { ClickPosition } from '~/utils/click-position';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { useActiveToFeedForyou } from '~/utils/active/use-active-to-feed';\nimport { Loading } from '~/components/loading';\nimport { useScopedAtomValue, useScopedAtom } from '@lemon8/webapp-shared/component';\nimport {\n $CurrentGalleryArticle,\n $MainSwiper,\n $EndRecommendSwiper,\n $CurrentArticleLoadableRelatedPost,\n $CurrentGallerySlide,\n $LoadArticleRelatedPosts,\n $CurrentMainSlide,\n} from '~/components/article-gallery/atoms';\n\nimport './style.scss';\n\nconst EndRecommendContentLoading: FC = () => {\n return (\n
\n \n
\n );\n};\n\nconst EndRecommendContentEmpty: FC = () => {\n const { t } = useTranslation();\n return (\n
\n {t('no_content')}\n
\n );\n};\n\nconst EndRecommendContent: FC = () => {\n const { groupId } = useScopedAtomValue($CurrentGalleryArticle);\n const mainSwiper = useScopedAtomValue($MainSwiper);\n const [endRecommendSwiper, setEndRecommendSwiper] = useScopedAtom($EndRecommendSwiper);\n const loadableRelatedPost = useScopedAtomValue($CurrentArticleLoadableRelatedPost);\n const { items, hasMore } = useMemo(() => {\n if (loadableRelatedPost.state === 'hasData') {\n return loadableRelatedPost.data;\n }\n\n return {\n items: [] as Article[],\n hasMore: true,\n };\n }, [loadableRelatedPost]);\n\n const endRecommendItems: Article[] = items.filter((item) => item.groupId !== groupId).slice(0, 5);\n\n useEffect(() => {\n if (!endRecommendSwiper) {\n return;\n }\n\n const handleProgress = (_s: SwiperClass, progress: number) => {\n if (!mainSwiper) {\n return;\n }\n\n if (progress) {\n mainSwiper.slideTo(1);\n mainSwiper.allowSlidePrev = false;\n } else {\n mainSwiper.allowSlidePrev = true;\n }\n };\n\n endRecommendSwiper.on('progress', handleProgress);\n\n return () => {\n endRecommendSwiper.off('progress', handleProgress);\n };\n }, [mainSwiper, endRecommendSwiper]);\n\n if (items.length === 0 && hasMore) {\n return ;\n }\n\n if (endRecommendItems.length <= 2) {\n return ;\n }\n\n return (\n \n {endRecommendItems.map((item, rank) => (\n \n \n \n ))}\n \n );\n};\n\nexport const EndRecommendSection: FC = () => {\n const { t } = useTranslation();\n const activeToFeed = useActiveToFeedForyou();\n const currentMainSlide = useScopedAtomValue($CurrentMainSlide);\n const currentGallerySlide = useScopedAtomValue($CurrentGallerySlide);\n const { imageList, groupId } = useScopedAtomValue($CurrentGalleryArticle);\n const { loader } = useScopedAtomValue($LoadArticleRelatedPosts);\n\n const seeMoreObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_module_show', {\n current_page_module: ModuleType.main_related_post,\n group_id: groupId,\n });\n window.Tea('wap_cta_show', {\n current_page_module: ModuleType.main_related_post,\n current_position: ClickPosition.main_see_more_btn,\n group_id: groupId,\n });\n }, []),\n });\n\n const handleEndRecommendBtnClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: ClickPosition.main_see_more_btn,\n }),\n reflowBehavior: () => {\n activeToFeed(ClickPosition.main_see_more_btn);\n },\n defaultBehavior: () => {\n activeToFeed(ClickPosition.main_see_more_btn);\n },\n },\n [activeToFeed],\n );\n\n useEffect(() => {\n if (!loader) {\n return;\n }\n\n if (imageList.length === 1) {\n if (currentMainSlide === 1) {\n loader();\n }\n } else {\n if (currentGallerySlide === imageList.length - 1) {\n loader();\n }\n }\n }, [currentMainSlide, currentGallerySlide, imageList, loader]);\n\n return (\n \n
\n

{t('seo_v3_postDetail_recommended_title')}

\n
\n \n
\n
\n \n
\n
\n
\n );\n};\n\nEndRecommendSection.displayName = SwiperSlide.displayName;\n","import { FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { $NestedSwiperSlideInfo } from '~/components/article-gallery/atoms';\nimport cls from 'classnames';\n\nimport './style.scss';\n\nexport const GalleryIndex: FC = () => {\n const nestedSwiperSlideInfo = useScopedAtomValue($NestedSwiperSlideInfo);\n\n const [galleryIndexShow, setGalleryIndexShow] = useState(true);\n const hiddenTimeout = useRef();\n\n useEffect(() => {\n setGalleryIndexShow(true);\n window.clearTimeout(hiddenTimeout.current);\n hiddenTimeout.current = window.setTimeout(() => {\n setGalleryIndexShow(false);\n }, 3000);\n }, [nestedSwiperSlideInfo.current]);\n\n return (\n
\n {`${nestedSwiperSlideInfo.current + 1}/${nestedSwiperSlideInfo.length}`}\n
\n );\n};\n","import { FC, useRef, useEffect, SyntheticEvent } from 'react';\nimport cls from 'classnames';\nimport { GalleryLabelType } from 'shared/models';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/webapp-shared/model';\nimport { Link } from '@remix-run/react';\n\nimport './style.scss';\n\ninterface ImgLabelProps {\n label: GalleryLabelType;\n show: boolean;\n}\n\nexport const GalleryLabel: FC = (props) => {\n const { label, show } = props;\n\n const { direction, id, name, xPct, yPct } = label;\n const nameRef = useRef(null);\n const { region } = useAtomValue($Locale);\n\n const isLeft = direction === 'left';\n\n useEffect(() => {\n const galleryName = nameRef.current;\n if (!galleryName) {\n return;\n }\n\n const callback = (e: TouchEvent): void => {\n e.stopPropagation();\n };\n\n galleryName.addEventListener('touchstart', callback);\n return () => galleryName.removeEventListener('touchstart', callback);\n }, []);\n\n const handleClick = (e: SyntheticEvent) => {\n e.stopPropagation();\n };\n\n /**\n * 兜底坐标\n *\n * @param pos - 服务器传来的坐标\n */\n const calcPos = (pos: number) => {\n if (pos < 0.03) {\n return 0.03;\n } else if (pos > 0.97) {\n return 0.97;\n }\n return pos;\n };\n\n return (\n \n
\n
\n
\n
\n \n #{name}\n \n
\n );\n};\n","import { FC, useCallback, useMemo } from 'react';\nimport { SwiperSlide } from 'swiper/react';\nimport { IImage } from 'shared/models/media';\nimport { Image } from '~/components/image';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { useTranslation } from 'react-i18next';\nimport { $SimpleCTAModalShow } from '~/models/portal/simple-cta-modal';\nimport { ClickPosition } from '~/utils/click-position';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { $CurrentGalleryArticle, $LabelVisible, $RootPaddingBottom } from '~/components/article-gallery/atoms';\nimport { useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { GalleryLabel } from '../gallery-label';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\nimport { $UserAgent } from '@lemon8/webapp-shared';\n\nimport './style.scss';\n\ninterface IGallerySlideProps {\n image: IImage & { imgOcrText: string; imgAutoGenDesc: string };\n index: number;\n}\n\nexport const GallerySlide: FC = (props) => {\n const { image, index } = props;\n const { t } = useTranslation();\n const article = useScopedAtomValue($CurrentGalleryArticle);\n const { title, galleryLabels, author, isTranslatedVersion = false } = article;\n const { nickName = '' } = author;\n const labelVisible = useScopedAtomValue($LabelVisible);\n const isMobileUser = useAtomValue($IsMobileUser);\n const setSimpleCTAModal = useSetAtom($SimpleCTAModalShow);\n const activeToArticle = useActiveToArticle(article);\n const rootPaddingBottom = useScopedAtomValue($RootPaddingBottom);\n const { isBot } = useAtomValue($UserAgent);\n\n const { imgAutoGenDesc, imgOcrText } = image;\n\n const showCaption = isBot && imgOcrText && !isTranslatedVersion;\n\n const imageHeight = showCaption ? '95%' : '100%';\n\n const currentSlideLabels = galleryLabels.filter((g) => g.imageIndex === index);\n\n const style = useMemo(() => {\n // to show ocr text completely\n if (isBot) {\n return {\n width: '100%',\n height: '100%',\n };\n }\n\n const { width, height } = image;\n const aspectRadio = width / height;\n const rootAspectRatio = 100 / rootPaddingBottom;\n\n const scale = Math.min(aspectRadio / rootAspectRatio, rootAspectRatio / aspectRadio);\n\n return {\n width: `${100 * scale}%`,\n height: `${(100 * scale) / aspectRadio}%`,\n };\n }, [rootPaddingBottom, isBot]);\n\n const handleClick = useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_click', {\n current_position: ClickPosition.gallery_img_open,\n });\n setSimpleCTAModal({\n currentPosition: ClickPosition.gallery_img_open_modal,\n body: t('seo_stopVideo_modal_desc'),\n handleClickConfirm: () => activeToArticle(ClickPosition.gallery_img_open_modal),\n });\n }\n }, [activeToArticle]);\n\n return (\n \n
\n
\n
\n \n
\n {currentSlideLabels.map((label, index) => (\n \n ))}\n
\n
\n {showCaption && (\n
{`${t('seo_keyword_page_postedBy')} ${nickName}. ${imgOcrText}`}
\n )}\n
\n
\n
\n );\n};\n\nGallerySlide.displayName = SwiperSlide.displayName;\n","import { FC, PropsWithChildren, useEffect, useRef } from 'react';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { GallerySlide } from '../gallery-slide';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useScopedAtomValue, useSetScopedAtom } from '@lemon8/webapp-shared/component';\nimport { $CurrentGalleryArticle, $CurrentGallerySlide, $GallerySwiper } from '../../atoms';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { $SimpleCTAModalShow } from '~/models/portal/simple-cta-modal';\nimport { useTranslation } from 'react-i18next';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\n\nimport './style.scss';\n\nexport const GallerySection: FC = ({ children }) => {\n const { t } = useTranslation();\n const article = useScopedAtomValue($CurrentGalleryArticle);\n const activeToArticle = useActiveToArticle(article);\n const isMobileUser = useAtomValue($IsMobileUser);\n const setSimpleCTAModal = useSetAtom($SimpleCTAModalShow);\n const setGallerySwiper = useSetScopedAtom($GallerySwiper);\n const currentGallerySlide = useScopedAtomValue($CurrentGallerySlide);\n\n const { imageList, ocrText = [], imageAutoGenDesp = [] } = article;\n\n const imageListWithExtraInfo = imageList.map((image, index) => {\n return {\n ...image,\n imgOcrText: ocrText[index] || '',\n imgAutoGenDesc: imageAutoGenDesp[index] || '',\n };\n });\n\n /**\n * open gallery slide modal only once\n */\n const galleryInit = useRef(false);\n const ctaModalHasOpened = useRef(false);\n useEffect(() => {\n if (!galleryInit.current && !currentGallerySlide) {\n return;\n }\n galleryInit.current = true;\n\n window.Tea('wap_click', {\n current_position: ClickPosition.main_gallery_slide,\n });\n\n if (!ctaModalHasOpened.current && isMobileUser) {\n setSimpleCTAModal({\n currentPosition: ClickPosition.main_gallery_slide_modal,\n body: t('seo_nextPic_modal_desc'),\n handleClickConfirm: () => activeToArticle(ClickPosition.main_gallery_slide_modal),\n });\n ctaModalHasOpened.current = true;\n }\n }, [currentGallerySlide]);\n\n return (\n \n \n {imageListWithExtraInfo.map((image, index) => (\n \n ))}\n \n {children}\n \n );\n};\n\nGallerySection.displayName = SwiperSlide.displayName;\n","import cls from 'classnames';\nimport Tag from 'icon/tag.svg';\nimport TagFill from 'icon/tag_fill.svg';\nimport { useScopedAtom, useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { FC, useCallback } from 'react';\nimport { $LabelVisible, $LabelSwitcherVisible } from '../../atoms';\n\nimport './style.scss';\n\nexport const LabelVisibleSwitcher: FC = () => {\n const labelSwitcherVisible = useScopedAtomValue($LabelSwitcherVisible);\n const [labelVisible, setLabelVisible] = useScopedAtom($LabelVisible);\n\n const handleLabelSwitcherClick = useCallback(() => {\n setLabelVisible((raw) => !raw);\n }, []);\n\n return (\n \n {labelVisible ? : }\n
\n );\n};\n","import { Swiper } from 'swiper/react';\nimport { EffectCreative } from 'swiper/modules';\nimport { FC, PropsWithChildren } from 'react';\nimport { useScopedAtomValue, useSetScopedAtom } from '@lemon8/webapp-shared/component';\nimport { $MainSwiper, $RootPaddingBottom } from '../../atoms';\n\nimport './style.scss';\n\nexport const MainSwiper: FC = ({ children }) => {\n const setMainSwiper = useSetScopedAtom($MainSwiper);\n const paddingBottom = useScopedAtomValue($RootPaddingBottom);\n\n return (\n \n {children}\n \n );\n};\n","import { useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { FC, PropsWithChildren } from 'react';\nimport { StepScrollUI } from '~/components/step-scroll-ui';\nimport { $NestedSwiperSlideInfo, $SlideToNestedIndex } from '../../atoms';\n\nexport const SwiperAction: FC = (props) => {\n const { children } = props;\n const nestedSwiperSlideInfo = useScopedAtomValue($NestedSwiperSlideInfo);\n const slideToNestedIndex = useScopedAtomValue($SlideToNestedIndex);\n\n const left = nestedSwiperSlideInfo.current > 0;\n const right = nestedSwiperSlideInfo.current < nestedSwiperSlideInfo.length - 1;\n\n const handleClickLeft = (): void => slideToNestedIndex(nestedSwiperSlideInfo.current - 1);\n const handleClickRight = (): void => slideToNestedIndex(nestedSwiperSlideInfo.current + 1);\n\n return (\n \n {children}\n \n );\n};\n","import { useScopedAtomValue } from '@lemon8/webapp-shared/component';\nimport { FC } from 'react';\nimport { $CurrentGalleryArticle } from '~/components/article-gallery/atoms';\nimport { WarningLabel } from '~/components/warning-label';\n\nexport const WarningLabelSection: FC = () => {\n const article = useScopedAtomValue($CurrentGalleryArticle);\n\n return ;\n};\n","import { ScopedProvider } from '@lemon8/webapp-shared';\nimport { FC } from 'react';\nimport {\n $LabelVisible,\n $LabelSwitcherVisible,\n $CurrentGallerySlide,\n $CurrentGalleryArticle,\n $CurrentMainSlide,\n $EnableIndexForRecommend,\n $CurrentEndRecommendSlide,\n $EndRecommendSwiper,\n $GallerySwiper,\n $MainSwiper,\n $CurrentArticleRelatedPost,\n useMountCurrentSlideWithSwiper,\n $NestedSwiperSlideInfo,\n $SlideToNestedIndex,\n EArticleGalleryLayoutStrategy,\n $LayoutStrategy,\n $RootPaddingBottom,\n $LoadArticleRelatedPosts,\n $CurrentArticleLoadableRelatedPost,\n} from './atoms';\nimport {\n DotIndicatorSection,\n EndRecommendSection,\n GalleryIndex,\n GallerySection,\n LabelVisibleSwitcher,\n MainSwiper,\n SwiperAction,\n WarningLabelSection,\n} from './components';\nimport { IGalleryArticleDetail } from 'shared/models';\nimport { PromiseOrValue } from 'shared/utils/promise-or-value';\nimport { IArticleRelatedPost } from 'shared/atoms';\n\nconst ArticleGalleryImpl: FC = () => {\n useMountCurrentSlideWithSwiper($MainSwiper, $CurrentMainSlide);\n useMountCurrentSlideWithSwiper($GallerySwiper, $CurrentGallerySlide);\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\ninterface IArticleGalleryProps {\n /** data */\n article: IGalleryArticleDetail;\n articleRelatedPosts: PromiseOrValue;\n loadArticleRelated?: () => void;\n\n /** config */\n enableIndexForRecommend: boolean;\n layoutStrategy?: EArticleGalleryLayoutStrategy;\n}\n\nexport const ArticleGallery: FC = (props) => {\n const {\n article,\n enableIndexForRecommend,\n articleRelatedPosts,\n layoutStrategy = EArticleGalleryLayoutStrategy.SQUARE,\n loadArticleRelated,\n } = props;\n\n return (\n \n \n \n );\n};\n","import React, { FC } from 'react';\nimport { Image } from '~/components/image';\nimport cls from 'classnames';\n\nimport './style.scss';\n\ntype AvatarProps = React.DetailedHTMLProps, HTMLImageElement>;\n\nexport const Avatar: FC = (props) => {\n const { className } = props;\n\n return ;\n};\n","import { Link } from '@remix-run/react';\nimport cls from 'classnames';\nimport PlayFillIcon from 'icon/play_fill.svg';\nimport HeartIcon from 'icon/heart.svg';\nimport { useCallback, useMemo } from 'react';\nimport { useNumFormatter } from '~/utils/format';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/webapp-shared/model';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { ModuleType } from '~/utils/module-type';\nimport { ClickPosition } from '~/utils/click-position';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { Article } from '@lemon8/webapp-seo-shared';\nimport { useActiveToArticleBySimpleArticle } from '~/utils/active/use-active-to-article';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\n\nimport './style.scss';\n\ninterface EndRecommendCardProps {\n article: Article;\n size: 'normal' | 'small';\n rank: number;\n}\n\nexport const EndRecommendCard = (props: EndRecommendCardProps) => {\n const { article, size, rank } = props;\n const { region } = useAtomValue($Locale);\n const activeToArticle = useActiveToArticleBySimpleArticle(article);\n const isMobileUser = useAtomValue($IsMobileUser);\n\n const {\n author: { nickName, avatar: authorAvatar, userId },\n title,\n articleClass,\n groupId,\n articleLikes,\n largeImage,\n imageList,\n canonicalUri,\n } = article;\n\n const formatNum = useNumFormatter();\n\n const cardObservedRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: ModuleType.main_related_post,\n current_position: ClickPosition.main_related_post,\n group_id: groupId,\n media_id: userId,\n article_class: articleClass,\n rank,\n });\n }\n window.Tea('wap_related_post_show', {\n current_page_module: ModuleType.main_related_post,\n current_position: ClickPosition.main_related_post,\n group_id: groupId,\n media_id: userId,\n impr_id: article.imprId,\n article_class: articleClass,\n rank,\n });\n }, [article, rank, groupId, userId, articleClass]),\n });\n\n const handleEventClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: ClickPosition.main_related_post,\n current_page_module: ModuleType.main_related_post,\n page_click_id: groupId,\n }),\n reflowBehavior: () => {\n activeToArticle(ClickPosition.main_related_post, groupId);\n },\n },\n [groupId],\n );\n\n const articleLink = useMemo(() => {\n const linkName = canonicalUri.split('/')[1];\n\n return `/${linkName}/${groupId}?region=${region}`;\n }, [region, canonicalUri, groupId]);\n\n const authorLink = useMemo(() => {\n const linkName = canonicalUri.split('/')[1];\n\n return `/${linkName}?region=${region}`;\n }, [canonicalUri, region]);\n\n const imageSrc = useMemo(() => {\n if (articleClass === 'Gallery') {\n return imageList[0].url;\n }\n\n return largeImage.url;\n }, [articleClass, imageList, largeImage]);\n\n return (\n \n \n {title}\n
\n {articleClass === 'Video' && }\n
\n

{title}

\n \n \n {nickName}\n {nickName}\n {Boolean(articleLikes) && (\n
\n \n {formatNum(Number(articleLikes))}\n
\n )}\n \n
\n
\n \n
\n );\n};\n","import { ForwardedRef, forwardRef, ForwardRefRenderFunction, useImperativeHandle, useRef, useState } from 'react';\n\nexport interface SimpleVideoProps {\n className?: string;\n\n onClick?: () => void;\n\n /**\n * @default false\n */\n loop?: boolean;\n\n /**\n * @default false\n */\n autoPlay?: boolean;\n\n videoSrc: string | string[];\n\n posterSrc: string;\n}\n\nexport enum VideoStatus {\n INITIAL = 'initial',\n PLAYING = 'playing',\n PAUSED = 'paused',\n ENDED = 'ended',\n}\n\nexport interface SimpleVideoForwardProps {\n video: HTMLVideoElement;\n\n seek: (time: number) => void;\n\n play: () => void;\n\n pause: () => void;\n\n mute: () => void;\n\n unmute: () => void;\n\n status: VideoStatus;\n\n muted: boolean;\n\n addEventListener: HTMLVideoElement['addEventListener'];\n removeEventListener: HTMLVideoElement['removeEventListener'];\n}\n\n/**\n * 支持 SSR 的 video 组件\n */\nconst SimpleVideo: ForwardRefRenderFunction = (\n props: SimpleVideoProps,\n ref: ForwardedRef,\n) => {\n const { className, onClick, videoSrc, posterSrc, autoPlay = false, loop = false } = props;\n\n const videoRef = useRef(null);\n const [status, setStatus] = useState(VideoStatus.INITIAL);\n const [muted, setMuted] = useState(true);\n\n useImperativeHandle(\n ref,\n () => ({\n video: videoRef.current as HTMLVideoElement,\n seek: (time: number) => {\n if (videoRef.current) {\n videoRef.current.currentTime = time;\n }\n },\n play: () => {\n videoRef.current?.play().catch(() => void 0);\n },\n pause: () => {\n videoRef.current?.pause();\n },\n mute: () => {\n if (videoRef.current) {\n setMuted(true);\n videoRef.current.muted = true;\n }\n },\n unmute: () => {\n if (videoRef.current) {\n setMuted(false);\n videoRef.current.muted = false;\n }\n },\n status,\n muted,\n addEventListener: (\n p0: Parameters[0],\n p1: Parameters[1],\n p2: Parameters[2],\n ) => {\n videoRef.current?.addEventListener(p0, p1, p2);\n },\n removeEventListener: (\n p0: Parameters[0],\n p1: Parameters[1],\n p2: Parameters[2],\n ) => {\n videoRef.current?.removeEventListener(p0, p1, p2);\n },\n }),\n [videoRef, status, muted],\n );\n\n const handlePlayEvent = () => {\n setStatus(VideoStatus.PLAYING);\n };\n\n const handlePauseEvent = () => {\n setStatus(VideoStatus.PAUSED);\n };\n\n const handleEndEvent = () => {\n setStatus(VideoStatus.ENDED);\n };\n\n return (\n \n {typeof videoSrc === 'string' && }\n {videoSrc instanceof Array && videoSrc.map((src) => )}\n \n );\n};\n\nexport default forwardRef(SimpleVideo);\n","import { ArticleClass, Topic, TopicArticle } from '@lemon8/webapp-seo-shared';\nimport { Link, useParams } from '@remix-run/react';\nimport { useCallback, FC, useMemo, SyntheticEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Image } from '~/components/image';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport VideoIcon from 'icon/play_fill.svg';\nimport HeartIcon from 'icon/heart.svg';\nimport { useAtomValue } from 'jotai';\nimport { $Locale, $UserAgent } from '@lemon8/webapp-shared/model';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\n\nimport './style.scss';\n\ninterface TopicArticleCardProps {\n topic: Topic;\n article: TopicArticle;\n}\n\nexport const TopicArticleCard: FC = ({ topic, article }) => {\n const { topicId } = topic;\n const { canonicalUri, articleClass, articleLikes, shortContent, title, largeImage, groupId } = article;\n const { region } = useAtomValue($Locale);\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const active = usePageActive();\n\n const articleHref = useMemo(() => `${canonicalUri}?region=${region}`, [region]);\n\n const handleArticleClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.related_hashtag,\n page_click_id: topicId,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === ArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n },\n ampExtra: {\n enter_position: ClickPosition.related_hashtag,\n },\n });\n },\n defaultBehavior: (event?: SyntheticEvent) => {\n event?.stopPropagation();\n },\n },\n [active, topicId, groupId],\n );\n\n return (\n \n \n
\n
\n {t('own_picture').replace('%s',\n
\n
\n
\n \n {formatNum(articleLikes)}\n
\n {articleClass === ArticleClass.VIDEO && (\n
\n \n
\n )}\n
\n
\n

{title}

\n

{shortContent}

\n
\n \n
\n );\n};\n","import { Topic } from '@lemon8/webapp-seo-shared';\nimport { Link } from '@remix-run/react';\nimport { FC, useMemo, useCallback } from 'react';\nimport { StepScroll } from '../step-scroll';\nimport { TopicArticleCard } from './topic-article-card';\nimport NumberIcon from '@lemon8/design/lib/icons/icon_assets/number_fill.svg';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/webapp-shared/model';\nimport { useTranslation } from 'react-i18next';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { EPageType } from 'shared/models';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useScopedAtomValue } from '@lemon8/webapp-shared';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { useViewTracking } from '~/utils/use-view-tracking';\n\nimport './style.scss';\n\nconst MIN_HASHTAG_ARTICLE_COUNT = 3;\nconst MAX_HASHTAG_ARTICLE_COUNT = 10;\n\ninterface TopicCardProps {\n topic: Topic | string;\n}\n\nexport const TopicCard: FC = ({ topic }) => {\n const { pageType } = useAtomValue($PageLevelTraffic);\n const isKEPPage = pageType === EPageType.discover;\n\n const isOnlyWord = typeof topic === 'string';\n const { t } = useTranslation();\n const { region } = useAtomValue($Locale);\n const formatNum = useNumFormatter();\n const active = usePageActive();\n\n const isMobileUser = useAtomValue($IsMobileUser);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n\n const topicHref = useMemo(() => {\n // TODO 目前只处理 discover 下方的 topic\n if (!isKEPPage) {\n if (isOnlyWord) {\n return `/discover/${topic}?region=${region}`;\n } else {\n return `/discover/${topic.topicName}?region=${region}`;\n }\n }\n if (isOnlyWord) {\n return `/discover/${topic}?region=${region}`;\n }\n return `/topic/${topic.topicId}?region=${region}`;\n }, [topic, region, isKEPPage]);\n\n const handleHashtagClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.related_hashtag,\n page_click_id: isOnlyWord ? topic : topic.topicId,\n }),\n reflowBehavior: () => {\n if (isOnlyWord) {\n active({\n schemaOption: {\n pageType: 'search',\n query: topic,\n },\n ampExtra: {\n enter_position: ClickPosition.related_hashtag,\n },\n });\n } else {\n active({\n schemaOption: {\n pageType: 'hashtag',\n hashtagId: topic.topicId,\n },\n ampExtra: {\n enter_position: ClickPosition.related_hashtag,\n },\n });\n }\n },\n },\n [active, topic, isOnlyWord],\n );\n\n const description = useMemo(() => {\n return (\n isKEPPage &&\n !isOnlyWord &&\n t('view_count_plural', { num: topic.viewCount }).replace('%d', formatNum(topic.viewCount))\n );\n }, []);\n\n const hashtagRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: ClickPosition.related_hashtag,\n });\n }\n }, [isMobileUser]),\n });\n\n return (\n \n
\n
\n \n
\n
\n

{isOnlyWord ? topic : topic.topicName}

\n {description &&

{description}

}\n
\n
\n {!isOnlyWord && topic.articles && topic.articles.length >= MIN_HASHTAG_ARTICLE_COUNT && (\n \n {topic.articles.slice(0, MAX_HASHTAG_ARTICLE_COUNT).map((article) => (\n \n ))}\n \n )}\n \n );\n};\n","import { FC, useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport { EndRecommendCard } from '~/components/end-recommend-card';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { ClickPosition } from '~/utils/click-position';\nimport { ModuleType } from '~/utils/module-type';\nimport { Button, ButtonSize } from '@lemon8/design';\nimport ArrowClockwise from 'icon/arrow_clockwise.svg';\nimport { useActiveToFeedForyou } from '~/utils/active/use-active-to-feed';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { IArticleRelatedPost } from 'shared/atoms';\nimport { IArticleDetail } from 'shared/models';\nimport { Loading } from '~/components/loading';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { $SimpleCTAModalShow } from '~/models/portal/simple-cta-modal';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\n\nimport './style.scss';\n\ninterface IVideoEndRecommendProps {\n show: boolean;\n article: IArticleDetail;\n relatedPost: IArticleRelatedPost;\n onClickReplay: () => void;\n}\n\nconst VideoEndRecommendNoContent: FC = () => {\n const { t } = useTranslation();\n\n return (\n
\n {t('no_content')}\n
\n );\n};\n\nconst VideoEndRecommendLoading: FC = () => {\n return (\n
\n \n
\n );\n};\n\nexport const VideoEndRecommend: FC = (props) => {\n const { t } = useTranslation();\n const activeToFeedForyou = useActiveToFeedForyou();\n\n const { show, relatedPost, onClickReplay, article } = props;\n const isMobileUser = useAtomValue($IsMobileUser);\n const setSimpleCTAModal = useSetAtom($SimpleCTAModalShow);\n const activeToCurrentArticle = useActiveToArticle(article);\n\n const observedRef = useViewTracking(\n {\n onView: useCallback(() => {\n window.Tea('wap_module_show', {\n current_page_module: ModuleType.main_related_post,\n group_id: article.groupId,\n });\n }, []),\n },\n [show],\n );\n\n const mainSeeMoreRef = useViewTracking(\n {\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: ClickPosition.main_see_more_btn,\n current_page_module: ModuleType.main_related_post,\n group_id: article.groupId,\n });\n }, []),\n },\n [show],\n );\n\n const handleEndRecommendBtnClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: ClickPosition.main_see_more_btn,\n is_cta: 1,\n }),\n reflowBehavior: () => {\n activeToFeedForyou(ClickPosition.main_see_more_btn);\n },\n defaultBehavior: () => {\n activeToFeedForyou(ClickPosition.main_see_more_btn);\n },\n },\n [activeToFeedForyou],\n );\n\n const replayBtnRef = useViewTracking(\n {\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: ClickPosition.main_video_replay,\n current_page_module: ModuleType.main_related_post,\n });\n }, []),\n },\n [show],\n );\n\n const handleReplayBtnClick = useCallback(() => {\n window.Tea('wap_click', {\n current_position: ClickPosition.main_video_replay,\n });\n if (isMobileUser) {\n setSimpleCTAModal({\n body: t('seo_stopVideo_modal_desc'),\n currentPosition: ClickPosition.main_video_replay_modal,\n handleClickConfirm: () => activeToCurrentArticle(ClickPosition.main_video_replay_modal),\n });\n } else {\n onClickReplay();\n }\n }, [onClickReplay]);\n\n const itemsToShow = useMemo(() => {\n const { items } = relatedPost;\n\n return items.filter((item) => item.groupId !== article.groupId).slice(0, 5);\n }, [relatedPost, article]);\n\n if (!show) {\n return null;\n }\n\n return (\n
\n

{t('seo_v3_postDetail_recommended_title')}

\n
\n {!relatedPost.items.length && relatedPost.hasMore && }\n {!relatedPost.items.length && !relatedPost.hasMore && }\n {Boolean(relatedPost.items.length) && (\n \n {itemsToShow.map((item, index) => (\n \n \n \n ))}\n \n )}\n
\n
\n \n
\n
\n \n {t('seo_v3_postDetail_replay_btn')}\n
\n
\n );\n};\n","import { FC } from 'react';\nimport cls from 'classnames';\nimport ExclamationMark from 'icon/exclamationmark_triangle_fill.svg';\nimport { IIllegalInfo } from 'shared/models';\n\nimport './style.scss';\n\ninterface IWarningLabelProps {\n illegalInfo?: IIllegalInfo;\n}\n\nexport const WarningLabel: FC = (props) => {\n const { illegalInfo } = props;\n\n if (!illegalInfo) {\n return null;\n }\n\n return (\n
\n

\n \n \n \n {illegalInfo.warningLabel}\n

\n
\n );\n};\n","import { atomWithReset } from 'jotai/utils';\nimport { ClickPosition } from '~/utils/click-position';\n\ninterface SimpleCtaModalProps {\n body: string;\n\n currentPosition: ClickPosition;\n pageClickId?: string;\n\n handleClickConfirm: () => void;\n handleClickCancel?: () => void;\n}\n\nexport const $SimpleCTAModalShow = atomWithReset(false);\n","import { EArticleClass, IArticleDetail } from 'shared/models';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\nimport { Article, ArticleClass } from '@lemon8/webapp-seo-shared';\n\nexport const useActiveToArticle = (article: IArticleDetail): ((position: ClickPosition, id?: string) => void) => {\n const active = usePageActive();\n\n return useCallback(\n (position, id) => {\n const {\n articleClass,\n groupId,\n author: { userId },\n } = article;\n\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: userId,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n },\n [active, article],\n );\n};\n\nexport const useActiveToArticleAuthor = (article: IArticleDetail): ((position: ClickPosition, id?: string) => void) => {\n const active = usePageActive();\n\n return useCallback(\n (position, id) => {\n const {\n author: { userId },\n } = article;\n\n active({\n schemaOption: {\n pageType: 'user',\n userId,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n },\n [active, article],\n );\n};\n\nexport const useActiveToArticleBySimpleArticle = (\n article: Article,\n): ((position: ClickPosition, id?: string) => void) => {\n const active = usePageActive();\n\n return useCallback(\n (position, id) => {\n const {\n articleClass,\n groupId,\n author: { userId },\n } = article;\n\n active({\n schemaOption: {\n pageType: articleClass === ArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: userId,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n },\n [active, article],\n );\n};\n","import { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\n\nexport const useActiveToFeedForyou = (): ((position: ClickPosition, id?: string) => void) => {\n const active = usePageActive();\n\n return useCallback((position, id) => {\n active({\n schemaOption: {\n pageType: 'feed',\n categoryId: 0,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n }, []);\n};\n","import { TFunction } from 'i18next';\nimport dayjs from 'dayjs';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nconst ONE_SECOND = 1000;\nconst ONE_MINUTE = 60 * ONE_SECOND;\nconst ONE_HOUR = 60 * ONE_MINUTE;\nconst ONE_DAY = 24 * ONE_HOUR;\nconst ONE_WEEK = 7 * ONE_DAY;\nconst EIGHT_DAY = 8 * ONE_DAY;\n\n/**\n * time: seconds\n */\nconst formatTimeAgo = (time: number, t: TFunction): string => {\n const now = Date.now();\n const after = now - time * 1000;\n\n if (after < ONE_MINUTE) {\n const seconds = Math.floor(after / ONE_SECOND);\n return t('seconds_ago_plural', { num: seconds }).replace('%d', `${seconds}`);\n }\n if (after < ONE_HOUR) {\n const minutes = Math.floor(after / ONE_MINUTE);\n return t('minutes_ago_plural', { num: minutes }).replace('%d', `${minutes}`);\n }\n if (after < ONE_DAY) {\n const hours = Math.floor(after / ONE_HOUR);\n return t('hours_ago_plural', { num: hours }).replace('%d', `${hours}`);\n }\n if (after < ONE_WEEK) {\n const days = Math.floor(after / ONE_DAY);\n return t('days_ago_plural', { num: days }).replace('%d', `${days}`);\n }\n if (after < EIGHT_DAY) {\n const weeks = Math.floor(after / ONE_WEEK);\n return t('weeks_ago_plural', { num: weeks }).replace('%d', `${weeks}`);\n }\n\n const timeDayjs = dayjs(time * 1000);\n if (dayjs(now).year() === timeDayjs.year()) {\n return timeDayjs.format('M/D');\n }\n\n return timeDayjs.format('YYYY/M/D');\n};\n\ntype UseTimeAgoFormatter = () => (seconds: number) => string;\n\nexport const useTimeAgoFormatter: UseTimeAgoFormatter = () => {\n const { t } = useTranslation();\n\n return useCallback((seconds: number) => formatTimeAgo(seconds, t), [t]);\n};\n","export class PendingQueue {\n private _tasks: (() => void)[] = [];\n\n constructor() {\n if (__BUILD_TARGET__ === 'client') {\n setInterval(this._doInterval, 20);\n }\n }\n\n public push(task: (...args: unknown[]) => void) {\n this._tasks.push(task);\n }\n\n private _doInterval = (): void => {\n if (this._tasks.length) {\n console.log('pending tasks found, total count: %d', this._tasks.length);\n this._tasks.forEach((task) => task());\n this._tasks = [];\n }\n };\n}\n\nexport const pendingQueue = new PendingQueue();\n","import { useFetcher } from '@remix-run/react';\nimport { Atom, useStore, WritableAtom } from 'jotai';\nimport { useCallback, useEffect } from 'react';\n\ninterface AtomConfig {\n atoms?: Record>;\n atomFamilies?: Record WritableAtom>;\n}\n\ninterface IUseRouteLoaderResult {\n state: 'idle' | 'loading' | 'submitting';\n load: () => void;\n}\n\nconst getAtom = (atom: AtomConfig, key: string): Atom => {\n let res: Atom;\n if (key.includes('+')) {\n // for atom family\n const [atomKey, ...args] = key.split('+');\n const decodeArgs = args.map((a) => decodeURIComponent(a));\n const atomFamily = (atom.atomFamilies || {})[atomKey];\n\n if (!atomFamily) {\n console.error('atomFamily not found for key: %s', key);\n }\n\n res = atomFamily(...decodeArgs);\n } else {\n // for plain atom\n res = (atom.atoms || {})[key];\n }\n\n if (process.env.NODE_ENV === 'development' && !res) {\n throw new Error(`no such atom for key: ${key}`);\n }\n\n return res;\n};\n\nexport const useRouteLoader = (\n method: string,\n params: Record,\n atom: AtomConfig,\n): IUseRouteLoaderResult => {\n const store = useStore();\n const fetcher = useFetcher();\n\n const load = useCallback(() => {\n const searchParams = new URLSearchParams();\n searchParams.set('method', method);\n Object.entries(params).forEach(([key, value]) => {\n searchParams.set(key, String(value));\n });\n fetcher.load(`${location.pathname}?${searchParams.toString()}`);\n }, [method, params]);\n\n useEffect(() => {\n const { data } = fetcher;\n\n if (!data) {\n return;\n }\n\n Object.entries(data).forEach(([key, value]) => {\n if (!key.startsWith('$')) {\n return;\n }\n const atomToSet: any = getAtom(atom, key);\n store.set(atomToSet, value);\n });\n }, [fetcher.data]);\n\n return {\n state: fetcher.state,\n load,\n };\n};\n"],"sourceRoot":""}