|
@@ -1,62 +1,45 @@
|
|
|
import React, { useState, useCallback } from 'react';
|
|
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 { Dropdown } from 'reactstrap';
|
|
import { Dropdown } from 'reactstrap';
|
|
|
|
|
|
|
|
import { useCreateTemplatePage } from '~/client/services/create-page';
|
|
import { useCreateTemplatePage } from '~/client/services/create-page';
|
|
|
import { toastError } from '~/client/util/toastr';
|
|
import { toastError } from '~/client/util/toastr';
|
|
|
-import type { LabelType } from '~/interfaces/template';
|
|
|
|
|
-import { useCurrentUser } from '~/stores/context';
|
|
|
|
|
-import { useSWRxCurrentPage } from '~/stores/page';
|
|
|
|
|
|
|
|
|
|
import { CreateButton } from './CreateButton';
|
|
import { CreateButton } from './CreateButton';
|
|
|
import { DropendMenu } from './DropendMenu';
|
|
import { DropendMenu } from './DropendMenu';
|
|
|
import { DropendToggle } from './DropendToggle';
|
|
import { DropendToggle } from './DropendToggle';
|
|
|
-import { useOnNewButtonClicked, useOnTodaysButtonClicked } from './hooks';
|
|
|
|
|
|
|
+import { useCreateNewPage, useCreateTodaysMemo } 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}`;
|
|
|
|
|
|
|
+const useToastrOnError = <P, R>(method?: (param?: P) => Promise<R|undefined>): (param?: P) => Promise<R|undefined> => {
|
|
|
|
|
+ return useCallback(async(param) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await method?.(param);
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ toastError(err);
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [method]);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-export const PageCreateButton = React.memo((): JSX.Element => {
|
|
|
|
|
- const { t } = useTranslation('commons');
|
|
|
|
|
-
|
|
|
|
|
- const { data: currentPage, isLoading } = useSWRxCurrentPage();
|
|
|
|
|
- const { data: currentUser } = useCurrentUser();
|
|
|
|
|
|
|
|
|
|
|
|
+export const PageCreateButton = React.memo((): JSX.Element => {
|
|
|
const [isHovered, setIsHovered] = useState(false);
|
|
const [isHovered, setIsHovered] = useState(false);
|
|
|
|
|
|
|
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
|
|
|
|
|
|
- const todaysPath = currentUser == null
|
|
|
|
|
- ? null
|
|
|
|
|
- : generateTodaysPath(currentUser, t('create_page_dropdown.todays.memo'));
|
|
|
|
|
-
|
|
|
|
|
- const { onClickHandler: onClickNewButton, isPageCreating: isNewPageCreating } = useOnNewButtonClicked(
|
|
|
|
|
- currentPage?.path, isLoading,
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ const { createNewPage, isCreating: isNewPageCreating } = useCreateNewPage();
|
|
|
// TODO: https://redmine.weseek.co.jp/issues/138806
|
|
// TODO: https://redmine.weseek.co.jp/issues/138806
|
|
|
- const { onClickHandler: onClickTodaysButton, isPageCreating: isTodaysPageCreating } = useOnTodaysButtonClicked(todaysPath);
|
|
|
|
|
|
|
+ const { createTodaysMemo, isCreating: isTodaysPageCreating, todaysPath } = useCreateTodaysMemo();
|
|
|
// TODO: https://redmine.weseek.co.jp/issues/138805
|
|
// TODO: https://redmine.weseek.co.jp/issues/138805
|
|
|
const {
|
|
const {
|
|
|
createTemplate,
|
|
createTemplate,
|
|
|
isCreating: isTemplatePageCreating, isCreatable: isTemplatePageCreatable,
|
|
isCreating: isTemplatePageCreating, isCreatable: isTemplatePageCreatable,
|
|
|
} = useCreateTemplatePage();
|
|
} = useCreateTemplatePage();
|
|
|
|
|
|
|
|
- const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
|
|
|
|
|
- try {
|
|
|
|
|
- await createTemplate?.(label);
|
|
|
|
|
- }
|
|
|
|
|
- catch (err) {
|
|
|
|
|
- toastError(err);
|
|
|
|
|
- }
|
|
|
|
|
- }, [createTemplate]);
|
|
|
|
|
|
|
+ const createNewPageWithToastr = useToastrOnError(createNewPage);
|
|
|
|
|
+ const createTodaysMemoWithToastr = useToastrOnError(createTodaysMemo);
|
|
|
|
|
+ const createTemplateWithToastr = useToastrOnError(createTemplate);
|
|
|
|
|
|
|
|
const onMouseEnterHandler = () => {
|
|
const onMouseEnterHandler = () => {
|
|
|
setIsHovered(true);
|
|
setIsHovered(true);
|
|
@@ -78,7 +61,7 @@ export const PageCreateButton = React.memo((): JSX.Element => {
|
|
|
<div className="btn-group flex-grow-1">
|
|
<div className="btn-group flex-grow-1">
|
|
|
<CreateButton
|
|
<CreateButton
|
|
|
className="z-2"
|
|
className="z-2"
|
|
|
- onClick={onClickNewButton}
|
|
|
|
|
|
|
+ onClick={createNewPageWithToastr}
|
|
|
disabled={isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating}
|
|
disabled={isNewPageCreating || isTodaysPageCreating || isTemplatePageCreating}
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
@@ -91,9 +74,9 @@ export const PageCreateButton = React.memo((): JSX.Element => {
|
|
|
>
|
|
>
|
|
|
<DropendToggle />
|
|
<DropendToggle />
|
|
|
<DropendMenu
|
|
<DropendMenu
|
|
|
- onClickCreateNewPageButtonHandler={onClickNewButton}
|
|
|
|
|
- onClickCreateTodaysButtonHandler={onClickTodaysButton}
|
|
|
|
|
- onClickTemplateButtonHandler={isTemplatePageCreatable ? onClickTemplateButtonHandler : undefined}
|
|
|
|
|
|
|
+ onClickCreateNewPageButton={createNewPageWithToastr}
|
|
|
|
|
+ onClickCreateTodaysButton={createTodaysMemoWithToastr}
|
|
|
|
|
+ onClickTemplateButton={isTemplatePageCreatable ? createTemplateWithToastr : undefined}
|
|
|
todaysPath={todaysPath}
|
|
todaysPath={todaysPath}
|
|
|
/>
|
|
/>
|
|
|
</Dropdown>
|
|
</Dropdown>
|