sidebar-config.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import type { SWRResponse } from 'swr';
  2. import useSWRImmutable from 'swr/immutable';
  3. import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
  4. import type { ISidebarConfig } from '~/interfaces/sidebar-config';
  5. type SidebarConfigOption = {
  6. update: () => Promise<void>,
  7. isSidebarCollapsedMode: boolean|undefined,
  8. setIsSidebarCollapsedMode: (isSidebarCollapsedMode: boolean) => void,
  9. }
  10. export const useSWRxSidebarConfig = (): SWRResponse<ISidebarConfig, Error> & SidebarConfigOption => {
  11. const swrResponse = useSWRImmutable<ISidebarConfig>(
  12. '/customize-setting/sidebar',
  13. endpoint => apiv3Get<ISidebarConfig>(endpoint).then(result => result.data),
  14. );
  15. return {
  16. ...swrResponse,
  17. update: async() => {
  18. const { data } = swrResponse;
  19. if (data == null) {
  20. return;
  21. }
  22. const { isSidebarCollapsedMode } = data;
  23. const updateData = {
  24. isSidebarCollapsedMode,
  25. };
  26. // invoke API
  27. await apiv3Put('/customize-setting/sidebar', updateData);
  28. },
  29. isSidebarCollapsedMode: swrResponse.data?.isSidebarCollapsedMode,
  30. setIsSidebarCollapsedMode: (isSidebarCollapsedMode) => {
  31. const { data, mutate } = swrResponse;
  32. if (data == null) {
  33. return;
  34. }
  35. const updateData = {
  36. isSidebarCollapsedMode,
  37. };
  38. // update isSidebarCollapsedMode in cache, not revalidate
  39. mutate({ ...data, ...updateData }, false);
  40. },
  41. };
  42. };