modal.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import { SWRResponse } from 'swr';
  2. import { useStaticSWR } from './use-static-swr';
  3. import { Nullable } from '~/interfaces/common';
  4. /*
  5. * PageCreateModal
  6. */
  7. type CreateModalStatus = {
  8. isOpened: boolean,
  9. path?: string,
  10. }
  11. type CreateModalStatusUtils = {
  12. open(path?: string): Promise<CreateModalStatus | undefined>
  13. close(): Promise<CreateModalStatus | undefined>
  14. }
  15. export const usePageCreateModal = (status?: CreateModalStatus): SWRResponse<CreateModalStatus, Error> & CreateModalStatusUtils => {
  16. const initialData: CreateModalStatus = { isOpened: false };
  17. const swrResponse = useStaticSWR<CreateModalStatus, Error>('pageCreateModalStatus', status, { fallbackData: initialData });
  18. return {
  19. ...swrResponse,
  20. open: (path?: string) => swrResponse.mutate({ isOpened: true, path }),
  21. close: () => swrResponse.mutate({ isOpened: false }),
  22. };
  23. };
  24. /*
  25. * PageDeleteModal
  26. */
  27. export type IPageForPageDeleteModal = {
  28. pageId: string,
  29. revisionId?: string,
  30. path: string
  31. }
  32. export type OnDeletedFunction = (pathOrPaths: string | string[], isRecursively: Nullable<true>, isCompletely: Nullable<true>) => void;
  33. type DeleteModalStatus = {
  34. isOpened: boolean,
  35. pages?: IPageForPageDeleteModal[],
  36. onDeleted?: OnDeletedFunction,
  37. }
  38. type DeleteModalStatusUtils = {
  39. open(pages?: IPageForPageDeleteModal[], onDeleted?: OnDeletedFunction): Promise<DeleteModalStatus | undefined>,
  40. close(): Promise<DeleteModalStatus | undefined>,
  41. }
  42. export const usePageDeleteModal = (status?: DeleteModalStatus): SWRResponse<DeleteModalStatus, Error> & DeleteModalStatusUtils => {
  43. const initialData: DeleteModalStatus = { isOpened: false, pages: [], onDeleted: () => {} };
  44. const swrResponse = useStaticSWR<DeleteModalStatus, Error>('deleteModalStatus', status, { fallbackData: initialData });
  45. return {
  46. ...swrResponse,
  47. open: (pages?: IPageForPageDeleteModal[], onDeleted?: OnDeletedFunction) => swrResponse.mutate({ isOpened: true, pages, onDeleted }),
  48. close: () => swrResponse.mutate({ isOpened: false }),
  49. };
  50. };
  51. /*
  52. * PageDuplicateModal
  53. */
  54. export type IPageForPageDuplicateModal = {
  55. pageId: string,
  56. path: string
  57. }
  58. type DuplicateModalStatus = {
  59. isOpened: boolean,
  60. pageId?: string,
  61. path?: string,
  62. }
  63. type DuplicateModalStatusUtils = {
  64. open(pageId: string, path: string): Promise<DuplicateModalStatus | undefined>
  65. close(): Promise<DuplicateModalStatus | undefined>
  66. }
  67. export const usePageDuplicateModal = (status?: DuplicateModalStatus): SWRResponse<DuplicateModalStatus, Error> & DuplicateModalStatusUtils => {
  68. const initialData: DuplicateModalStatus = { isOpened: false, pageId: '', path: '' };
  69. const swrResponse = useStaticSWR<DuplicateModalStatus, Error>('duplicateModalStatus', status, { fallbackData: initialData });
  70. return {
  71. ...swrResponse,
  72. open: (pageId: string, path: string) => swrResponse.mutate({ isOpened: true, pageId, path }),
  73. close: () => swrResponse.mutate({ isOpened: false }),
  74. };
  75. };
  76. /*
  77. * PageRenameModal
  78. */
  79. export type IPageForPageRenameModal = {
  80. pageId: string,
  81. revisionId: string,
  82. path: string
  83. }
  84. type RenameModalStatus = {
  85. isOpened: boolean,
  86. pageId?: string,
  87. revisionId?: string
  88. path?: string,
  89. }
  90. type RenameModalStatusUtils = {
  91. open(pageId: string, revisionId: string, path: string): Promise<RenameModalStatus | undefined>
  92. close(): Promise<RenameModalStatus | undefined>
  93. }
  94. export const usePageRenameModal = (status?: RenameModalStatus): SWRResponse<RenameModalStatus, Error> & RenameModalStatusUtils => {
  95. const initialData: RenameModalStatus = {
  96. isOpened: false, pageId: '', revisionId: '', path: '',
  97. };
  98. const swrResponse = useStaticSWR<RenameModalStatus, Error>('renameModalStatus', status, { fallbackData: initialData });
  99. return {
  100. ...swrResponse,
  101. open: (pageId: string, revisionId: string, path: string) => swrResponse.mutate({
  102. isOpened: true, pageId, revisionId, path,
  103. }),
  104. close: () => swrResponse.mutate({ isOpened: false }),
  105. };
  106. };
  107. /*
  108. * PagePresentationModal
  109. */
  110. type PresentationModalStatus = {
  111. isOpened: boolean,
  112. href?: string
  113. }
  114. type PresentationModalStatusUtils = {
  115. open(href: string): Promise<PresentationModalStatus | undefined>
  116. close(): Promise<PresentationModalStatus | undefined>
  117. }
  118. export const usePagePresentationModal = (
  119. status?: PresentationModalStatus,
  120. ): SWRResponse<PresentationModalStatus, Error> & PresentationModalStatusUtils => {
  121. const initialData: PresentationModalStatus = {
  122. isOpened: false, href: '?presentation=1',
  123. };
  124. const swrResponse = useStaticSWR<PresentationModalStatus, Error>('presentationModalStatus', status, { fallbackData: initialData });
  125. return {
  126. ...swrResponse,
  127. open: (href: string) => swrResponse.mutate({ isOpened: true, href }),
  128. close: () => swrResponse.mutate({ isOpened: false }),
  129. };
  130. };
  131. /*
  132. * DescendantsPageListModal
  133. */
  134. type DescendantsPageListModalStatus = {
  135. isOpened: boolean,
  136. path?: string,
  137. }
  138. type DescendantsPageListUtils = {
  139. open(path: string): Promise<DescendantsPageListModalStatus | undefined>
  140. close(): Promise<DuplicateModalStatus | undefined>
  141. }
  142. export const useDescendantsPageListModal = (
  143. status?: DescendantsPageListModalStatus,
  144. ): SWRResponse<DescendantsPageListModalStatus, Error> & DescendantsPageListUtils => {
  145. const initialData: DescendantsPageListModalStatus = { isOpened: false };
  146. const swrResponse = useStaticSWR<DescendantsPageListModalStatus, Error>('descendantsPageListModalStatus', status, { fallbackData: initialData });
  147. return {
  148. ...swrResponse,
  149. open: (path: string) => swrResponse.mutate({ isOpened: true, path }),
  150. close: () => swrResponse.mutate({ isOpened: false }),
  151. };
  152. };
  153. /*
  154. * PageAccessoriesModal
  155. */
  156. export const PageAccessoriesModalContents = {
  157. PageHistory: 'PageHistory',
  158. Attachment: 'Attachment',
  159. ShareLink: 'ShareLink',
  160. } as const;
  161. export type PageAccessoriesModalContents = typeof PageAccessoriesModalContents[keyof typeof PageAccessoriesModalContents];
  162. type PageAccessoriesModalStatus = {
  163. isOpened: boolean,
  164. onOpened?: (initialActivatedContents: PageAccessoriesModalContents) => void,
  165. }
  166. type PageAccessoriesModalUtils = {
  167. open(activatedContents: PageAccessoriesModalContents): void
  168. close(): void
  169. }
  170. export const usePageAccessoriesModal = (): SWRResponse<PageAccessoriesModalStatus, Error> & PageAccessoriesModalUtils => {
  171. const initialStatus = { isOpened: false };
  172. const swrResponse = useStaticSWR<PageAccessoriesModalStatus, Error>('pageAccessoriesModalStatus', undefined, { fallbackData: initialStatus });
  173. return {
  174. ...swrResponse,
  175. open: (activatedContents: PageAccessoriesModalContents) => {
  176. if (swrResponse.data == null) {
  177. return;
  178. }
  179. swrResponse.mutate({ isOpened: true });
  180. if (swrResponse.data.onOpened != null) {
  181. swrResponse.data.onOpened(activatedContents);
  182. }
  183. },
  184. close: () => {
  185. if (swrResponse.data == null) {
  186. return;
  187. }
  188. swrResponse.mutate({ isOpened: false });
  189. },
  190. };
  191. };