import useSWR, { SWRResponse } from 'swr'; import useSWRImmutable from 'swr/immutable'; import { apiGet } from '~/client/util/apiv1-client'; import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client'; import { Nullable } from '~/interfaces/common'; import { IEditorSettings } from '~/interfaces/editor-settings'; import { SlackChannels } from '~/interfaces/user-trigger-notification'; import { useCurrentUser, useDefaultIndentSize, useIsGuestUser } from './context'; import { localStorageMiddleware } from './middlewares/sync-to-storage'; import { useStaticSWR } from './use-static-swr'; type EditorSettingsOperation = { update: (updateData: Partial) => void, turnOffAskingBeforeDownloadLargeFiles: () => void, } export const useEditorSettings = (): SWRResponse & EditorSettingsOperation => { const { data: currentUser } = useCurrentUser(); const { data: isGuestUser } = useIsGuestUser(); const swrResult = useSWRImmutable( isGuestUser ? null : ['/personal-setting/editor-settings', currentUser?.username], endpoint => apiv3Get(endpoint).then(result => result.data), { use: [localStorageMiddleware] }, // store to localStorage for initialization fastly ); return { ...swrResult, update: (updateData) => { const { data, mutate } = swrResult; if (data == null) { return; } mutate({ ...data, ...updateData }, false); // invoke API apiv3Put('/personal-setting/editor-settings', updateData); }, turnOffAskingBeforeDownloadLargeFiles: async() => { const { data, mutate } = swrResult; if (data == null) { return; } // invoke API await apiv3Put('/personal-setting/editor-settings', { textlintSettings: { neverAskBeforeDownloadLargeFiles: true } }); // revalidate mutate(); }, }; }; export const useIsTextlintEnabled = (): SWRResponse => { return useStaticSWR('isTextlintEnabled', undefined, { fallbackData: false }); }; export const useCurrentIndentSize = (): SWRResponse => { const { data: defaultIndentSize } = useDefaultIndentSize(); return useStaticSWR( defaultIndentSize == null ? null : 'currentIndentSize', undefined, { fallbackData: defaultIndentSize }, ); }; /* * Slack Notification */ // export const useIsSlackEnabled = (isEnabled?: boolean): SWRResponse => { // return useStaticSWR('isSlackEnabled', isEnabled, { fallbackData: false }); // }; export const useSWRxIsSlackEnabled = (isEnabled: boolean): SWRResponse => { // console.log({ isEnabled }); return useSWR(['isSlackEnabled', isEnabled], (key: string, isEnabled: boolean) => isEnabled); }; export const useSWRxSlackChannels = (path: Nullable): SWRResponse, Error> => { const shouldFetch: boolean = path != null; return useSWR( shouldFetch ? ['/pages.updatePost', path] : null, (endpoint, path) => apiGet(endpoint, { path }).then((response: SlackChannels) => response.updatePost), ); };