| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- import { useCallback, useMemo } from 'react';
- import type {
- IAttachmentHasId, IUserGroupHasId,
- } from '@growi/core';
- import { useSWRStatic } from '@growi/core/dist/swr';
- import { MarkdownTable } from '@growi/editor';
- import type { SWRResponse } from 'swr';
- import type { BookmarkFolderItems } from '~/interfaces/bookmark-info';
- import type {
- OnPutBackedFunction, onDeletedBookmarkFolderFunction, OnSelectedFunction,
- } from '~/interfaces/ui';
- import loggerFactory from '~/utils/logger';
- const logger = loggerFactory('growi:stores:modal');
- /*
- * GrantedGroupsInheritanceSelectModal
- */
- type GrantedGroupsInheritanceSelectModalStatus = {
- isOpened: boolean,
- onCreateBtnClick?: (onlyInheritUserRelatedGrantedGroups?: boolean) => Promise<void>,
- }
- type GrantedGroupsInheritanceSelectModalStatusUtils = {
- open(onCreateBtnClick?: (onlyInheritUserRelatedGrantedGroups?: boolean) => Promise<void>): Promise<GrantedGroupsInheritanceSelectModalStatus | undefined>
- close(): Promise<GrantedGroupsInheritanceSelectModalStatus | undefined>
- }
- export const useGrantedGroupsInheritanceSelectModal = (
- status?: GrantedGroupsInheritanceSelectModalStatus,
- ): SWRResponse<GrantedGroupsInheritanceSelectModalStatus, Error> & GrantedGroupsInheritanceSelectModalStatusUtils => {
- const initialData: GrantedGroupsInheritanceSelectModalStatus = { isOpened: false };
- const swrResponse = useSWRStatic<GrantedGroupsInheritanceSelectModalStatus, Error>(
- 'grantedGroupsInheritanceSelectModalStatus', status, { fallbackData: initialData },
- );
- const { mutate } = swrResponse;
- return {
- ...swrResponse,
- open: useCallback(
- (onCreateBtnClick?: (onlyInheritUserRelatedGrantedGroups?: boolean) => Promise<void>) => mutate({ isOpened: true, onCreateBtnClick }), [mutate],
- ),
- close: useCallback(() => mutate({ isOpened: false }), [mutate]),
- };
- };
- /*
- * PutBackPageModal
- */
- export type IPageForPagePutBackModal = {
- pageId: string,
- path: string
- }
- export type IPutBackPageModalOption = {
- onPutBacked?: OnPutBackedFunction,
- }
- type PutBackPageModalStatus = {
- isOpened: boolean,
- page?: IPageForPagePutBackModal,
- opts?: IPutBackPageModalOption,
- }
- type PutBackPageModalUtils = {
- open(
- page?: IPageForPagePutBackModal,
- opts?: IPutBackPageModalOption,
- ): Promise<PutBackPageModalStatus | undefined>
- close(): Promise<PutBackPageModalStatus | undefined>
- }
- export const usePutBackPageModal = (status?: PutBackPageModalStatus): SWRResponse<PutBackPageModalStatus, Error> & PutBackPageModalUtils => {
- const initialData: PutBackPageModalStatus = useMemo(() => ({
- isOpened: false,
- page: { pageId: '', path: '' },
- }), []);
- const swrResponse = useSWRStatic<PutBackPageModalStatus, Error>('putBackPageModalStatus', status, { fallbackData: initialData });
- return {
- ...swrResponse,
- open: (
- page: IPageForPagePutBackModal, opts?: IPutBackPageModalOption,
- ) => swrResponse.mutate({
- isOpened: true, page, opts,
- }),
- close: () => swrResponse.mutate({ isOpened: false, page: { pageId: '', path: '' } }),
- };
- };
- /*
- * PagePresentationModal
- */
- type PresentationModalStatus = {
- isOpened: boolean,
- }
- type PresentationModalStatusUtils = {
- open(): Promise<PresentationModalStatus | undefined>
- close(): Promise<PresentationModalStatus | undefined>
- }
- export const usePagePresentationModal = (
- status?: PresentationModalStatus,
- ): SWRResponse<PresentationModalStatus, Error> & PresentationModalStatusUtils => {
- const initialData: PresentationModalStatus = {
- isOpened: false,
- };
- const swrResponse = useSWRStatic<PresentationModalStatus, Error>('presentationModalStatus', status, { fallbackData: initialData });
- return {
- ...swrResponse,
- open: () => swrResponse.mutate({ isOpened: true }, { revalidate: true }),
- close: () => swrResponse.mutate({ isOpened: false }),
- };
- };
- /*
- * PrivateLegacyPagesMigrationModal
- */
- export type ILegacyPrivatePage = { pageId: string, path: string };
- export type PrivateLegacyPagesMigrationModalSubmitedHandler = (pages: ILegacyPrivatePage[], isRecursively?: boolean) => void;
- type PrivateLegacyPagesMigrationModalStatus = {
- isOpened: boolean,
- pages?: ILegacyPrivatePage[],
- onSubmited?: PrivateLegacyPagesMigrationModalSubmitedHandler,
- }
- type PrivateLegacyPagesMigrationModalStatusUtils = {
- open(pages: ILegacyPrivatePage[], onSubmited?: PrivateLegacyPagesMigrationModalSubmitedHandler): Promise<PrivateLegacyPagesMigrationModalStatus | undefined>,
- close(): Promise<PrivateLegacyPagesMigrationModalStatus | undefined>,
- }
- export const usePrivateLegacyPagesMigrationModal = (
- status?: PrivateLegacyPagesMigrationModalStatus,
- ): SWRResponse<PrivateLegacyPagesMigrationModalStatus, Error> & PrivateLegacyPagesMigrationModalStatusUtils => {
- const initialData: PrivateLegacyPagesMigrationModalStatus = {
- isOpened: false,
- pages: [],
- };
- const swrResponse = useSWRStatic<PrivateLegacyPagesMigrationModalStatus, Error>('privateLegacyPagesMigrationModal', status, { fallbackData: initialData });
- return {
- ...swrResponse,
- open: (pages, onSubmited?) => swrResponse.mutate({
- isOpened: true, pages, onSubmited,
- }),
- close: () => swrResponse.mutate({ isOpened: false, pages: [], onSubmited: undefined }),
- };
- };
- /*
- * DescendantsPageListModal
- */
- type DescendantsPageListModalStatus = {
- isOpened: boolean,
- path?: string,
- }
- type DescendantsPageListUtils = {
- open(path: string): Promise<DescendantsPageListModalStatus | undefined>
- close(): Promise<DescendantsPageListModalStatus | undefined>
- }
- export const useDescendantsPageListModal = (
- status?: DescendantsPageListModalStatus,
- ): SWRResponse<DescendantsPageListModalStatus, Error> & DescendantsPageListUtils => {
- const initialData: DescendantsPageListModalStatus = { isOpened: false };
- const swrResponse = useSWRStatic<DescendantsPageListModalStatus, Error>('descendantsPageListModalStatus', status, { fallbackData: initialData });
- return {
- ...swrResponse,
- open: (path: string) => swrResponse.mutate({ isOpened: true, path }),
- close: () => swrResponse.mutate({ isOpened: false }),
- };
- };
- /*
- * UpdateUserGroupConfirmModal
- */
- type UpdateUserGroupConfirmModalStatus = {
- isOpened: boolean,
- targetGroup?: IUserGroupHasId,
- updateData?: Partial<IUserGroupHasId>,
- onConfirm?: (targetGroup: IUserGroupHasId, updateData: Partial<IUserGroupHasId>, forceUpdateParents: boolean) => any,
- }
- type UpdateUserGroupConfirmModalUtils = {
- open(targetGroup: IUserGroupHasId, updateData: Partial<IUserGroupHasId>, onConfirm?: (...args: any[]) => any): Promise<void>,
- close(): Promise<void>,
- }
- export const useUpdateUserGroupConfirmModal = (): SWRResponse<UpdateUserGroupConfirmModalStatus, Error> & UpdateUserGroupConfirmModalUtils => {
- const initialStatus: UpdateUserGroupConfirmModalStatus = { isOpened: false };
- const swrResponse = useSWRStatic<UpdateUserGroupConfirmModalStatus, Error>('updateParentConfirmModal', undefined, { fallbackData: initialStatus });
- return {
- ...swrResponse,
- async open(targetGroup: IUserGroupHasId, updateData: Partial<IUserGroupHasId>, onConfirm?: (...args: any[]) => any) {
- await swrResponse.mutate({
- isOpened: true, targetGroup, updateData, onConfirm,
- });
- },
- async close() {
- await swrResponse.mutate({ isOpened: false });
- },
- };
- };
- /*
- * DrawioModal
- */
- type DrawioModalSaveHandler = (drawioMxFile: string) => void;
- type DrawioModalStatus = {
- isOpened: boolean,
- drawioMxFile: string,
- onSave?: DrawioModalSaveHandler,
- }
- type DrawioModalStatusUtils = {
- open(
- drawioMxFile: string,
- onSave?: DrawioModalSaveHandler,
- ): void,
- close(): void,
- }
- export const useDrawioModal = (status?: DrawioModalStatus): SWRResponse<DrawioModalStatus, Error> & DrawioModalStatusUtils => {
- const initialData: DrawioModalStatus = {
- isOpened: false,
- drawioMxFile: '',
- };
- const swrResponse = useSWRStatic<DrawioModalStatus, Error>('drawioModalStatus', status, { fallbackData: initialData });
- const { mutate } = swrResponse;
- const open = useCallback((drawioMxFile: string, onSave?: DrawioModalSaveHandler): void => {
- mutate({ isOpened: true, drawioMxFile, onSave });
- }, [mutate]);
- const close = useCallback((): void => {
- mutate({ isOpened: false, drawioMxFile: '', onSave: undefined });
- }, [mutate]);
- return {
- ...swrResponse,
- open,
- close,
- };
- };
- /*
- * HandsonTableModal
- */
- type HandsonTableModalSaveHandler = (table: MarkdownTable) => void;
- type HandsontableModalStatus = {
- isOpened: boolean,
- table: MarkdownTable,
- autoFormatMarkdownTable?: boolean,
- // onSave is passed only when editing table directly from the page.
- onSave?: HandsonTableModalSaveHandler
- }
- type HandsontableModalStatusUtils = {
- open(
- table: MarkdownTable,
- autoFormatMarkdownTable?: boolean,
- onSave?: HandsonTableModalSaveHandler
- ): void
- close(): void
- }
- const defaultMarkdownTable = () => {
- return new MarkdownTable(
- [
- ['col1', 'col2', 'col3'],
- ['', '', ''],
- ['', '', ''],
- ],
- {
- align: ['', '', ''],
- },
- );
- };
- export const useHandsontableModal = (status?: HandsontableModalStatus): SWRResponse<HandsontableModalStatus, Error> & HandsontableModalStatusUtils => {
- const initialData: HandsontableModalStatus = {
- isOpened: false,
- table: defaultMarkdownTable(),
- autoFormatMarkdownTable: false,
- };
- const swrResponse = useSWRStatic<HandsontableModalStatus, Error>('handsontableModalStatus', status, { fallbackData: initialData });
- const { mutate } = swrResponse;
- const open = useCallback((table: MarkdownTable, autoFormatMarkdownTable?: boolean, onSave?: HandsonTableModalSaveHandler): void => {
- mutate({
- isOpened: true, table, autoFormatMarkdownTable, onSave,
- });
- }, [mutate]);
- const close = useCallback((): void => {
- mutate({
- isOpened: false, table: defaultMarkdownTable(), autoFormatMarkdownTable: false, onSave: undefined,
- });
- }, [mutate]);
- return {
- ...swrResponse,
- open,
- close,
- };
- };
- /*
- * ConflictDiffModal
- */
- type ResolveConflictHandler = (newMarkdown: string) => Promise<void> | void;
- type ConflictDiffModalStatus = {
- isOpened: boolean,
- requestRevisionBody?: string,
- onResolve?: ResolveConflictHandler
- }
- type ConflictDiffModalUtils = {
- open(requestRevisionBody: string, onResolveConflict: ResolveConflictHandler): void,
- close(): void,
- }
- export const useConflictDiffModal = (): SWRResponse<ConflictDiffModalStatus, Error> & ConflictDiffModalUtils => {
- const initialStatus: ConflictDiffModalStatus = { isOpened: false };
- const swrResponse = useSWRStatic<ConflictDiffModalStatus, Error>('conflictDiffModal', undefined, { fallbackData: initialStatus });
- const { mutate } = swrResponse;
- const open = useCallback((requestRevisionBody: string, onResolve: ResolveConflictHandler) => {
- mutate({ isOpened: true, requestRevisionBody, onResolve });
- }, [mutate]);
- const close = useCallback(() => {
- mutate({ isOpened: false });
- }, [mutate]);
- return {
- ...swrResponse,
- open,
- close,
- };
- };
- /*
- * BookmarkFolderDeleteModal
- */
- export type IDeleteBookmarkFolderModalOption = {
- onDeleted?: onDeletedBookmarkFolderFunction,
- }
- type DeleteBookmarkFolderModalStatus = {
- isOpened: boolean,
- bookmarkFolder?: BookmarkFolderItems,
- opts?: IDeleteBookmarkFolderModalOption,
- }
- type DeleteModalBookmarkFolderStatusUtils = {
- open(
- bookmarkFolder?: BookmarkFolderItems,
- opts?: IDeleteBookmarkFolderModalOption,
- ): Promise<DeleteBookmarkFolderModalStatus | undefined>,
- close(): Promise<DeleteBookmarkFolderModalStatus | undefined>,
- }
- export const useBookmarkFolderDeleteModal = (status?: DeleteBookmarkFolderModalStatus):
- SWRResponse<DeleteBookmarkFolderModalStatus, Error> & DeleteModalBookmarkFolderStatusUtils => {
- const initialData: DeleteBookmarkFolderModalStatus = {
- isOpened: false,
- };
- const swrResponse = useSWRStatic<DeleteBookmarkFolderModalStatus, Error>('deleteBookmarkFolderModalStatus', status, { fallbackData: initialData });
- return {
- ...swrResponse,
- open: (
- bookmarkFolder?: BookmarkFolderItems,
- opts?: IDeleteBookmarkFolderModalOption,
- ) => swrResponse.mutate({
- isOpened: true, bookmarkFolder, opts,
- }),
- close: () => swrResponse.mutate({ isOpened: false }),
- };
- };
- /**
- * DeleteAttachmentModal
- */
- type Remove =
- (body: {
- attachment_id: string;
- }) => Promise<void>
- type DeleteAttachmentModalStatus = {
- isOpened: boolean,
- attachment?: IAttachmentHasId,
- remove?: Remove,
- }
- type DeleteAttachmentModalUtils = {
- open(
- attachment: IAttachmentHasId,
- remove: Remove,
- ): void,
- close(): void,
- }
- export const useDeleteAttachmentModal = (): SWRResponse<DeleteAttachmentModalStatus, Error> & DeleteAttachmentModalUtils => {
- const initialStatus: DeleteAttachmentModalStatus = {
- isOpened: false,
- attachment: undefined,
- remove: undefined,
- };
- const swrResponse = useSWRStatic<DeleteAttachmentModalStatus, Error>('deleteAttachmentModal', undefined, { fallbackData: initialStatus });
- const { mutate } = swrResponse;
- const open = useCallback((attachment: IAttachmentHasId, remove: Remove) => {
- mutate({ isOpened: true, attachment, remove });
- }, [mutate]);
- const close = useCallback(() => {
- mutate({ isOpened: false });
- }, [mutate]);
- return {
- ...swrResponse,
- open,
- close,
- };
- };
- /*
- * PageSelectModal
- */
- type IPageSelectModalOption = {
- isHierarchicalSelectionMode?: boolean,
- onSelected?: OnSelectedFunction,
- }
- type PageSelectModalStatus = {
- isOpened: boolean
- opts?: IPageSelectModalOption
- }
- type PageSelectModalStatusUtils = {
- open(opts?: IPageSelectModalOption): void
- close(): void
- }
- export const usePageSelectModal = (
- status?: PageSelectModalStatus,
- ): SWRResponse<PageSelectModalStatus, Error> & PageSelectModalStatusUtils => {
- const initialStatus = { isOpened: false };
- const swrResponse = useSWRStatic<PageSelectModalStatus, Error>('PageSelectModal', status, { fallbackData: initialStatus });
- return {
- ...swrResponse,
- open: (
- opts?: IPageSelectModalOption,
- ) => swrResponse.mutate({
- isOpened: true, opts,
- }),
- close: () => swrResponse.mutate({ isOpened: false }),
- };
- };
- /*
- * OverwriteMergeModeModal
- */
|