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}
);
};