import type { ColorScheme, IUserHasId } from '@growi/core'; import useSWR, { SWRResponse } from 'swr'; import useSWRImmutable from 'swr/immutable'; import { SupportedActionType } from '~/interfaces/activity'; import { EditorConfig } from '~/interfaces/editor-settings'; import { RendererConfig } from '~/interfaces/services/renderer'; 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 useCurrentUser = (initialData?: Nullable): SWRResponse, Error> => { return useContextSWR('currentUser', initialData); }; export const useCurrentPathname = (initialData?: string): SWRResponse => { return useContextSWR('currentPathname', 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 useIsNotCreatable = (initialData?: boolean): SWRResponse => { return useContextSWR('isNotCreatable', initialData, { fallbackData: false }); }; export const useIsSharedUser = (initialData?: boolean): SWRResponse => { return useContextSWR('isSharedUser', initialData); }; export const useShareLinkId = (initialData?: string): SWRResponse => { return useContextSWR('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 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 useIsEnabledMarp = (initialData?: boolean) : SWRResponse => { return useContextSWR('isEnabledMarp', 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 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 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 useIsDefaultLogo = (initialData?: boolean): SWRResponse => { return useContextSWR('isDefaultLogo', initialData); }; export const useIsCustomizedLogoUploaded = (initialData?: boolean): SWRResponse => { return useStaticSWR('isCustomizedLogoUploaded', initialData); }; export const useForcedColorScheme = (initialData?: ColorScheme): SWRResponse => { return useContextSWR('forcedColorScheme', 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, isLoading } = useCurrentUser(); return useSWRImmutable( isLoading ? null : ['isGuestUser', currentUser?._id], ([, currentUserId]) => currentUserId == null, { fallbackData: currentUser?._id == null }, ); }; export const useIsReadOnlyUser = (): SWRResponse => { const { data: currentUser, isLoading: isCurrentUserLoading } = useCurrentUser(); const { data: isGuestUser, isLoading: isGuestUserLoding } = useIsGuestUser(); const isLoading = isCurrentUserLoading || isGuestUserLoding; const isReadOnlyUser = !isGuestUser && !!currentUser?.readOnly; return useSWRImmutable( isLoading ? null : ['isReadOnlyUser', isReadOnlyUser, currentUser?._id], () => isReadOnlyUser, { fallbackData: isReadOnlyUser }, ); }; export const useIsAdmin = (): SWRResponse => { const { data: currentUser, isLoading } = useCurrentUser(); return useSWR( isLoading ? null : ['isAdminUser', currentUser?._id, currentUser?.admin], ([, , isAdmin]) => isAdmin ?? false, { fallbackData: currentUser?.admin ?? false, keepPreviousData: true, // disable all revalidation but revalidateIfStale revalidateOnMount: false, revalidateOnFocus: false, revalidateOnReconnect: false, }, ); }; export const useIsEditable = (): SWRResponse => { const { data: isGuestUser } = useIsGuestUser(); const { data: isReadOnlyUser } = useIsReadOnlyUser(); const { data: isForbidden } = useIsForbidden(); const { data: isNotCreatable } = useIsNotCreatable(); const { data: isIdenticalPath } = useIsIdenticalPath(); return useSWRImmutable( ['isEditable', isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath], ([, isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath]) => { return (!isForbidden && !isIdenticalPath && !isNotCreatable && !isGuestUser && !isReadOnlyUser); }, ); };