import React, { useState, useCallback } from 'react'; import type { IUserHasId } from '@growi/core'; import { pagePathUtils } from '@growi/core/dist/utils'; import { format } from 'date-fns'; import { useTranslation } from 'react-i18next'; import { useOnTemplateButtonClicked } from '~/client/services/use-on-template-button-clicked'; import { toastError } from '~/client/util/toastr'; import { LabelType } from '~/interfaces/template'; import { useCurrentUser } from '~/stores/context'; import { useCurrentPagePath } from '~/stores/page'; import { CreateButton } from './CreateButton'; import { DropendMenu } from './DropendMenu'; import { DropendToggle } from './DropendToggle'; import { useOnNewButtonClicked, useOnTodaysButtonClicked } from './hooks'; const generateTodaysPath = (currentUser: IUserHasId, parentDirName: string) => { const now = format(new Date(), 'yyyy/MM/dd'); const userHomepagePath = pagePathUtils.userHomepagePath(currentUser); return `${userHomepagePath}/${parentDirName}/${now}`; }; export const PageCreateButton = React.memo((): JSX.Element => { const { t } = useTranslation('commons'); const { data: currentPagePath, isLoading } = useCurrentPagePath(); const { data: currentUser } = useCurrentUser(); const [isHovered, setIsHovered] = useState(false); const todaysPath = currentUser == null ? null : generateTodaysPath(currentUser, t('create_page_dropdown.todays.memo')); const { onClickHandler: onClickNewButton, isPageCreating: isNewPageCreating } = useOnNewButtonClicked(currentPagePath, isLoading); const { onClickHandler: onClickTodaysButton, isPageCreating: isTodaysPageCreating } = useOnTodaysButtonClicked(todaysPath); const { onClickHandler: onClickTemplateButton, isPageCreating: isTemplatePageCreating } = useOnTemplateButtonClicked(currentPagePath, isLoading); const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => { try { await onClickTemplateButton(label); } catch (err) { toastError(err); } }, [onClickTemplateButton]); const onMouseEnterHandler = () => { setIsHovered(true); }; const onMouseLeaveHandler = () => { setIsHovered(false); }; return (