{"version":3,"sources":["webpack://@lemon8/web-sharing/./client/components/article-card/index.tsx","webpack://@lemon8/web-sharing/./client/components/swiper-tab/util.ts","webpack://@lemon8/web-sharing/./client/components/swiper-tab/index.tsx","webpack://@lemon8/web-sharing/./client/utils/px-to-rem.ts","webpack://@lemon8/web-sharing/./client/components/user-auth-icon/index.tsx","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/core-js@3.23.5/node_modules/core-js/internals/string-trim-forced.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/core-js@3.23.5/node_modules/core-js/internals/string-trim.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/core-js@3.23.5/node_modules/core-js/internals/whitespaces.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/core-js@3.23.5/node_modules/core-js/modules/es.string.trim.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/debounce.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/now.js","webpack://@lemon8/web-sharing/../common/temp/split__lemon8_web_sharing/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/throttle.js","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/shared/current-hashtag.ts","webpack://@lemon8/web-sharing/./shared/models/hashtag/hashtag-info.ts","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/shared/current-hashtag-info.ts","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/shared/current-hashtag-post.ts","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/body/hashtag-info/index.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/body/hashtag-post/hashtag-post-fragment.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/body/hashtag-post/index.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/body/index.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/head/facebook.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/shared/use-hashtag-tdk.ts","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/head/og.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/head/twitter.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/head/tdk.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/head/index.tsx","webpack://@lemon8/web-sharing/./client/routes/topic.$hashtag_id/__remix_browser_route__route.tsx"],"names":["ArticleCard","props","navigate","useNavigate","t","useTranslation","formatNum","useNumFormatter","article","title","content","useMemo","res","shortContent","replace","trim","cover","ArticleDetailUtil","articleUrl","useSharingUrl","concat","author","linkName","groupId","handleClickCard","useCTADirectly","clickPosition","EClickPosition","clickId","onClick","useCallback","authorUrl","handleClickAuthor","jsxs","className","children","cls","articleClass","EArticleClass","jsx","loading","src","url","PlayFill","nickName","UserAuthIcon","authInfo","width","height","marginLeft","Heart","diggCount","setTransform","style","v","transform","webkitTransform","mozTransform","getPxStyle","value","unit","arguments","length","undefined","rect","innerHeight","innerWidth","UI","scrollY","window","pageYOffset","document","body","scrollTop","documentElement","offset","el","type","left","top","getBoundingClientRect","pageXOffset","noEl","getFrame","x","y","dpr","devicePixelRatio","isAxisYInViewport","_scrollY","_innerHeight","SwiperTabs","React","constructor","_this","this","state","page","initialPage","tabIndexWidth","isMoving","minHeight","setActiveTab","_tabbar","_tabtitle","_tabindex","_tabindexBar","_tablist","_tablistItem","_isSwipeScroll","_swipeOffset","_swipeStartTimeStamp","_swipeable","setTransformX","rateX","forEach","item","next","tabs","curWidth","nextWidth","onChange","index","tabable","setState","key","canSwipe","e","swipeable","onTouchStart","Date","now","classList","remove","changedTouches","pageX","pageY","onTouchMove","delta","Math","abs","cancelable","defaultPrevented","preventDefault","onTouchEnd","add","distanceToChangeTab","durationToChangeTab","tabNum","duration","setTimeout","componentDidMount","_listenToCustomEvent","enableActiveTab","componentWillUnmount","removeEventListener","addEventListener","passive","render","customMinHeight","activeable","initPage","calculateMinHeight","ref","elem","map","tab","active","toFixed","WebkitTransform","OTransform","id","child","defaultProps","pxToRem","px","DEFAULT_WIDTH","DEFAULT_HEIGHT","DEFAULT_MARGIN_LEFT","light","showAuthSymbol","PROPER_FUNCTION_NAME","fails","whitespaces","non","module","METHOD_NAME","uncurryThis","requireObjectCoercible","toString","whitespace","ltrim","rtrim","createMethod","TYPE","$this","string","$","$trim","forcedStringTrimMethod","isObject","toNumber","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","root","throttle","$CurrentHashtagId","atom","get","traffic","$SharingPageLevelTraffic","pageType","EPageType","Unreachable","hashtagId","EHashtagUnavailableReason","HashtagInfoUtil","isAvailable","hashtag","$CurrentHashtagInfo","currentHashtagId","$HashtagInfo","$CurrentHashtagInfoOrNull","hashtagInfo","$CurrentHashtagInfoAsAvailable","$CurrentHashtagPopularPosts","$HashtagPopularPost","$CurrentHashtagRecentPosts","$HashtagRecentPost","HashtagInfo","useAtomValue","items","hashtagPopularPosts","fixedTitleRef","useRef","titleRef","_a","backgroundUrl","background","useEffect","current","fixedTitle","callback","_throttle","fixedTitleRect","titleRect","opacity","_clamp","bottom","Fragment","name","num","viewsCount","Boolean","description","HashtagPostFragment","_ref","sessionImprId","hasMore","loader","useRouteLoader","Loaders","session_impr_id","atomFamilies","$HashtagPopularPostLoadmore","$HashtagRecentPostLoadmore","loadData","load","Promise","resolve","data","initializedRef","LoadMore","isEnd","endText","Loading","variant","HashtagPost","tabIndex","setTabIndex","useState","handleChange","_","streamTabList","category","tabName","HashtagBody","HashtagFacebook","canonicalUrl","openUrl","useFBActiveUrl","pid","SHARING_FB_PID","property","useHashtagLinkPreviewTitle","useHashtagDescription","useHashtagCoverImage","HashtagOG","HashtagTwitter","HashtagTDK","HashtagHead","FallbackPageHelmet","links","POIPage"],"mappings":"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","file":"routes/topic.$hashtag_id-7386076ef8c549406973.js","sourcesContent":["import React, { FC, useCallback, useMemo } from 'react';\nimport cls from 'classnames';\nimport { ArticleDetailUtil, EArticleClass, TArticleDetail } from 'shared/models/article';\nimport PlayFill from 'icon/play_fill.svg';\nimport Heart from 'icon/heart.svg';\nimport { useCTADirectly } from '~/utils/cta';\nimport { EClickPosition } from 'shared/constant';\nimport { useNavigate } from '@remix-run/react';\nimport { useSharingUrl } from '~/utils/build-sharing-url';\nimport { useTranslation } from 'react-i18next';\nimport { UserAuthIcon } from '~/components/user-auth-icon';\nimport { useNumFormatter } from '@lemon8/web-app-shared/hook';\n\nimport './style.scss';\n\ninterface IArticleCardProps {\n article: TArticleDetail;\n}\n\nexport const ArticleCard: FC = (props) => {\n const navigate = useNavigate();\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const { article } = props;\n\n const { title, content } = useMemo(() => {\n const res: { title: string; content: string } = {\n title: article.title,\n content: article.shortContent.replace(/&(lt|gt|nbsp|amp|quot);/gi, ''),\n };\n\n if (!article.title.trim()) {\n res.title = res.content;\n res.content = '';\n }\n\n if (!res.title.trim()) {\n res.title = t('default_title');\n }\n\n return res;\n }, [article]);\n\n const cover = useMemo(() => ArticleDetailUtil.getCoverImage(article), [article]);\n\n const articleUrl = useSharingUrl(`/${article.author.linkName}/${article.groupId}`);\n const handleClickCard = useCTADirectly({\n clickPosition: EClickPosition.RelatedPost,\n clickId: article.groupId,\n onClick: useCallback(() => {\n navigate(articleUrl);\n }, [articleUrl]),\n });\n\n const authorUrl = useSharingUrl(`/${article.author.linkName}`);\n\n const handleClickAuthor = useCTADirectly({\n clickPosition: EClickPosition.RelatedPost,\n clickId: article.groupId,\n onClick: useCallback(() => {\n navigate(authorUrl);\n }, [authorUrl]),\n });\n\n return (\n
\n \n \n {article.articleClass === EArticleClass.VIDEO && }\n
\n
\n
\n

{title}

\n

{content}

\n
\n
\n
\n \n {article.author.nickName}\n \n \n
\n \n
\n \n {`${formatNum(article.diggCount || 0)}`}\n
\n
\n
\n \n );\n};\n","export function setTransform(style: any, v: any) {\n style.transform = v;\n style.webkitTransform = v;\n style.mozTransform = v;\n}\n\nexport function getPxStyle(value: number | string, unit = 'px', vertical: boolean = false) {\n value = vertical ? `0px, ${value}${unit}, 0px` : `${value}${unit}, 0px, 0px`;\n return `translate3d(${value})`;\n}\n\nconst rect: any = {\n innerHeight: 0,\n innerWidth: 0,\n};\n\nexport 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) {\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 noEl: false,\n };\n }\n } else {\n return {\n height: 0,\n width: 0,\n top: 0,\n left: 0,\n noEl: true,\n };\n }\n },\n\n getFrame(el: any) {\n const { x = 0, y = 0, width = 0, height = 0 } = el ? el.getBoundingClientRect() : {};\n const dpr = window.devicePixelRatio;\n return { x: x / dpr, y: y / dpr, width: width / dpr, height: height / dpr };\n },\n\n isAxisYInViewport(el: any) {\n const { top, height } = UI.offset(el);\n const _scrollY = UI.scrollY();\n const _innerHeight = UI.innerHeight();\n\n // 卡片下半部分在视窗内\n if (top < _scrollY && top + height * 0.5 > _scrollY) {\n return 'bottom';\n }\n // 卡片上半部分在视窗内\n if (top + height * 0.5 < _scrollY + _innerHeight && top + height > _scrollY + _innerHeight) {\n return 'top';\n }\n // 理论上来说,计算可视区的时候应该算上tabBar,但是这样一来就耦合太深了,不好剔除,这里逻辑不做那么严格\n // 卡片超过50%内容进入视窗,认为是可视的\n if (\n (top >= _scrollY && top + height <= _scrollY + _innerHeight) ||\n // 卡片撑满了视窗还有多的\n (top <= _scrollY && top + height >= _scrollY + _innerHeight)\n ) {\n return 'all';\n }\n\n return 'none';\n },\n\n innerWidth() {\n rect.innerWidth = rect.innerWidth || window.innerWidth;\n return rect.innerWidth;\n },\n\n innerHeight() {\n rect.innerHeight = rect.innerHeight || window.innerHeight;\n return rect.innerHeight;\n },\n};\n","import * as React from 'react';\nimport cls from 'classnames';\nimport { setTransform, getPxStyle, UI } from './util';\nimport './style.scss';\n\nexport interface TabItemProps {\n key: string;\n value: string | JSX.Element;\n}\n\ninterface TabPropType {\n /** 初始展示的页面 */\n initialPage?: number;\n /** 当前展示的页面 */\n page: number;\n /** 切换tab的滑动距离 */\n distanceToChangeTab: number;\n /** 切换tab的时间 */\n durationToChangeTab: number;\n /** tabs */\n tabs: Array;\n /** 切换tab的回调函数 */\n onChange: (tab: any, index: number) => void;\n /** 子元素 */\n children: Array>;\n /** 是否可以滑动切换 */\n swipeable: ((event: any) => boolean) | boolean;\n /** 容器类名 */\n className?: string;\n /** 支持自定义tab content的最小高度 */\n minHeight?: number;\n /** 是否禁用点击tab切换 */\n tabable?: boolean;\n /** 是否开启计算page后首次切换动画 */\n activeable?: boolean;\n}\n\ninterface TabState {\n page: number;\n tabIndexWidth: string | number;\n minHeight: string;\n setActiveTab: boolean;\n}\n\ninterface XY {\n x: number;\n y: number;\n}\n\nexport class SwiperTabs extends React.Component {\n static defaultProps = {\n page: 0,\n distanceToChangeTab: 0.3,\n durationToChangeTab: 600,\n className: '',\n tabable: true,\n activeable: true,\n };\n readonly state = {\n page: this.props.initialPage || this.props.page || 0,\n tabIndexWidth: 'auto',\n isMoving: false,\n minHeight: '100vh',\n setActiveTab: false,\n };\n private _tabbar: any = null;\n private _tabtitle: any[] = [];\n private _tabindex: any = null;\n private _tabindexBar: any = null;\n private _tablist: any = null;\n private _tablistItem: any[] = [];\n private _isSwipeScroll = false;\n // 用来记录初始滑动的位置\n private _swipeOffset: XY = { x: 0, y: 0 };\n // 记录开始滑动的事件,用于实现快速滑动\n private _swipeStartTimeStamp = 0;\n // 是否可以滑动\n private _swipeable = true;\n\n constructor(props: TabPropType) {\n super(props);\n }\n\n componentDidMount() {\n const { page } = this.state;\n\n // 由于页面rem设置、css渲染有一定延迟,需要delay计算一下\n setTimeout(() => {\n if (this._tabtitle && this._tabtitle[page]) {\n this.setState({\n tabIndexWidth: UI.offset(this._tabtitle[page], 'width'),\n minHeight: `${UI.innerHeight() - UI.offset(this._tabbar, 'height')}px`,\n });\n }\n }, 50);\n\n this._listenToCustomEvent();\n this.enableActiveTab();\n }\n\n componentWillUnmount() {\n this._tablist.removeEventListener('touchstart', this.onTouchStart, false);\n this._tablist.removeEventListener('touchmove', this.onTouchMove, false);\n this._tablist.removeEventListener('touchend', this.onTouchEnd, false);\n this._tablist.removeEventListener('touchcancel', this.onTouchEnd, false);\n }\n enableActiveTab() {\n this.setState({\n setActiveTab: true,\n });\n }\n\n _listenToCustomEvent() {\n // 给dom绑定原生的事件监听,为了阻止客户端touch的事件\n this._tablist.addEventListener('touchstart', this.onTouchStart, {\n passive: false,\n });\n this._tablist.addEventListener('touchmove', this.onTouchMove, {\n passive: false,\n });\n this._tablist.addEventListener('touchend', this.onTouchEnd, {\n passive: false,\n });\n this._tablist.addEventListener('touchcancel', this.onTouchEnd, {\n passive: false,\n });\n }\n\n setTransformX = (page: number, rateX = 0) => {\n // setState太影响性能,这里直接修改dom;这里很trick,逻辑耦合,在父组件里做了reset逻辑\n this._tablistItem.forEach((item: any) => {\n setTransform(item.style, getPxStyle((-page - rateX) * 100, '%'));\n });\n // 移动中,只是修改css,因为两层传递,所以这里只修改tab的css\n setTransform(this._tabindex.style, getPxStyle((page + rateX) * 100, '%'));\n\n const next = page + (rateX > 0 ? 1 : -1);\n if (next >= 0 && next < this.props.tabs.length) {\n const curWidth = UI.offset(this._tabtitle[page], 'width');\n const nextWidth = UI.offset(this._tabtitle[next], 'width');\n const width = rateX > 0 ? curWidth + (nextWidth - curWidth) * rateX : curWidth + (curWidth - nextWidth) * rateX;\n this._tabindexBar.style.width = `${width}px`;\n } else {\n const curWidth = UI.offset(this._tabtitle[page], 'width');\n this._tabindexBar.style.width = `${curWidth}px`;\n }\n };\n\n onChange = (index: number, type: 'swipe' | 'click') => {\n const { tabs, tabable } = this.props;\n if (tabable) {\n this.setState({\n page: index,\n tabIndexWidth: UI.offset(this._tabtitle[index], 'width'),\n });\n }\n this.props.onChange(tabs[index].key, index);\n };\n\n canSwipe = (e: any) => {\n if (typeof this.props.swipeable === 'function') {\n return this.props.swipeable(e);\n }\n return this.props.swipeable;\n };\n\n // 关于滑动相关的逻辑,耦合严重,后续需要优化\n onTouchStart = (e: any) => {\n // 如果两次滑动间隔过小,认为是误操作,不滑动\n if (Date.now() - this._swipeStartTimeStamp < 5e2) {\n this._swipeable = false;\n return;\n }\n this._swipeable = this.canSwipe(e);\n if (!this._swipeable) {\n return;\n }\n // 关闭动画效果,为了加速触摸响应\n this._tablist.classList.remove('section-list-animated');\n this._tabindex.classList.remove('tab-index-animated');\n // e.preventDefault();\n\n // 缓存滑动开始的位置\n this._swipeOffset = {\n x: e.changedTouches[0].pageX,\n y: e.changedTouches[0].pageY,\n };\n // 滑动开始时间\n this._swipeStartTimeStamp = Date.now();\n };\n onTouchMove = (e: any) => {\n if (!this._swipeable) {\n return;\n }\n const delta = {\n x: e.changedTouches[0].pageX - this._swipeOffset.x,\n y: e.changedTouches[0].pageY - this._swipeOffset.y,\n };\n\n // 如果上下滑动大于左右滑动那么认为在滚动中,则不进行左右滑动\n if ((!this._isSwipeScroll && Math.abs(delta.x) < Math.abs(delta.y)) || this._isSwipeScroll) {\n // 滑动交互中的滚动锁\n this._isSwipeScroll = true;\n return;\n }\n\n // 在某些版本的浏览器里,可以对touch的默认事件进行取消操作\n // 判断默认行为是否可以被禁用\n if (e.cancelable) {\n // 判断默认行为是否已经被禁用\n if (!e.defaultPrevented) {\n e.preventDefault();\n }\n }\n\n const { page } = this.state;\n\n // 如果当前list为边界,则第一个list不往左滑动,最后一个list不往右滑动\n if ((page === 0 && delta.x > 0) || (page === this.props.tabs.length - 1 && delta.x < 0)) {\n return;\n }\n\n const width = UI.innerWidth();\n const rateX = -delta.x / width;\n\n // setState太影响性能,这里直接修改dom;这里很trick,逻辑耦合,在父组件里做了reset逻辑\n this.setTransformX(page, rateX);\n };\n onTouchEnd = async (e: any) => {\n if (!this._swipeable) {\n return;\n }\n // 重新开启动画效果\n this._tablist.classList.add('section-list-animated');\n this._tabindex.classList.add('tab-index-animated');\n\n const delta = {\n x: e.changedTouches[0].pageX - this._swipeOffset.x,\n y: e.changedTouches[0].pageY - this._swipeOffset.y,\n };\n const { tabs, distanceToChangeTab, durationToChangeTab } = this.props;\n const { page } = this.state;\n const width = UI.innerWidth();\n const rateX = -delta.x / width;\n // 移动结束后,需要做左右滑动判定\n const tabNum = tabs.length;\n // rate 正数:右滑,负数:左滑\n let index = rateX < 0 ? page - 1 : page + 1;\n const duration = Date.now() - this._swipeStartTimeStamp;\n /**\n * 由于客户端交互滑动有两种:\n * - 轻触滑动,碰一下就左右滑动tab\n * - 拖拽,超过50%后才滑动tab\n * 这里采用折中方案,轻触和拖拽,超过10%就滑动,防止误触和过快滑动\n */\n // console.log('duration:', duration);\n // console.log('rateX:', rateX);\n // console.log('dy,height:', delta.y, UI.innerHeight());\n // console.log('rateY:', Math.abs(delta.y / UI.innerHeight()));\n // console.log('velocity:', (Math.abs(rateX) / duration) * 1000);\n if (\n // 如果滑动中出现了上下滑动,并且上下滑动大于0\n (this._isSwipeScroll && Math.abs(delta.y / UI.innerHeight()) > 0) ||\n // 如果到了边界,那么不变\n index < 0 ||\n index >= tabNum ||\n // 如果移动距离小于可拖动范围\n (duration >= durationToChangeTab && Math.abs(rateX) < distanceToChangeTab) ||\n // 如果移动时间过短认为是拖拽,如果velocity < 0.3/s\n (duration < durationToChangeTab && (Math.abs(rateX) / duration) * 1000 < 0.3)\n ) {\n index = page;\n // reset transform\n this.setTransformX(index);\n }\n // 对于滑动而言,只有切换tab才会触发逻辑\n if (page !== index) {\n this.setTransformX(index);\n setTimeout(() => {\n this.onChange(index, 'swipe');\n }, 300);\n }\n\n // 如果结束时是滚动中,那么去掉滚动\n if (this._isSwipeScroll) {\n this._isSwipeScroll = false;\n }\n };\n\n render() {\n const { tabs, className, minHeight: customMinHeight, activeable } = this.props;\n const { tabIndexWidth, page: initPage, minHeight: calculateMinHeight, setActiveTab } = this.state;\n const minHeight = customMinHeight !== undefined ? `${customMinHeight}px` : calculateMinHeight;\n const page = !activeable || setActiveTab ? initPage : 0;\n\n return (\n \n (this._tabbar = elem)}\n >\n
    \n {tabs.map((tab, index: number) => (\n this.onChange(index, 'click')}\n >\n (this._tabtitle[index] = elem)}>{tab.value}\n \n ))}\n
