{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/campaign-carousel/item/index.tsx","webpack://@lemon8/web-seo/./client/components/campaign-carousel/index.tsx","webpack://@lemon8/web-seo/./client/components/divisible-stack/index.tsx","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/section-title/index.tsx","webpack://@lemon8/web-seo/./client/components/see-more/index.tsx","webpack://@lemon8/web-seo/./client/components/seo-keywords-item/index.tsx","webpack://@lemon8/web-seo/./client/components/step-scroll-ui/index.tsx","webpack://@lemon8/web-seo/./client/components/step-scroll/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/topic-article-card/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/index.tsx","webpack://@lemon8/web-seo/./client/models/current-module-rank.ts","webpack://@lemon8/web-seo/./client/models/current-page-module.ts","webpack://@lemon8/web-seo/./client/models/current-position-prefix.ts","webpack://@lemon8/web-seo/./client/utils/active/use-completed-active-schema.ts","webpack://@lemon8/web-seo/./client/utils/build-seo-url.ts","webpack://@lemon8/web-seo/./client/utils/format/num-formatter.ts","webpack://@lemon8/web-seo/./client/utils/is-mobile-user.ts","webpack://@lemon8/web-seo/./client/utils/remix-page.tsx","webpack://@lemon8/web-seo/./shared/utils/format/kep-formatter.ts"],"names":["CampaignBannerItem","props","campaign","title","bannerUrl","campaignId","active","usePageActive","isBanner","handleClick","useReflowClick","clickEvent","_","bundle","_objectSpread","current_position","ClickPosition","defaultBehavior","schemaOption","pageType","categoryId","ampExtra","enter_position","enter_page_click_id","React","createElement","className","onClick","src","alt","ArrowIcon","CampaignCarousel","campaigns","useAtomValue","$CampaignBanner","$indicator","useRef","$swiper","handleIndicatorIndexChange","useCallback","target","current","slideToLoop","handleSwiperSlides","swiper","_a","changeTo","realIndex","Swiper","slidesPerView","loop","autoplay","delay","disableOnInteraction","modules","Autoplay","onSwiper","s","onSlideChange","map","SwiperSlide","key","length","DotIndicator","ref","count","onChange","DivisibleStack","children","divider","wrapper","content","Children","filter","Boolean","flatMap","child","index","concat","Fragment","IndicatorDotSize","useDotsType","dotsTypeList","_range","positions","shift","i","slice","forEach","pos","center","_sum","Math","abs","forwardRef","currentIndex","setCurrentIndex","useState","indicatorDotSizes","useIndicatorDotSizes","handleDotClick","useImperativeHandle","cls","selected","SectionTitleWithViewMore","onClickViewMore","onShowViewMore","emojiStr","currentPageModule","useScopedAtomValue","$CurrentPageModule","prefix","$CurrentPositionPrefix","t","useTranslation","window","Tea","current_page_module","is_cta","sectionObservedRef","useViewTracking","onView","id","ChevronRightIcon","SectionTitle","viewMore","isMobile","$UserAgent","SeeMore","onClickSeeMore","loading","Loading","variant","ChevronDownIcon","SEOKeywordsItem","isBot","keyword","StepScrollUI","left","right","onClickRight","onClickLeft","isPC","show","LeftIcon","RightIcon","StepScroll","scrollList","childWidth","showLeft","setShowLeft","showRight","setShowRight","useEffect","item","clientWidth","scrollLeft","scrollWidth","handleScroll","e","div","handleActionClick","type","event","preventDefault","atom","scrollBy","onScroll","TopicArticleCard","_ref","topic","article","positionPrefix","ClickPositionPrefix","topicId","articleClass","articleLikes","shortContent","largeImage","groupId","formatNum","useNumFormatter","isMobileUser","$IsMobileUser","articleHref","useSEOHref","LegacyTopicArticleUtil","handleArticleClick","page_click_id","reflowBehavior","EArticleClass","stopPropagation","hashtagArticleCardRef","Link","to","draggable","Image","url","replace","HeartIcon","VideoIcon","MIN_HASHTAG_ARTICLE_COUNT","MAX_HASHTAG_ARTICLE_COUNT","TopicCard","$PageLevelTraffic","isKEPPage","EPageType","isOnlyWord","region","$Locale","topicHref","useMemo","kepQueryFormat","topicName","isHashtagWithArticleCard","articles","currentPosition","handleHashtagClick","query","hashtagId","description","num","viewCount","hashtagRef","NumberIcon","MODULE_NOT_RANK","$CurrentModuleRank","useCompletedActiveSchema","extraParams","seoPageId","trafficPid","$RootTraffic","webId","$WebUser","versions","$ABTest","schema","buildSchema","pid","schemaURL","URL","searchParams","set","JSON","stringify","traffic_type","enter_page_type","seo_page_id","web_id","enterPosition","toString","$SEOLinkBuilder","get","enterHref","enterHrefObj","path","options","arguments","undefined","fullUrl","has","protocol","host","pathname","search","useSEOLinkBuilder","pathAndSearch","buildSEOLink","NUM_INTERVAL_MAP","w","Region","k","_config","val","config","decimal","units","needDiv","toFixed","unitDigit","split","oneDecimal","Number","String","upperLimit","upperText","tmpl","formatNumByRegion","includes","RemixPage","AbsRemixPage","constructor","Head","HeadSkeleton","BodySkeleton","RootSkeleton","useRouteLoading","canonicalUrl","a","location","specialRegex","emojiRegex","char","toLowerCase","trim"],"mappings":"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","file":"vendors/498-511dd4dc096aa4ca95d2-ade4ba9718be3d0b2f6b26782fbeda8b1ed36057.js","sourcesContent":["import ArrowIcon from 'icon/chevron_right.svg';\nimport { ICampaignBanner } from 'shared/atoms/common/campaign-banner';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { ClickPosition } from '~/utils/click-position';\nimport useReflowClick from '~/utils/use-reflow-click';\n\nimport './style.scss';\n\ninterface CampaignBannerItemProps {\n campaign: ICampaignBanner;\n}\n\nexport const CampaignBannerItem = (props: CampaignBannerItemProps): JSX.Element => {\n const { campaign } = props;\n const { title, bannerUrl, campaignId } = campaign;\n const active = usePageActive({ isBanner: true });\n\n const handleClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.activity_banner,\n }),\n defaultBehavior: () => {\n active({\n schemaOption: {\n pageType: 'feed',\n categoryId: 0,\n },\n ampExtra: {\n enter_position: ClickPosition.activity_banner,\n enter_page_click_id: campaignId,\n },\n });\n },\n },\n [active],\n );\n\n return (\n
\n
\n {title}\n
\n
\n

{title}

\n \n
\n
\n );\n};\n","import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';\nimport { Autoplay } from 'swiper/modules';\nimport { CampaignBannerItem } from './item';\nimport { useAtomValue } from 'jotai';\nimport { $CampaignBanner } from 'shared/atoms/common/campaign-banner';\nimport { DotIndicator, DotIndicatorRef } from '~/components/dot-indicator';\nimport { useCallback, useRef } from 'react';\n\nimport './style.scss';\n\nexport const CampaignCarousel = (): JSX.Element => {\n const campaigns = useAtomValue($CampaignBanner);\n\n const $indicator = useRef(null);\n const $swiper = useRef();\n\n const handleIndicatorIndexChange = useCallback((target: number) => {\n if (!$swiper.current) {\n return;\n }\n\n $swiper.current.slideToLoop(target);\n }, []);\n\n const handleSwiperSlides = useCallback((swiper: SwiperClass) => {\n $indicator.current?.changeTo(swiper.realIndex);\n }, []);\n\n return (\n
\n ($swiper.current = s)}\n onSlideChange={handleSwiperSlides}\n >\n {campaigns.map((campaign) => (\n \n \n \n ))}\n \n {campaigns.length > 1 && (\n \n )}\n
\n );\n};\n","import { ReactNode, Children, ReactFragment, ReactElement } from 'react';\n\ninterface DivisibleStackProps {\n wrapper?: string;\n divider?: string;\n children: ReactNode;\n}\n\nexport const DivisibleStack = (props: DivisibleStackProps) => {\n const { children, divider, wrapper } = props;\n\n let content: ReturnType<(typeof Children)['toArray']> | ReactNode;\n\n if (divider) {\n content = Children.toArray(children)\n .filter(Boolean)\n .flatMap((child, index) => {\n if (index === 0) {\n return [child];\n }\n return [divider &&
, child];\n });\n } else {\n content = children;\n }\n\n if (wrapper) {\n return
{content}
;\n } else {\n return <>{content};\n }\n};\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 { ReactElement, useCallback } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { useTranslation } from 'react-i18next';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport ChevronRightIcon from '@lemon8/design/lib/icons/icon_assets/chevron_right_fill.svg';\nimport { ClickPosition } from '~/utils/click-position';\n\nimport './style.scss';\n\ninterface SectionTitleProps {\n title: string | ReactElement;\n viewMore?: boolean;\n onClickViewMore?: () => void;\n onShowViewMore?: () => void;\n /** 在title前面显示 */\n emojiStr?: string;\n}\n\n/**\n * 通用的小标题,右侧有view more按钮\n */\nfunction SectionTitleWithViewMore(props: SectionTitleProps): JSX.Element {\n const { title, onClickViewMore, onShowViewMore, emojiStr = '' } = props;\n\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n const { t } = useTranslation();\n\n const onClick = (): void => {\n window.Tea('wap_click', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.view_more_button,\n is_cta: 1,\n });\n\n onClickViewMore?.();\n };\n\n const sectionObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.view_more_button,\n });\n\n onShowViewMore?.();\n }, []),\n });\n\n return (\n
\n

\n {Boolean(emojiStr) && {emojiStr}}\n {title}\n

\n
\n {t('seo_recommended_viewMore')}\n \n
\n
\n );\n}\n\n/**\n * 通用的小标题\n */\nexport default function SectionTitle(props: SectionTitleProps): JSX.Element {\n const { title, viewMore = false, emojiStr = '' } = props;\n\n const { isMobile } = useAtomValue($UserAgent);\n\n // pc端默认不展示view more按钮\n if (!viewMore || !isMobile) {\n return (\n

\n {Boolean(emojiStr) && {emojiStr}}\n {title}\n

\n );\n }\n\n return ;\n}\n","import ChevronDownIcon from '@lemon8/design/lib/icons/icon_assets/chevron_down_fill.svg';\nimport { Loading } from '~/components/loading';\nimport { useTranslation } from 'react-i18next';\nimport cls from 'classnames';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\n\nimport './style.scss';\n\ninterface SeeMoreProps {\n loading?: boolean;\n onClickSeeMore?: () => void;\n}\n\nexport const SeeMore = (props: SeeMoreProps): JSX.Element => {\n const { onClickSeeMore, loading = false } = props;\n const { t } = useTranslation();\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n const onClick = () => {\n window.Tea('wap_click', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.see_more_button,\n });\n\n onClickSeeMore?.();\n };\n\n return (\n
\n {loading ? (\n \n ) : (\n <>\n {t('see_more')}\n \n \n )}\n
\n );\n};\n","import { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { useAtomValue } from 'jotai';\n\nexport const SEOKeywordsItem = (props: { keyword: string }) => {\n const { isBot } = useAtomValue($UserAgent);\n const { keyword } = props;\n\n return <>{isBot ? {keyword} : <>{keyword}};\n};\n","import { FC, PropsWithChildren, SyntheticEvent } from 'react';\nimport cls from 'classnames';\nimport LeftIcon from 'icon/chevron_left.svg';\nimport RightIcon from 'icon/chevron_right.svg';\nimport { useAtomValue } from 'jotai/index';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\n\nimport './style.scss';\n\ntype TStepScrollUI = PropsWithChildren<{\n className?: string;\n left: boolean;\n right: boolean;\n onClickLeft: (event: SyntheticEvent) => void;\n onClickRight: (event: SyntheticEvent) => void;\n}>;\n\nexport const StepScrollUI: FC = (props) => {\n const { children, className, left, right, onClickRight, onClickLeft } = props;\n const { isMobile } = useAtomValue($UserAgent);\n\n const isPC = !isMobile;\n\n return (\n
\n {children}\n {isPC && (\n
\n
\n \n
\n
\n \n
\n
\n )}\n
\n );\n};\n","import { Children, FC, ReactNode, SyntheticEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { StepScrollUI } from '~/components/step-scroll-ui';\n\nimport './style.scss';\n\ninterface StepScrollProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport const StepScroll: FC = (props) => {\n const { children, className } = props;\n const { isMobile } = useAtomValue($UserAgent);\n\n const isPC = !isMobile;\n\n const scrollList = useRef(null);\n const childWidth = useRef(0);\n\n const [showLeft, setShowLeft] = useState(false);\n const [showRight, setShowRight] = useState(false);\n\n // children 变化时,计算第一个child的宽度作为滚动步幅\n useEffect(() => {\n if (!scrollList.current) {\n return;\n }\n const item = scrollList.current.children.item(0);\n if (item) {\n childWidth.current = item.clientWidth;\n }\n\n const { scrollLeft, scrollWidth, clientWidth } = scrollList.current;\n setShowRight(scrollLeft < scrollWidth - clientWidth);\n }, [scrollList.current, children]);\n\n // 滚动时计算是否需要展示左右进度按钮\n const handleScroll = useCallback((e: SyntheticEvent) => {\n const div = e.target as HTMLDivElement;\n const { scrollLeft, scrollWidth, clientWidth } = div;\n\n setShowLeft(scrollLeft > 0);\n setShowRight(scrollLeft < scrollWidth - clientWidth);\n }, []);\n\n const handleActionClick = useCallback(\n (type: 'left' | 'right') => (event: SyntheticEvent) => {\n event.preventDefault();\n const atom = type === 'left' ? -1 : 1;\n scrollList.current?.scrollBy({ left: atom * childWidth.current });\n },\n [],\n );\n\n if (Children.toArray(children).length === 0) {\n return null;\n }\n\n return (\n \n
\n {children}\n
\n \n );\n};\n","import { LegacyTopicArticleUtil, Topic, TopicArticle } from 'shared/models/legacy';\nimport { Link } from '@remix-run/react';\nimport { useCallback, FC, SyntheticEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Image } from '~/components/image';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport VideoIcon from 'icon/play_fill.svg';\nimport HeartIcon from 'icon/heart.svg';\nimport { useAtomValue } from 'jotai';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { useSEOHref } from '~/utils/build-seo-url';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { EArticleClass } from 'shared/models';\n\nimport './style.scss';\n\ninterface TopicArticleCardProps {\n topic: Topic;\n article: TopicArticle;\n positionPrefix?: ClickPositionPrefix;\n}\n\nexport const TopicArticleCard: FC = ({\n topic,\n article,\n positionPrefix = ClickPositionPrefix.none,\n}) => {\n const { topicId } = topic;\n const { articleClass, articleLikes, shortContent, title, largeImage, groupId } = article;\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const active = usePageActive();\n\n const isMobileUser = useAtomValue($IsMobileUser);\n const { isBot } = useAtomValue($UserAgent);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n\n const articleHref = useSEOHref(LegacyTopicArticleUtil.getArticlePath(article));\n\n const handleArticleClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: positionPrefix + ClickPosition.related_hashtag_article_card,\n page_click_id: groupId,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n },\n ampExtra: {\n enter_position: positionPrefix + ClickPosition.related_hashtag_article_card,\n },\n });\n },\n defaultBehavior: (event?: SyntheticEvent) => {\n event?.stopPropagation();\n },\n },\n [active, topicId, groupId],\n );\n\n const hashtagArticleCardRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: positionPrefix + ClickPosition.related_hashtag_article_card,\n });\n }\n }, [isMobileUser]),\n });\n\n return (\n \n \n
\n
\n {t('own_picture').replace('%s',\n
\n
\n
\n \n {formatNum(articleLikes)}\n
\n {articleClass === EArticleClass.VIDEO && (\n
\n \n
\n )}\n
\n
\n {isBot ? (\n

{title}

\n ) : (\n
{title}
\n )}\n

{shortContent}

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

\n \n

\n {description &&

{description}

}\n
\n
\n {!isOnlyWord && topic.articles && topic.articles.length >= MIN_HASHTAG_ARTICLE_COUNT && (\n \n {topic.articles.slice(0, MAX_HASHTAG_ARTICLE_COUNT).map((article) => (\n \n ))}\n \n )}\n \n );\n};\n","import { atom } from 'jotai';\n\nexport const MODULE_NOT_RANK = -1;\n\nexport const $CurrentModuleRank = atom(MODULE_NOT_RANK);\n","import { atom } from 'jotai';\nimport { ModuleType } from '~/utils/module-type';\n\nexport const $CurrentPageModule = atom('' as ModuleType);\n","import { atom } from 'jotai';\nimport { ClickPositionPrefix } from '~/utils/click-position';\n\nexport const $CurrentPositionPrefix = atom(ClickPositionPrefix.none);\n","import { $ABTest, $RootTraffic, $WebUser } from '@lemon8/web-app-shared/atom';\nimport { DeepLinkBuildingProps, buildSchema } from './schema';\nimport { useMemo } from 'react';\nimport { $PageLevelTraffic } from 'shared/atoms/page-traffic';\nimport { useAtomValue } from 'jotai';\n\nexport type ICompletedActiveSchemaExtraParams = {\n enterPosition: string;\n};\n\nexport const useCompletedActiveSchema = (\n schemaOption: DeepLinkBuildingProps & { pid: string },\n extraParams?: ICompletedActiveSchemaExtraParams,\n): string => {\n const { seoPageId, pageType } = useAtomValue($PageLevelTraffic);\n const { trafficPid } = useAtomValue($RootTraffic);\n const { webId } = useAtomValue($WebUser);\n const { versions } = useAtomValue($ABTest);\n\n return useMemo(() => {\n const schema = buildSchema({\n ...schemaOption,\n pid: schemaOption.pid || trafficPid,\n });\n\n const schemaURL = new URL(schema);\n\n schemaURL.searchParams.set('ab_version', versions);\n\n schemaURL.searchParams.set(\n 'amp_extra',\n JSON.stringify({\n traffic_type: trafficPid,\n enter_page_type: pageType,\n seo_page_id: seoPageId,\n web_id: webId,\n enter_position: extraParams?.enterPosition,\n }),\n );\n\n return schemaURL.toString();\n }, [versions, schemaOption]);\n};\n","import { $Locale, $RootTraffic } from '@lemon8/web-app-shared/atom';\nimport { atom, useAtomValue } from 'jotai';\nimport { useMemo } from 'react';\n\nexport interface ISEOUrlBuilderOptions {\n /**\n * @default false\n *\n * return a full url rather than path or href\n */\n fullUrl?: boolean;\n}\n\nexport type SEOUrlBuilder = (pathAndSearch: string, options?: ISEOUrlBuilderOptions) => string;\nexport type SEOUrlBuilderWithoutOptions = (pathAndSearch: string) => string;\n\nconst $SEOLinkBuilder = atom((get) => {\n const { enterHref } = get($RootTraffic);\n const { region } = get($Locale);\n const enterHrefObj = new URL(enterHref);\n\n return (path: string, options: ISEOUrlBuilderOptions = {}): string => {\n try {\n const { fullUrl } = options;\n const url = new URL(path, enterHrefObj);\n\n if (!url.searchParams.has('region')) {\n url.searchParams.set('region', region);\n }\n\n if (fullUrl) {\n return `${url.protocol}//${url.host}${url.pathname}${url.search}`;\n } else {\n return `${url.pathname}${url.search}`;\n }\n } catch (e) {\n return '';\n }\n };\n});\n\nexport const useSEOLinkBuilder = (): SEOUrlBuilder => useAtomValue($SEOLinkBuilder);\n\nexport const useSEOHref: SEOUrlBuilderWithoutOptions = (pathAndSearch: string) => {\n const buildSEOLink = useSEOLinkBuilder();\n\n return useMemo(() => {\n return buildSEOLink(pathAndSearch);\n }, [buildSEOLink, pathAndSearch]);\n};\n","import { i18n } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { useCallback } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/web-app-shared/atom';\nimport { Region } from '@lemon8/web-app-shared/i18n';\n\nconst NUM_INTERVAL_MAP = {\n w: [Region.jp],\n k: [\n Region.id,\n Region.my,\n Region.ph,\n Region.sg,\n Region.th,\n Region.vn,\n Region.gb,\n Region.us,\n Region.au,\n Region.nz,\n Region.ca,\n ],\n};\n\nexport function formatNum(num: number, _config: any = {}): string {\n let val = `${num}`;\n const config = {\n decimal: 1,\n units: ['万', '億'],\n needDiv: true,\n ..._config,\n };\n const { decimal } = config;\n\n if (config.type === 'KMB') {\n if (num >= 1e10) {\n val = `${(num / 1e9).toFixed(0)}B`;\n } else if (num >= 1e9) {\n val = `${(num / 1e9).toFixed(decimal).replace(/\\.0*$/, '')}B`;\n } else if (num >= 1e7) {\n val = `${(num / 1e6).toFixed(0)}M`;\n } else if (num >= 1e6) {\n val = `${(num / 1e6).toFixed(decimal).replace(/\\.0*$/, '')}M`;\n } else if (num >= 1e4) {\n val = `${(num / 1e3).toFixed(0)}K`;\n } else if (num >= 1e3) {\n val = `${(num / 1e3).toFixed(decimal).replace(/\\.0*$/, '')}K`;\n } else {\n val = `${num}`;\n }\n } else if (config.type === 'KM') {\n if (num >= 10e6) {\n const unitDigit = (num / 1e6).toString().split('.')[0];\n const oneDecimal = ((num - Number(unitDigit) * 1e6) / 1e5).toString().split('.')[0];\n if (Number(oneDecimal) >= 1) {\n val = `${String(unitDigit)}.${String(oneDecimal)}${config.units[0] as string}`;\n } else {\n val = `${String(unitDigit)}${config.units[1] as string}`;\n }\n } else if (num >= 1e4) {\n const unitDigit = (num / 1e3).toString().split('.')[0];\n const oneDecimal = ((num - Number(unitDigit) * 1e3) / 1e2).toString().split('.')[0];\n if (Number(oneDecimal) >= 1) {\n val = `${String(unitDigit)}.${String(oneDecimal)}${config.units[0] as string}`;\n } else {\n val = `${String(unitDigit)}${config.units[0] as string}`;\n }\n } else {\n val = `${num}`;\n }\n } else if (config.type === 'WY') {\n if (num >= 1e10) {\n val = ~~(num / 1e8) + config.units[1];\n } else if (num >= 1e8) {\n val = (num / 1e8).toFixed(decimal).replace(/\\.0*$/, '') + config.units[1];\n } else if (num >= 1e6) {\n val = ~~(num / 1e4) + config.units[0];\n } else if (num >= 1e4) {\n val = (num / 1e4).toFixed(decimal).replace(/\\.0*$/, '') + config.units[0];\n } else {\n val = `${num}`;\n }\n } else if (config.type === 'W') {\n if (num >= 1e4) {\n const unitDigit = (num / 1e4).toString().split('.')[0];\n const oneDecimal = ((num - Number(unitDigit) * 1e4) / 1e3).toString().split('.')[0];\n if (Number(oneDecimal) >= 1) {\n val = `${String(unitDigit)}.${String(oneDecimal)}${config.units[0] as string}`;\n } else {\n val = `${String(unitDigit)}${config.units[0] as string}`;\n }\n } else {\n val = `${num}`;\n }\n } else if (config.upperLimit && num >= config.upperLimit) {\n val = config.upperText;\n }\n if (config.needDiv) {\n val = val.replace(/\\d+/, function (s: string) {\n return s.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n });\n }\n\n if (config.tmpl) {\n return config.tmpl.replace('%s', val);\n }\n\n return val;\n}\n\nexport function formatNumByRegion(num: number, region: Region, t: i18n['t']): string {\n if (NUM_INTERVAL_MAP.w.includes(region)) {\n const type = 'W';\n const units = [t('common_ten_thousand')];\n return formatNum(num, { type, units, needDiv: false });\n }\n if (NUM_INTERVAL_MAP.k.includes(region)) {\n const type = 'KM';\n const units = [t('common_thousand'), t('common_million')];\n return formatNum(num, { type, units, needDiv: false });\n }\n return '';\n}\n\ntype NumFormatter = (num: number) => string;\n\nexport const useNumFormatter = (): NumFormatter => {\n const { region } = useAtomValue($Locale);\n const { t } = useTranslation();\n\n // TODO force cast\n return useCallback((num: number) => formatNumByRegion(num, region as any, t), []);\n};\n","import { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { atom } from 'jotai';\n\nexport const $IsMobileUser = atom((get) => {\n const { isBot, isMobile } = get($UserAgent);\n\n return !isBot && isMobile;\n});\n","import { FC } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { RootSkeleton } from '~/skeleton';\nimport { AbsRemixPage } from '@lemon8/web-app-shared/ssr';\n\nexport abstract class RemixPage extends AbsRemixPage {\n Head: FC = () => null;\n\n HeadSkeleton: FC = () => {\n return (\n <>\n Lemon8 Loading...\n \n );\n };\n BodySkeleton: FC = () => {\n return ;\n };\n\n useRouteLoading = (): boolean => {\n const { canonicalUrl } = useAtomValue($PageLevelTraffic);\n\n if (__BUILD_TARGET__ === 'server') {\n return false;\n }\n\n const a = new URL(canonicalUrl);\n return location.pathname !== a.pathname;\n };\n}\n","const specialRegex = /[!@&/\\\\#,+()$~%.'\":*?<>{}]/g;\nconst emojiRegex = /[\\u{1F000}-\\u{1F9FF}]/gu;\n\n/** format to url word */\nexport const kepQueryFormat = (query: string) => {\n if (!query) {\n return '';\n }\n\n const filterCharWord = query.replace(specialRegex, '');\n const filterEmojiWord = filterCharWord.replace(emojiRegex, '');\n const filterSpaceWord = filterEmojiWord.replace(/\\s+/g, ' ');\n const lowerCaseWord = filterSpaceWord.replace(/[A-Z]/g, (char) => char.toLowerCase());\n\n return lowerCaseWord.trim();\n};\n"],"sourceRoot":""}