modal.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. import { SWRResponse } from 'swr';
  2. import { useStaticSWR } from './use-static-swr';
  3. import {
  4. OnDuplicatedFunction, OnRenamedFunction, OnDeletedFunction, OnPutBackedFunction,
  5. } from '~/interfaces/ui';
  6. import { IPageToDeleteWithMeta, IPageToRenameWithMeta } from '~/interfaces/page';
  7. /*
  8. * PageCreateModal
  9. */
  10. type CreateModalStatus = {
  11. isOpened: boolean,
  12. path?: string,
  13. }
  14. type CreateModalStatusUtils = {
  15. open(path?: string): Promise<CreateModalStatus | undefined>
  16. close(): Promise<CreateModalStatus | undefined>
  17. }
  18. export const usePageCreateModal = (status?: CreateModalStatus): SWRResponse<CreateModalStatus, Error> & CreateModalStatusUtils => {
  19. const initialData: CreateModalStatus = { isOpened: false };
  20. const swrResponse = useStaticSWR<CreateModalStatus, Error>('pageCreateModalStatus', status, { fallbackData: initialData });
  21. return {
  22. ...swrResponse,
  23. open: (path?: string) => swrResponse.mutate({ isOpened: true, path }),
  24. close: () => swrResponse.mutate({ isOpened: false }),
  25. };
  26. };
  27. export type IDeleteModalOption = {
  28. onDeleted?: OnDeletedFunction,
  29. }
  30. type DeleteModalStatus = {
  31. isOpened: boolean,
  32. pages?: IPageToDeleteWithMeta[],
  33. opts?: IDeleteModalOption,
  34. }
  35. type DeleteModalStatusUtils = {
  36. open(
  37. pages?: IPageToDeleteWithMeta[],
  38. opts?: IDeleteModalOption,
  39. ): Promise<DeleteModalStatus | undefined>,
  40. close(): Promise<DeleteModalStatus | undefined>,
  41. }
  42. export const usePageDeleteModal = (status?: DeleteModalStatus): SWRResponse<DeleteModalStatus, Error> & DeleteModalStatusUtils => {
  43. const initialData: DeleteModalStatus = {
  44. isOpened: false,
  45. pages: [],
  46. };
  47. const swrResponse = useStaticSWR<DeleteModalStatus, Error>('deleteModalStatus', status, { fallbackData: initialData });
  48. return {
  49. ...swrResponse,
  50. open: (
  51. pages?: IPageToDeleteWithMeta[],
  52. opts?: IDeleteModalOption,
  53. ) => swrResponse.mutate({
  54. isOpened: true, pages, opts,
  55. }),
  56. close: () => swrResponse.mutate({ isOpened: false }),
  57. };
  58. };
  59. /*
  60. * PageDuplicateModal
  61. */
  62. export type IPageForPageDuplicateModal = {
  63. pageId: string,
  64. path: string
  65. }
  66. export type IDuplicateModalOption = {
  67. onDuplicated?: OnDuplicatedFunction,
  68. }
  69. type DuplicateModalStatus = {
  70. isOpened: boolean,
  71. page?: IPageForPageDuplicateModal,
  72. opts?: IDuplicateModalOption,
  73. }
  74. type DuplicateModalStatusUtils = {
  75. open(
  76. page?: IPageForPageDuplicateModal,
  77. opts?: IDuplicateModalOption
  78. ): Promise<DuplicateModalStatus | undefined>
  79. close(): Promise<DuplicateModalStatus | undefined>
  80. }
  81. export const usePageDuplicateModal = (status?: DuplicateModalStatus): SWRResponse<DuplicateModalStatus, Error> & DuplicateModalStatusUtils => {
  82. const initialData: DuplicateModalStatus = { isOpened: false, page: { pageId: '', path: '/' } };
  83. const swrResponse = useStaticSWR<DuplicateModalStatus, Error>('duplicateModalStatus', status, { fallbackData: initialData });
  84. return {
  85. ...swrResponse,
  86. open: (
  87. page?: IPageForPageDuplicateModal,
  88. opts?: IDuplicateModalOption,
  89. ) => swrResponse.mutate({ isOpened: true, page, opts }),
  90. close: () => swrResponse.mutate({ isOpened: false, page: { pageId: '', path: '/' } }),
  91. };
  92. };
  93. /*
  94. * PageRenameModal
  95. */
  96. export type IRenameModalOption = {
  97. onRenamed?: OnRenamedFunction,
  98. }
  99. type RenameModalStatus = {
  100. isOpened: boolean,
  101. page?: IPageToRenameWithMeta,
  102. opts?: IRenameModalOption
  103. }
  104. type RenameModalStatusUtils = {
  105. open(
  106. page?: IPageToRenameWithMeta,
  107. opts?: IRenameModalOption
  108. ): Promise<RenameModalStatus | undefined>
  109. close(): Promise<RenameModalStatus | undefined>
  110. }
  111. export const usePageRenameModal = (status?: RenameModalStatus): SWRResponse<RenameModalStatus, Error> & RenameModalStatusUtils => {
  112. const initialData: RenameModalStatus = { isOpened: false };
  113. const swrResponse = useStaticSWR<RenameModalStatus, Error>('renameModalStatus', status, { fallbackData: initialData });
  114. return {
  115. ...swrResponse,
  116. open: (
  117. page?: IPageToRenameWithMeta,
  118. opts?: IRenameModalOption,
  119. ) => swrResponse.mutate({
  120. isOpened: true, page, opts,
  121. }),
  122. close: () => swrResponse.mutate({ isOpened: false }),
  123. };
  124. };
  125. /*
  126. * PutBackPageModal
  127. */
  128. export type IPageForPagePutBackModal = {
  129. pageId: string,
  130. path: string
  131. }
  132. export type IPutBackPageModalOption = {
  133. onPutBacked?: OnPutBackedFunction,
  134. }
  135. type PutBackPageModalStatus = {
  136. isOpened: boolean,
  137. page?: IPageForPagePutBackModal,
  138. opts?: IPutBackPageModalOption,
  139. }
  140. type PutBackPageModalUtils = {
  141. open(
  142. page?: IPageForPagePutBackModal,
  143. opts?: IPutBackPageModalOption,
  144. ): Promise<PutBackPageModalStatus | undefined>
  145. close():Promise<PutBackPageModalStatus | undefined>
  146. }
  147. export const usePutBackPageModal = (status?: PutBackPageModalStatus): SWRResponse<PutBackPageModalStatus, Error> & PutBackPageModalUtils => {
  148. const initialData: PutBackPageModalStatus = {
  149. isOpened: false,
  150. page: { pageId: '', path: '' },
  151. };
  152. const swrResponse = useStaticSWR<PutBackPageModalStatus, Error>('putBackPageModalStatus', status, { fallbackData: initialData });
  153. return {
  154. ...swrResponse,
  155. open: (
  156. page: IPageForPagePutBackModal, opts?: IPutBackPageModalOption,
  157. ) => swrResponse.mutate({
  158. isOpened: true, page, opts,
  159. }),
  160. close: () => swrResponse.mutate({ isOpened: false, page: { pageId: '', path: '' } }),
  161. };
  162. };
  163. /*
  164. * PagePresentationModal
  165. */
  166. type PresentationModalStatus = {
  167. isOpened: boolean,
  168. href?: string
  169. }
  170. type PresentationModalStatusUtils = {
  171. open(href: string): Promise<PresentationModalStatus | undefined>
  172. close(): Promise<PresentationModalStatus | undefined>
  173. }
  174. export const usePagePresentationModal = (
  175. status?: PresentationModalStatus,
  176. ): SWRResponse<PresentationModalStatus, Error> & PresentationModalStatusUtils => {
  177. const initialData: PresentationModalStatus = {
  178. isOpened: false, href: '?presentation=1',
  179. };
  180. const swrResponse = useStaticSWR<PresentationModalStatus, Error>('presentationModalStatus', status, { fallbackData: initialData });
  181. return {
  182. ...swrResponse,
  183. open: (href: string) => swrResponse.mutate({ isOpened: true, href }),
  184. close: () => swrResponse.mutate({ isOpened: false }),
  185. };
  186. };
  187. /*
  188. * LegacyPrivatePagesMigrationModal
  189. */
  190. export type ILegacyPrivatePage = { pageId: string, path: string };
  191. export type LegacyPrivatePagesMigrationModalSubmitedHandler = (pages: ILegacyPrivatePage[], isRecursively?: boolean) => void;
  192. type LegacyPrivatePagesMigrationModalStatus = {
  193. isOpened: boolean,
  194. pages?: ILegacyPrivatePage[],
  195. onSubmited?: LegacyPrivatePagesMigrationModalSubmitedHandler,
  196. }
  197. type LegacyPrivatePagesMigrationModalStatusUtils = {
  198. open(pages: ILegacyPrivatePage[], onSubmited?: LegacyPrivatePagesMigrationModalSubmitedHandler): Promise<LegacyPrivatePagesMigrationModalStatus | undefined>,
  199. close(): Promise<LegacyPrivatePagesMigrationModalStatus | undefined>,
  200. }
  201. export const useLegacyPrivatePagesMigrationModal = (
  202. status?: LegacyPrivatePagesMigrationModalStatus,
  203. ): SWRResponse<LegacyPrivatePagesMigrationModalStatus, Error> & LegacyPrivatePagesMigrationModalStatusUtils => {
  204. const initialData: LegacyPrivatePagesMigrationModalStatus = {
  205. isOpened: false,
  206. pages: [],
  207. };
  208. const swrResponse = useStaticSWR<LegacyPrivatePagesMigrationModalStatus, Error>('legacyPrivatePagesMigrationModal', status, { fallbackData: initialData });
  209. return {
  210. ...swrResponse,
  211. open: (pages, onSubmited?) => swrResponse.mutate({
  212. isOpened: true, pages, onSubmited,
  213. }),
  214. close: () => swrResponse.mutate({ isOpened: false, pages: [], onSubmited: undefined }),
  215. };
  216. };
  217. /*
  218. * DescendantsPageListModal
  219. */
  220. type DescendantsPageListModalStatus = {
  221. isOpened: boolean,
  222. path?: string,
  223. }
  224. type DescendantsPageListUtils = {
  225. open(path: string): Promise<DescendantsPageListModalStatus | undefined>
  226. close(): Promise<DuplicateModalStatus | undefined>
  227. }
  228. export const useDescendantsPageListModal = (
  229. status?: DescendantsPageListModalStatus,
  230. ): SWRResponse<DescendantsPageListModalStatus, Error> & DescendantsPageListUtils => {
  231. const initialData: DescendantsPageListModalStatus = { isOpened: false };
  232. const swrResponse = useStaticSWR<DescendantsPageListModalStatus, Error>('descendantsPageListModalStatus', status, { fallbackData: initialData });
  233. return {
  234. ...swrResponse,
  235. open: (path: string) => swrResponse.mutate({ isOpened: true, path }),
  236. close: () => swrResponse.mutate({ isOpened: false }),
  237. };
  238. };
  239. /*
  240. * PageAccessoriesModal
  241. */
  242. export const PageAccessoriesModalContents = {
  243. PageHistory: 'PageHistory',
  244. Attachment: 'Attachment',
  245. ShareLink: 'ShareLink',
  246. } as const;
  247. export type PageAccessoriesModalContents = typeof PageAccessoriesModalContents[keyof typeof PageAccessoriesModalContents];
  248. type PageAccessoriesModalStatus = {
  249. isOpened: boolean,
  250. onOpened?: (initialActivatedContents: PageAccessoriesModalContents) => void,
  251. }
  252. type PageAccessoriesModalUtils = {
  253. open(activatedContents: PageAccessoriesModalContents): void
  254. close(): void
  255. }
  256. export const usePageAccessoriesModal = (): SWRResponse<PageAccessoriesModalStatus, Error> & PageAccessoriesModalUtils => {
  257. const initialStatus = { isOpened: false };
  258. const swrResponse = useStaticSWR<PageAccessoriesModalStatus, Error>('pageAccessoriesModalStatus', undefined, { fallbackData: initialStatus });
  259. return {
  260. ...swrResponse,
  261. open: (activatedContents: PageAccessoriesModalContents) => {
  262. if (swrResponse.data == null) {
  263. return;
  264. }
  265. swrResponse.mutate({ isOpened: true });
  266. if (swrResponse.data.onOpened != null) {
  267. swrResponse.data.onOpened(activatedContents);
  268. }
  269. },
  270. close: () => {
  271. if (swrResponse.data == null) {
  272. return;
  273. }
  274. swrResponse.mutate({ isOpened: false });
  275. },
  276. };
  277. };