{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/article-gallery/atoms/swiper.ts","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/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/dot-indicator/use-dots-type.ts","webpack://@lemon8/web-seo/./client/components/dot-indicator/index.tsx","webpack://@lemon8/web-seo/./client/components/article-gallery/components/dot-indicator-section/index.tsx","webpack://@lemon8/web-seo/./client/models/additional-params.ts","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-toast/index.tsx","webpack://@lemon8/web-seo/./client/components/simple-video/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/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/active/use-silent-awaken.ts","webpack://@lemon8/web-seo/./client/utils/format/time-ago-formatter.ts","webpack://@lemon8/web-seo/./client/utils/pwa/notification.ts"],"names":["$MainSwiper","atom","$CurrentMainSlide","$GallerySwiper","$CurrentGallerySlide","$EndRecommendSwiper","$CurrentEndRecommendSlide","useMountCurrentSlideWithSwiper","$swiper","$slide","swiper","useScopedAtomValue","setSlide","useSetScopedAtom","useEffect","callback","activeIndex","on","off","$LabelVisibleValue","$LabelVisible","get","currentGallerySlide","$IsMobileUser","set","input","$LabelSwitcherVisible","galleryLabels","$CurrentGalleryArticle","currentSlideLabels","filter","g","imageIndex","Boolean","length","$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","IndicatorDotSize","useDotsType","count","dotsTypeList","_range","map","_","positions","flatMap","shift","i","slice","forEach","pos","center","_sum","Math","abs","DotIndicator","forwardRef","props","ref","className","onChange","currentIndex","setCurrentIndex","useState","indicatorDotSizes","useIndicatorDotSizes","handleDotClick","useImperativeHandle","changeTo","React","createElement","cls","key","selected","onClick","DotIndicatorSection","nestedSwiperSlideInfo","slideToNestedIndex","useRef","handleIndicatorChange","min","$AdditionalParams","EndRecommendContentLoading","Loading","variant","shadow","EndRecommendContentEmpty","t","useTranslation","EndRecommendContent","groupId","endRecommendSwiper","setEndRecommendSwiper","useScopedAtom","loadableRelatedPost","items","hasMore","useMemo","state","data","endRecommendItems","item","prefix","$CurrentPositionPrefix","handleProgress","_s","progress","allowSlidePrev","Swiper","resistanceRatio","slidesPerView","onSwiper","nested","rank","SwiperSlide","EndRecommendCard","article","size","positionPrefix","EndRecommendSection","activeToFeed","useActiveToFeedForyou","loader","enableShow","additionalParams","seeMoreObservedRef","useViewTracking","onView","useCallback","window","Tea","_objectSpread","current_page_module","ModuleType","group_id","current_position","ClickPosition","handleEndRecommendBtnClick","useReflowClick","clickEvent","reflowBehavior","defaultBehavior","Button","ButtonSize","title","displayName","GalleryIndex","galleryIndexShow","setGalleryIndexShow","hiddenTimeout","clearTimeout","setTimeout","concat","GalleryLabel","label","show","direction","id","name","xPct","yPct","region","useAtomValue","$Locale","isLeft","observedNameRef","useViewObserver","is_cta","galleryName","e","stopPropagation","addEventListener","removeEventListener","handleClick","page_click_id","calcPos","isShow","style","left","top","Link","to","right","GalleryImgMask","active","usePageActive","openBtnObservedRef","handleOpenBtnClick","bundle","preventDefault","schemaOption","pageType","ampExtra","enter_position","GallerySlide","image","imgCount","author","isTranslatedVersion","nickName","labelVisible","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","elementtiming","ELEMENT_TIMING_FMP","src","url","alt","replace","String","GallerySection","_ref","children","setGallerySwiper","ocrText","imageAutoGenDesp","imageListWithExtraInfo","galleryInit","LabelVisibleSwitcher","labelSwitcherVisible","setLabelVisible","observedRef","handleLabelSwitcherClick","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","ClickPositionPrefix","shortContent","userAgent","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","formatNum","useNumFormatter","cardObservedRef","media_id","article_class","impr_id","imprId","handleEventClick","articleLink","useSEOHref","LegacyArticleUtil","authorLink","imageSrc","_a","PlayFillIcon","HeartIcon","Number","SimpleToast","setShow","content","hydrated","setHydrated","timer","newTimer","hide","VideoStatus","SimpleVideo","videoSrc","posterSrc","autoPlay","loop","muteStatus","videoRef","status","setStatus","muted","setMuted","toast","setToast","video","seek","currentTime","play","catch","pause","mute","unmute","EVideoMuteStatus","p0","p1","p2","handlePlayEvent","handlePauseEvent","handleEndEvent","playsInline","poster","onPause","onPlay","onEnded","Array","VideoEndRecommendNoContent","VideoEndRecommendLoading","VideoEndRecommend","activeToFeedForyou","relatedPost","onClickReplay","activeToCurrentArticle","mainSeeMoreRef","replayBtnRef","handleReplayBtnClick","itemsToShow","ArrowClockwise","warningLabelType","EWarningLabelType","ExclamationMark","warningLabel","atomWithReset","position","enterPosition","isArray","EArticleClass","authorId","enter_page_click_id","useActiveToArticleAuthor","categoryId","DEFAULT_TIMEOUT","LEMON8_PKG_ID","delay","timeout","Promise","resolve","getIsClient","getRelatedApps","navigator","getInstalledRelatedApps","race","awakenAfterDelay","schema","location","href","awakenApp","relatedAppsInfo","lemon8AppInfo","find","app","includes","installed_app_name","installed_app_version","version","useSilentAwaken","hasFulfilled","useCompletedActiveSchema","ua","test","err","console","error","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","ONE_WEEK","EIGHT_DAY","formatTimeAgo","after","seconds","floor","num","minutes","hours","days","weeks","timeDayjs","dayjs","year","format","useTimeAgoFormatter","getAuth","auth","Notification","log","permission","requestPermission","then","cachedNotificationInstance","options","notification","setItem","onclick","event","open"],"mappings":"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","file":"vendors/821-ea6e7273022be8318519-ade4ba9718be3d0b2f6b26782fbeda8b1ed36057.js","sourcesContent":["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 { $CurrentGallerySlide } from '~/components/article-gallery/atoms/swiper';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\n\nconst $LabelVisibleValue = atom(true);\n\nexport const $LabelVisible = atom(\n (get) => {\n const currentGallerySlide = get($CurrentGallerySlide);\n\n // interception\n const isMobileUser = get($IsMobileUser);\n if (isMobileUser && currentGallerySlide === 1) {\n return false;\n }\n\n return get($LabelVisibleValue);\n },\n (get, set, input: boolean) => {\n set($LabelVisibleValue, input);\n },\n);\n","import { atom } from 'jotai';\nimport { $CurrentGalleryArticle, $CurrentGallerySlide } from '.';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\n\nexport const $LabelSwitcherVisible = atom((get) => {\n const { galleryLabels } = get($CurrentGalleryArticle);\n const currentGallerySlide = get($CurrentGallerySlide);\n\n // interception\n const isMobileUser = get($IsMobileUser);\n if (isMobileUser && currentGallerySlide === 1) {\n return false;\n }\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 } 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 _range from 'lodash/range';\nimport _sum from 'lodash/sum';\n\n/**\n * 圆点的类型\n * value 关联在 css 中\n */\nconst enum IndicatorDotSize {\n Big = 'big',\n Middle = 'middle',\n Small = 'small',\n Gone = 'gone',\n}\n\n/**\n * 计算要展示的圆点的类别\n */\nexport default function useDotsType(count: number, current: number): IndicatorDotSize[] {\n const dotsTypeList = _range(count).map((_) => IndicatorDotSize.Gone);\n\n // 计算所有需要展示的点位\n // 按照从中心到两边的顺序排列\n const positions = _range(5)\n .flatMap((shift) => {\n if (shift === 0) {\n return current;\n }\n return [current + shift, current - shift].filter((i) => i > -1 && i < count) as number[];\n })\n .slice(0, 5);\n\n // 标记大点\n positions.slice(0, 3).forEach((pos) => (dotsTypeList[pos] = IndicatorDotSize.Big));\n\n // 计算大点中心位置\n const center = _sum(positions.slice(0, 3)) / 3;\n\n // 标记中点和小点\n positions.slice(3, 5).forEach((pos) => {\n dotsTypeList[pos] = Math.abs(pos - center) < 3 ? IndicatorDotSize.Middle : IndicatorDotSize.Small;\n });\n\n return dotsTypeList;\n}\n","import { forwardRef, Ref, useImperativeHandle, useState } from 'react';\nimport useIndicatorDotSizes from './use-dots-type';\nimport cls from 'classnames';\nimport _range from 'lodash/range';\n\nimport './style.scss';\n\nexport interface DotIndicatorProps {\n className?: string;\n count: number;\n onChange: (target: number) => void;\n}\n\nexport interface DotIndicatorRef {\n changeTo: (target: number) => void;\n}\n\nexport const DotIndicator = forwardRef((props: DotIndicatorProps, ref: Ref) => {\n const { className, count, onChange } = props;\n const [currentIndex, setCurrentIndex] = useState(0);\n const indicatorDotSizes = useIndicatorDotSizes(count, currentIndex);\n\n const handleDotClick =\n (index: number): (() => void) =>\n () => {\n setCurrentIndex(index);\n onChange(index);\n };\n\n useImperativeHandle(ref, () => {\n return {\n changeTo: setCurrentIndex,\n };\n });\n\n return (\n
\n {_range(count).map((index) => (\n \n ))}\n
\n );\n});\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 { atom } from 'jotai';\n\nexport const $AdditionalParams = atom>({});\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 $EnableIndexForRecommend,\n} from '~/components/article-gallery/atoms';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\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 const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n useEffect(() => {\n if (!endRecommendSwiper) {\n return;\n }\n\n const handleProgress = (_s: SwiperClass, progress: number): void => {\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 enableShow = useScopedAtomValue($EnableIndexForRecommend);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\n\n const seeMoreObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_module_show', {\n current_page_module: prefix + ModuleType.main_related_post,\n group_id: groupId,\n ...additionalParams,\n });\n window.Tea('wap_cta_show', {\n current_page_module: prefix + ModuleType.main_related_post,\n current_position: prefix + ClickPosition.main_see_more_btn,\n group_id: groupId,\n ...additionalParams,\n });\n }, []),\n });\n\n const handleEndRecommendBtnClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: prefix + ClickPosition.main_see_more_btn,\n ...additionalParams,\n }),\n reflowBehavior: () => {\n activeToFeed([prefix, ClickPosition.main_see_more_btn]);\n },\n defaultBehavior: () => {\n activeToFeed([prefix, ClickPosition.main_see_more_btn]);\n },\n },\n [activeToFeed],\n );\n\n useEffect(() => {\n if (!loader || !enableShow) {\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, enableShow]);\n\n if (!enableShow) {\n return null;\n }\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';\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, useCallback } 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';\nimport { useViewObserver } from '@lemon8/web-app-shared/util';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\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 { region } = useAtomValue($Locale);\n\n const isLeft = direction === 'left';\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\n\n const observedNameRef = useViewObserver({\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: prefix + ClickPosition.main_gallery_label,\n ...additionalParams,\n is_cta: 0,\n });\n }, []),\n });\n\n useEffect(() => {\n const galleryName = observedNameRef.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): void => {\n e.stopPropagation();\n window.Tea('wap_click', {\n current_position: prefix + ClickPosition.main_gallery_label,\n page_click_id: id,\n is_cta: 0,\n });\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';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\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 prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\n\n const openBtnObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_module_show', {\n current_page_module: prefix + ModuleType.gallery_img_mask,\n group_id: groupId,\n ...additionalParams,\n });\n window.Tea('wap_cta_show', {\n current_page_module: prefix + ModuleType.gallery_img_mask,\n current_position: prefix + ClickPosition.gallery_img_mask_open_btn,\n group_id: groupId,\n ...additionalParams,\n });\n }, []),\n });\n\n const handleOpenBtnClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: prefix + ClickPosition.gallery_img_mask_open_btn,\n ...additionalParams,\n }),\n defaultBehavior: (e) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n active({\n schemaOption: {\n pageType: 'article',\n groupId,\n },\n ampExtra: {\n enter_position: prefix + ClickPosition.gallery_img_mask_open_btn,\n },\n });\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';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\nimport { ELEMENT_TIMING_FMP } from '@lemon8/web-app-shared/component';\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 prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\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: prefix + ClickPosition.gallery_img,\n current_img_index: index + 1,\n all_img_count: imgCount,\n group_id: groupId,\n ...additionalParams,\n });\n }, []),\n });\n\n const handleClick = useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_click', {\n current_position: prefix + ClickPosition.gallery_img_open,\n ...additionalParams,\n });\n setSimpleCTAModal({\n currentPosition: [prefix, ClickPosition.gallery_img_open_modal],\n body: t('seo_stopVideo_modal_desc'),\n handleClickConfirm: () => activeToArticle([prefix, ClickPosition.gallery_img_open_modal]),\n additionalParams,\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';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\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 const prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\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: prefix + ClickPosition.main_gallery_slide,\n ...additionalParams,\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';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useViewObserver } from '@lemon8/web-app-shared/util';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\n\nimport './style.scss';\n\nexport const LabelVisibleSwitcher: FC = () => {\n const labelSwitcherVisible = useScopedAtomValue($LabelSwitcherVisible);\n const [labelVisible, setLabelVisible] = useScopedAtom($LabelVisible);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n const additionalParams = useScopedAtomValue($AdditionalParams);\n\n const observedRef = useViewObserver({\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: prefix + ClickPosition.main_gallery_label_switcher,\n is_cta: 0,\n ...additionalParams,\n });\n }, []),\n });\n\n const handleLabelSwitcherClick = useCallback(() => {\n setLabelVisible(!labelVisible);\n window.Tea('wap_click', {\n current_position: prefix + ClickPosition.main_gallery_label_switcher,\n is_cta: 0,\n ...additionalParams,\n });\n }, [labelVisible]);\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, ClickPositionPrefix } 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';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $AdditionalParams } from '~/models/additional-params';\nimport { AdditionalParamsOptionalProps, PositionPrefixOptionalProps } from '../immersive-post-item/shared/typing';\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 = (\n props,\n) => {\n const {\n article,\n enableIndexForRecommend,\n articleRelatedPosts,\n layoutStrategy = EArticleGalleryLayoutStrategy.SQUARE,\n loadArticleRelated,\n positionPrefix = ClickPositionPrefix.none,\n additionalParams = {},\n } = props;\n\n const { title, shortContent, imageList, groupId } = article;\n const userAgent = useAtomValue($UserAgent);\n const { isBot } = 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 { FC, useCallback, useMemo } from 'react';\nimport { useNumFormatter } from '~/utils/format';\nimport { useAtomValue } from 'jotai';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { ModuleType } from '~/utils/module-type';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { Article, LegacyArticleUtil } from 'shared/models/legacy';\nimport { useActiveToArticleBySimpleArticle } from '~/utils/active/use-active-to-article';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useSEOHref } from '~/utils/build-seo-url';\n\nimport './style.scss';\n\ninterface EndRecommendCardProps {\n article: Article;\n size: 'normal' | 'small';\n rank: number;\n positionPrefix?: ClickPositionPrefix;\n}\n\nexport const EndRecommendCard: FC = (props) => {\n const { article, size, rank, positionPrefix = ClickPositionPrefix.none } = props;\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 } = 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: positionPrefix + ModuleType.main_related_post,\n current_position: positionPrefix + 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: positionPrefix + ModuleType.main_related_post,\n current_position: positionPrefix + 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: positionPrefix + ClickPosition.main_related_post,\n current_page_module: positionPrefix + ModuleType.main_related_post,\n page_click_id: groupId,\n rank,\n }),\n reflowBehavior: () => {\n activeToArticle([positionPrefix, ClickPosition.main_related_post], groupId);\n },\n },\n [groupId],\n );\n\n const articleLink = useSEOHref(LegacyArticleUtil.getArticlePath(article));\n\n const authorLink = useSEOHref(LegacyArticleUtil.getAuthorPath(article));\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 { useEffect, useRef, useState } from 'react';\nimport cls from 'classnames';\n\nimport './style.scss';\n\ninterface ISimpleToastProps {\n show: boolean;\n setShow: (value: boolean) => void;\n content: string;\n}\n\nexport default function SimpleToast(props: ISimpleToastProps): JSX.Element {\n const { show, setShow, content } = props;\n const [hydrated, setHydrated] = useState(false);\n\n useEffect(() => {\n setHydrated(true);\n }, []);\n\n const timer = useRef(0);\n useEffect(() => {\n if (!show) {\n return;\n }\n\n const newTimer = window.setTimeout(() => {\n setShow(false);\n }, 2150);\n timer.current = newTimer;\n\n return () => window.clearTimeout(newTimer);\n }, [show, setShow]);\n\n return (\n
\n

{content || ''}

\n
\n );\n}\n","import { ForwardedRef, forwardRef, ForwardRefRenderFunction, useImperativeHandle, useRef, useState } from 'react';\nimport { EVideoMuteStatus } from 'shared/models';\nimport SimpleToast from '../simple-toast';\nimport { useTranslation } from 'react-i18next';\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 muteStatus: EVideoMuteStatus;\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, muteStatus } = props;\n\n const videoRef = useRef(null);\n const [status, setStatus] = useState(VideoStatus.INITIAL);\n const [muted, setMuted] = useState(true);\n const [toast, setToast] = useState({ show: false, content: '' });\n const { t } = useTranslation();\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 if (muteStatus === EVideoMuteStatus.MUTED) {\n setToast({ show: true, content: t('video_muted_toast') });\n return;\n }\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, muteStatus],\n );\n\n const handlePlayEvent = (): void => {\n setStatus(VideoStatus.PLAYING);\n };\n\n const handlePauseEvent = (): void => {\n setStatus(VideoStatus.PAUSED);\n };\n\n const handleEndEvent = (): void => {\n setStatus(VideoStatus.ENDED);\n };\n\n return (\n <>\n \n {typeof videoSrc === 'string' && }\n {videoSrc instanceof Array && videoSrc.map((src) => )}\n \n setToast({ show, content: '' })} content={toast.content} />\n \n );\n};\n\nexport default forwardRef(SimpleVideo);\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, ClickPositionPrefix } 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 { TArticleDetail } 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';\nimport { AdditionalParamsOptionalProps, PositionPrefixOptionalProps } from '../immersive-post-item/shared/typing';\n\nimport './style.scss';\n\ninterface IVideoEndRecommendProps {\n show: boolean;\n article: TArticleDetail;\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<\n AdditionalParamsOptionalProps & PositionPrefixOptionalProps & IVideoEndRecommendProps\n> = (props) => {\n const { t } = useTranslation();\n const activeToFeedForyou = useActiveToFeedForyou();\n\n const {\n show,\n relatedPost,\n onClickReplay,\n article,\n positionPrefix = ClickPositionPrefix.none,\n additionalParams = {},\n } = 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: positionPrefix + ModuleType.main_related_post,\n group_id: article.groupId,\n ...additionalParams,\n });\n }, []),\n },\n [show],\n );\n\n const mainSeeMoreRef = useViewTracking(\n {\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: positionPrefix + ClickPosition.main_see_more_btn,\n current_page_module: positionPrefix + ModuleType.main_related_post,\n group_id: article.groupId,\n ...additionalParams,\n });\n }, []),\n },\n [show],\n );\n\n const handleEndRecommendBtnClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: positionPrefix + ClickPosition.main_see_more_btn,\n is_cta: 1,\n ...additionalParams,\n }),\n reflowBehavior: () => {\n activeToFeedForyou([positionPrefix, ClickPosition.main_see_more_btn]);\n },\n defaultBehavior: () => {\n activeToFeedForyou([positionPrefix, 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: positionPrefix + ClickPosition.main_video_replay,\n current_page_module: positionPrefix + ModuleType.main_related_post,\n ...additionalParams,\n });\n }, []),\n },\n [show],\n );\n\n const handleReplayBtnClick = useCallback(() => {\n window.Tea('wap_click', {\n current_position: positionPrefix + ClickPosition.main_video_replay,\n ...additionalParams,\n });\n if (isMobileUser) {\n setSimpleCTAModal({\n body: t('seo_stopVideo_modal_desc'),\n currentPosition: [positionPrefix, ClickPosition.main_video_replay_modal],\n handleClickConfirm: () => activeToCurrentArticle([positionPrefix, ClickPosition.main_video_replay_modal]),\n additionalParams,\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 { EWarningLabelType, 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 // No warning label if it is election type\n if (!illegalInfo || illegalInfo.warningLabelType === EWarningLabelType.ELECTION) {\n return null;\n }\n\n return (\n
\n

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

