context.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import EventEmitter from 'events';
  2. import { Key, SWRResponse } from 'swr';
  3. import useSWRImmutable from 'swr/immutable';
  4. import { SupportedActionType } from '~/interfaces/activity';
  5. import { CustomWindow } from '~/interfaces/global';
  6. import { GrowiRendererConfig } from '~/interfaces/services/renderer';
  7. import InterceptorManager from '~/services/interceptor-manager';
  8. import { TargetAndAncestors } from '../interfaces/page-listing-results';
  9. import { IUser } from '../interfaces/user';
  10. import { useStaticSWR } from './use-static-swr';
  11. type Nullable<T> = T | null;
  12. export const useGlobalEventEmitter = (): SWRResponse<EventEmitter, Error> => {
  13. return useStaticSWR<EventEmitter, Error>('globalEventEmitter', undefined, { fallbackData: (window as CustomWindow).globalEmitter });
  14. };
  15. export const useInterceptorManager = (): SWRResponse<InterceptorManager, Error> => {
  16. return useStaticSWR<InterceptorManager, Error>('interceptorManager', undefined, { fallbackData: new InterceptorManager() });
  17. };
  18. export const useCsrfToken = (initialData?: string): SWRResponse<string, Error> => {
  19. return useStaticSWR<string, Error>('csrfToken', initialData);
  20. };
  21. export const useAppTitle = (initialData?: string): SWRResponse<string, Error> => {
  22. return useStaticSWR('appTitle', initialData);
  23. };
  24. export const useSiteUrl = (initialData?: string): SWRResponse<string, Error> => {
  25. return useStaticSWR<string, Error>('siteUrl', initialData);
  26. };
  27. export const useConfidential = (initialData?: string): SWRResponse<string, Error> => {
  28. return useStaticSWR('confidential', initialData);
  29. };
  30. export const useCurrentUser = (initialData?: Nullable<IUser>): SWRResponse<Nullable<IUser>, Error> => {
  31. return useStaticSWR<Nullable<IUser>, Error>('currentUser', initialData);
  32. };
  33. export const useRevisionId = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  34. return useStaticSWR<Nullable<any>, Error>('revisionId', initialData);
  35. };
  36. export const useCurrentPagePath = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  37. return useStaticSWR<Nullable<string>, Error>('currentPagePath', initialData);
  38. };
  39. export const useCurrentPathname = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  40. return useStaticSWR<Nullable<string>, Error>('currentPathname', initialData);
  41. };
  42. export const useCurrentPageId = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  43. return useStaticSWR<Nullable<string>, Error>('currentPageId', initialData);
  44. };
  45. export const useRevisionCreatedAt = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  46. return useStaticSWR<Nullable<any>, Error>('revisionCreatedAt', initialData);
  47. };
  48. export const useCurrentUpdatedAt = (initialData?: Nullable<Date>): SWRResponse<Nullable<Date>, Error> => {
  49. return useStaticSWR<Nullable<Date>, Error>('updatedAt', initialData);
  50. };
  51. export const useDeletedAt = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  52. return useStaticSWR<Nullable<any>, Error>('deletedAt', initialData);
  53. };
  54. export const useIsIdenticalPath = (initialData?: boolean): SWRResponse<boolean, Error> => {
  55. return useStaticSWR<boolean, Error>('isIdenticalPath', initialData, { fallbackData: false });
  56. };
  57. export const useIsUserPage = (initialData?: boolean): SWRResponse<boolean, Error> => {
  58. return useStaticSWR<boolean, Error>('isUserPage', initialData, { fallbackData: false });
  59. };
  60. export const useIsTrashPage = (initialData?: boolean): SWRResponse<boolean, Error> => {
  61. return useStaticSWR<boolean, Error>('isTrashPage', initialData, { fallbackData: false });
  62. };
  63. export const useIsNotCreatable = (initialData?: boolean): SWRResponse<boolean, Error> => {
  64. return useStaticSWR<boolean, Error>('isNotCreatable', initialData, { fallbackData: false });
  65. };
  66. export const useIsForbidden = (initialData?: boolean): SWRResponse<boolean, Error> => {
  67. return useStaticSWR<boolean, Error>('isForbidden', initialData, { fallbackData: false });
  68. };
  69. export const useIsNotFound = (initialData?: boolean): SWRResponse<boolean, Error> => {
  70. return useStaticSWR<boolean, Error>('isNotFound', initialData, { fallbackData: false });
  71. };
  72. export const usePageUser = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  73. return useStaticSWR<Nullable<any>, Error>('pageUser', initialData);
  74. };
  75. export const useHasChildren = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  76. return useStaticSWR<Nullable<any>, Error>('hasChildren', initialData);
  77. };
  78. export const useTemplateTagData = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  79. return useStaticSWR<Nullable<string>, Error>('templateTagData', initialData);
  80. };
  81. export const useIsSharedUser = (initialData?: Nullable<boolean>): SWRResponse<Nullable<boolean>, Error> => {
  82. return useStaticSWR<Nullable<boolean>, Error>('isSharedUser', initialData);
  83. };
  84. export const useShareLinksNumber = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  85. return useStaticSWR<Nullable<any>, Error>('shareLinksNumber', initialData);
  86. };
  87. export const useShareLinkId = (initialData?: Nullable<string>): SWRResponse<Nullable<string>, Error> => {
  88. return useStaticSWR<Nullable<string>, Error>('shareLinkId', initialData);
  89. };
  90. export const useRevisionIdHackmdSynced = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  91. return useStaticSWR<Nullable<any>, Error>('revisionIdHackmdSynced', initialData);
  92. };
  93. export const useLastUpdateUsername = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  94. return useStaticSWR<Nullable<any>, Error>('lastUpdateUsername', initialData);
  95. };
  96. export const useDeleteUsername = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  97. return useStaticSWR<Nullable<any>, Error>('deleteUsername', initialData);
  98. };
  99. export const usePageIdOnHackmd = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  100. return useStaticSWR<Nullable<any>, Error>('pageIdOnHackmd', initialData);
  101. };
  102. export const useHasDraftOnHackmd = (initialData?: Nullable<any>): SWRResponse<Nullable<any>, Error> => {
  103. return useStaticSWR<Nullable<any>, Error>('hasDraftOnHackmd', initialData);
  104. };
  105. export const useIsSearchPage = (initialData?: Nullable<any>) : SWRResponse<Nullable<any>, Error> => {
  106. return useStaticSWR<Nullable<any>, Error>('isSearchPage', initialData);
  107. };
  108. export const useTargetAndAncestors = (initialData?: TargetAndAncestors): SWRResponse<TargetAndAncestors, Error> => {
  109. return useStaticSWR<TargetAndAncestors, Error>('targetAndAncestors', initialData);
  110. };
  111. export const useIsAclEnabled = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  112. return useStaticSWR<boolean, Error>('isAclEnabled', initialData);
  113. };
  114. export const useIsSearchServiceConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  115. return useStaticSWR<boolean, Error>('isSearchServiceConfigured', initialData);
  116. };
  117. export const useIsSearchServiceReachable = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  118. return useStaticSWR<boolean, Error>('isSearchServiceReachable', initialData);
  119. };
  120. export const useIsSearchScopeChildrenAsDefault = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  121. return useStaticSWR<boolean, Error>('isSearchScopeChildrenAsDefault', initialData);
  122. };
  123. export const useIsSlackConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  124. return useStaticSWR<boolean, Error>('isSlackConfigured', initialData);
  125. };
  126. export const useIsEnabledAttachTitleHeader = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  127. return useStaticSWR<boolean, Error>('isEnabledAttachTitleHeader', initialData);
  128. };
  129. export const useHasParent = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  130. return useStaticSWR<boolean, Error>('hasParent', initialData);
  131. };
  132. export const useIsIndentSizeForced = (initialData?: boolean) : SWRResponse<boolean, Error> => {
  133. return useStaticSWR<boolean, Error>('isIndentSizeForced', initialData);
  134. };
  135. export const useDefaultIndentSize = (initialData?: number) : SWRResponse<number, Error> => {
  136. return useStaticSWR<number, Error>('defaultIndentSize', initialData, { fallbackData: 4 });
  137. };
  138. export const useAuditLogEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
  139. return useStaticSWR<boolean, Error>('auditLogEnabled', initialData, { fallbackData: false });
  140. };
  141. export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse<number, Error> => {
  142. return useStaticSWR<number, Error>('activityExpirationSeconds', initialData);
  143. };
  144. export const useAuditLogAvailableActions = (initialData?: Array<SupportedActionType>) : SWRResponse<Array<SupportedActionType>, Error> => {
  145. return useStaticSWR<Array<SupportedActionType>, Error>('auditLogAvailableActions', initialData);
  146. };
  147. export const useGrowiVersion = (initialData?: string): SWRResponse<string, any> => {
  148. return useStaticSWR('growiVersion', initialData);
  149. };
  150. export const useIsEnabledStaleNotification = (initialData?: boolean): SWRResponse<boolean, any> => {
  151. return useStaticSWR('isEnabledStaleNotification', initialData);
  152. };
  153. export const useIsLatestRevision = (initialData?: boolean): SWRResponse<boolean, any> => {
  154. return useStaticSWR('isLatestRevision', initialData);
  155. };
  156. export const useGrowiRendererConfig = (initialData?: GrowiRendererConfig): SWRResponse<GrowiRendererConfig, any> => {
  157. return useStaticSWR('growiRendererConfig', initialData);
  158. };
  159. /** **********************************************************
  160. * Computed contexts
  161. *********************************************************** */
  162. export const useIsGuestUser = (): SWRResponse<boolean, Error> => {
  163. const { data: currentUser } = useCurrentUser();
  164. return useSWRImmutable(
  165. ['isGuestUser', currentUser],
  166. (key: Key, currentUser: IUser) => currentUser == null,
  167. { fallbackData: currentUser == null },
  168. );
  169. };
  170. export const useIsEditable = (): SWRResponse<boolean, Error> => {
  171. const { data: isGuestUser } = useIsGuestUser();
  172. const { data: isNotCreatable } = useIsNotCreatable();
  173. const { data: isTrashPage } = useIsTrashPage();
  174. return useSWRImmutable(
  175. ['isEditable', isGuestUser, isTrashPage, isNotCreatable],
  176. (key: Key, isGuestUser: boolean, isTrashPage: boolean, isNotCreatable: boolean) => {
  177. return (!isNotCreatable && !isTrashPage && !isGuestUser);
  178. },
  179. );
  180. };