{"version":3,"sources":["webpack://@lemon8/web-sharing/./client/components/article-recommend-card/index.tsx","webpack://@lemon8/web-sharing/./client/components/fallback-page-helmet/index.tsx","webpack://@lemon8/web-sharing/./client/components/landing-modal/atom.ts","webpack://@lemon8/web-sharing/./client/components/landing-modal/index.tsx","webpack://@lemon8/web-sharing/./client/components/load-more/util.ts","webpack://@lemon8/web-sharing/./client/components/load-more/index.tsx","webpack://@lemon8/web-sharing/./client/components/loading/index.tsx","webpack://@lemon8/web-sharing/./client/components/masonry/index.tsx","webpack://@lemon8/web-sharing/./client/components/not-found/index.tsx","webpack://@lemon8/web-sharing/./client/components/simple-toast/atom.ts","webpack://@lemon8/web-sharing/./client/utils/active/use-silent-awaken.ts","webpack://@lemon8/web-sharing/./client/utils/build-sharing-url.ts","webpack://@lemon8/web-sharing/./client/utils/fix-body.ts","webpack://@lemon8/web-sharing/./client/utils/libra/cta-opt.ts","webpack://@lemon8/web-sharing/./client/utils/libra/streaming.ts","webpack://@lemon8/web-sharing/./client/utils/sharing-remix-page.tsx","webpack://@lemon8/web-sharing/./client/utils/view-tracking/view-observer.ts","webpack://@lemon8/web-sharing/./client/utils/view-tracking/index.ts","webpack://@lemon8/web-sharing/./shared/constant/page-module.ts","webpack://@lemon8/web-sharing/./shared/models/hashtag/hashtag-info.ts","webpack://@lemon8/web-sharing/./shared/models/poi/poi-info.ts","webpack://@lemon8/web-sharing/./shared/models/user/user-detail.ts","webpack://@lemon8/web-sharing/./shared/models/user/user-gender.ts","webpack://@lemon8/web-sharing/./shared/models/user/user-privacy.ts","webpack://@lemon8/web-sharing/../libs/lemon8-web-app-shared/dist/esm/hook/index.js","webpack://@lemon8/web-sharing/../libs/lemon8-web-app-shared/dist/esm/hook/num-formatter.js","webpack://@lemon8/web-sharing/../libs/lemon8-web-app-shared/dist/esm/hook/time-ago-formatter.js"],"names":["ArticleRecommendCard","props","formatNum","useNumFormatter","useVideoPlayBtnCTA","useAtomValue","$UseVideoPlayBtnCTA","article","clickPosition","pageModule","rank","cardObservedRef","useViewTracking","onView","sendCTAShowEvent","currentPosition","sendRelatedPostShowEvent","groupId","mediaId","author","userId","articleClass","handleClick","useCTADirectly","clickId","onClick","useCallback","activeToArticle","aspectRatio","useMemo","EArticleClass","_clamp","imageList","width","height","largeImage","coverUrl","url","React","createElement","className","ref","cls","video","style","paddingBottom","concat","loading","src","onContextMenu","e","preventDefault","PlayFill","title","avatar","nickName","Heart","Boolean","diggCount","FallbackPageHelmet","Fragment","$LandingModalState","atom","open","hasClosed","LandingModal","modalState","setLandingModalState","useAtom","t","useTranslation","pageType","$SharingPageLevelTraffic","loadableSharerDetail","loadable","$SharerDetail","hitUSBan","$USPreBanState","avatarUrl","state","UserDetailUtil","data","useEffect","window","Tea","current_position","EClickPosition","FixBodyUtil","handleClickConfirm","click_result","activeToCurrentPage","handleClickCancel","visibleCls","shown","hidden","modalContent","EPageType","Avatar","size","XMark","Button","ButtonSize","variant","UI","scrollY","pageYOffset","document","body","scrollTop","documentElement","offset","el","type","getBoundingClientRect","left","top","pageXOffset","PREFIX","render","loadData","initList","showEnd","loadingText","endText","placeholder","isEnd","alwaysShowLoading","distanceToLoad","isLoading","setIsLoading","useState","dataList","setDataList","listRef","useRef","timerRef","listDom","doLoadMore","then","res","list","finally","scrollLoadMore","current","clearTimeout","setTimeout","innerHeight","addEventListener","passive","capture","renderBottomText","renderPlaceholder","length","LoadingBall","fitParent","loadingDiv","lottie","container","renderer","loop","autoplay","animationData","LOADING_BALL","LoadingGradient","shadow","backgroundImage","LOADING_GRADIENT_SHADOW","LOADING_GRADIENT_NO_SHADOW","Loading","parseToNumber","val","Number","replace","useContainerRef","setCurrentRef","setRef","instance","Masonry","children","columnCount","childrenArray","Children","setContainer","containerHeight","setContainerHeight","Math","floor","heightList","setHeightList","_range","map","orderList","setOrderList","o","doLayout","columnHeights","Array","fill","columnItems","childOrderList","i","child","item","min","_min","minIndex","findIndex","v","push","getComputedStyle","_","index","max","join","requestAnimationFrame","observer","ResizeObserver","observe","disconnect","maxHeight","_max","maxHeightIndex","indexOf","maxHeightCount","filter","key","r","bottom","lastIndexOf","order","marginBottom","ENotFoundType","NotFound","hint","$SimpleToastStatus","atomWithReset","debugLabel","delay","timeout","Promise","resolve","DEFAULT_TIMEOUT","LEMON8_PKG_ID","getIsClient","getRelatedApps","params","_a","navigator","getInstalledRelatedApps","race","useSilentAwaken","awakenOptions","hasFulfilled","schemaOption","pid","openUrl","useDeepLink","_objectSpread","ua","userAgent","test","relatedApps","lemon8AppInfo","find","app","id","includes","installed_app_name","installed_app_version","version","location","href","catch","err","console","warn","$SharingHrefBuilder","get","sharePlatform","enterHref","sharerToken","isSharingTest","$RootTraffic","region","$Locale","path","URL","searchParams","set","pathname","search","error","useSharingHrefBuilder","useSharingUrl","pathAndSearch","buildSharingUrl","eventList","preventDefaultHandler","event","lastScrollY","fix","forEach","restore","removeEventListener","$UseCommentMoreRepliesCTA","parameters","$ABTest","_get","$LibraOptimizeSilentAwaken","SharingRemixPage","AbsRemixPage","constructor","arguments","HeadSkeleton","BodySkeleton","useRouteLoading","canonicalUrl","a","DEFAULT_OPTIONS","errorMargin","defaultMargin","percentCompensation","minTimeVisible","useExistedInstance","config","root","rootMargin","threshold","steps","undefined","from","_x","_ViewObserver","_this","options","_watchElements","entries","clientHeight","entry","isIntersecting","node","target","element","elements","elementHeight","boundingClientRect","_isElementHeightSimilarToContainer","maxIntersectionRatio","isVisible","intersectionRatio","timeoutSet","timeouts","_onVisibilityChange","delete","callback","visible","unobserve","_reportVisibilityStates","_ref","Object","assign","isNaN","Map","IntersectionObserver","_addEventListeners","destroy","clear","_removeEventListeners","ViewObserver","Factory","deps","inputRef","tracked","setTracked","EPageModule","EHashtagUnavailableReason","HashtagInfoUtil","isAvailable","hashtag","EPOIUnavailableReason","POIInfoUtil","poi","EUserUnavailableReason","isUserAvailable","user","getPath","prefix","UserTypeUtil","userType","linkName","EUserGender","EPrivacyStatus","__createBinding","create","m","k","k2","desc","getOwnPropertyDescriptor","__esModule","writable","configurable","enumerable","defineProperty","__exportStar","exports","p","prototype","hasOwnProperty","call","value","require","jotai_1","react_i18next_1","react_1","util_1","atom_1","num","formatNumByRegion","useTimeAgoFormatter","seconds","formatTimeAgo"],"mappings":"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","file":"vendors/228-e29de96524f1cf885fa8-9e9e06f2a4f60feeb188aa81a59add1c58d634b7.js","sourcesContent":["import { FC, SyntheticEvent, useCallback, useMemo } from 'react';\nimport cls from 'classnames';\nimport PlayFill from 'icon/play_fill.svg';\nimport Heart from 'icon/heart.svg';\nimport _clamp from 'lodash/clamp';\nimport { EArticleClass, TArticleDetail } from 'shared/models/article';\nimport { EClickPosition } from 'shared/constant';\nimport { useCTADirectly } from '~/utils/cta';\nimport { activeToArticle } from '~/utils/active/active-to-article';\nimport { useNumFormatter } from '@lemon8/web-app-shared/hook';\nimport { EPageModule } from 'shared/constant/page-module';\nimport { useViewTracking } from '~/utils/view-tracking';\nimport { sendCTAShowEvent, sendRelatedPostShowEvent } from '~/utils/event';\nimport { useAtomValue } from 'jotai';\nimport { $UseVideoPlayBtnCTA } from '~/utils/libra/cta-opt';\n\nimport './style.scss';\n\ninterface ArticleRecommendCardProps {\n pageModule: EPageModule;\n clickPosition: EClickPosition.RelatedPost | EClickPosition.AuthorPost;\n article: TArticleDetail;\n rank: number;\n}\n\nexport const ArticleRecommendCard: FC = (props) => {\n const formatNum = useNumFormatter();\n const useVideoPlayBtnCTA = useAtomValue($UseVideoPlayBtnCTA);\n const { article, clickPosition, pageModule, rank } = props;\n\n const cardObservedRef = useViewTracking({\n onView: () => {\n sendCTAShowEvent({\n pageModule,\n currentPosition: clickPosition,\n });\n sendRelatedPostShowEvent({\n pageModule,\n clickPosition,\n groupId: article.groupId,\n mediaId: article.author.userId,\n articleClass: article.articleClass,\n rank,\n });\n },\n });\n\n const handleClick = useCTADirectly({\n clickPosition,\n clickId: article.groupId,\n onClick: useCallback(() => {\n activeToArticle(article, clickPosition, article.groupId);\n }, [article, clickPosition]),\n });\n\n const aspectRatio = useMemo(() => {\n switch (article.articleClass) {\n case EArticleClass.GALLERY:\n return _clamp(article.imageList[0].width / article.imageList[0].height, 3 / 4, 4 / 3);\n case EArticleClass.ARTICLE:\n case EArticleClass.VIDEO:\n default:\n return _clamp(article.largeImage.width / article.largeImage.height, 3 / 4, 4 / 3);\n }\n }, [article]);\n\n const coverUrl = useMemo(() => {\n switch (article.articleClass) {\n case EArticleClass.GALLERY:\n return article.imageList[0].url;\n case EArticleClass.ARTICLE:\n case EArticleClass.VIDEO:\n default:\n return article.largeImage.url;\n }\n }, [article]);\n\n return (\n
\n \n e.preventDefault()} />\n {useVideoPlayBtnCTA ? (\n \n ) : (\n article.articleClass === EArticleClass.VIDEO && \n )}\n
\n
\n
{article.title}
\n
\n e.preventDefault()}\n />\n {article.author.nickName}\n
\n \n {Boolean(article.diggCount) && {formatNum(article.diggCount)}}\n
\n
\n
\n \n );\n};\n","import { FC } from 'react';\n\nexport const FallbackPageHelmet: FC = () => {\n return <>;\n};\n","import { atom } from 'jotai';\n\ninterface ILibraLandingModalState {\n open: boolean;\n hasClosed: boolean;\n}\n\nexport const $LandingModalState = atom({\n open: false,\n hasClosed: false,\n});\n","import { FC, useCallback, useEffect, useMemo } from 'react';\nimport cls from 'classnames';\nimport { Avatar, Button, ButtonSize } from '@lemon8/design';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { loadable } from 'jotai/utils';\nimport { $LandingModalState } from './atom';\nimport { useTranslation } from 'react-i18next';\nimport XMark from 'icon/x_mark.svg';\nimport { EClickPosition, EPageType } from 'shared/constant';\nimport { activeToCurrentPage } from '~/utils/active/active-to-current-page';\nimport { FixBodyUtil } from '~/utils/fix-body';\nimport { $SharerDetail, $SharingPageLevelTraffic } from 'shared/atoms';\nimport { UserDetailUtil } from 'shared/models';\nimport { $USPreBanState } from '@lemon8/web-app-shared/atom';\n\nimport './style.scss';\n\nexport const LandingModal: FC = () => {\n const [modalState, setLandingModalState] = useAtom($LandingModalState);\n const { open } = modalState;\n const { t } = useTranslation();\n const { pageType } = useAtomValue($SharingPageLevelTraffic);\n\n const loadableSharerDetail = useAtomValue(loadable($SharerDetail));\n const hitUSBan = useAtomValue($USPreBanState);\n\n const avatarUrl = useMemo(() => {\n if (loadableSharerDetail.state === 'hasData' && UserDetailUtil.isUserAvailable(loadableSharerDetail.data)) {\n return loadableSharerDetail.data.avatar;\n }\n return '';\n }, [loadableSharerDetail]);\n\n useEffect(() => {\n if (open && !hitUSBan) {\n window.Tea('wap_pop_window_show', {\n current_position: EClickPosition.LandingModal,\n });\n FixBodyUtil.fix();\n } else {\n FixBodyUtil.restore();\n }\n }, [open, hitUSBan]);\n\n const handleClickConfirm = useCallback(() => {\n window.Tea('wap_pop_window_click', {\n current_position: EClickPosition.LandingModal,\n click_result: 'install',\n });\n activeToCurrentPage(EClickPosition.LandingModal);\n }, []);\n\n const handleClickCancel = useCallback(() => {\n window.Tea('wap_pop_window_click', {\n current_position: EClickPosition.LandingModal,\n click_result: 'cancel',\n });\n setLandingModalState({ open: false, hasClosed: true });\n }, []);\n\n const visibleCls = useMemo(\n () => ({\n shown: open,\n hidden: !open,\n }),\n [open],\n );\n\n const modalContent = useMemo(() => {\n if (!open) {\n return null;\n }\n\n return (\n
\n
\n {pageType === EPageType.USER ? (\n \n ) : (\n
\n )}\n
\n
\n
{t('landing_postDetail_modal_header')}
\n
{t('landing_postDetail_modal_body')}
\n
\n
\n \n
\n \n
\n );\n }, [open]);\n\n if (hitUSBan) {\n return null;\n }\n\n return (\n
\n
\n
\n
{modalContent}
\n
\n
\n );\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 { CSSProperties, useEffect, useRef } from 'react';\nimport LOADING_GRADIENT_SHADOW from './assets/gradient_shadow.png';\nimport LOADING_GRADIENT_NO_SHADOW from './assets/gradient_no_shadow.png';\nimport LOADING_BALL from './assets/loading_ball.json';\nimport cls from 'classnames';\nimport lottie from 'lottie-web/build/player/lottie_light_canvas';\n\nimport './style.scss';\n\nexport interface LoadingProps {\n variant: 'ball' | 'gradient';\n\n /**\n * @default false\n */\n shadow?: boolean;\n\n /**\n * @default false\n */\n fitParent?: boolean;\n\n style?: CSSProperties;\n}\n\nexport const LoadingBall = (props: { fitParent: boolean; style: CSSProperties }): JSX.Element => {\n const { fitParent, style = {} } = props;\n const loadingDiv = useRef(null);\n\n useEffect(() => {\n if (loadingDiv.current) {\n lottie.loadAnimation({\n container: loadingDiv.current,\n renderer: 'canvas',\n loop: true,\n autoplay: true,\n animationData: LOADING_BALL,\n });\n }\n }, []);\n\n return (\n \n
\n
\n );\n};\n\nexport const LoadingGradient = (props: { shadow: boolean; fitParent: boolean; style: CSSProperties }): JSX.Element => {\n const { shadow, fitParent, style = {} } = props;\n return (\n \n \n
\n );\n};\n\nexport const Loading = (props: LoadingProps): JSX.Element => {\n const { variant, shadow = false, fitParent = false, style = {} } = props;\n\n return (\n <>\n {variant === 'ball' && }\n {variant === 'gradient' && }\n \n );\n};\n","import React, { Children, FC, PropsWithChildren, useCallback, useEffect, useState } from 'react';\nimport _range from 'lodash/range';\nimport _min from 'lodash/min';\nimport _max from 'lodash/max';\nimport cls from 'classnames';\n\nimport './style.scss';\n\nexport const parseToNumber = (val: string) => {\n return Number(val.replace('px', ''));\n};\n\ninterface MasonryProps extends PropsWithChildren {\n className?: string;\n columnCount: number;\n}\n\nfunction useContainerRef() {\n const [ref, setCurrentRef] = useState();\n\n const setRef = useCallback((instance: T) => {\n if (instance) {\n setCurrentRef(instance);\n }\n }, []);\n\n return [ref, setRef] as [T, React.RefCallback];\n}\n\nexport const Masonry: FC = (props) => {\n const { children, columnCount, className } = props;\n const childrenArray = Children.toArray(children);\n const [container, setContainer] = useContainerRef();\n const [containerHeight, setContainerHeight] = useState(\n `calc(${Math.floor(childrenArray.length / columnCount + 1)} * var(--masonry-item-default-height))`,\n );\n\n const [heightList, setHeightList] = useState(_range(childrenArray.length).map(() => 0));\n\n const [orderList, setOrderList] = useState(_range(childrenArray.length).map((o) => (o % columnCount) + 1));\n\n const doLayout = useCallback(() => {\n if (!container) {\n return;\n }\n\n const columnHeights: number[] = new Array(columnCount).fill(0);\n const columnItems: number[] = new Array(columnCount).fill(0);\n const childOrderList = [];\n for (let i = 0; i < container.children.length; i++) {\n const child = container.children.item(i);\n if (!child) {\n return;\n }\n const min = _min(columnHeights);\n const minIndex = columnHeights.findIndex((v) => v === min);\n childOrderList.push(minIndex + 1);\n const style = window.getComputedStyle(child);\n columnHeights[minIndex] += parseToNumber(style.height);\n columnItems[minIndex] += 1;\n }\n\n setHeightList(columnHeights);\n setOrderList(childOrderList);\n\n setContainerHeight(\n `max(${columnHeights\n .map(\n (_, index) =>\n `${columnHeights[index]}px + ${Math.max(\n columnItems[index] - 1,\n 0,\n )} * var(--masonry-items-horizontal-interval) + 2 * var(--masonry-padding-vertical)`,\n )\n .join(',')})`,\n );\n }, [container, columnCount]);\n\n useEffect(() => {\n if (!container) {\n return;\n }\n\n requestAnimationFrame(() => {\n doLayout();\n });\n\n const observer = new ResizeObserver(doLayout);\n observer.observe(container);\n\n for (let i = 0; i < container.children.length; i++) {\n const child = container.children.item(i);\n if (child) {\n observer.observe(child);\n }\n }\n\n return () => {\n observer.disconnect();\n };\n }, [container, doLayout, children]);\n\n const maxHeight = _max(heightList) || 0;\n const maxHeightIndex = heightList.indexOf(maxHeight) - 1;\n const maxHeightCount = orderList.filter((item) => item === maxHeightIndex + 1).length;\n\n return (\n \n {childrenArray.map((child, index) => (\n r === orderList[index]) === index,\n bottom: orderList.lastIndexOf(orderList[index]) === index,\n })}\n style={{\n order: orderList[index] || columnCount + 1,\n marginBottom:\n orderList.lastIndexOf(orderList[index]) === index\n ? `calc(${\n (maxHeight || 0) - heightList[orderList[index] - 1]\n }px + var(--masonry-padding-horizontal) * (${\n orderList.filter((item) => item === index + 1).length - maxHeightCount\n }))`\n : 0,\n }}\n >\n {child}\n
\n ))}\n \n );\n};\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 { atomWithReset } from 'jotai/utils';\n\ntype TSimpleToastStatus =\n | false\n | {\n content: string;\n };\n\nexport const $SimpleToastStatus = atomWithReset(false);\n$SimpleToastStatus.debugLabel = '$SimpleToastStatus';\n","import { useEffect } from 'react';\nimport { ActiveProps } from './active';\nimport { useDeepLink } from '~/utils/active/deeplink';\n\ntype Awaited> = T extends Promise ? U : never;\nexport type RelatedApps = Awaited>> | undefined;\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nconst delay = (timeout: number) => new Promise((resolve) => setTimeout(resolve, timeout));\n\nconst DEFAULT_TIMEOUT = 10000;\nconst LEMON8_PKG_ID = 'com.bd.nproject';\n\ntype RelatedParams = {\n awakenOptions: Omit;\n hasFulfilled?: boolean;\n};\n\ninterface relatedAppData {\n id?: string;\n platform: string;\n version?: string;\n url?: string;\n}\n\nconst getIsClient = (): boolean => {\n return typeof window !== 'undefined';\n};\n\nexport const getRelatedApps = async (params?: RelatedParams): Promise => {\n if (!getIsClient()) {\n return Promise.resolve(undefined);\n }\n\n if (window?.navigator?.getInstalledRelatedApps) {\n return Promise.race([window.navigator.getInstalledRelatedApps(), delay(DEFAULT_TIMEOUT)]);\n }\n return Promise.resolve(undefined);\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const useSilentAwaken = (props: RelatedParams) => {\n const { awakenOptions, hasFulfilled = false } = props;\n const { schemaOption } = awakenOptions;\n const pid = 'sharing_install';\n const openUrl = useDeepLink({\n ...schemaOption,\n pid,\n });\n\n useEffect(() => {\n const ua = window.navigator.userAgent;\n const isAndroid = /android/i.test(ua);\n\n if (isAndroid) {\n // wait for the ending of stream rendering\n if (hasFulfilled) {\n getRelatedApps(props)\n .then((relatedApps) => {\n if (relatedApps && relatedApps.length > 0) {\n const lemon8AppInfo: relatedAppData = relatedApps.find((app) => app.id.includes(LEMON8_PKG_ID));\n if (lemon8AppInfo) {\n window.Tea('wap_with_app', {\n installed_app_name: lemon8AppInfo.id,\n installed_app_version: lemon8AppInfo.version,\n });\n location.href = openUrl;\n }\n } else {\n location.href = openUrl;\n }\n })\n .catch((err) => {\n console.warn('getRelatedApps failed', err);\n location.href = openUrl;\n });\n }\n }\n }, [hasFulfilled]);\n};\n","import { $Locale } from '@lemon8/web-app-shared/atom';\nimport { atom, useAtomValue } from 'jotai';\nimport { $RootTraffic } from 'shared/atoms';\nimport { useMemo } from 'react';\n\nconst $SharingHrefBuilder = atom((get) => {\n const { sharePlatform, enterHref, sharerToken, isSharingTest } = get($RootTraffic);\n const { region } = get($Locale);\n\n return (path: string): string => {\n try {\n const url = new URL(path, enterHref);\n\n if (isSharingTest) {\n url.searchParams.set('sharing_test', '1');\n }\n\n url.searchParams.set('_r', '1');\n url.searchParams.set('_t', sharerToken);\n url.searchParams.set('region', region);\n url.searchParams.set('share_platform', sharePlatform);\n\n return `${url.pathname}${url.search}`;\n } catch (e) {\n console.error(e);\n // TODO emit error\n return '';\n }\n };\n});\n\nexport const useSharingHrefBuilder = () => useAtomValue($SharingHrefBuilder);\n\nexport const useSharingUrl = (pathAndSearch: string) => {\n const buildSharingUrl = useSharingHrefBuilder();\n\n return useMemo(() => {\n return buildSharingUrl(pathAndSearch);\n }, [buildSharingUrl, pathAndSearch]);\n};\n","const eventList = ['touchmove', 'wheel'] as const;\n\nconst preventDefaultHandler = (event: Event): void => {\n event.preventDefault();\n};\n\nexport const FixBodyUtil = {\n lastScrollY: 0,\n fix: () => {\n eventList.forEach((event) => {\n document.body.addEventListener(event, preventDefaultHandler, { passive: false });\n });\n },\n restore: () => {\n eventList.forEach((event) => {\n document.body.removeEventListener(event, preventDefaultHandler);\n });\n },\n};\n","import { $ABTest } from '@lemon8/web-app-shared/atom';\nimport { atom } from 'jotai';\nimport _get from 'lodash/get';\n\nexport const $UseCommentMoreRepliesCTA = atom((get) => {\n const { parameters } = get($ABTest);\n\n if ((__BUILD_TYPE__ as any) === 'local_dev') {\n return true;\n }\n\n return Boolean(_get(parameters, ['web', 'comment_more_replies_cta'], false));\n});\n\nexport const $UseVideoPlayBtnCTA = atom((get) => {\n const { parameters } = get($ABTest);\n\n if ((__BUILD_TYPE__ as any) === 'local_dev') {\n return true;\n }\n\n return Boolean(_get(parameters, ['web', 'related_post_video_btn_cta'], false));\n});\n","import { $ABTest } from '@lemon8/web-app-shared/atom';\nimport { atom } from 'jotai';\nimport _get from 'lodash/get';\n\nexport const $LibraOptimizeSilentAwaken = atom((get) => {\n const { parameters } = get($ABTest);\n\n if (__BUILD_TYPE__ === 'local_dev') {\n return true;\n }\n\n return _get(parameters, ['web', 'sharing', 'optimize_silent_awaken'], true);\n});\n","import { AbsRemixPage } from '@lemon8/web-app-shared/ssr';\nimport { useAtomValue } from 'jotai';\nimport { $SharingPageLevelTraffic } from 'shared/atoms';\nimport { useLocation } from '@remix-run/react';\nimport { Loading } from '~/components/loading';\n\nexport abstract class SharingRemixPage extends AbsRemixPage {\n HeadSkeleton = () => {\n return (\n <>\n Lemon8 Loading...\n \n );\n };\n BodySkeleton = () => {\n return (\n <>\n \n \n );\n };\n\n useRouteLoading = () => {\n const { canonicalUrl } = useAtomValue($SharingPageLevelTraffic);\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","export interface ObserverOptionsType {\n errorMargin: number;\n defaultMargin: number;\n percentCompensation: number;\n minTimeVisible: number;\n useExistedInstance?: boolean;\n config: {\n root: Element | null;\n rootMargin: string;\n threshold: number[];\n };\n}\n\ninterface IViewObserver {\n destroy: () => void;\n\n observe: (element: Element, callback: (visible: boolean) => void) => void;\n unobserve: (element: Element) => void;\n}\n\n/**\n * Build an array of threshold values ranging from 0 to 1\n * @param {Number} steps - number of steps between 0 and 1.0\n * @returns {Number[]} returns array of floats\n */\nexport const buildThreshold = (steps = 1) => {\n const threshold = Array.from({ length: steps }, (_x, i) => i / steps);\n\n // Returns an array like [0, ...n, 1]\n return [...threshold, 1];\n};\n\nconst DEFAULT_ERROR_MARGIN = 0.25;\nconst DEFAULT_MARGIN = 0.2;\n\nexport const DEFAULT_OPTIONS: ObserverOptionsType = {\n // If an element height is similar to the container height,\n // it's very difficult to catch an impression in 250ms.\n // By default, the intersectionRatio of an element should be\n // 1 to be considered seen and so for tall elements we reduce the\n // max intersectionRatio by this value\n errorMargin: 0, // 25%\n\n // default to 0.2. The max intersectionRatio for a regular element\n // should be 0.8 as being _too_ strict can result in missed events.\n defaultMargin: 0, // 20%\n\n // The container height range at which to compensate with\n // an error margin\n percentCompensation: 0, // 20%\n\n // Element must be visible for >= 250ms\n minTimeVisible: 0,\n\n // Use the instance of the observer already exists, stay singleton\n useExistedInstance: true,\n\n // The ViewObserver config\n config: {\n root: null,\n rootMargin: '0px',\n threshold: buildThreshold(1 / Math.min(DEFAULT_ERROR_MARGIN, DEFAULT_MARGIN) + 5),\n },\n};\n\nlet instance: ViewObserver | null = null;\n\nexport default class ViewObserver implements IViewObserver {\n options: ObserverOptionsType;\n elements: Map<\n Element,\n {\n callback: (visible: boolean) => void;\n visible: boolean;\n entry: Element;\n timeoutSet?: boolean;\n }\n >;\n timeouts: Map>;\n observer: IntersectionObserver;\n\n static Factory = {\n get(options: ObserverOptionsType): ViewObserver {\n return new ViewObserver(options);\n },\n };\n\n constructor(options = {}) {\n this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n\n if (isNaN(this.options.minTimeVisible) || this.options.minTimeVisible < 0) {\n this.options.minTimeVisible = DEFAULT_OPTIONS.minTimeVisible;\n }\n\n this.elements = new Map();\n this.timeouts = new Map();\n\n this.observer = new IntersectionObserver(this._watchElements, this.options.config);\n\n this._addEventListeners();\n }\n\n /**\n * Return the single instance of the IntersectionObserver if one exists already,\n * otherwise create an instance\n * @param {Object} options - ViewObserver instantiation options\n * @return {ViewObserver} return instance of the class\n */\n static get(options: ObserverOptionsType): ViewObserver {\n // If an instance of the observer already exists, return the singleton\n // otherwise instantiate a new one\n if (instance && instance instanceof ViewObserver && options.useExistedInstance) {\n return instance;\n }\n\n instance = new ViewObserver(options);\n return instance;\n }\n\n /**\n * Detroy all Maps and event listeners.\n * @returns {void} returns instance\n */\n public destroy(): void {\n // Clear all elements\n this.elements.clear();\n\n // Clear all lingering timeouts\n this.timeouts.clear();\n\n // Disconnect the observer, if available\n if (this.observer && typeof this.observer.disconnect === 'function') {\n this.observer.disconnect();\n }\n\n // Remove all event listeners\n this._removeEventListeners();\n\n instance = null;\n }\n\n /**\n * callback for Intersection Observer\n *\n * Loop through all the observed elements and check if visible\n *\n * @param {Array} [entries] array of [IntersectionObserverEntry],\n */\n private _watchElements = (entries: IntersectionObserverEntry[] = []): void => {\n // If rootBounds does not exist, it will default to the height and width\n // of the viewport\n const containerHeight = window.innerHeight || document.documentElement.clientHeight;\n\n entries\n .filter((entry) => entry.isIntersecting)\n .forEach((entry) => {\n const node = entry.target;\n const element = this.elements.get(node);\n\n // We wrap the child in a container, so we need to ensure we're looking at\n // the bounds of the child and not the wrapper\n const bounds = entry.boundingClientRect || node.getBoundingClientRect();\n\n const elementHeight = bounds.height;\n\n // If the element height is within x% (this.options.percentCompensation)\n // of the container height, use the errorMargin option (this.options.errorMargin).\n // Otherwise default to 0.25. The max intersectionRatio for a regular element\n // should be 0.75 as being _too_ strict can result in missed events.\n const errorMargin = this._isElementHeightSimilarToContainer(elementHeight, containerHeight)\n ? this.options.errorMargin\n : this.options.defaultMargin;\n\n const maxIntersectionRatio =\n containerHeight / elementHeight > 1 ? 1 - errorMargin : containerHeight / elementHeight - errorMargin;\n\n const isVisible = entry.intersectionRatio >= maxIntersectionRatio;\n // Element is still visible since last check\n if (isVisible && element && element.timeoutSet) {\n return;\n }\n\n // If the element is visible\n if (isVisible && element) {\n // Set the visibility state to true but wait until the timeout finishes\n // to fire the event\n element.timeoutSet = true;\n\n // Start timer\n this.timeouts.set(\n node,\n setTimeout(() => {\n // Fire the event\n this._onVisibilityChange(node, true);\n }, this.options.minTimeVisible),\n );\n } else {\n const timeout = this.timeouts.get(node);\n // Fire event\n this._onVisibilityChange(node, false);\n // Element is no longer visible, delete timeout\n clearTimeout(timeout);\n this.timeouts.delete(node);\n if (element) {\n element.timeoutSet = false;\n }\n }\n });\n };\n\n /**\n * Observe an IntersectionObserver entry\n * @param {Element} element the element to watch\n * @param {Function} callback the element callback event\n */\n observe = (element: Element, callback: (visible: boolean) => void): void => {\n this.elements.set(element, {\n callback,\n visible: false,\n entry: element,\n });\n\n this.observer.observe(element);\n };\n\n /**\n * Unobserve an IntersectionObserver entry\n * @param {Element} element the element to unobserve\n */\n unobserve = (element: Element): void => {\n if (!this.elements.get(element)) {\n return;\n }\n\n this.observer.unobserve(element);\n\n this.elements.delete(element);\n };\n\n /**\n * callback for orientationchange or other event which may cause element visible change\n *\n * Fire onChange event listeners for all visible elements\n */\n private _reportVisibilityStates = (): void => {\n this.elements.forEach(({ visible }, element) => {\n if (visible) {\n this._onVisibilityChange(element, visible);\n }\n });\n };\n\n /**\n * Handle DOM element visibility state change\n * @param {Element} element - the DOM node\n * @param {Boolean} visible - the visibility state of the entry\n */\n private _onVisibilityChange(element: Element, visible: boolean): void {\n const entry = this.elements.get(element);\n\n if (!entry) {\n return;\n }\n\n // Set the new visibility state\n entry.visible = visible;\n\n const { callback } = entry;\n callback(visible);\n }\n\n private _isElementHeightSimilarToContainer(elementHeight: number, containerHeight: number): boolean {\n return (\n elementHeight >= containerHeight - containerHeight * this.options.percentCompensation &&\n elementHeight <= containerHeight + containerHeight * this.options.percentCompensation\n );\n }\n\n private _addEventListeners(): void {\n window.addEventListener('focus', this._reportVisibilityStates);\n window.addEventListener('orientationchange', this._reportVisibilityStates);\n }\n\n private _removeEventListeners(): void {\n window.removeEventListener('focus', this._reportVisibilityStates);\n window.removeEventListener('orientationchange', this._reportVisibilityStates);\n }\n}\n","import { RefObject, useRef, useEffect, useState } from 'react';\nimport ViewObserver, { DEFAULT_OPTIONS } from './view-observer';\n\ninterface UseViewTrackingProps {\n ref?: RefObject;\n onView: () => void;\n}\n\nexport const useViewTracking = (\n props: UseViewTrackingProps,\n deps: unknown[] = [],\n): RefObject => {\n const { onView, ref: inputRef } = props;\n const ref = inputRef || useRef(null);\n const [tracked, setTracked] = useState(false);\n\n useEffect(() => {\n const element = ref.current;\n if (!element || tracked) {\n return;\n }\n\n const observer = ViewObserver.get(DEFAULT_OPTIONS);\n observer.observe(element, (visible: boolean) => {\n if (visible) {\n onView();\n setTracked(true);\n observer.unobserve(element);\n }\n });\n\n return () => {\n observer.unobserve(element);\n };\n }, [ref, tracked, onView, ...deps]);\n\n return ref;\n};\n","export enum EPageModule {\n TopBar = 'top_bar',\n BottomButton = 'bottom_button',\n Comment = 'comment',\n ArticleMain = 'article_main',\n EndRecommend = 'end_recommend',\n RelatedArticle = 'related_article',\n AuthorInfo = 'author_info',\n AuthorPost = 'author_post',\n}\n","import { IImage } from 'shared/models/media';\n\nexport interface IHashtagInfo {\n id: string;\n name: string;\n description: string;\n\n followerCount: number;\n viewsCount: number;\n talkCount: number;\n\n background?: IImage;\n streamTabList: { tabName: string; category: number }[];\n}\n\nexport enum EHashtagUnavailableReason {\n NOT_FOUND = 'not_found',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IHashtagUnavailableInfo {\n hashtagId: string;\n unavailableReason: EHashtagUnavailableReason;\n}\n\nexport type THashtagInfo = IHashtagInfo | IHashtagUnavailableInfo;\n\nexport const HashtagInfoUtil = {\n isAvailable: (hashtag: THashtagInfo): hashtag is IHashtagInfo => {\n return !('unavailableReason' in hashtag);\n },\n};\n","import { IImage } from 'shared/models/media';\n\nexport interface IPOIInfo {\n id: string;\n name: string;\n type?: string;\n typeName?: string;\n\n placeId?: string;\n\n formattedAddress?: string;\n formattedAddressWithoutPostCountryAsc?: string;\n internationalPhoneNumber?: string;\n\n headerImage?: IImage;\n}\n\nexport enum EPOIUnavailableReason {\n NOT_FOUND = 'not_found',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IPOIUnavailableInfo {\n poiId: string;\n unavailableReason: EPOIUnavailableReason;\n}\n\nexport type TPOIInfo = IPOIInfo | IPOIUnavailableInfo;\n\nexport const POIInfoUtil = {\n isAvailable: (poi: TPOIInfo): poi is IPOIInfo => {\n return !('unavailableReason' in poi);\n },\n};\n","import { EPrivacyStatus, EUserGender, IUserAuthInfo } from '.';\nimport { EUserType, UserTypeUtil } from 'shared/models/common';\n\nexport interface IUserDetail {\n userId: string;\n avatar: string;\n authInfo: IUserAuthInfo;\n nickName: string;\n linkName: string;\n userType: EUserType;\n\n gender: EUserGender;\n ageGroup?: number;\n location?: string;\n\n description: string;\n\n postCount: number;\n diggCount: number;\n dugCount: number;\n favoriteCount: number;\n favoredCount: number;\n followingCount: number;\n followerCount: number;\n\n thirdLinks: {\n platform: string;\n name: string;\n url: string;\n }[];\n\n privacyStatus: EPrivacyStatus;\n\n isBannedAccount: boolean;\n}\n\nexport enum EUserUnavailableReason {\n NOT_FOUND = 'not_found',\n SERVER_ERROR = 'server_error',\n}\n\nexport interface IUserUnavailableDetail {\n userId: string;\n unavailableReason: EUserUnavailableReason;\n}\n\nexport type TUserDetail = IUserDetail | IUserUnavailableDetail;\n\nexport const UserDetailUtil = {\n isUserAvailable: (user: TUserDetail): user is IUserDetail => {\n return !('unavailableReason' in user);\n },\n getPath: (user: IUserDetail): string => {\n const prefix = UserTypeUtil.getLinkNamePrefix(user.userType);\n\n return `/${prefix}${user.linkName}`;\n },\n};\n","export enum EUserGender {\n Unknown = 0,\n MALE = 1,\n FEMALE = 2,\n OTHER = 3,\n}\n","export enum EPrivacyStatus {\n Normal = -1,\n UserPageNoPermission = 0,\n UserPageHasPermission = 1,\n PrivateUser = 2,\n UnderAge = 3,\n}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./num-formatter\"), exports);\n__exportStar(require(\"./time-ago-formatter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useNumFormatter = void 0;\nconst jotai_1 = require(\"jotai\");\nconst react_i18next_1 = require(\"react-i18next\");\nconst react_1 = require(\"react\");\nconst util_1 = require(\"../util\");\nconst atom_1 = require(\"../atom\");\nconst useNumFormatter = () => {\n const { region } = (0, jotai_1.useAtomValue)(atom_1.$Locale);\n const { t } = (0, react_i18next_1.useTranslation)();\n return (0, react_1.useCallback)((num) => (0, util_1.formatNumByRegion)(num, region, t), []);\n};\nexports.useNumFormatter = useNumFormatter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useTimeAgoFormatter = void 0;\nconst react_i18next_1 = require(\"react-i18next\");\nconst react_1 = require(\"react\");\nconst util_1 = require(\"../util\");\nconst useTimeAgoFormatter = () => {\n const { t } = (0, react_i18next_1.useTranslation)();\n return (0, react_1.useCallback)((seconds) => (0, util_1.formatTimeAgo)(seconds, t), [t]);\n};\nexports.useTimeAgoFormatter = useTimeAgoFormatter;\n"],"sourceRoot":""}