{"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/utils/libra/permanent-img-index.ts","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","$PermanentImgIndexStyle","parameters","$ABTest","_get","$HitPermanentImgIndexStyle","isMobileUser","$IsMobileUser","config","GalleryIndex","hitPermanentImgIndexStyle","useAtomValue","galleryIndexShow","setGalleryIndexShow","useState","hiddenTimeout","clearTimeout","setTimeout","cls","hidden","concat","GalleryLabel","props","label","show","direction","id","name","xPct","yPct","nameRef","region","$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","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":"794-cf5f5073d118c9e21789.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 { $ABTest } from '@lemon8/web-app-shared/atom';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { Atom, atom } from 'jotai';\nimport _get from 'lodash/get';\n\n/**\n * 0: control group\n * 1: permanent img index in Article and KEP\n */\nexport const $PermanentImgIndexStyle: Atom = atom((get) => {\n const { parameters } = get($ABTest);\n if (__BUILD_TYPE__ === 'local_dev') {\n return 1;\n }\n return _get(parameters, ['seo_web', 'lemon8.permanent_img_index'], 0);\n});\n\nexport const $HitPermanentImgIndexStyle: Atom = atom((get) => {\n const isMobileUser = get($IsMobileUser);\n const config = get($PermanentImgIndexStyle);\n return isMobileUser && config === 1;\n});\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';\nimport { useAtomValue } from 'jotai';\nimport { $HitPermanentImgIndexStyle } from '~/utils/libra/permanent-img-index';\n\nimport './style.scss';\n\nexport const GalleryIndex: FC = () => {\n const nestedSwiperSlideInfo = useScopedAtomValue($NestedSwiperSlideInfo);\n const hitPermanentImgIndexStyle = useAtomValue($HitPermanentImgIndexStyle);\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":""}