import { IUser, pagePathUtils } from '@growi/core'; import { HtmlElementNode } from 'rehype-toc'; import { Key, SWRResponse, useSWRConfig } from 'swr'; import useSWRImmutable from 'swr/immutable'; import { SupportedActionType } from '~/interfaces/activity'; import { EditorConfig } from '~/interfaces/editor-settings'; // import { CustomWindow } from '~/interfaces/global'; import { RendererConfig } from '~/interfaces/services/renderer'; import { GrowiThemes } from '~/interfaces/theme'; import InterceptorManager from '~/services/interceptor-manager'; import { TargetAndAncestors } from '../interfaces/page-listing-results'; import { useContextSWR } from './use-context-swr'; import { useStaticSWR } from './use-static-swr'; type Nullable = T | null; export const useInterceptorManager = (): SWRResponse => { return useContextSWR('interceptorManager', undefined, { fallbackData: new InterceptorManager() }); }; export const useCsrfToken = (initialData?: string): SWRResponse => { return useContextSWR('csrfToken', initialData); }; export const useAppTitle = (initialData?: string): SWRResponse => { return useContextSWR('appTitle', initialData); }; export const useSiteUrl = (initialData?: string): SWRResponse => { return useContextSWR('siteUrl', initialData); }; export const useConfidential = (initialData?: string): SWRResponse => { return useContextSWR('confidential', initialData); }; export const useGrowiTheme = (initialData?: GrowiThemes): SWRResponse => { return useContextSWR('theme', initialData); }; export const useCurrentUser = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR, Error>('currentUser', initialData); }; export const useCurrentPathname = (initialData?: string): SWRResponse => { return useContextSWR('currentPathname', initialData); }; export const useCurrentPageId = (initialData?: Nullable): SWRResponse, Error> => { return useStaticSWR, Error>('currentPageId', initialData); }; export const useIsIdenticalPath = (initialData?: boolean): SWRResponse => { return useContextSWR('isIdenticalPath', initialData, { fallbackData: false }); }; export const useIsForbidden = (initialData?: boolean): SWRResponse => { return useContextSWR('isForbidden', initialData, { fallbackData: false }); }; export const useIsNotFound = (initialData?: boolean): SWRResponse => { return useContextSWR('isNotFound', initialData, { fallbackData: false }); }; export const useTemplateTagData = (initialData?: string[]): SWRResponse => { return useContextSWR('templateTagData', initialData); }; export const useIsSharedUser = (initialData?: boolean): SWRResponse => { return useContextSWR('isSharedUser', initialData); }; export const useShareLinkId = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR, Error>('shareLinkId', initialData); }; export const useDisableLinkSharing = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR, Error>('disableLinkSharing', initialData); }; export const useRegistrationWhiteList = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR, Error>('registrationWhiteList', initialData); }; export const useDrawioUri = (initialData?: string): SWRResponse => { return useContextSWR('drawioUri', initialData, { fallbackData: 'https://embed.diagrams.net/' }); }; export const useHackmdUri = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR, Error>('hackmdUri', initialData); }; export const useIsSearchPage = (initialData?: Nullable) : SWRResponse, Error> => { return useContextSWR, Error>('isSearchPage', initialData); }; export const useTargetAndAncestors = (initialData?: TargetAndAncestors): SWRResponse => { return useContextSWR('targetAndAncestors', initialData); }; export const useIsAclEnabled = (initialData?: boolean) : SWRResponse => { return useContextSWR('isAclEnabled', initialData); }; export const useIsSearchServiceConfigured = (initialData?: boolean) : SWRResponse => { return useContextSWR('isSearchServiceConfigured', initialData); }; export const useIsSearchServiceReachable = (initialData?: boolean) : SWRResponse => { return useContextSWR('isSearchServiceReachable', initialData); }; export const useIsMailerSetup = (initialData?: boolean): SWRResponse => { return useContextSWR('isMailerSetup', initialData); }; export const useIsSearchScopeChildrenAsDefault = (initialData?: boolean) : SWRResponse => { return useContextSWR('isSearchScopeChildrenAsDefault', initialData, { fallbackData: false }); }; export const useIsSlackConfigured = (initialData?: boolean) : SWRResponse => { return useContextSWR('isSlackConfigured', initialData); }; export const useIsEnabledAttachTitleHeader = (initialData?: boolean) : SWRResponse => { return useContextSWR('isEnabledAttachTitleHeader', initialData); }; export const useIsIndentSizeForced = (initialData?: boolean) : SWRResponse => { return useContextSWR('isIndentSizeForced', initialData, { fallbackData: false }); }; export const useDefaultIndentSize = (initialData?: number) : SWRResponse => { return useContextSWR('defaultIndentSize', initialData, { fallbackData: 4 }); }; export const useAuditLogEnabled = (initialData?: boolean): SWRResponse => { return useContextSWR('auditLogEnabled', initialData, { fallbackData: false }); }; // TODO: initialize in [[..path]].page.tsx? export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse => { return useContextSWR('activityExpirationSeconds', initialData); }; export const useAuditLogAvailableActions = (initialData?: Array) : SWRResponse, Error> => { return useContextSWR, Error>('auditLogAvailableActions', initialData); }; export const useGrowiVersion = (initialData?: string): SWRResponse => { return useContextSWR('growiVersion', initialData); }; export const useIsEnabledStaleNotification = (initialData?: boolean): SWRResponse => { return useContextSWR('isEnabledStaleNotification', initialData); }; export const useIsLatestRevision = (initialData?: boolean): SWRResponse => { return useContextSWR('isLatestRevision', initialData); }; export const useEditorConfig = (initialData?: EditorConfig): SWRResponse => { return useContextSWR('editorConfig', initialData); }; export const useRendererConfig = (initialData?: RendererConfig): SWRResponse => { return useContextSWR('growiRendererConfig', initialData); }; export const useIsAllReplyShown = (initialData?: boolean): SWRResponse => { return useContextSWR('isAllReplyShown', initialData); }; export const useIsBlinkedHeaderAtBoot = (initialData?: boolean): SWRResponse => { return useContextSWR('isBlinkedAtBoot', initialData, { fallbackData: false }); }; export const useEditingMarkdown = (initialData?: string): SWRResponse => { return useContextSWR('currentMarkdown', initialData); }; export const useIsUploadableImage = (initialData?: boolean): SWRResponse => { return useContextSWR('isUploadableImage', initialData); }; export const useIsUploadableFile = (initialData?: boolean): SWRResponse => { return useContextSWR('isUploadableFile', initialData); }; export const useShowPageLimitationL = (initialData?: number): SWRResponse => { return useContextSWR('showPageLimitationL', initialData); }; export const useShowPageLimitationXL = (initialData?: number): SWRResponse => { return useContextSWR('showPageLimitationXL', initialData); }; export const useCustomizeTitle = (initialData?: string): SWRResponse => { return useContextSWR('CustomizeTitle', initialData); }; export const useCustomizedLogoSrc = (initialData?: string): SWRResponse => { return useContextSWR('customizedLogoSrc', initialData); }; export const useGrowiCloudUri = (initialData?: string): SWRResponse => { return useStaticSWR('growiCloudUri', initialData); }; export const useGrowiAppIdForGrowiCloud = (initialData?: number): SWRResponse => { return useStaticSWR('growiAppIdForGrowiCloud', initialData); }; export const useIsContainerFluid = (initialData?: boolean): SWRResponse => { return useStaticSWR('isContainerFluid', initialData); }; /** ********************************************************** * Computed contexts *********************************************************** */ export const useIsGuestUser = (): SWRResponse => { const { data: currentUser } = useCurrentUser(); return useSWRImmutable( ['isGuestUser', currentUser], (key: Key, currentUser: IUser) => currentUser == null, { fallbackData: currentUser == null }, ); }; export const useIsEditable = (): SWRResponse => { const { data: isGuestUser } = useIsGuestUser(); const { data: isForbidden } = useIsForbidden(); const { data: isIdenticalPath } = useIsIdenticalPath(); return useSWRImmutable( ['isEditable', isGuestUser, isForbidden, isIdenticalPath], (key: Key, isGuestUser: boolean, isForbidden: boolean, isIdenticalPath: boolean) => { return (!isForbidden && !isIdenticalPath && !isGuestUser); }, ); };