{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/image/index.tsx","webpack://@lemon8/web-seo/./client/components/load-more/util.ts","webpack://@lemon8/web-seo/./client/components/load-more/index.tsx","webpack://@lemon8/web-seo/./client/components/not-found/index.tsx","webpack://@lemon8/web-seo/./client/components/simple-topic-card/index.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/shared/use-user-tdk.ts","webpack://@lemon8/web-seo/./client/routes/$user_link_name/head/og.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/head/tdk.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/head/twitter.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/head/facebook.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/head/sharing-card.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name/shared/atoms/current-user.ts","webpack://@lemon8/web-seo/./client/utils/active/schema.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/json-ld/util.ts","webpack://@lemon8/web-seo/./client/utils/json-ld/breadcrumb.tsx","webpack://@lemon8/web-seo/./client/utils/remix-page.tsx","webpack://@lemon8/web-seo/./client/utils/use-route-loader.ts"],"names":["Image","props","React","_objectSpread","onContextMenu","e","preventDefault","UI","scrollY","window","pageYOffset","document","body","scrollTop","documentElement","offset","el","type","getBoundingClientRect","left","top","width","height","pageXOffset","PREFIX","render","loadData","className","initList","showEnd","loadingText","endText","placeholder","isEnd","alwaysShowLoading","distanceToLoad","isLoading","setIsLoading","useState","dataList","setDataList","listRef","useRef","timerRef","listDom","doLoadMore","useCallback","then","res","data","list","finally","scrollLoadMore","current","clearTimeout","setTimeout","innerHeight","useEffect","addEventListener","passive","capture","renderBottomText","createElement","renderPlaceholder","length","concat","ref","ENotFoundType","NotFound","t","useTranslation","hint","useMemo","aHref","name","desc","icon_url","style","isBOT","isDefault","onClick","size","followerCount","viewsCount","onImpression","showNumber","activity_icon_style","region","useAtomValue","$Locale","hashRef","offsetTop","isLarge","isSmall","throttleHandleScroll","throttle","removeEventListener","y","Link","to","cs","default","Number","src","alt","num","replace","formatNumByRegion","useUserTDK","loadableUser","loadable","$CurrentAvailableUserOrNull","state","title","description","keywords","user","nickName","UserOpenGraph","canonicalUrl","$PageLevelTraffic","ogCardInfo","ogUrl","ogTitle","ogDescription","ogMediaMetaInfo","getOGImageMeta","avatar","url","ogType","EOGType","CommonPageOGCard","CanonicalLinkComponent","DynamicHead","rel","href","PageTDK","CommonPageTDK","constructor","arguments","CanonicalLink","UserTDK","useTwCardImage","UserTwitter","twitterCardInfo","twCardTitle","twCardDesc","twCardImageSrc","CommonPageTWCard","UserFacebookALMeta","schemaOption","getSchemaOption","pageType","categoryId","userId","alMetaInfo","openUrl","useCompletedActiveSchema","pid","enterPosition","webUrl","CommonPageALMeta","SharingCardMeta","AbsPageSharingCard","PageLevelTDK","PageLevelOGCard","PageLevelTWCard","PageLevelALMeta","CurrentUserId","atom","get","traffic","EPageType","includes","Promise","resolve","pendingQueue","$CurrentUserLinkName","userLinkName","$CurrentUser","currentUserLinkName","$UserDetailV2","UserDetailUtil","$CurrentUserAsAvailable","isArticleSchemaBuildingProps","input","isVideoSchemaBuildingProps","isUserSchemaBuildingProps","isCategorySchemaBuildingProps","isHashtagSchemaBuildingProps","isPOISchemaBuildingProps","isSearchSchemaBuildingProps","buildSchema","protocol","host","params","URLSearchParams","group_id","groupId","authorId","set","user_id","tab","channel_id","String","hashtag_id","hashtagId","poi_id","poiId","channel","bundle","trans_status_bar","enter_anim","exit_anim","business_type","business_data","JSON","stringify","query","inputClickType","logExtra","search_page_from","search_from","previous_page_name","Unreachable","append","campaign","toString","extraParams","seoPageId","trafficPid","$RootTraffic","webId","$WebUser","versions","$ABTest","schema","schemaURL","URL","searchParams","traffic_type","enter_page_type","seo_page_id","web_id","enter_position","$SEOLinkBuilder","enterHref","enterHrefObj","path","options","undefined","fullUrl","has","pathname","search","useSEOLinkBuilder","useSEOHref","pathAndSearch","buildSEOLink","NUM_INTERVAL_MAP","w","Region","k","formatNum","_config","val","config","decimal","units","needDiv","toFixed","unitDigit","split","oneDecimal","upperLimit","upperText","s","tmpl","useNumFormatter","parseUrlBySlash","u","subPath","prefix","p","endsWith","push","hash","splitUrlBySlashOrHash","_","BreadcrumbJSONLD","nameList","urlList","splicedUrl","crumbList","index","position","item","dangerouslySetInnerHTML","__html","itemListElement","RemixPage","AbsRemixPage","Head","HeadSkeleton","Fragment","BodySkeleton","RootSkeleton","useRouteLoading","a","location","getAtom","key","atomKey","args","decodeArgs","map","decodeURIComponent","atomFamily","atomFamilies","console","error","atoms","useRouteLoader","method","store","useStore","fetcher","useFetcher","load","Object","entries","forEach","_ref","value","_ref2","startsWith","atomToSet"],"mappings":"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","file":"vendors/19-e55c648154261d8df063-ade4ba9718be3d0b2f6b26782fbeda8b1ed36057.js","sourcesContent":["import React, { FC } from 'react';\n\nexport const Image: FC<\n React.DetailedHTMLProps<\n React.ImgHTMLAttributes & { fetchpriority?: 'high' | 'low' | 'auto' },\n HTMLImageElement\n >\n> = (props) => {\n return e.preventDefault()} />;\n};\n","const UI = {\n scrollY() {\n const theScrollY =\n window.scrollY ||\n window.pageYOffset ||\n document.body.scrollTop ||\n // @ts-ignore\n document.documentElement.scrollTop;\n return theScrollY;\n },\n\n offset(el: any, type?: string) {\n if (!el || typeof el.getBoundingClientRect !== 'function') {\n return 0;\n }\n\n const { left, top, width, height } = el.getBoundingClientRect();\n\n switch (type) {\n case 'top':\n return top + window.pageYOffset;\n\n case 'left':\n return left + window.pageXOffset;\n\n case 'height':\n return height;\n\n case 'width':\n return width;\n\n default:\n return {\n height,\n width,\n top: top + window.pageYOffset,\n left: left + window.pageXOffset,\n };\n }\n },\n};\n\nexport default UI;\nexport const { scrollY, offset } = UI;\n","import { FC, useState, useEffect, useCallback, useRef } from 'react';\nimport UI from './util';\n\nimport './style.scss';\n\nconst PREFIX = 'ui-mobile-load-more';\n\ninterface IProps {\n /** 加载数据函数,返回Promise */\n loadData: () => Promise<{\n data: any[];\n }>;\n /** 渲染数据列表函数,参数为数据列表 */\n render: (param: any[]) => any;\n /** 当前列表是否已经结束 */\n isEnd?: boolean;\n /** 占位符 */\n placeholder?: any;\n /** 结束时是否展示结束文案 */\n showEnd?: boolean;\n /** 初始列表 */\n initList?: any[];\n /** 容器类名 */\n className?: string;\n /** 结束文案,或者可以自定义dom结构 */\n endText?: any;\n /** 加载文案, 或者可以自定义dom结构 */\n loadingText?: any;\n /** 在未结束的情况下是否一直显示loading样式 */\n alwaysShowLoading?: boolean;\n /** 距离底部开始加载的距离 */\n distanceToLoad?: number;\n}\n\nconst LoadMore: FC = (props) => {\n const {\n render,\n loadData,\n className = '',\n initList = [],\n showEnd = true,\n loadingText = 'loading',\n endText = 'No More Results',\n placeholder = null,\n isEnd = false,\n alwaysShowLoading = false,\n distanceToLoad = 0,\n } = props;\n\n const [isLoading, setIsLoading] = useState(false);\n const [dataList, setDataList] = useState(initList);\n\n const listRef = useRef(null);\n const timerRef = useRef(null);\n\n const listDom = render(dataList);\n\n const doLoadMore = useCallback(() => {\n setIsLoading(true);\n loadData()\n .then((res: { data: any[] }) => {\n const { data } = res;\n setDataList((list) => [...list, ...data]);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }, [loadData]);\n\n const scrollLoadMore = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n if (isEnd) {\n return;\n }\n\n const { height, top } = UI.offset(listRef.current);\n\n timerRef.current = setTimeout(() => {\n if (!isLoading && height + top <= window.innerHeight + UI.scrollY() + (distanceToLoad || 0)) {\n doLoadMore();\n }\n }, 200);\n }, [isLoading, isEnd, doLoadMore]);\n\n useEffect(() => {\n document.addEventListener('touchmove', scrollLoadMore);\n document.addEventListener('scroll', scrollLoadMore, { passive: false, capture: true });\n\n return () => {\n document.addEventListener('touchmove', scrollLoadMore);\n document.addEventListener('scroll', scrollLoadMore, { passive: false, capture: true });\n };\n }, [scrollLoadMore]);\n\n const renderBottomText = (): JSX.Element | null => {\n if (isLoading || (!isEnd && alwaysShowLoading)) {\n return
{loadingText}
;\n }\n if (isEnd && showEnd) {\n return
{endText}
;\n }\n return null;\n };\n\n const renderPlaceholder = (): JSX.Element | null => {\n if (isLoading || dataList.length > 0 || (!isEnd && alwaysShowLoading)) {\n return null;\n }\n return placeholder;\n };\n\n return (\n
\n
\n {listDom}\n
\n
{renderBottomText()}
\n
{renderPlaceholder()}
\n
\n );\n};\n\nexport default LoadMore;\n","import { useTranslation } from 'react-i18next';\nimport { FC, useMemo } from 'react';\n\nimport './style.scss';\n\nexport enum ENotFoundType {\n NOT_FOUND,\n PRIVACY_ACCOUNT,\n}\n\ninterface INotFoundProps {\n /**\n * @default ENotFoundType.NOT_FOUND\n */\n type?: ENotFoundType;\n}\n\nexport const NotFound: FC = (props) => {\n const { t } = useTranslation();\n const { type = ENotFoundType.NOT_FOUND } = props;\n\n const hint = useMemo(() => {\n switch (type) {\n case ENotFoundType.PRIVACY_ACCOUNT:\n return t('privateAccount_web_description');\n case ENotFoundType.NOT_FOUND:\n default:\n return t('article_not_found');\n }\n }, [type]);\n\n return (\n
\n
\n
{hint}
\n
\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport throttle from 'lodash/throttle';\nimport cs from 'classnames';\nimport { Link } from '@remix-run/react';\nimport Number from 'icon/number.svg';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/web-app-shared/atom';\nimport { Image } from '../image';\nimport { formatNumByRegion } from '~/utils/format/num-formatter';\nimport { useTranslation } from 'react-i18next';\nimport { Region } from '@lemon8/web-app-shared/i18n';\n\nimport './style.scss';\n\nconst HashtagCard: React.FC<{\n aHref: string;\n name: string;\n desc?: string;\n icon_url?: string;\n className?: string;\n style?: any;\n isDefault?: boolean;\n onClick?: any;\n isBOT?: boolean;\n size?: 'default' | 'large' | 'small';\n /** 关注数 */\n followerCount?: number;\n /** 查看数 */\n viewsCount?: number;\n onImpression?: () => void;\n activity_icon_style?: number;\n showNumber?: boolean;\n}> = (props) => {\n const {\n aHref = '',\n name = '',\n desc = '',\n icon_url = '',\n className = '',\n style = {},\n isBOT = false,\n isDefault = false,\n onClick = () => {\n //\n },\n size = 'default',\n followerCount = 0,\n viewsCount = 0,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onImpression = () => {},\n showNumber = false,\n activity_icon_style,\n } = props;\n const { region } = useAtomValue($Locale);\n\n const { t } = useTranslation();\n\n const hashRef = useRef(null);\n let offsetTop = 0;\n\n const isLarge = size === 'large';\n const isSmall = size === 'small';\n\n const throttleHandleScroll = throttle(() => {\n // 这里的计算都是基于window滚动实现的,如果之后转移虚拟化了这里计算要想办法重新算\n if (window.scrollY + window.innerHeight > offsetTop) {\n onImpression();\n window.removeEventListener('scroll', throttleHandleScroll);\n }\n }, 300);\n useEffect(() => {\n if (hashRef.current) {\n offsetTop = window.scrollY + hashRef.current.getBoundingClientRect().y;\n }\n window.addEventListener('scroll', throttleHandleScroll);\n return () => {\n window.removeEventListener('scroll', throttleHandleScroll);\n };\n }, []);\n return (\n \n {!isSmall &&\n (isDefault ? (\n \n \n
\n ) : (\n {name}\n ))}\n\n
\n
\n {isDefault ? (\n

\n {name}\n {activity_icon_style === 1 ? : ''}\n

\n ) : (\n

\n {name}\n {activity_icon_style === 1 ? : ''}\n

\n )}\n {!isSmall &&
{desc}
}\n
\n {isLarge ? (\n
\n {(viewsCount > 0 || showNumber) && (\n \n {t('view_count_plural', { num: viewsCount }).replace(\n '%d',\n formatNumByRegion(viewsCount, region as unknown as Region, t),\n )}\n \n )}\n {showNumber && ·}\n {showNumber && (\n \n {t('follower_count_plural', { num: followerCount }).replace(\n '%d',\n formatNumByRegion(followerCount, region as unknown as Region, t),\n )}\n \n )}\n
\n ) : null}\n
\n \n );\n};\n\nexport default HashtagCard;\n","import { useTranslation } from 'react-i18next';\nimport { useAtomValue } from 'jotai';\nimport { $CurrentAvailableUserOrNull } from '@user/shared/atoms/current-user';\nimport { loadable } from 'jotai/utils';\n\nexport const useUserTDK = (): { title: string; description: string; keywords: string } => {\n const { t } = useTranslation();\n const loadableUser = useAtomValue(loadable($CurrentAvailableUserOrNull));\n\n if (loadableUser.state !== 'hasData' || !loadableUser.data) {\n return {\n title: '',\n description: '',\n keywords: '',\n };\n }\n\n const user = loadableUser.data;\n\n const description = t('user_helmet_description_1')\n .replace('%1$s', user.nickName || '')\n .replace('%2$s', user.description || '');\n\n const title = `${t('user_helmet_title')\n .replace('%1$s', (user && user.nickName) || '')\n .replace('%2$s', t('contribute'))}|Lemon8`;\n\n const keywords = t('keyword_default');\n\n return {\n title,\n description,\n keywords,\n };\n};\n","import { useAtomValue } from 'jotai';\nimport { useUserTDK } from '../shared/use-user-tdk';\nimport { $CurrentAvailableUserOrNull } from '@user/shared/atoms/current-user';\nimport { CommonPageOGCard, EOGType, ICommonPageOGCardProps, IOGImage } from '@lemon8/web-app-shared/ssr';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { loadable } from 'jotai/utils';\n\nexport const UserOpenGraph = () => {\n const canonicalUrl = useAtomValue($PageLevelTraffic).canonicalUrl;\n const { title, description } = useUserTDK();\n const loadableUser = useAtomValue(loadable($CurrentAvailableUserOrNull));\n\n const getOGImageMeta: () => IOGImage | null = () => {\n if (loadableUser.state !== 'hasData' || !loadableUser.data) {\n return null;\n }\n return loadableUser.data.avatar\n ? {\n url: loadableUser.data.avatar\n .replace(/p16-(sign-)?va\\.lemon8cdn.com/g, 'p16-va.topbuzzcdn.com')\n .replace(/p16-(sign-)?sg\\.lemon8cdn.com/g, 'p16.topbuzzcdn.com'),\n }\n : null;\n };\n\n const ogCardInfo: ICommonPageOGCardProps = {\n ogUrl: canonicalUrl,\n ogTitle: title,\n ogDescription: description,\n ogMediaMetaInfo: getOGImageMeta(),\n // Temperately set all card as OG Article type\n ogType: EOGType.Article,\n };\n return ;\n};\n","import { CommonPageTDK, DynamicHead } from '@lemon8/web-app-shared/ssr';\nimport { useAtomValue } from 'jotai';\nimport { useUserTDK } from '../shared/use-user-tdk';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { FC } from 'react';\n\nconst CanonicalLinkComponent: FC = () => {\n const canonicalUrl = useAtomValue($PageLevelTraffic).canonicalUrl;\n return (\n \n \n \n );\n};\n\nclass PageTDK extends CommonPageTDK {\n CanonicalLink = () => ;\n}\n\nexport const UserTDK = () => {\n return ;\n};\n","import { useAtomValue } from 'jotai';\nimport { useUserTDK } from '../shared/use-user-tdk';\nimport { $CurrentAvailableUserOrNull } from '@user/shared/atoms/current-user';\nimport { CommonPageTWCard } from '@lemon8/web-app-shared/ssr';\nimport { loadable } from 'jotai/utils';\n\nconst useTwCardImage = () => {\n const loadableUser = useAtomValue(loadable($CurrentAvailableUserOrNull));\n\n if (loadableUser.state !== 'hasData' || !loadableUser.data) {\n return '';\n }\n\n return loadableUser.data.avatar || '';\n};\n\nexport const UserTwitter = () => {\n const { title, description } = useUserTDK();\n\n const twitterCardInfo = {\n twCardTitle: title,\n twCardDesc: description,\n twCardImageSrc: useTwCardImage(),\n };\n\n return ;\n};\n","import { CommonPageALMeta } from '@lemon8/web-app-shared/ssr';\nimport { useAtomValue } from 'jotai';\nimport { useMemo } from 'react';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { DeepLinkBuildingProps } from '~/utils/active/schema';\nimport { useCompletedActiveSchema } from '~/utils/active/use-completed-active-schema';\nimport { $CurrentAvailableUserOrNull } from '../shared/atoms/current-user';\nimport { loadable } from 'jotai/utils';\n\nexport const UserFacebookALMeta = () => {\n const getSchemaOption: () => DeepLinkBuildingProps = () => {\n const loadableUser = useAtomValue(loadable($CurrentAvailableUserOrNull));\n\n if (loadableUser.state !== 'hasData' || !loadableUser.data) {\n return { pageType: 'feed', categoryId: 0 };\n }\n return { pageType: 'user', userId: loadableUser.data.userId };\n };\n\n const schemaOption = getSchemaOption();\n\n const alMetaInfo = {\n openUrl: useCompletedActiveSchema(\n {\n ...schemaOption,\n pid: 'seo_al_fb',\n },\n {\n enterPosition: 'seo_al_fb',\n },\n ),\n webUrl: useAtomValue($PageLevelTraffic).canonicalUrl,\n };\n\n return ;\n};\n","import { UserOpenGraph } from './og';\nimport { UserTDK } from '@user/head/tdk';\nimport { FC } from 'react';\nimport { UserTwitter } from '@user/head/twitter';\nimport { AbsPageSharingCard } from '@lemon8/web-app-shared/ssr';\nimport { UserFacebookALMeta } from './facebook';\n\nexport class SharingCardMeta extends AbsPageSharingCard {\n PageLevelTDK: FC = () => {\n return ;\n };\n PageLevelOGCard: FC = () => {\n return ;\n };\n PageLevelTWCard: FC = () => {\n return ;\n };\n PageLevelALMeta: FC = () => {\n return ;\n };\n}\n","import { atom } from 'jotai';\nimport { $PageLevelTraffic, $UserDetailV2 } from 'shared/atoms';\nimport { EPageType, IUserDetail, IUserPageTraffic, UserDetailUtil } from 'shared/models';\nimport { pendingQueue } from 'shared/utils/pending-queue';\n\nexport const CurrentUserId = atom((get) => {\n const traffic = get($PageLevelTraffic);\n const { pageType } = traffic;\n\n if (![EPageType.user, EPageType.user_follow, EPageType.user_topic].includes(pageType)) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw new Promise((resolve) => pendingQueue.push(resolve));\n }\n\n const userTraffic = traffic as IUserPageTraffic;\n\n return userTraffic.userId || null;\n});\n\nexport const $CurrentUserLinkName = atom((get) => {\n const traffic = get($PageLevelTraffic);\n const { pageType } = traffic;\n\n if (![EPageType.user, EPageType.user_follow, EPageType.user_topic].includes(pageType)) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw new Promise((resolve) => pendingQueue.push(resolve));\n }\n\n const userTraffic = traffic as IUserPageTraffic;\n\n return userTraffic.userLinkName;\n});\n\nexport const $CurrentUser = atom((get) => {\n const currentUserLinkName = get($CurrentUserLinkName);\n return get($UserDetailV2(currentUserLinkName));\n});\n\nexport const $CurrentAvailableUserOrNull = atom(async (get) => {\n const user = await get($CurrentUser);\n return UserDetailUtil.isUserAvailable(user) ? user : null;\n});\n\nexport const $CurrentUserAsAvailable = atom(async (get) => {\n const user = await get($CurrentUser);\n return user as IUserDetail;\n});\n","import { Unreachable } from '@lemon8/web-app-shared/util';\n\ninterface CommonSchemaBuildingProps {\n pageType: string;\n\n // 拉活渠道细分 TODO type\n campaign?: string;\n}\n\ninterface DetailSchemaBuildingProps extends CommonSchemaBuildingProps {\n groupId: string;\n authorId?: string;\n}\n\ninterface ArticleSchemaBuildingProps extends DetailSchemaBuildingProps {\n pageType: 'article';\n}\n\nconst isArticleSchemaBuildingProps = (input: CommonSchemaBuildingProps): input is ArticleSchemaBuildingProps =>\n input.pageType === 'article';\n\ninterface VideoSchemaBuildingProps extends DetailSchemaBuildingProps {\n pageType: 'video';\n}\n\nconst isVideoSchemaBuildingProps = (input: CommonSchemaBuildingProps): input is VideoSchemaBuildingProps =>\n input.pageType === 'video';\n\nexport interface UserSchemaBuildingProps extends CommonSchemaBuildingProps {\n pageType: 'user';\n userId: string;\n}\n\nconst isUserSchemaBuildingProps = (input: CommonSchemaBuildingProps): input is UserSchemaBuildingProps =>\n input.pageType === 'user';\n\ninterface CategorySchemaBuildingProps extends CommonSchemaBuildingProps {\n pageType: 'feed';\n categoryId: number;\n}\n\nconst isCategorySchemaBuildingProps = (input: CommonSchemaBuildingProps): input is CategorySchemaBuildingProps =>\n input.pageType === 'feed';\n\nexport interface HashtagSchemaBuildingProps extends CommonSchemaBuildingProps {\n pageType: 'hashtag';\n hashtagId: string;\n}\n\nconst isHashtagSchemaBuildingProps = (input: CommonSchemaBuildingProps): input is HashtagSchemaBuildingProps =>\n input.pageType === 'hashtag';\n\nexport interface POISchemaBuildingProps extends CommonSchemaBuildingProps {\n pageType: 'poi';\n poiId: string;\n}\n\nconst isPOISchemaBuildingProps = (input: CommonSchemaBuildingProps): input is POISchemaBuildingProps =>\n input.pageType === 'poi';\n\nexport interface SearchSchemaBuildingProps extends CommonSchemaBuildingProps {\n pageType: 'search';\n query: string;\n}\n\nconst isSearchSchemaBuildingProps = (input: CommonSchemaBuildingProps): input is SearchSchemaBuildingProps =>\n input.pageType === 'search';\n\nexport type DeepLinkBuildingProps =\n | ArticleSchemaBuildingProps\n | VideoSchemaBuildingProps\n | UserSchemaBuildingProps\n | CategorySchemaBuildingProps\n | HashtagSchemaBuildingProps\n | POISchemaBuildingProps\n | SearchSchemaBuildingProps;\n\nexport const buildSchema = (props: DeepLinkBuildingProps & { pid: string }): string => {\n let protocol = 'snssdk2657:';\n let host = 'unknown';\n let params: URLSearchParams;\n\n if (isArticleSchemaBuildingProps(props)) {\n host = 'article_detail_page';\n params = new URLSearchParams({\n group_id: props.groupId,\n });\n if (props.authorId) {\n params.set('media_id', props.authorId);\n }\n } else if (isVideoSchemaBuildingProps(props)) {\n host = 'video_detail';\n params = new URLSearchParams({\n group_id: props.groupId,\n });\n if (props.authorId) {\n params.set('media_id', props.authorId);\n }\n } else if (isUserSchemaBuildingProps(props)) {\n host = 'user_profile';\n params = new URLSearchParams({\n user_id: props.userId,\n });\n } else if (isCategorySchemaBuildingProps(props)) {\n host = 'main';\n params = new URLSearchParams({\n tab: 'home',\n channel_id: String(props.categoryId),\n });\n } else if (isHashtagSchemaBuildingProps(props)) {\n host = 'hashtag';\n params = new URLSearchParams({\n hashtag_id: props.hashtagId,\n });\n } else if (isPOISchemaBuildingProps(props)) {\n host = 'poi_landing_page';\n params = new URLSearchParams({\n poi_id: props.poiId,\n });\n } else if (isSearchSchemaBuildingProps(props)) {\n host = 'lynxview';\n params = new URLSearchParams({\n channel: 'search_v2',\n bundle: 'result_page/template.js',\n trans_status_bar: '1',\n enter_anim: 'search_alpha',\n exit_anim: 'search_alpha',\n business_type: 'search',\n business_data: JSON.stringify({\n query: props.query,\n tab: 0,\n inputClickType: 'open',\n logExtra: {\n query: props.query,\n search_page_from: 'search_page_general',\n search_from: 'seo_click',\n previous_page_name: 'seo',\n },\n }),\n });\n } else {\n return Unreachable('no match schema handler');\n }\n\n // append common params\n params.append('pid', props.pid);\n if (props.campaign) {\n params.append('campaign', props.campaign);\n }\n\n const schema = `${protocol}//${host}?${params.toString()}`;\n\n if (__BUILD_TYPE__ !== 'online') {\n new URL(schema);\n }\n\n return schema;\n};\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","/*\n * 根据URL的层次或者哈希「递进地」划分URL\n * 示例:\n * https://A.B/C#D\n * -> ['https://A.B', 'https://A.B/C', 'https://A.B/C#D']\n */\nexport function parseUrlBySlash(url: string): string[] {\n const u: URL = new URL(url);\n const subPath: string[] = u.pathname.split('/');\n let prefix = `${u.protocol}//${u.host}`;\n const res = [prefix];\n for (const p of subPath) {\n if (p.length === 0) {\n continue;\n }\n if (!prefix.endsWith('/')) {\n prefix += '/';\n }\n prefix += p;\n res.push(prefix);\n }\n if (u.hash.length) {\n res.push(prefix + u.hash);\n }\n return res;\n}\n\n/*\n * 根据层次或哈希分割url\n * 第一级保留为协议和域名的组合,会处理哈希但不会处理query\n *\n * 示例:\n * https://x/A/B#C?D\n * -> ['https://x', 'A', 'B', 'C', 'D']\n */\nexport function splitUrlBySlashOrHash(url: string): string[] {\n try {\n const u: URL = new URL(url);\n const res: string[] = u.pathname.split('/');\n res[0] = `${u.protocol}//${u.host}`;\n if (u.hash.length) {\n res.push(u.hash.replace('#', ''));\n }\n return res;\n } catch (_) {\n return [];\n }\n}\n","import { DynamicHead } from '@lemon8/web-app-shared/ssr';\nimport { parseUrlBySlash, splitUrlBySlashOrHash } from './util';\n\ninterface BreadcrumbPropsType {\n nameList: string[];\n path: string;\n}\n\nexport const BreadcrumbJSONLD: (props: BreadcrumbPropsType) => JSX.Element | null = (props) => {\n const { path, nameList } = props;\n\n const url = path;\n const urlList = parseUrlBySlash(url);\n const splicedUrl = splitUrlBySlashOrHash(url);\n\n if (!urlList.length) {\n return null;\n }\n\n const crumbList = [];\n for (let index = 0; index < urlList.length && index < nameList.length; index++) {\n crumbList.push({\n '@type': 'ListItem',\n position: index + 1,\n item: {\n '@type': 'Thing',\n '@id': urlList[index],\n name: nameList[index] || splicedUrl[index],\n },\n });\n }\n return (\n \n \n \n );\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","import { useFetcher } from '@remix-run/react';\nimport { Atom, useStore, WritableAtom } from 'jotai';\nimport { useCallback, useEffect } from 'react';\n\ninterface AtomConfig {\n atoms?: Record>;\n atomFamilies?: Record WritableAtom>;\n}\n\ninterface IUseRouteLoaderResult {\n state: 'idle' | 'loading' | 'submitting';\n load: () => void;\n}\n\nconst getAtom = (atom: AtomConfig, key: string): Atom => {\n let res: Atom;\n if (key.includes('+')) {\n // for atom family\n const [atomKey, ...args] = key.split('+');\n const decodeArgs = args.map((a) => decodeURIComponent(a));\n const atomFamily = (atom.atomFamilies || {})[atomKey];\n\n if (!atomFamily) {\n console.error('atomFamily not found for key: %s', key);\n }\n\n res = atomFamily(...decodeArgs);\n } else {\n // for plain atom\n res = (atom.atoms || {})[key];\n }\n\n if (process.env.NODE_ENV === 'development' && !res) {\n throw new Error(`no such atom for key: ${key}`);\n }\n\n return res;\n};\n\nexport const useRouteLoader = (\n method: string,\n params: Record,\n atom: AtomConfig,\n): IUseRouteLoaderResult => {\n const store = useStore();\n const fetcher = useFetcher();\n\n const load = useCallback(() => {\n const searchParams = new URLSearchParams();\n searchParams.set('method', method);\n Object.entries(params).forEach(([key, value]) => {\n const str = String(value);\n if (str) {\n searchParams.set(key, String(value));\n }\n });\n fetcher.load(`${location.pathname}?${searchParams.toString()}`);\n }, [method, params]);\n\n useEffect(() => {\n const { data } = fetcher;\n\n if (!data) {\n return;\n }\n\n Object.entries(data).forEach(([key, value]) => {\n if (!key.startsWith('$')) {\n return;\n }\n const atomToSet: any = getAtom(atom, key);\n store.set(atomToSet, value);\n });\n }, [fetcher.data]);\n\n return {\n state: fetcher.state,\n load,\n };\n};\n"],"sourceRoot":""}