import React, { FC } from 'react'; import assert from 'assert'; import { templateChecker, pagePathUtils, IPageHasId } from '@growi/core'; import { FootstampIcon } from '../SearchPage/FootstampIcon'; 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 <>; } assert(strengthLevel >= 0 && strengthLevel <= MAX_STRENGTH_LEVEL); // [0, MAX_STRENGTH_LEVEL) const strengthClass = `strength-${strengthLevel}`; // strength-{0, 1, 2, 3, 4} return ( {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; if (isTopPage(page.path)) { topLabel = TOP; } // template check let templateLabel; if (checkTemplatePath(page.path)) { templateLabel = TMPL; } let commentCount; if (page.commentCount > 0) { commentCount = {page.commentCount}; } let likerCount; if (props.likerCount != null && props.likerCount > 0) { likerCount = {props.likerCount}; } let locked; if (page.grant !== 1) { locked = ; } let bookmarkCount; if (props.bookmarkCount != null && props.bookmarkCount > 0) { bookmarkCount = {props.bookmarkCount}; } return ( {topLabel} {templateLabel} {commentCount} {likerCount} {locked} {bookmarkCount} ); };