import React, {
memo, useCallback, useEffect, useState,
} 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 { useTranslation } from 'next-i18next';
import Link from 'next/link';
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 RecentChangesContentSkeleton from './RecentChangesContentSkeleton';
import styles from './RecentChanges.module.scss';
const logger = loggerFactory('growi:History');
type PageItemLowerProps = {
page: IPageHasId,
}
type PageItemProps = PageItemLowerProps & {
isSmall: boolean
}
const PageItemLower = memo(({ page }: PageItemLowerProps): JSX.Element => {
return (
{page.seenUsers.length}
{page.commentCount}
);
});
PageItemLower.displayName = 'PageItemLower';
const PageItem = memo(({ page, isSmall }: 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 (
{tag.name}
);
});
return (
{ !dPagePath.isRoot &&
}
{locked}
{!isSmall &&
{ tagElements }
}
);
});
PageItem.displayName = 'PageItem';
export const RecentChanges = (): JSX.Element => {
const PER_PAGE = 20;
const { t } = useTranslation();
const swrInifinitexRecentlyUpdated = useSWRINFxRecentlyUpdated(PER_PAGE);
const {
data, mutate, isLoading,
} = swrInifinitexRecentlyUpdated;
const [isRecentChangesSidebarSmall, setIsRecentChangesSidebarSmall] = useState(false);
const isEmpty = data?.[0]?.pages.length === 0;
const isReachingEnd = isEmpty || (data != null && data[data.length - 1]?.pages.length < PER_PAGE);
const retrieveSizePreferenceFromLocalStorage = useCallback(() => {
if (window.localStorage.isRecentChangesSidebarSmall === 'true') {
setIsRecentChangesSidebarSmall(true);
}
}, []);
const changeSizeHandler = useCallback((e) => {
setIsRecentChangesSidebarSmall(e.target.checked);
window.localStorage.setItem('isRecentChangesSidebarSmall', e.target.checked);
}, []);
// componentDidMount
useEffect(() => {
retrieveSizePreferenceFromLocalStorage();
}, [retrieveSizePreferenceFromLocalStorage]);
return (
{t('Recent Changes')}
mutate()}/>
{
isLoading ?
: (
{ data != null && data.map(apiResult => apiResult.pages).flat()
.map(page => (
))
}
)
}
);
};