\n (this._tabindex = elem)}\n >\n (this._tabindexBar = elem)}\n />\n \n \n
\n
(this._tablist = elem)}>\n {this.props.children.map((child: any, index: number) => (\n (this._tablistItem[index] = elem)}\n >\n {child}\n \n ))}\n
\n
\n
\n );\n }\n}\n","export const pxToRem = (px: number): string => {\n return `${(px * 16) / 375}rem`;\n};\n","import { CSSProperties, FC, useMemo } from 'react';\nimport cls from 'classnames';\nimport { pxToRem } from '~/utils/px-to-rem';\nimport { IUserAuthInfo } from 'shared/models/user-auth-info';\n\nimport './index.rem.scss';\n\ninterface UserAuthIconProps {\n authInfo: IUserAuthInfo;\n width?: number | string | undefined;\n height?: number | string | undefined;\n marginLeft?: number | string | undefined;\n /** 用户认证icon显示为白色,视频详情页icon颜色为白色 */\n light?: boolean;\n}\n\nconst DEFAULT_WIDTH = pxToRem(20);\nconst DEFAULT_HEIGHT = pxToRem(20);\nconst DEFAULT_MARGIN_LEFT = pxToRem(4);\n\nexport const UserAuthIcon: FC = (props) => {\n const {\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT,\n marginLeft = DEFAULT_MARGIN_LEFT,\n light = false,\n authInfo,\n } = props;\n\n const style: CSSProperties = useMemo(\n () => ({\n width: typeof width === 'number' ? pxToRem(width) : width,\n height: typeof height === 'number' ? pxToRem(height) : height,\n marginLeft: typeof marginLeft === 'number' ? pxToRem(marginLeft) : marginLeft,\n }),\n [width, height, marginLeft],\n );\n\n if (!authInfo.showAuthSymbol) {\n return null;\n }\n\n return (\n \n );\n};\n","var PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n","import { Unreachable } from '@lemon8/web-app-shared/util';\nimport { atom } from 'jotai';\nimport { $SharingPageLevelTraffic, IHashtagPageTraffic } from 'shared/atoms';\nimport { EPageType } from 'shared/constant';\n\nexport const $CurrentHashtagId = atom((get) => {\n const traffic = get($SharingPageLevelTraffic);\n const { pageType } = traffic;\n\n if (pageType !== EPageType.HASHTAG) {\n Unreachable(`invalid page type: ${pageType}`);\n }\n\n const userTraffic = traffic as IHashtagPageTraffic;\n\n return userTraffic.hashtagId;\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 { atom } from 'jotai/index';\nimport { $CurrentHashtagId } from '@hashtag/shared/current-hashtag';\nimport { $HashtagInfo } from 'shared/atoms';\nimport { HashtagInfoUtil, IHashtagInfo } from 'shared/models/hashtag';\n\nexport const $CurrentHashtagInfo = atom((get) => {\n const currentHashtagId = get($CurrentHashtagId);\n return get($HashtagInfo(currentHashtagId));\n});\n\nexport const $CurrentHashtagInfoOrNull = atom((get) => {\n const hashtagInfo = get($CurrentHashtagInfo);\n if (HashtagInfoUtil.isAvailable(hashtagInfo)) {\n return hashtagInfo;\n }\n return null;\n});\n\nexport const $CurrentHashtagInfoAsAvailable = atom((get) => {\n const currentHashtagId = get($CurrentHashtagId);\n return get($HashtagInfo(currentHashtagId)) as IHashtagInfo;\n});\n","import { atom } from 'jotai';\nimport { $CurrentHashtagId } from '@hashtag/shared/current-hashtag';\nimport { $HashtagPopularPost, $HashtagRecentPost } from 'shared/atoms';\n\nexport const $CurrentHashtagPopularPosts = atom((get) => {\n const hashtagId = get($CurrentHashtagId);\n return get($HashtagPopularPost(hashtagId));\n});\n\nexport const $CurrentHashtagRecentPosts = atom((get) => {\n const hashtagId = get($CurrentHashtagId);\n return get($HashtagRecentPost(hashtagId));\n});\n","import { FC, useEffect, useMemo, useRef } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $CurrentHashtagInfoAsAvailable } from '@hashtag/shared/current-hashtag-info';\nimport { useTranslation } from 'react-i18next';\nimport { useNumFormatter } from '@lemon8/web-app-shared/hook';\nimport _throttle from 'lodash/throttle';\nimport _clamp from 'lodash/clamp';\nimport { $CurrentHashtagPopularPosts } from '@hashtag/shared/current-hashtag-post';\nimport { ArticleDetailUtil } from 'shared/models/article';\n\nimport './style.scss';\n\nexport const HashtagInfo: FC = () => {\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const hashtag = useAtomValue($CurrentHashtagInfoAsAvailable);\n const { items: hashtagPopularPosts } = useAtomValue($CurrentHashtagPopularPosts);\n\n const fixedTitleRef = useRef(null);\n const titleRef = useRef(null);\n\n const cover = useMemo(() => {\n const backgroundUrl = hashtag.background?.url;\n if (backgroundUrl) {\n return backgroundUrl;\n }\n\n if (hashtagPopularPosts.length) {\n return ArticleDetailUtil.getCoverImage(hashtagPopularPosts[0]).url;\n }\n\n return null;\n }, []);\n\n useEffect(() => {\n if (!fixedTitleRef.current || !titleRef.current) {\n return;\n }\n\n const fixedTitle = fixedTitleRef.current;\n const title = titleRef.current;\n\n const callback = _throttle(() => {\n const fixedTitleRect = fixedTitle.getBoundingClientRect();\n const titleRect = title.getBoundingClientRect();\n\n const opacity = _clamp((fixedTitleRect.top - titleRect.top - 24) / (titleRect.bottom - titleRect.top), 0, 1);\n fixedTitle.style.opacity = `${opacity}`;\n }, 16);\n\n window.addEventListener('scroll', callback);\n\n return () => {\n window.removeEventListener('scroll', callback);\n };\n }, []);\n\n return (\n <>\n
\n
\n #{hashtag.name}\n
\n
\n\n
\n {cover && (\n
\n \n
\n )}\n\n
\n
\n #{hashtag.name}\n
\n\n
\n \n \n {t('view_count_plural', { num: hashtag.viewsCount }).replace('%d', formatNum(hashtag.viewsCount))}\n \n \n
\n\n {Boolean(hashtag.description) &&
{hashtag.description}
}\n
\n
\n \n );\n};\n","import { FC, useEffect, useRef } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $HashtagPopularPostLoadmore, $HashtagRecentPostLoadmore } from 'shared/atoms';\nimport { $CurrentHashtagPopularPosts, $CurrentHashtagRecentPosts } from '@hashtag/shared/current-hashtag-post';\nimport { useRouteLoader } from '@lemon8/web-app-shared/ssr';\nimport { Loaders } from 'shared/constant';\nimport LoadMore from '~/components/load-more';\nimport { ArticleCard } from '~/components/article-card';\nimport { Loading } from '~/components/loading';\nimport { useTranslation } from 'react-i18next';\n\ninterface IHashtagPostFragmentProps {\n type: 'popular' | 'recent';\n active: boolean;\n}\n\nexport const HashtagPostFragment: FC = ({ type, active }) => {\n const { t } = useTranslation();\n const { items, sessionImprId, hasMore } = useAtomValue(\n type === 'popular' ? $CurrentHashtagPopularPosts : $CurrentHashtagRecentPosts,\n );\n\n const loader = useRouteLoader(\n Loaders.Hashtag.HashtagPostsLoadmore,\n {\n type,\n session_impr_id: sessionImprId,\n },\n {\n atomFamilies: {\n $HashtagPopularPostLoadmore,\n $HashtagRecentPostLoadmore,\n },\n },\n );\n\n const loadData = (): Promise<{ data: unknown[] }> => {\n if (active) {\n loader.load();\n }\n return Promise.resolve({ data: [] });\n };\n\n const initializedRef = useRef(false);\n useEffect(() => {\n if (active && !initializedRef.current) {\n loadData();\n initializedRef.current = true;\n }\n }, [active]);\n\n return (\n {\n return (\n <>\n {items.map((item) => (\n \n ))}\n {hasMore && }\n \n );\n }}\n />\n );\n};\n","import { FC, useCallback, useRef, useState } from 'react';\nimport { SwiperTabs } from '~/components/swiper-tab';\nimport { useAtomValue } from 'jotai';\nimport { $CurrentHashtagInfoAsAvailable } from '@hashtag/shared/current-hashtag-info';\nimport { HashtagPostFragment } from '@hashtag/body/hashtag-post/hashtag-post-fragment';\n\nimport './style.scss';\n\nexport const HashtagPost: FC = () => {\n const hashtag = useAtomValue($CurrentHashtagInfoAsAvailable);\n\n const [tabIndex, setTabIndex] = useState(0);\n\n const handleChange = useCallback((_: unknown, index: number) => {\n setTabIndex(index);\n }, []);\n\n return (\n
\n ({\n key: `${item.category}`,\n value: item.tabName,\n }))}\n >\n \n \n \n
\n );\n};\n","import { FC } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $CurrentHashtagInfoOrNull } from '@hashtag/shared/current-hashtag-info';\nimport { HashtagInfo } from '@hashtag/body/hashtag-info';\nimport { HashtagPost } from '@hashtag/body/hashtag-post';\n\nexport const HashtagBody: FC = () => {\n const hashtagInfo = useAtomValue($CurrentHashtagInfoOrNull);\n\n if (hashtagInfo) {\n return (\n <>\n \n \n