customize.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { useCallback } from 'react';
  2. import type { SWRResponse } from 'swr';
  3. import useSWR from 'swr';
  4. import useSWRImmutable from 'swr/immutable';
  5. import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
  6. import type { updateConfigMethodForAdmin } from '~/interfaces/admin';
  7. import type { IResLayoutSetting, IResGrowiTheme } from '~/interfaces/customize';
  8. export const useSWRxLayoutSetting = (): SWRResponse<IResLayoutSetting, Error> & updateConfigMethodForAdmin<IResLayoutSetting> => {
  9. const fetcher = useCallback(async() => {
  10. const res = await apiv3Get('/customize-setting/layout');
  11. return res.data;
  12. }, []);
  13. const swrResponse = useSWRImmutable('/customize-setting/layout', fetcher);
  14. const update = useCallback(async(layoutSetting: IResLayoutSetting) => {
  15. await apiv3Put('/customize-setting/layout', layoutSetting);
  16. await swrResponse.mutate();
  17. }, [swrResponse]);
  18. return {
  19. ...swrResponse,
  20. update,
  21. };
  22. };
  23. type UpdateThemeArgs = {
  24. theme: string,
  25. }
  26. export const useSWRxGrowiThemeSetting = (): SWRResponse<IResGrowiTheme, Error> & updateConfigMethodForAdmin<UpdateThemeArgs> => {
  27. const fetcher = useCallback(async() => {
  28. const res = await apiv3Get<IResGrowiTheme>('/customize-setting/theme');
  29. return res.data;
  30. }, []);
  31. const swrResponse = useSWR('/customize-setting/theme', fetcher);
  32. const update = async({ theme }: UpdateThemeArgs) => {
  33. await apiv3Put('/customize-setting/theme', { theme });
  34. if (swrResponse.data == null) {
  35. swrResponse.mutate();
  36. return;
  37. }
  38. const newData = { ...swrResponse.data, currentTheme: theme };
  39. swrResponse.mutate(newData, { optimisticData: newData });
  40. };
  41. return Object.assign(
  42. swrResponse,
  43. {
  44. update,
  45. },
  46. );
  47. };