context.tsx 10 KB

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