import type { FC, JSX } from 'react'; import type { IPageHasId } from '@growi/core'; import { pagePathUtils, templateChecker } from '@growi/core/dist/utils'; const { isTopPage } = pagePathUtils; const { checkTemplatePath } = templateChecker; const SEEN_USERS_HIDE_THRES__ACTIVE_USERS_COUNT = 5; const MAX_STRENGTH_LEVEL = 4; type SeenUsersCountProps = { count: number; basisViewersCount?: number; shouldSpaceOutIcon?: boolean; }; const SeenUsersCount = (props: SeenUsersCountProps): JSX.Element => { const { count, shouldSpaceOutIcon, basisViewersCount } = props; if (count === 0) { return <>; } if ( basisViewersCount != null && basisViewersCount <= SEEN_USERS_HIDE_THRES__ACTIVE_USERS_COUNT ) { return <>; } const strengthLevel = Math.ceil( Math.min(0, Math.log(count / (basisViewersCount ?? count))) * // Max: 0 2 * -1, ); if (strengthLevel > MAX_STRENGTH_LEVEL) { return <>; } if (!(strengthLevel >= 0 && strengthLevel <= MAX_STRENGTH_LEVEL)) { throw new Error('strengthLevel out of range'); } // [0, MAX_STRENGTH_LEVEL) const strengthClass = `strength-${strengthLevel}`; // strength-{0, 1, 2, 3, 4} return ( footprint {count} ); }; type PageListMetaProps = { page: IPageHasId; likerCount?: number; bookmarkCount?: number; shouldSpaceOutIcon?: boolean; basisViewersCount?: number; }; export const PageListMeta: FC = ( props: PageListMetaProps, ) => { const { page, shouldSpaceOutIcon, basisViewersCount } = props; // top check let topLabel: JSX.Element | undefined; if (isTopPage(page.path)) { topLabel = ( TOP ); } // template check let templateLabel: JSX.Element | undefined; if (checkTemplatePath(page.path)) { templateLabel = ( TMPL ); } let commentCount: JSX.Element | undefined; if (page.commentCount > 0) { commentCount = ( comment {page.commentCount} ); } let likerCount: JSX.Element | undefined; if (props.likerCount != null && props.likerCount > 0) { likerCount = ( favorite {props.likerCount} ); } let locked: JSX.Element | undefined; if (page.grant !== 1) { locked = ( lock ); } let bookmarkCount: JSX.Element | undefined; if (props.bookmarkCount != null && props.bookmarkCount > 0) { bookmarkCount = ( bookmark {props.bookmarkCount} ); } return ( {topLabel} {templateLabel} {commentCount} {likerCount} {locked} {bookmarkCount} ); };