{"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/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","DotIndicatorSection","nestedSwiperSlideInfo","slideToNestedIndex","ref","useRef","handleIndicatorChange","changeTo","Math","min","React","createElement","DotIndicator","className","count","onChange","$AdditionalParams","EndRecommendContentLoading","Loading","variant","shadow","EndRecommendContentEmpty","t","useTranslation","EndRecommendContent","groupId","endRecommendSwiper","setEndRecommendSwiper","useScopedAtom","loadableRelatedPost","items","hasMore","useMemo","state","data","endRecommendItems","item","slice","prefix","$CurrentPositionPrefix","handleProgress","_s","progress","allowSlidePrev","Swiper","resistanceRatio","slidesPerView","onSwiper","nested","map","rank","SwiperSlide","key","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","onClick","title","displayName","GalleryIndex","galleryIndexShow","setGalleryIndexShow","useState","hiddenTimeout","clearTimeout","setTimeout","concat","GalleryLabel","props","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","pos","cls","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","useImperativeHandle","video","seek","currentTime","play","catch","pause","mute","unmute","EVideoMuteStatus","p0","p1","p2","handlePlayEvent","handlePauseEvent","handleEndEvent","playsInline","poster","onPause","onPlay","onEnded","Array","forwardRef","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/418-f55156afca70a20dd6cc-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 { 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":""}