| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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<SetStateAction<boolean>>
- }
- type Props = {
- currentPage: IPagePopulatedToShowRevision
- stateHandler: StateHandler
- inputValue: string
- CustomComponent: JSX.Element
- handleInputChange?: (string) => void
- }
- export const TextInputForPageTitleAndPath: FC<Props> = (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 ? (
- <div className="flex-fill">
- <ClosableTextInput
- value={inputValue}
- placeholder={t('Input page name')}
- onPressEnter={onPressEnter}
- validationTarget={ValidationTarget.PAGE}
- handleInputChange={handleInputChange}
- />
- </div>
- ) : (
- <>{ CustomComponent }</>
- )}
- </>
- );
- };
|