\n
\n );\n};\n","import { atomWithReset } from 'jotai/utils';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\n\ninterface SimpleCtaModalProps {\n body: string;\n\n currentPosition: ClickPosition | [ClickPositionPrefix, ClickPosition];\n pageClickId?: string;\n\n handleClickConfirm: () => void;\n handleClickCancel?: () => void;\n\n additionalParams?: Record;\n}\n\nexport const $SimpleCTAModalShow = atomWithReset(false);\n","import { EArticleClass, TArticleDetail } from 'shared/models';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\nimport { Article } from 'shared/models/legacy';\n\nexport const useActiveToArticle = (\n article: TArticleDetail,\n): ((position: ClickPosition | [ClickPositionPrefix, 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 const enterPosition = Array.isArray(position) ? position[0] + position[1] : position;\n\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: userId,\n },\n ampExtra: {\n enter_position: enterPosition,\n enter_page_click_id: id || null,\n },\n });\n },\n [active, article],\n );\n};\n\nexport const useActiveToArticleAuthor = (\n article: TArticleDetail,\n): ((position: ClickPosition | [ClickPositionPrefix, ClickPosition], id?: string) => void) => {\n const active = usePageActive();\n\n return useCallback(\n (position, id) => {\n const {\n author: { userId },\n } = article;\n const enterPosition = Array.isArray(position) ? position[0] + position[1] : position;\n\n active({\n schemaOption: {\n pageType: 'user',\n userId,\n },\n ampExtra: {\n enter_position: enterPosition,\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 | [ClickPositionPrefix, 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 const enterPosition = Array.isArray(position) ? position[0] + position[1] : position;\n\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: userId,\n },\n ampExtra: {\n enter_position: enterPosition,\n enter_page_click_id: id || null,\n },\n });\n },\n [active, article],\n );\n};\n","import { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\nimport { ClickPosition, ClickPositionPrefix } from '../click-position';\n\nexport const useActiveToFeedForyou = (): ((\n position: ClickPosition | [ClickPositionPrefix, ClickPosition],\n id?: string,\n) => void) => {\n const active = usePageActive();\n\n return useCallback((position, id) => {\n const enterPosition = Array.isArray(position) ? position[0] + position[1] : position;\n\n active({\n schemaOption: {\n pageType: 'feed',\n categoryId: 0,\n },\n ampExtra: {\n enter_position: enterPosition,\n enter_page_click_id: id || null,\n },\n });\n }, []);\n};\n","import { useEffect } from 'react';\nimport { ActiveProps } from './index';\nimport { useCompletedActiveSchema } from './use-completed-active-schema';\n\nexport type UseSilentAwakenProps = Omit & { hasFulfilled?: boolean };\ntype Awaited> = T extends Promise ? U : never;\nexport type RelatedApps = Awaited>> | undefined;\n\ninterface relatedAppData {\n id?: string;\n platform: string;\n version?: string;\n url?: string;\n}\n\nconst DEFAULT_TIMEOUT = 10000;\nconst LEMON8_PKG_ID = 'com.bd.nproject';\n\nconst delay = (timeout: number) => new Promise((resolve) => setTimeout(resolve, timeout));\n\nconst getIsClient = (): boolean => {\n return typeof window !== 'undefined';\n};\n\nconst getRelatedApps = async (): Promise => {\n if (!getIsClient()) {\n return Promise.resolve(undefined);\n }\n\n if (window?.navigator?.getInstalledRelatedApps) {\n return Promise.race([window.navigator.getInstalledRelatedApps(), delay(DEFAULT_TIMEOUT)]);\n }\n return Promise.resolve(undefined);\n};\n\nconst awakenAfterDelay = async (schema: string): Promise => {\n await delay(DEFAULT_TIMEOUT);\n location.href = schema;\n};\n\nconst awakenApp = async (schema: string): Promise => {\n const relatedAppsInfo = await getRelatedApps();\n if (relatedAppsInfo && relatedAppsInfo.length > 0) {\n const lemon8AppInfo: relatedAppData = relatedAppsInfo.find((app) => app.id.includes(LEMON8_PKG_ID));\n if (lemon8AppInfo) {\n window.Tea('wap_with_app', {\n installed_app_name: lemon8AppInfo.id,\n installed_app_version: lemon8AppInfo.version,\n });\n await awakenAfterDelay(schema);\n }\n } else {\n await awakenAfterDelay(schema);\n }\n};\n\nexport const useSilentAwaken = (props: UseSilentAwakenProps) => {\n const { schemaOption, hasFulfilled = false } = props;\n\n const pid = 'website_seo_silent_awaken';\n\n const schema = useCompletedActiveSchema(\n {\n ...schemaOption,\n pid,\n },\n {\n enterPosition: 'silent_awaken',\n },\n );\n\n useEffect(() => {\n const ua = window.navigator.userAgent;\n const isAndroid = /android/i.test(ua);\n\n if (isAndroid) {\n // wait for the ending of stream rendering\n if (hasFulfilled) {\n awakenApp(schema).catch((err) => {\n console.error('awaken app error', err);\n });\n }\n }\n }, [hasFulfilled]);\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","/** 权限判断与获取 */\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};\n\nlet cachedNotificationInstance: Notification | null = null;\n\nexport const sendNotification = async (title: string, options: Options) => {\n const auth = await getAuth();\n const { data } = options;\n const { url } = data;\n if (auth && !cachedNotificationInstance) {\n const notification = new Notification(title, options);\n cachedNotificationInstance = notification;\n window.Tea('wap_notify_success');\n sessionStorage.setItem('is_notification', 'true');\n\n notification.onclick = (event) => {\n event.preventDefault();\n window.open(url);\n };\n }\n};\n"],"sourceRoot":""}