import { FC, useCallback } from 'react'; import type { Dispatch, SetStateAction } from 'react'; import nodePath from 'path'; import type { IPagePopulatedToShowRevision } from '@growi/core'; import { pathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import { ValidationTarget } from '~/client/util/input-validator'; import ClosableTextInput from '../Common/ClosableTextInput'; import { usePagePathRenameHandler } from './page-header-utils'; type StateHandler = { isRenameInputShown: boolean setRenameInputShown: Dispatch> } type Props = { currentPage: IPagePopulatedToShowRevision stateHandler: StateHandler inputValue: string CustomComponent: JSX.Element handleInputChange?: (string) => void } export const TextInputForPageTitleAndPath: FC = (props) => { const { currentPage, stateHandler, inputValue, CustomComponent, handleInputChange, } = props; const { t } = useTranslation(); const { isRenameInputShown, setRenameInputShown } = stateHandler; const onRenameFinish = () => { setRenameInputShown(false); }; const onRenameFailure = () => { setRenameInputShown(true); }; const pagePathRenameHandler = usePagePathRenameHandler(currentPage, onRenameFinish, onRenameFailure); const onPressEnter = useCallback((inputPagePath: string) => { const parentPath = pathUtils.addTrailingSlash(nodePath.dirname(currentPage.path ?? '')); const newPagePath = nodePath.resolve(parentPath, inputPagePath); pagePathRenameHandler(newPagePath); }, [currentPage.path, pagePathRenameHandler]); return ( <> {isRenameInputShown ? (
) : ( <>{ CustomComponent } )} ); };