context.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import { AcceptedUploadFileType } from '@growi/core';
  2. import type { ColorScheme, IUserHasId } from '@growi/core';
  3. import type { SWRResponse } from 'swr';
  4. import useSWR from 'swr';
  5. import useSWRImmutable from 'swr/immutable';
  6. import type { SupportedActionType } from '~/interfaces/activity';
  7. import type { RendererConfig } from '~/interfaces/services/renderer';
  8. import type { TargetAndAncestors } from '../interfaces/page-listing-results';
  9. import { useContextSWR } from './use-context-swr';
  10. import { useStaticSWR } from './use-static-swr';
  11. type Nullable<T> = T | null;
  12. export const useCsrfToken = (initialData?: string): SWRResponse<string, Error> => {
  13. return useContextSWR<string, Error>('csrfToken', initialData);
  14. };
  15. export const useAppTitle = (initialData?: string): SWRResponse<string, Error> => {
  16. return useContextSWR('appTitle', initialData);
  17. };
  18. export const useSiteUrl = (initialData?: string): SWRResponse<string, Error> => {
  19. return useContextSWR<string, Error>('siteUrl', initialData);
  20. };
  21. export const useConfidential = (initialData?: string): SWRResponse<string, Error> => {
  22. return useContextSWR('confidential', initialData);
  23. };
  24. export const useCurrentUser = (initialData?: Nullable<IUserHasId>): SWRResponse<Nullable<IUserHasId>, Error> => {
  25. return useContextSWR('currentUser', initialData);
  26. };
  27. export const useCurrentPathname = (initialData?: string): SWRResponse<string, Error> => {
  28. return useContextSWR('currentPathname', initialData);
  29. };
  30. export const useIsIdenticalPath = (initialData?: boolean): SWRResponse<boolean, Error> => {
  31. return useContextSWR<boolean, Error>('isIdenticalPath', initialData, { fallbackData: false });
  32. };
  33. export const useIsForbidden = (initialData?: boolean): SWRResponse<boolean, Error> => {
  34. return useContextSWR<boolean, Error>('isForbidden', initialData, { fallbackData: false });
  35. };
  36. export const useIsNotCreatable = (initialData?: boolean): SWRResponse<boolean, Error> => {
  37. return useContextSWR<boolean, Error>('isNotCreatable', initialData, { fallbackData: false });
  38. };
  39. export const useIsSharedUser = (initialData?: boolean): SWRResponse<boolean, Error> => {
  40. return useContextSWR<boolean, Error>('isSharedUser', initialData);
  41. };
  42. export const useShareLinkId = (initialData?: string): SWRResponse<string, Error> => {
  43. return useContextSWR('shareLinkId', initialData);
  44. };
  45. export const useDisableLinkSharing = (initialData?: Nullable<boolean>): SWRResponse<Nullable<boolean>, Error> => {
  46. return useContextSWR<Nullable<boolean>, Error>('disableLinkSharing', initialData);
  47. };
  48. export const useRegistrationWhitelist = (initialData?: Nullable<string[]>): SWRResponse<Nullable<string[]>, Error> => {
  49. return useContextSWR<Nullable<string[]>, Error>('registrationWhitelist', initialData);
  50. };
  51. export const useIsSearchPage = (initialData?: Nullable<boolean>) : SWRResponse<Nullable<boolean>, Error> => {
  52. return useContextSWR<Nullable<any>, Error>('isSearchPage', initialData);
  53. };
  54. export const useTargetAndAncestors = (initialData?: TargetAndAncestors): SWRResponse<TargetAndAncestors, Error> => {
  55. return useContextSWR<TargetAndAncestors, Error>('targetAndAncestors', initialData);
  56. };
  57. export const useIsAclEnabled = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  58. return useContextSWR<boolean, Error>('isAclEnabled', initialData);
  59. };
  60. export const useIsSearchServiceConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  61. return useContextSWR<boolean, Error>('isSearchServiceConfigured', initialData);
  62. };
  63. export const useIsSearchServiceReachable = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  64. return useContextSWR<boolean, Error>('isSearchServiceReachable', initialData);
  65. };
  66. export const useIsMailerSetup = (initialData?: boolean): SWRResponse<boolean, any> => {
  67. return useContextSWR('isMailerSetup', initialData);
  68. };
  69. export const useIsSearchScopeChildrenAsDefault = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  70. return useContextSWR<boolean, Error>('isSearchScopeChildrenAsDefault', initialData, { fallbackData: false });
  71. };
  72. export const useIsEnabledMarp = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  73. return useContextSWR<boolean, Error>('isEnabledMarp', initialData, { fallbackData: false });
  74. };
  75. export const useIsSlackConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  76. return useContextSWR<boolean, Error>('isSlackConfigured', initialData);
  77. };
  78. export const useIsEnabledAttachTitleHeader = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  79. return useContextSWR<boolean, Error>('isEnabledAttachTitleHeader', initialData);
  80. };
  81. export const useIsIndentSizeForced = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  82. return useContextSWR<boolean, Error>('isIndentSizeForced', initialData, { fallbackData: false });
  83. };
  84. export const useDefaultIndentSize = (initialData?: number) : SWRResponse<number, Error> => {
  85. return useContextSWR<number, Error>('defaultIndentSize', initialData, { fallbackData: 4 });
  86. };
  87. export const useAuditLogEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
  88. return useContextSWR<boolean, Error>('auditLogEnabled', initialData, { fallbackData: false });
  89. };
  90. export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse<number, Error> => {
  91. return useContextSWR<number, Error>('activityExpirationSeconds', initialData);
  92. };
  93. export const useAuditLogAvailableActions = (initialData?: Array<SupportedActionType>) : SWRResponse<Array<SupportedActionType>, Error> => {
  94. return useContextSWR<Array<SupportedActionType>, Error>('auditLogAvailableActions', initialData);
  95. };
  96. export const useGrowiVersion = (initialData?: string): SWRResponse<string, any> => {
  97. return useContextSWR('growiVersion', initialData);
  98. };
  99. export const useIsEnabledStaleNotification = (initialData?: boolean): SWRResponse<boolean, any> => {
  100. return useContextSWR('isEnabledStaleNotification', initialData);
  101. };
  102. export const useRendererConfig = (initialData?: RendererConfig): SWRResponse<RendererConfig, any> => {
  103. return useContextSWR('growiRendererConfig', initialData);
  104. };
  105. export const useIsAllReplyShown = (initialData?: boolean): SWRResponse<boolean, Error> => {
  106. return useContextSWR('isAllReplyShown', initialData);
  107. };
  108. export const useIsBlinkedHeaderAtBoot = (initialData?: boolean): SWRResponse<boolean, Error> => {
  109. return useContextSWR('isBlinkedAtBoot', initialData, { fallbackData: false });
  110. };
  111. export const useIsUploadEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
  112. return useContextSWR('isUploadEnabled', initialData);
  113. };
  114. export const useIsUploadAllFileAllowed = (initialData?: boolean): SWRResponse<boolean, Error> => {
  115. return useContextSWR('isUploadAllFileAllowed', initialData);
  116. };
  117. export const useShowPageLimitationL = (initialData?: number): SWRResponse<number, Error> => {
  118. return useContextSWR('showPageLimitationL', initialData);
  119. };
  120. export const useShowPageLimitationXL = (initialData?: number): SWRResponse<number, Error> => {
  121. return useContextSWR('showPageLimitationXL', initialData);
  122. };
  123. export const useCustomizeTitle = (initialData?: string): SWRResponse<string, Error> => {
  124. return useContextSWR('CustomizeTitle', initialData);
  125. };
  126. export const useIsDefaultLogo = (initialData?: boolean): SWRResponse<boolean, Error> => {
  127. return useContextSWR('isDefaultLogo', initialData);
  128. };
  129. export const useIsCustomizedLogoUploaded = (initialData?: boolean): SWRResponse<boolean, Error> => {
  130. return useStaticSWR('isCustomizedLogoUploaded', initialData);
  131. };
  132. export const useForcedColorScheme = (initialData?: ColorScheme): SWRResponse<ColorScheme, Error> => {
  133. return useContextSWR('forcedColorScheme', initialData);
  134. };
  135. export const useGrowiCloudUri = (initialData?: string): SWRResponse<string, Error> => {
  136. return useStaticSWR('growiCloudUri', initialData);
  137. };
  138. export const useGrowiAppIdForGrowiCloud = (initialData?: number): SWRResponse<number, Error> => {
  139. return useStaticSWR('growiAppIdForGrowiCloud', initialData);
  140. };
  141. export const useIsContainerFluid = (initialData?: boolean): SWRResponse<boolean, Error> => {
  142. return useStaticSWR('isContainerFluid', initialData);
  143. };
  144. /** **********************************************************
  145. * Computed contexts
  146. *********************************************************** */
  147. export const useIsGuestUser = (): SWRResponse<boolean, Error> => {
  148. const { data: currentUser, isLoading } = useCurrentUser();
  149. return useSWRImmutable(
  150. isLoading ? null : ['isGuestUser', currentUser?._id],
  151. ([, currentUserId]) => currentUserId == null,
  152. { fallbackData: currentUser?._id == null },
  153. );
  154. };
  155. export const useIsReadOnlyUser = (): SWRResponse<boolean, Error> => {
  156. const { data: currentUser, isLoading: isCurrentUserLoading } = useCurrentUser();
  157. const { data: isGuestUser, isLoading: isGuestUserLoding } = useIsGuestUser();
  158. const isLoading = isCurrentUserLoading || isGuestUserLoding;
  159. const isReadOnlyUser = !isGuestUser && !!currentUser?.readOnly;
  160. return useSWRImmutable(
  161. isLoading ? null : ['isReadOnlyUser', isReadOnlyUser, currentUser?._id],
  162. () => isReadOnlyUser,
  163. { fallbackData: isReadOnlyUser },
  164. );
  165. };
  166. export const useIsAdmin = (): SWRResponse<boolean, Error> => {
  167. const { data: currentUser, isLoading } = useCurrentUser();
  168. return useSWR(
  169. isLoading ? null : ['isAdminUser', currentUser?._id, currentUser?.admin],
  170. ([, , isAdmin]) => isAdmin ?? false,
  171. {
  172. fallbackData: currentUser?.admin ?? false,
  173. keepPreviousData: true,
  174. // disable all revalidation but revalidateIfStale
  175. revalidateOnMount: false,
  176. revalidateOnFocus: false,
  177. revalidateOnReconnect: false,
  178. },
  179. );
  180. };
  181. export const useIsEditable = (): SWRResponse<boolean, Error> => {
  182. const { data: isGuestUser } = useIsGuestUser();
  183. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  184. const { data: isForbidden } = useIsForbidden();
  185. const { data: isNotCreatable } = useIsNotCreatable();
  186. const { data: isIdenticalPath } = useIsIdenticalPath();
  187. return useSWRImmutable(
  188. ['isEditable', isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath],
  189. ([, isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath]) => {
  190. return (!isForbidden && !isIdenticalPath && !isNotCreatable && !isGuestUser && !isReadOnlyUser);
  191. },
  192. );
  193. };
  194. export const useAcceptedUploadFileType = (): SWRResponse<AcceptedUploadFileType, Error> => {
  195. const { data: isUploadEnabled } = useIsUploadEnabled();
  196. const { data: isUploadAllFileAllowed } = useIsUploadAllFileAllowed();
  197. return useSWRImmutable(
  198. ['acceptedUploadFileType', isUploadEnabled, isUploadAllFileAllowed],
  199. ([, isUploadEnabled, isUploadAllFileAllowed]) => {
  200. if (!isUploadEnabled) {
  201. return AcceptedUploadFileType.NONE;
  202. }
  203. if (isUploadAllFileAllowed) {
  204. return AcceptedUploadFileType.ALL;
  205. }
  206. return AcceptedUploadFileType.IMAGE;
  207. },
  208. );
  209. };