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