import React, {
memo, useCallback, useEffect,
} from 'react';
import { isPopulated, type IPageHasId } from '@growi/core';
import { DevidedPagePath } from '@growi/core/dist/models';
import { UserPicture, FootstampIcon } from '@growi/ui/dist/components';
import { useKeywordManager } from '~/client/services/search-operation';
import FormattedDistanceDate from '~/components/FormattedDistanceDate';
import InfiniteScroll from '~/components/InfiniteScroll';
import PagePathHierarchicalLink from '~/components/PagePathHierarchicalLink';
import LinkedPagePath from '~/models/linked-page-path';
import { useSWRINFxRecentlyUpdated } from '~/stores/page-listing';
import loggerFactory from '~/utils/logger';
import { SidebarHeaderReloadButton } from '../SidebarHeaderReloadButton';
import styles from './RecentChangesSubstance.module.scss';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const logger = loggerFactory('growi:History');
type PageItemLowerProps = {
page: IPageHasId,
}
type PageItemProps = PageItemLowerProps & {
isSmall: boolean,
onClickTag?: (tagName: string) => void,
}
const PageItemLower = memo(({ page }: PageItemLowerProps): JSX.Element => {
return (
{page.seenUsers.length}
{page.commentCount}
);
});
PageItemLower.displayName = 'PageItemLower';
const PageItem = memo(({ page, isSmall, onClickTag }: PageItemProps): JSX.Element => {
const dPagePath = new DevidedPagePath(page.path, false, true);
const linkedPagePathFormer = new LinkedPagePath(dPagePath.former);
const linkedPagePathLatter = new LinkedPagePath(dPagePath.latter);
const FormerLink = () => (
);
let locked;
if (page.grant !== 1) {
locked = ;
}
const tags = page.tags;
const tagElements = tags.map((tag) => {
if (!isPopulated(tag)) {
return <>>;
}
return (
onClickTag?.(tag.name)}
>
{tag.name}
);
});
return (
{ !dPagePath.isRoot &&
}
{locked}
{!isSmall && (
{ tagElements }
)}
);
});
PageItem.displayName = 'PageItem';
type HeaderProps = {
isSmall: boolean,
onSizeChange: (isSmall: boolean) => void,
}
const PER_PAGE = 20;
export const RecentChangesHeader = ({ isSmall, onSizeChange }: HeaderProps): JSX.Element => {
const { mutate } = useSWRINFxRecentlyUpdated(PER_PAGE, { suspense: true });
const retrieveSizePreferenceFromLocalStorage = useCallback(() => {
if (window.localStorage.isRecentChangesSidebarSmall === 'true') {
onSizeChange(true);
}
}, [onSizeChange]);
const changeSizeHandler = useCallback((e) => {
onSizeChange(e.target.checked);
window.localStorage.setItem('isRecentChangesSidebarSmall', e.target.checked);
}, [onSizeChange]);
// componentDidMount
useEffect(() => {
retrieveSizePreferenceFromLocalStorage();
}, [retrieveSizePreferenceFromLocalStorage]);
return (
<>
mutate()} />
>
);
};
type ContentProps = {
isSmall: boolean,
}
export const RecentChangesContent = ({ isSmall }: ContentProps): JSX.Element => {
const swrInifinitexRecentlyUpdated = useSWRINFxRecentlyUpdated(PER_PAGE, { suspense: true });
const { data } = swrInifinitexRecentlyUpdated;
const { pushState } = useKeywordManager();
const isEmpty = data?.[0]?.pages.length === 0;
const isReachingEnd = isEmpty || (data != null && data[data.length - 1]?.pages.length < PER_PAGE);
return (
{ data != null && data.map(apiResult => apiResult.pages).flat()
.map(page => (
pushState(`tag:${tagName}`)} />
))
}
);
};