context.tsx 11 KB

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