{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/divisible-stack/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":["DivisibleStack","props","children","divider","wrapper","content","Children","filter","Boolean","flatMap","child","index","React","createElement","className","key","concat","Fragment","SectionTitleWithViewMore","title","onClickViewMore","onShowViewMore","emojiStr","currentPageModule","useScopedAtomValue","$CurrentPageModule","prefix","$CurrentPositionPrefix","t","useTranslation","onClick","window","Tea","current_page_module","current_position","ClickPosition","is_cta","sectionObservedRef","useViewTracking","onView","useCallback","id","ref","ChevronRightIcon","SectionTitle","viewMore","isMobile","useAtomValue","$UserAgent","_objectSpread","SeeMore","onClickSeeMore","loading","cls","Loading","variant","ChevronDownIcon","SEOKeywordsItem","isBot","keyword","StepScrollUI","left","right","onClickRight","onClickLeft","isPC","show","LeftIcon","RightIcon","StepScroll","scrollList","useRef","childWidth","showLeft","setShowLeft","useState","showRight","setShowRight","useEffect","current","item","clientWidth","scrollLeft","scrollWidth","handleScroll","e","div","target","handleActionClick","type","event","_a","preventDefault","atom","scrollBy","length","onScroll","TopicArticleCard","_ref","topic","article","positionPrefix","ClickPositionPrefix","topicId","articleClass","articleLikes","shortContent","largeImage","groupId","formatNum","useNumFormatter","active","usePageActive","isMobileUser","$IsMobileUser","articleHref","useSEOHref","LegacyTopicArticleUtil","handleArticleClick","useReflowClick","clickEvent","_","bundle","page_click_id","reflowBehavior","schemaOption","pageType","EArticleClass","ampExtra","enter_position","defaultBehavior","stopPropagation","hashtagArticleCardRef","Link","to","draggable","Image","src","url","alt","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","slice","map","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","s","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/933-ab148b1d071281ce68ff-ade4ba9718be3d0b2f6b26782fbeda8b1ed36057.js","sourcesContent":["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 { 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":""}