| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- import React, { useCallback, useState } from 'react';
- import { pagePathUtils } from '@growi/core/dist/utils';
- import { format } from 'date-fns';
- import { useRouter } from 'next/router';
- import { createPage, exist } from '~/client/services/page-operation';
- import { toastError } from '~/client/util/toastr';
- import { useCurrentUser } from '~/stores/context';
- import { useSWRxCurrentPage } from '~/stores/page';
- import loggerFactory from '~/utils/logger';
- import { CreateButton } from './CreateButton';
- import { DropendMenu } from './DropendMenu';
- import { DropendToggle } from './DropendToggle';
- const logger = loggerFactory('growi:cli:PageCreateButton');
- export const PageCreateButton = React.memo((): JSX.Element => {
- const router = useRouter();
- const { data: currentPage, isLoading } = useSWRxCurrentPage();
- const { data: currentUser } = useCurrentUser();
- const [isHovered, setIsHovered] = useState(false);
- const [isCreating, setIsCreating] = useState(false);
- const now = format(new Date(), 'yyyy/MM/dd');
- const userHomepagePath = pagePathUtils.userHomepagePath(currentUser);
- const todaysPath = `${userHomepagePath}/memo/${now}`;
- const onMouseEnterHandler = () => {
- setIsHovered(true);
- };
- const onMouseLeaveHandler = () => {
- setIsHovered(false);
- };
- const onClickCreateNewPageButtonHandler = useCallback(async() => {
- if (isLoading) return;
- try {
- setIsCreating(true);
- const parentPath = currentPage == null
- ? '/'
- : currentPage.path;
- const params = {
- isSlackEnabled: false,
- slackChannels: '',
- grant: currentPage?.grant || 1,
- 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 onClickCreateTodaysButtonHandler = useCallback(async() => {
- if (currentUser == null) {
- return;
- }
- try {
- setIsCreating(true);
- // TODO: get grant, grantUserGroupId data from parent page
- // https://redmine.weseek.co.jp/issues/133892
- const params = {
- isSlackEnabled: false,
- slackChannels: '',
- grant: 1,
- };
- const res = await exist(JSON.stringify([todaysPath]));
- if (!res.pages[todaysPath]) {
- await createPage(todaysPath, '', params);
- }
- router.push(`${todaysPath}#edit`);
- }
- catch (err) {
- logger.warn(err);
- toastError(err);
- }
- finally {
- setIsCreating(false);
- }
- }, [currentUser, router, todaysPath]);
- const onClickTemplateForChildrenButtonHandler = useCallback(async() => {
- if (isLoading) return;
- try {
- setIsCreating(true);
- const path = currentPage == null || currentPage.path === '/'
- ? '/_template'
- : `${currentPage.path}/_template`;
- const params = {
- isSlackEnabled: false,
- slackChannels: '',
- grant: currentPage?.grant || 1,
- grantUserGroupId: currentPage?.grantedGroup?._id,
- };
- const res = await exist(JSON.stringify([path]));
- if (!res.pages[path]) {
- await createPage(path, '', params);
- }
- router.push(`${path}#edit`);
- }
- catch (err) {
- logger.warn(err);
- toastError(err);
- }
- finally {
- setIsCreating(false);
- }
- }, [currentPage, isLoading, router]);
- const onClickTemplateForDescendantsButtonHandler = useCallback(async() => {
- if (isLoading) return;
- try {
- setIsCreating(true);
- const path = currentPage == null || currentPage.path === '/'
- ? '/__template'
- : `${currentPage.path}/__template`;
- const params = {
- isSlackEnabled: false,
- slackChannels: '',
- grant: currentPage?.grant || 1,
- grantUserGroupId: currentPage?.grantedGroup?._id,
- };
- const res = await exist(JSON.stringify([path]));
- if (!res.pages[path]) {
- await createPage(path, '', params);
- }
- router.push(`${path}#edit`);
- }
- catch (err) {
- logger.warn(err);
- toastError(err);
- }
- finally {
- setIsCreating(false);
- }
- }, [currentPage, isLoading, router]);
- // TODO: update button design
- // https://redmine.weseek.co.jp/issues/132683
- return (
- <div
- className="d-flex flex-row"
- onMouseEnter={onMouseEnterHandler}
- onMouseLeave={onMouseLeaveHandler}
- >
- <div className="btn-group flex-grow-1">
- <CreateButton
- className="z-2"
- onClick={onClickCreateNewPageButtonHandler}
- 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"
- />
- <DropendMenu
- todaysPath={todaysPath}
- onClickCreateNewPageButtonHandler={onClickCreateNewPageButtonHandler}
- onClickCreateTodaysButtonHandler={onClickCreateTodaysButtonHandler}
- onClickTemplateForChildrenButtonHandler={onClickTemplateForChildrenButtonHandler}
- onClickTemplateForDescendantsButtonHandler={onClickTemplateForDescendantsButtonHandler}
- />
- </div>
- )}
- </div>
- );
- });
|