context.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import { IUser, pagePathUtils } from '@growi/core';
  2. import { HtmlElementNode } from 'rehype-toc';
  3. import { Key, SWRResponse, useSWRConfig } from 'swr';
  4. import useSWRImmutable from 'swr/immutable';
  5. import { SupportedActionType } from '~/interfaces/activity';
  6. import { EditorConfig } from '~/interfaces/editor-settings';
  7. // import { CustomWindow } from '~/interfaces/global';
  8. import { RendererConfig } from '~/interfaces/services/renderer';
  9. import { GrowiThemes } from '~/interfaces/theme';
  10. import InterceptorManager from '~/services/interceptor-manager';
  11. import { TargetAndAncestors } from '../interfaces/page-listing-results';
  12. import { useContextSWR } from './use-context-swr';
  13. import { useStaticSWR } from './use-static-swr';
  14. type Nullable<T> = T | null;
  15. export const useInterceptorManager = (): SWRResponse<InterceptorManager, Error> => {
  16. return useContextSWR<InterceptorManager, Error>('interceptorManager', undefined, { fallbackData: new InterceptorManager() });
  17. };
  18. export const useCsrfToken = (initialData?: string): SWRResponse<string, Error> => {
  19. return useContextSWR<string, Error>('csrfToken', initialData);
  20. };
  21. export const useAppTitle = (initialData?: string): SWRResponse<string, Error> => {
  22. return useContextSWR('appTitle', initialData);
  23. };
  24. export const useSiteUrl = (initialData?: string): SWRResponse<string, Error> => {
  25. return useContextSWR<string, Error>('siteUrl', initialData);
  26. };
  27. export const useConfidential = (initialData?: string): SWRResponse<string, Error> => {
  28. return useContextSWR('confidential', initialData);
  29. };
  30. export const useGrowiTheme = (initialData?: GrowiThemes): SWRResponse<GrowiThemes, Error> => {
  31. return useContextSWR('theme', initialData);
  32. };
  33. export const useCurrentUser = (initialData?: Nullable<IUser>): SWRResponse<Nullable<IUser>, Error> => {
  34. return useContextSWR<Nullable<IUser>, Error>('currentUser', initialData);
  35. };
  36. export const useCurrentPathname = (initialData?: string): SWRResponse<string, Error> => {
  37. return useContextSWR('currentPathname', initialData);
  38. };
  39. export const useCurrentPageId = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  40. return useStaticSWR<Nullable<string>, Error>('currentPageId', initialData);
  41. };
  42. export const useIsIdenticalPath = (initialData?: boolean): SWRResponse<boolean, Error> => {
  43. return useContextSWR<boolean, Error>('isIdenticalPath', initialData, { fallbackData: false });
  44. };
  45. export const useIsForbidden = (initialData?: boolean): SWRResponse<boolean, Error> => {
  46. return useContextSWR<boolean, Error>('isForbidden', initialData, { fallbackData: false });
  47. };
  48. export const useIsNotFound = (initialData?: boolean): SWRResponse<boolean, Error> => {
  49. return useContextSWR<boolean, Error>('isNotFound', initialData, { fallbackData: false });
  50. };
  51. export const useTemplateTagData = (initialData?: string[]): SWRResponse<string[], Error> => {
  52. return useContextSWR<string[], Error>('templateTagData', initialData);
  53. };
  54. export const useIsSharedUser = (initialData?: boolean): SWRResponse<boolean, Error> => {
  55. return useContextSWR<boolean, Error>('isSharedUser', initialData);
  56. };
  57. export const useShareLinkId = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  58. return useContextSWR<Nullable<string>, Error>('shareLinkId', initialData);
  59. };
  60. export const useDisableLinkSharing = (initialData?: Nullable<boolean>): SWRResponse<Nullable<boolean>, Error> => {
  61. return useContextSWR<Nullable<boolean>, Error>('disableLinkSharing', initialData);
  62. };
  63. export const useRegistrationWhiteList = (initialData?: Nullable<string[]>): SWRResponse<Nullable<string[]>, Error> => {
  64. return useContextSWR<Nullable<string[]>, Error>('registrationWhiteList', initialData);
  65. };
  66. export const useDrawioUri = (initialData?: string): SWRResponse<string, Error> => {
  67. return useContextSWR('drawioUri', initialData, { fallbackData: 'https://embed.diagrams.net/' });
  68. };
  69. export const useHackmdUri = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  70. return useContextSWR<Nullable<string>, Error>('hackmdUri', initialData);
  71. };
  72. export const useIsSearchPage = (initialData?: Nullable<boolean>) : SWRResponse<Nullable<boolean>, Error> => {
  73. return useContextSWR<Nullable<any>, Error>('isSearchPage', initialData);
  74. };
  75. export const useTargetAndAncestors = (initialData?: TargetAndAncestors): SWRResponse<TargetAndAncestors, Error> => {
  76. return useContextSWR<TargetAndAncestors, Error>('targetAndAncestors', initialData);
  77. };
  78. export const useIsAclEnabled = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  79. return useContextSWR<boolean, Error>('isAclEnabled', initialData);
  80. };
  81. export const useIsSearchServiceConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  82. return useContextSWR<boolean, Error>('isSearchServiceConfigured', initialData);
  83. };
  84. export const useIsSearchServiceReachable = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  85. return useContextSWR<boolean, Error>('isSearchServiceReachable', initialData);
  86. };
  87. export const useIsMailerSetup = (initialData?: boolean): SWRResponse<boolean, any> => {
  88. return useContextSWR('isMailerSetup', initialData);
  89. };
  90. export const useIsSearchScopeChildrenAsDefault = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  91. return useContextSWR<boolean, Error>('isSearchScopeChildrenAsDefault', initialData, { fallbackData: false });
  92. };
  93. export const useIsSlackConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  94. return useContextSWR<boolean, Error>('isSlackConfigured', initialData);
  95. };
  96. export const useIsEnabledAttachTitleHeader = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  97. return useContextSWR<boolean, Error>('isEnabledAttachTitleHeader', initialData);
  98. };
  99. export const useIsIndentSizeForced = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  100. return useContextSWR<boolean, Error>('isIndentSizeForced', initialData, { fallbackData: false });
  101. };
  102. export const useDefaultIndentSize = (initialData?: number) : SWRResponse<number, Error> => {
  103. return useContextSWR<number, Error>('defaultIndentSize', initialData, { fallbackData: 4 });
  104. };
  105. export const useAuditLogEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
  106. return useContextSWR<boolean, Error>('auditLogEnabled', initialData, { fallbackData: false });
  107. };
  108. // TODO: initialize in [[..path]].page.tsx?
  109. export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse<number, Error> => {
  110. return useContextSWR<number, Error>('activityExpirationSeconds', initialData);
  111. };
  112. export const useAuditLogAvailableActions = (initialData?: Array<SupportedActionType>) : SWRResponse<Array<SupportedActionType>, Error> => {
  113. return useContextSWR<Array<SupportedActionType>, Error>('auditLogAvailableActions', initialData);
  114. };
  115. export const useGrowiVersion = (initialData?: string): SWRResponse<string, any> => {
  116. return useContextSWR('growiVersion', initialData);
  117. };
  118. export const useIsEnabledStaleNotification = (initialData?: boolean): SWRResponse<boolean, any> => {
  119. return useContextSWR('isEnabledStaleNotification', initialData);
  120. };
  121. export const useIsLatestRevision = (initialData?: boolean): SWRResponse<boolean, any> => {
  122. return useContextSWR('isLatestRevision', initialData);
  123. };
  124. export const useEditorConfig = (initialData?: EditorConfig): SWRResponse<EditorConfig, Error> => {
  125. return useContextSWR<EditorConfig, Error>('editorConfig', initialData);
  126. };
  127. export const useRendererConfig = (initialData?: RendererConfig): SWRResponse<RendererConfig, any> => {
  128. return useContextSWR('growiRendererConfig', initialData);
  129. };
  130. export const useIsAllReplyShown = (initialData?: boolean): SWRResponse<boolean, Error> => {
  131. return useContextSWR('isAllReplyShown', initialData);
  132. };
  133. export const useIsBlinkedHeaderAtBoot = (initialData?: boolean): SWRResponse<boolean, Error> => {
  134. return useContextSWR('isBlinkedAtBoot', initialData, { fallbackData: false });
  135. };
  136. export const useEditingMarkdown = (initialData?: string): SWRResponse<string, Error> => {
  137. return useContextSWR('currentMarkdown', initialData);
  138. };
  139. export const useIsUploadableImage = (initialData?: boolean): SWRResponse<boolean, Error> => {
  140. return useContextSWR('isUploadableImage', initialData);
  141. };
  142. export const useIsUploadableFile = (initialData?: boolean): SWRResponse<boolean, Error> => {
  143. return useContextSWR('isUploadableFile', initialData);
  144. };
  145. export const useShowPageLimitationL = (initialData?: number): SWRResponse<number, Error> => {
  146. return useContextSWR('showPageLimitationL', initialData);
  147. };
  148. export const useShowPageLimitationXL = (initialData?: number): SWRResponse<number, Error> => {
  149. return useContextSWR('showPageLimitationXL', initialData);
  150. };
  151. export const useCustomizeTitle = (initialData?: string): SWRResponse<string, Error> => {
  152. return useContextSWR('CustomizeTitle', initialData);
  153. };
  154. export const useCustomizedLogoSrc = (initialData?: string): SWRResponse<string, Error> => {
  155. return useContextSWR('customizedLogoSrc', initialData);
  156. };
  157. export const useGrowiCloudUri = (initialData?: string): SWRResponse<string, Error> => {
  158. return useStaticSWR('growiCloudUri', initialData);
  159. };
  160. export const useGrowiAppIdForGrowiCloud = (initialData?: number): SWRResponse<number, Error> => {
  161. return useStaticSWR('growiAppIdForGrowiCloud', initialData);
  162. };
  163. export const useIsContainerFluid = (initialData?: boolean): SWRResponse<boolean, Error> => {
  164. return useStaticSWR('isContainerFluid', initialData);
  165. };
  166. /** **********************************************************
  167. * Computed contexts
  168. *********************************************************** */
  169. export const useIsGuestUser = (): SWRResponse<boolean, Error> => {
  170. const { data: currentUser } = useCurrentUser();
  171. return useSWRImmutable(
  172. ['isGuestUser', currentUser],
  173. (key: Key, currentUser: IUser) => currentUser == null,
  174. { fallbackData: currentUser == null },
  175. );
  176. };
  177. export const useIsEditable = (): SWRResponse<boolean, Error> => {
  178. const { data: isGuestUser } = useIsGuestUser();
  179. const { data: isForbidden } = useIsForbidden();
  180. const { data: isIdenticalPath } = useIsIdenticalPath();
  181. return useSWRImmutable(
  182. ['isEditable', isGuestUser, isForbidden, isIdenticalPath],
  183. (key: Key, isGuestUser: boolean, isForbidden: boolean, isIdenticalPath: boolean) => {
  184. return (!isForbidden && !isIdenticalPath && !isGuestUser);
  185. },
  186. );
  187. };