{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/gallery-label.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/label-switcher-visible.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/current-gallery-article.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/swiper.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/nested-swiper.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/enable-index-for-recommend.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/current-article-related-post.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/layout-strategy.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/load-article-related-posts.ts","webpack://@lemon8/web-seo/./client/components/article-gallery/components/dot-indicator-section/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/end-recommend/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/gallery-index/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/gallery-label/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/gallery-img-mask/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/gallery-slide/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/gallery-swiper/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/label-switcher/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/main-swiper/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/swiper-action/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/warning-label-section/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/index.tsx","webpack://@lemon8/web-seo/./client/components/avatar/index.tsx","webpack://@lemon8/web-seo/./client/components/end-recommend-card/index.tsx","webpack://@lemon8/web-seo/./client/components/simple-video/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/topic-article-card/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/index.tsx","webpack://@lemon8/web-seo/./client/components/video-end-recommend/index.tsx","webpack://@lemon8/web-seo/./client/components/warning-label/index.tsx","webpack://@lemon8/web-seo/./client/models/current-module-rank.ts","webpack://@lemon8/web-seo/./client/models/portal/simple-cta-modal.ts","webpack://@lemon8/web-seo/./client/utils/active/use-active-to-article.ts","webpack://@lemon8/web-seo/./client/utils/active/use-active-to-feed.ts","webpack://@lemon8/web-seo/./client/utils/format/time-ago-formatter.ts","webpack://@lemon8/web-seo/./client/utils/pending-queue.ts","webpack://@lemon8/web-seo/./client/utils/pwa/notification.ts","webpack://@lemon8/web-seo/./client/utils/use-route-loader.ts","webpack://@lemon8/web-seo/./shared/utils/format/kep-formatter.ts"],"names":["$LabelVisible","atom","$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","GalleryImgMask","active","usePageActive","openBtnObservedRef","handleOpenBtnClick","_","bundle","_objectSpread","schemaOption","pageType","ampExtra","enter_position","GallerySlide","image","imgCount","author","isTranslatedVersion","nickName","labelVisible","isMobileUser","$IsMobileUser","setSimpleCTAModal","useSetAtom","$SimpleCTAModalShow","activeToArticle","useActiveToArticle","rootPaddingBottom","isBot","$UserAgent","imgAutoGenDesc","imgOcrText","showCaption","imageHeight","aspectRadio","rootAspectRatio","scale","galleryImgObservedRef","current_img_index","all_img_count","currentPosition","body","handleClickConfirm","Image","src","url","alt","replace","String","GallerySection","_ref","setGallerySwiper","ocrText","imageAutoGenDesp","imageListWithExtraInfo","galleryInit","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","shortContent","sessionStorage","getItem","imgUrl","oneLink","generateOneLink","pid","enter_page_id","enter_page_type","sendNotification","icon","requireInteraction","time","Date","now","toString","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","currentTime","play","_a","catch","pause","mute","unmute","p0","p1","p2","handlePlayEvent","handlePauseEvent","handleEndEvent","playsInline","poster","onPause","onPlay","onEnded","Array","forwardRef","TopicArticleCard","topic","topicId","currentPageModule","$CurrentPageModule","articleHref","handleArticleClick","ArticleClass","event","hashtagArticleCardRef","draggable","target","VideoIcon","MIN_HASHTAG_ARTICLE_COUNT","MAX_HASHTAG_ARTICLE_COUNT","TopicCard","$PageLevelTraffic","isKEPPage","EPageType","isOnlyWord","topicHref","kepQueryFormat","topicName","isHashtagWithArticleCard","articles","handleHashtagClick","query","hashtagId","description","num","viewCount","hashtagRef","NumberIcon","StepScroll","VideoEndRecommendNoContent","VideoEndRecommendLoading","VideoEndRecommend","activeToFeedForyou","relatedPost","onClickReplay","activeToCurrentArticle","observedRef","mainSeeMoreRef","is_cta","replayBtnRef","handleReplayBtnClick","itemsToShow","ArrowClockwise","ExclamationMark","warningLabel","MODULE_NOT_RANK","$CurrentModuleRank","atomWithReset","position","EArticleClass","authorId","enter_page_click_id","useActiveToArticleAuthor","categoryId","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","ONE_WEEK","EIGHT_DAY","formatTimeAgo","after","seconds","floor","minutes","hours","days","weeks","timeDayjs","dayjs","year","format","useTimeAgoFormatter","PendingQueue","constructor","_tasks","_doInterval","console","log","forEach","task","setInterval","push","pendingQueue","getAuth","auth","Notification","permission","requestPermission","then","err","options","navigator","serviceWorker","ready","registration","showNotification","setItem","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","_ref2","startsWith","atomToSet","specialRegex","emojiRegex","char","toLowerCase","trim"],"mappings":"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","file":"571-9131ae55f8476a43e0c5.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/web-app-shared/ssr';\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 '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/web-app-shared/ssr';\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 'shared/models/legacy';\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/web-app-shared/ssr';\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, useRef, useState } from 'react';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\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/web-app-shared/atom';\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 } from 'react';\nimport { Button, ButtonSize } from '@lemon8/design';\nimport { useTranslation } from 'react-i18next';\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 { usePageActive } from '~/utils/active/use-page-active';\n\nimport './style.scss';\n\ninterface IGalleryImgMaskProps {\n groupId: string;\n}\n\nexport const GalleryImgMask: FC = (props) => {\n const { groupId } = props;\n\n const active = usePageActive();\n\n const { t } = useTranslation();\n\n const openBtnObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_module_show', {\n current_page_module: ModuleType.gallery_img_mask,\n group_id: groupId,\n });\n window.Tea('wap_cta_show', {\n current_page_module: ModuleType.gallery_img_mask,\n current_position: ClickPosition.gallery_img_mask_open_btn,\n group_id: groupId,\n });\n }, []),\n });\n\n const handleOpenBtnClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.gallery_img_mask_open_btn,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: 'article',\n groupId,\n },\n ampExtra: {\n enter_position: ClickPosition.gallery_img_mask_open_btn,\n },\n });\n },\n defaultBehavior: (e) => {\n e?.stopPropagation();\n },\n },\n [active],\n );\n\n return (\n
\n
\n
{t('seo_photoPost_modal_title')}
\n
\n \n
\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/web-app-shared/ssr';\nimport { GalleryLabel } from '../gallery-label';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { GalleryImgMask } from '../gallery-img-mask';\nimport { useViewTracking } from '~/utils/use-view-tracking';\n\nimport './style.scss';\n\ninterface IGallerySlideProps {\n image: IImage & { imgOcrText: string; imgAutoGenDesc: string };\n imgCount: number;\n index: number;\n}\n\nexport const GallerySlide: FC = (props) => {\n const { image, index, imgCount } = props;\n const { t } = useTranslation();\n const article = useScopedAtomValue($CurrentGalleryArticle);\n const { title, galleryLabels, author, isTranslatedVersion = false, groupId } = 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 galleryImgObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_gallery_img_show', {\n current_position: ClickPosition.gallery_img,\n current_img_index: index + 1,\n all_img_count: imgCount,\n group_id: groupId,\n });\n }, []),\n });\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 {isMobileUser && index === 1 && }\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/web-app-shared/ssr';\nimport { $CurrentGalleryArticle, $CurrentGallerySlide, $GallerySwiper } from '../../atoms';\n\nimport './style.scss';\n\nexport const GallerySection: FC = ({ children }) => {\n const article = useScopedAtomValue($CurrentGalleryArticle);\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 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 }, [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/web-app-shared/ssr';\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/web-app-shared/ssr';\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/web-app-shared/ssr';\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/web-app-shared/ssr';\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 { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { FC, useEffect } 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';\nimport { ClickPosition } from '~/utils/click-position';\nimport { sendNotification } from '~/utils/pwa/notification';\nimport { useAtomValue } from 'jotai';\nimport { generateOneLink } from '~/utils/active';\nimport { ScopedProvider } from '@lemon8/web-app-shared/ssr';\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 const { title, shortContent, imageList, groupId } = article;\n const { isBot } = useAtomValue($UserAgent);\n\n useEffect(() => {\n /** 含有is_notification'说明本次发送过了 */\n if (!sessionStorage.getItem('is_notification') && !isBot) {\n const imgUrl = imageList && imageList[0].url;\n const oneLink = generateOneLink({\n pid: 'website_seo_notification',\n schemaOption: { pageType: 'article', groupId },\n ampExtra: {\n enter_position: ClickPosition.pwa_notification_banner,\n enter_page_id: groupId,\n enter_page_type: 'article',\n },\n });\n sendNotification(title, {\n body: shortContent,\n icon: 'https://p16-va.lemon8cdn.com/tos-maliva-p-0000/5d8e5f313d1b470799f8450327ec6dee~tplv-tej9nj120t-scaling:120:0:q75.jpeg',\n requireInteraction: true,\n image: imgUrl,\n data: {\n time: new Date(Date.now()).toString(),\n url: oneLink,\n },\n });\n }\n }, []);\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/web-app-shared/atom';\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 'shared/models/legacy';\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 rank,\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 'shared/models/legacy';\nimport { Link } 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 } from '@lemon8/web-app-shared/atom';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\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 isMobileUser = useAtomValue($IsMobileUser);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\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_article_card,\n page_click_id: groupId,\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_article_card,\n },\n });\n },\n defaultBehavior: (event?: SyntheticEvent) => {\n event?.stopPropagation();\n },\n },\n [active, topicId, groupId],\n );\n\n const hashtagArticleCardRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: ClickPosition.related_hashtag_article_card,\n });\n }\n }, [isMobileUser]),\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 'shared/models/legacy';\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/web-app-shared/atom';\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/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { kepQueryFormat } from 'shared/utils/format/kep-formatter';\n\nimport './style.scss';\n\nexport const 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 if (!isKEPPage || isOnlyWord) {\n return `/discover/${kepQueryFormat(isOnlyWord ? topic : topic.topicName)}?region=${region}`;\n }\n return `/topic/${topic.topicId}?region=${region}`;\n }, [topic, region, isKEPPage]);\n\n const isHashtagWithArticleCard = useMemo(() => {\n return !isOnlyWord && topic.articles && topic.articles.length >= MIN_HASHTAG_ARTICLE_COUNT;\n }, []);\n\n const currentPosition = useMemo(() => {\n return isHashtagWithArticleCard ? ClickPosition.related_hashtag_with_article_card : ClickPosition.related_hashtag;\n }, []);\n\n const handleHashtagClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: currentPosition,\n page_click_id: isOnlyWord ? kepQueryFormat(topic) : topic.topicId,\n }),\n reflowBehavior: () => {\n if (isOnlyWord) {\n active({\n schemaOption: {\n pageType: 'search',\n query: kepQueryFormat(topic),\n },\n ampExtra: {\n enter_position: currentPosition,\n },\n });\n } else {\n active({\n schemaOption: {\n pageType: 'hashtag',\n hashtagId: topic.topicId,\n },\n ampExtra: {\n enter_position: currentPosition,\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: isHashtagWithArticleCard\n ? ClickPosition.related_hashtag_with_article_card\n : 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 { atom } from 'jotai';\n\nexport const MODULE_NOT_RANK = -1;\n\nexport const $CurrentModuleRank = atom(MODULE_NOT_RANK);\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 'shared/models/legacy';\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","/** 权限判断与获取 */\nconst getAuth = async () => {\n let auth = false;\n if (typeof Notification === 'undefined') {\n console.log('浏览器不支持 Notification API');\n auth = false;\n return;\n }\n if (Notification.permission === 'denied') {\n console.log('Notification 权限已被禁止');\n auth = false;\n return;\n }\n if (Notification.permission === 'granted') {\n console.log('Notification 可用');\n auth = true;\n } else {\n try {\n await Notification?.requestPermission()?.then(function (permission) {\n switch (permission) {\n case 'granted':\n console.log('Notification 可用');\n window.Tea('wap_notify_accept');\n auth = true;\n break;\n case 'denied':\n window.Tea('wap_notify_deny');\n console.log('Notification 权限已被禁止');\n auth = false;\n break;\n default:\n auth = false;\n console.log('Notification 权限尚未授权');\n }\n });\n } catch (err) {\n console.log(err, 'plugin mobile notification requestPermission error');\n auth = false;\n }\n }\n return auth;\n};\n\ntype Options = {\n // 消息内容\n body: string;\n icon?: string;\n /** 在用户点击或关闭通知前,是否通知应该保持活动状态,而不是自动关闭 */\n requireInteraction: boolean;\n image: string;\n data: {\n time: string;\n url: string;\n };\n};\nexport const sendNotification = async (title: string, options: Options) => {\n const auth = await getAuth();\n if (auth) {\n navigator.serviceWorker.ready.then((registration) => {\n if (registration?.showNotification) {\n registration?.showNotification(title, options);\n /** 埋点通知成功 */\n window.Tea('wap_notify_success');\n /** 每一次只发一次 */\n sessionStorage.setItem('is_notification', 'true');\n }\n });\n }\n};\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","const specialRegex = /[!@&/\\\\#,+()$~%.'\":*?<>{}]/g;\nconst emojiRegex = /[\\u{1F000}-\\u{1F9FF}]/gu;\n\n/** format to url word */\nexport const kepQueryFormat = (query: string) => {\n if (!query) {\n return '';\n }\n\n const filterCharWord = query.replace(specialRegex, '');\n const filterEmojiWord = filterCharWord.replace(emojiRegex, '');\n const filterSpaceWord = filterEmojiWord.replace(/\\s+/g, ' ');\n const lowerCaseWord = filterSpaceWord.replace(/[A-Z]/g, (char) => char.toLowerCase());\n\n return lowerCaseWord.trim();\n};\n"],"sourceRoot":""}