| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import React, { useCallback, useState } from 'react';
- import { useRouter } from 'next/router';
- import { createPage } from '~/client/services/page-operation';
- import { toastError } from '~/client/util/toastr';
- import { useSWRxCurrentPage } from '~/stores/page';
- import loggerFactory from '~/utils/logger';
- import { CreateButton } from './CreateButton';
- import { DropendToggle } from './DropendToggle';
- import styles from './PageCreateButton.module.scss';
- const moduleClass = styles['grw-page-create-button'];
- const logger = loggerFactory('growi:cli:PageCreateButton');
- export const PageCreateButton = React.memo((): JSX.Element => {
- const router = useRouter();
- const { data: currentPage, isLoading } = useSWRxCurrentPage();
- const [isHovered, setIsHovered] = useState(false);
- const [isCreating, setIsCreating] = useState(false);
- const onMouseEnterHandler = () => {
- setIsHovered(true);
- };
- const onMouseLeaveHandler = () => {
- setIsHovered(false);
- };
- const onCreateNewPageButtonHandler = useCallback(async() => {
- if (isLoading) return;
- try {
- setIsCreating(true);
- const parentPath = currentPage == null
- ? '/'
- : currentPage.path;
- const params = {
- isSlackEnabled: false,
- slackChannels: '',
- grant: currentPage?.grant || 1,
- pageTags: [],
- grantUserGroupId: currentPage?.grantedGroup?._id,
- shouldGeneratePath: true,
- };
- const response = await createPage(parentPath, '', params);
- router.push(`${response.page.id}#edit`);
- }
- catch (err) {
- logger.warn(err);
- toastError(err);
- }
- finally {
- setIsCreating(false);
- }
- }, [currentPage, isLoading, router]);
- const onCreateTodaysButtonHandler = useCallback(() => {
- // router.push(`${router.pathname}#edit`);
- }, [router]);
- const onTemplateForChildrenButtonHandler = useCallback(() => {
- // router.push(`${router.pathname}/_template#edit`);
- }, [router]);
- const onTemplateForDescendantsButtonHandler = useCallback(() => {
- // router.push(`${router.pathname}/__template#edit`);
- }, [router]);
- // TODO: i18n
- // https://redmine.weseek.co.jp/issues/132681
- return (
- <div
- className={`${moduleClass} d-flex flex-row`}
- onMouseEnter={onMouseEnterHandler}
- onMouseLeave={onMouseLeaveHandler}
- >
- <div className="btn-group flex-grow-1">
- <CreateButton
- className="z-2"
- onClick={onCreateNewPageButtonHandler}
- disabled={isCreating}
- />
- </div>
- { isHovered && (
- <div className="btn-group dropend position-absolute">
- <DropendToggle
- className="dropdown-toggle dropdown-toggle-split"
- data-bs-toggle="dropdown"
- aria-expanded="false"
- />
- <ul className="dropdown-menu">
- <li>
- <button
- className="dropdown-item"
- onClick={onCreateNewPageButtonHandler}
- type="button"
- disabled={isCreating}
- >
- Create New Page
- </button>
- </li>
- <li><hr className="dropdown-divider" /></li>
- <li><span className="text-muted px-3">Create today's ...</span></li>
- {/* TODO: show correct create today's page path */}
- {/* https://redmine.weseek.co.jp/issues/132682 */}
- <li>
- <button
- className="dropdown-item"
- onClick={onCreateTodaysButtonHandler}
- type="button"
- >
- Create today's
- </button>
- </li>
- <li><hr className="dropdown-divider" /></li>
- <li><span className="text-muted px-3">Child page template</span></li>
- <li>
- <button
- className="dropdown-item"
- onClick={onTemplateForChildrenButtonHandler}
- type="button"
- >
- Template for children
- </button>
- </li>
- <li>
- <button
- className="dropdown-item"
- onClick={onTemplateForDescendantsButtonHandler}
- type="button"
- >
- Template for descendants
- </button>
- </li>
- </ul>
- </div>
- )}
- </div>
- );
- });
- PageCreateButton.displayName = 'PageCreateButton';
|